Implementation
Future<Command?> sendCommand(Command cmd) async {
if (appState.currentUser == null) {
//NOTE: some test cases execute async socket data
logger.e('sendCommand: connection is requred');
throw ConnectionRequiredError();
}
// if (!webSocket.isConnected()) {
// logger.e('sendCommand: Websocket connection is closed');
// throw WebSocketConnectionClosedError();
// }
try {
await ConnectionManager.readyToExecuteWSRequest();
} catch (e) {
_ackTimers.remove(cmd.requestId)?.cancel();
rethrow;
}
try {
webSocket?.send(cmd.encode());
} catch (e) {
_ackTimers.remove(cmd.requestId)?.cancel();
rethrow;
}
// } else {
// ackTimers[cmd.requestId].cancel();
// ackTimers.removeWhere((key, value) => key == cmd.requestId);
// throw WebSocketError();
// }
final reqId = cmd.requestId;
logger.i('Command ${cmd.cmd} Payload ${cmd.payload}');
if (cmd.isAckRequired && reqId != null) {
final timer = Timer(Duration(seconds: sdk.options.websocketTimeout), () {
logger.e('sendCommand: did not receive ack in time');
throw AckTimeoutError();
});
_ackTimers[reqId] = timer;
final completer = Completer<Command>();
_completers[reqId] = completer;
return completer.future;
} else {
return null;
}
}