@jbrowse/core 2.17.0 → 2.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +1 -2
- package/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +4 -8
- package/BaseFeatureWidget/BaseFeatureDetail/BaseCard.d.ts +1 -1
- package/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +1 -2
- package/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +2 -3
- package/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
- package/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +2 -3
- package/BaseFeatureWidget/BaseFeatureDetail/DataGridDetails.js +22 -25
- package/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +2 -2
- package/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +6 -8
- package/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +1 -1
- package/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +1 -1
- package/BaseFeatureWidget/BaseFeatureDetail/UriField.js +1 -1
- package/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +1 -1
- package/BaseFeatureWidget/BaseFeatureDetail/index.js +1 -7
- package/BaseFeatureWidget/BaseFeatureDetail/util.js +0 -5
- package/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.d.ts +2 -2
- package/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.js +0 -7
- package/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +2 -2
- package/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.js +1 -7
- package/BaseFeatureWidget/SequenceFeatureDetails/SequencePanel.d.ts +3 -3
- package/BaseFeatureWidget/SequenceFeatureDetails/SequencePanel.js +24 -33
- package/BaseFeatureWidget/SequenceFeatureDetails/dialogs/HelpDialog.js +1 -2
- package/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceDialog.d.ts +2 -2
- package/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceDialog.js +3 -4
- package/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceFeatureMenu.d.ts +2 -2
- package/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceFeatureMenu.js +3 -6
- package/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceTypeSelector.d.ts +1 -1
- package/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SettingsDialog.d.ts +1 -1
- package/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SettingsDialog.js +2 -2
- package/BaseFeatureWidget/SequenceFeatureDetails/hooks.d.ts +2 -2
- package/BaseFeatureWidget/SequenceFeatureDetails/hooks.js +1 -2
- package/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +2 -56
- package/BaseFeatureWidget/SequenceFeatureDetails/model.js +1 -56
- package/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/CDNASequence.d.ts +3 -3
- package/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/CDSSequence.d.ts +2 -2
- package/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/CDSSequence.js +5 -6
- package/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/GenomicSequence.d.ts +2 -2
- package/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/GenomicSequence.js +0 -1
- package/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/ProteinSequence.d.ts +2 -2
- package/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/ProteinSequence.js +0 -2
- package/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/SequenceDisplay.d.ts +1 -1
- package/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/SequenceDisplay.js +1 -3
- package/BaseFeatureWidget/SequenceFeatureDetails/util.js +1 -5
- package/BaseFeatureWidget/stateModelFactory.d.ts +2 -93
- package/BaseFeatureWidget/stateModelFactory.js +3 -73
- package/BaseFeatureWidget/types.d.ts +3 -3
- package/BaseFeatureWidget/util.js +0 -4
- package/CorePlugin.d.ts +1 -1
- package/CorePlugin.js +2 -5
- package/Plugin.d.ts +2 -5
- package/Plugin.js +0 -3
- package/PluginLoader.d.ts +1 -1
- package/PluginLoader.js +2 -19
- package/PluginManager.d.ts +15 -31
- package/PluginManager.js +11 -39
- package/ReExports/DataGrid.js +0 -1
- package/ReExports/list.d.ts +0 -5
- package/ReExports/list.js +0 -5
- package/ReExports/modules.d.ts +22 -20
- package/ReExports/modules.js +16 -25
- package/TextSearch/BaseResults.d.ts +3 -3
- package/TextSearch/TextSearchManager.d.ts +4 -16
- package/TextSearch/TextSearchManager.js +1 -13
- package/assemblyManager/assembly.d.ts +5 -100
- package/assemblyManager/assembly.js +27 -143
- package/assemblyManager/assemblyConfigSchema.d.ts +1 -34
- package/assemblyManager/assemblyConfigSchema.js +12 -46
- package/assemblyManager/assemblyManager.d.ts +7 -57
- package/assemblyManager/assemblyManager.js +2 -57
- package/configuration/configurationSchema.d.ts +4 -4
- package/configuration/configurationSchema.js +2 -14
- package/configuration/configurationSlot.d.ts +1 -12
- package/configuration/configurationSlot.js +2 -32
- package/configuration/index.d.ts +2 -2
- package/configuration/index.js +2 -2
- package/configuration/types.d.ts +2 -3
- package/configuration/util.d.ts +1 -25
- package/configuration/util.js +19 -56
- package/data_adapters/BaseAdapter/BaseAdapter.d.ts +4 -14
- package/data_adapters/BaseAdapter/BaseAdapter.js +1 -10
- package/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +5 -114
- package/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +3 -79
- package/data_adapters/BaseAdapter/BaseOptions.d.ts +2 -2
- package/data_adapters/BaseAdapter/BaseRefNameAliasAdapter.d.ts +2 -2
- package/data_adapters/BaseAdapter/BaseSequenceAdapter.d.ts +3 -6
- package/data_adapters/BaseAdapter/BaseTextSearchAdapter.d.ts +3 -3
- package/data_adapters/BaseAdapter/RegionsAdapter.d.ts +3 -3
- package/data_adapters/BaseAdapter/index.d.ts +4 -4
- package/data_adapters/BaseAdapter/types.d.ts +2 -2
- package/data_adapters/BaseAdapter/util.d.ts +6 -6
- package/data_adapters/CytobandAdapter/CytobandAdapter.d.ts +1 -1
- package/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -2
- package/data_adapters/CytobandAdapter/configSchema.d.ts +0 -3
- package/data_adapters/CytobandAdapter/configSchema.js +1 -7
- package/data_adapters/CytobandAdapter/index.d.ts +1 -1
- package/data_adapters/CytobandAdapter/index.js +1 -1
- package/data_adapters/dataAdapterCache.d.ts +4 -21
- package/data_adapters/dataAdapterCache.js +0 -19
- package/package.json +3 -4
- package/pluggableElementTypes/AdapterType.d.ts +2 -2
- package/pluggableElementTypes/AddTrackWorkflowType.d.ts +2 -2
- package/pluggableElementTypes/ConnectionType.d.ts +3 -3
- package/pluggableElementTypes/DisplayType.d.ts +3 -9
- package/pluggableElementTypes/InternetAccountType.d.ts +2 -2
- package/pluggableElementTypes/PluggableElementBase.d.ts +1 -1
- package/pluggableElementTypes/PluggableElementBase.js +2 -2
- package/pluggableElementTypes/RpcMethodType.d.ts +5 -11
- package/pluggableElementTypes/RpcMethodType.js +7 -19
- package/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +9 -0
- package/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.js +35 -0
- package/pluggableElementTypes/TextSearchAdapterType.d.ts +2 -2
- package/pluggableElementTypes/TrackType.d.ts +3 -3
- package/pluggableElementTypes/ViewType.d.ts +3 -3
- package/pluggableElementTypes/WidgetType.d.ts +4 -3
- package/pluggableElementTypes/index.d.ts +11 -11
- package/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +2 -29
- package/pluggableElementTypes/models/BaseConnectionModelFactory.js +1 -28
- package/pluggableElementTypes/models/BaseDisplayModel.d.ts +3 -83
- package/pluggableElementTypes/models/BaseDisplayModel.js +2 -69
- package/pluggableElementTypes/models/BaseTrackModel.d.ts +4 -46
- package/pluggableElementTypes/models/BaseTrackModel.js +0 -58
- package/pluggableElementTypes/models/BaseViewModel.d.ts +2 -42
- package/pluggableElementTypes/models/BaseViewModel.js +2 -38
- package/pluggableElementTypes/models/InternetAccountModel.d.ts +3 -119
- package/pluggableElementTypes/models/InternetAccountModel.js +3 -123
- package/pluggableElementTypes/models/baseConnectionConfig.d.ts +0 -6
- package/pluggableElementTypes/models/baseConnectionConfig.js +1 -13
- package/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +0 -15
- package/pluggableElementTypes/models/baseInternetAccountConfig.js +1 -23
- package/pluggableElementTypes/models/baseTrackConfig.d.ts +2 -53
- package/pluggableElementTypes/models/baseTrackConfig.js +1 -58
- package/pluggableElementTypes/renderers/BoxRendererType.d.ts +7 -15
- package/pluggableElementTypes/renderers/BoxRendererType.js +3 -14
- package/pluggableElementTypes/renderers/CircularChordRendererType.d.ts +3 -2
- package/pluggableElementTypes/renderers/CircularChordRendererType.js +1 -6
- package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.d.ts +6 -21
- package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.js +2 -25
- package/pluggableElementTypes/renderers/FeatureRendererType.d.ts +5 -47
- package/pluggableElementTypes/renderers/FeatureRendererType.js +15 -68
- package/pluggableElementTypes/renderers/RendererType.d.ts +4 -8
- package/pluggableElementTypes/renderers/RendererType.js +1 -5
- package/pluggableElementTypes/renderers/RpcRenderedSvgGroup.d.ts +2 -2
- package/pluggableElementTypes/renderers/RpcRenderedSvgGroup.js +3 -12
- package/pluggableElementTypes/renderers/ServerSideRenderedContent.d.ts +1 -1
- package/pluggableElementTypes/renderers/ServerSideRenderedContent.js +6 -14
- package/pluggableElementTypes/renderers/ServerSideRendererType.d.ts +9 -49
- package/pluggableElementTypes/renderers/ServerSideRendererType.js +7 -57
- package/pluggableElementTypes/renderers/index.d.ts +1 -1
- package/pluggableElementTypes/renderers/util/serializableFilterChain.js +1 -3
- package/rpc/BaseRpcDriver.d.ts +3 -4
- package/rpc/BaseRpcDriver.js +20 -80
- package/rpc/MainThreadRpcDriver.d.ts +3 -7
- package/rpc/MainThreadRpcDriver.js +0 -5
- package/rpc/RpcManager.d.ts +3 -3
- package/rpc/RpcManager.js +2 -4
- package/rpc/WebWorkerRpcDriver.d.ts +3 -2
- package/rpc/WebWorkerRpcDriver.js +2 -13
- package/rpc/baseRpcConfig.d.ts +0 -3
- package/rpc/baseRpcConfig.js +1 -7
- package/rpc/configSchema.d.ts +0 -6
- package/rpc/configSchema.js +2 -11
- package/rpc/mainThreadRpcConfig.js +1 -7
- package/rpc/methods/CoreFreeResources.d.ts +0 -6
- package/rpc/methods/CoreFreeResources.js +2 -9
- package/rpc/methods/CoreGetFeatureDensityStats.d.ts +4 -5
- package/rpc/methods/CoreGetFeatureDensityStats.js +1 -1
- package/rpc/methods/CoreGetFeatureDetails.d.ts +2 -7
- package/rpc/methods/CoreGetFeatureDetails.js +0 -5
- package/rpc/methods/CoreGetFeatures.d.ts +5 -5
- package/rpc/methods/CoreGetFeatures.js +4 -5
- package/rpc/methods/CoreGetFileInfo.d.ts +1 -2
- package/rpc/methods/CoreGetFileInfo.js +1 -1
- package/rpc/methods/CoreGetMetadata.d.ts +1 -2
- package/rpc/methods/CoreGetMetadata.js +1 -1
- package/rpc/methods/CoreGetRefNames.d.ts +1 -2
- package/rpc/methods/CoreGetRefNames.js +1 -1
- package/rpc/methods/CoreRender.d.ts +2 -6
- package/rpc/methods/CoreRender.js +5 -7
- package/rpc/methods/util.d.ts +3 -3
- package/rpc/methods/util.js +0 -1
- package/rpc/webWorkerRpcConfig.js +1 -7
- package/stories/JBrowseCore.stories.d.ts +1 -1
- package/stories/JBrowseCore.stories.js +3 -3
- package/stories/examples/WithSequencePanel.d.ts +1 -1
- package/stories/examples/WithSequencePanel.js +3 -3
- package/tsconfig.build.tsbuildinfo +1 -1
- package/ui/AppLogo.d.ts +1 -1
- package/ui/AppLogo.js +0 -2
- package/ui/AssemblySelector.d.ts +2 -2
- package/ui/AssemblySelector.js +0 -3
- package/ui/BaseTooltip.js +2 -6
- package/ui/CascadingMenu.d.ts +2 -2
- package/ui/CascadingMenu.js +3 -4
- package/ui/CascadingMenuButton.d.ts +1 -1
- package/ui/CascadingMenuButton.js +1 -1
- package/ui/ColorPicker.js +1 -7
- package/ui/Dialog.d.ts +1 -1
- package/ui/Dialog.js +2 -6
- package/ui/DropDownMenu.d.ts +1 -1
- package/ui/DropDownMenu.js +2 -2
- package/ui/EditableTypography.d.ts +1 -1
- package/ui/EditableTypography.js +1 -5
- package/ui/ErrorBoundary.d.ts +2 -1
- package/ui/ErrorMessage.js +2 -9
- package/ui/ErrorMessageStackTraceDialog.js +2 -10
- package/ui/FactoryResetDialog.js +1 -1
- package/ui/FatalErrorDialog.js +1 -1
- package/ui/FileSelector/FileSelector.d.ts +4 -3
- package/ui/FileSelector/FileSelector.js +40 -40
- package/ui/FileSelector/LocalFileChooser.d.ts +1 -1
- package/ui/FileSelector/LocalFileChooser.js +0 -1
- package/ui/FileSelector/UrlChooser.d.ts +4 -3
- package/ui/FileSelector/UrlChooser.js +5 -3
- package/ui/Icons.d.ts +1 -1
- package/ui/Icons.js +1 -7
- package/ui/LoadingEllipses.d.ts +1 -1
- package/ui/LoadingEllipses.js +3 -3
- package/ui/Menu.d.ts +1 -1
- package/ui/Menu.js +3 -10
- package/ui/MenuButton.d.ts +1 -1
- package/ui/ResizeHandle.js +2 -2
- package/ui/ReturnToImportFormDialog.js +1 -1
- package/ui/SanitizedHTML.js +1 -21
- package/ui/Snackbar.d.ts +2 -2
- package/ui/Snackbar.js +1 -2
- package/ui/SnackbarModel.d.ts +1 -26
- package/ui/SnackbarModel.js +2 -30
- package/ui/colors.d.ts +1 -1
- package/ui/colors.js +1 -1
- package/ui/react-colorful.js +0 -3
- package/ui/theme.d.ts +1 -1
- package/ui/theme.js +0 -40
- package/util/Base1DUtils.d.ts +1 -1
- package/util/Base1DUtils.js +0 -12
- package/util/Base1DViewModel.d.ts +4 -81
- package/util/Base1DViewModel.js +4 -108
- package/util/QuickLRU.js +0 -9
- package/util/TimeTraveller.js +0 -4
- package/util/aborting.d.ts +0 -20
- package/util/aborting.js +0 -31
- package/util/analytics.js +1 -12
- package/util/blockTypes.d.ts +0 -11
- package/util/blockTypes.js +0 -13
- package/util/calculateDynamicBlocks.d.ts +1 -20
- package/util/calculateDynamicBlocks.js +1 -22
- package/util/calculateStaticBlocks.d.ts +2 -2
- package/util/calculateStaticBlocks.js +0 -2
- package/util/color/cssColorsLevel4.js +0 -1
- package/util/color/index.d.ts +0 -19
- package/util/color/index.js +0 -30
- package/util/compositeMap.js +0 -2
- package/util/dedupe.js +0 -1
- package/util/formatFastaStrings.d.ts +0 -13
- package/util/formatFastaStrings.js +0 -13
- package/util/idMaker.d.ts +1 -1
- package/util/idMaker.js +16 -12
- package/util/index.d.ts +16 -164
- package/util/index.js +22 -282
- package/util/io/RemoteFileWithRangeCache.d.ts +3 -2
- package/util/io/RemoteFileWithRangeCache.js +6 -10
- package/util/io/index.d.ts +3 -4
- package/util/io/index.js +3 -17
- package/util/jexl.js +3 -13
- package/util/jexlStrings.d.ts +0 -6
- package/util/jexlStrings.js +0 -8
- package/util/layouts/BaseLayout.d.ts +1 -1
- package/util/layouts/GranularRectLayout.d.ts +1 -17
- package/util/layouts/GranularRectLayout.js +4 -81
- package/util/layouts/MultiLayout.d.ts +1 -6
- package/util/layouts/MultiLayout.js +0 -6
- package/util/layouts/PrecomputedLayout.d.ts +1 -4
- package/util/layouts/PrecomputedLayout.js +0 -5
- package/util/layouts/PrecomputedMultiLayout.js +0 -2
- package/util/layouts/SceneGraph.d.ts +0 -12
- package/util/layouts/SceneGraph.js +0 -13
- package/util/makeAbortableReaction.d.ts +2 -0
- package/util/makeAbortableReaction.js +50 -0
- package/util/map-obj.js +0 -4
- package/util/mst-reflection.d.ts +1 -14
- package/util/mst-reflection.js +1 -28
- package/util/nanoid.js +0 -31
- package/util/nextTick.d.ts +1 -0
- package/util/nextTick.js +6 -0
- package/util/offscreenCanvasPonyfill.d.ts +0 -1
- package/util/offscreenCanvasPonyfill.js +1 -9
- package/util/offscreenCanvasUtils.js +1 -8
- package/util/range.d.ts +0 -25
- package/util/range.js +0 -34
- package/util/rxjs.d.ts +3 -7
- package/util/rxjs.js +2 -9
- package/util/simpleFeature.d.ts +0 -50
- package/util/simpleFeature.js +0 -35
- package/util/stats.d.ts +3 -26
- package/util/stats.js +0 -25
- package/util/stopToken.d.ts +3 -0
- package/util/stopToken.js +29 -0
- package/util/tracks.d.ts +3 -25
- package/util/tracks.js +0 -30
- package/util/types/index.d.ts +14 -30
- package/util/types/index.js +5 -14
- package/util/types/mst.js +0 -9
- package/util/types/util.d.ts +2 -9
- package/util/useMeasure.js +0 -1
- package/util/when.d.ts +1 -15
- package/util/when.js +3 -70
- package/rpc/remoteAbortSignals.d.ts +0 -36
- package/rpc/remoteAbortSignals.js +0 -79
|
@@ -24,18 +24,15 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
const react_1 = __importStar(require("react"));
|
|
27
|
-
const mobx_react_1 = require("mobx-react");
|
|
28
|
-
// locals
|
|
29
|
-
const util_1 = require("../../util");
|
|
30
27
|
const material_1 = require("@mui/material");
|
|
31
|
-
const
|
|
28
|
+
const mobx_react_1 = require("mobx-react");
|
|
32
29
|
const mobx_state_tree_1 = require("mobx-state-tree");
|
|
33
|
-
// eslint-disable-next-line react/no-deprecated
|
|
34
30
|
const react_dom_1 = require("react-dom");
|
|
31
|
+
const ui_1 = require("../../ui");
|
|
32
|
+
const util_1 = require("../../util");
|
|
35
33
|
const NewHydrate = (0, mobx_react_1.observer)(function RpcRenderedSvgGroup(props) {
|
|
36
34
|
const { html, theme, RenderingComponent, ...rest } = props;
|
|
37
35
|
const ref = (0, react_1.useRef)(null);
|
|
38
|
-
// this `any` is a react-dom/client::Root
|
|
39
36
|
const rootRef = (0, react_1.useRef)();
|
|
40
37
|
const root = (0, mobx_state_tree_1.getRoot)(props.displayModel);
|
|
41
38
|
const hydrateRoot = root.hydrateFn;
|
|
@@ -60,7 +57,6 @@ const NewHydrate = (0, mobx_react_1.observer)(function RpcRenderedSvgGroup(props
|
|
|
60
57
|
root === null || root === void 0 ? void 0 : root.unmount();
|
|
61
58
|
});
|
|
62
59
|
};
|
|
63
|
-
// biome-ignore lint/correctness/useExhaustiveDependencies:
|
|
64
60
|
}, [RenderingComponent, hydrateRoot, theme, rest]);
|
|
65
61
|
return react_1.default.createElement("g", { ref: ref, dangerouslySetInnerHTML: { __html: html } });
|
|
66
62
|
});
|
|
@@ -74,13 +70,8 @@ const OldHydrate = (0, mobx_react_1.observer)(function OldHydrate(props) {
|
|
|
74
70
|
if (domNode.innerHTML) {
|
|
75
71
|
(0, react_dom_1.unmountComponentAtNode)(domNode);
|
|
76
72
|
}
|
|
77
|
-
// setting outline:none fixes react "focusable" element issue. see
|
|
78
|
-
// https://github.com/GMOD/jbrowse-components/issues/2160
|
|
79
73
|
domNode.style.outline = 'none';
|
|
80
74
|
domNode.innerHTML = html;
|
|
81
|
-
// use requestIdleCallback to defer main-thread rendering and
|
|
82
|
-
// hydration for when we have some free time. helps keep the
|
|
83
|
-
// framerate up.
|
|
84
75
|
(0, util_1.rIC)(() => {
|
|
85
76
|
(0, react_dom_1.hydrate)(react_1.default.createElement(RenderingComponent, { ...props }), domNode);
|
|
86
77
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import type { RenderArgs, ResultsSerialized } from './ServerSideRendererType';
|
|
3
3
|
interface Props extends ResultsSerialized, RenderArgs {
|
|
4
4
|
RenderingComponent: React.ComponentType<any>;
|
|
5
5
|
}
|
|
@@ -25,31 +25,25 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
const react_1 = __importStar(require("react"));
|
|
27
27
|
const styles_1 = require("@mui/material/styles");
|
|
28
|
-
// locals
|
|
29
|
-
const ui_1 = require("../../ui");
|
|
30
28
|
const mobx_react_1 = require("mobx-react");
|
|
31
29
|
const mobx_state_tree_1 = require("mobx-state-tree");
|
|
32
|
-
// eslint-disable-next-line react/no-deprecated
|
|
33
30
|
const react_dom_1 = require("react-dom");
|
|
31
|
+
const ui_1 = require("../../ui");
|
|
34
32
|
const util_1 = require("../../util");
|
|
35
33
|
const NewHydrate = (0, mobx_react_1.observer)(function ServerSideRenderedContent({ theme, html, RenderingComponent, ...rest }) {
|
|
36
34
|
const ref = (0, react_1.useRef)(null);
|
|
37
35
|
const rootRef = (0, react_1.useRef)();
|
|
38
36
|
const { hydrateFn } = (0, mobx_state_tree_1.getRoot)(rest.displayModel);
|
|
39
37
|
(0, react_1.useEffect)(() => {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
38
|
+
if (ref.current) {
|
|
39
|
+
ref.current.innerHTML = html;
|
|
40
|
+
}
|
|
43
41
|
const renderTimeout = (0, util_1.rIC)(() => {
|
|
44
42
|
var _a;
|
|
45
43
|
if (!ref.current) {
|
|
46
44
|
return;
|
|
47
45
|
}
|
|
48
46
|
const jbrowseTheme = (0, ui_1.createJBrowseTheme)(theme);
|
|
49
|
-
// if there is a hydration mismatch, investigate value of
|
|
50
|
-
// - value of ref.current.innerHTML
|
|
51
|
-
// - value of `html` variable
|
|
52
|
-
// - renderToString of the below React element
|
|
53
47
|
rootRef.current =
|
|
54
48
|
(_a = rootRef.current) !== null && _a !== void 0 ? _a : hydrateFn(ref.current, react_1.default.createElement(styles_1.ThemeProvider, { theme: jbrowseTheme },
|
|
55
49
|
react_1.default.createElement(RenderingComponent, { ...rest })));
|
|
@@ -64,9 +58,8 @@ const NewHydrate = (0, mobx_react_1.observer)(function ServerSideRenderedContent
|
|
|
64
58
|
root === null || root === void 0 ? void 0 : root.unmount();
|
|
65
59
|
});
|
|
66
60
|
};
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
return (react_1.default.createElement("div", { "data-testid": "hydrationContainer", ref: ref, dangerouslySetInnerHTML: { __html: html } }));
|
|
61
|
+
}, [theme, rest, html, hydrateFn, RenderingComponent]);
|
|
62
|
+
return react_1.default.createElement("div", { "data-testid": "hydrationContainer", ref: ref });
|
|
70
63
|
});
|
|
71
64
|
const OldHydrate = (0, mobx_react_1.observer)(function ({ theme, html, RenderingComponent, ...rest }) {
|
|
72
65
|
const ref = (0, react_1.useRef)(null);
|
|
@@ -89,7 +82,6 @@ const OldHydrate = (0, mobx_react_1.observer)(function ({ theme, html, Rendering
|
|
|
89
82
|
(0, react_dom_1.unmountComponentAtNode)(domNode);
|
|
90
83
|
}
|
|
91
84
|
};
|
|
92
|
-
/* biome-ignore lint/correctness/useExhaustiveDependencies: */
|
|
93
85
|
}, [html, jbrowseTheme, rest, RenderingComponent]);
|
|
94
86
|
return react_1.default.createElement("div", { ref: ref });
|
|
95
87
|
});
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import { AnyConfigurationModel } from '../../configuration';
|
|
5
|
-
import
|
|
6
|
-
import
|
|
1
|
+
import RendererType from './RendererType';
|
|
2
|
+
import SerializableFilterChain from './util/serializableFilterChain';
|
|
3
|
+
import type { RenderProps, RenderResults } from './RendererType';
|
|
4
|
+
import type { AnyConfigurationModel } from '../../configuration';
|
|
5
|
+
import type { SerializedFilterChain } from './util/serializableFilterChain';
|
|
6
|
+
import type RpcManager from '../../rpc/RpcManager';
|
|
7
|
+
import type { ThemeOptions } from '@mui/material';
|
|
8
|
+
import type { SnapshotIn, SnapshotOrInstance } from 'mobx-state-tree';
|
|
7
9
|
interface BaseRenderArgs extends RenderProps {
|
|
8
10
|
sessionId: string;
|
|
9
|
-
|
|
11
|
+
stopToken?: string;
|
|
10
12
|
theme: ThemeOptions;
|
|
11
13
|
exportSVG?: {
|
|
12
14
|
rasterizeLayers?: boolean;
|
|
@@ -36,53 +38,11 @@ export interface ResultsSerializedSvgExport extends ResultsSerialized {
|
|
|
36
38
|
}
|
|
37
39
|
export type ResultsDeserialized = RenderResults;
|
|
38
40
|
export default class ServerSideRenderer extends RendererType {
|
|
39
|
-
/**
|
|
40
|
-
* directly modifies the render arguments to prepare them to be serialized and
|
|
41
|
-
* sent to the worker.
|
|
42
|
-
*
|
|
43
|
-
* @param args - the arguments passed to render
|
|
44
|
-
* @returns the same object
|
|
45
|
-
*/
|
|
46
41
|
serializeArgsInClient(args: RenderArgs): RenderArgsSerialized;
|
|
47
|
-
/**
|
|
48
|
-
* Deserialize the render results from the worker in the client. Includes
|
|
49
|
-
* hydrating of the React HTML string, and not hydrating the result if SVG is
|
|
50
|
-
* being rendered
|
|
51
|
-
*
|
|
52
|
-
* @param results - the results of the render
|
|
53
|
-
* @param args - the arguments passed to render
|
|
54
|
-
*/
|
|
55
42
|
deserializeResultsInClient(res: ResultsSerialized, args: RenderArgs): ResultsDeserialized;
|
|
56
|
-
/**
|
|
57
|
-
* modifies the passed arguments object to inflate arguments as necessary.
|
|
58
|
-
* called in the worker process.
|
|
59
|
-
*
|
|
60
|
-
* @param args - the converted arguments to modify
|
|
61
|
-
*/
|
|
62
43
|
deserializeArgsInWorker(args: RenderArgsSerialized): RenderArgsDeserialized;
|
|
63
|
-
/**
|
|
64
|
-
* Serialize results of the render to send them to the client. Includes
|
|
65
|
-
* rendering React to an HTML string.
|
|
66
|
-
*
|
|
67
|
-
* @param results - object containing the results of calling the `render`
|
|
68
|
-
* method
|
|
69
|
-
* @param args - deserialized render args
|
|
70
|
-
*/
|
|
71
44
|
serializeResultsInWorker(results: RenderResults, args: RenderArgsDeserialized): ResultsSerialized;
|
|
72
|
-
/**
|
|
73
|
-
* Render method called on the client. Serializes args, then calls
|
|
74
|
-
* "CoreRender" with the RPC manager.
|
|
75
|
-
*
|
|
76
|
-
* @param rpcManager - RPC manager
|
|
77
|
-
* @param args - render args
|
|
78
|
-
*/
|
|
79
45
|
renderInClient(rpcManager: RpcManager, args: RenderArgs): Promise<ResultsSerialized>;
|
|
80
|
-
/**
|
|
81
|
-
* Render method called on the worker. `render` is called here in server-side
|
|
82
|
-
* rendering
|
|
83
|
-
*
|
|
84
|
-
* @param args - serialized render args
|
|
85
|
-
*/
|
|
86
46
|
renderInWorker(args: RenderArgsSerialized): Promise<ResultsSerialized>;
|
|
87
47
|
freeResourcesInClient(rpcManager: RpcManager, args: RenderArgs): Promise<number>;
|
|
88
48
|
}
|
|
@@ -5,25 +5,18 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const react_1 = __importDefault(require("react"));
|
|
7
7
|
const styles_1 = require("@mui/material/styles");
|
|
8
|
-
const server_1 = require("react-dom/server");
|
|
9
8
|
const mobx_state_tree_1 = require("mobx-state-tree");
|
|
10
|
-
|
|
11
|
-
const util_1 = require("../../util");
|
|
12
|
-
const serializableFilterChain_1 = __importDefault(require("./util/serializableFilterChain"));
|
|
13
|
-
const ui_1 = require("../../ui");
|
|
9
|
+
const server_1 = require("react-dom/server");
|
|
14
10
|
const RendererType_1 = __importDefault(require("./RendererType"));
|
|
15
11
|
const ServerSideRenderedContent_1 = __importDefault(require("./ServerSideRenderedContent"));
|
|
12
|
+
const ui_1 = require("../../ui");
|
|
13
|
+
const serializableFilterChain_1 = __importDefault(require("./util/serializableFilterChain"));
|
|
14
|
+
const util_1 = require("../../util");
|
|
15
|
+
const stopToken_1 = require("../../util/stopToken");
|
|
16
16
|
function isSvgExport(e) {
|
|
17
17
|
return 'canvasRecordedData' in e;
|
|
18
18
|
}
|
|
19
19
|
class ServerSideRenderer extends RendererType_1.default {
|
|
20
|
-
/**
|
|
21
|
-
* directly modifies the render arguments to prepare them to be serialized and
|
|
22
|
-
* sent to the worker.
|
|
23
|
-
*
|
|
24
|
-
* @param args - the arguments passed to render
|
|
25
|
-
* @returns the same object
|
|
26
|
-
*/
|
|
27
20
|
serializeArgsInClient(args) {
|
|
28
21
|
var _a;
|
|
29
22
|
return {
|
|
@@ -34,20 +27,8 @@ class ServerSideRenderer extends RendererType_1.default {
|
|
|
34
27
|
filters: (_a = args.filters) === null || _a === void 0 ? void 0 : _a.toJSON().filters,
|
|
35
28
|
};
|
|
36
29
|
}
|
|
37
|
-
/**
|
|
38
|
-
* Deserialize the render results from the worker in the client. Includes
|
|
39
|
-
* hydrating of the React HTML string, and not hydrating the result if SVG is
|
|
40
|
-
* being rendered
|
|
41
|
-
*
|
|
42
|
-
* @param results - the results of the render
|
|
43
|
-
* @param args - the arguments passed to render
|
|
44
|
-
*/
|
|
45
30
|
deserializeResultsInClient(res, args) {
|
|
46
|
-
// if we are rendering svg, we skip hydration
|
|
47
31
|
if (args.exportSVG) {
|
|
48
|
-
// only return the res if the renderer explicitly has
|
|
49
|
-
// this.supportsSVG support to avoid garbage being rendered in SVG
|
|
50
|
-
// document
|
|
51
32
|
return {
|
|
52
33
|
...res,
|
|
53
34
|
html: this.supportsSVG
|
|
@@ -55,18 +36,11 @@ class ServerSideRenderer extends RendererType_1.default {
|
|
|
55
36
|
: '<text y="12" fill="black">SVG export not supported for this track</text>',
|
|
56
37
|
};
|
|
57
38
|
}
|
|
58
|
-
// get res using ServerSideRenderedContent
|
|
59
39
|
return {
|
|
60
40
|
...res,
|
|
61
41
|
reactElement: (react_1.default.createElement(ServerSideRenderedContent_1.default, { ...args, ...res, RenderingComponent: this.ReactComponent })),
|
|
62
42
|
};
|
|
63
43
|
}
|
|
64
|
-
/**
|
|
65
|
-
* modifies the passed arguments object to inflate arguments as necessary.
|
|
66
|
-
* called in the worker process.
|
|
67
|
-
*
|
|
68
|
-
* @param args - the converted arguments to modify
|
|
69
|
-
*/
|
|
70
44
|
deserializeArgsInWorker(args) {
|
|
71
45
|
const deserialized = { ...args };
|
|
72
46
|
deserialized.config = this.configSchema.create(args.config || {}, {
|
|
@@ -79,26 +53,11 @@ class ServerSideRenderer extends RendererType_1.default {
|
|
|
79
53
|
: undefined;
|
|
80
54
|
return deserialized;
|
|
81
55
|
}
|
|
82
|
-
/**
|
|
83
|
-
* Serialize results of the render to send them to the client. Includes
|
|
84
|
-
* rendering React to an HTML string.
|
|
85
|
-
*
|
|
86
|
-
* @param results - object containing the results of calling the `render`
|
|
87
|
-
* method
|
|
88
|
-
* @param args - deserialized render args
|
|
89
|
-
*/
|
|
90
56
|
serializeResultsInWorker(results, args) {
|
|
91
57
|
const html = (0, server_1.renderToString)(react_1.default.createElement(styles_1.ThemeProvider, { theme: (0, ui_1.createJBrowseTheme)(args.theme) }, results.reactElement));
|
|
92
58
|
results.reactElement = undefined;
|
|
93
59
|
return { ...results, html };
|
|
94
60
|
}
|
|
95
|
-
/**
|
|
96
|
-
* Render method called on the client. Serializes args, then calls
|
|
97
|
-
* "CoreRender" with the RPC manager.
|
|
98
|
-
*
|
|
99
|
-
* @param rpcManager - RPC manager
|
|
100
|
-
* @param args - render args
|
|
101
|
-
*/
|
|
102
61
|
async renderInClient(rpcManager, args) {
|
|
103
62
|
const results = (await rpcManager.call(args.sessionId, 'CoreRender', args));
|
|
104
63
|
if (isSvgExport(results)) {
|
|
@@ -107,20 +66,11 @@ class ServerSideRenderer extends RendererType_1.default {
|
|
|
107
66
|
}
|
|
108
67
|
return results;
|
|
109
68
|
}
|
|
110
|
-
/**
|
|
111
|
-
* Render method called on the worker. `render` is called here in server-side
|
|
112
|
-
* rendering
|
|
113
|
-
*
|
|
114
|
-
* @param args - serialized render args
|
|
115
|
-
*/
|
|
116
69
|
async renderInWorker(args) {
|
|
117
|
-
const {
|
|
70
|
+
const { stopToken, statusCallback = () => { } } = args;
|
|
118
71
|
const deserializedArgs = this.deserializeArgsInWorker(args);
|
|
119
72
|
const results = await (0, util_1.updateStatus)('Rendering plot', statusCallback, () => this.render(deserializedArgs));
|
|
120
|
-
(0,
|
|
121
|
-
// serialize the results for passing back to the main thread.
|
|
122
|
-
// these will be transmitted to the main process, and will come out
|
|
123
|
-
// as the result of renderRegionWithWorker.
|
|
73
|
+
(0, stopToken_1.checkStopToken)(stopToken);
|
|
124
74
|
return (0, util_1.updateStatus)('Serializing results', statusCallback, () => this.serializeResultsInWorker(results, deserializedArgs));
|
|
125
75
|
}
|
|
126
76
|
async freeResourcesInClient(rpcManager, args) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { default as BoxRendererType } from './BoxRendererType';
|
|
2
2
|
export { default as ComparativeServerSideRendererType } from './ComparativeServerSideRendererType';
|
|
3
3
|
export { default as CircularChordRendererType } from './CircularChordRendererType';
|
|
4
|
-
export { default as RendererType
|
|
4
|
+
export { type RenderProps, default as RendererType } from './RendererType';
|
|
5
5
|
export { default as FeatureRendererType } from './FeatureRendererType';
|
|
6
6
|
export { default as ServerSideRenderedContent } from './ServerSideRenderedContent';
|
|
7
7
|
export { default as ServerSideRendererType } from './ServerSideRendererType';
|
|
@@ -16,9 +16,7 @@ class SerializableFilterChain {
|
|
|
16
16
|
}
|
|
17
17
|
passes(...args) {
|
|
18
18
|
for (const entry of this.filterChain) {
|
|
19
|
-
if (
|
|
20
|
-
// @ts-expect-error
|
|
21
|
-
!entry.expr.evalSync({ feature: args[0] })) {
|
|
19
|
+
if (!entry.expr.evalSync({ feature: args[0] })) {
|
|
22
20
|
return false;
|
|
23
21
|
}
|
|
24
22
|
}
|
package/rpc/BaseRpcDriver.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import PluginManager from '../PluginManager';
|
|
2
|
-
import { AnyConfigurationModel } from '../configuration';
|
|
1
|
+
import type PluginManager from '../PluginManager';
|
|
2
|
+
import type { AnyConfigurationModel } from '../configuration';
|
|
3
3
|
export interface WorkerHandle {
|
|
4
4
|
status?: string;
|
|
5
5
|
error?: unknown;
|
|
@@ -15,7 +15,6 @@ export interface WorkerHandle {
|
|
|
15
15
|
export interface RpcDriverConstructorArgs {
|
|
16
16
|
config: AnyConfigurationModel;
|
|
17
17
|
}
|
|
18
|
-
export declare function watchWorker(worker: WorkerHandle, pingTime: number, rpcDriverClassName: string): Promise<void>;
|
|
19
18
|
declare class LazyWorker {
|
|
20
19
|
driver: BaseRpcDriver;
|
|
21
20
|
workerP?: Promise<WorkerHandle> | undefined;
|
|
@@ -33,7 +32,7 @@ export default abstract class BaseRpcDriver {
|
|
|
33
32
|
config: AnyConfigurationModel;
|
|
34
33
|
constructor(args: RpcDriverConstructorArgs);
|
|
35
34
|
filterArgs<THING_TYPE>(thing: THING_TYPE, sessionId: string): THING_TYPE;
|
|
36
|
-
remoteAbort(sessionId: string, functionName: string,
|
|
35
|
+
remoteAbort(sessionId: string, functionName: string, stopTokenId: number): Promise<void>;
|
|
37
36
|
createWorkerPool(): LazyWorker[];
|
|
38
37
|
getWorkerPool(): LazyWorker[];
|
|
39
38
|
getWorker(sessionId: string): Promise<WorkerHandle>;
|
package/rpc/BaseRpcDriver.js
CHANGED
|
@@ -1,33 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.watchWorker = watchWorker;
|
|
4
3
|
const mobx_state_tree_1 = require("mobx-state-tree");
|
|
5
|
-
const util_1 = require("../util");
|
|
6
|
-
const remoteAbortSignals_1 = require("./remoteAbortSignals");
|
|
7
4
|
const configuration_1 = require("../configuration");
|
|
5
|
+
const util_1 = require("../util");
|
|
8
6
|
function isCloneable(thing) {
|
|
9
7
|
return !(typeof thing === 'function') && !(thing instanceof Error);
|
|
10
8
|
}
|
|
11
|
-
// watches the given worker object, returns a promise that will be rejected if
|
|
12
|
-
// the worker times out
|
|
13
|
-
async function watchWorker(worker, pingTime, rpcDriverClassName) {
|
|
14
|
-
// after first ping succeeds, apply wait for timeout
|
|
15
|
-
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
16
|
-
while (true) {
|
|
17
|
-
await worker.call('ping', [], {
|
|
18
|
-
timeout: pingTime * 2,
|
|
19
|
-
rpcDriverClassName,
|
|
20
|
-
});
|
|
21
|
-
await new Promise(resolve => setTimeout(resolve, pingTime));
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
9
|
function detectHardwareConcurrency() {
|
|
25
10
|
const mainThread = typeof window !== 'undefined';
|
|
26
11
|
const canDetect = mainThread && 'hardwareConcurrency' in window.navigator;
|
|
27
|
-
|
|
28
|
-
return window.navigator.hardwareConcurrency;
|
|
29
|
-
}
|
|
30
|
-
return 1;
|
|
12
|
+
return mainThread && canDetect ? window.navigator.hardwareConcurrency : 1;
|
|
31
13
|
}
|
|
32
14
|
class LazyWorker {
|
|
33
15
|
constructor(driver) {
|
|
@@ -35,20 +17,7 @@ class LazyWorker {
|
|
|
35
17
|
}
|
|
36
18
|
async getWorker() {
|
|
37
19
|
if (!this.workerP) {
|
|
38
|
-
this.workerP = this.driver
|
|
39
|
-
.makeWorker()
|
|
40
|
-
.then(worker => {
|
|
41
|
-
watchWorker(worker, this.driver.maxPingTime, this.driver.name).catch((error) => {
|
|
42
|
-
console.error('worker did not respond, killing and generating new one');
|
|
43
|
-
console.error(error);
|
|
44
|
-
worker.destroy();
|
|
45
|
-
worker.status = 'killed';
|
|
46
|
-
worker.error = error;
|
|
47
|
-
this.workerP = undefined;
|
|
48
|
-
});
|
|
49
|
-
return worker;
|
|
50
|
-
})
|
|
51
|
-
.catch((e) => {
|
|
20
|
+
this.workerP = this.driver.makeWorker().catch((e) => {
|
|
52
21
|
this.workerP = undefined;
|
|
53
22
|
throw e;
|
|
54
23
|
});
|
|
@@ -59,40 +28,37 @@ class LazyWorker {
|
|
|
59
28
|
class BaseRpcDriver {
|
|
60
29
|
constructor(args) {
|
|
61
30
|
this.lastWorkerAssignment = -1;
|
|
62
|
-
this.workerAssignments = new Map();
|
|
31
|
+
this.workerAssignments = new Map();
|
|
63
32
|
this.maxPingTime = 30000;
|
|
64
33
|
this.workerCheckFrequency = 5000;
|
|
65
34
|
this.config = args.config;
|
|
66
35
|
}
|
|
67
|
-
// filter the given object and just remove any non-cloneable things from it
|
|
68
36
|
filterArgs(thing, sessionId) {
|
|
69
37
|
if (Array.isArray(thing)) {
|
|
70
38
|
return thing
|
|
71
39
|
.filter(thing => isCloneable(thing))
|
|
72
40
|
.map(t => this.filterArgs(t, sessionId));
|
|
73
41
|
}
|
|
74
|
-
if (typeof thing === 'object' && thing !== null) {
|
|
75
|
-
// AbortSignals are specially handled
|
|
76
|
-
if (thing instanceof AbortSignal) {
|
|
77
|
-
return (0, remoteAbortSignals_1.serializeAbortSignal)(thing, this.remoteAbort.bind(this, sessionId));
|
|
78
|
-
}
|
|
42
|
+
else if (typeof thing === 'object' && thing !== null) {
|
|
79
43
|
if ((0, mobx_state_tree_1.isStateTreeNode)(thing) && !(0, mobx_state_tree_1.isAlive)(thing)) {
|
|
80
44
|
throw new Error('dead state tree node passed to RPC call');
|
|
81
45
|
}
|
|
82
|
-
|
|
83
|
-
// object entries below would
|
|
84
|
-
if (thing instanceof File) {
|
|
46
|
+
else if (thing instanceof File) {
|
|
85
47
|
return thing;
|
|
86
48
|
}
|
|
87
|
-
|
|
88
|
-
.
|
|
89
|
-
|
|
49
|
+
else {
|
|
50
|
+
return Object.fromEntries(Object.entries(thing)
|
|
51
|
+
.filter(e => isCloneable(e[1]))
|
|
52
|
+
.map(([k, v]) => [k, this.filterArgs(v, sessionId)]));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
return thing;
|
|
90
57
|
}
|
|
91
|
-
return thing;
|
|
92
58
|
}
|
|
93
|
-
async remoteAbort(sessionId, functionName,
|
|
59
|
+
async remoteAbort(sessionId, functionName, stopTokenId) {
|
|
94
60
|
const worker = await this.getWorker(sessionId);
|
|
95
|
-
await worker.call(functionName, {
|
|
61
|
+
await worker.call(functionName, { stopTokenId }, { timeout: 1000000, rpcDriverClassName: this.name });
|
|
96
62
|
}
|
|
97
63
|
createWorkerPool() {
|
|
98
64
|
const hardwareConcurrency = detectHardwareConcurrency();
|
|
@@ -108,7 +74,7 @@ class BaseRpcDriver {
|
|
|
108
74
|
if (!this.workerPool) {
|
|
109
75
|
const res = this.createWorkerPool();
|
|
110
76
|
this.workerPool = res;
|
|
111
|
-
return res;
|
|
77
|
+
return res;
|
|
112
78
|
}
|
|
113
79
|
return this.workerPool;
|
|
114
80
|
}
|
|
@@ -127,7 +93,6 @@ class BaseRpcDriver {
|
|
|
127
93
|
if (!sessionId) {
|
|
128
94
|
throw new TypeError('sessionId is required');
|
|
129
95
|
}
|
|
130
|
-
let done = false;
|
|
131
96
|
const unextendedWorker = await this.getWorker(sessionId);
|
|
132
97
|
const worker = pluginManager.evaluateExtensionPoint('Core-extendWorker', unextendedWorker);
|
|
133
98
|
const rpcMethod = pluginManager.getRpcMethodType(functionName);
|
|
@@ -136,38 +101,13 @@ class BaseRpcDriver {
|
|
|
136
101
|
}
|
|
137
102
|
const serializedArgs = await rpcMethod.serializeArguments(args, this.name);
|
|
138
103
|
const filteredAndSerializedArgs = this.filterArgs(serializedArgs, sessionId);
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
.call(functionName, filteredAndSerializedArgs, {
|
|
142
|
-
timeout: 5 * 60 * 1000, // 5 minutes
|
|
104
|
+
const call = await worker.call(functionName, filteredAndSerializedArgs, {
|
|
105
|
+
timeout: 5 * 60 * 1000,
|
|
143
106
|
statusCallback: args.statusCallback,
|
|
144
107
|
rpcDriverClassName: this.name,
|
|
145
108
|
...options,
|
|
146
|
-
})
|
|
147
|
-
.finally(() => {
|
|
148
|
-
done = true;
|
|
149
|
-
});
|
|
150
|
-
// check every 5 seconds to see if the worker has been killed, and
|
|
151
|
-
// reject the killedP promise if it has
|
|
152
|
-
let killedCheckInterval;
|
|
153
|
-
const killedP = new Promise((resolve, reject) => {
|
|
154
|
-
killedCheckInterval = setInterval(() => {
|
|
155
|
-
// must've been killed
|
|
156
|
-
if (worker.status === 'killed') {
|
|
157
|
-
reject(new Error(`operation timed out, worker process stopped responding, ${worker.error}`));
|
|
158
|
-
}
|
|
159
|
-
else if (done) {
|
|
160
|
-
resolve(true);
|
|
161
|
-
}
|
|
162
|
-
}, this.workerCheckFrequency);
|
|
163
|
-
}).finally(() => {
|
|
164
|
-
clearInterval(killedCheckInterval);
|
|
165
109
|
});
|
|
166
|
-
|
|
167
|
-
// promise. the killed promise will only actually win if the worker was
|
|
168
|
-
// killed before the call could return
|
|
169
|
-
const resultP = Promise.race([callP, killedP]);
|
|
170
|
-
return rpcMethod.deserializeReturn(resultP, args, this.name);
|
|
110
|
+
return rpcMethod.deserializeReturn(call, args, this.name);
|
|
171
111
|
}
|
|
172
112
|
}
|
|
173
113
|
exports.default = BaseRpcDriver;
|
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
import BaseRpcDriver
|
|
2
|
-
import
|
|
1
|
+
import BaseRpcDriver from './BaseRpcDriver';
|
|
2
|
+
import type { RpcDriverConstructorArgs } from './BaseRpcDriver';
|
|
3
|
+
import type PluginManager from '../PluginManager';
|
|
3
4
|
declare class DummyHandle {
|
|
4
5
|
destroy(): void;
|
|
5
6
|
call(_functionName: string, _filteredArgs?: Record<string, unknown>, _options?: {}): Promise<unknown>;
|
|
6
7
|
}
|
|
7
|
-
/**
|
|
8
|
-
* Stub RPC driver class that runs RPC functions in-band in the main thread.
|
|
9
|
-
*
|
|
10
|
-
* @param rpcFuncs - object containing runnable rpc functions
|
|
11
|
-
*/
|
|
12
8
|
export default class MainThreadRpcDriver extends BaseRpcDriver {
|
|
13
9
|
name: string;
|
|
14
10
|
makeWorker: () => Promise<DummyHandle>;
|
|
@@ -10,11 +10,6 @@ class DummyHandle {
|
|
|
10
10
|
return undefined;
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
|
-
/**
|
|
14
|
-
* Stub RPC driver class that runs RPC functions in-band in the main thread.
|
|
15
|
-
*
|
|
16
|
-
* @param rpcFuncs - object containing runnable rpc functions
|
|
17
|
-
*/
|
|
18
13
|
class MainThreadRpcDriver extends BaseRpcDriver_1.default {
|
|
19
14
|
constructor(args) {
|
|
20
15
|
super(args);
|
package/rpc/RpcManager.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import PluginManager from '../PluginManager';
|
|
2
|
-
import { AnyConfigurationModel } from '../configuration';
|
|
3
|
-
import WebWorkerRpcDriver from './WebWorkerRpcDriver';
|
|
4
1
|
import MainThreadRpcDriver from './MainThreadRpcDriver';
|
|
2
|
+
import WebWorkerRpcDriver from './WebWorkerRpcDriver';
|
|
3
|
+
import type PluginManager from '../PluginManager';
|
|
4
|
+
import type { AnyConfigurationModel } from '../configuration';
|
|
5
5
|
type DriverClass = WebWorkerRpcDriver | MainThreadRpcDriver;
|
|
6
6
|
interface BackendConfigurations {
|
|
7
7
|
WebWorkerRpcDriver?: Omit<ConstructorParameters<typeof WebWorkerRpcDriver>[0], 'config'>;
|
package/rpc/RpcManager.js
CHANGED
|
@@ -4,10 +4,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const configuration_1 = require("../configuration");
|
|
7
|
-
const configSchema_1 = __importDefault(require("./configSchema"));
|
|
8
|
-
const WebWorkerRpcDriver_1 = __importDefault(require("./WebWorkerRpcDriver"));
|
|
9
7
|
const MainThreadRpcDriver_1 = __importDefault(require("./MainThreadRpcDriver"));
|
|
10
|
-
|
|
8
|
+
const WebWorkerRpcDriver_1 = __importDefault(require("./WebWorkerRpcDriver"));
|
|
9
|
+
const configSchema_1 = __importDefault(require("./configSchema"));
|
|
11
10
|
const DriverClasses = {
|
|
12
11
|
WebWorkerRpcDriver: WebWorkerRpcDriver_1.default,
|
|
13
12
|
MainThreadRpcDriver: MainThreadRpcDriver_1.default,
|
|
@@ -37,7 +36,6 @@ class RpcManager {
|
|
|
37
36
|
this.driverObjects.set(backendName, newDriver);
|
|
38
37
|
return newDriver;
|
|
39
38
|
}
|
|
40
|
-
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
41
39
|
else if (backendName === 'WebWorkerRpcDriver') {
|
|
42
40
|
const backendConfiguration = this.backendConfigurations.WebWorkerRpcDriver;
|
|
43
41
|
if (!backendConfiguration) {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import Rpc from 'librpc-web-mod';
|
|
2
|
-
import BaseRpcDriver
|
|
3
|
-
import {
|
|
2
|
+
import BaseRpcDriver from './BaseRpcDriver';
|
|
3
|
+
import type { RpcDriverConstructorArgs } from './BaseRpcDriver';
|
|
4
|
+
import type { PluginDefinition } from '../PluginLoader';
|
|
4
5
|
interface WebWorkerRpcDriverConstructorArgs extends RpcDriverConstructorArgs {
|
|
5
6
|
makeWorkerInstance: () => Worker;
|
|
6
7
|
}
|
|
@@ -3,11 +3,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const serialize_error_1 = require("serialize-error");
|
|
7
6
|
const librpc_web_mod_1 = __importDefault(require("librpc-web-mod"));
|
|
8
|
-
|
|
9
|
-
const nanoid_1 = require("../util/nanoid");
|
|
7
|
+
const serialize_error_1 = require("serialize-error");
|
|
10
8
|
const BaseRpcDriver_1 = __importDefault(require("./BaseRpcDriver"));
|
|
9
|
+
const nanoid_1 = require("../util/nanoid");
|
|
11
10
|
class WebWorkerHandle extends librpc_web_mod_1.default.Client {
|
|
12
11
|
destroy() {
|
|
13
12
|
this.workers[0].terminate();
|
|
@@ -32,21 +31,12 @@ class WebWorkerRpcDriver extends BaseRpcDriver_1.default {
|
|
|
32
31
|
this.makeWorkerInstance = args.makeWorkerInstance;
|
|
33
32
|
}
|
|
34
33
|
async makeWorker() {
|
|
35
|
-
// note that we are making a Rpc.Client connection with a worker pool of
|
|
36
|
-
// one for each worker, because we want to do our own state-group-aware
|
|
37
|
-
// load balancing rather than using librpc's builtin round-robin
|
|
38
34
|
const instance = this.makeWorkerInstance();
|
|
39
|
-
// @ts-ignore this is used to avoid warning in jbrowse-web startup
|
|
40
|
-
// (because this file is referred to via src, declare.d.ts file is in
|
|
41
|
-
// e.g. products/jbrowse-web)
|
|
42
35
|
const worker = new WebWorkerHandle({ workers: [instance] });
|
|
43
36
|
const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
|
|
44
37
|
if (isSafari) {
|
|
45
|
-
// xref https://github.com/GMOD/jbrowse-components/issues/3245
|
|
46
|
-
// eslint-disable-next-line no-console
|
|
47
38
|
console.log('console logging the webworker handle avoids the track going into an infinite loading state, this is a hacky workaround for safari', instance);
|
|
48
39
|
}
|
|
49
|
-
// send the worker its boot configuration using info from the pluginManager
|
|
50
40
|
return new Promise((resolve, reject) => {
|
|
51
41
|
const listener = (e) => {
|
|
52
42
|
switch (e.data.message) {
|
|
@@ -66,7 +56,6 @@ class WebWorkerRpcDriver extends BaseRpcDriver_1.default {
|
|
|
66
56
|
reject((0, serialize_error_1.deserializeError)(e.data.error));
|
|
67
57
|
break;
|
|
68
58
|
}
|
|
69
|
-
// No default
|
|
70
59
|
}
|
|
71
60
|
};
|
|
72
61
|
worker.workers[0].addEventListener('message', listener);
|