UNPKG

@jbrowse/core

Version:

JBrowse 2 core libraries used by plugins

64 lines (63 loc) 2.69 kB
import MainThreadRpcDriver from "./MainThreadRpcDriver.js"; import WebWorkerRpcDriver from "./WebWorkerRpcDriver.js"; import rpcConfigSchema from "./configSchema.js"; import { readConfObject } from "../configuration/index.js"; export default class RpcManager { pluginManager; mainConfiguration; backendConfigurations; static configSchema = rpcConfigSchema; driverObjects; driverFactories; constructor(pluginManager, mainConfiguration, backendConfigurations) { this.pluginManager = pluginManager; this.mainConfiguration = mainConfiguration; this.backendConfigurations = backendConfigurations; this.driverObjects = new Map(); this.driverFactories = new Map(); this.registerDriverFactory('MainThreadRpcDriver', (config, backendConfig) => new MainThreadRpcDriver({ ...backendConfig, config, })); this.registerDriverFactory('WebWorkerRpcDriver', (config, backendConfig, pm) => new WebWorkerRpcDriver({ ...backendConfig, config, }, { plugins: pm.runtimePluginDefinitions, windowHref: typeof window !== 'undefined' ? window.location.href : '', })); } registerDriverFactory(name, factory) { this.driverFactories.set(name, factory); } getDriver(backendName) { const existingDriver = this.driverObjects.get(backendName); if (existingDriver) { return existingDriver; } const factory = this.driverFactories.get(backendName); if (!factory) { throw new Error(`RPC driver "${backendName}" is not registered`); } const backendConfig = this.backendConfigurations[backendName]; if (!backendConfig) { throw new Error(`RPC driver "${backendName}" is missing configuration`); } const config = this.mainConfiguration.drivers.get('WebWorkerRpcDriver'); const newDriver = factory(config, backendConfig, this.pluginManager); this.driverObjects.set(backendName, newDriver); return newDriver; } async getDriverForCall(_sessionId, _functionName, args) { const backendName = args.rpcDriverName || readConfObject(this.mainConfiguration, 'defaultDriver'); return this.getDriver(backendName); } async call(sessionId, functionName, args, opts = {}) { if (!sessionId) { throw new Error('sessionId is required'); } const driverForCall = await this.getDriverForCall(sessionId, functionName, args); return driverForCall.call(this.pluginManager, sessionId, functionName, args, opts); } }