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