@jbrowse/core
Version:
JBrowse 2 core libraries used by plugins
66 lines (65 loc) • 2.8 kB
JavaScript
;
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;