join method

Future<void> join(
  1. String sid,
  2. String uid
)

Implementation

Future<void> join(String sid, String uid) async {
  var completer = Completer<void>();
  try {
    transports[RoleSub]!.pc!.onTrack = (RTCTrackEvent ev) {
      var remote = makeRemote(ev.streams[0], transports[RoleSub]!);
      ontrack?.call(ev.track, remote);
    };
    transports[RoleSub]!.pc!.onDataChannel = (RTCDataChannel channel) {
      if (channel.label == API_CHANNEL) {
        transports[RoleSub]!.api = channel;
        transports[RoleSub]!.onapiopen?.call();
        final json = JsonDecoder();
        channel.onMessage = (RTCDataChannelMessage msg) {
          onspeaker?.call(json.convert(msg.text));
        };
        completer.complete();
      }
      ondatachannel?.call(channel);
    };

    var pc = transports[RolePub]!.pc;
    if (pc != null) {
      try {
        unAwaited(pc.createOffer({}).then((offer) async {
          await pc.setLocalDescription(offer);
          var answer = await signal.join(sid, uid, offer);
          await pc.setRemoteDescription(answer);
          transports[RolePub]!.hasRemoteDescription = true;
          transports[RolePub]!
              .candidates
              .forEach((c) async => await pc.addCandidate(c));
          pc.onRenegotiationNeeded = onnegotiationneeded;
        }));
      } catch (e) {
        completer.completeError(e);
      }
    }
  } catch (e) {
    print('join: e => ${e.toString()}');
    completer.completeError(e);
  }
  return completer.future;
}