import {Connection, Event, Transport, TransportError} from 'lean-client-js-core'; import {LeanJsOpts} from './inprocesstypes'; import Worker from './webworkerscript'; import {Res, StartWorkerReq} from './webworkertypes'; export class WebWorkerTransport implements Transport { opts: LeanJsOpts; constructor(opts: LeanJsOpts) { this.opts = opts; } connect(): WebWorkerConnection { const worker = new Worker(); worker.postMessage({ command: 'start-webworker', opts: this.opts, } as StartWorkerReq); const conn = new WebWorkerConnection(worker); worker.onmessage = (e) => { const res = e.data as Res; // Pass all messages (including errors) back to the server object // jsonMessage has some error handling already conn.jsonMessage.fire(res); }; return conn; } } export class WebWorkerConnection implements Connection { // TODO: type issue here; not all errors are TransportErrors // try e.g. server.info() with a missing file error: Event = new Event(); jsonMessage: Event = new Event(); alive: boolean = true; worker: Worker; constructor(worker: Worker) { this.worker = worker; } send(msg: any) { this.worker.postMessage(msg); } dispose() { this.worker.terminate(); this.alive = false; } }