Files
common/src/common/jsonrpc2/client.js

55 lines
1.8 KiB
JavaScript

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);
});
while (CONNECTION.readyState !== CONNECTION.OPEN) {
await new Promise(resolve => setTimeout(resolve, 1000));
}
const LogRecord = {
format: (record) => {
let ms = record.created * 1000 - new Date().getTimezoneOffset() * 60000;
let date = new Date(ms).toISOString().slice(0, 16).replace("T", " ");
let line = `[${date}] [${record.levelname}] [${record.name}] ${record.msg}`;
let message = [line, record.exc_text, record.stack_info].filter(Boolean).join('\n');
return message;
},
};
const RemoteProceduralCall = {
notify: async (method, ...args) => {
let request = { method };
if (args.length > 0) request.params = args;
let data = JSON.stringify(request);
CONNECTION.send(data);
},
invoke: async (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 [resolve, reject] = [null, null];
let promise = new Promise((a, b) => { resolve = a; reject = b; });
QUEUE.push({ resolve, reject, id });
let result = await promise;
return result;
},
};
window.LogRecord = LogRecord;
window.Rpc2 = RemoteProceduralCall;
main(...arguments); // entrypoint to user-defined (async) main stub of the script