@@ -14,47 +14,91 @@ - (void)setPeerConnectionId:(NSString *)peerConnectionId
14
14
{
15
15
objc_setAssociatedObject (self, @selector (peerConnectionId ), peerConnectionId, OBJC_ASSOCIATION_RETAIN_NONATOMIC );
16
16
}
17
+
18
+ - (FlutterEventSink )eventSink
19
+ {
20
+ return objc_getAssociatedObject (self, _cmd);
21
+ }
22
+
23
+ - (void )setEventSink : (FlutterEventSink)eventSink
24
+ {
25
+ objc_setAssociatedObject (self, @selector (eventSink ), eventSink, OBJC_ASSOCIATION_RETAIN_NONATOMIC );
26
+ }
27
+
28
+ - (FlutterEventChannel *)eventChannel
29
+ {
30
+ return objc_getAssociatedObject (self, _cmd);
31
+ }
32
+
33
+ - (void )setEventChannel : (FlutterEventChannel *)eventChannel
34
+ {
35
+ objc_setAssociatedObject (self, @selector (eventChannel ), eventChannel, OBJC_ASSOCIATION_RETAIN_NONATOMIC );
36
+ }
37
+
38
+ #pragma mark - FlutterStreamHandler methods
39
+
40
+ - (FlutterError* _Nullable)onCancelWithArguments : (id _Nullable)arguments {
41
+ self.eventSink = nil ;
42
+ return nil ;
43
+ }
44
+
45
+ - (FlutterError* _Nullable)onListenWithArguments : (id _Nullable)arguments
46
+ eventSink : (nonnull FlutterEventSink)sink {
47
+ self.eventSink = sink;
48
+ return nil ;
49
+ }
17
50
@end
18
51
19
52
@implementation FlutterWebRTCPlugin (RTCDataChannel)
20
53
21
54
-(void )createDataChannel : (nonnull NSString *)peerConnectionId
22
55
label : (NSString *)label
23
56
config : (RTCDataChannelConfiguration *)config
57
+ messenger : (NSObject <FlutterBinaryMessenger>*)messenger
24
58
{
25
- RTCPeerConnection *peerConnection = self.peerConnections [peerConnectionId];
26
- RTCDataChannel *dataChannel = [peerConnection dataChannelForLabel: label configuration: config];
59
+ RTCPeerConnection *peerConnection = self.peerConnections [peerConnectionId];
60
+ RTCDataChannel *dataChannel = [peerConnection dataChannelForLabel: label configuration: config];
27
61
28
- if (-1 != dataChannel.channelId ) {
29
- dataChannel.peerConnectionId = peerConnectionId;
30
- NSNumber *dataChannelId = [NSNumber numberWithInteger: dataChannel.channelId];
31
- peerConnection.dataChannels [dataChannelId] = dataChannel;
32
- dataChannel.delegate = self;
33
- }
62
+ if (-1 != dataChannel.channelId ) {
63
+ dataChannel.peerConnectionId = peerConnectionId;
64
+ NSNumber *dataChannelId = [NSNumber numberWithInteger: dataChannel.channelId];
65
+ peerConnection.dataChannels [dataChannelId] = dataChannel;
66
+ dataChannel.delegate = self;
67
+
68
+ FlutterEventChannel *eventChannel = [FlutterEventChannel
69
+ eventChannelWithName: [NSString stringWithFormat: @" cloudwebrtc.com/WebRTC/dataChannelEvent%d " , dataChannel.channelId]
70
+ binaryMessenger: messenger];
71
+
72
+ dataChannel.eventChannel = eventChannel;
73
+ [eventChannel setStreamHandler: dataChannel];
74
+ }
34
75
}
35
76
36
77
-(void )dataChannelClose : (nonnull NSString *)peerConnectionId
37
78
dataChannelId : (nonnull NSString *)dataChannelId
38
79
{
39
- RTCPeerConnection *peerConnection = self.peerConnections [peerConnectionId];
40
- NSMutableDictionary *dataChannels = peerConnection.dataChannels ;
41
- RTCDataChannel *dataChannel = dataChannels[dataChannelId];
42
- [dataChannel close ];
43
- [dataChannels removeObjectForKey: dataChannelId];
80
+ RTCPeerCon
7802
nection *peerConnection = self.peerConnections [peerConnectionId];
81
+ NSMutableDictionary *dataChannels = peerConnection.dataChannels ;
82
+ RTCDataChannel *dataChannel = dataChannels[dataChannelId];
83
+ FlutterEventChannel *eventChannel = dataChannel.eventChannel ;
84
+ [eventChannel setStreamHandler: nil ];
85
+ dataChannel.eventChannel = nil ;
86
+ [dataChannel close ];
87
+ [dataChannels removeObjectForKey: dataChannelId];
44
88
}
45
89
46
90
-(void )dataChannelSend : (nonnull NSString *)peerConnectionId
47
91
dataChannelId : (nonnull NSString *)dataChannelId
48
92
data : (NSString *)data
49
93
type : (NSString *)type
50
94
{
51
- RTCPeerConnection *peerConnection = self.peerConnections [peerConnectionId];
52
- RTCDataChannel *dataChannel = peerConnection.dataChannels [dataChannelId];
53
- NSData *bytes = [type isEqualToString: @" binary" ] ?
95
+ RTCPeerConnection *peerConnection = self.peerConnections [peerConnectionId];
96
+ RTCDataChannel *dataChannel = peerConnection.dataChannels [dataChannelId];
97
+ NSData *bytes = [type isEqualToString: @" binary" ] ?
54
98
[[NSData alloc ] initWithBase64EncodedString: data options: 0 ] :
55
99
[data dataUsingEncoding: NSUTF8StringEncoding];
56
- RTCDataBuffer *buffer = [[RTCDataBuffer alloc ] initWithData: bytes isBinary: [type isEqualToString: @" binary" ]];
57
- [dataChannel sendData: buffer];
100
+ RTCDataBuffer *buffer = [[RTCDataBuffer alloc ] initWithData: bytes isBinary: [type isEqualToString: @" binary" ]];
101
+ [dataChannel sendData: buffer];
58
102
}
59
103
60
104
- (NSString *)stringForDataChannelState : (RTCDataChannelState)state
@@ -74,7 +118,7 @@ - (NSString *)stringForDataChannelState:(RTCDataChannelState)state
74
118
- (void )dataChannelDidChangeState : (RTCDataChannel*)channel
75
119
{
76
120
RTCPeerConnection *peerConnection = self.peerConnections [channel.peerConnectionId];
77
- FlutterEventSink eventSink = peerConnection .eventSink ;
121
+ FlutterEventSink eventSink = channel .eventSink ;
78
122
if (eventSink) {
79
123
eventSink (@{ @" event" : @" dataChannelStateChanged" ,
80
124
@" id" : @(channel.channelId ),
@@ -85,18 +129,18 @@ - (void)dataChannelDidChangeState:(RTCDataChannel*)channel
85
129
// Called when a data buffer was successfully received.
86
130
- (void )dataChannel : (RTCDataChannel *)channel didReceiveMessageWithBuffer : (RTCDataBuffer *)buffer
87
131
{
88
- NSString *type;
89
- NSString *data;
90
- if (buffer.isBinary ) {
91
- type = @" binary" ;
92
- data = [buffer.data base64EncodedStringWithOptions: 0 ];
93
- } else {
94
- type = @" text" ;
95
- data = [[NSString alloc ] initWithData: buffer.data
96
- encoding: NSUTF8StringEncoding];
97
- }
132
+ NSString *type;
133
+ NSString *data;
134
+ if (buffer.isBinary ) {
135
+ type = @" binary" ;
136
+ data = [buffer.data base64EncodedStringWithOptions: 0 ];
137
+ } else {
138
+ type = @" text" ;
139
+ data = [[NSString alloc ] initWithData: buffer.data
140
+ encoding: NSUTF8StringEncoding];
141
+ }
98
142
RTCPeerConnection *peerConnection = self.peerConnections [channel.peerConnectionId];
99
- FlutterEventSink eventSink = peerConnection .eventSink ;
143
+ FlutterEventSink eventSink = channel .eventSink ;
100
144
if (eventSink) {
101
145
eventSink (@{ @" event" : @" dataChannelReceiveMessage" ,
102
146
@" id" : @(channel.channelId ),
0 commit comments