Skip to main content
Module

x/async_call_rpc/index.html

A lightweight JSON RPC client & server
Latest
File
<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" /> </head> <body> <script src="./out/full.js"></script> <script> Object.assign(globalThis, AsyncCall) class PlayGroundChannel { static server = document.createElement('a') static client = document.createElement('a') // actor: 'server' | 'client' constructor(actor) { this.actor = actor PlayGroundChannel[actor].addEventListener('targetEventChannel', (e) => { const detail = e.detail for (const f of this.listener) { try { f(detail) } catch {} } }) } listener = [] on(_, cb) { this.listener.push(cb) } emit(_, data) { PlayGroundChannel[this.actor === 'client' ? 'server' : 'client'].dispatchEvent( new CustomEvent('targetEventChannel', { detail: data }), ) } } const server = new PlayGroundChannel('server') const client = new PlayGroundChannel('client') let count = 0 function define(def, key = `server${count++}`) { // define server AsyncCall(def, { channel: server, key, preservePauseOnException: true, log: { beCalled: true, localError: true, remoteError: true, type: 'pretty', requestReplay: true, sendLocalStack: true, }, }) // define client globalThis[key] = AsyncCall({}, { channel: client, key }) console.log('Server is available as global variable', key, globalThis[key], def) } function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)) } define({ async add(a, b) { return a + b }, async error() { await sleep(200) throws() }, }) function throws(i = 0) { if (i <= 0) return throws(++i) throw new Error() } </script> </body></html>