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