handleMessage method
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())),
);
}
}