createDataChannel method

dynamic createDataChannel (
  1. int handleId,
  2. dynamic label,
  3. dynamic incoming,
  4. dynamic pendingData
)

Implementation

createDataChannel(int handleId, label, incoming, pendingData) {
  Plugin pluginHandle = this.pluginHandles[handleId.toString()];
  if (pluginHandle == null) {
    Janus.warn("Invalid handle");
    return;
  }
  Map<String, RTCDataChannel> dataChannels = pluginHandle.dataChannels;

  var onDataChannelMessage = (event) {
    Janus.log('Received message on data channel:' + event.toString());
    var label = event.target.label;
    pluginHandle.onData(event.data, label);
  };
  var onDataChannelStateChange = (state) {
    Janus.log('Received state change on data channel:' + state.toString());
    var label = state.label;
    var dcState =
        (dataChannels[label] != null) ? dataChannels[label].state : "null";
    Janus.log('State change on <' + label + '> data channel: ' + dcState);
    if (dcState == 'open') {
      // FIX ME no params pending in RTCDataChannel to store pending message in flutter_webrtc
      // Any pending messages to send?
      // if (dataChannels[label].pending &&
      //     pluginHandle.dataChannels[label]['pending'].length > 0) {
      //   Janus.log("Sending pending messages on <" +
      //       label +
      //       ">:" +
      //       pluginHandle.dataChannels[label]['pending'].length.toString());
      //   for (var data in pluginHandle.dataChannels[label]['pending']) {
      //     Janus.log("Sending data on data channel <" + label + ">");
      //     Janus.debug(data);
      //     pluginHandle.dataChannels[label].send(data);
      //   }
      //   pluginHandle.dataChannels[label]['pending'] = [];
      // }
      // Notify the open data channel
      pluginHandle.onDataOpen(label);
    }
  };
  // var onDataChannelError =
  //     (error) => {Janus.error('Got error on data channel:' + error)};
  if (incoming == null) {
    Janus.log("Creating a data channel with label" + label);
    // Add options (ordered, maxRetransmits, etc.)
    RTCDataChannelInit rtcDataChannel = RTCDataChannelInit();
    pluginHandle.pc
        .createDataChannel(label, rtcDataChannel)
        .then((RTCDataChannel channel) {
      dataChannels[label] = channel;
    }).catchError((error, StackTrace trace) {
      Janus.error(error.toString());
    });
  } else {
    // The channel was created by Janus
    dataChannels[label] = incoming;
  }
  dataChannels[label].onMessage = onDataChannelMessage;
  dataChannels[label].onDataChannelState = onDataChannelStateChange;
  // FIX me these calls do not exists, need to implement these in onDataChannelStateChange
  // dataChannels[label].onclose = onDataChannelStateChange;
  // dataChannels[label].onerror = onDataChannelError;
  // dataChannels[label].pending = [];
  // if (pendingData != null)
  //   pluginHandle.dataChannels[label]['pending'].add(pendingData);
}