join method
void
join()
join connect to the room via socket io client.
Implementation
void join() {
_socketIo = SocketIO(
peerId: peerId,
roomId: roomId,
url: url,
);
/// Listen notification from server.
/// When the server send a notification, the client will handle it.
/// case 'roomReady':
/// The server is ready to join the room.
_socketIo!.onOpen = () {
print('WebSocket connection sucessfully');
};
_socketIo!.onFail = () {
print('WebSocket connection failed');
};
_socketIo!.onDisconnected = () {
if (_sendTransport != null) {
_sendTransport!.close();
_sendTransport = null;
}
if (_recvTransport != null) {
_recvTransport!.close();
_recvTransport = null;
}
};
_socketIo!.onClose = () {
if (_closed) return;
close();
};
/// Listen socket io client event.
_socketIo!.onNotification = (notification) async {
log("WSS notifications: $notification['method']");
switch (notification['method']) {
case 'roomReady':
case 'roomBack':
{
_joinRoom();
break;
}
case 'producerScore':
{
break;
}
case 'newConsumer':
log('rcv newConsumer ${notification['data']}');
final bool check =
notification['data']['appData']['source'].toString() == "screen";
log("map presenter to state on newConsumer: check $check");
if (check) {
final Map<String, Peer> peers = peersBloc.state.peers;
final Peer? currentPeer = peers[notification['data']['peerId']];
peersBloc.add(PeerAddShareScreen(newPeer: {
'id': notification['data']['peerId'],
'displayName': currentPeer!.displayName + " Share Screen",
'raisedHand': false,
}));
_recvTransport!.consume(
id: notification['data']['id'],
producerId: notification['data']['producerId'],
kind: RTCRtpMediaTypeExtension.fromString(
notification['data']['kind']),
rtpParameters:
RtpParameters.fromMap(notification['data']['rtpParameters']),
appData:
Map<String, dynamic>.from(notification['data']['appData']),
peerId: notification['data']['peerId'],
);
} else {
_recvTransport!.consume(
id: notification['data']['id'],
producerId: notification['data']['producerId'],
kind: RTCRtpMediaTypeExtension.fromString(
notification['data']['kind']),
rtpParameters:
RtpParameters.fromMap(notification['data']['rtpParameters']),
appData:
Map<String, dynamic>.from(notification['data']['appData']),
peerId: notification['data']['peerId'],
);
}
break;
case 'consumerClosed':
{
String consumerId = notification['data']['consumerId'];
final Map<String, Peer> shareScreenPeer =
peersBloc.state.shareScreenPeer;
final List<String> presenterConsumerIds =
meBloc.state.presenterConsumerIds;
final bool check = presenterConsumerIds.contains(consumerId);
if (check) {
peersBloc
.add(PeerRemoveConsumerShareScreen(consumerId: consumerId));
final Peer? peer = shareScreenPeer.values.firstWhere(
(element) => element.consumers.contains(consumerId));
peersBloc.add(PeerRemoveShareScreen(peerId: peer!.id));
meBloc.add(MePresenterModeRemoveConsumer(
presenterConsumnerId: consumerId));
} else {
peersBloc.add(PeerRemoveConsumer(consumerId: consumerId));
}
break;
}
case 'consumerPaused':
{
String consumerId = notification['data']['consumerId'];
peersBloc.add(PeerPausedConsumer(consumerId: consumerId));
break;
}
case 'consumerResumed':
{
String consumerId = notification['data']['consumerId'];
peersBloc.add(PeerResumedConsumer(consumerId: consumerId));
break;
}
case 'newPeer':
{
final Map<String, dynamic> newPeer =
Map<String, dynamic>.from(notification['data']);
peersBloc.add(PeerAdd(newPeer: newPeer));
break;
}
case 'peerClosed':
{
String peerId = notification['data']['peerId'];
peersBloc.add(PeerRemove(peerId: peerId));
break;
}
default:
break;
}
};
}