start method

Future<void> start(
  1. String? id,
  2. String token
)

Implementation

Future<void> start(String? id, String token) async {
  Completer<void> completer = Completer<void>();

  if (clientType == 'websocket') {
    _id = id;
  }
  final version = await getVersion();
  final wsUrl = '$_baseWebSocketUrl&id=$id&token=$token';

  if ((_websocket != null || socketio != null) || !_disconnected) {
    return;
  }

  if (clientType == 'websocket') {
    _websocket = WebSocketChannel.connect(Uri.parse(wsUrl + "&version=$version"), protocols: ["websocket"]);
  } else {
    socketio = IO.io(
      _baseSocketioUrl+"/peerjs",
      IO.OptionBuilder()
          .setQuery({..._baseSocketioQueryParams, 'token': token, 'version': version}).build(),
    );
  }
  _disconnected = false;
  logger.log('WebSocket connection established.');

  if (clientType == 'websocket') {
    _websocket!.stream.listen((message) {
      try {
        final data = jsonDecode(message);
        logger.log('Server message received: $data');
        emit(SocketEventType.Message.value, data);
      } catch (err, stack) {
        logger.log('Invalid server message $message');
      }
    }, onError: (err) {
      logger.error(err.inner.message);
    }, onDone: () {
      if (_disconnected) {
        return;
      }

      logger.log('Socket closed.');
      _cleanup();
      _disconnected = true;
      emit(SocketEventType.Disconnected.value);
    });

    _websocket!.sink
        .addStream(Stream.fromIterable([
      jsonEncode({'type': 'open'})
    ]))
        .then((_) {
      if (_disconnected) {
        return;
      }
      _sendQueuedMessages();
      logger.log('Socket open');
      _scheduleHeartbeat();
      completer.complete();
    }).catchError((error) {
      logger.log('Error opening socket: $error');
      completer.completeError(error);
    });
  } else {
    socketio!.on('connect', (_) {
      _id = socketio!.id;
      if (_disconnected) {
        return;
      }
      _sendQueuedMessages();
      logger.log('Socket open');
      completer.complete();
    });

    socketio!.on('message', (data) {
      try {
        logger.log(
          'Server message received:$data',
        );
        emit(SocketEventType.Message.value, data);
      } catch (e) {
        logger.log('Invalid server message $data');
      }
    });

    socketio!.on('error', (err) {
      logger.error('$err');
      if (!completer.isCompleted) {
        completer.completeError(err);
      }
    });

    socketio!.on('disconnect', (reason) {
      if (_disconnected) {
        return;
      }
      logger.log('Socket closed.$reason');
      _cleanup();
      _disconnected = true;
      emit(SocketEventType.Disconnected.value);
      if (!completer.isCompleted) {
        completer.completeError(reason);
      }
    });
  }

  return completer.future;
}