55 lines
1.8 KiB
JavaScript
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
|