handleMessage method

Future<void> handleMessage(
  1. Object? message
)

Routes one decoded incoming JSON-RPC message.

Implementation

Future<void> handleMessage(Object? message) async {
  if (message is! Map<String, Object?>) return;
  final method = message['method'];
  final id = message['id'];

  if (method is! String) {
    // A response to a request we sent (client role); the server role leaves
    // [onResponse] null and simply ignores it.
    if (id != null) onResponse?.call(message);
    return;
  }

  if (id == null) {
    // Notification.
    try {
      onNotification?.call(method, message['params']);
    } catch (_) {
      // Notifications must not produce a reply, even on error.
    }
    return;
  }

  // Request: must reply with the same id.
  final handler = onRequest;
  if (handler == null) {
    writeMessage(
      _error(
        id,
        const ResponseError(
          ResponseError.methodNotFound,
          'No request handler',
        ),
      ),
    );
    return;
  }
  try {
    final result = await handler(method, message['params']);
    writeMessage({'jsonrpc': '2.0', 'id': id, 'result': result});
  } on ResponseError catch (e) {
    writeMessage(_error(id, e));
  } catch (e) {
    writeMessage(
      _error(id, ResponseError(ResponseError.internalError, e.toString())),
    );
  }
}