in lib/src/server.dart [196:240]
Future _handleSingleRequest(request) async {
try {
_validateRequest(request);
var name = request['method'];
var method = _methods[name];
method ??= _tryFallbacks;
Object? result;
if (method is ZeroArgumentFunction) {
if (request.containsKey('params')) {
throw RpcException.invalidParams('No parameters are allowed for '
'method "$name".');
}
result = await method();
} else {
result = await method(Parameters(name, request['params']));
}
// A request without an id is a notification, which should not be sent a
// response, even if one is generated on the server.
if (!request.containsKey('id')) return null;
return {'jsonrpc': '2.0', 'result': result, 'id': request['id']};
} catch (error, stackTrace) {
if (error is RpcException) {
if (error.code == error_code.INVALID_REQUEST ||
request.containsKey('id')) {
return error.serialize(request);
} else {
onUnhandledError?.call(error, stackTrace);
return null;
}
} else if (!request.containsKey('id')) {
onUnhandledError?.call(error, stackTrace);
return null;
}
final chain = Chain.forTrace(stackTrace);
return RpcException(error_code.SERVER_ERROR, getErrorMessage(error),
data: {
'full': '$error',
'stack': '$chain',
}).serialize(request);
}
}