add: 'prelude' function

This commit is contained in:
2026-04-14 14:10:36 +08:00
parent 92ece502f0
commit a973b6d4b2
5 changed files with 52 additions and 12 deletions

1
.gitignore vendored
View File

@@ -1,3 +1,4 @@
/build
/dist
/venv
*.egg-info

View File

@@ -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"]
[tools.setuptools.package-data]
"common.jsonrpc2" = ["*.js"]

View File

@@ -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

View File

@@ -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

View File

@@ -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