openWebSocket method

void openWebSocket()

Opens a websocket for receiving Capture events.

After each received event, re-sends waitforcaptureevent so the server delivers the next one (long-polling protocol).

Implementation

void openWebSocket() {
  websocket = WebSocketChannel.connect(Uri.parse(hostWebsocket));
  logger?.log('websocket =>', 'open attempt');
  _sendWaitForEvent();
  websocket!.stream.listen(
    (dynamic message) {
      logger?.log('receiving something through the websocket:', message);
      final Map<String, dynamic> jsonRes =
          json.decode(message as String) as Map<String, dynamic>;
      final JRpcResponse response = JRpcResponse.fromJson(jsonRes);
      final CaptureResult? result = response.captureResult;
      final CaptureEvent? event = result?.event;
      if (event != null) {
        notification(event, result?.handle);
      } else if (jsonRes['error'] != null) {
        logger!.log('Error in listener',
            '${jsonRes['error']['code']}: ${jsonRes['error']['message']}');
        final CaptureException err = CaptureException(
            jsonRes['error']['code'] as int,
            jsonRes['error']['message'] as String);
        notification(err, 00000);
      } else {
        logger?.log('websocket =>', 'No result returned');
      }
    },
    onDone: () {
      logger?.log('websocket =>', 'websocket closed!');
    },
    onError: (dynamic error) {
      final CaptureException err;
      if (error is WebSocketChannelException) {
        err = CaptureException(
          SktErrors.ESKT_SERVICENOTCOMMUNICATING,
          'WebSocket channel error: ${error.message}',
        );
      } else {
        err = CaptureException(
          SktErrors.ESKT_SERVICENOTCOMMUNICATING,
          'Service is unable to communicate',
        );
      }
      notification(err);
    },
  );
}