join method
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;
}