@jbrowse/core 5.0.0-beta.1 → 5.0.0-beta.10
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/README.md +1476 -265
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +3 -5
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +34 -29
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +1 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +16 -9
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +15 -31
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +4 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +12 -25
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.js +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +8 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +24 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +6 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.d.ts +4 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.js +17 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +5 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +6 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +7 -18
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.d.ts +16 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.js +50 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +6 -29
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +7 -34
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.js +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +3 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +12 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +12 -5
- package/esm/BaseFeatureWidget/configSchema.d.ts +1 -1
- package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
- package/esm/BaseFeatureWidget/formatDetails.js +62 -83
- package/esm/BaseFeatureWidget/index.d.ts +2 -1
- package/esm/BaseFeatureWidget/stateModelFactory.d.ts +42 -29
- package/esm/BaseFeatureWidget/stateModelFactory.js +98 -98
- package/esm/BaseFeatureWidget/types.d.ts +12 -6
- package/esm/BaseFeatureWidget/util.d.ts +0 -10
- package/esm/BaseFeatureWidget/util.js +0 -17
- package/esm/CorePlugin.js +2 -2
- package/esm/PluginLoader.d.ts +24 -13
- package/esm/PluginLoader.js +167 -51
- package/esm/PluginManager.d.ts +130 -24
- package/esm/PluginManager.js +180 -32
- package/esm/ReExports/MuiDataGridReExports.d.ts +1 -0
- package/esm/ReExports/MuiDataGridReExports.js +2 -2
- package/esm/ReExports/coreModules.generated.d.ts +2 -0
- package/esm/ReExports/coreModules.generated.js +528 -0
- package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/coreWorkerModules.generated.js +488 -0
- package/esm/ReExports/frameworkModules.d.ts +2 -0
- package/esm/ReExports/frameworkModules.js +68 -0
- package/esm/ReExports/frameworkShared.d.ts +12 -0
- package/esm/ReExports/frameworkShared.js +16 -0
- package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
- package/esm/ReExports/list.js +527 -79
- package/esm/ReExports/modules.d.ts +1 -1
- package/esm/ReExports/modules.js +10 -165
- package/esm/ReExports/registry.d.ts +1 -0
- package/esm/ReExports/registry.js +23 -5
- package/esm/ReExports/uiStub.d.ts +3 -0
- package/esm/ReExports/uiStub.js +33 -0
- package/esm/ReExports/workerModules.d.ts +2 -0
- package/esm/ReExports/workerModules.js +11 -0
- package/esm/TextSearch/TextSearchManager.d.ts +27 -13
- package/esm/TextSearch/TextSearchManager.js +77 -36
- package/esm/TextSearch/places.d.ts +12 -0
- package/esm/TextSearch/places.js +94 -0
- package/esm/assemblyManager/assembly.d.ts +21 -19
- package/esm/assemblyManager/assembly.js +28 -26
- package/esm/assemblyManager/assemblyAdapters.d.ts +1 -1
- package/esm/assemblyManager/assemblyAdapters.js +8 -2
- package/esm/assemblyManager/assemblyConfigSchema.d.ts +31 -90
- package/esm/assemblyManager/assemblyConfigSchema.js +35 -47
- package/esm/assemblyManager/assemblyManager.d.ts +35 -180
- package/esm/assemblyManager/assemblyManager.js +47 -51
- package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +25 -18
- package/esm/assemblyManager/expandAssemblyConfigShorthand.js +78 -49
- package/esm/assemblyManager/geneticCodes.js +2 -5
- package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +10 -0
- package/esm/assemblyManager/getSequenceAdapterConfig.js +10 -0
- package/esm/assemblyManager/indexAssemblyNames.d.ts +9 -0
- package/esm/assemblyManager/indexAssemblyNames.js +22 -0
- package/esm/assemblyManager/loadRefNameMap.d.ts +1 -1
- package/esm/assemblyManager/loadRefNameMap.js +4 -9
- package/esm/assemblyManager/refNameMapKey.d.ts +7 -0
- package/esm/assemblyManager/refNameMapKey.js +12 -0
- package/esm/checkPlugins.d.ts +2 -0
- package/esm/checkPlugins.js +38 -17
- package/esm/configuration/bamIndexFields.d.ts +49 -0
- package/esm/configuration/bamIndexFields.js +41 -0
- package/esm/configuration/configurationSchema.d.ts +101 -71
- package/esm/configuration/configurationSchema.js +207 -134
- package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
- package/esm/configuration/configurationSchemaUnion.js +56 -0
- package/esm/configuration/configurationSlot.d.ts +150 -60
- package/esm/configuration/configurationSlot.js +103 -75
- package/esm/configuration/fillLocations.d.ts +14 -0
- package/esm/configuration/fillLocations.js +14 -0
- package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
- package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
- package/esm/configuration/formatDetailsConfigSchema.js +10 -13
- package/esm/configuration/fullConfSnapshot.d.ts +4 -19
- package/esm/configuration/fullConfSnapshot.js +30 -52
- package/esm/configuration/getConf.d.ts +45 -41
- package/esm/configuration/getConf.js +111 -44
- package/esm/configuration/index.d.ts +24 -11
- package/esm/configuration/index.js +15 -7
- package/esm/configuration/indexType.d.ts +26 -0
- package/esm/configuration/indexType.js +38 -0
- package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
- package/esm/configuration/mergeFormatCallbacks.js +13 -10
- package/esm/configuration/readConfObject.d.ts +2 -24
- package/esm/configuration/readConfObject.js +20 -63
- package/esm/configuration/requirements.d.ts +37 -0
- package/esm/configuration/requirements.js +88 -0
- package/esm/configuration/schemaRegistry.d.ts +32 -15
- package/esm/configuration/schemaRegistry.js +33 -35
- package/esm/configuration/schemaTypes.d.ts +21 -5
- package/esm/configuration/schemaTypes.js +66 -55
- package/esm/configuration/slotFacade.d.ts +12 -29
- package/esm/configuration/slotFacade.js +44 -23
- package/esm/configuration/snapshotPreprocess.d.ts +43 -0
- package/esm/configuration/snapshotPreprocess.js +161 -0
- package/esm/configuration/tabixIndexFields.d.ts +30 -4
- package/esm/configuration/tabixIndexFields.js +21 -4
- package/esm/configuration/tabixShorthand.d.ts +34 -17
- package/esm/configuration/tabixShorthand.js +49 -22
- package/esm/configuration/types.d.ts +182 -43
- package/esm/configuration/uriShorthand.d.ts +9 -0
- package/esm/configuration/uriShorthand.js +16 -0
- package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +13 -19
- package/esm/data_adapters/BaseAdapter/BaseAdapter.js +12 -19
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +40 -2
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +68 -5
- package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +40 -0
- package/esm/data_adapters/BaseAdapter/featureDensity.js +31 -0
- package/esm/data_adapters/BaseAdapter/index.d.ts +23 -3
- package/esm/data_adapters/BaseAdapter/index.js +1 -0
- package/esm/data_adapters/BaseAdapter/rowSources.d.ts +37 -0
- package/esm/data_adapters/BaseAdapter/rowSources.js +7 -0
- package/esm/data_adapters/BaseAdapter/stats.d.ts +33 -1
- package/esm/data_adapters/BaseAdapter/stats.js +52 -13
- package/esm/data_adapters/BaseAdapter/types.d.ts +8 -12
- package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
- package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
- package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +7 -11
- package/esm/data_adapters/CytobandAdapter/configSchema.js +3 -17
- package/esm/data_adapters/dataAdapterCache.d.ts +19 -2
- package/esm/data_adapters/dataAdapterCache.js +44 -10
- package/esm/data_adapters/getFeatureAdapter.d.ts +6 -4
- package/esm/data_adapters/getFeatureAdapter.js +8 -8
- package/esm/data_adapters/getSequenceSubAdapter.d.ts +7 -9
- package/esm/data_adapters/getSequenceSubAdapter.js +8 -10
- package/esm/pluggableElementTypes/AdapterType.d.ts +8 -8
- package/esm/pluggableElementTypes/AdapterType.js +1 -1
- package/esm/pluggableElementTypes/DisplayType.d.ts +46 -16
- package/esm/pluggableElementTypes/DisplayType.js +22 -12
- package/esm/pluggableElementTypes/LazyStateModelElement.d.ts +32 -0
- package/esm/pluggableElementTypes/LazyStateModelElement.js +77 -0
- package/esm/pluggableElementTypes/PluggableElementBase.d.ts +3 -5
- package/esm/pluggableElementTypes/PluggableElementBase.js +3 -5
- package/esm/pluggableElementTypes/RpcMethodType.d.ts +11 -1
- package/esm/pluggableElementTypes/RpcMethodType.js +25 -9
- package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
- package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
- package/esm/pluggableElementTypes/ViewType.d.ts +20 -4
- package/esm/pluggableElementTypes/ViewType.js +32 -4
- package/esm/pluggableElementTypes/addMenuItems.d.ts +3 -2
- package/esm/pluggableElementTypes/extendElementType.d.ts +1 -2
- package/esm/pluggableElementTypes/extendElementType.js +9 -5
- package/esm/pluggableElementTypes/index.d.ts +2 -1
- package/esm/pluggableElementTypes/index.js +1 -1
- package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
- package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +65 -27
- package/esm/pluggableElementTypes/models/BaseDisplayModel.js +72 -10
- package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
- package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
- package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +85 -16
- package/esm/pluggableElementTypes/models/BaseViewModel.js +53 -10
- package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
- package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +15 -11
- package/esm/pluggableElementTypes/models/assertDisplayContract.js +25 -32
- package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
- package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
- package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
- package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +108 -147
- package/esm/pluggableElementTypes/models/baseTrackConfig.js +96 -73
- package/esm/pluggableElementTypes/models/components/SaveTrackData.js +4 -6
- package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
- package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +23 -13
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +80 -48
- package/esm/pluggableElementTypes/models/index.d.ts +2 -3
- package/esm/pluggableElementTypes/models/index.js +2 -3
- package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +15 -1
- package/esm/pluggableElementTypes/models/migrateTrackConfig.js +85 -25
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +4 -3
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +141 -19
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
- package/esm/pluginDefinitions.d.ts +34 -7
- package/esm/pluginDefinitions.js +54 -20
- package/esm/rpc/BaseRpcDriver.d.ts +2 -2
- package/esm/rpc/BaseRpcDriver.js +25 -30
- package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
- package/esm/rpc/MainThreadRpcDriver.js +13 -8
- package/esm/rpc/RpcClient.d.ts +18 -6
- package/esm/rpc/RpcClient.js +51 -16
- package/esm/rpc/RpcManager.d.ts +14 -10
- package/esm/rpc/RpcManager.js +11 -1
- package/esm/rpc/RpcRegistry.d.ts +40 -7
- package/esm/rpc/RpcServer.d.ts +3 -1
- package/esm/rpc/RpcServer.js +19 -12
- package/esm/rpc/WebWorkerRpcDriver.d.ts +11 -4
- package/esm/rpc/WebWorkerRpcDriver.js +64 -68
- package/esm/rpc/byteBudget.d.ts +20 -5
- package/esm/rpc/byteBudget.js +16 -5
- package/esm/rpc/configSchema.d.ts +7 -21
- package/esm/rpc/coreRpcMethods.d.ts +4 -0
- package/esm/rpc/coreRpcMethods.js +4 -0
- package/esm/rpc/methods/CoreGetEncodedFeature.d.ts +13 -0
- package/esm/rpc/methods/CoreGetEncodedFeature.js +32 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +16 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.js +59 -0
- package/esm/rpc/methods/CoreGetExportData.js +3 -4
- package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
- package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
- package/esm/rpc/methods/CoreGetFeatures.js +3 -5
- package/esm/rpc/methods/CoreGetRefNames.js +2 -12
- package/esm/rpc/methods/CoreGetRegionByteEstimate.js +1 -1
- package/esm/rpc/methods/CoreGetSequence.js +2 -2
- package/esm/rpc/methods/CoreLoadAdapterCode.d.ts +13 -0
- package/esm/rpc/methods/CoreLoadAdapterCode.js +16 -0
- package/esm/rpc/methods/layerFeatures.d.ts +33 -0
- package/esm/rpc/methods/layerFeatures.js +29 -0
- package/esm/svg/SvgExport.js +6 -7
- package/esm/svg/SvgThemeProviders.d.ts +12 -0
- package/esm/svg/SvgThemeProviders.js +15 -0
- package/esm/svg/exportViewSvg.d.ts +28 -0
- package/esm/svg/exportViewSvg.js +13 -0
- package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
- package/esm/svg/normalizeSvgMarkup.js +99 -0
- package/esm/svg/serializeSvg.d.ts +7 -0
- package/esm/svg/serializeSvg.js +11 -0
- package/esm/svg/svgId.d.ts +1 -1
- package/esm/svg/svgId.js +1 -1
- package/esm/svg/svgReady.d.ts +9 -7
- package/esm/svg/svgReady.js +8 -7
- package/esm/svg/trackNames.d.ts +7 -5
- package/esm/svg/trackNames.js +12 -9
- package/esm/svg/wrapSvgExport.js +6 -74
- package/esm/ui/AddCustomPluginDialog.js +3 -8
- package/esm/ui/AppReadyMarker.d.ts +45 -0
- package/esm/ui/AppReadyMarker.js +89 -0
- package/esm/ui/BaseExportSvgDialog.d.ts +1 -1
- package/esm/ui/CascadingMenu.js +181 -104
- package/esm/ui/DropDownMenu.js +2 -1
- package/esm/ui/ErrorBanner.js +1 -1
- package/esm/ui/ErrorBoundary.d.ts +2 -2
- package/esm/ui/ErrorMessageStackTraceContents.js +2 -1
- package/esm/ui/ErrorMessageStackTraceDialog.js +5 -11
- package/esm/ui/ExportSvgDialog.d.ts +1 -1
- package/esm/ui/FileDropZone.js +2 -1
- package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
- package/esm/ui/HoverMenu.d.ts +1 -2
- package/esm/ui/HoverMenu.js +6 -3
- package/esm/ui/JexlFilterDialog.d.ts +13 -10
- package/esm/ui/JexlFilterDialog.js +122 -49
- package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
- package/esm/ui/JexlFilterRowEditors.js +90 -0
- package/esm/ui/LazyBaseTooltip.d.ts +4 -0
- package/esm/ui/LazyBaseTooltip.js +9 -0
- package/esm/ui/LegendSwatchGlyph.js +26 -21
- package/esm/ui/LoadingOverlay.d.ts +14 -0
- package/esm/ui/LoadingOverlay.js +4 -2
- package/esm/ui/MenuTypes.d.ts +23 -53
- package/esm/ui/MenuTypes.js +3 -0
- package/esm/ui/MonospaceTextField.d.ts +2 -1
- package/esm/ui/MonospaceTextField.js +23 -20
- package/esm/ui/PaletteContext.d.ts +10 -5
- package/esm/ui/PaletteContext.js +44 -6
- package/esm/ui/RefNameAutocomplete/SearchOption.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/SearchOption.js +45 -0
- package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
- package/esm/ui/RefNameAutocomplete/index.js +8 -2
- package/esm/ui/RefNameAutocomplete/util.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/util.js +42 -1
- package/esm/ui/ResizeHandle.d.ts +3 -1
- package/esm/ui/ResizeHandle.js +44 -11
- package/esm/ui/ScrollChrome.d.ts +13 -0
- package/esm/ui/ScrollChrome.js +11 -0
- package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
- package/esm/ui/ScrollEdgeShadow.js +14 -35
- package/esm/ui/ScrollZoomToggle.d.ts +4 -27
- package/esm/ui/ScrollZoomToggle.js +34 -51
- package/esm/ui/SessionJsonPanel.d.ts +3 -0
- package/esm/ui/SessionJsonPanel.js +14 -0
- package/esm/ui/SettingsChangesTable.d.ts +1 -0
- package/esm/ui/SettingsChangesTable.js +49 -11
- package/esm/ui/ShareLinkField.d.ts +1 -3
- package/esm/ui/ShareLinkField.js +13 -40
- package/esm/ui/SizeSliderRow.d.ts +1 -3
- package/esm/ui/SizeSliderRow.js +4 -6
- package/esm/ui/SnackbarModel.js +79 -67
- package/esm/ui/StatusProgressBar.js +2 -2
- package/esm/ui/SvgColorLegend.d.ts +9 -4
- package/esm/ui/SvgColorLegend.js +82 -41
- package/esm/ui/VerticalScrollbar.d.ts +13 -34
- package/esm/ui/VerticalScrollbar.js +29 -83
- package/esm/ui/ViewLoadingScreen.d.ts +5 -4
- package/esm/ui/ViewLoadingScreen.js +8 -32
- package/esm/ui/colorScale.d.ts +92 -0
- package/esm/ui/colorScale.js +72 -0
- package/esm/ui/colors.d.ts +64 -0
- package/esm/ui/colors.js +230 -1
- package/esm/ui/hoverBoxStyle.d.ts +14 -2
- package/esm/ui/hoverBoxStyle.js +17 -2
- package/esm/ui/index.d.ts +12 -12
- package/esm/ui/index.js +14 -22
- package/esm/ui/launchViewMenu.js +15 -5
- package/esm/ui/legendMenuItem.d.ts +10 -32
- package/esm/ui/legendMenuItem.js +9 -36
- package/esm/ui/legendSpec.d.ts +15 -8
- package/esm/ui/legendSpec.js +14 -23
- package/esm/ui/makeSizeMenu.d.ts +0 -6
- package/esm/ui/makeSizeMenu.js +6 -30
- package/esm/ui/measureLegendText.js +1 -1
- package/esm/ui/menuItemAdornment.d.ts +9 -20
- package/esm/ui/menuItemAdornment.js +10 -32
- package/esm/ui/menuItems.d.ts +2 -7
- package/esm/ui/menuItems.js +1 -6
- package/esm/ui/multiTrackMenuItems.d.ts +6 -0
- package/esm/ui/palette.d.ts +118 -116
- package/esm/ui/palette.js +114 -75
- package/esm/ui/replaceViewAction.d.ts +1 -1
- package/esm/ui/replaceViewAction.js +1 -1
- package/esm/ui/theme.d.ts +43 -119
- package/esm/ui/theme.js +62 -78
- package/esm/ui/toggleMenuItems.d.ts +1 -3
- package/esm/ui/toggleMenuItems.js +6 -5
- package/esm/ui/useAssemblySelection.d.ts +4 -4
- package/esm/ui/viewHeaderHeight.d.ts +1 -0
- package/esm/ui/viewHeaderHeight.js +1 -0
- package/esm/util/Base1DUtils.d.ts +5 -3
- package/esm/util/Base1DUtils.js +14 -6
- package/esm/util/Base1DViewModel.d.ts +2 -1
- package/esm/util/Base1DViewModel.js +3 -2
- package/esm/util/SvgCanvas.d.ts +15 -13
- package/esm/util/SvgCanvas.js +76 -56
- package/esm/util/aborting.d.ts +39 -0
- package/esm/util/aborting.js +88 -6
- package/esm/util/adapterMetadata.d.ts +1 -1
- package/esm/util/adapterMetadata.js +6 -5
- package/esm/util/addAndShowTrack.d.ts +2 -5
- package/esm/util/addAndShowTrack.js +5 -1
- package/esm/util/addRelativeUris.d.ts +17 -5
- package/esm/util/addRelativeUris.js +46 -10
- package/esm/util/addTrackFromWidget.d.ts +2 -5
- package/esm/util/addTrackFromWidget.js +5 -4
- package/esm/util/aggregateFieldName.d.ts +10 -0
- package/esm/util/aggregateFieldName.js +8 -0
- package/esm/util/analytics.js +46 -13
- package/esm/util/animationAllowed.d.ts +9 -0
- package/esm/util/animationAllowed.js +13 -0
- package/esm/util/applyRowResizeWheel.d.ts +10 -5
- package/esm/util/applyRowResizeWheel.js +10 -21
- package/esm/util/bandHeight.d.ts +10 -0
- package/esm/util/bandHeight.js +29 -0
- package/esm/util/bandLayout.d.ts +4 -4
- package/esm/util/bandLayout.js +4 -4
- package/esm/util/bezierConnector.d.ts +4 -3
- package/esm/util/bezierConnector.js +38 -45
- package/esm/util/bgzfWorkerPool.d.ts +20 -74
- package/esm/util/bgzfWorkerPool.js +20 -74
- package/esm/util/binnedAggregate.d.ts +17 -0
- package/esm/util/binnedAggregate.js +275 -0
- package/esm/util/cacheBudgets.d.ts +22 -19
- package/esm/util/cacheBudgets.js +22 -19
- package/esm/util/cachedSetup.d.ts +1 -1
- package/esm/util/cachedSetup.js +2 -2
- package/esm/util/categoricalField.d.ts +56 -0
- package/esm/util/categoricalField.js +73 -0
- package/esm/util/clampToContig.d.ts +17 -0
- package/esm/util/clampToContig.js +19 -0
- package/esm/util/coarseStripHTML.js +1 -2
- package/esm/util/color/cssColorsLevel4.d.ts +1 -0
- package/esm/util/color/cssColorsLevel4.js +1 -0
- package/esm/util/color/index.d.ts +5 -3
- package/esm/util/color/index.js +7 -4
- package/esm/util/colorBits.d.ts +3 -3
- package/esm/util/colorBits.js +19 -44
- package/esm/util/colorRamp.d.ts +49 -5
- package/esm/util/colorRamp.js +169 -18
- package/esm/util/colorScale.d.ts +156 -0
- package/esm/util/colorScale.js +243 -0
- package/esm/util/colorSchemes.d.ts +21 -0
- package/esm/util/colorSchemes.js +30 -0
- package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +21 -23
- package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +21 -52
- package/esm/util/createSvgRasterCanvas.d.ts +10 -0
- package/esm/util/cssColorParse.d.ts +15 -0
- package/esm/util/cssColorParse.js +53 -0
- package/esm/util/diagonalizeRegions.d.ts +2 -3
- package/esm/util/diagonalizeRegions.js +8 -13
- package/esm/util/expandLooseSearchIndex.d.ts +19 -0
- package/esm/util/expandLooseSearchIndex.js +29 -0
- package/esm/util/featureTable.d.ts +224 -0
- package/esm/util/featureTable.js +366 -0
- package/esm/util/featureTransforms.d.ts +80 -0
- package/esm/util/featureTransforms.js +1579 -0
- package/esm/util/featureTypes.d.ts +24 -0
- package/esm/util/featureTypes.js +35 -0
- package/esm/util/fetchAndMaybeUnzip.js +16 -9
- package/esm/util/fetchContext.d.ts +7 -8
- package/esm/util/fetchContext.js +3 -3
- package/esm/util/fetchHub.d.ts +4 -2
- package/esm/util/fetchHub.js +2 -2
- package/esm/util/fetchPhases.d.ts +10 -10
- package/esm/util/fetchSeq.d.ts +2 -3
- package/esm/util/fetchSeq.js +2 -2
- package/esm/util/fieldReader.d.ts +17 -0
- package/esm/util/fieldReader.js +62 -0
- package/esm/util/freezeDeep.d.ts +8 -10
- package/esm/util/freezeDeep.js +8 -10
- package/esm/util/groupKeys.d.ts +77 -0
- package/esm/util/groupKeys.js +155 -0
- package/esm/util/highlights.d.ts +10 -6
- package/esm/util/highlights.js +12 -25
- package/esm/util/hooks.d.ts +31 -2
- package/esm/util/hooks.js +72 -3
- package/esm/util/index.d.ts +11 -11
- package/esm/util/index.js +11 -10
- package/esm/util/indexCandidates.d.ts +1 -31
- package/esm/util/indexCandidates.js +5 -63
- package/esm/util/installFetch.d.ts +77 -37
- package/esm/util/installFetch.js +65 -38
- package/esm/util/installInitAutorun.d.ts +14 -13
- package/esm/util/installInitAutorun.js +17 -17
- package/esm/util/installPrerequisiteFetch.d.ts +115 -0
- package/esm/util/installPrerequisiteFetch.js +111 -0
- package/esm/util/io/index.js +19 -14
- package/esm/util/isDataCurrent.d.ts +7 -5
- package/esm/util/isDataCurrent.js +9 -6
- package/esm/util/isTextEntryFocused.d.ts +7 -0
- package/esm/util/isTextEntryFocused.js +16 -0
- package/esm/util/jexl.js +24 -21
- package/esm/util/jexlFilterRows.d.ts +89 -0
- package/esm/util/jexlFilterRows.js +252 -0
- package/esm/util/jexlFilters.d.ts +20 -27
- package/esm/util/jexlFilters.js +23 -11
- package/esm/util/jexlStrings.d.ts +3 -4
- package/esm/util/jexlStrings.js +2 -3
- package/esm/util/layouts/GranularRectLayout.d.ts +8 -1
- package/esm/util/layouts/GranularRectLayout.js +25 -8
- package/esm/util/lazyAfterAttach.d.ts +13 -0
- package/esm/util/lazyAfterAttach.js +31 -0
- package/esm/util/lazyWithPreload.d.ts +19 -0
- package/esm/util/lazyWithPreload.js +27 -0
- package/esm/util/legendCandidates.d.ts +72 -0
- package/esm/util/legendCandidates.js +138 -0
- package/esm/util/localStorage.js +4 -4
- package/esm/util/markEncoding.d.ts +150 -0
- package/esm/util/markEncoding.js +845 -0
- package/esm/util/markEncodingTypes.d.ts +588 -0
- package/esm/util/markEncodingTypes.js +8 -0
- package/esm/util/mst-reflection.d.ts +2 -20
- package/esm/util/mst-reflection.js +3 -53
- package/esm/util/mstUtils.d.ts +31 -23
- package/esm/util/mstUtils.js +39 -24
- package/esm/util/numericUtils.d.ts +7 -0
- package/esm/util/numericUtils.js +16 -0
- package/esm/util/numericValue.d.ts +14 -0
- package/esm/util/numericValue.js +34 -0
- package/esm/util/openFeatureWidget.d.ts +5 -0
- package/esm/util/openFeatureWidget.js +2 -2
- package/esm/util/openViews.d.ts +17 -0
- package/esm/util/openViews.js +22 -0
- package/esm/util/parentWalk.d.ts +1 -1
- package/esm/util/parentWalk.js +1 -1
- package/esm/util/parseLineByLine.d.ts +4 -5
- package/esm/util/parseLineByLine.js +8 -14
- package/esm/util/pluginStore.d.ts +6 -8
- package/esm/util/pluginStore.js +17 -16
- package/esm/util/preloadComponent.d.ts +5 -0
- package/esm/util/preloadComponent.js +11 -0
- package/esm/util/progress.d.ts +22 -22
- package/esm/util/progress.js +27 -26
- package/esm/util/quantileExtent.d.ts +49 -0
- package/esm/util/quantileExtent.js +162 -0
- package/esm/util/range.d.ts +13 -9
- package/esm/util/range.js +17 -8
- package/esm/util/renameRegions.d.ts +26 -6
- package/esm/util/renameRegions.js +68 -54
- package/esm/util/renderToStaticMarkup.js +24 -14
- package/esm/util/rxjs.d.ts +23 -8
- package/esm/util/rxjs.js +61 -15
- package/esm/util/samplesTsv.d.ts +49 -0
- package/esm/util/samplesTsv.js +86 -0
- package/esm/util/scheduleDetachedDestroy.d.ts +18 -0
- package/esm/util/scheduleDetachedDestroy.js +24 -0
- package/esm/util/scrollLatch.d.ts +1 -0
- package/esm/util/scrollLatch.js +8 -0
- package/esm/util/selectEncodedFeature.d.ts +16 -0
- package/esm/util/selectEncodedFeature.js +34 -0
- package/esm/util/sessionSharing.d.ts +7 -5
- package/esm/util/sessionSharing.js +23 -23
- package/esm/util/shapeNameList.d.ts +2 -0
- package/esm/util/shapeNameList.js +6 -0
- package/esm/util/shapeNames.d.ts +7 -0
- package/esm/util/shapeNames.js +11 -0
- package/esm/util/simpleFeature.d.ts +0 -1
- package/esm/util/starFusion.d.ts +26 -0
- package/esm/util/starFusion.js +37 -0
- package/esm/util/stepTables.d.ts +82 -0
- package/esm/util/stepTables.js +243 -0
- package/esm/util/svAlt.d.ts +145 -0
- package/esm/util/svAlt.js +364 -0
- package/esm/util/svgColorProps.d.ts +11 -0
- package/esm/util/svgColorProps.js +28 -1
- package/esm/util/systemColorScheme.d.ts +12 -0
- package/esm/util/systemColorScheme.js +27 -0
- package/esm/util/tabix.d.ts +13 -8
- package/esm/util/tabix.js +17 -12
- package/esm/util/thresholdScale.d.ts +91 -0
- package/esm/util/thresholdScale.js +166 -0
- package/esm/util/timeGate.d.ts +4 -5
- package/esm/util/timeGate.js +4 -5
- package/esm/util/trackConfigDelta.d.ts +26 -26
- package/esm/util/trackConfigDelta.js +63 -47
- package/esm/util/tracks.d.ts +121 -40
- package/esm/util/tracks.js +497 -112
- package/esm/util/translateTranscript.d.ts +44 -0
- package/esm/util/translateTranscript.js +102 -0
- package/esm/util/types/data.d.ts +0 -2
- package/esm/util/types/index.d.ts +121 -22
- package/esm/util/types/index.js +9 -0
- package/esm/util/types/mst.d.ts +3 -0
- package/esm/util/types/mst.js +4 -0
- package/esm/util/types/renameIds.d.ts +1 -0
- package/esm/util/types/renameIds.js +29 -0
- package/esm/util/types/services.d.ts +1 -1
- package/esm/util/unknownSnapshotKeys.d.ts +51 -0
- package/esm/util/unknownSnapshotKeys.js +82 -0
- package/esm/util/useFeatureSequence.js +5 -5
- package/esm/util/useFetch.d.ts +3 -4
- package/esm/util/useFetch.js +19 -10
- package/esm/util/useFetchPlugins.d.ts +6 -2
- package/esm/util/useFetchPlugins.js +7 -3
- package/esm/util/usePanelVirtualScroll.d.ts +7 -35
- package/esm/util/usePanelVirtualScroll.js +9 -36
- package/esm/util/useRowVirtualScroll.d.ts +6 -29
- package/esm/util/useRowVirtualScroll.js +8 -49
- package/esm/util/useVirtualScrollWheel.d.ts +20 -4
- package/esm/util/useVirtualScrollWheel.js +40 -74
- package/esm/util/viewHighlights.d.ts +3 -0
- package/esm/util/viewHighlights.js +5 -0
- package/esm/util/viewStatus.d.ts +47 -15
- package/esm/util/viewStatus.js +34 -0
- package/esm/util/wheelZoom.d.ts +7 -1
- package/esm/util/wheelZoom.js +85 -19
- package/esm/util/whenViewSettled.d.ts +55 -8
- package/esm/util/whenViewSettled.js +56 -7
- package/esm/util/withLaunchInput.d.ts +174 -0
- package/esm/util/withLaunchInput.js +274 -0
- package/package.json +70 -20
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +0 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +0 -8
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
- package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
- package/esm/ReExports/BaseFeatureDetails.js +0 -10
- package/esm/ReExports/index.d.ts +0 -1
- package/esm/ReExports/index.js +0 -1
- package/esm/ReExports/publicUtil.d.ts +0 -1
- package/esm/ReExports/publicUtil.js +0 -28
- package/esm/configuration/promotableDefaults.d.ts +0 -199
- package/esm/configuration/promotableDefaults.js +0 -326
- package/esm/configuration/promotablePin.d.ts +0 -55
- package/esm/configuration/promotablePin.js +0 -1
- package/esm/configuration/promotableResolve.d.ts +0 -108
- package/esm/configuration/promotableResolve.js +0 -117
- package/esm/configuration/promotableSlots.d.ts +0 -12
- package/esm/configuration/promotableSlots.js +0 -45
- package/esm/configuration/slotShape.d.ts +0 -12
- package/esm/configuration/slotShape.js +0 -84
- package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
- package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
- package/esm/ui/PinAdornment.d.ts +0 -5
- package/esm/ui/PinAdornment.js +0 -79
- package/esm/ui/SvgGradientLegend.d.ts +0 -26
- package/esm/ui/SvgGradientLegend.js +0 -26
- package/esm/ui/highlightChipReveal.d.ts +0 -32
- package/esm/ui/highlightChipReveal.js +0 -39
- package/esm/ui/promotableMenuItems.d.ts +0 -19
- package/esm/ui/promotableMenuItems.js +0 -89
- package/esm/ui/promotablePinCoverage.d.ts +0 -44
- package/esm/ui/promotablePinCoverage.js +0 -87
- package/esm/util/applyInitSettings.d.ts +0 -79
- package/esm/util/applyInitSettings.js +0 -91
- package/esm/util/openDisplays.d.ts +0 -23
- package/esm/util/openDisplays.js +0 -79
- package/esm/util/stopToken.d.ts +0 -211
- package/esm/util/stopToken.js +0 -438
- /package/esm/{BaseFeatureWidget/BaseFeatureDetail/types.js → data_adapters/BaseAdapter/zoomRange.js} +0 -0
package/esm/rpc/RpcClient.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { makeAbortError } from '../util/aborting.js';
|
|
1
2
|
import { deserializeError } from './serializeError/index.js';
|
|
2
3
|
export default class RpcClient {
|
|
3
4
|
worker;
|
|
4
5
|
pending = new Map();
|
|
6
|
+
destroyed = false;
|
|
5
7
|
events = new Map();
|
|
6
8
|
counter = 0;
|
|
7
9
|
constructor(worker) {
|
|
@@ -39,10 +41,9 @@ export default class RpcClient {
|
|
|
39
41
|
if (idx !== -1) {
|
|
40
42
|
listeners.splice(idx, 1);
|
|
41
43
|
}
|
|
42
|
-
// drop the emptied key, not just the listener: every
|
|
43
|
-
// own
|
|
44
|
-
//
|
|
45
|
-
// page — six figures of them in a long session
|
|
44
|
+
// drop the emptied key, not just the listener: every reporting call
|
|
45
|
+
// mints its own status channel (WebWorkerHandle.call), so a retained
|
|
46
|
+
// empty array is one dead Map entry per call for the life of the page
|
|
46
47
|
if (listeners.length === 0) {
|
|
47
48
|
this.events.delete(event);
|
|
48
49
|
}
|
|
@@ -90,6 +91,7 @@ export default class RpcClient {
|
|
|
90
91
|
// never arrive, so reject it here instead of leaving the caller's promise (and
|
|
91
92
|
// everything its continuation holds) unsettled forever
|
|
92
93
|
destroy() {
|
|
94
|
+
this.destroyed = true;
|
|
93
95
|
this.rejectAllPending(new Error('RPC worker was terminated'));
|
|
94
96
|
this.events.clear();
|
|
95
97
|
}
|
|
@@ -125,28 +127,61 @@ export default class RpcClient {
|
|
|
125
127
|
}
|
|
126
128
|
}
|
|
127
129
|
/**
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
*
|
|
131
|
-
* under that id ignores it.
|
|
130
|
+
* Abort the call `uid`, so the signal it runs under in the worker aborts.
|
|
131
|
+
* Fire-and-forget: it settles no pending call, and a worker no longer running
|
|
132
|
+
* that call ignores it.
|
|
132
133
|
*/
|
|
133
|
-
|
|
134
|
-
this.worker.postMessage({
|
|
134
|
+
abort(uid) {
|
|
135
|
+
this.worker.postMessage({ abort: uid, libRpc: true });
|
|
135
136
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
137
|
+
/**
|
|
138
|
+
* No transfer list: transferables flow only worker → main, in a reply's
|
|
139
|
+
* rpcResult wrapper. Transferring an argument would neuter the main thread's
|
|
140
|
+
* own buffer — this took an option for one and nothing ever passed it.
|
|
141
|
+
*
|
|
142
|
+
* With a `signal`, the worker runs the method under a signal of its own and
|
|
143
|
+
* aborts it when this one aborts. The uid is the call's identity on both
|
|
144
|
+
* sides, so the abort frame needs nothing else; the listener is attached
|
|
145
|
+
* before the call frame is posted and removed when the call settles, so an
|
|
146
|
+
* abort in between reaches a worker still running the call, and one after
|
|
147
|
+
* reaches nothing.
|
|
148
|
+
*/
|
|
149
|
+
call(method, data, signal) {
|
|
140
150
|
const uid = String(++this.counter);
|
|
141
151
|
return new Promise((resolve, reject) => {
|
|
142
|
-
this.
|
|
152
|
+
if (this.destroyed) {
|
|
153
|
+
reject(new Error('RPC worker was terminated'));
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
if (signal?.aborted) {
|
|
157
|
+
reject(makeAbortError());
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
const onAbort = () => {
|
|
161
|
+
this.abort(uid);
|
|
162
|
+
};
|
|
163
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
164
|
+
const detach = () => {
|
|
165
|
+
signal?.removeEventListener('abort', onAbort);
|
|
166
|
+
};
|
|
167
|
+
this.pending.set(uid, {
|
|
168
|
+
resolve: value => {
|
|
169
|
+
detach();
|
|
170
|
+
resolve(value);
|
|
171
|
+
},
|
|
172
|
+
reject: error => {
|
|
173
|
+
detach();
|
|
174
|
+
reject(error);
|
|
175
|
+
},
|
|
176
|
+
});
|
|
143
177
|
try {
|
|
144
|
-
this.worker.postMessage({ method, uid, data, libRpc: true }, []);
|
|
178
|
+
this.worker.postMessage({ method, uid, data, libRpc: true, abortable: signal !== undefined }, []);
|
|
145
179
|
}
|
|
146
180
|
catch (e) {
|
|
147
181
|
// a non-cloneable payload throws here, which rejects this promise; drop
|
|
148
182
|
// the entry that is now waiting on a reply the worker never received
|
|
149
183
|
this.pending.delete(uid);
|
|
184
|
+
detach();
|
|
150
185
|
throw e;
|
|
151
186
|
}
|
|
152
187
|
});
|
package/esm/rpc/RpcManager.d.ts
CHANGED
|
@@ -9,18 +9,16 @@ export interface RpcManagerOptions {
|
|
|
9
9
|
export default class RpcManager {
|
|
10
10
|
static configSchema: import("../configuration/configurationSchema.ts").ConfigurationSchemaType<{
|
|
11
11
|
readonly defaultDriver: {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
readonly advanced: true;
|
|
12
|
+
type: "string";
|
|
13
|
+
} & {
|
|
14
|
+
defaultValue: string;
|
|
16
15
|
};
|
|
17
16
|
readonly workerCount: {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
readonly advanced: true;
|
|
17
|
+
type: "number";
|
|
18
|
+
} & {
|
|
19
|
+
defaultValue: number;
|
|
22
20
|
};
|
|
23
|
-
}, import("../configuration/configurationSchema.ts").ConfigurationSchemaOptions<undefined, undefined>>;
|
|
21
|
+
}, import("../configuration/configurationSchema.ts").ConfigurationSchemaOptions<undefined, undefined, undefined, import("../configuration/requirements.ts").ConfigurationSchemaRequirement<Partial<Record<string, string[]>>, string>, any>>;
|
|
24
22
|
private pluginManager;
|
|
25
23
|
private mainConfiguration;
|
|
26
24
|
private hostDriverName;
|
|
@@ -60,7 +58,7 @@ export default class RpcManager {
|
|
|
60
58
|
private makeDriver;
|
|
61
59
|
/**
|
|
62
60
|
* `args` carries the method's data and the caller's handles on the operation —
|
|
63
|
-
* the
|
|
61
|
+
* the signal and the status callback. Both handles are always accepted,
|
|
64
62
|
* for every method, because {@link RpcHandles} is part of `RpcCallArgs` rather
|
|
65
63
|
* than of any registry entry.
|
|
66
64
|
*
|
|
@@ -121,4 +119,10 @@ export default class RpcManager {
|
|
|
121
119
|
* second driver and a second pool that nothing will ever destroy. ADR-086.
|
|
122
120
|
*/
|
|
123
121
|
destroy(): void;
|
|
122
|
+
/**
|
|
123
|
+
* Build the driver and let it start what the first call would wait for — a
|
|
124
|
+
* web worker's bundle and runtime plugins — while the host is still building
|
|
125
|
+
* its session.
|
|
126
|
+
*/
|
|
127
|
+
warmUp(): void;
|
|
124
128
|
}
|
package/esm/rpc/RpcManager.js
CHANGED
|
@@ -82,7 +82,7 @@ export default class RpcManager {
|
|
|
82
82
|
}
|
|
83
83
|
/**
|
|
84
84
|
* `args` carries the method's data and the caller's handles on the operation —
|
|
85
|
-
* the
|
|
85
|
+
* the signal and the status callback. Both handles are always accepted,
|
|
86
86
|
* for every method, because {@link RpcHandles} is part of `RpcCallArgs` rather
|
|
87
87
|
* than of any registry entry.
|
|
88
88
|
*
|
|
@@ -187,4 +187,14 @@ export default class RpcManager {
|
|
|
187
187
|
this.driver?.destroy();
|
|
188
188
|
this.driver = undefined;
|
|
189
189
|
}
|
|
190
|
+
/**
|
|
191
|
+
* Build the driver and let it start what the first call would wait for — a
|
|
192
|
+
* web worker's bundle and runtime plugins — while the host is still building
|
|
193
|
+
* its session.
|
|
194
|
+
*/
|
|
195
|
+
warmUp() {
|
|
196
|
+
if (!this.destroyed) {
|
|
197
|
+
this.getDriver().warmUp();
|
|
198
|
+
}
|
|
199
|
+
}
|
|
190
200
|
}
|
package/esm/rpc/RpcRegistry.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import type { FeatureDensity } from '../data_adapters/BaseAdapter/featureDensity.ts';
|
|
2
|
+
import type { CoreGetEncodedLayersArgs, EncodedLayersResult } from '../util/markEncodingTypes.ts';
|
|
1
3
|
import type { StatusCallback } from '../util/progress.ts';
|
|
2
4
|
import type { UnwrapRpcResult } from '../util/rpc.ts';
|
|
3
5
|
import type { Feature, SimpleFeatureSerialized } from '../util/simpleFeature.ts';
|
|
4
|
-
import type { StopToken } from '../util/stopToken.ts';
|
|
5
6
|
import type { NoAssemblyRegion } from '../util/types/data.ts';
|
|
6
7
|
import type { RpcResult } from './RpcServer.ts';
|
|
7
|
-
import type { ByteEstimateScope } from './byteBudget.ts';
|
|
8
|
+
import type { ByteEstimateScope, RegionTooLargeResult } from './byteBudget.ts';
|
|
8
9
|
export interface RegionLike {
|
|
9
10
|
refName: string;
|
|
10
11
|
start: number;
|
|
@@ -15,8 +16,8 @@ export interface RpcRegistry {
|
|
|
15
16
|
CoreGetRefNames: {
|
|
16
17
|
args: {
|
|
17
18
|
adapterConfig: Record<string, unknown>;
|
|
18
|
-
sequenceAdapter?: Record<string, unknown>;
|
|
19
19
|
assemblyName?: string;
|
|
20
|
+
haplotypes?: string[];
|
|
20
21
|
};
|
|
21
22
|
return: string[];
|
|
22
23
|
};
|
|
@@ -37,12 +38,23 @@ export interface RpcRegistry {
|
|
|
37
38
|
args: {
|
|
38
39
|
regions: RegionLike[];
|
|
39
40
|
adapterConfig: Record<string, unknown>;
|
|
40
|
-
sequenceAdapter?: Record<string, unknown>;
|
|
41
41
|
opts?: Record<string, unknown>;
|
|
42
42
|
};
|
|
43
43
|
return: Feature[];
|
|
44
44
|
wire: SimpleFeatureSerialized[];
|
|
45
45
|
};
|
|
46
|
+
CoreGetEncodedLayers: {
|
|
47
|
+
args: CoreGetEncodedLayersArgs;
|
|
48
|
+
return: EncodedLayersResult | RegionTooLargeResult;
|
|
49
|
+
transferables: EncodedLayersResult;
|
|
50
|
+
};
|
|
51
|
+
CoreGetEncodedFeature: {
|
|
52
|
+
args: Omit<CoreGetEncodedLayersArgs, 'byteLimit'> & {
|
|
53
|
+
layer: number;
|
|
54
|
+
featureIndex: number;
|
|
55
|
+
};
|
|
56
|
+
return: SimpleFeatureSerialized | undefined;
|
|
57
|
+
};
|
|
46
58
|
CoreGetRegionByteEstimate: {
|
|
47
59
|
args: {
|
|
48
60
|
adapterConfig: Record<string, unknown>;
|
|
@@ -52,9 +64,20 @@ export interface RpcRegistry {
|
|
|
52
64
|
};
|
|
53
65
|
return: number | undefined;
|
|
54
66
|
};
|
|
67
|
+
CoreGetFeatureDensity: {
|
|
68
|
+
args: {
|
|
69
|
+
adapterConfig: Record<string, unknown>;
|
|
70
|
+
regions: RegionLike[];
|
|
71
|
+
bpPerPx: number;
|
|
72
|
+
headers?: Record<string, string>;
|
|
73
|
+
};
|
|
74
|
+
return: FeatureDensity[] | undefined;
|
|
75
|
+
};
|
|
55
76
|
CoreGetInfo: {
|
|
56
77
|
args: {
|
|
57
78
|
adapterConfig: Record<string, unknown>;
|
|
79
|
+
haplotypes?: string[];
|
|
80
|
+
assemblyName?: string;
|
|
58
81
|
};
|
|
59
82
|
return: unknown;
|
|
60
83
|
};
|
|
@@ -77,6 +100,12 @@ export interface RpcRegistry {
|
|
|
77
100
|
args: Record<string, unknown>;
|
|
78
101
|
return: void;
|
|
79
102
|
};
|
|
103
|
+
CoreLoadAdapterCode: {
|
|
104
|
+
args: {
|
|
105
|
+
adapterTypes: string[];
|
|
106
|
+
};
|
|
107
|
+
return: void;
|
|
108
|
+
};
|
|
80
109
|
}
|
|
81
110
|
export type RpcMethodName = keyof RpcRegistry;
|
|
82
111
|
export type RpcArgs<M extends RpcMethodName> = RpcRegistry[M]['args'];
|
|
@@ -104,12 +133,15 @@ export type RpcReturn<M extends RpcMethodName> = RpcRegistry[M]['return'];
|
|
|
104
133
|
* the pattern the type exists to support.
|
|
105
134
|
*/
|
|
106
135
|
export type RpcHandles = {
|
|
107
|
-
|
|
136
|
+
signal?: AbortSignal;
|
|
108
137
|
statusCallback?: StatusCallback;
|
|
109
138
|
};
|
|
110
139
|
export type RpcSession = {
|
|
111
140
|
sessionId: string;
|
|
112
141
|
};
|
|
142
|
+
export type RpcReference = {
|
|
143
|
+
sequenceAdapter?: Record<string, unknown>;
|
|
144
|
+
};
|
|
113
145
|
export type RpcCallContext = RpcSession & RpcHandles;
|
|
114
146
|
/**
|
|
115
147
|
* What {@link RpcExecuteArgs} and {@link RpcWireReturn} resolve to for a method
|
|
@@ -136,7 +168,8 @@ export interface NotInRpcRegistry<M extends string> {
|
|
|
136
168
|
}
|
|
137
169
|
/**
|
|
138
170
|
* What a registered method's `execute` actually receives: its declared args,
|
|
139
|
-
* plus the session it is pinned to,
|
|
171
|
+
* plus the session it is pinned to, the handles the driver merged in and the
|
|
172
|
+
* reference renaming added.
|
|
140
173
|
*
|
|
141
174
|
* Derived rather than hand-written, for the reason {@link RpcWireReturn} is:
|
|
142
175
|
* the return type has been checked against the registry for a while and the
|
|
@@ -144,7 +177,7 @@ export interface NotInRpcRegistry<M extends string> {
|
|
|
144
177
|
* parameterized with its own name (`RpcMethodType<'CoreGetSequence'>`) gets
|
|
145
178
|
* both ends checked.
|
|
146
179
|
*/
|
|
147
|
-
export type RpcExecuteArgs<M extends string> = M extends RpcMethodName ? RpcArgs<M & RpcMethodName> & RpcCallContext : string extends M ? unknown : NotInRpcRegistry<M>;
|
|
180
|
+
export type RpcExecuteArgs<M extends string> = M extends RpcMethodName ? RpcArgs<M & RpcMethodName> & RpcCallContext & RpcReference : string extends M ? unknown : NotInRpcRegistry<M>;
|
|
148
181
|
/**
|
|
149
182
|
* What a CALLER passes to `rpcManager.call`: the method's own data, plus the
|
|
150
183
|
* {@link RpcHandles} every method takes. No {@link RpcSession} — that one is
|
package/esm/rpc/RpcServer.d.ts
CHANGED
|
@@ -12,11 +12,13 @@ interface RpcMessageData {
|
|
|
12
12
|
uid: string;
|
|
13
13
|
libRpc?: true;
|
|
14
14
|
data: unknown;
|
|
15
|
-
|
|
15
|
+
abortable?: boolean;
|
|
16
|
+
abort?: string;
|
|
16
17
|
}
|
|
17
18
|
export default class RpcServer {
|
|
18
19
|
protected methods: Record<string, Procedure>;
|
|
19
20
|
private self;
|
|
21
|
+
private aborters;
|
|
20
22
|
constructor(methods: Record<string, Procedure>);
|
|
21
23
|
handler(e: MessageEvent<RpcMessageData>): void;
|
|
22
24
|
private post;
|
package/esm/rpc/RpcServer.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { isRpcResult } from '../util/rpc.js';
|
|
2
|
-
import { markStopTokenStopped } from '../util/stopToken.js';
|
|
3
2
|
import { bufferPaths, containerEntries, explainTransferError, } from './explainTransferError.js';
|
|
4
3
|
import { serializeError } from './serializeError/index.js';
|
|
5
4
|
// `self` is a DedicatedWorkerGlobalScope in the worker, but the DOM lib types the
|
|
@@ -126,6 +125,7 @@ export function rpcResultWithArrayBuffers(value) {
|
|
|
126
125
|
export default class RpcServer {
|
|
127
126
|
methods;
|
|
128
127
|
self;
|
|
128
|
+
aborters = new Map();
|
|
129
129
|
constructor(methods) {
|
|
130
130
|
if (!workerSelf) {
|
|
131
131
|
throw new Error('RpcServer must be constructed in a worker global scope');
|
|
@@ -143,31 +143,38 @@ export default class RpcServer {
|
|
|
143
143
|
});
|
|
144
144
|
}
|
|
145
145
|
handler(e) {
|
|
146
|
-
const { libRpc, method, uid, data,
|
|
146
|
+
const { libRpc, method, uid, data, abort, abortable } = e.data;
|
|
147
147
|
if (!libRpc) {
|
|
148
148
|
return;
|
|
149
149
|
}
|
|
150
|
-
if (
|
|
151
|
-
//
|
|
152
|
-
//
|
|
153
|
-
//
|
|
154
|
-
//
|
|
155
|
-
|
|
156
|
-
markStopTokenStopped(stopToken);
|
|
150
|
+
if (abort !== undefined) {
|
|
151
|
+
// Handled ahead of the method lookup: this frame has no method name and
|
|
152
|
+
// would otherwise land in the unknown method branch with no uid to reply
|
|
153
|
+
// to. A call that already settled left no controller, so a late abort is
|
|
154
|
+
// a no-op.
|
|
155
|
+
this.aborters.get(abort)?.abort();
|
|
157
156
|
return;
|
|
158
157
|
}
|
|
159
158
|
const methodFn = Object.hasOwn(this.methods, method)
|
|
160
159
|
? this.methods[method]
|
|
161
160
|
: undefined;
|
|
162
161
|
if (methodFn) {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
162
|
+
const controller = abortable ? new AbortController() : undefined;
|
|
163
|
+
if (controller) {
|
|
164
|
+
this.aborters.set(uid, controller);
|
|
165
|
+
}
|
|
166
|
+
const args = controller
|
|
167
|
+
? { ...data, signal: controller.signal }
|
|
168
|
+
: data;
|
|
169
|
+
(async () => methodFn(args))()
|
|
166
170
|
.then(response => {
|
|
167
171
|
this.reply(uid, response, method);
|
|
168
172
|
})
|
|
169
173
|
.catch((error) => {
|
|
170
174
|
this.throw(uid, serializeError(error));
|
|
175
|
+
})
|
|
176
|
+
.finally(() => {
|
|
177
|
+
this.aborters.delete(uid);
|
|
171
178
|
});
|
|
172
179
|
}
|
|
173
180
|
else {
|
|
@@ -4,14 +4,15 @@ import type { AnyConfigurationModel } from '../configuration/index.ts';
|
|
|
4
4
|
import type RpcMethodType from '../pluggableElementTypes/RpcMethodType.ts';
|
|
5
5
|
import type { PluginDefinition } from '../pluginDefinitions.ts';
|
|
6
6
|
import type { StatusCallback } from '../util/progress.ts';
|
|
7
|
+
import type { RpcHandles } from './RpcRegistry.ts';
|
|
7
8
|
export interface WorkerHandle {
|
|
8
9
|
destroy(): void;
|
|
9
10
|
onError?(callback: () => void): void;
|
|
10
|
-
notifyStopToken?(id: string): void;
|
|
11
11
|
on?(eventName: string, listener: (data: unknown) => void): void;
|
|
12
12
|
postMessage?(message: unknown): void;
|
|
13
13
|
call(functionName: string, args?: unknown, options?: {
|
|
14
14
|
statusCallback?: StatusCallback;
|
|
15
|
+
signal?: AbortSignal;
|
|
15
16
|
}): Promise<unknown>;
|
|
16
17
|
}
|
|
17
18
|
declare module '@jbrowse/core/PluginManager' {
|
|
@@ -43,7 +44,6 @@ export default class WebWorkerRpcDriver extends BaseRpcDriver {
|
|
|
43
44
|
private lastWorkerAssignment;
|
|
44
45
|
private workerAssignments;
|
|
45
46
|
private workerPool?;
|
|
46
|
-
private unregisterBroadcaster;
|
|
47
47
|
private destroyed;
|
|
48
48
|
constructor(pluginManager: PluginManager, config: AnyConfigurationModel, options: WebWorkerRpcDriverOptions);
|
|
49
49
|
/**
|
|
@@ -57,6 +57,12 @@ export default class WebWorkerRpcDriver extends BaseRpcDriver {
|
|
|
57
57
|
destroy(): void;
|
|
58
58
|
private createWorkerPool;
|
|
59
59
|
private getWorkerPool;
|
|
60
|
+
/**
|
|
61
|
+
* Boot the first worker now rather than on the first call, so its bundle and
|
|
62
|
+
* runtime plugins load while the page builds the session. The first session
|
|
63
|
+
* is assigned to that worker.
|
|
64
|
+
*/
|
|
65
|
+
warmUp(): void;
|
|
60
66
|
getWorker(sessionId: string): Promise<WorkerHandle>;
|
|
61
67
|
/**
|
|
62
68
|
* Hand a freshly booted worker to whatever plugins want to extend it, and use
|
|
@@ -68,11 +74,12 @@ export default class WebWorkerRpcDriver extends BaseRpcDriver {
|
|
|
68
74
|
* call", so folding at dispatch needed a WeakMap to stop rebuilding a
|
|
69
75
|
* plugin's wrapper per RPC; once per boot has nothing to memoize.
|
|
70
76
|
*/
|
|
77
|
+
extendsWorkers(): boolean;
|
|
71
78
|
extendWorker(worker: WorkerHandle): WorkerHandle;
|
|
72
|
-
protected transport(sessionId: string, rpcMethod: RpcMethodType, serializedArgs: Record<string, unknown>,
|
|
79
|
+
protected transport(sessionId: string, rpcMethod: RpcMethodType, serializedArgs: Record<string, unknown>, handles: RpcHandles): Promise<unknown>;
|
|
73
80
|
/**
|
|
74
81
|
* Boot one worker and run the configuration handshake. Overridable so a test
|
|
75
82
|
* can hand the pool a fake handle without a `Worker`; nothing in the app does.
|
|
76
83
|
*/
|
|
77
|
-
makeWorker(): Promise<WorkerHandle>;
|
|
84
|
+
makeWorker(onHandle?: (handle: WorkerHandle) => void): Promise<WorkerHandle>;
|
|
78
85
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { readConfObject } from '../configuration/index.js';
|
|
2
2
|
import { clamp } from '../util/index.js';
|
|
3
|
-
import { registerStopTokenBroadcaster } from '../util/stopToken.js';
|
|
4
3
|
import BaseRpcDriver, { CORE_FREE_RESOURCES } from './BaseRpcDriver.js';
|
|
5
4
|
import RpcClient from './RpcClient.js';
|
|
6
5
|
import { deserializeError } from './serializeError/index.js';
|
|
@@ -36,9 +35,6 @@ class WebWorkerHandle {
|
|
|
36
35
|
onError(callback) {
|
|
37
36
|
this.client.on('error', callback);
|
|
38
37
|
}
|
|
39
|
-
notifyStopToken(id) {
|
|
40
|
-
this.client.notifyStopToken(id);
|
|
41
|
-
}
|
|
42
38
|
// the two halves of {@link WorkerHandle}'s plugin-facing pair
|
|
43
39
|
on(eventName, listener) {
|
|
44
40
|
this.client.on(eventName, listener);
|
|
@@ -73,9 +69,9 @@ class WebWorkerHandle {
|
|
|
73
69
|
// `Core-extendWorker` wrapper written against that interface may well call
|
|
74
70
|
// `worker.call(name, args)` — which destructured `undefined` and threw
|
|
75
71
|
opts = {}) {
|
|
76
|
-
const { statusCallback } = opts;
|
|
72
|
+
const { statusCallback, signal } = opts;
|
|
77
73
|
if (!statusCallback) {
|
|
78
|
-
return this.client.call(funcName, args);
|
|
74
|
+
return this.client.call(funcName, args, signal);
|
|
79
75
|
}
|
|
80
76
|
const channel = `message-${++this.channelCount}`;
|
|
81
77
|
// RpcClient is a generic event emitter (it also carries 'error' events), so
|
|
@@ -87,8 +83,7 @@ class WebWorkerHandle {
|
|
|
87
83
|
};
|
|
88
84
|
this.client.on(channel, listener);
|
|
89
85
|
try {
|
|
90
|
-
|
|
91
|
-
return result;
|
|
86
|
+
return await this.client.call(funcName, { ...args, channel }, signal);
|
|
92
87
|
}
|
|
93
88
|
finally {
|
|
94
89
|
this.client.off(channel, listener);
|
|
@@ -115,11 +110,21 @@ class LazyWorker {
|
|
|
115
110
|
}
|
|
116
111
|
async getWorker() {
|
|
117
112
|
if (!this.workerP) {
|
|
118
|
-
|
|
113
|
+
let early;
|
|
114
|
+
const booted = this.driver.makeWorker(handle => {
|
|
115
|
+
early = handle;
|
|
116
|
+
});
|
|
119
117
|
this.bootP = booted;
|
|
120
|
-
//
|
|
121
|
-
// a
|
|
122
|
-
|
|
118
|
+
// A booting worker holds the calls it is sent, so with nothing to extend
|
|
119
|
+
// them a call goes out now rather than when the page gets round to the
|
|
120
|
+
// worker's 'ready'. A boot that fails rejects those calls with the
|
|
121
|
+
// handle. An extended worker is extended once booted, as promised.
|
|
122
|
+
this.workerP =
|
|
123
|
+
early && !this.driver.extendsWorkers()
|
|
124
|
+
? Promise.resolve(early)
|
|
125
|
+
: // once per booted worker by construction, rather than per dispatch
|
|
126
|
+
// behind a memo
|
|
127
|
+
booted.then(worker => this.driver.extendWorker(worker));
|
|
123
128
|
// drop this slot so the next getWorker re-boots, whether the boot failed
|
|
124
129
|
// or the booted worker later died (a dead worker never replies)
|
|
125
130
|
const invalidate = () => {
|
|
@@ -151,24 +156,9 @@ class LazyWorker {
|
|
|
151
156
|
this.workerP = undefined;
|
|
152
157
|
}
|
|
153
158
|
/**
|
|
154
|
-
*
|
|
155
|
-
* slot
|
|
156
|
-
*
|
|
157
|
-
* still lands after the call it means to cancel rather than ahead of the
|
|
158
|
-
* worker's message listener existing.
|
|
159
|
-
*/
|
|
160
|
-
notifyStopToken(id) {
|
|
161
|
-
this.bootP
|
|
162
|
-
?.then(worker => {
|
|
163
|
-
worker.notifyStopToken?.(id);
|
|
164
|
-
})
|
|
165
|
-
.catch(() => { });
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* Drop a session's cached adapters on this slot's worker — and, like
|
|
169
|
-
* {@link notifyStopToken}, never boot one to do it. A slot that never booted
|
|
170
|
-
* has no cache to free, and booting one there costs a whole worker bundle and
|
|
171
|
-
* every runtime plugin to say so.
|
|
159
|
+
* Drop a session's cached adapters on this slot's worker, and never boot one
|
|
160
|
+
* to do it. A slot that never booted has no cache to free, and booting one
|
|
161
|
+
* there costs a whole worker bundle and every runtime plugin to say so.
|
|
172
162
|
*
|
|
173
163
|
* Through the extended handle, because it is a `call`: a plugin that wraps
|
|
174
164
|
* calls should see this one.
|
|
@@ -197,17 +187,6 @@ export default class WebWorkerRpcDriver extends BaseRpcDriver {
|
|
|
197
187
|
// sessionId -> worker number
|
|
198
188
|
workerAssignments = new Map();
|
|
199
189
|
workerPool;
|
|
200
|
-
// a stopped token has to reach the thread actually running the work, and this
|
|
201
|
-
// is the seam that carries it. Broadcast rather than routed per call: one
|
|
202
|
-
// token is commonly in flight on several calls at once, and a worker holding
|
|
203
|
-
// nothing under that id ignores the frame.
|
|
204
|
-
//
|
|
205
|
-
// Registered with the POOL, not in the constructor, so that a driver which
|
|
206
|
-
// never boots a worker stays out of the module-global broadcaster set — and
|
|
207
|
-
// registered only once the pool exists to receive the broadcast, since a
|
|
208
|
-
// `createWorkerPool` that threw after registering left an entry no `destroy`
|
|
209
|
-
// could ever reach.
|
|
210
|
-
unregisterBroadcaster = () => { };
|
|
211
190
|
// `destroy` is terminal: `getWorkerPool` refuses rather than letting its `??=`
|
|
212
191
|
// build a second pool for a driver whose teardown already ran. ADR-086.
|
|
213
192
|
destroyed = false;
|
|
@@ -233,7 +212,6 @@ export default class WebWorkerRpcDriver extends BaseRpcDriver {
|
|
|
233
212
|
// discarding the driver so its worker threads don't outlive it
|
|
234
213
|
destroy() {
|
|
235
214
|
this.destroyed = true;
|
|
236
|
-
this.unregisterBroadcaster();
|
|
237
215
|
for (const worker of this.workerPool ?? []) {
|
|
238
216
|
worker.destroy();
|
|
239
217
|
}
|
|
@@ -245,13 +223,7 @@ export default class WebWorkerRpcDriver extends BaseRpcDriver {
|
|
|
245
223
|
// workerCount 0 (the config default) means "decide from hardware"
|
|
246
224
|
const workerCount = readConfObject(this.config, 'workerCount') ||
|
|
247
225
|
clamp(detectHardwareConcurrency() - 1, 1, 5);
|
|
248
|
-
|
|
249
|
-
this.unregisterBroadcaster = registerStopTokenBroadcaster(id => {
|
|
250
|
-
for (const worker of pool) {
|
|
251
|
-
worker.notifyStopToken(id);
|
|
252
|
-
}
|
|
253
|
-
});
|
|
254
|
-
return pool;
|
|
226
|
+
return Array.from({ length: workerCount }, () => new LazyWorker(this));
|
|
255
227
|
}
|
|
256
228
|
getWorkerPool() {
|
|
257
229
|
if (this.destroyed) {
|
|
@@ -259,6 +231,18 @@ export default class WebWorkerRpcDriver extends BaseRpcDriver {
|
|
|
259
231
|
}
|
|
260
232
|
return (this.workerPool ??= this.createWorkerPool());
|
|
261
233
|
}
|
|
234
|
+
/**
|
|
235
|
+
* Boot the first worker now rather than on the first call, so its bundle and
|
|
236
|
+
* runtime plugins load while the page builds the session. The first session
|
|
237
|
+
* is assigned to that worker.
|
|
238
|
+
*/
|
|
239
|
+
warmUp() {
|
|
240
|
+
if (!this.destroyed) {
|
|
241
|
+
this.getWorkerPool()[0]
|
|
242
|
+
?.getWorker()
|
|
243
|
+
.catch(() => { });
|
|
244
|
+
}
|
|
245
|
+
}
|
|
262
246
|
async getWorker(sessionId) {
|
|
263
247
|
const workers = this.getWorkerPool();
|
|
264
248
|
let workerNumber = this.workerAssignments.get(sessionId);
|
|
@@ -279,21 +263,24 @@ export default class WebWorkerRpcDriver extends BaseRpcDriver {
|
|
|
279
263
|
* call", so folding at dispatch needed a WeakMap to stop rebuilding a
|
|
280
264
|
* plugin's wrapper per RPC; once per boot has nothing to memoize.
|
|
281
265
|
*/
|
|
266
|
+
extendsWorkers() {
|
|
267
|
+
return (this.pluginManager.extensionPointCallbackCount('Core-extendWorker') > 0);
|
|
268
|
+
}
|
|
282
269
|
extendWorker(worker) {
|
|
283
270
|
return this.pluginManager.evaluateExtensionPoint(
|
|
284
271
|
/** #extensionPoint Core-extendWorker | sync | Take a booted RPC web worker: subscribe to the events it emits, post to it, or wrap its `call`. Fired once per booted worker, not per call */
|
|
285
272
|
'Core-extendWorker', worker);
|
|
286
273
|
}
|
|
287
274
|
// get this session's sticky worker and hand off the already-serialized args
|
|
288
|
-
async transport(sessionId, rpcMethod, serializedArgs,
|
|
275
|
+
async transport(sessionId, rpcMethod, serializedArgs, handles) {
|
|
289
276
|
const worker = await this.getWorker(sessionId);
|
|
290
|
-
return worker.call(rpcMethod.name, serializedArgs,
|
|
277
|
+
return worker.call(rpcMethod.name, serializedArgs, handles);
|
|
291
278
|
}
|
|
292
279
|
/**
|
|
293
280
|
* Boot one worker and run the configuration handshake. Overridable so a test
|
|
294
281
|
* can hand the pool a fake handle without a `Worker`; nothing in the app does.
|
|
295
282
|
*/
|
|
296
|
-
async makeWorker() {
|
|
283
|
+
async makeWorker(onHandle) {
|
|
297
284
|
// one RpcClient per worker so we can do our own state-group-aware load
|
|
298
285
|
// balancing across the pool
|
|
299
286
|
const instance = this.options.makeWorkerInstance();
|
|
@@ -317,6 +304,23 @@ export default class WebWorkerRpcDriver extends BaseRpcDriver {
|
|
|
317
304
|
handle.destroy();
|
|
318
305
|
reject(error);
|
|
319
306
|
};
|
|
307
|
+
// The worker waits in receiveConfiguration(), which has no timeout, so an
|
|
308
|
+
// unclonable boot configuration has to fail the boot rather than leave
|
|
309
|
+
// both sides waiting.
|
|
310
|
+
const sendConfig = () => {
|
|
311
|
+
try {
|
|
312
|
+
const { plugins, windowHref, numberGrouping } = this.options;
|
|
313
|
+
instance.postMessage({
|
|
314
|
+
message: 'config',
|
|
315
|
+
config: { plugins, windowHref, numberGrouping },
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
catch (e) {
|
|
319
|
+
fail(new Error(`could not send the worker its boot configuration`, {
|
|
320
|
+
cause: e,
|
|
321
|
+
}));
|
|
322
|
+
}
|
|
323
|
+
};
|
|
320
324
|
const onMessage = (e) => {
|
|
321
325
|
switch (e.data.message) {
|
|
322
326
|
case 'ready': {
|
|
@@ -325,22 +329,7 @@ export default class WebWorkerRpcDriver extends BaseRpcDriver {
|
|
|
325
329
|
break;
|
|
326
330
|
}
|
|
327
331
|
case 'readyForConfig': {
|
|
328
|
-
|
|
329
|
-
// timeout, and this listener's throw would escape before cleanup or
|
|
330
|
-
// fail could run — so an unclonable boot configuration left both
|
|
331
|
-
// sides waiting forever rather than reporting anything.
|
|
332
|
-
try {
|
|
333
|
-
const { plugins, windowHref, numberGrouping } = this.options;
|
|
334
|
-
instance.postMessage({
|
|
335
|
-
message: 'config',
|
|
336
|
-
config: { plugins, windowHref, numberGrouping },
|
|
337
|
-
});
|
|
338
|
-
}
|
|
339
|
-
catch (e) {
|
|
340
|
-
fail(new Error(`could not send the worker its boot configuration`, {
|
|
341
|
-
cause: e,
|
|
342
|
-
}));
|
|
343
|
-
}
|
|
332
|
+
sendConfig();
|
|
344
333
|
break;
|
|
345
334
|
}
|
|
346
335
|
case 'error': {
|
|
@@ -357,6 +346,13 @@ export default class WebWorkerRpcDriver extends BaseRpcDriver {
|
|
|
357
346
|
};
|
|
358
347
|
instance.addEventListener('message', onMessage);
|
|
359
348
|
instance.addEventListener('error', onError);
|
|
349
|
+
// A dedicated worker holds what it is sent until its script has run, and
|
|
350
|
+
// receiveConfiguration listens from that run, so the config can go now,
|
|
351
|
+
// and a worker created before this driver needs no readyForConfig. It is
|
|
352
|
+
// sent again on readyForConfig for a worker whose startup awaits chunks
|
|
353
|
+
// and so would drop this one; the worker keeps the first.
|
|
354
|
+
sendConfig();
|
|
355
|
+
onHandle?.(handle);
|
|
360
356
|
});
|
|
361
357
|
}
|
|
362
358
|
}
|