UNPKG

wasmrs-js

Version:

A JavaScript implementation of the RSocket protocol over WebAssembly.

60 lines 2.47 kB
import { Deserializer, } from 'rsocket-core'; import { WorkerDuplexConnection } from './worker-connection'; import { debug } from './debug'; import Worker from 'web-worker'; export class WorkerClientTransport { factory; module; wasiOptions; constructor(options) { this.module = options.module; this.wasiOptions = options.wasi; if (!options.workerFactory && options.workerUrl) { this.factory = async () => { const workerUrl = options.workerUrl; const worker = new Worker(workerUrl, { type: 'module' }); return worker; }; } else if (options.workerFactory && !options.workerUrl) { this.factory = options.workerFactory; } else { throw new Error('WorkerClientTransport requires either a workerFactory or a workerOptions'); } } connect(multiplexerDemultiplexerFactory) { return this.factory().then((worker) => { const promise = new Promise((res, rej) => { const resolve = (msg) => { debug('received setup response %o', msg.data); worker.removeEventListener('message', resolve); worker.removeEventListener('error', reject); worker.removeEventListener('messageerror', reject); res(worker); }; const reject = (msg) => { debug('failed to initialize worker %o', msg); worker.removeEventListener('message', resolve); worker.removeEventListener('error', reject); worker.removeEventListener('messageerror', reject); worker.terminate(); rej(msg); }; worker.addEventListener('message', resolve); worker.addEventListener('error', reject); worker.addEventListener('messageerror', reject); }); const setup = { module: this.module, wasi: this.wasiOptions, }; worker.postMessage(setup); return promise.then((worker) => { debug('starting worker connection'); return new WorkerDuplexConnection(worker, new Deserializer(), multiplexerDemultiplexerFactory); }); }); } } //# sourceMappingURL=worker-transport.js.map