@@ -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,20 @@ 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 (sync : true );
126
+ final _messageController = StreamController <RTCDataChannelMessage >.broadcast (sync : true );
127
+
128
+ /// Stream of state change events. Emits the new state on change.
129
+ /// Closes when the [RTCDataChannel] is closed.
130
+ Stream <RTCDataChannelState > stateChangeStream;
131
+
132
+ /// Stream of incoming messages. Emits the message.
133
+ /// Closes when the [RTCDataChannel] is closed.
134
+ Stream <RTCDataChannelMessage > messageStream;
135
+
136
+ RTCDataChannel (this ._peerConnectionId, this ._label, this ._dataChannelId) {
137
+ stateChangeStream = _stateChangeController.stream;
138
+ messageStream = _messageController.stream;
124
139
_eventSubscription = _eventChannelFor (_dataChannelId)
125
140
.receiveBroadcastStream ()
126
141
.listen (eventListener, onError: errorListener);
@@ -133,8 +148,10 @@ class RTCDataChannel {
133
148
case 'dataChannelStateChanged' :
134
149
//int dataChannelId = map['id'];
135
150
_state = rtcDataChannelStateForString (map['state' ]);
136
- if (this .onDataChannelState != null )
151
+ if (this .onDataChannelState != null ) {
137
152
this .onDataChannelState (_state);
153
+ }
154
+ _stateChangeController.add (_state);
138
155
break ;
139
156
case 'dataChannelReceiveMessage' :
140
157
//int dataChannelId = map['id'];
@@ -153,9 +170,10 @@ class RTCDataChannel {
153
170
else {
154
171
message = RTCDataChannelMessage (data);
155
172
}
156
-
157
- if (this .onMessage != null )
173
+ if (this .onMessage != null ) {
158
174
this .onMessage (message);
175
+ }
176
+ _messageController.add (message);
159
177
break ;
160
178
}
161
179
}
@@ -200,6 +218,8 @@ class RTCDataChannel {
200
218
}
201
219
202
220
Future <void > close () async {
221
+ await _stateChangeController.close ();
222
+ await _messageController.close ();
203
223
await _eventSubscription? .cancel ();
204
224
await _channel.invokeMethod ('dataChannelClose' ,
205
225
< String , dynamic > {'peerConnectionId' : _peerConnectionId, 'dataChannelId' : _dataChannelId});
0 commit comments