UNPKG

@jbrowse/plugin-linear-genome-view

Version:

JBrowse 2 linear genome view

230 lines (229 loc) 8.29 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.renderBlockData = renderBlockData; const configuration_1 = require("@jbrowse/core/configuration"); const util_1 = require("@jbrowse/core/util"); const stopToken_1 = require("@jbrowse/core/util/stopToken"); const tracks_1 = require("@jbrowse/core/util/tracks"); const types_1 = require("@jbrowse/core/util/types"); const mobx_state_tree_1 = require("mobx-state-tree"); const ServerSideRenderedBlockContent_1 = __importDefault(require("../components/ServerSideRenderedBlockContent")); const blockState = mobx_state_tree_1.types .model('BlockState', { key: mobx_state_tree_1.types.string, region: mobx_state_tree_1.types.frozen(), reloadFlag: 0, isLeftEndOfDisplayedRegion: false, isRightEndOfDisplayedRegion: false, }) .volatile(() => ({ stopToken: undefined, filled: false, reactElement: undefined, features: undefined, layout: undefined, status: '', error: undefined, message: undefined, maxHeightReached: false, ReactComponent: ServerSideRenderedBlockContent_1.default, renderProps: undefined, })) .actions(self => ({ doReload() { self.reloadFlag = self.reloadFlag + 1; }, afterAttach() { const display = (0, util_1.getContainingDisplay)(self); setTimeout(() => { if ((0, mobx_state_tree_1.isAlive)(self)) { (0, util_1.makeAbortableReaction)(self, renderBlockData, renderBlockEffect, { name: `${display.id}/${(0, util_1.assembleLocString)(self.region)} rendering`, delay: display.renderDelay, fireImmediately: true, }, this.setLoading, this.setRendered, this.setError); } }, display.renderDelay); }, setStatus(message) { self.status = message; }, setLoading(newStopToken) { if (self.stopToken !== undefined) { (0, stopToken_1.stopStopToken)(self.stopToken); } self.filled = false; self.message = undefined; self.reactElement = undefined; self.features = undefined; self.layout = undefined; self.error = undefined; self.maxHeightReached = false; self.renderProps = undefined; self.stopToken = newStopToken; }, setMessage(messageText) { if (self.stopToken !== undefined) { (0, stopToken_1.stopStopToken)(self.stopToken); } self.filled = false; self.message = messageText; self.reactElement = undefined; self.features = undefined; self.layout = undefined; self.error = undefined; self.maxHeightReached = false; self.renderProps = undefined; self.stopToken = undefined; }, setRendered(props) { if (!props) { return; } const { reactElement, features, layout, maxHeightReached, renderProps } = props; self.filled = true; self.message = undefined; self.reactElement = reactElement; self.features = features; self.layout = layout; self.error = undefined; self.maxHeightReached = maxHeightReached; self.renderProps = renderProps; self.stopToken = undefined; }, setError(error) { console.error(error); if (self.stopToken !== undefined) { (0, stopToken_1.stopStopToken)(self.stopToken); } self.filled = false; self.message = undefined; self.reactElement = undefined; self.features = undefined; self.layout = undefined; self.maxHeightReached = false; self.error = error; self.renderProps = undefined; self.stopToken = undefined; if ((0, types_1.isRetryException)(error)) { this.reload(); } }, reload() { self.stopToken = undefined; self.filled = false; self.reactElement = undefined; self.features = undefined; self.layout = undefined; self.error = undefined; self.message = undefined; self.maxHeightReached = false; self.ReactComponent = ServerSideRenderedBlockContent_1.default; self.renderProps = undefined; (0, mobx_state_tree_1.getParent)(self, 2).reload(); }, beforeDestroy() { ; (async () => { try { if (self.stopToken !== undefined) { (0, stopToken_1.stopStopToken)(self.stopToken); } const display = (0, util_1.getContainingDisplay)(self); const { rpcManager } = (0, util_1.getSession)(self); const { rendererType } = display; const { renderArgs } = renderBlockData((0, mobx_state_tree_1.cast)(self)); if (renderArgs) { await rendererType.freeResourcesInClient(rpcManager, JSON.parse(JSON.stringify(renderArgs))); } } catch (e) { console.error('Error while destroying block', e); } })(); }, })); exports.default = blockState; function renderBlockData(self, optDisplay) { try { const display = optDisplay || (0, util_1.getContainingDisplay)(self); const { assemblyManager, rpcManager } = (0, util_1.getSession)(display); const { adapterConfig, rendererType, error, parentTrack } = display; const assemblyNames = (0, tracks_1.getTrackAssemblyNames)(parentTrack); const regionAsm = self.region.assemblyName; if (!assemblyNames.includes(regionAsm) && !assemblyNames.some(name => { var _a; return (_a = assemblyManager.get(name)) === null || _a === void 0 ? void 0 : _a.hasName(regionAsm); })) { throw new Error(`region assembly (${regionAsm}) does not match track assemblies (${assemblyNames})`); } const renderProps = display.renderProps(); const { config } = renderProps; (0, configuration_1.readConfObject)(config); const sessionId = (0, tracks_1.getRpcSessionId)(display); const layoutId = (0, util_1.getContainingTrack)(display).id; const cannotBeRenderedReason = display.regionCannotBeRendered(self.region); return { rendererType, rpcManager, renderProps, cannotBeRenderedReason, displayError: error, renderArgs: { statusCallback: (message) => { if ((0, mobx_state_tree_1.isAlive)(self)) { self.setStatus(message); } }, assemblyName: self.region.assemblyName, regions: [self.region], adapterConfig, rendererType: rendererType.name, sessionId, layoutId, blockKey: self.key, reloadFlag: self.reloadFlag, timeout: 1000000, }, }; } catch (e) { return { displayError: e }; } } async function renderBlockEffect(props, stopToken, self) { if (!props) { return; } const { rendererType, renderProps, rpcManager, renderArgs, cannotBeRenderedReason, displayError, } = props; if (!(0, mobx_state_tree_1.isAlive)(self)) { return undefined; } else if (displayError) { self.setError(displayError); return undefined; } else if (cannotBeRenderedReason) { self.setMessage(cannotBeRenderedReason); return undefined; } else if (renderProps.notReady) { return undefined; } else { const { reactElement, features, layout, maxHeightReached } = await rendererType.renderInClient(rpcManager, { ...renderArgs, ...renderProps, viewParams: (0, util_1.getViewParams)(self), stopToken, }); return { reactElement, features, layout, maxHeightReached, renderProps, }; } }