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