add: 'prelude' function
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,3 +1,4 @@
|
||||
/build
|
||||
/dist
|
||||
/venv
|
||||
*.egg-info
|
||||
@@ -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"]
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user