@@ -5,6 +5,7 @@ import 'package:flutter/services.dart';
5
5
import 'utils.dart' ;
6
6
import 'dart:io' show Platform;
7
7
8
+
8
9
enum MessageType {
9
10
text, binary
10
11
}
@@ -83,6 +84,7 @@ class RTCDataChannelMessage {
83
84
84
85
/// Binary contents of this message as a base64 encoded [String] .
85
86
/// Use only on binary messages.
87
+ /// See: [isBinary] .
86
88
String get binaryAsBase64 => base64.encode (_data);
87
89
}
88
90
@@ -120,7 +122,18 @@ class RTCDataChannel {
120
122
/// binary data as a [Uint8List] or text data as a [String] .
121
123
RTCDataChannelOnMessageCallback onMessage;
122
124
123
- RTCDataChannel (this ._peerConnectionId, this ._label, this ._dataChannelId){
125
+ final _stateChangeController = StreamController <RTCDataChannelState >.broadcast ();
126
+ final _messageController = StreamController <RTCDataChannelMessage >.broadcast ();
127
+
128
+ /// Stream of state change events. Emits the new state on change.
129
+ Stream <RTCDataChannelState > stateChangeStream;
130
+
131
+ /// Stream of incoming messages. Emits the message.
132
+ Stream <RTCDataChannelMessage > messageStream;
133
+
134
+ RTCDataChannel (this ._peerConnectionId, this ._label, this ._dataChannelId) {
135
+ stateChangeStream = _stateChangeController.stream;
136
+ messageStream = _messageController.stream;
124
137
_eventSubs
EB77
cription = _eventChannelFor (_dataChannelId)
125
138
.receiveBroadcastStream ()
126
139
.listen (eventListener, onError: errorListener);
@@ -133,8 +146,10 @@ class RTCDataChannel {
133
146
case 'dataChannelStateChanged' :
134
147
//int dataChannelId = map['id'];
135
148
_state = rtcDataChannelStateForString (map['state' ]);
136
- if (this .onDataChannelState != null )
149
+ _stateChangeController.add (_state);
150
+ if (this .onDataChannelState != null ) {
137
151
this .onDataChannelState (_state);
152
+ }
138
153
break ;
139
154
case 'dataChannelReceiveMessage' :
140
155
//int dataChannelId = map['id'];
@@ -153,7 +168,7 @@ class RTCDataChannel {
153
168
else {
154
169
message = RTCDataChannelMessage (data);
155
170
}
156
-
171
+ _messageController. add (message);
157
172
if (this .onMessage != null )
158
173
this .onMessage (message);
159
174
break ;
@@ -200,6 +215,8 @@ class RTCDataChannel {
200
215
}
201
216
202
217
Future <void > close () async {
218
+ _stateChangeController.close ();
219
+ _messageController.close ();
203
220
await _eventSubscription? .cancel ();
204
221
await _channel.invokeMethod ('dataChannelClose' ,
205
222
< String , dynamic > {'peerConnectionId' : _peerConnectionId, 'dataChannelId' : _dataChannelId});
0 commit comments