wasmrs-js
Version:
A JavaScript implementation of the RSocket protocol over WebAssembly.
60 lines • 2.47 kB
JavaScript
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