UNPKG

@jbrowse/core

Version:

JBrowse 2 core libraries used by plugins

66 lines (65 loc) 2.8 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const librpc_web_mod_1 = __importDefault(require("librpc-web-mod")); const serialize_error_1 = require("serialize-error"); const BaseRpcDriver_1 = __importDefault(require("./BaseRpcDriver")); const nanoid_1 = require("../util/nanoid"); class WebWorkerHandle extends librpc_web_mod_1.default.Client { destroy() { this.workers[0].terminate(); } async call(funcName, args, opts) { const { statusCallback, rpcDriverClassName } = opts; const channel = `message-${(0, nanoid_1.nanoid)()}`; const listener = (message) => { statusCallback === null || statusCallback === void 0 ? void 0 : statusCallback(message); }; this.on(channel, listener); const result = await super.call(funcName, { ...args, channel, rpcDriverClassName }, opts); this.off(channel, listener); return result; } } class WebWorkerRpcDriver extends BaseRpcDriver_1.default { constructor(args, workerBootConfiguration) { super(args); this.workerBootConfiguration = workerBootConfiguration; this.name = 'WebWorkerRpcDriver'; this.makeWorkerInstance = args.makeWorkerInstance; } async makeWorker() { const instance = this.makeWorkerInstance(); const worker = new WebWorkerHandle({ workers: [instance] }); const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); if (isSafari) { console.log('console logging the webworker handle avoids the track going into an infinite loading state, this is a hacky workaround for safari', instance); } return new Promise((resolve, reject) => { const listener = (e) => { switch (e.data.message) { case 'ready': { resolve(worker); worker.workers[0].removeEventListener('message', listener); break; } case 'readyForConfig': { worker.workers[0].postMessage({ message: 'config', config: this.workerBootConfiguration, }); break; } case 'error': { reject((0, serialize_error_1.deserializeError)(e.data.error)); break; } } }; worker.workers[0].addEventListener('message', listener); }); } } exports.default = WebWorkerRpcDriver;