mirror of
https://github.com/gnh1201/welsonjs.git
synced 2026-03-03 01:50:55 +00:00
Add SPDX license header and project copyright/URL to JsNative.cs for proper licensing metadata. Update JsonRpc2Dispatcher.cs to improve the exception text to "Unsupported JSON-RPC version: ..." (capitalization and hyphen) for a clearer error message when the jsonrpc version is invalid.
85 lines
2.6 KiB
C#
85 lines
2.6 KiB
C#
// JsonRpc2Dispatcher.cs
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
// SPDX-FileCopyrightText: 2025 Catswords OSS and WelsonJS Contributors
|
|
// https://github.com/gnh1201/welsonjs
|
|
//
|
|
using log4net;
|
|
using System;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace WelsonJS.Launcher
|
|
{
|
|
public sealed class JsonRpc2Request
|
|
{
|
|
public string Version;
|
|
public string Method;
|
|
}
|
|
|
|
public sealed class JsonRpc2Exception : Exception
|
|
{
|
|
public JsonRpc2Exception(string message) : base(message) { }
|
|
public JsonRpc2Exception(string message, Exception inner) : base(message, inner) { }
|
|
}
|
|
|
|
public sealed class JsonRpc2Dispatcher
|
|
{
|
|
private readonly ILog _logger;
|
|
|
|
public JsonRpc2Dispatcher(ILog logger)
|
|
{
|
|
_logger = logger;
|
|
}
|
|
|
|
public async Task<string> HandleAsync(
|
|
string requestBody,
|
|
Func<string, JsSerializer, CancellationToken, Task<string>> dispatchMethodAsync,
|
|
CancellationToken ct)
|
|
{
|
|
if (string.IsNullOrEmpty(requestBody))
|
|
throw new JsonRpc2Exception("Empty request body");
|
|
|
|
if (dispatchMethodAsync == null)
|
|
throw new ArgumentNullException("dispatchMethodAsync");
|
|
|
|
using (var ser = new JsSerializer())
|
|
{
|
|
int id = ser.Load(requestBody);
|
|
|
|
try
|
|
{
|
|
string version = ser.ExtractFrom(id, "jsonrpc");
|
|
if (!string.Equals(version, "2.0", StringComparison.Ordinal))
|
|
throw new JsonRpc2Exception("Unsupported JSON-RPC version: " + version);
|
|
|
|
string method = ser.ExtractFrom(id, "method");
|
|
if (string.IsNullOrEmpty(method))
|
|
throw new JsonRpc2Exception("Missing method");
|
|
|
|
var req = new JsonRpc2Request
|
|
{
|
|
Version = version,
|
|
Method = method
|
|
};
|
|
|
|
return await dispatchMethodAsync(req.Method, ser, ct);
|
|
}
|
|
catch (JsonRpc2Exception)
|
|
{
|
|
throw;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
if (_logger != null)
|
|
_logger.Error("[JsonRpc2] Parse error", ex);
|
|
|
|
throw new JsonRpc2Exception("Parse error", ex);
|
|
}
|
|
finally
|
|
{
|
|
ser.Unload(id);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |