@jbrowse/plugin-linear-genome-view
Version:
JBrowse 2 linear genome view
230 lines (229 loc) • 8.29 kB
JavaScript
;
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,
};
}
}