@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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ActiveFetch, StatusReporter } from './
|
|
1
|
+
import type { ActiveFetch, StatusReporter, AbortRotation } from './createAbortRotation.ts';
|
|
2
2
|
import type { FetchContext } from './fetchContext.ts';
|
|
3
3
|
import type { FetchPhases } from './fetchPhases.ts';
|
|
4
4
|
import type { IStateTreeNode } from '@jbrowse/mobx-state-tree';
|
|
@@ -23,12 +23,17 @@ export interface FetchLifecycle {
|
|
|
23
23
|
setError: (error?: unknown) => void;
|
|
24
24
|
/**
|
|
25
25
|
* Runs synchronously as the fetch starts, after the rotation has superseded
|
|
26
|
-
* whatever it replaced: the loading flag (`FetchMixin`'s `
|
|
27
|
-
*
|
|
26
|
+
* whatever it replaced: the loading flag (`FetchMixin`'s `activeSignal`,
|
|
27
|
+
* through `fetchMixinLifecycle`), and anything a display blanks
|
|
28
28
|
* because it has no freshness signature to keep stale data honest with
|
|
29
29
|
* (chord's refName map).
|
|
30
|
+
*
|
|
31
|
+
* Takes the signal rather than the whole {@link ActiveFetch}: publishing it is
|
|
32
|
+
* the only thing any implementation does with the fetch, and the guard and
|
|
33
|
+
* the status slot are the skeleton's to hand out — through `ctx`, where a
|
|
34
|
+
* `run` gets them pre-wired.
|
|
30
35
|
*/
|
|
31
|
-
onBegin?: (
|
|
36
|
+
onBegin?: (signal: AbortSignal) => void;
|
|
32
37
|
/**
|
|
33
38
|
* Runs in the `finally`, before the rotation's `end()`. `current` is this
|
|
34
39
|
* run's own guard, already evaluated: a **superseded** run must not clear the
|
|
@@ -50,7 +55,7 @@ export interface FetchLifecycle {
|
|
|
50
55
|
* the loading flag on an abort. The rules only pay for themselves by being the
|
|
51
56
|
* same everywhere, so they live here and the differences are parameters.
|
|
52
57
|
*
|
|
53
|
-
* `active` comes from a {@link
|
|
58
|
+
* `active` comes from a {@link createAbortRotation} `begin()` the caller
|
|
54
59
|
* already made, because who owns the rotation is one of the real differences: a
|
|
55
60
|
* display's *primary* fetch rotates through `FetchMixin`, so `cancelFetch` can
|
|
56
61
|
* reach it, while every other fetch's rotation lives in its installer's closure
|
|
@@ -80,7 +85,7 @@ export interface FetchSkeletonHost extends IStateTreeNode {
|
|
|
80
85
|
reloadCounter: number;
|
|
81
86
|
/**
|
|
82
87
|
* The states where this host deliberately fetches nothing, read only by the
|
|
83
|
-
*
|
|
88
|
+
* retry contract check. A decline there is not a dead Retry.
|
|
84
89
|
*/
|
|
85
90
|
fetchInert: boolean;
|
|
86
91
|
/**
|
|
@@ -97,19 +102,11 @@ export interface FetchSkeletonHost extends IStateTreeNode {
|
|
|
97
102
|
*/
|
|
98
103
|
fetchCanceled?: boolean;
|
|
99
104
|
}
|
|
100
|
-
|
|
105
|
+
interface InstallFetchOptionsBase<TArgs, TResult> extends FetchPhases<TArgs, TResult, FetchContext>, FetchLifecycle {
|
|
101
106
|
/** autorun name, for the MobX devtools/spy stream */
|
|
102
107
|
name: string;
|
|
103
108
|
/** how long to coalesce reruns once the body has started work once */
|
|
104
109
|
delay: number;
|
|
105
|
-
/**
|
|
106
|
-
* Where this fetch's status lands. A display passes itself — its status
|
|
107
|
-
* fields are part of its own API, and one composing `FetchMixin` lends the
|
|
108
|
-
* model-wide window so this fetch takes a slot on the one field beside the
|
|
109
|
-
* display's other operations rather than opening a second writer over it.
|
|
110
|
-
* Anything with one operation to narrate passes a `createStatusChannel`.
|
|
111
|
-
*/
|
|
112
|
-
report: StatusReporter;
|
|
113
110
|
/**
|
|
114
111
|
* An extra skip above `prepare`, reported as `gated` rather than `declined`:
|
|
115
112
|
* the skeleton decided before the family's own gate was consulted, so it is
|
|
@@ -129,7 +126,7 @@ export interface InstallFetchOptions<TArgs, TResult> extends FetchPhases<TArgs,
|
|
|
129
126
|
* also be invalidated by `reload()`, or Retry re-runs the body straight into
|
|
130
127
|
* the same decline and the button is dead. Every layer that has one made
|
|
131
128
|
* that pairing structural in the end — the global family after arc shipped
|
|
132
|
-
* the bug (`GlobalFetchMixin.reload` drops `
|
|
129
|
+
* the bug (`GlobalFetchMixin.reload` drops `loadedFetchKey` in the same
|
|
133
130
|
* action as the bump) — and this is that move for the skeleton: a run whose
|
|
134
131
|
* `reloadCounter` has advanced since the run that last ISSUED a fetch ignores
|
|
135
132
|
* this gate, so nothing has to remember to clear anything. The multi-way
|
|
@@ -145,13 +142,17 @@ export interface InstallFetchOptions<TArgs, TResult> extends FetchPhases<TArgs,
|
|
|
145
142
|
*
|
|
146
143
|
* Omit it where the fetch holds no committed state to compare against — most
|
|
147
144
|
* of them, whose `prepare` returns args unconditionally.
|
|
145
|
+
*
|
|
146
|
+
* A value, compared by `isDataCurrent`: the settings a fetch was issued
|
|
147
|
+
* under go in as the object the worker receives, never as a serialized
|
|
148
|
+
* spelling of it.
|
|
148
149
|
*/
|
|
149
|
-
fetchKey?: (args: TArgs) =>
|
|
150
|
+
fetchKey?: (args: TArgs) => unknown;
|
|
150
151
|
/**
|
|
151
|
-
* The key of the data already committed, when the host keeps one —
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
*
|
|
152
|
+
* The key of the data already committed, when the host keeps one —
|
|
153
|
+
* `KeyedFetchMixin` stamps `loadedFetchKey`, which its `dataCurrent` reads
|
|
154
|
+
* too, so a second stamp would be one more thing to disagree with it.
|
|
155
|
+
* Omitted, the skeleton stamps its own at commit.
|
|
155
156
|
*
|
|
156
157
|
* **Either way the stamp is observable**, and the read is tracked. Zoom A→B
|
|
157
158
|
* issues a fetch for B; zoom back to A before B commits and the re-run
|
|
@@ -159,9 +160,23 @@ export interface InstallFetchOptions<TArgs, TResult> extends FetchPhases<TArgs,
|
|
|
159
160
|
* write is what wakes the autorun to fetch A again. A closure variable would
|
|
160
161
|
* leave data B under viewport A until the next input moved.
|
|
161
162
|
*/
|
|
162
|
-
|
|
163
|
+
loadedKey?: () => unknown;
|
|
164
|
+
/**
|
|
165
|
+
* The predicate form of the freshness gate, for a fetch whose "I have exactly
|
|
166
|
+
* this already" is not key equality: the density tier holds bins over a
|
|
167
|
+
* buffered read and answers a viewport those bins *contain*, which no key can
|
|
168
|
+
* spell. Same rules as `fetchKey` — declined runs report `declined`, and a
|
|
169
|
+
* `reloadCounter` advanced since the last issued fetch overrides it — so the
|
|
170
|
+
* comparison lives here and not in `prepare`, where a reload could not reach
|
|
171
|
+
* it. Runs inside the autorun, so what it reads is tracked: read the
|
|
172
|
+
* committed state off an observable, and the commit that changes the answer
|
|
173
|
+
* wakes the declined run.
|
|
174
|
+
*
|
|
175
|
+
* Either this or `fetchKey`, not both.
|
|
176
|
+
*/
|
|
177
|
+
heldAnswers?: (args: TArgs) => boolean;
|
|
163
178
|
/**
|
|
164
|
-
* Install the two
|
|
179
|
+
* Install the two display-contract checks under this name. Omitted
|
|
165
180
|
* by a **secondary** fetch on a host whose primary foundation already
|
|
166
181
|
* installed them: `assertDisplayContract` would report the second install as
|
|
167
182
|
* the double-attach it is built to catch, and a second retry check would
|
|
@@ -169,26 +184,51 @@ export interface InstallFetchOptions<TArgs, TResult> extends FetchPhases<TArgs,
|
|
|
169
184
|
*/
|
|
170
185
|
contract?: string;
|
|
171
186
|
}
|
|
187
|
+
/**
|
|
188
|
+
* The rotation half is either/or: `report` says where a rotation this installer
|
|
189
|
+
* creates for itself reports, and `rotation` lends the host's own instead — a
|
|
190
|
+
* display composing `FetchMixin` passes its `fetchRotation`, so `cancelFetch`
|
|
191
|
+
* and `cancelFetchByUser` reach the fetch this installs rather than a second
|
|
192
|
+
* rotation they cannot see. A lent rotation already carries its status window,
|
|
193
|
+
* so `report` would be dead beside it — the same either/or `StatusReporter`
|
|
194
|
+
* itself is a union for.
|
|
195
|
+
*/
|
|
196
|
+
export type InstallFetchOptions<TArgs, TResult> = InstallFetchOptionsBase<TArgs, TResult> & ({
|
|
197
|
+
/**
|
|
198
|
+
* Where this fetch's status lands. A display passes itself — its status
|
|
199
|
+
* fields are part of its own API, and one composing `FetchMixin` lends
|
|
200
|
+
* the model-wide window so this fetch takes a slot on the one field
|
|
201
|
+
* beside the display's other operations rather than opening a second
|
|
202
|
+
* writer over it. Anything with one operation to narrate passes a
|
|
203
|
+
* `createStatusChannel`.
|
|
204
|
+
*/
|
|
205
|
+
report: StatusReporter;
|
|
206
|
+
rotation?: never;
|
|
207
|
+
} | {
|
|
208
|
+
/** the host's own latest-wins rotation, lent whole — see above */
|
|
209
|
+
rotation: AbortRotation;
|
|
210
|
+
report?: never;
|
|
211
|
+
});
|
|
172
212
|
/**
|
|
173
213
|
* A whole fetch, installed: the rotation, the leading-edge autorun, the
|
|
174
214
|
* unconditional trigger reads, the gates, and {@link runFetchOnce} under them.
|
|
175
215
|
*
|
|
176
|
-
* Every fetch in the tree is this shape except one — the prerequisite
|
|
177
|
-
* (HiC's header, the multi-sample sample list),
|
|
178
|
-
*
|
|
179
|
-
*
|
|
180
|
-
* the
|
|
181
|
-
*
|
|
182
|
-
*
|
|
183
|
-
*
|
|
184
|
-
*
|
|
216
|
+
* Every fetch in the tree is this shape except one family — the prerequisite
|
|
217
|
+
* reads (HiC's header, the multi-sample sample list), the two keyed families
|
|
218
|
+
* (`installGlobalFetchAutorun` and `installComparativeFetchAutorun`, which lend
|
|
219
|
+
* `FetchMixin`'s rotation through the `rotation` option so `cancelFetch` and
|
|
220
|
+
* the Cancel button reach the fetch they install), the circular view's chord
|
|
221
|
+
* fetch, the breakpoint overlay fetch and the multi-way synteny display's two
|
|
222
|
+
* DEPENDENT fetches (lane genes, lane links, each gated on the key its own
|
|
223
|
+
* commit stamps) all take it. The
|
|
224
|
+
* exception is the per-region family's `FetchMixin.runFetch`: its trigger is
|
|
225
|
+
* `planRegionFetch`'s autorun and its commits stream per region through
|
|
226
|
+
* `ctx.commitRegion`, so it holds `runFetchOnce` directly and the autorun above
|
|
227
|
+
* it is that foundation's.
|
|
185
228
|
*
|
|
186
229
|
* What a caller supplies is exactly what differs between them: which reads wake
|
|
187
230
|
* it (`prepare`, plus `gate`), what a round trip commits, where the loading
|
|
188
231
|
* flag lives (`onBegin` / `onEnd`) and where the status goes (`report`).
|
|
189
|
-
*
|
|
190
|
-
* Returns the rotation's `cancel`, for a family whose model owns the user-facing
|
|
191
|
-
* Cancel button: the flag alone is not a cancel — nothing rotates the token, the
|
|
192
|
-
* stopped RPC stays current, and it commits over the load the user just stopped.
|
|
193
232
|
*/
|
|
194
|
-
export declare function installFetch<TArgs, TResult>(self: FetchSkeletonHost,
|
|
233
|
+
export declare function installFetch<TArgs, TResult>(self: FetchSkeletonHost, opts: InstallFetchOptions<TArgs, TResult>): void;
|
|
234
|
+
export {};
|
package/esm/util/installFetch.js
CHANGED
|
@@ -2,7 +2,7 @@ import { addDisposer, isAlive } from '@jbrowse/mobx-state-tree';
|
|
|
2
2
|
import { observable, runInAction, untracked } from 'mobx';
|
|
3
3
|
import { assertDisplayContract, makeRetryContractCheck, } from '../pluggableElementTypes/models/assertDisplayContract.js';
|
|
4
4
|
import { handleFetchError } from './aborting.js';
|
|
5
|
-
import {
|
|
5
|
+
import { createAbortRotation } from './createAbortRotation.js';
|
|
6
6
|
import { makeFetchContext } from './fetchContext.js';
|
|
7
7
|
import { isDataCurrent } from './isDataCurrent.js';
|
|
8
8
|
import { leadingEdgeAutorun } from './leadingEdgeAutorun.js';
|
|
@@ -18,7 +18,7 @@ import { leadingEdgeAutorun } from './leadingEdgeAutorun.js';
|
|
|
18
18
|
* the loading flag on an abort. The rules only pay for themselves by being the
|
|
19
19
|
* same everywhere, so they live here and the differences are parameters.
|
|
20
20
|
*
|
|
21
|
-
* `active` comes from a {@link
|
|
21
|
+
* `active` comes from a {@link createAbortRotation} `begin()` the caller
|
|
22
22
|
* already made, because who owns the rotation is one of the real differences: a
|
|
23
23
|
* display's *primary* fetch rotates through `FetchMixin`, so `cancelFetch` can
|
|
24
24
|
* reach it, while every other fetch's rotation lives in its installer's closure
|
|
@@ -30,13 +30,13 @@ import { leadingEdgeAutorun } from './leadingEdgeAutorun.js';
|
|
|
30
30
|
* flow, and so an action, which MobX runs untracked already.
|
|
31
31
|
*/
|
|
32
32
|
export async function runFetchOnce(self, active, args, { run, commit, setError, onBegin, onEnd, }) {
|
|
33
|
-
const {
|
|
33
|
+
const { signal, isCurrent, statusCallback, end } = active;
|
|
34
34
|
// synchronous, so it lands while this run is by construction the current one
|
|
35
35
|
setError(undefined);
|
|
36
|
-
onBegin?.(
|
|
36
|
+
onBegin?.(signal);
|
|
37
37
|
try {
|
|
38
38
|
const result = await run(args, makeFetchContext(self, {
|
|
39
|
-
|
|
39
|
+
signal,
|
|
40
40
|
isStale: () => !isCurrent(),
|
|
41
41
|
statusCallback,
|
|
42
42
|
}));
|
|
@@ -52,20 +52,18 @@ export async function runFetchOnce(self, active, args, { run, commit, setError,
|
|
|
52
52
|
finally {
|
|
53
53
|
// Both `onEnd` implementations are MST actions on `self`, and a display
|
|
54
54
|
// destroyed mid-fetch — a track closed, a display type switched out from
|
|
55
|
-
// under a load — still resumes here. `beforeDestroy` already
|
|
56
|
-
//
|
|
55
|
+
// under a load — still resumes here. `beforeDestroy` already aborted the
|
|
56
|
+
// signal, so the bookkeeping is moot on a dead node; calling the action
|
|
57
57
|
// anyway only warns.
|
|
58
58
|
if (isAlive(self)) {
|
|
59
59
|
onEnd?.(isCurrent());
|
|
60
60
|
}
|
|
61
|
-
// last, because it closes the guard `onEnd` reads
|
|
62
|
-
// because a superseded run's status slot goes on voting for a phase that
|
|
63
|
-
// is over until it is retired
|
|
61
|
+
// last, because it closes the guard `onEnd` reads
|
|
64
62
|
end();
|
|
65
63
|
}
|
|
66
64
|
}
|
|
67
65
|
/**
|
|
68
|
-
* The two
|
|
66
|
+
* The two contract checks every fetch installer owes, together because they are
|
|
69
67
|
* the same doctrine: one reports a foundation attached twice, the other reports
|
|
70
68
|
* a `reload()` the gate still declines — the dead Retry button.
|
|
71
69
|
*/
|
|
@@ -73,38 +71,63 @@ function installContractChecks(self, contract) {
|
|
|
73
71
|
assertDisplayContract(self, contract);
|
|
74
72
|
return makeRetryContractCheck(self);
|
|
75
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* The rotation for an installation that was lent none: created here, so
|
|
76
|
+
* disposed here — a lent one is the host's, and resetting its status window
|
|
77
|
+
* would drop a write the host's other operations are still owed.
|
|
78
|
+
*/
|
|
79
|
+
function ownRotation(self, report) {
|
|
80
|
+
const rotation = createAbortRotation(self, report);
|
|
81
|
+
addDisposer(self, () => {
|
|
82
|
+
rotation.dispose();
|
|
83
|
+
});
|
|
84
|
+
return rotation;
|
|
85
|
+
}
|
|
76
86
|
/**
|
|
77
87
|
* A whole fetch, installed: the rotation, the leading-edge autorun, the
|
|
78
88
|
* unconditional trigger reads, the gates, and {@link runFetchOnce} under them.
|
|
79
89
|
*
|
|
80
|
-
* Every fetch in the tree is this shape except one — the prerequisite
|
|
81
|
-
* (HiC's header, the multi-sample sample list),
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
* the
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
90
|
+
* Every fetch in the tree is this shape except one family — the prerequisite
|
|
91
|
+
* reads (HiC's header, the multi-sample sample list), the two keyed families
|
|
92
|
+
* (`installGlobalFetchAutorun` and `installComparativeFetchAutorun`, which lend
|
|
93
|
+
* `FetchMixin`'s rotation through the `rotation` option so `cancelFetch` and
|
|
94
|
+
* the Cancel button reach the fetch they install), the circular view's chord
|
|
95
|
+
* fetch, the breakpoint overlay fetch and the multi-way synteny display's two
|
|
96
|
+
* DEPENDENT fetches (lane genes, lane links, each gated on the key its own
|
|
97
|
+
* commit stamps) all take it. The
|
|
98
|
+
* exception is the per-region family's `FetchMixin.runFetch`: its trigger is
|
|
99
|
+
* `planRegionFetch`'s autorun and its commits stream per region through
|
|
100
|
+
* `ctx.commitRegion`, so it holds `runFetchOnce` directly and the autorun above
|
|
101
|
+
* it is that foundation's.
|
|
89
102
|
*
|
|
90
103
|
* What a caller supplies is exactly what differs between them: which reads wake
|
|
91
104
|
* it (`prepare`, plus `gate`), what a round trip commits, where the loading
|
|
92
105
|
* flag lives (`onBegin` / `onEnd`) and where the status goes (`report`).
|
|
93
|
-
*
|
|
94
|
-
* Returns the rotation's `cancel`, for a family whose model owns the user-facing
|
|
95
|
-
* Cancel button: the flag alone is not a cancel — nothing rotates the token, the
|
|
96
|
-
* stopped RPC stays current, and it commits over the load the user just stopped.
|
|
97
106
|
*/
|
|
98
|
-
export function installFetch(self,
|
|
107
|
+
export function installFetch(self, opts) {
|
|
108
|
+
const { name, delay, gate, contract, fetchKey, loadedKey, heldAnswers, prepare, run, commit, setError, onBegin, onEnd, } = opts;
|
|
99
109
|
const noteFetchAutorunRun = contract === undefined ? undefined : installContractChecks(self, contract);
|
|
100
|
-
const
|
|
110
|
+
const lent = opts.rotation;
|
|
111
|
+
const rotation = lent === undefined ? ownRotation(self, opts.report) : lent;
|
|
101
112
|
// The `reloadCounter` this installation last issued a fetch at. Per
|
|
102
113
|
// installation and per instance, so a host with several fetches gives each its
|
|
103
114
|
// own — and a closure rather than model state, because nothing outside reads
|
|
104
115
|
// it and a volatile would be one more thing a host has to declare.
|
|
105
116
|
let issuedEpoch;
|
|
106
|
-
|
|
107
|
-
|
|
117
|
+
// The skeleton's own stamp exists only where there is a key to stamp — a
|
|
118
|
+
// fetch with no `fetchKey` never reads it, so allocating one would only feed
|
|
119
|
+
// it `undefined` on every commit. Shallow, because the deep enhancer would
|
|
120
|
+
// swap a stamped key object for an observable copy of it.
|
|
121
|
+
const stamp = loadedKey === undefined && fetchKey !== undefined
|
|
122
|
+
? observable.box(undefined, { deep: false })
|
|
123
|
+
: undefined;
|
|
124
|
+
const heldKey = loadedKey ?? (() => stamp?.get());
|
|
125
|
+
// the freshness gate in whichever form the caller declared it
|
|
126
|
+
const held = heldAnswers !== undefined
|
|
127
|
+
? heldAnswers
|
|
128
|
+
: fetchKey !== undefined
|
|
129
|
+
? (args) => isDataCurrent(heldKey(), fetchKey(args))
|
|
130
|
+
: undefined;
|
|
108
131
|
const commitAndStamp = stamp
|
|
109
132
|
? (result, args) => {
|
|
110
133
|
runInAction(() => {
|
|
@@ -113,9 +136,6 @@ export function installFetch(self, { name, delay, report, gate, contract, fetchK
|
|
|
113
136
|
});
|
|
114
137
|
}
|
|
115
138
|
: commit;
|
|
116
|
-
addDisposer(self, () => {
|
|
117
|
-
rotation.dispose();
|
|
118
|
-
});
|
|
119
139
|
leadingEdgeAutorun(self,
|
|
120
140
|
// #region voidTracking
|
|
121
141
|
() => {
|
|
@@ -128,13 +148,23 @@ export function installFetch(self, { name, delay, report, gate, contract, fetchK
|
|
|
128
148
|
// Cancel would be a one-way door with a Retry button on it. Order, not
|
|
129
149
|
// just position: counter first, then this, then the gates.
|
|
130
150
|
const canceled = self.fetchCanceled === true;
|
|
151
|
+
// Above the gate, not only above `prepare`: teardown mutates the
|
|
152
|
+
// observables this body reads before the disposers run, and every `gate`
|
|
153
|
+
// but the breakpoint view's reaches the containing view or track through a
|
|
154
|
+
// parent walk (`host.initialized`, `isMinimized`, `getContainingView`),
|
|
155
|
+
// which throws once the node has left the tree. This catches the destroyed
|
|
156
|
+
// node; the detached-and-still-alive window (ADR-069) is covered only by
|
|
157
|
+
// the walk's own cache. Nothing is reported for a dead node — there is no
|
|
158
|
+
// Retry button left to be dead, and the check would read three more
|
|
159
|
+
// members of a corpse to decide it.
|
|
160
|
+
if (!isAlive(self)) {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
131
163
|
if (canceled || gate?.() === false) {
|
|
132
164
|
noteFetchAutorunRun?.('gated');
|
|
133
165
|
return false;
|
|
134
166
|
}
|
|
135
|
-
|
|
136
|
-
// and getContainingView on a detached node warns then throws.
|
|
137
|
-
const args = isAlive(self) ? prepare() : undefined;
|
|
167
|
+
const args = prepare();
|
|
138
168
|
if (args === undefined) {
|
|
139
169
|
noteFetchAutorunRun?.('declined');
|
|
140
170
|
return false;
|
|
@@ -145,9 +175,7 @@ export function installFetch(self, { name, delay, report, gate, contract, fetchK
|
|
|
145
175
|
// consuming the retry here costs nothing — while a reload landing
|
|
146
176
|
// mid-flight is answered by the re-run the counter read above already
|
|
147
177
|
// guarantees.
|
|
148
|
-
if (
|
|
149
|
-
isDataCurrent(heldKey(), fetchKey(args)) &&
|
|
150
|
-
reloadEpoch === issuedEpoch) {
|
|
178
|
+
if (held !== undefined && held(args) && reloadEpoch === issuedEpoch) {
|
|
151
179
|
noteFetchAutorunRun?.('declined');
|
|
152
180
|
return false;
|
|
153
181
|
}
|
|
@@ -174,5 +202,4 @@ export function installFetch(self, { name, delay, report, gate, contract, fetchK
|
|
|
174
202
|
},
|
|
175
203
|
// #endregion
|
|
176
204
|
{ name, delay });
|
|
177
|
-
return rotation.cancel;
|
|
178
205
|
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import type { IStateTreeNode } from '@jbrowse/mobx-state-tree';
|
|
2
2
|
interface InitAutorunHost<T> extends IStateTreeNode {
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
pendingLaunch?: T;
|
|
4
|
+
setLaunch: (launch?: T) => void;
|
|
5
5
|
setError: (error: unknown) => void;
|
|
6
6
|
}
|
|
7
7
|
export interface InitApplyContext {
|
|
8
8
|
/**
|
|
9
9
|
* True once this init can no longer be the one being applied: the node is
|
|
10
|
-
* gone, or a newer `
|
|
10
|
+
* gone, or a newer `setLaunch` has replaced it. Any mid-apply wait that can
|
|
11
11
|
* park indefinitely must fold this into its condition — an unbounded wait on
|
|
12
12
|
* state that never arrives holds the drain open, and the newer init that
|
|
13
13
|
* would have superseded it is exactly what gets stranded. This is the causal
|
|
@@ -26,35 +26,36 @@ interface InitAutorunOptions<T> {
|
|
|
26
26
|
*/
|
|
27
27
|
ready: () => boolean;
|
|
28
28
|
/**
|
|
29
|
-
* Whether the view has materialized — the
|
|
30
|
-
*
|
|
31
|
-
* synteny: rows built). Decides the failure policy, see
|
|
29
|
+
* Whether the view has materialized — the line `withLaunchInput`'s
|
|
30
|
+
* `materialized` draws for persistence, read from the live node (dotplot:
|
|
31
|
+
* assemblyNames set; synteny: rows built). Decides the failure policy, see
|
|
32
|
+
* below.
|
|
32
33
|
*/
|
|
33
34
|
materialized: () => boolean;
|
|
34
35
|
/** Apply one init blob. Owns the ordered steps; never clears `init`. */
|
|
35
36
|
apply: (init: T, ctx: InitApplyContext) => Promise<void>;
|
|
36
37
|
}
|
|
37
38
|
/**
|
|
38
|
-
* The
|
|
39
|
+
* The launch state machine shared by the views that take a declarative launch
|
|
39
40
|
* blob (LinearGenomeView, DotplotView, LinearSyntenyView): the re-entry guard,
|
|
40
41
|
* the readiness gate, the serialized drain, the identity-checked clear, the
|
|
41
42
|
* isAlive guards, and one failure policy.
|
|
42
43
|
*
|
|
43
|
-
* The failure policy keys off `materialized`, the same line
|
|
44
|
-
*
|
|
44
|
+
* The failure policy keys off `materialized`, the same line `withLaunchInput`
|
|
45
|
+
* draws for persistence:
|
|
45
46
|
*
|
|
46
|
-
* - Not materialized — nothing is on screen and `
|
|
47
|
+
* - Not materialized — nothing is on screen and `launch` is still persisted, so
|
|
47
48
|
* keep it for a reload retry and `setError`. That flips the view onto its
|
|
48
49
|
* import form, which renders the error in its own banner; a snackbar would
|
|
49
50
|
* state the same failure twice and the banner is the one that persists.
|
|
50
51
|
* - Materialized — the view works, so a later failure is one sub-step's
|
|
51
52
|
* problem and must not take the view down with it. `setError` would, since
|
|
52
53
|
* showImportForm keys off `error` alone and would discard rows that loaded
|
|
53
|
-
* fine, so report it as a snackbar instead. Clearing `
|
|
54
|
+
* fine, so report it as a snackbar instead. Clearing `launch` is also what
|
|
54
55
|
* disarms the re-fire: `ready` usually folds in the measured width, so
|
|
55
|
-
* leaving it set lets any resize re-run `apply` over a half-applied
|
|
56
|
+
* leaving it set lets any resize re-run `apply` over a half-applied blob.
|
|
56
57
|
*
|
|
57
|
-
* `apply` therefore never clears `
|
|
58
|
+
* `apply` therefore never clears `launch` and never catches for reporting — it
|
|
58
59
|
* catches only the failures it wants to keep going through (a bad locstring in
|
|
59
60
|
* one row), and everything it lets escape is fatal-as-of-that-point.
|
|
60
61
|
*/
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import { addDisposer, isAlive } from '@jbrowse/mobx-state-tree';
|
|
2
2
|
import { autorun } from 'mobx';
|
|
3
3
|
import { getNotificationSink } from './sessionServices.js';
|
|
4
|
-
// Clear only when
|
|
5
|
-
// lands while `apply` is awaiting (React StrictMode remounts, a
|
|
6
|
-
// re-launch) swaps in a new object; clearing unconditionally would
|
|
7
|
-
// drop
|
|
4
|
+
// Clear only when the pending blob is still the exact object we applied. A
|
|
5
|
+
// setLaunch that lands while `apply` is awaiting (React StrictMode remounts, a
|
|
6
|
+
// programmatic re-launch) swaps in a new object; clearing unconditionally would
|
|
7
|
+
// silently drop it. Leaving it lets the drain loop apply it next.
|
|
8
8
|
function clearIfUnchanged(self, init) {
|
|
9
|
-
if (isAlive(self) && self.
|
|
10
|
-
self.
|
|
9
|
+
if (isAlive(self) && self.pendingLaunch === init) {
|
|
10
|
+
self.setLaunch(undefined);
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
async function applyInitOnce(self, init, { apply, materialized }) {
|
|
14
14
|
try {
|
|
15
15
|
await apply(init, {
|
|
16
|
-
superseded: () => !isAlive(self) || self.
|
|
16
|
+
superseded: () => !isAlive(self) || self.pendingLaunch !== init,
|
|
17
17
|
});
|
|
18
18
|
clearIfUnchanged(self, init);
|
|
19
19
|
}
|
|
@@ -34,7 +34,7 @@ async function applyInitOnce(self, init, { apply, materialized }) {
|
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
function currentInit(self, { ready }) {
|
|
37
|
-
return isAlive(self) && ready() ? self.
|
|
37
|
+
return isAlive(self) && ready() ? self.pendingLaunch : undefined;
|
|
38
38
|
}
|
|
39
39
|
// Apply pending inits one at a time until none remain. Serializing (rather
|
|
40
40
|
// than letting the autorun run `apply` concurrently) is what keeps re-entrant
|
|
@@ -47,32 +47,32 @@ async function drainInit(self, opts) {
|
|
|
47
47
|
while (pending !== undefined) {
|
|
48
48
|
await applyInitOnce(self, pending, opts);
|
|
49
49
|
const next = currentInit(self, opts);
|
|
50
|
-
// a fatal failure keeps `
|
|
50
|
+
// a fatal failure keeps `launch` for a reload retry; the same object still
|
|
51
51
|
// sitting there means it was not consumed, so stop rather than spin on it
|
|
52
52
|
pending = next === pending ? undefined : next;
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
/**
|
|
56
|
-
* The
|
|
56
|
+
* The launch state machine shared by the views that take a declarative launch
|
|
57
57
|
* blob (LinearGenomeView, DotplotView, LinearSyntenyView): the re-entry guard,
|
|
58
58
|
* the readiness gate, the serialized drain, the identity-checked clear, the
|
|
59
59
|
* isAlive guards, and one failure policy.
|
|
60
60
|
*
|
|
61
|
-
* The failure policy keys off `materialized`, the same line
|
|
62
|
-
*
|
|
61
|
+
* The failure policy keys off `materialized`, the same line `withLaunchInput`
|
|
62
|
+
* draws for persistence:
|
|
63
63
|
*
|
|
64
|
-
* - Not materialized — nothing is on screen and `
|
|
64
|
+
* - Not materialized — nothing is on screen and `launch` is still persisted, so
|
|
65
65
|
* keep it for a reload retry and `setError`. That flips the view onto its
|
|
66
66
|
* import form, which renders the error in its own banner; a snackbar would
|
|
67
67
|
* state the same failure twice and the banner is the one that persists.
|
|
68
68
|
* - Materialized — the view works, so a later failure is one sub-step's
|
|
69
69
|
* problem and must not take the view down with it. `setError` would, since
|
|
70
70
|
* showImportForm keys off `error` alone and would discard rows that loaded
|
|
71
|
-
* fine, so report it as a snackbar instead. Clearing `
|
|
71
|
+
* fine, so report it as a snackbar instead. Clearing `launch` is also what
|
|
72
72
|
* disarms the re-fire: `ready` usually folds in the measured width, so
|
|
73
|
-
* leaving it set lets any resize re-run `apply` over a half-applied
|
|
73
|
+
* leaving it set lets any resize re-run `apply` over a half-applied blob.
|
|
74
74
|
*
|
|
75
|
-
* `apply` therefore never clears `
|
|
75
|
+
* `apply` therefore never clears `launch` and never catches for reporting — it
|
|
76
76
|
* catches only the failures it wants to keep going through (a bad locstring in
|
|
77
77
|
* one row), and everything it lets escape is fatal-as-of-that-point.
|
|
78
78
|
*/
|
|
@@ -93,7 +93,7 @@ export function installInitAutorun(self, opts) {
|
|
|
93
93
|
// reading a detached node throws — here into an unawaited promise.
|
|
94
94
|
const alive = isAlive(self);
|
|
95
95
|
const isReady = alive && opts.ready();
|
|
96
|
-
const init = alive ? self.
|
|
96
|
+
const init = alive ? self.pendingLaunch : undefined;
|
|
97
97
|
if (isReady && init !== undefined && !draining) {
|
|
98
98
|
draining = true;
|
|
99
99
|
try {
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import type { StatusReporter } from './createAbortRotation.ts';
|
|
2
|
+
import type { FetchContext } from './fetchContext.ts';
|
|
3
|
+
import type { FetchSkeletonHost } from './installFetch.ts';
|
|
4
|
+
/**
|
|
5
|
+
* What a prerequisite read needs of the display it runs on, beside the
|
|
6
|
+
* skeleton's own three. Duck-typed rather than a foundation's `Instance` type,
|
|
7
|
+
* because the hosts compose different foundations — one per fetch family, and
|
|
8
|
+
* the comparative displays compose none of them — and this is the only thing
|
|
9
|
+
* they have in common.
|
|
10
|
+
*/
|
|
11
|
+
export interface PrerequisiteFetchHost extends FetchSkeletonHost {
|
|
12
|
+
/**
|
|
13
|
+
* Read in `prepare`, so it is **tracked**: an adapter edited in the config
|
|
14
|
+
* editor has to re-read, and `run`'s own reads are untracked by contract.
|
|
15
|
+
*/
|
|
16
|
+
adapterConfig: Record<string, unknown>;
|
|
17
|
+
isMinimized: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* A prerequisite read's answer, stamped with the adapter config it answers.
|
|
21
|
+
* A display holds the latest one and reads it through `readFor`, so an answer
|
|
22
|
+
* never outlives its adapter config and no failure path has to clear it.
|
|
23
|
+
*/
|
|
24
|
+
export interface AdapterRead<T> {
|
|
25
|
+
adapterConfig: Record<string, unknown>;
|
|
26
|
+
value: T;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* `read`'s value while it answers the adapter config `host` holds; undefined
|
|
30
|
+
* until a read of that config commits, which a failed read never does.
|
|
31
|
+
*
|
|
32
|
+
* Equal by value, as the fetch key is: an undo rebuilds the track's config,
|
|
33
|
+
* handing back an equal adapter config the fetch declines to read again.
|
|
34
|
+
*/
|
|
35
|
+
export declare function readFor<T>(host: {
|
|
36
|
+
adapterConfig: Record<string, unknown>;
|
|
37
|
+
}, read: AdapterRead<T> | undefined): T | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* A **prerequisite read**: one RPC about the adapter itself, beside the
|
|
40
|
+
* display's primary fetch. Four in the tree — HiC's `CoreGetInfo` header read,
|
|
41
|
+
* whose `resolutions` every contacts fetch waits on; the multi-sample sample
|
|
42
|
+
* list, which `fetchNeeded` declines until; the tiered alignment file's
|
|
43
|
+
* `CoreGetInfo` header, which decides the LOD tier a synteny fetch asks for;
|
|
44
|
+
* and the mark display's source list, which gives each listed source a row —
|
|
45
|
+
* and they sit on three different fetch foundations, which is why this sits in
|
|
46
|
+
* core beside the skeleton and not beside any of them.
|
|
47
|
+
*
|
|
48
|
+
* They had the shape below hand-copied, comment for comment, and each term is a
|
|
49
|
+
* rule rather than a preference:
|
|
50
|
+
*
|
|
51
|
+
* - **the adapter config is the whole trigger and the whole key.** Tracked in
|
|
52
|
+
* `prepare` so a config-editor edit re-reads; keyed on the same value so an
|
|
53
|
+
* un-minimize over the same file re-reads nothing. Getting one without the
|
|
54
|
+
* other gives either a stale header or a walk of a `.hic` norm-vector index on
|
|
55
|
+
* every expand.
|
|
56
|
+
* - **the answer carries the same key** (`AdapterRead`), and a display reads
|
|
57
|
+
* it through `readFor`, so an answer to a previous adapter config is never
|
|
58
|
+
* read as the current one, and a failed read leaves nothing to clear.
|
|
59
|
+
* - **an answer to a config the display no longer holds is dropped**, and so is
|
|
60
|
+
* its error. An undo that brings back the config already answered makes the
|
|
61
|
+
* skeleton decline a re-read, while the read of the abandoned config runs
|
|
62
|
+
* on, still current; landing, it would stamp its key, force a second read of
|
|
63
|
+
* the held one and hand the display a list for another file, on which the
|
|
64
|
+
* variant display resets its arrangement.
|
|
65
|
+
* - **minimized is the gate**, and a display with a second condition of its own
|
|
66
|
+
* passes `gate` — the sample-list read waits for the LGV to be measured as
|
|
67
|
+
* well, so a full-file scan does not start ahead of the display's own first
|
|
68
|
+
* fetch, and the tier read waits on the track declaring a tier threshold at
|
|
69
|
+
* all.
|
|
70
|
+
* - **no `contract`.** This is the second fetch on a display whose foundation
|
|
71
|
+
* installed both checks already: `assertDisplayContract` would report the
|
|
72
|
+
* double-attach it exists to catch, and a second retry check would consume the
|
|
73
|
+
* same `reloadCounter` bumps as the first.
|
|
74
|
+
* - **where the status goes is the caller's** (`report`). The two LGV reads
|
|
75
|
+
* lend the display's own status window, so the read takes a slot beside the
|
|
76
|
+
* primary fetch rather than opening a second writer over the one status field
|
|
77
|
+
* (ADR-081) — and it matters more here than for most fetches: a prerequisite
|
|
78
|
+
* runs inside the pre-first-paint window, where the scrim is up because
|
|
79
|
+
* nothing is drawn rather than because `isLoading` is, so `statusMessage` is
|
|
80
|
+
* the only thing that can say what is happening. The tier read narrates
|
|
81
|
+
* nothing; a header is not a load.
|
|
82
|
+
*
|
|
83
|
+
* `createAdapterMetadataFetch` keys on the same adapter config and is
|
|
84
|
+
* deliberately NOT one of these: no trigger, no signal and no status,
|
|
85
|
+
* because it is fetched lazily when a details widget opens and the widget opens
|
|
86
|
+
* on the result. A prerequisite read is the one a display's own fetch waits on.
|
|
87
|
+
*
|
|
88
|
+
* **A declaration, not the skeleton this name used to be.** There was an
|
|
89
|
+
* `installPrerequisiteFetch` until 2026-08-23, and `3c5aa7fce2` deleted it for
|
|
90
|
+
* a good reason: it carried a `runOne` of its own — a fifth copy of begin →
|
|
91
|
+
* clear → run → commit-if-current → `handleFetchError` → end — and once
|
|
92
|
+
* `installFetch` owned that sequence, a second one was pure drift surface. This
|
|
93
|
+
* one adds no sequence, no rotation and no error rule; it is terms handed to
|
|
94
|
+
* `installFetch`, the same shape `installGlobalFetchAutorun` and
|
|
95
|
+
* `installComparativeFetchAutorun` are. Add nothing here that a family could
|
|
96
|
+
* not state as an option to the skeleton.
|
|
97
|
+
*
|
|
98
|
+
* Everything the skeleton gives it is the point of going through the skeleton:
|
|
99
|
+
* the latest-wins rotation (so a superseding read aborts the one it replaced,
|
|
100
|
+
* and only a superseding read does — a user cancel of the primary fetch cannot
|
|
101
|
+
* strand the display the way sharing its signal would), the clear at the start,
|
|
102
|
+
* the currency-guarded error rule, the unconditional `reloadCounter` read that
|
|
103
|
+
* makes the chrome's Retry re-run this, and the retired status slot that keeps a
|
|
104
|
+
* failed read from leaving a progress chip up for good.
|
|
105
|
+
*/
|
|
106
|
+
export declare function installPrerequisiteFetch<TResult>(self: PrerequisiteFetchHost, { name, delay, report, gate, run, commit, setError, }: {
|
|
107
|
+
name: string;
|
|
108
|
+
delay: number;
|
|
109
|
+
report: StatusReporter;
|
|
110
|
+
/** an extra term of the display's own, ANDed under `!isMinimized` */
|
|
111
|
+
gate?: () => boolean;
|
|
112
|
+
run: (adapterConfig: Record<string, unknown>, ctx: FetchContext) => Promise<TResult | undefined>;
|
|
113
|
+
commit: (read: AdapterRead<TResult>) => void;
|
|
114
|
+
setError: (error?: unknown) => void;
|
|
115
|
+
}): void;
|