diff --git a/lib/src/rtc_engine.dart b/lib/src/rtc_engine.dart index 196db7a..6cee6c2 100644 --- a/lib/src/rtc_engine.dart +++ b/lib/src/rtc_engine.dart @@ -45,6 +45,10 @@ class RTCEngine extends Disposable with EventsEmittable { // data channels for packets rtc.RTCDataChannel? _reliableDC; rtc.RTCDataChannel? _lossyDC; + rtc.RTCDataChannelState get reliableDataChannelState => + _reliableDC?.state ?? rtc.RTCDataChannelState.RTCDataChannelClosed; + rtc.RTCDataChannelState get lossyDataChannelState => + _lossyDC?.state ?? rtc.RTCDataChannelState.RTCDataChannelClosed; bool _iceConnected = false; ConnectionState _connectionState = ConnectionState.disconnected; @@ -185,17 +189,21 @@ class RTCEngine extends Disposable with EventsEmittable { // make sure we do have a data connection await _ensurePublisherConnected(); - final dcMessage = + // construct the data channel message + final message = rtc.RTCDataChannelMessage.fromBinary(packet.writeToBuffer()); - if (packet.kind == lk_models.DataPacket_Kind.LOSSY && _lossyDC != null) { - logger.fine('Sending lossy data...'); - await _lossyDC?.send(dcMessage); - } else if (packet.kind == lk_models.DataPacket_Kind.RELIABLE && - _reliableDC != null) { - logger.fine('Sending reliable data...'); - await _reliableDC?.send(dcMessage); + // chose data channel + final rtc.RTCDataChannel? channel = + packet.kind == lk_models.DataPacket_Kind.LOSSY ? _lossyDC : _reliableDC; + + // send if channel exists + if (channel == null) { + throw UnexpectedStateException('Data channel is not ready'); } + + logger.fine('sendDataPacket(label:${channel.label})'); + await channel.send(message); } Future _ensurePublisherConnected() async { @@ -405,6 +413,8 @@ class RTCEngine extends Disposable with EventsEmittable { _lossyDC = await publisher?.pc.createDataChannel(_lossyDCLabel, lossyInit); _lossyDC?.onMessage = _onDCMessage; + _lossyDC?.stateChangeStream + .listen((state) => _onDCStateUpdated(Reliability.lossy, state)); } catch (_) { logger.severe('[$objectId] createDataChannel() did throw $_'); } @@ -416,6 +426,8 @@ class RTCEngine extends Disposable with EventsEmittable { _reliableDC = await publisher?.pc.createDataChannel(_reliableDCLabel, reliableInit); _reliableDC?.onMessage = _onDCMessage; + _reliableDC?.stateChangeStream + .listen((state) => _onDCStateUpdated(Reliability.reliable, state)); } catch (_) { logger.severe('[$objectId] createDataChannel() did throw $_'); } @@ -427,11 +439,15 @@ class RTCEngine extends Disposable with EventsEmittable { logger.fine('Server opened DC label: ${dc.label}'); _reliableDC = dc; _reliableDC?.onMessage = _onDCMessage; + _reliableDC?.stateChangeStream + .listen((state) => _onDCStateUpdated(Reliability.reliable, state)); break; case _lossyDCLabel: logger.fine('Server opened DC label: ${dc.label}'); _lossyDC = dc; _lossyDC?.onMessage = _onDCMessage; + _lossyDC?.stateChangeStream + .listen((event) => _onDCStateUpdated(Reliability.lossy, event)); break; default: logger.warning('Unknown DC label: ${dc.label}'); @@ -439,6 +455,13 @@ class RTCEngine extends Disposable with EventsEmittable { } } + void _onDCStateUpdated( + Reliability channel, + rtc.RTCDataChannelState state, + ) { + logger.fine('Data channel state updated ${channel} ${state}'); + } + void _onDCMessage(rtc.RTCDataChannelMessage message) { // always expect binary if (!message.isBinary) {