From a973b6d4b223ed0dce3597e10634b8f10e84db64 Mon Sep 17 00:00:00 2001 From: break27 Date: Tue, 14 Apr 2026 14:10:36 +0800 Subject: [PATCH] add: 'prelude' function --- .gitignore | 1 + pyproject.toml | 7 +++--- src/common/jsonrpc2/__init__.py | 9 ++++--- src/common/jsonrpc2/client.js | 42 +++++++++++++++++++++++++++++++++ src/common/jsonrpc2/server.py | 5 ---- 5 files changed, 52 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index 2581d0b..cba9cf3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +/build /dist /venv *.egg-info \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index e190c1e..314932a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta" [project] name = "common" description = "Reusable code stubs" -version = "0.1.5" +version = "0.1.6" requires-python = ">=3.13" authors = [ { name="BreakerBear", email="breakerbear@autistic.men" }, @@ -22,6 +22,5 @@ Issues = "https://git.autistic.men/Utilities/common/issues" [tool.setuptools] include-package-data = true -[tool.setuptools.packages.find] -namespaces = true -where = ["src"] \ No newline at end of file +[tools.setuptools.package-data] +"common.jsonrpc2" = ["*.js"] diff --git a/src/common/jsonrpc2/__init__.py b/src/common/jsonrpc2/__init__.py index c89f69e..8631116 100644 --- a/src/common/jsonrpc2/__init__.py +++ b/src/common/jsonrpc2/__init__.py @@ -7,10 +7,13 @@ from common.jsonrpc2.server import ( ConnectionContext, define, remove, - url, run ) -def script(): +def prelude() -> str: with open(__file__.replace('__init__.py', 'client.js'), 'r') as file: - return file.read() + from common.jsonrpc2.server import server + assert server is not None + endpoint = server.listeners[0] + url = f'ws://{endpoint.address}:{endpoint.port}' + return file.read() % url diff --git a/src/common/jsonrpc2/client.js b/src/common/jsonrpc2/client.js index e69de29..10aadc5 100644 --- a/src/common/jsonrpc2/client.js +++ b/src/common/jsonrpc2/client.js @@ -0,0 +1,42 @@ +const CONNECTION = new WebSocket("%s"); +const QUEUE = new Array(); + +CONNECTION.addEventListener('message', (e) => { + let message = JSON.parse(e.data); + let index = QUEUE.findIndex(item => item.id === message.id); + + if (index === -1) throw Error('Invalid message ID: ' + message.id); + let promise = QUEUE.splice(index, 1)[0]; + + if (message.error) promise.reject(message.error); + else promise.resolve(message.result); +}); + +async function notify(method, ...args) { + let request = { method }; + if (args.length > 0) request.params = args; + let data = JSON.stringify(request); + CONNECTION.send(data); +} + +async function invoke(method, ...args) { + let id = Math.floor(Math.random() * 1000000000); + let request = { method, id }; + if (args.length > 0) request.params = args; + + let data = JSON.stringify(request); + CONNECTION.send(data); + + let reject = null; + let resolve = null; + let promise = new Promise((a, b) => { resolve = a; reject = b; }); + let item = { resolve, reject, id }; + QUEUE.push(item); + + let result = await promise; + return result; +} + +window.notify = notify; +window.invoke = invoke; +main(...arguments); // entrypoint to user-defined (async) main stub of the script \ No newline at end of file diff --git a/src/common/jsonrpc2/server.py b/src/common/jsonrpc2/server.py index 3ea43ff..8d48580 100644 --- a/src/common/jsonrpc2/server.py +++ b/src/common/jsonrpc2/server.py @@ -152,11 +152,6 @@ def define(method: str, handler: Callable[..., Any]): def remove(method: str) -> Callable[..., Any]: return handlers.pop(method) -def url(): - if server is None: return None - endpoint = server.listeners[0] - return f'ws://{endpoint.address}:{endpoint.port}' - def run(logger: logging.Logger): history = History() fmt = logger.handlers[0].formatter