@jbrowse/core 4.3.0 → 5.0.0-beta.2
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 +822 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +13 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +33 -22
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +8 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +117 -19
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseAttributes.d.ts +2 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseAttributes.js +4 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +2 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCoreDetails.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCoreDetails.js +4 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +12 -5
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +28 -17
- package/esm/BaseFeatureWidget/BaseFeatureDetail/DataGridDetails.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/DataGridDetails.js +19 -40
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +6 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +46 -30
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureWash.d.ts +20 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureWash.js +66 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldName.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldName.js +2 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.d.ts +3 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +17 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +3 -9
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +3 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/UriField.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/UriField.js +7 -14
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +2 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +19 -13
- package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +5 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +8 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +32 -10
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceBody.d.ts +18 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceBody.js +10 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.d.ts +7 -4
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +62 -24
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.d.ts +10 -5
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.js +64 -41
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +1 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.js +17 -8
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceLegend.d.ts +6 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceLegend.js +19 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.d.ts +5 -4
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.js +15 -18
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequencePanel.d.ts +1 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequencePanel.js +33 -17
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/consts.d.ts +3 -3
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/consts.js +7 -3
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/FeatureSequenceDialog.d.ts +11 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/FeatureSequenceDialog.js +29 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/HelpDialog.d.ts +1 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/HelpDialog.js +4 -6
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceDialog.d.ts +18 -6
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceDialog.js +11 -29
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceFeatureMenu.d.ts +9 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceFeatureMenu.js +63 -58
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceTypeSelector.d.ts +7 -3
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceTypeSelector.js +38 -51
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SettingsDialog.d.ts +1 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SettingsDialog.js +19 -27
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.d.ts +6 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +18 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/featureTypeUtil.d.ts +12 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/featureTypeUtil.js +97 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/index.js +1 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +50 -63
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +62 -59
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/panelAssemblyName.d.ts +21 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/panelAssemblyName.js +24 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/CDNASequence.d.ts +5 -3
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/CDNASequence.js +93 -75
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/CDSSequence.d.ts +1 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/CDSSequence.js +4 -11
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/GenomicSequence.d.ts +5 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/GenomicSequence.js +21 -48
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/PlainSequence.d.ts +8 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/PlainSequence.js +20 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/ProteinSequence.d.ts +6 -3
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/ProteinSequence.js +33 -13
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/SequenceDisplay.d.ts +7 -4
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/SequenceDisplay.js +67 -11
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/renderSequenceSegments.d.ts +14 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/renderSequenceSegments.js +42 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +1 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +7 -7
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/types.d.ts +8 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceData.d.ts +9 -9
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceData.js +28 -44
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceFetch.d.ts +23 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceFetch.js +31 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/util.d.ts +90 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/util.js +145 -23
- package/esm/BaseFeatureWidget/configSchema.js +1 -1
- package/esm/BaseFeatureWidget/formatDetails.d.ts +38 -0
- package/esm/BaseFeatureWidget/formatDetails.js +103 -0
- package/esm/BaseFeatureWidget/index.d.ts +3 -1
- package/esm/BaseFeatureWidget/index.js +2 -2
- package/esm/BaseFeatureWidget/stateModelFactory.d.ts +80 -62
- package/esm/BaseFeatureWidget/stateModelFactory.js +128 -29
- package/esm/BaseFeatureWidget/types.d.ts +4 -3
- package/esm/BaseFeatureWidget/util.d.ts +4 -29
- package/esm/BaseFeatureWidget/util.js +20 -84
- package/esm/CorePlugin.js +11 -6
- package/esm/PhasedScheduler.d.ts +4 -2
- package/esm/PhasedScheduler.js +18 -2
- package/esm/Plugin.d.ts +6 -1
- package/esm/Plugin.js +7 -0
- package/esm/PluginLoader.d.ts +41 -40
- package/esm/PluginLoader.js +206 -78
- package/esm/PluginManager.d.ts +421 -55
- package/esm/PluginManager.js +461 -89
- package/esm/ReExports/BaseFeatureDetails.js +7 -6
- package/esm/ReExports/MuiDataGridReExports.d.ts +2 -2
- package/esm/ReExports/MuiDataGridReExports.js +58 -130
- package/esm/ReExports/MuiReExports.d.ts +3 -134
- package/esm/ReExports/MuiReExports.js +43 -16
- package/esm/ReExports/MuiStylesReExports.d.ts +66 -0
- package/esm/ReExports/MuiStylesReExports.js +55 -0
- package/esm/ReExports/index.js +1 -1
- package/esm/ReExports/lazify.d.ts +2 -2
- package/esm/ReExports/lazify.js +16 -3
- package/esm/ReExports/list.js +54 -229
- package/esm/ReExports/modules.js +62 -93
- package/esm/ReExports/muiComponentNames.d.ts +18 -0
- package/esm/ReExports/muiComponentNames.js +130 -0
- package/esm/ReExports/publicUtil.d.ts +1 -0
- package/esm/ReExports/publicUtil.js +28 -0
- package/esm/ReExports/registry.d.ts +2 -0
- package/esm/ReExports/registry.js +28 -0
- package/esm/ReExports/sharedModules.d.ts +96 -0
- package/esm/ReExports/sharedModules.js +59 -0
- package/esm/ReExports/uiStub.d.ts +1 -0
- package/esm/ReExports/uiStub.js +13 -0
- package/esm/ReExports/workerModules.d.ts +2 -0
- package/esm/ReExports/workerModules.js +10 -0
- package/esm/TextSearch/BaseResults.d.ts +20 -21
- package/esm/TextSearch/BaseResults.js +8 -33
- package/esm/TextSearch/TextSearchManager.d.ts +14 -34
- package/esm/TextSearch/TextSearchManager.js +87 -34
- package/esm/assemblyManager/assembly.d.ts +307 -34
- package/esm/assemblyManager/assembly.js +551 -262
- package/esm/assemblyManager/assemblyAdapters.d.ts +12 -0
- package/esm/assemblyManager/assemblyAdapters.js +18 -0
- package/esm/assemblyManager/assemblyConfigSchema.d.ts +192 -17
- package/esm/assemblyManager/assemblyConfigSchema.js +213 -19
- package/esm/assemblyManager/assemblyManager.d.ts +711 -303
- package/esm/assemblyManager/assemblyManager.js +351 -46
- package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +32 -0
- package/esm/assemblyManager/expandAssemblyConfigShorthand.js +85 -0
- package/esm/assemblyManager/geneticCodes.d.ts +21 -0
- package/esm/assemblyManager/geneticCodes.js +47 -0
- package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +9 -0
- package/esm/assemblyManager/getSequenceAdapterConfig.js +12 -0
- package/esm/assemblyManager/index.d.ts +1 -1
- package/esm/assemblyManager/index.js +2 -2
- package/esm/assemblyManager/loadRefNameMap.d.ts +5 -0
- package/esm/assemblyManager/loadRefNameMap.js +80 -0
- package/esm/assemblyManager/refNameColors.d.ts +1 -0
- package/esm/assemblyManager/refNameColors.js +32 -0
- package/esm/assemblyManager/refNameMaps.d.ts +26 -0
- package/esm/assemblyManager/refNameMaps.js +87 -0
- package/esm/assemblyManager/refNameMismatch.d.ts +54 -0
- package/esm/assemblyManager/refNameMismatch.js +66 -0
- package/esm/checkPlugins.d.ts +11 -0
- package/esm/checkPlugins.js +77 -0
- package/esm/configuration/configurationSchema.d.ts +122 -20
- package/esm/configuration/configurationSchema.js +374 -140
- package/esm/configuration/configurationSlot.d.ts +283 -30
- package/esm/configuration/configurationSlot.js +205 -226
- package/esm/configuration/formatAboutConfigSchema.d.ts +55 -0
- package/esm/configuration/formatAboutConfigSchema.js +58 -0
- package/esm/configuration/formatDetailsConfigSchema.d.ts +80 -0
- package/esm/configuration/formatDetailsConfigSchema.js +90 -0
- package/esm/configuration/fullConfSnapshot.d.ts +28 -0
- package/esm/configuration/fullConfSnapshot.js +66 -0
- package/esm/configuration/getConf.d.ts +88 -0
- package/esm/configuration/getConf.js +74 -0
- package/esm/configuration/index.d.ts +19 -3
- package/esm/configuration/index.js +19 -2
- package/esm/configuration/mergeFormatCallbacks.d.ts +15 -0
- package/esm/configuration/mergeFormatCallbacks.js +24 -0
- package/esm/configuration/promotableDefaults.d.ts +199 -0
- package/esm/configuration/promotableDefaults.js +332 -0
- package/esm/configuration/promotablePin.d.ts +55 -0
- package/esm/configuration/promotableResolve.d.ts +108 -0
- package/esm/configuration/promotableResolve.js +117 -0
- package/esm/configuration/promotableSlots.d.ts +12 -0
- package/esm/configuration/promotableSlots.js +45 -0
- package/esm/configuration/readConfObject.d.ts +56 -0
- package/esm/configuration/readConfObject.js +161 -0
- package/esm/configuration/schemaRegistry.d.ts +35 -0
- package/esm/configuration/schemaRegistry.js +50 -0
- package/esm/configuration/schemaTypes.d.ts +23 -0
- package/esm/configuration/schemaTypes.js +94 -0
- package/esm/configuration/slotFacade.d.ts +82 -0
- package/esm/configuration/slotFacade.js +89 -0
- package/esm/configuration/slotShape.d.ts +12 -0
- package/esm/configuration/slotShape.js +84 -0
- package/esm/configuration/slotValueUtils.d.ts +17 -0
- package/esm/configuration/slotValueUtils.js +25 -0
- package/esm/configuration/tabixIndexFields.d.ts +44 -0
- package/esm/configuration/tabixIndexFields.js +45 -0
- package/esm/configuration/tabixShorthand.d.ts +34 -0
- package/esm/configuration/tabixShorthand.js +45 -0
- package/esm/configuration/types.d.ts +170 -7
- package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +24 -10
- package/esm/data_adapters/BaseAdapter/BaseAdapter.js +23 -15
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +132 -7
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +136 -25
- package/esm/data_adapters/BaseAdapter/BaseRefNameAliasAdapter.d.ts +1 -0
- package/esm/data_adapters/BaseAdapter/BaseSequenceAdapter.d.ts +13 -5
- package/esm/data_adapters/BaseAdapter/BaseSequenceAdapter.js +9 -7
- package/esm/data_adapters/BaseAdapter/BaseTextSearchAdapter.d.ts +2 -1
- package/esm/data_adapters/BaseAdapter/CytobandAdapter.d.ts +7 -0
- package/esm/data_adapters/BaseAdapter/RegionsAdapter.d.ts +2 -1
- package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +29 -0
- package/esm/data_adapters/BaseAdapter/featureDensity.js +17 -0
- package/esm/data_adapters/BaseAdapter/getAdapterId.d.ts +2 -0
- package/esm/data_adapters/BaseAdapter/getAdapterId.js +9 -0
- package/esm/data_adapters/BaseAdapter/index.d.ts +7 -4
- package/esm/data_adapters/BaseAdapter/index.js +6 -5
- package/esm/data_adapters/BaseAdapter/stats.d.ts +37 -5
- package/esm/data_adapters/BaseAdapter/stats.js +89 -24
- package/esm/data_adapters/BaseAdapter/types.d.ts +11 -8
- package/esm/data_adapters/BaseAdapter/types.js +1 -0
- package/esm/data_adapters/BaseAdapter/util.d.ts +5 -1
- package/esm/data_adapters/BaseAdapter/util.js +14 -3
- package/esm/data_adapters/CytobandAdapter/CytobandAdapter.d.ts +1 -1
- package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +4 -4
- package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +36 -4
- package/esm/data_adapters/CytobandAdapter/configSchema.js +46 -2
- package/esm/data_adapters/CytobandAdapter/index.js +3 -3
- package/esm/data_adapters/adapterSessionRefcount.d.ts +61 -0
- package/esm/data_adapters/adapterSessionRefcount.js +96 -0
- package/esm/data_adapters/dataAdapterCache.d.ts +35 -1
- package/esm/data_adapters/dataAdapterCache.js +62 -22
- package/esm/data_adapters/getFeatureAdapter.d.ts +22 -0
- package/esm/data_adapters/getFeatureAdapter.js +27 -0
- package/esm/data_adapters/getSequenceSubAdapter.d.ts +21 -0
- package/esm/data_adapters/getSequenceSubAdapter.js +44 -0
- package/esm/pluggableElementTypes/AdapterType.d.ts +52 -2
- package/esm/pluggableElementTypes/AdapterType.js +44 -5
- package/esm/pluggableElementTypes/AddTrackWorkflowType.d.ts +6 -1
- package/esm/pluggableElementTypes/AddTrackWorkflowType.js +3 -1
- package/esm/pluggableElementTypes/ConnectionType.d.ts +5 -5
- package/esm/pluggableElementTypes/ConnectionType.js +1 -1
- package/esm/pluggableElementTypes/DisplayType.d.ts +19 -10
- package/esm/pluggableElementTypes/DisplayType.js +53 -5
- package/esm/pluggableElementTypes/InternetAccountType.js +1 -1
- package/esm/pluggableElementTypes/PluggableElementBase.d.ts +13 -0
- package/esm/pluggableElementTypes/PluggableElementBase.js +13 -0
- package/esm/pluggableElementTypes/RpcMethodType.d.ts +132 -12
- package/esm/pluggableElementTypes/RpcMethodType.js +263 -98
- package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +19 -9
- package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.js +26 -20
- package/esm/pluggableElementTypes/RpcMethodTypeWithRenameRegion.d.ts +5 -0
- package/esm/pluggableElementTypes/RpcMethodTypeWithRenameRegion.js +18 -0
- package/esm/pluggableElementTypes/RpcMethodTypeWithRenameRegions.d.ts +5 -0
- package/esm/pluggableElementTypes/RpcMethodTypeWithRenameRegions.js +10 -0
- package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +3 -3
- package/esm/pluggableElementTypes/TextSearchAdapterType.js +3 -1
- package/esm/pluggableElementTypes/TrackType.d.ts +2 -1
- package/esm/pluggableElementTypes/TrackType.js +1 -1
- package/esm/pluggableElementTypes/ViewType.d.ts +27 -3
- package/esm/pluggableElementTypes/ViewType.js +84 -4
- package/esm/pluggableElementTypes/WidgetType.d.ts +2 -2
- package/esm/pluggableElementTypes/WidgetType.js +1 -1
- package/esm/pluggableElementTypes/addMenuItems.d.ts +87 -0
- package/esm/pluggableElementTypes/addMenuItems.js +82 -0
- package/esm/pluggableElementTypes/extendElementType.d.ts +30 -0
- package/esm/pluggableElementTypes/extendElementType.js +73 -0
- package/esm/pluggableElementTypes/index.d.ts +7 -7
- package/esm/pluggableElementTypes/index.js +24 -14
- package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +70 -15
- package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.js +90 -10
- package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +646 -84
- package/esm/pluggableElementTypes/models/BaseDisplayModel.js +241 -60
- package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +216 -35
- package/esm/pluggableElementTypes/models/BaseTrackModel.js +365 -83
- package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +216 -16
- package/esm/pluggableElementTypes/models/BaseViewModel.js +150 -16
- package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +51 -0
- package/esm/pluggableElementTypes/models/HighlightsMixin.js +78 -0
- package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +163 -29
- package/esm/pluggableElementTypes/models/InternetAccountModel.js +218 -48
- package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +177 -0
- package/esm/pluggableElementTypes/models/assertDisplayContract.js +239 -0
- package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -8
- package/esm/pluggableElementTypes/models/baseConnectionConfig.js +18 -2
- package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +39 -20
- package/esm/pluggableElementTypes/models/baseInternetAccountConfig.js +23 -2
- package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +181 -65
- package/esm/pluggableElementTypes/models/baseTrackConfig.js +191 -89
- package/esm/pluggableElementTypes/models/components/SaveTrackData.d.ts +3 -8
- package/esm/pluggableElementTypes/models/components/SaveTrackData.js +113 -139
- package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +55 -0
- package/esm/pluggableElementTypes/models/components/fetchTrackData.js +83 -0
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +40 -0
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +115 -0
- package/esm/pluggableElementTypes/models/index.d.ts +6 -3
- package/esm/pluggableElementTypes/models/index.js +10 -8
- package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +34 -0
- package/esm/pluggableElementTypes/models/migrateTrackConfig.js +54 -0
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/bed.js +75 -7
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +9 -3
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +153 -103
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/gff3.d.ts +6 -1
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/gff3.js +70 -74
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +9 -1
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/util.d.ts +21 -0
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/util.js +51 -0
- package/esm/pluggableElementTypes/models/uriMatchesDomains.d.ts +29 -0
- package/esm/pluggableElementTypes/models/uriMatchesDomains.js +62 -0
- package/esm/pluggableElementTypes/renderers/util/serializableFilterChain.d.ts +5 -4
- package/esm/pluggableElementTypes/renderers/util/serializableFilterChain.js +20 -10
- package/esm/pluginDefinitions.d.ts +198 -0
- package/esm/pluginDefinitions.js +220 -0
- package/esm/rpc/BaseRpcDriver.d.ts +27 -35
- package/esm/rpc/BaseRpcDriver.js +74 -107
- package/esm/rpc/MainThreadRpcDriver.d.ts +9 -10
- package/esm/rpc/MainThreadRpcDriver.js +18 -29
- package/esm/rpc/RpcClient.d.ts +38 -0
- package/esm/rpc/RpcClient.js +154 -0
- package/esm/rpc/RpcManager.d.ts +116 -27
- package/esm/rpc/RpcManager.js +177 -50
- package/esm/rpc/RpcRegistry.d.ts +275 -0
- package/esm/rpc/RpcRegistry.js +1 -0
- package/esm/rpc/RpcServer.d.ts +41 -0
- package/esm/rpc/RpcServer.js +235 -0
- package/esm/rpc/WebWorkerRpcDriver.d.ts +71 -24
- package/esm/rpc/WebWorkerRpcDriver.js +312 -27
- package/esm/rpc/byteBudget.d.ts +58 -0
- package/esm/rpc/byteBudget.js +50 -0
- package/esm/rpc/configSchema.d.ts +27 -5
- package/esm/rpc/configSchema.js +40 -16
- package/esm/rpc/coreRpcMethods.d.ts +3 -5
- package/esm/rpc/coreRpcMethods.js +10 -12
- package/esm/rpc/explainTransferError.d.ts +35 -0
- package/esm/rpc/explainTransferError.js +158 -0
- package/esm/rpc/methods/CoreFreeResources.d.ts +19 -4
- package/esm/rpc/methods/CoreFreeResources.js +17 -6
- package/esm/rpc/methods/CoreGetExportData.d.ts +5 -18
- package/esm/rpc/methods/CoreGetExportData.js +26 -15
- package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
- package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
- package/esm/rpc/methods/CoreGetFeatures.d.ts +6 -15
- package/esm/rpc/methods/CoreGetFeatures.js +15 -17
- package/esm/rpc/methods/CoreGetInfo.d.ts +6 -0
- package/esm/rpc/methods/CoreGetInfo.js +12 -0
- package/esm/rpc/methods/CoreGetMetadata.d.ts +4 -7
- package/esm/rpc/methods/CoreGetMetadata.js +6 -9
- package/esm/rpc/methods/CoreGetRefNames.d.ts +4 -8
- package/esm/rpc/methods/CoreGetRefNames.js +24 -13
- package/esm/rpc/methods/CoreGetRegionByteEstimate.d.ts +6 -0
- package/esm/rpc/methods/CoreGetRegionByteEstimate.js +19 -0
- package/esm/rpc/methods/CoreGetRegions.d.ts +4 -6
- package/esm/rpc/methods/CoreGetRegions.js +6 -9
- package/esm/rpc/methods/CoreGetSequence.d.ts +4 -11
- package/esm/rpc/methods/CoreGetSequence.js +12 -13
- package/esm/rpc/serializeError/index.d.ts +9 -0
- package/esm/rpc/serializeError/index.js +86 -0
- package/esm/svg/SvgExport.d.ts +30 -0
- package/esm/svg/SvgExport.js +53 -0
- package/esm/svg/constants.d.ts +1 -0
- package/esm/svg/constants.js +5 -0
- package/esm/svg/saveSvgAsImage.d.ts +6 -0
- package/esm/svg/saveSvgAsImage.js +90 -0
- package/esm/svg/svgId.d.ts +42 -0
- package/esm/svg/svgId.js +84 -0
- package/esm/svg/svgReady.d.ts +137 -0
- package/esm/svg/svgReady.js +164 -0
- package/esm/svg/trackNames.d.ts +27 -0
- package/esm/svg/trackNames.js +31 -0
- package/esm/svg/wrapSvgExport.d.ts +12 -0
- package/esm/svg/wrapSvgExport.js +78 -0
- package/esm/ui/ActionLink.d.ts +7 -0
- package/esm/ui/ActionLink.js +9 -0
- package/esm/ui/AddCustomPluginDialog.d.ts +14 -0
- package/esm/ui/AddCustomPluginDialog.js +61 -0
- package/esm/ui/AddGenomePane.d.ts +8 -0
- package/esm/ui/AddGenomePane.js +228 -0
- package/esm/ui/AdvancedOptions.d.ts +6 -0
- package/esm/ui/AdvancedOptions.js +17 -0
- package/esm/ui/AppLogo.d.ts +1 -1
- package/esm/ui/AppLogo.js +2 -2
- package/esm/ui/AssemblySelector.d.ts +5 -8
- package/esm/ui/AssemblySelector.js +8 -26
- package/esm/ui/BaseExportSvgDialog.d.ts +16 -0
- package/esm/ui/BaseExportSvgDialog.js +84 -0
- package/esm/ui/BaseTooltip.d.ts +14 -3
- package/esm/ui/BaseTooltip.js +151 -34
- package/esm/ui/CascadingMenu.d.ts +9 -18
- package/esm/ui/CascadingMenu.js +390 -41
- package/esm/ui/CascadingMenuButton.d.ts +9 -11
- package/esm/ui/CascadingMenuButton.js +36 -18
- package/esm/ui/CascadingMenuHelpDialog.d.ts +2 -2
- package/esm/ui/CascadingMenuHelpDialog.js +4 -5
- package/esm/ui/CascadingMenuHelpIconButton.d.ts +2 -1
- package/esm/ui/CascadingMenuHelpIconButton.js +18 -9
- package/esm/ui/ColorPicker.d.ts +6 -9
- package/esm/ui/ColorPicker.js +36 -39
- package/esm/ui/ConfirmDialog.d.ts +2 -9
- package/esm/ui/ConfirmDialog.js +6 -9
- package/esm/ui/ContextMenu.d.ts +50 -0
- package/esm/ui/ContextMenu.js +55 -0
- package/esm/ui/CopyToClipboardButton.d.ts +10 -0
- package/esm/ui/CopyToClipboardButton.js +14 -0
- package/esm/ui/Crosshairs.d.ts +10 -0
- package/esm/ui/Crosshairs.js +15 -0
- package/esm/ui/DOMPurifySanitizedHTML.d.ts +1 -1
- package/esm/ui/DOMPurifySanitizedHTML.js +5 -5
- package/esm/ui/DataGridFlexContainer.d.ts +9 -2
- package/esm/ui/DataGridFlexContainer.js +4 -3
- package/esm/ui/Dialog.d.ts +5 -2
- package/esm/ui/Dialog.js +35 -27
- package/esm/ui/DraggableDialog.d.ts +3 -3
- package/esm/ui/DraggableDialog.js +50 -12
- package/esm/ui/DropDownMenu.d.ts +4 -2
- package/esm/ui/DropDownMenu.js +4 -4
- package/esm/ui/EditableTypography.d.ts +3 -1
- package/esm/ui/EditableTypography.js +34 -26
- package/esm/ui/ErrorActions.d.ts +24 -0
- package/esm/ui/ErrorActions.js +20 -0
- package/esm/ui/ErrorBanner.d.ts +7 -0
- package/esm/ui/ErrorBanner.js +35 -0
- package/esm/ui/ErrorBar.d.ts +6 -0
- package/esm/ui/ErrorBar.js +35 -0
- package/esm/ui/ErrorBoundary.d.ts +29 -5
- package/esm/ui/ErrorBoundary.js +32 -2
- package/esm/ui/ErrorMessage.d.ts +2 -4
- package/esm/ui/ErrorMessage.js +17 -52
- package/esm/ui/ErrorMessageStackTraceContents.d.ts +1 -1
- package/esm/ui/ErrorMessageStackTraceContents.js +3 -3
- package/esm/ui/ErrorMessageStackTraceDialog.d.ts +1 -1
- package/esm/ui/ErrorMessageStackTraceDialog.js +57 -96
- package/esm/ui/ErrorOverlay.d.ts +8 -0
- package/esm/ui/ErrorOverlay.js +5 -0
- package/esm/ui/ExportSvgDialog.d.ts +7 -0
- package/esm/ui/ExportSvgDialog.js +9 -0
- package/esm/ui/ExternalLink.d.ts +1 -1
- package/esm/ui/FactoryResetDialog.d.ts +1 -1
- package/esm/ui/FactoryResetDialog.js +6 -15
- package/esm/ui/FatalErrorDialog.d.ts +3 -2
- package/esm/ui/FatalErrorDialog.js +6 -5
- package/esm/ui/FileDropZone.d.ts +25 -0
- package/esm/ui/FileDropZone.js +128 -0
- package/esm/ui/FileSelector/FileSelector.d.ts +1 -1
- package/esm/ui/FileSelector/FileSelector.js +59 -30
- package/esm/ui/FileSelector/LocalFileChooser.d.ts +7 -2
- package/esm/ui/FileSelector/LocalFileChooser.js +61 -47
- package/esm/ui/FileSelector/LocationInput.d.ts +1 -1
- package/esm/ui/FileSelector/LocationInput.js +8 -12
- package/esm/ui/FileSelector/SourceTypeSelector.d.ts +5 -5
- package/esm/ui/FileSelector/SourceTypeSelector.js +9 -7
- package/esm/ui/FileSelector/UrlChooser.d.ts +1 -1
- package/esm/ui/FileSelector/UrlChooser.js +26 -2
- package/esm/ui/FileSelector/emptySourceType.d.ts +2 -0
- package/esm/ui/FileSelector/emptySourceType.js +14 -0
- package/esm/ui/FileSelector/useInternetAccounts.d.ts +383 -71
- package/esm/ui/FileSelector/useInternetAccounts.js +13 -6
- package/esm/ui/FileSelector/util.d.ts +58 -3
- package/esm/ui/FileSelector/util.js +128 -11
- package/esm/ui/GpuFallbackButton.d.ts +12 -0
- package/esm/ui/GpuFallbackButton.js +20 -0
- package/esm/ui/HoverMenu.d.ts +12 -3
- package/esm/ui/HoverMenu.js +31 -9
- package/esm/ui/HoverTooltip.d.ts +27 -0
- package/esm/ui/HoverTooltip.js +24 -0
- package/esm/ui/Icons.d.ts +6 -4
- package/esm/ui/Icons.js +9 -0
- package/esm/ui/InfoDialog.d.ts +7 -0
- package/esm/ui/InfoDialog.js +16 -0
- package/esm/ui/InlineMenuControls.d.ts +6 -0
- package/esm/ui/InlineMenuControls.js +17 -0
- package/esm/ui/JexlFilterDialog.d.ts +23 -0
- package/esm/ui/JexlFilterDialog.js +94 -0
- package/esm/ui/LabeledCheckbox.d.ts +9 -0
- package/esm/ui/LabeledCheckbox.js +7 -0
- package/esm/ui/LegendSwatchGlyph.d.ts +7 -0
- package/esm/ui/LegendSwatchGlyph.js +25 -0
- package/esm/ui/LoadingDots.d.ts +1 -0
- package/esm/ui/LoadingDots.js +30 -0
- package/esm/ui/LoadingEllipses.d.ts +17 -1
- package/esm/ui/LoadingEllipses.js +20 -29
- package/esm/ui/LoadingOverlay.d.ts +23 -0
- package/esm/ui/LoadingOverlay.js +137 -0
- package/esm/ui/LoadingProgress.d.ts +16 -0
- package/esm/ui/LoadingProgress.js +16 -0
- package/esm/ui/Logo.d.ts +2 -2
- package/esm/ui/Logo.js +23 -24
- package/esm/ui/Menu.js +1 -1
- package/esm/ui/MenuItemChevron.d.ts +3 -0
- package/esm/ui/MenuItemChevron.js +19 -0
- package/esm/ui/MenuItemEndDecoration.d.ts +4 -0
- package/esm/ui/MenuItemEndDecoration.js +28 -0
- package/esm/ui/MenuItemTrailing.d.ts +12 -0
- package/esm/ui/MenuItemTrailing.js +42 -0
- package/esm/ui/MenuTypes.d.ts +134 -5
- package/esm/ui/MenuTypes.js +16 -1
- package/esm/ui/MonospaceTextField.d.ts +9 -0
- package/esm/ui/MonospaceTextField.js +37 -0
- package/esm/ui/NumberTextField.d.ts +31 -0
- package/esm/ui/NumberTextField.js +33 -0
- package/esm/ui/PaletteContext.d.ts +92 -0
- package/esm/ui/PaletteContext.js +133 -0
- package/esm/ui/PinAdornment.d.ts +5 -0
- package/esm/ui/PinAdornment.js +85 -0
- package/esm/ui/PluggableComponent.d.ts +10 -0
- package/esm/ui/PluggableComponent.js +19 -0
- package/esm/ui/PluggableComponents.d.ts +29 -0
- package/esm/ui/PluggableComponents.js +28 -0
- package/esm/ui/PluggableElements.d.ts +23 -0
- package/esm/ui/PluggableElements.js +24 -0
- package/esm/ui/PluginStoreCard.d.ts +17 -0
- package/esm/ui/PluginStoreCard.js +45 -0
- package/esm/ui/PopoverPicker.d.ts +6 -0
- package/esm/ui/PopoverPicker.js +25 -0
- package/esm/ui/PrerenderedCanvas.d.ts +1 -1
- package/esm/ui/PrerenderedCanvas.js +5 -4
- package/esm/ui/ProgressChip.d.ts +37 -0
- package/esm/ui/ProgressChip.js +66 -0
- package/esm/ui/RedErrorMessageBox.d.ts +1 -1
- package/esm/ui/RedErrorMessageBox.js +9 -3
- package/esm/ui/RefNameAutocomplete/EndAdornment.d.ts +5 -0
- package/esm/ui/RefNameAutocomplete/EndAdornment.js +31 -0
- package/esm/ui/RefNameAutocomplete/HelpDialog.d.ts +3 -0
- package/esm/ui/RefNameAutocomplete/HelpDialog.js +7 -0
- package/esm/ui/RefNameAutocomplete/index.d.ts +22 -0
- package/esm/ui/RefNameAutocomplete/index.js +78 -0
- package/esm/ui/RefNameAutocomplete/util.d.ts +49 -0
- package/esm/ui/RefNameAutocomplete/util.js +168 -0
- package/esm/ui/ReplaceCurrentViewButton.d.ts +19 -0
- package/esm/ui/ReplaceCurrentViewButton.js +22 -0
- package/esm/ui/ResizeHandle.d.ts +13 -7
- package/esm/ui/ResizeHandle.js +42 -55
- package/esm/ui/ReturnToImportFormDialog.d.ts +1 -1
- package/esm/ui/ReturnToImportFormDialog.js +7 -9
- package/esm/ui/SanitizedHTML.d.ts +6 -1
- package/esm/ui/SanitizedHTML.js +7 -47
- package/esm/ui/ScrollEdgeShadow.d.ts +44 -0
- package/esm/ui/ScrollEdgeShadow.js +98 -0
- package/esm/ui/ScrollZoomToggle.d.ts +38 -0
- package/esm/ui/ScrollZoomToggle.js +92 -0
- package/esm/ui/SequenceAdapterInputs.d.ts +9 -0
- package/esm/ui/SequenceAdapterInputs.js +30 -0
- package/esm/ui/SettingsChangesTable.d.ts +14 -0
- package/esm/ui/SettingsChangesTable.js +49 -0
- package/esm/ui/ShareLinkField.d.ts +6 -0
- package/esm/ui/ShareLinkField.js +42 -0
- package/esm/ui/SingleSlider.d.ts +8 -0
- package/esm/ui/SingleSlider.js +11 -0
- package/esm/ui/SizeSliderRow.d.ts +16 -0
- package/esm/ui/SizeSliderRow.js +50 -0
- package/esm/ui/SliderTooltip.d.ts +2 -0
- package/esm/ui/SliderTooltip.js +17 -0
- package/esm/ui/Snackbar.d.ts +4 -2
- package/esm/ui/Snackbar.js +11 -8
- package/esm/ui/SnackbarContents.d.ts +1 -1
- package/esm/ui/SnackbarContents.js +21 -3
- package/esm/ui/SnackbarModel.d.ts +40 -0
- package/esm/ui/SnackbarModel.js +43 -11
- package/esm/ui/StackTraceButton.d.ts +5 -0
- package/esm/ui/StackTraceButton.js +16 -0
- package/esm/ui/StatusProgressBar.d.ts +37 -0
- package/esm/ui/StatusProgressBar.js +76 -0
- package/esm/ui/SubmitDialog.d.ts +6 -0
- package/esm/ui/SubmitDialog.js +9 -0
- package/esm/ui/SubmitForm.d.ts +23 -0
- package/esm/ui/SubmitForm.js +23 -0
- package/esm/ui/SvgColorLegend.d.ts +13 -0
- package/esm/ui/SvgColorLegend.js +65 -0
- package/esm/ui/SvgGradientLegend.d.ts +26 -0
- package/esm/ui/SvgGradientLegend.js +26 -0
- package/esm/ui/TagTextField.d.ts +40 -0
- package/esm/ui/TagTextField.js +32 -0
- package/esm/ui/VerticalScrollbar.d.ts +45 -0
- package/esm/ui/VerticalScrollbar.js +158 -0
- package/esm/ui/ViewLoadingScreen.d.ts +24 -0
- package/esm/ui/ViewLoadingScreen.js +76 -0
- package/esm/ui/addExtensionElement.d.ts +18 -0
- package/esm/ui/addExtensionElement.js +23 -0
- package/esm/ui/buildExtraTrackMenuItems.d.ts +22 -0
- package/esm/ui/buildExtraTrackMenuItems.js +14 -0
- package/esm/ui/colorSwatchStyle.d.ts +9 -0
- package/esm/ui/colorSwatchStyle.js +11 -0
- package/esm/ui/colors.d.ts +61 -8
- package/esm/ui/colors.js +135 -1
- package/esm/ui/extensionSelectors.d.ts +38 -0
- package/esm/ui/extensionSelectors.js +49 -0
- package/esm/ui/filterMenuItems.d.ts +112 -0
- package/esm/ui/filterMenuItems.js +86 -0
- package/esm/ui/formatErrorStack.d.ts +1 -0
- package/esm/ui/formatErrorStack.js +56 -0
- package/esm/ui/gpuFallback.d.ts +33 -0
- package/esm/ui/gpuFallback.js +39 -0
- package/esm/ui/highlightChipReveal.d.ts +32 -0
- package/esm/ui/highlightChipReveal.js +39 -0
- package/esm/ui/hoverBoxStyle.d.ts +11 -0
- package/esm/ui/hoverBoxStyle.js +13 -0
- package/esm/ui/index.d.ts +76 -4
- package/esm/ui/index.js +90 -19
- package/esm/ui/inlineMenuRowWidth.d.ts +1 -0
- package/esm/ui/inlineMenuRowWidth.js +8 -0
- package/esm/ui/launchTargetsMenuItem.d.ts +18 -0
- package/esm/ui/launchTargetsMenuItem.js +24 -0
- package/esm/ui/launchViewMenu.d.ts +4 -0
- package/esm/ui/launchViewMenu.js +42 -0
- package/esm/ui/legendMenuItem.d.ts +38 -0
- package/esm/ui/legendMenuItem.js +44 -0
- package/esm/ui/legendSpec.d.ts +62 -0
- package/esm/ui/legendSpec.js +78 -0
- package/esm/ui/loadingDotKeyframes.d.ts +18 -0
- package/esm/ui/loadingDotKeyframes.js +17 -0
- package/esm/ui/makeSizeMenu.d.ts +30 -0
- package/esm/ui/makeSizeMenu.js +82 -0
- package/esm/ui/mapStackTrace.d.ts +8 -0
- package/esm/ui/mapStackTrace.js +108 -0
- package/esm/ui/measureLegendText.d.ts +1 -0
- package/esm/ui/measureLegendText.js +8 -0
- package/esm/ui/menuItemAdornment.d.ts +33 -0
- package/esm/ui/menuItemAdornment.js +50 -0
- package/esm/ui/menuItems.d.ts +28 -0
- package/esm/ui/menuItems.js +26 -0
- package/esm/ui/menuLabels.d.ts +41 -0
- package/esm/ui/menuLabels.js +43 -0
- package/esm/ui/multiTrackMenuItems.d.ts +19 -0
- package/esm/ui/multiTrackMenuItems.js +15 -0
- package/esm/ui/palette.d.ts +559 -0
- package/esm/ui/palette.js +746 -0
- package/esm/ui/parseError.d.ts +4 -0
- package/esm/ui/parseError.js +18 -0
- package/esm/ui/persistentScrollbarStyle.d.ts +49 -0
- package/esm/ui/persistentScrollbarStyle.js +53 -0
- package/esm/ui/promotableMenuItems.d.ts +19 -0
- package/esm/ui/promotableMenuItems.js +91 -0
- package/esm/ui/promotablePinCoverage.d.ts +44 -0
- package/esm/ui/promotablePinCoverage.js +88 -0
- package/esm/ui/radioSubMenu.d.ts +33 -0
- package/esm/ui/radioSubMenu.js +32 -0
- package/esm/ui/react-colorful.js +5 -1
- package/esm/ui/replaceViewAction.d.ts +31 -0
- package/esm/ui/replaceViewAction.js +39 -0
- package/esm/ui/rewriteExternalAnchors.d.ts +1 -0
- package/esm/ui/rewriteExternalAnchors.js +8 -0
- package/esm/ui/scrollZoomLabels.d.ts +17 -0
- package/esm/ui/scrollZoomLabels.js +22 -0
- package/esm/ui/showSubMenu.d.ts +19 -0
- package/esm/ui/showSubMenu.js +30 -0
- package/esm/ui/sliderScale.d.ts +6 -0
- package/esm/ui/sliderScale.js +30 -0
- package/esm/ui/statusProgressKeyframes.d.ts +6 -0
- package/esm/ui/statusProgressKeyframes.js +14 -0
- package/esm/ui/stripStackTraceMessage.d.ts +1 -0
- package/esm/ui/stripStackTraceMessage.js +9 -0
- package/esm/ui/styleTheme.d.ts +158 -0
- package/esm/ui/styleTheme.js +115 -0
- package/esm/ui/submenuAim.d.ts +30 -0
- package/esm/ui/submenuAim.js +37 -0
- package/esm/ui/theme.d.ts +343 -29
- package/esm/ui/theme.js +258 -342
- package/esm/ui/toggleMenuItems.d.ts +42 -0
- package/esm/ui/toggleMenuItems.js +60 -0
- package/esm/ui/useAssemblySelection.d.ts +153 -0
- package/esm/ui/useAssemblySelection.js +54 -0
- package/esm/ui/useCoalescedPointer.d.ts +36 -0
- package/esm/ui/useCoalescedPointer.js +60 -0
- package/esm/ui/useCopyToClipboard.d.ts +15 -0
- package/esm/ui/useCopyToClipboard.js +41 -0
- package/esm/ui/useExportSvgPreference.d.ts +1 -0
- package/esm/ui/useExportSvgPreference.js +4 -0
- package/esm/ui/useMouseTracking.d.ts +71 -0
- package/esm/ui/useMouseTracking.js +179 -0
- package/esm/ui/useRecentLocations.d.ts +28 -0
- package/esm/ui/useRecentLocations.js +31 -0
- package/esm/ui/wrapComponent.d.ts +47 -0
- package/esm/ui/wrapComponent.js +58 -0
- package/esm/ui/zIndexes.d.ts +28 -0
- package/esm/ui/zIndexes.js +38 -0
- package/esm/util/Base1DUtils.d.ts +204 -16
- package/esm/util/Base1DUtils.js +310 -175
- package/esm/util/Base1DViewModel.d.ts +97 -20
- package/esm/util/Base1DViewModel.js +148 -39
- package/esm/util/FileSaver/index.d.ts +1 -0
- package/esm/util/FileSaver/index.js +27 -0
- package/esm/util/IntervalTree.d.ts +18 -39
- package/esm/util/IntervalTree.js +63 -244
- package/esm/util/SvgCanvas.d.ts +81 -0
- package/esm/util/SvgCanvas.js +500 -0
- package/esm/util/TimeTraveller.d.ts +12 -0
- package/esm/util/TimeTraveller.js +130 -27
- package/esm/util/aborting.d.ts +17 -4
- package/esm/util/aborting.js +30 -25
- package/esm/util/adapterMetadata.d.ts +20 -0
- package/esm/util/adapterMetadata.js +39 -0
- package/esm/util/addAndShowTrack.d.ts +22 -0
- package/esm/util/addAndShowTrack.js +27 -0
- package/esm/util/addRelativeUris.d.ts +17 -0
- package/esm/util/addRelativeUris.js +42 -0
- package/esm/util/addTrackComponent.d.ts +72 -0
- package/esm/util/addTrackComponent.js +53 -0
- package/esm/util/addTrackFromWidget.d.ts +94 -0
- package/esm/util/addTrackFromWidget.js +90 -0
- package/esm/util/analytics.d.ts +32 -3
- package/esm/util/analytics.js +102 -49
- package/esm/util/animationAllowed.d.ts +17 -0
- package/esm/util/animationAllowed.js +22 -0
- package/esm/util/applyRowResizeWheel.d.ts +10 -0
- package/esm/util/applyRowResizeWheel.js +34 -0
- package/esm/util/assemblyConfigUtils.d.ts +144 -0
- package/esm/util/assemblyConfigUtils.js +498 -0
- package/esm/util/bandHeight.d.ts +53 -0
- package/esm/util/bandHeight.js +56 -0
- package/esm/util/bandLayout.d.ts +51 -0
- package/esm/util/bandLayout.js +36 -0
- package/esm/util/bezierConnector.d.ts +14 -0
- package/esm/util/bezierConnector.js +108 -0
- package/esm/util/bgzfWorkerPool.d.ts +78 -0
- package/esm/util/bgzfWorkerPool.js +81 -0
- package/esm/util/blockTypes.d.ts +64 -45
- package/esm/util/blockTypes.js +67 -74
- package/esm/util/bpUtils.d.ts +81 -0
- package/esm/util/bpUtils.js +103 -0
- package/esm/util/cacheBudgets.d.ts +55 -0
- package/esm/util/cacheBudgets.js +55 -0
- package/esm/util/cachedSetup.d.ts +51 -0
- package/esm/util/cachedSetup.js +87 -0
- package/esm/util/calculateDynamicBlocks.d.ts +5 -0
- package/esm/util/calculateDynamicBlocks.js +85 -82
- package/esm/util/calculateStaticBlocks.d.ts +2 -3
- package/esm/util/calculateStaticBlocks.js +48 -71
- package/esm/util/chooseGridPitch.d.ts +9 -0
- package/esm/util/chooseGridPitch.js +31 -0
- package/esm/util/clampToContig.d.ts +26 -0
- package/esm/util/clampToContig.js +28 -0
- package/esm/util/cmpStr.d.ts +1 -0
- package/esm/util/cmpStr.js +7 -0
- package/esm/util/coarseStripHTML.js +3 -15
- package/esm/util/color/cssColorsLevel4.js +6 -2
- package/esm/util/color/index.d.ts +81 -2
- package/esm/util/color/index.js +194 -25
- package/esm/util/color-bits/bit.d.ts +4 -0
- package/esm/util/color-bits/bit.js +37 -0
- package/esm/util/color-bits/convert.d.ts +23 -0
- package/esm/util/color-bits/convert.js +294 -0
- package/esm/util/color-bits/core.d.ts +34 -0
- package/esm/util/color-bits/core.js +67 -0
- package/esm/util/color-bits/format.d.ts +24 -0
- package/esm/util/color-bits/format.js +82 -0
- package/esm/util/color-bits/functions.d.ts +33 -0
- package/esm/util/color-bits/functions.js +70 -0
- package/esm/util/color-bits/index.d.ts +5 -0
- package/esm/util/color-bits/index.js +4 -0
- package/esm/util/color-bits/parse.d.ts +17 -0
- package/esm/util/color-bits/parse.js +382 -0
- package/esm/util/colorBits.d.ts +39 -0
- package/esm/util/colorBits.js +180 -0
- package/esm/util/colorRamp.d.ts +37 -0
- package/esm/util/colorRamp.js +93 -0
- package/esm/util/colord.d.ts +8 -0
- package/esm/util/colord.js +43 -191
- package/esm/util/convertCodingSequenceToPeptides.d.ts +17 -3
- package/esm/util/convertCodingSequenceToPeptides.js +51 -4
- package/esm/util/copyText.d.ts +18 -0
- package/esm/util/copyText.js +30 -0
- package/esm/util/copyToClipboard.d.ts +4 -0
- package/esm/util/copyToClipboard.js +58 -0
- package/esm/util/createStopTokenRotation.d.ts +118 -0
- package/esm/util/createStopTokenRotation.js +127 -0
- package/esm/util/createSvgRasterCanvas.d.ts +7 -0
- package/esm/util/createSvgRasterCanvas.js +22 -0
- package/esm/util/crypto.d.ts +24 -0
- package/esm/util/crypto.js +85 -2
- package/esm/util/dataGridUtils.d.ts +9 -0
- package/esm/util/dataGridUtils.js +36 -0
- package/esm/util/dedupe.js +1 -0
- package/esm/util/deepEqual.d.ts +8 -0
- package/esm/util/deepEqual.js +22 -0
- package/esm/util/deepMerge.d.ts +20 -0
- package/esm/util/deepMerge.js +44 -0
- package/esm/util/diagonalizeRegions.d.ts +23 -0
- package/esm/util/diagonalizeRegions.js +192 -0
- package/esm/util/environment.d.ts +4 -0
- package/esm/util/environment.js +43 -0
- package/esm/util/eventPoint.d.ts +32 -0
- package/esm/util/eventPoint.js +28 -0
- package/esm/util/fetchAndMaybeUnzip.d.ts +6 -0
- package/esm/util/fetchAndMaybeUnzip.js +64 -0
- package/esm/util/fetchContext.d.ts +82 -0
- package/esm/util/fetchContext.js +59 -0
- package/esm/util/fetchHub.d.ts +15 -0
- package/esm/util/fetchHub.js +31 -0
- package/esm/util/fetchJson.d.ts +1 -0
- package/esm/util/fetchJson.js +7 -0
- package/esm/util/fetchPhases.d.ts +77 -0
- package/esm/util/fetchPhases.js +1 -0
- package/esm/util/fetchSeq.d.ts +5 -1
- package/esm/util/fetchSeq.js +18 -6
- package/esm/util/fileHandleStore.d.ts +19 -2
- package/esm/util/fileHandleStore.js +95 -35
- package/esm/util/flatbush/index.d.ts +27 -6
- package/esm/util/flatbush/index.js +194 -218
- package/esm/util/formatBytes.d.ts +9 -0
- package/esm/util/formatBytes.js +18 -0
- package/esm/util/formatFastaStrings.d.ts +13 -0
- package/esm/util/formatFastaStrings.js +13 -0
- package/esm/util/formatGuessers.d.ts +30 -0
- package/esm/util/formatGuessers.js +69 -0
- package/esm/util/formatRelativeTime.d.ts +1 -0
- package/esm/util/formatRelativeTime.js +25 -0
- package/esm/util/frameCoalescer.d.ts +30 -0
- package/esm/util/frameCoalescer.js +22 -0
- package/esm/util/freezeDeep.d.ts +28 -0
- package/esm/util/freezeDeep.js +41 -0
- package/esm/util/geneticCodes.d.ts +56 -0
- package/esm/util/geneticCodes.js +371 -0
- package/esm/util/getFileName.d.ts +11 -0
- package/esm/util/getFileName.js +34 -0
- package/esm/util/getLocationUri.d.ts +49 -0
- package/esm/util/getLocationUri.js +63 -0
- package/esm/util/getRelativeX.d.ts +4 -0
- package/esm/util/getRelativeX.js +7 -0
- package/esm/util/getStr.d.ts +6 -0
- package/esm/util/getStr.js +15 -0
- package/esm/util/highlights.d.ts +21 -0
- package/esm/util/highlights.js +100 -0
- package/esm/util/hooks.d.ts +168 -0
- package/esm/util/hooks.js +443 -0
- package/esm/util/htmlText.d.ts +13 -0
- package/esm/util/htmlText.js +66 -0
- package/esm/util/idMaker.d.ts +1 -1
- package/esm/util/idMaker.js +31 -18
- package/esm/util/index.d.ts +81 -268
- package/esm/util/index.js +135 -853
- package/esm/util/indexCandidates.d.ts +50 -0
- package/esm/util/indexCandidates.js +101 -0
- package/esm/util/installClearHoverOnSurfaceMove.d.ts +40 -0
- package/esm/util/installClearHoverOnSurfaceMove.js +41 -0
- package/esm/util/installFetch.d.ts +220 -0
- package/esm/util/installFetch.js +206 -0
- package/esm/util/installInitAutorun.d.ts +62 -0
- package/esm/util/installInitAutorun.js +107 -0
- package/esm/util/intervals.d.ts +20 -0
- package/esm/util/intervals.js +37 -0
- package/esm/util/io/RemoteFileWithRangeCache.d.ts +10 -11
- package/esm/util/io/RemoteFileWithRangeCache.js +10 -148
- package/esm/util/io/index.d.ts +39 -2
- package/esm/util/io/index.js +115 -12
- package/esm/util/isDataCurrent.d.ts +7 -0
- package/esm/util/isDataCurrent.js +9 -0
- package/esm/util/isWebWorker.js +1 -2
- package/esm/util/iupac.d.ts +4 -0
- package/esm/util/iupac.js +59 -0
- package/esm/util/jexl.js +141 -17
- package/esm/util/jexlFilters.d.ts +75 -0
- package/esm/util/jexlFilters.js +49 -0
- package/esm/util/jexlStrings.d.ts +22 -1
- package/esm/util/jexlStrings.js +21 -14
- package/esm/util/layouts/GranularRectLayout.d.ts +13 -25
- package/esm/util/layouts/GranularRectLayout.js +99 -356
- package/esm/util/layouts/index.d.ts +1 -7
- package/esm/util/layouts/index.js +2 -6
- package/esm/util/layouts/intervalUtils.d.ts +12 -1
- package/esm/util/layouts/intervalUtils.js +13 -31
- package/esm/util/layouts/placeRect.d.ts +50 -0
- package/esm/util/layouts/placeRect.js +97 -0
- package/esm/util/lazyAfterAttach.d.ts +13 -0
- package/esm/util/lazyAfterAttach.js +31 -0
- package/esm/util/leadingEdgeAutorun.d.ts +40 -0
- package/esm/util/leadingEdgeAutorun.js +51 -0
- package/esm/util/legendCandidates.d.ts +50 -0
- package/esm/util/legendCandidates.js +87 -0
- package/esm/util/librpc.d.ts +5 -2
- package/esm/util/librpc.js +6 -1
- package/esm/util/linkify.js +2 -0
- package/esm/util/locString.d.ts +72 -0
- package/esm/util/locString.js +178 -7
- package/esm/util/locStringsToRegions.d.ts +10 -0
- package/esm/util/locStringsToRegions.js +35 -0
- package/esm/util/localStorage.d.ts +36 -0
- package/esm/util/localStorage.js +137 -0
- package/esm/util/makeAssembly.d.ts +54 -0
- package/esm/util/makeAssembly.js +52 -0
- package/esm/util/makeTrackId.d.ts +14 -0
- package/esm/util/makeTrackId.js +14 -0
- package/esm/util/matchTrackId.d.ts +11 -0
- package/esm/util/matchTrackId.js +14 -0
- package/esm/util/measureText.d.ts +24 -0
- package/esm/util/measureText.js +51 -0
- package/esm/util/mst-reflection.d.ts +14 -4
- package/esm/util/mst-reflection.js +33 -32
- package/esm/util/mstUtils.d.ts +100 -0
- package/esm/util/mstUtils.js +140 -0
- package/esm/util/nanoid.d.ts +0 -4
- package/esm/util/nanoid.js +10 -20
- package/esm/util/numericUtils.d.ts +20 -0
- package/esm/util/numericUtils.js +127 -0
- package/esm/util/objectUtils.d.ts +2 -0
- package/esm/util/objectUtils.js +9 -0
- package/esm/util/offscreenCanvasPonyfill.d.ts +5 -4
- package/esm/util/offscreenCanvasPonyfill.js +5 -47
- package/esm/util/openDisplays.d.ts +23 -0
- package/esm/util/openDisplays.js +79 -0
- package/esm/util/openFeatureWidget.d.ts +33 -0
- package/esm/util/openFeatureWidget.js +64 -0
- package/esm/util/paintLayer.d.ts +32 -0
- package/esm/util/paintLayer.js +33 -0
- package/esm/util/parentWalk.d.ts +32 -0
- package/esm/util/parentWalk.js +84 -0
- package/esm/util/parseLineByLine.d.ts +45 -2
- package/esm/util/parseLineByLine.js +156 -15
- package/esm/util/parseMotifList.d.ts +17 -0
- package/esm/util/parseMotifList.js +69 -0
- package/esm/util/pluginStore.d.ts +114 -0
- package/esm/util/pluginStore.js +260 -0
- package/esm/util/pointerPresence.d.ts +5 -0
- package/esm/util/pointerPresence.js +21 -0
- package/esm/util/progress.d.ts +459 -0
- package/esm/util/progress.js +820 -0
- package/esm/util/range.d.ts +46 -1
- package/esm/util/range.js +68 -2
- package/esm/util/renameRegions.d.ts +21 -0
- package/esm/util/renameRegions.js +129 -0
- package/esm/util/renderToStaticMarkup.d.ts +2 -0
- package/esm/util/renderToStaticMarkup.js +50 -0
- package/esm/util/reorder.d.ts +35 -0
- package/esm/util/reorder.js +83 -0
- package/esm/util/resolveRowHeight.d.ts +27 -0
- package/esm/util/resolveRowHeight.js +30 -0
- package/esm/util/revlist.d.ts +13 -0
- package/esm/util/revlist.js +14 -0
- package/esm/util/rowStackGeometry.d.ts +66 -0
- package/esm/util/rowStackGeometry.js +70 -0
- package/esm/util/rpc.d.ts +16 -1
- package/esm/util/rpc.js +12 -1
- package/esm/util/rxjs.d.ts +30 -1
- package/esm/util/rxjs.js +88 -10
- package/esm/util/sameStrings.d.ts +16 -0
- package/esm/util/sameStrings.js +20 -0
- package/esm/util/scrollLatch.d.ts +4 -0
- package/esm/util/scrollLatch.js +59 -0
- package/esm/util/selectNamedRegions.d.ts +136 -0
- package/esm/util/selectNamedRegions.js +222 -0
- package/esm/util/seqUtils.d.ts +17 -0
- package/esm/util/seqUtils.js +80 -0
- package/esm/util/sessionServices.d.ts +29 -0
- package/esm/util/sessionServices.js +46 -0
- package/esm/util/sessionSharing.d.ts +38 -0
- package/esm/util/sessionSharing.js +154 -0
- package/esm/util/sessionStorage.d.ts +1 -0
- package/esm/util/sessionStorage.js +15 -0
- package/esm/util/setStackTraceLimit.d.ts +6 -0
- package/esm/util/setStackTraceLimit.js +20 -0
- package/esm/util/simpleFeature.d.ts +112 -4
- package/esm/util/simpleFeature.js +181 -29
- package/esm/util/springAnimate.d.ts +20 -0
- package/esm/util/springAnimate.js +80 -0
- package/esm/util/stats.d.ts +25 -2
- package/esm/util/stats.js +39 -8
- package/esm/util/stopToken.d.ts +207 -15
- package/esm/util/stopToken.js +403 -55
- package/esm/util/stringUtils.d.ts +5 -0
- package/esm/util/stringUtils.js +34 -0
- package/esm/util/svgColorProps.d.ts +7 -0
- package/esm/util/svgColorProps.js +28 -0
- package/esm/util/tabix.d.ts +126 -0
- package/esm/util/tabix.js +149 -0
- package/esm/util/tags.d.ts +2 -0
- package/esm/util/tags.js +5 -0
- package/esm/util/temporaryAssembly.d.ts +21 -0
- package/esm/util/temporaryAssembly.js +29 -0
- package/esm/util/tickLabels.d.ts +36 -0
- package/esm/util/tickLabels.js +45 -0
- package/esm/util/timeGate.d.ts +26 -0
- package/esm/util/timeGate.js +79 -0
- package/esm/util/trackConfigDelta.d.ts +84 -0
- package/esm/util/trackConfigDelta.js +190 -0
- package/esm/util/tracks.d.ts +398 -30
- package/esm/util/tracks.js +699 -191
- package/esm/util/tss-react/cssAndCx.js +11 -66
- package/esm/util/tss-react/index.d.ts +11 -2
- package/esm/util/tss-react/index.js +9 -2
- package/esm/util/tss-react/makeStyles.js +7 -4
- package/esm/util/tss-react/mergeClasses.js +1 -0
- package/esm/util/tss-react/tools/classnames.d.ts +3 -0
- package/esm/util/tss-react/tools/classnames.js +3 -0
- package/esm/util/tss-react/tools/getDependencyArrayRef.d.ts +18 -0
- package/esm/util/tss-react/tools/getDependencyArrayRef.js +19 -0
- package/esm/util/tss-react/types.d.ts +1 -1
- package/esm/util/tss-react/types.js +1 -6
- package/esm/util/types/ElementId.js +1 -1
- package/esm/util/types/data.d.ts +75 -0
- package/esm/util/types/data.js +41 -0
- package/esm/util/types/index.d.ts +402 -120
- package/esm/util/types/index.js +90 -64
- package/esm/util/types/isAny.d.ts +11 -0
- package/esm/util/types/isAny.js +1 -0
- package/esm/util/types/mst.d.ts +71 -47
- package/esm/util/types/mst.js +27 -22
- package/esm/util/types/predicate.d.ts +9 -0
- package/esm/util/types/predicate.js +1 -0
- package/esm/util/types/renderingServices.d.ts +16 -0
- package/esm/util/types/renderingServices.js +1 -0
- package/esm/util/types/services.d.ts +55 -0
- package/esm/util/types/services.js +10 -0
- package/esm/util/types/util.d.ts +8 -2
- package/esm/util/unknownSnapshotKeys.d.ts +36 -0
- package/esm/util/unknownSnapshotKeys.js +69 -0
- package/esm/util/unzip.d.ts +1 -0
- package/esm/util/unzip.js +6 -0
- package/esm/util/useEventCallback.d.ts +1 -0
- package/esm/util/useEventCallback.js +16 -0
- package/esm/util/useFeatureSequence.d.ts +13 -7
- package/esm/util/useFeatureSequence.js +56 -78
- package/esm/util/useFetch.d.ts +56 -0
- package/esm/util/useFetch.js +188 -0
- package/esm/util/useFetchPlugins.d.ts +12 -0
- package/esm/util/useFetchPlugins.js +14 -0
- package/esm/util/useMeasure.d.ts +11 -1
- package/esm/util/useMeasure.js +20 -6
- package/esm/util/usePanZoom.d.ts +75 -0
- package/esm/util/usePanZoom.js +175 -0
- package/esm/util/usePanelVirtualScroll.d.ts +37 -0
- package/esm/util/usePanelVirtualScroll.js +42 -0
- package/esm/util/usePointerDrag.d.ts +37 -0
- package/esm/util/usePointerDrag.js +61 -0
- package/esm/util/useRafCommit.d.ts +4 -0
- package/esm/util/useRafCommit.js +50 -0
- package/esm/util/useResizeDrag.d.ts +91 -0
- package/esm/util/useResizeDrag.js +105 -0
- package/esm/util/useRowVirtualScroll.d.ts +32 -0
- package/esm/util/useRowVirtualScroll.js +63 -0
- package/esm/util/useVirtualScrollWheel.d.ts +7 -0
- package/esm/util/useVirtualScrollWheel.js +108 -0
- package/esm/util/viewStatus.d.ts +81 -0
- package/esm/util/viewStatus.js +37 -0
- package/esm/util/virtualRange.d.ts +36 -0
- package/esm/util/virtualRange.js +26 -0
- package/esm/util/webStorage.d.ts +26 -0
- package/esm/util/webStorage.js +92 -0
- package/esm/util/wheelZoom.d.ts +59 -0
- package/esm/util/wheelZoom.js +231 -0
- package/esm/util/whenViewSettled.d.ts +40 -0
- package/esm/util/whenViewSettled.js +41 -0
- package/esm/util/withFeatureDetails.d.ts +34 -0
- package/esm/util/withFeatureDetails.js +59 -0
- package/esm/util/withLaunchInput.d.ts +123 -0
- package/esm/util/withLaunchInput.js +228 -0
- package/package.json +243 -820
- package/esm/ReExports/DataGrid.d.ts +0 -1
- package/esm/ReExports/DataGrid.js +0 -1
- package/esm/configuration/util.d.ts +0 -10
- package/esm/configuration/util.js +0 -123
- package/esm/data_adapters/BaseAdapter/BaseOptions.d.ts +0 -18
- package/esm/data_adapters/util.d.ts +0 -1
- package/esm/data_adapters/util.js +0 -6
- package/esm/pluggableElementTypes/GlyphType.d.ts +0 -43
- package/esm/pluggableElementTypes/GlyphType.js +0 -18
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/fetchSequence.d.ts +0 -5
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/fetchSequence.js +0 -17
- package/esm/pluggableElementTypes/renderers/BoxRendererType.d.ts +0 -52
- package/esm/pluggableElementTypes/renderers/BoxRendererType.js +0 -78
- package/esm/pluggableElementTypes/renderers/CircularChordRendererType.d.ts +0 -4
- package/esm/pluggableElementTypes/renderers/CircularChordRendererType.js +0 -4
- package/esm/pluggableElementTypes/renderers/FeatureRendererType.d.ts +0 -58
- package/esm/pluggableElementTypes/renderers/FeatureRendererType.js +0 -77
- package/esm/pluggableElementTypes/renderers/LayoutSession.d.ts +0 -31
- package/esm/pluggableElementTypes/renderers/LayoutSession.js +0 -40
- package/esm/pluggableElementTypes/renderers/RendererType.d.ts +0 -28
- package/esm/pluggableElementTypes/renderers/RendererType.js +0 -20
- package/esm/pluggableElementTypes/renderers/ServerSideRendererType.d.ts +0 -58
- package/esm/pluggableElementTypes/renderers/ServerSideRendererType.js +0 -108
- package/esm/pluggableElementTypes/renderers/index.d.ts +0 -6
- package/esm/pluggableElementTypes/renderers/index.js +0 -6
- package/esm/pluggableElementTypes/renderers/util.d.ts +0 -3
- package/esm/pluggableElementTypes/renderers/util.js +0 -14
- package/esm/rpc/baseRpcConfig.d.ts +0 -8
- package/esm/rpc/baseRpcConfig.js +0 -10
- package/esm/rpc/mainThreadRpcConfig.d.ts +0 -8
- package/esm/rpc/mainThreadRpcConfig.js +0 -8
- package/esm/rpc/methods/CoreGetFeatureDensityStats.d.ts +0 -17
- package/esm/rpc/methods/CoreGetFeatureDensityStats.js +0 -25
- package/esm/rpc/methods/CoreGetFeatureDetails.d.ts +0 -11
- package/esm/rpc/methods/CoreGetFeatureDetails.js +0 -24
- package/esm/rpc/methods/CoreGetFileInfo.d.ts +0 -9
- package/esm/rpc/methods/CoreGetFileInfo.js +0 -15
- package/esm/rpc/methods/CoreRender.d.ts +0 -14
- package/esm/rpc/methods/CoreRender.js +0 -40
- package/esm/rpc/methods/CoreSaveFeatureData.d.ts +0 -16
- package/esm/rpc/methods/CoreSaveFeatureData.js +0 -32
- package/esm/rpc/methods/util.d.ts +0 -15
- package/esm/rpc/methods/util.js +0 -7
- package/esm/rpc/webWorkerRpcConfig.d.ts +0 -8
- package/esm/rpc/webWorkerRpcConfig.js +0 -8
- package/esm/ui/MenuButton.d.ts +0 -1
- package/esm/ui/MenuButton.js +0 -1
- package/esm/ui/MenuItems.d.ts +0 -15
- package/esm/ui/MenuItems.js +0 -59
- package/esm/ui/useEvent.d.ts +0 -1
- package/esm/ui/useEvent.js +0 -10
- package/esm/util/blobToDataURL.d.ts +0 -1
- package/esm/util/blobToDataURL.js +0 -14
- package/esm/util/compositeMap.d.ts +0 -11
- package/esm/util/compositeMap.js +0 -59
- package/esm/util/flatqueue/index.d.ts +0 -11
- package/esm/util/flatqueue/index.js +0 -61
- package/esm/util/layouts/BaseLayout.d.ts +0 -30
- package/esm/util/layouts/MultiLayout.d.ts +0 -12
- package/esm/util/layouts/MultiLayout.js +0 -40
- package/esm/util/layouts/PileupLayout.d.ts +0 -41
- package/esm/util/layouts/PileupLayout.js +0 -202
- package/esm/util/layouts/PrecomputedLayout.d.ts +0 -30
- package/esm/util/layouts/PrecomputedLayout.js +0 -71
- package/esm/util/layouts/SceneGraph.d.ts +0 -31
- package/esm/util/layouts/SceneGraph.js +0 -121
- package/esm/util/makeAbortableReaction.d.ts +0 -3
- package/esm/util/makeAbortableReaction.js +0 -47
- package/esm/util/map-obj/index.d.ts +0 -13
- package/esm/util/map-obj/index.js +0 -92
- package/esm/util/nextTick.d.ts +0 -1
- package/esm/util/nextTick.js +0 -3
- package/esm/util/offscreenCanvasGetSerializingSvg.d.ts +0 -5
- package/esm/util/offscreenCanvasGetSerializingSvg.js +0 -9
- package/esm/util/offscreenCanvasUtils.d.ts +0 -12
- package/esm/util/offscreenCanvasUtils.js +0 -19
- package/esm/util/renderToAbstractCanvas.d.ts +0 -17
- package/esm/util/renderToAbstractCanvas.js +0 -53
- package/esm/util/transferables.d.ts +0 -2
- package/esm/util/transferables.js +0 -35
- package/esm/util/tss-react/mui/index.d.ts +0 -1
- package/esm/util/tss-react/mui/index.js +0 -1
- package/esm/util/tss-react/mui/mui.d.ts +0 -10
- package/esm/util/tss-react/mui/mui.js +0 -5
- package/esm/util/when.d.ts +0 -1
- package/esm/util/when.js +0 -1
- /package/esm/{data_adapters/BaseAdapter/BaseOptions.js → configuration/promotablePin.js} +0 -0
- /package/esm/{util/layouts/BaseLayout.js → data_adapters/BaseAdapter/CytobandAdapter.js} +0 -0
|
@@ -0,0 +1,820 @@
|
|
|
1
|
+
import { checkStopTokenThrottled, createStopTokenChecker, withStopTokenCheck, } from './stopToken.js';
|
|
2
|
+
import { createTimeGate } from './timeGate.js';
|
|
3
|
+
const openPhases = new WeakMap();
|
|
4
|
+
/**
|
|
5
|
+
* Open a phase on `cb`'s channel and return its close. The close emits the
|
|
6
|
+
* enclosing phase's label, or `''` when this was the outermost — which is what
|
|
7
|
+
* makes phases nest, so an inner phase cannot blank the label its caller set for
|
|
8
|
+
* the rest of the caller's work.
|
|
9
|
+
*
|
|
10
|
+
* `''` closing the outermost phase is what every consumer reads as "this phase
|
|
11
|
+
* is over": a {@link StatusWindow} thins it like any other status, and
|
|
12
|
+
* {@link aggregateStatus} reads it as "not in flight".
|
|
13
|
+
*
|
|
14
|
+
* The close takes the {@link PhaseOutcome}, because it is the one place that
|
|
15
|
+
* knows it — a phase that finished and a phase that threw retire the same label,
|
|
16
|
+
* and only the `finally` around the work can tell them apart.
|
|
17
|
+
*/
|
|
18
|
+
function openPhase(cb, label) {
|
|
19
|
+
if (cb === undefined) {
|
|
20
|
+
return (_outcome) => { };
|
|
21
|
+
}
|
|
22
|
+
let stack = openPhases.get(cb);
|
|
23
|
+
if (stack === undefined) {
|
|
24
|
+
stack = [];
|
|
25
|
+
openPhases.set(cb, stack);
|
|
26
|
+
}
|
|
27
|
+
const phase = { label };
|
|
28
|
+
stack.push(phase);
|
|
29
|
+
return (outcome) => {
|
|
30
|
+
const index = stack.lastIndexOf(phase);
|
|
31
|
+
if (index !== -1) {
|
|
32
|
+
stack.splice(index, 1);
|
|
33
|
+
}
|
|
34
|
+
// the enclosing phase is restored whole, its source included: a nested
|
|
35
|
+
// phase ending does not stop the outer one waiting on the file it named
|
|
36
|
+
const restored = stack.at(-1)?.label ?? '';
|
|
37
|
+
cb(outcome === 'failed'
|
|
38
|
+
? { message: phaseOf(restored), failed: true }
|
|
39
|
+
: restored);
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Indeterminate phase: set `label` on the status channel, run `fn`, then restore
|
|
44
|
+
* whatever phase encloses it — `''` when there is none. Pass `stopToken` and the
|
|
45
|
+
* phase becomes a cancellation boundary too: this is the labelled form of
|
|
46
|
+
* {@link withStopTokenCheck}, so `fn` is checked on both sides of its await and
|
|
47
|
+
* neither check has to be remembered at the call site. The determinate
|
|
48
|
+
* counterpart is {@link withProgress}.
|
|
49
|
+
*
|
|
50
|
+
* Nests — see {@link openPhase}. An inner phase's close restores the enclosing
|
|
51
|
+
* label and not its bar; the enclosing phase's next `report()` re-establishes
|
|
52
|
+
* it, and one with none to send was indeterminate anyway.
|
|
53
|
+
*
|
|
54
|
+
* `msg` is a {@link StatusPhase} where the caller knows which file the phase is
|
|
55
|
+
* fetching — `downloadPhase(label, location)` builds one — and a plain string
|
|
56
|
+
* everywhere else. It nests and retires identically either way.
|
|
57
|
+
*/
|
|
58
|
+
export async function updateStatus(msg, cb, fn, stopToken) {
|
|
59
|
+
const endPhase = openPhase(cb, msg);
|
|
60
|
+
// pessimistic, so anything leaving this scope other than a value — a throw, a
|
|
61
|
+
// cancel — retires the phase as unfinished
|
|
62
|
+
let outcome = 'failed';
|
|
63
|
+
// everything after the open is inside the try, the announcing write included,
|
|
64
|
+
// so a throw anywhere cannot leave this phase's label sitting on the channel
|
|
65
|
+
// forever — the error surfaces under a stale "Downloading file"
|
|
66
|
+
try {
|
|
67
|
+
cb?.(msg);
|
|
68
|
+
const result = await withStopTokenCheck(stopToken, fn);
|
|
69
|
+
outcome = 'completed';
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
endPhase(outcome);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function isPhaseFailure(status) {
|
|
77
|
+
return typeof status === 'object' && 'failed' in status;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The determinate reading in `status`, or undefined when there is none — a bare
|
|
81
|
+
* label, a {@link StatusPhase}, or the last word of a phase that threw. The one
|
|
82
|
+
* place the transport's union is narrowed to a `current`/`total`, so a consumer
|
|
83
|
+
* reading the numbers cannot mistake a label or a {@link PhaseFailure} for a
|
|
84
|
+
* measurement. It tests for the numbers themselves rather than excluding the
|
|
85
|
+
* shapes that lack them, so a shape added later is out until it opts in.
|
|
86
|
+
*/
|
|
87
|
+
export function statusReading(status) {
|
|
88
|
+
return typeof status === 'object' && 'current' in status ? status : undefined;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* What `status` says it is waiting on, or undefined when it names nothing — a
|
|
92
|
+
* label with no {@link StatusPhase} source, and every reading that arrived
|
|
93
|
+
* before one was attached. The URL is what a stalled phase has to show; see
|
|
94
|
+
* {@link StatusPhase}.
|
|
95
|
+
*/
|
|
96
|
+
export function statusSource(status) {
|
|
97
|
+
return typeof status === 'object' && 'source' in status
|
|
98
|
+
? status.source
|
|
99
|
+
: undefined;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* The phase a status names, verbatim — its label, whichever shape it arrived in.
|
|
103
|
+
* The raw form, `''` and all, for the few places that have to reason about the
|
|
104
|
+
* sentinel itself, or that are rebuilding a phase around the label they were
|
|
105
|
+
* handed. Everywhere else wants {@link statusMessageText}.
|
|
106
|
+
*/
|
|
107
|
+
export function phaseOf(status) {
|
|
108
|
+
return typeof status === 'object' ? status.message : status;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Extract the human-readable text from any status value, or `undefined` when
|
|
112
|
+
* there is none.
|
|
113
|
+
*
|
|
114
|
+
* `''` is none: it is the phase-over sentinel, not a label. Normalizing it here
|
|
115
|
+
* leaves one spelling of "nothing to show" for the three models that store a
|
|
116
|
+
* `statusMessage` (`assembly`, `BaseDisplayModel`, `FetchMixin`) — otherwise a
|
|
117
|
+
* reset's `undefined` and a phase's `''` read the same on screen
|
|
118
|
+
* (`message || 'Loading'`) and differently to everything else.
|
|
119
|
+
*
|
|
120
|
+
* The corollary binds anything that *transforms* a status: rewriting `''` into
|
|
121
|
+
* any other string — a prefix, a default — makes a phase that never ends, since
|
|
122
|
+
* a slot's last word is what {@link aggregateStatus} weighs. `levelStatusCallback`
|
|
123
|
+
* in `runDiagonalize.ts` is the one transformer in the tree.
|
|
124
|
+
*/
|
|
125
|
+
export function statusMessageText(status) {
|
|
126
|
+
const text = status === undefined ? undefined : phaseOf(status);
|
|
127
|
+
return text === '' ? undefined : text;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Fraction complete in [0,1], or undefined when the status is indeterminate
|
|
131
|
+
* (a plain string, or a zero total).
|
|
132
|
+
*/
|
|
133
|
+
export function statusFraction(status) {
|
|
134
|
+
const reading = statusReading(status);
|
|
135
|
+
return reading !== undefined && reading.total > 0
|
|
136
|
+
? Math.min(1, reading.current / reading.total)
|
|
137
|
+
: undefined;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* The shared state behind {@link createStatusFanOut} and {@link
|
|
141
|
+
* createStatusWindow}: N slots, the order the batch reached each phase in, and
|
|
142
|
+
* the last reading worth re-sending. Both of them are "several concurrent
|
|
143
|
+
* operations, one status" — the fan-out over the regions of one fetch, the
|
|
144
|
+
* window over the operations of one display — and the arbitration is the same
|
|
145
|
+
* either way, so it is written once.
|
|
146
|
+
*
|
|
147
|
+
* The two differ in what they do with the answer — the fan-out feeds a callback
|
|
148
|
+
* that has no way to say "nothing", the window owns a field it can blank — and
|
|
149
|
+
* in `holdLastReading`.
|
|
150
|
+
*
|
|
151
|
+
* **Hold only where the slots are raw reporters.** ADR-080's rule that a phase
|
|
152
|
+
* does not lose its bar because nothing is measuring it *this instant* is about
|
|
153
|
+
* one batch's peers sitting between reads. A slot fed by another aggregate has
|
|
154
|
+
* already had the rule applied to it: its bare label means "my children have no
|
|
155
|
+
* measurement", not "I am between reads", and holding over that puts back a
|
|
156
|
+
* percentage the child deliberately retired — the write ADR-071 exists to
|
|
157
|
+
* cancel. A window's slots are whole operations, and the commonest window has
|
|
158
|
+
* exactly one, where a held reading can only ever be older than what the slot
|
|
159
|
+
* just said.
|
|
160
|
+
*/
|
|
161
|
+
function createStatusAggregate({ holdLastReading = false } = {}) {
|
|
162
|
+
const slots = [];
|
|
163
|
+
// every phase this batch has reached, against the order it reached them in,
|
|
164
|
+
// so a tie between two slots in different phases resolves the same way twice
|
|
165
|
+
const phaseRank = new Map();
|
|
166
|
+
// the current phase's last determinate reading — what a moment with nothing
|
|
167
|
+
// measuring it falls back to, rather than downgrading what we already know.
|
|
168
|
+
// Dropped the moment the batch is in some other phase, or in none.
|
|
169
|
+
let held;
|
|
170
|
+
// the last label of any kind, which outlives that: it is all there is to say
|
|
171
|
+
// once nothing is in flight, and saying it is what displaces the percentage
|
|
172
|
+
// queued behind the throttle
|
|
173
|
+
let lastMessage;
|
|
174
|
+
/**
|
|
175
|
+
* The best available answer to "what is this batch doing", in order: a
|
|
176
|
+
* reading we trust, whatever the aggregate says, the last label we saw.
|
|
177
|
+
* Undefined only while no slot has ever reported.
|
|
178
|
+
*/
|
|
179
|
+
const derive = () => {
|
|
180
|
+
const aggregate = aggregateStatus(slots, phaseRank);
|
|
181
|
+
const message = statusMessageText(aggregate);
|
|
182
|
+
// A held reading describes one phase, and survives exactly as long as the
|
|
183
|
+
// batch is still in it. "Nothing in flight" is not that phase either: an
|
|
184
|
+
// empty aggregate is a batch with no work outstanding, and re-sending a
|
|
185
|
+
// percentage for work that has ENDED is the write ADR-071 exists to cancel.
|
|
186
|
+
// Both cases are one comparison, because an empty aggregate names no phase.
|
|
187
|
+
if (held?.message !== message) {
|
|
188
|
+
held = undefined;
|
|
189
|
+
}
|
|
190
|
+
const reading = statusReading(aggregate);
|
|
191
|
+
if (holdLastReading && reading !== undefined && !readsComplete(reading)) {
|
|
192
|
+
held = reading;
|
|
193
|
+
}
|
|
194
|
+
if (message !== undefined) {
|
|
195
|
+
lastMessage = message;
|
|
196
|
+
}
|
|
197
|
+
return held ?? aggregate ?? lastMessage;
|
|
198
|
+
};
|
|
199
|
+
return {
|
|
200
|
+
idle: () => slots.length === 0,
|
|
201
|
+
size: () => slots.length,
|
|
202
|
+
add() {
|
|
203
|
+
const slot = { status: undefined, completed: new Map() };
|
|
204
|
+
slots.push(slot);
|
|
205
|
+
return slot;
|
|
206
|
+
},
|
|
207
|
+
/**
|
|
208
|
+
* Retire a slot. Its finished phases go with it — one operation's bytes
|
|
209
|
+
* were never the denominator of another's, and a slot kept for its
|
|
210
|
+
* `completed` alone is the accumulation a long-lived aggregate cannot
|
|
211
|
+
* afford. Emptying resets the phase order too: idle is the batch boundary,
|
|
212
|
+
* and a rank recorded an hour ago has no business ordering today's phases.
|
|
213
|
+
*/
|
|
214
|
+
remove(slot) {
|
|
215
|
+
const index = slots.indexOf(slot);
|
|
216
|
+
if (index !== -1) {
|
|
217
|
+
slots.splice(index, 1);
|
|
218
|
+
}
|
|
219
|
+
// a held reading describes an aggregate this slot was part of
|
|
220
|
+
held = undefined;
|
|
221
|
+
if (slots.length === 0) {
|
|
222
|
+
phaseRank.clear();
|
|
223
|
+
lastMessage = undefined;
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
/** Record one slot's status, then re-derive the shared value. */
|
|
227
|
+
update(slot, status) {
|
|
228
|
+
// what this slot just finished, credited at the total it retired at —
|
|
229
|
+
// only its own channel ever saw that number
|
|
230
|
+
const previous = statusReading(slot.status);
|
|
231
|
+
if (previous !== undefined && !continuesPhase(previous, status)) {
|
|
232
|
+
const { message, current, total } = previous;
|
|
233
|
+
// A phase that ENDED is charged its total: its `current` was only ever
|
|
234
|
+
// its total written twice, and undercharging it is what made the bar run
|
|
235
|
+
// backwards as a batch landed. A phase that THREW is charged what it
|
|
236
|
+
// transferred — the 900 bytes a dead socket will never carry are not
|
|
237
|
+
// work this batch completed, and crediting them walked the bar forward
|
|
238
|
+
// on a failure. Nothing in the readings separates the two, so
|
|
239
|
+
// {@link PhaseFailure} carries the difference.
|
|
240
|
+
slot.completed.set(message, finished(slot, message) + (isPhaseFailure(status) ? current : total));
|
|
241
|
+
}
|
|
242
|
+
// the marker is consumed here. From now on the slot is simply reporting
|
|
243
|
+
// the label the retire left behind, so nothing downstream — a parent
|
|
244
|
+
// channel, a display's field — has to know the shape exists.
|
|
245
|
+
slot.status = isPhaseFailure(status) ? status.message : status;
|
|
246
|
+
// every label, not only the determinate ones: an indeterminate phase that
|
|
247
|
+
// ties with another has to rank somewhere too, and it is the first slot to
|
|
248
|
+
// say the words that dates the phase either way
|
|
249
|
+
const phase = statusMessageText(status);
|
|
250
|
+
if (phase !== undefined && !phaseRank.has(phase)) {
|
|
251
|
+
phaseRank.set(phase, phaseRank.size);
|
|
252
|
+
}
|
|
253
|
+
return derive();
|
|
254
|
+
},
|
|
255
|
+
derive,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
// An RPC statusCallback fires per progress event (often ~40/s), and each write
|
|
259
|
+
// to the observable statusMessage/statusProgress re-renders whatever loading
|
|
260
|
+
// indicator is up (and repositions its MUI Tooltip/Popper) — re-renders were
|
|
261
|
+
// measured outpacing the zoom animation's own frame rate before this. A progress
|
|
262
|
+
// indicator gains nothing from updating faster.
|
|
263
|
+
const STATUS_THROTTLE_MS = 100;
|
|
264
|
+
/**
|
|
265
|
+
* Thin one channel's status emits at the *source*, for a transport that pays
|
|
266
|
+
* per message.
|
|
267
|
+
*
|
|
268
|
+
* {@link createStatusWindow} already throttles what reaches a display's status
|
|
269
|
+
* field, but it runs on the main thread: every emit the worker made still cost
|
|
270
|
+
* a postMessage, a task and a structured clone to get there and be dropped. A
|
|
271
|
+
* scroll-zoom measured 9,668 of those in ten seconds — 23% of the main thread's
|
|
272
|
+
* busy time — for the ~100 statuses the window let through.
|
|
273
|
+
*
|
|
274
|
+
* What it drops is only ever an intermediate reading of a phase a later reading
|
|
275
|
+
* of the same phase supersedes, so {@link createStatusAggregate} is unaffected:
|
|
276
|
+
* it takes the latest reading per slot, and credits a phase its total only when
|
|
277
|
+
* the *label* changes. A change of label — including the `''` retire — and a
|
|
278
|
+
* {@link PhaseFailure} therefore go through untouched, and a reading queued
|
|
279
|
+
* behind the window is flushed ahead of the label that supersedes it so the
|
|
280
|
+
* transition still carries the phase's own last numbers.
|
|
281
|
+
*/
|
|
282
|
+
export function throttleStatusEmits(emit) {
|
|
283
|
+
let lastEmitMs = 0;
|
|
284
|
+
let lastPhase;
|
|
285
|
+
let queued;
|
|
286
|
+
let timer;
|
|
287
|
+
const send = (status) => {
|
|
288
|
+
lastEmitMs = Date.now();
|
|
289
|
+
lastPhase = phaseOf(status);
|
|
290
|
+
emit(status);
|
|
291
|
+
};
|
|
292
|
+
const clearQueued = () => {
|
|
293
|
+
if (timer !== undefined) {
|
|
294
|
+
clearTimeout(timer);
|
|
295
|
+
timer = undefined;
|
|
296
|
+
}
|
|
297
|
+
queued = undefined;
|
|
298
|
+
};
|
|
299
|
+
return (status) => {
|
|
300
|
+
const wait = STATUS_THROTTLE_MS - (Date.now() - lastEmitMs);
|
|
301
|
+
if (wait > 0 && phaseOf(status) === lastPhase && !isPhaseFailure(status)) {
|
|
302
|
+
queued = status;
|
|
303
|
+
timer ??= setTimeout(() => {
|
|
304
|
+
timer = undefined;
|
|
305
|
+
// an assertion rather than a guard: the timer is scheduled in the same
|
|
306
|
+
// breath as the write to `queued`, and `clearQueued` drops the two
|
|
307
|
+
// together
|
|
308
|
+
const pending = queued;
|
|
309
|
+
queued = undefined;
|
|
310
|
+
send(pending);
|
|
311
|
+
}, wait);
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
if (queued !== undefined) {
|
|
315
|
+
send(queued);
|
|
316
|
+
}
|
|
317
|
+
clearQueued();
|
|
318
|
+
send(status);
|
|
319
|
+
}
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Open a {@link StatusWindow} over one status field. `write` is that field's
|
|
324
|
+
* **only** writer, statuses and the closing blank alike, so whatever guards it
|
|
325
|
+
* — `isAlive(self)`, a React `alive` flag — guards every one of them by
|
|
326
|
+
* construction rather than by a copy of the check at each `finally`.
|
|
327
|
+
*
|
|
328
|
+
* Leading-edge, so sparse updates pass straight through and dense bursts are
|
|
329
|
+
* thinned; trailing as well, so the last write of a phase always lands — it is
|
|
330
|
+
* the one that matters most and exactly the one a leading-edge-only gate drops.
|
|
331
|
+
*
|
|
332
|
+
* Create **one per owner** — a display, a dialog run, an assembly load — and
|
|
333
|
+
* take every one of that owner's status callbacks off it as a stream. The
|
|
334
|
+
* streams are slots in one aggregate, so the owner's two concurrent operations
|
|
335
|
+
* arbitrate for the field the same way one fetch's parallel regions do, and
|
|
336
|
+
* neither ends the other's label (ADR-081).
|
|
337
|
+
*
|
|
338
|
+
* Deliberately wraps only the *callback* path, never `setStatusMessage` itself
|
|
339
|
+
* — a display writing a phase label by hand ("Downloading" → "Parsing") is a
|
|
340
|
+
* sequence of distinct labels, and a trailing edge only guarantees the *last*
|
|
341
|
+
* of a burst, not each one in turn.
|
|
342
|
+
*
|
|
343
|
+
* Both fetch families own one: `FetchMixin` for the LGV displays, and
|
|
344
|
+
* `createStopTokenRotation` for the bare-autorun fetches (dotplot, synteny)
|
|
345
|
+
* that compose no fetch mixin — and a display that has both lends the mixin's
|
|
346
|
+
* to the rotation rather than opening a second on one field. A plain function
|
|
347
|
+
* rather than shared model state because the two families declare their status
|
|
348
|
+
* fields separately and one set shadows the other — see ADR-041.
|
|
349
|
+
*/
|
|
350
|
+
export function createStatusWindow(write) {
|
|
351
|
+
let lastMs = 0;
|
|
352
|
+
let pending;
|
|
353
|
+
let timer;
|
|
354
|
+
const clearPending = () => {
|
|
355
|
+
if (timer !== undefined) {
|
|
356
|
+
clearTimeout(timer);
|
|
357
|
+
timer = undefined;
|
|
358
|
+
}
|
|
359
|
+
pending = undefined;
|
|
360
|
+
};
|
|
361
|
+
const run = (apply) => {
|
|
362
|
+
const now = Date.now();
|
|
363
|
+
const wait = STATUS_THROTTLE_MS - (now - lastMs);
|
|
364
|
+
if (wait <= 0) {
|
|
365
|
+
// a write passing on the leading edge supersedes anything queued behind
|
|
366
|
+
// it, so the trailing timer has nothing left to deliver
|
|
367
|
+
clearPending();
|
|
368
|
+
lastMs = now;
|
|
369
|
+
apply();
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
// only the newest write of a burst survives — an older progress value
|
|
373
|
+
// is never what the user wants to be looking at
|
|
374
|
+
pending = apply;
|
|
375
|
+
timer ??= setTimeout(() => {
|
|
376
|
+
timer = undefined;
|
|
377
|
+
// an assertion, not a fallback: the timer is scheduled right after
|
|
378
|
+
// `pending` is set and `clearPending` drops the two together, so an
|
|
379
|
+
// `if (pending)` here would read as a reachable case and silently skip
|
|
380
|
+
// the `lastMs` bump
|
|
381
|
+
const queued = pending;
|
|
382
|
+
pending = undefined;
|
|
383
|
+
lastMs = Date.now();
|
|
384
|
+
queued();
|
|
385
|
+
}, wait);
|
|
386
|
+
}
|
|
387
|
+
};
|
|
388
|
+
const reset = () => {
|
|
389
|
+
clearPending();
|
|
390
|
+
lastMs = 0;
|
|
391
|
+
};
|
|
392
|
+
const aggregate = createStatusAggregate();
|
|
393
|
+
// never skipped: the value is `undefined` only before any slot has spoken,
|
|
394
|
+
// and a slot that has just spoken is one that has
|
|
395
|
+
const emit = (status) => {
|
|
396
|
+
if (status !== undefined) {
|
|
397
|
+
write(status);
|
|
398
|
+
}
|
|
399
|
+
};
|
|
400
|
+
return {
|
|
401
|
+
open({ isCurrent }) {
|
|
402
|
+
// an operation starting after a lull reports at once; one starting beside
|
|
403
|
+
// a running sibling waits its turn in the sibling's cadence
|
|
404
|
+
if (aggregate.idle()) {
|
|
405
|
+
reset();
|
|
406
|
+
}
|
|
407
|
+
const slot = aggregate.add();
|
|
408
|
+
warnOnSlotLeak(aggregate.size());
|
|
409
|
+
let live = true;
|
|
410
|
+
return {
|
|
411
|
+
statusCallback: status => {
|
|
412
|
+
if (live && isCurrent()) {
|
|
413
|
+
// recorded now, derived again when the write lands: a status that
|
|
414
|
+
// waited out the window would otherwise describe the slots as they
|
|
415
|
+
// were when it was queued, and a sibling may have retired since
|
|
416
|
+
aggregate.update(slot, status);
|
|
417
|
+
run(() => {
|
|
418
|
+
// re-read inside, because a trailing write fires on a timer and
|
|
419
|
+
// the operation it belongs to can be gone by then — a run that
|
|
420
|
+
// has since been stopped must not restore the label "Stopping"
|
|
421
|
+
// has already replaced
|
|
422
|
+
if (isCurrent()) {
|
|
423
|
+
emit(aggregate.derive());
|
|
424
|
+
}
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
},
|
|
428
|
+
clear() {
|
|
429
|
+
if (!live) {
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
live = false;
|
|
433
|
+
aggregate.remove(slot);
|
|
434
|
+
if (aggregate.idle()) {
|
|
435
|
+
// the owner's last word, and nothing is coming to displace it
|
|
436
|
+
reset();
|
|
437
|
+
write(undefined);
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
run(() => {
|
|
441
|
+
emit(aggregate.derive());
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
},
|
|
445
|
+
};
|
|
446
|
+
},
|
|
447
|
+
reset,
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
// An owner has a handful of concurrent operations at most — a display's three
|
|
451
|
+
// are the widest case in the tree — so a window past this is an operation that
|
|
452
|
+
// took a slot and never retired it, which pins a label up and goes on voting for
|
|
453
|
+
// a phase that is over. Silent otherwise, and `ChordVariantDisplay` was in
|
|
454
|
+
// exactly that shape from before ADR-081 gave the leak teeth.
|
|
455
|
+
const SLOT_LEAK_THRESHOLD = 16;
|
|
456
|
+
let warnedSlotLeak = false;
|
|
457
|
+
function warnOnSlotLeak(open) {
|
|
458
|
+
if (process.env.NODE_ENV === 'production' || warnedSlotLeak) {
|
|
459
|
+
return;
|
|
460
|
+
}
|
|
461
|
+
if (open > SLOT_LEAK_THRESHOLD) {
|
|
462
|
+
warnedSlotLeak = true;
|
|
463
|
+
console.error(`createStatusWindow: ${open} status streams open on one window. An ` +
|
|
464
|
+
`operation is not calling its stream's clear() — see ADR-081 and ` +
|
|
465
|
+
`agent-docs/reference/PROGRESS_REPORTING.md.`);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* Format a phase label with a rounded percentage appended when a determinate
|
|
470
|
+
* `fraction` is present (e.g. `progressLabel('Downloading', 0.45)` →
|
|
471
|
+
* `"Downloading 45%"`). The single place the `X%` suffix is formatted: both
|
|
472
|
+
* {@link statusProgressLabel} (RpcStatus callers) and the loading
|
|
473
|
+
* overlays/indicators — which hold the message and fraction already split apart
|
|
474
|
+
* onto the model — route through it, so no caller hand-rolls `Math.round`.
|
|
475
|
+
*/
|
|
476
|
+
export function progressLabel(message, fraction) {
|
|
477
|
+
const percent = fraction === undefined ? '' : `${Math.round(fraction * 100)}%`;
|
|
478
|
+
return [message, percent].filter(Boolean).join(' ');
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* {@link progressLabel} for an {@link RpcStatus}: the message, with a rounded
|
|
482
|
+
* percentage appended when the status is determinate (e.g. `"Downloading 45%"`).
|
|
483
|
+
* The form the loading dialogs use, holding the raw status object.
|
|
484
|
+
*/
|
|
485
|
+
export function statusProgressLabel(status) {
|
|
486
|
+
return progressLabel(statusMessageText(status), statusFraction(status));
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* Adapt the byte-granularity download callback exposed by the readers
|
|
490
|
+
* (generic-filehandle2 `readFile`, @gmod/tabix `getLines`, @gmod/bam /
|
|
491
|
+
* @gmod/cram `getRecordsForRange`) to the structured {@link StatusCallback}
|
|
492
|
+
* transport, labelling each tick with `message`. Returns undefined when there's
|
|
493
|
+
* no `statusCallback`, so the reader can skip its progress bookkeeping entirely.
|
|
494
|
+
*
|
|
495
|
+
* **That skip is not a saving**, which is the opposite of what the shape
|
|
496
|
+
* suggests. Handed an `onProgress`, generic-filehandle2 streams the body into
|
|
497
|
+
* one pre-sized buffer; handed none it calls `res.bytes()` — and in a Chrome
|
|
498
|
+
* worker the streaming read is roughly 1.8x *faster* up to 10MB, giving that
|
|
499
|
+
* back only past ~25MB. So withholding this reporter honors a caller who asked
|
|
500
|
+
* for no reporting; it is never about speed. Numbers and the bench that retakes
|
|
501
|
+
* them:
|
|
502
|
+
* agent-docs/measurements/download-read-path.json.
|
|
503
|
+
*
|
|
504
|
+
* `total` is optional because not every reader knows the size up front
|
|
505
|
+
* (generic-filehandle2 omits it when the response has no Content-Length): with a
|
|
506
|
+
* total we emit a determinate bar, without one we emit just the label so the UI
|
|
507
|
+
* still shows the phase as an indeterminate spinner.
|
|
508
|
+
*
|
|
509
|
+
* Internal to this module — the only caller is {@link downloadStatus}, which is
|
|
510
|
+
* the API adapters use. Kept separate purely so the reporter logic reads on its
|
|
511
|
+
* own line.
|
|
512
|
+
*/
|
|
513
|
+
function downloadStatusReporter(statusCallback, label) {
|
|
514
|
+
const message = phaseOf(label);
|
|
515
|
+
const source = statusSource(label);
|
|
516
|
+
return statusCallback
|
|
517
|
+
? (current, total) => {
|
|
518
|
+
statusCallback(total === undefined ? label : { message, current, total, source });
|
|
519
|
+
}
|
|
520
|
+
: undefined;
|
|
521
|
+
}
|
|
522
|
+
/**
|
|
523
|
+
* Run a download phase whose reader counts its own progress. Shows `label`,
|
|
524
|
+
* hands `fn` the {@link downloadStatusReporter} to pass straight to the
|
|
525
|
+
* reader's `onProgress` (its ticks upgrade the same label to a determinate
|
|
526
|
+
* bar), then clears the status. Combines {@link updateStatus} with the reporter
|
|
527
|
+
* so the label is written in exactly one place — the phase label and the
|
|
528
|
+
* progress label can't drift apart.
|
|
529
|
+
*
|
|
530
|
+
* The unit is whatever the reader counts, and the caller does not have to know
|
|
531
|
+
* which: bytes for the index readers, blocks and expected-value chunks for
|
|
532
|
+
* `@gmod/hic`. All of them report `(current, total?)`.
|
|
533
|
+
*
|
|
534
|
+
* `stopToken` makes the phase a cancellation boundary, exactly as it does on
|
|
535
|
+
* {@link updateStatus} — `fn` is checked on both sides of its await.
|
|
536
|
+
*
|
|
537
|
+
* A {@link StatusPhase} `label` carries its source onto the readings too, so a
|
|
538
|
+
* download that stalls part-way through still names the file it was reading.
|
|
539
|
+
*/
|
|
540
|
+
export async function downloadStatus(label, statusCallback, fn, stopToken) {
|
|
541
|
+
return updateStatus(label, statusCallback, () => fn(downloadStatusReporter(statusCallback, label)), stopToken);
|
|
542
|
+
}
|
|
543
|
+
/** How much of `message` this slot has already finished. */
|
|
544
|
+
function finished(slot, message) {
|
|
545
|
+
return slot.completed.get(message) ?? 0;
|
|
546
|
+
}
|
|
547
|
+
/**
|
|
548
|
+
* Does the batch have a measurement for this phase at all — one running now, or
|
|
549
|
+
* one it already retired? This is what separates a phase a region is still
|
|
550
|
+
* working through from one it has merely announced, and so what a tie between
|
|
551
|
+
* two phases turns on before their order does.
|
|
552
|
+
*/
|
|
553
|
+
function measurable(vote) {
|
|
554
|
+
return vote.live > 0 || vote.anyFinished;
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* Combine the in-flight statuses of several concurrent operations (one RPC per
|
|
558
|
+
* visible region, say) into the single status the loading UI shows, so N regions
|
|
559
|
+
* read as one bar instead of each clobbering the shared field. Returns undefined
|
|
560
|
+
* when nothing is in flight.
|
|
561
|
+
*
|
|
562
|
+
* **Only operations in the same phase are summed.** `current`/`total` are
|
|
563
|
+
* additive within a phase — bytes with bytes, features with features — and
|
|
564
|
+
* incommensurable across one, so one phase wins and the rest are charged below
|
|
565
|
+
* (ADR-072). A fan-out whose slots share one phase, the common case, is a plain
|
|
566
|
+
* Σcurrent/Σtotal.
|
|
567
|
+
*
|
|
568
|
+
* **The phase that wins is the earliest one the batch is still in** (ADR-080). A
|
|
569
|
+
* batch is in every phase any of its operations is in — the phase that operation
|
|
570
|
+
* last *reported*, not the one it happens to be measuring this instant — and it
|
|
571
|
+
* leaves one when its LAST operation does. So the label moves forward once per
|
|
572
|
+
* phase, in order, and the bar under it is that phase's own.
|
|
573
|
+
*
|
|
574
|
+
* Rank alone would hand the label to a phase with nothing to say, so a phase the
|
|
575
|
+
* batch has anything to measure in — a reading now, or work already finished —
|
|
576
|
+
* beats one it does not. `phaseRank` is the fan-out's record of first
|
|
577
|
+
* appearance; with none, every phase ranks the same and the choice falls back to
|
|
578
|
+
* slot order.
|
|
579
|
+
*
|
|
580
|
+
* Each slot is then priced against the winning phase on its own, which is why
|
|
581
|
+
* this cannot be a Σ over two flat lists:
|
|
582
|
+
*
|
|
583
|
+
* - measuring it: its own `current`/`total`, plus whatever it already finished
|
|
584
|
+
* of that phase, in both halves.
|
|
585
|
+
* - not measuring it but having finished some: that finished work in both halves
|
|
586
|
+
* and **nothing more** — never the mean as well, or the bar falls every time a
|
|
587
|
+
* region moves on.
|
|
588
|
+
* - neither: in flight with nothing comparable to measure, so charged the mean
|
|
589
|
+
* of the totals we do know with nothing completed against it. That covers a
|
|
590
|
+
* response with no Content-Length and a slot in another phase alike; dropping
|
|
591
|
+
* either outright reads 100% while it is still downloading.
|
|
592
|
+
*
|
|
593
|
+
* A winning phase nothing is measuring right now comes back as its label alone —
|
|
594
|
+
* summing what its slots retired at reads 100% for a batch that is still
|
|
595
|
+
* working, and every slot being between reads is exactly when that happens.
|
|
596
|
+
* {@link createStatusFanOut} re-sends the phase's last real reading instead.
|
|
597
|
+
*
|
|
598
|
+
* A retired slot (`''` or nothing yet) never votes and is never charged the
|
|
599
|
+
* mean; charging it at zero is a bar that runs *backwards* as regions finish.
|
|
600
|
+
* Its finished work still counts, which is what keeps the fraction rising as the
|
|
601
|
+
* batch lands.
|
|
602
|
+
*/
|
|
603
|
+
export function aggregateStatus(slots, phaseRank = new Map()) {
|
|
604
|
+
const inFlight = slots.filter((s) => s.status !== undefined && s.status !== '');
|
|
605
|
+
if (inFlight.length === 0) {
|
|
606
|
+
return undefined;
|
|
607
|
+
}
|
|
608
|
+
const votes = new Map();
|
|
609
|
+
for (const slot of inFlight) {
|
|
610
|
+
const message = phaseOf(slot.status);
|
|
611
|
+
let vote = votes.get(message);
|
|
612
|
+
if (vote === undefined) {
|
|
613
|
+
// an unseen phase ranks last, and with no record at all every phase ranks
|
|
614
|
+
// the same — which leaves the reduce below keeping its incumbent, the
|
|
615
|
+
// slot-order tie-break
|
|
616
|
+
vote = {
|
|
617
|
+
message,
|
|
618
|
+
live: 0,
|
|
619
|
+
liveTotal: 0,
|
|
620
|
+
rank: phaseRank.get(message) ?? phaseRank.size,
|
|
621
|
+
anyFinished: slots.some(s => finished(s, message) > 0),
|
|
622
|
+
};
|
|
623
|
+
votes.set(message, vote);
|
|
624
|
+
}
|
|
625
|
+
vote.source ??= statusSource(slot.status);
|
|
626
|
+
const reading = statusReading(slot.status);
|
|
627
|
+
if (reading !== undefined) {
|
|
628
|
+
vote.live++;
|
|
629
|
+
vote.liveTotal += reading.total;
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
// Whether the phase has anything to measure at all, and then how early the
|
|
633
|
+
// batch reached it. Not how many slots are in it: a count changes hands as
|
|
634
|
+
// regions cross, and the label went back and forth with it.
|
|
635
|
+
const better = (a, b) => measurable(a) !== measurable(b) ? measurable(a) : a.rank < b.rank;
|
|
636
|
+
const best = [...votes.values()].reduce((winner, vote) => better(vote, winner) ? vote : winner);
|
|
637
|
+
const { message, source } = best;
|
|
638
|
+
// nothing is measuring the winner, so its label alone goes out: summing what
|
|
639
|
+
// its slots retired at reads 100% for a batch that is still going
|
|
640
|
+
if (best.live === 0) {
|
|
641
|
+
return source === undefined ? message : { message, source };
|
|
642
|
+
}
|
|
643
|
+
const mean = best.liveTotal / best.live;
|
|
644
|
+
let current = 0;
|
|
645
|
+
let total = 0;
|
|
646
|
+
for (const slot of slots) {
|
|
647
|
+
// finished work is charged in full to both halves, which is what stops the
|
|
648
|
+
// denominator shrinking as regions land
|
|
649
|
+
const done = finished(slot, message);
|
|
650
|
+
current += done;
|
|
651
|
+
total += done;
|
|
652
|
+
const { status } = slot;
|
|
653
|
+
const reading = statusReading(status);
|
|
654
|
+
if (reading !== undefined && reading.message === message) {
|
|
655
|
+
current += reading.current;
|
|
656
|
+
total += reading.total;
|
|
657
|
+
}
|
|
658
|
+
else if (done === 0 && status !== undefined && status !== '') {
|
|
659
|
+
// in flight with nothing comparable to measure, so charged the mean — and
|
|
660
|
+
// only here. A slot already credited for this phase is not charged for it
|
|
661
|
+
// a second time, which is what made the bar fall as regions moved on.
|
|
662
|
+
total += mean;
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
return { message, current, total, source };
|
|
666
|
+
}
|
|
667
|
+
/**
|
|
668
|
+
* Fan one status field out to several concurrent operations that would
|
|
669
|
+
* otherwise fight over it. Each `slot()` returns a {@link StatusCallback}
|
|
670
|
+
* remembering its own latest value and how much of each phase it has been
|
|
671
|
+
* through; every write re-derives the shared status from all slots through
|
|
672
|
+
* {@link aggregateStatus}, so N concurrent downloads read as one bar instead of
|
|
673
|
+
* last-writer-wins — and the first one to finish (which writes the `''` every
|
|
674
|
+
* phase helper clears with) can't blank the label while the others are still
|
|
675
|
+
* running.
|
|
676
|
+
*
|
|
677
|
+
* Use it wherever several operations are handed one `statusCallback` at once —
|
|
678
|
+
* a `Promise.all`, an rxjs `merge`, or the per-region fan-out the LGV displays'
|
|
679
|
+
* `callEachRegion` builds over a fetch context. One fan-out per batch: slots are
|
|
680
|
+
* taken for the batch's lifetime and it is the batch that ends, so a long-lived
|
|
681
|
+
* one accumulates slots for work that is over.
|
|
682
|
+
*
|
|
683
|
+
* **A slot's finished phases are recorded here**, because only a slot's own
|
|
684
|
+
* channel ever sees the total it retired at, and they are what keep a landing
|
|
685
|
+
* batch's bar from walking backwards. A phase is over the moment the slot stops
|
|
686
|
+
* reporting it forward — see {@link continuesPhase}; the `''` it ends on is only
|
|
687
|
+
* one of the ways it can say so.
|
|
688
|
+
*
|
|
689
|
+
* **It never writes `''`.** A slot between two phases and a slot that is done
|
|
690
|
+
* both read as idle from here, so an empty aggregate means "no slot is reporting
|
|
691
|
+
* this instant", not "the batch is over". What goes out is the last label alone,
|
|
692
|
+
* with no bar — which is what that state is. The end of a batch is the owner's
|
|
693
|
+
* to declare (ADR-080): every one of them clears its field when its work ends.
|
|
694
|
+
*
|
|
695
|
+
* Something rather than nothing, because a write that lands is also how a
|
|
696
|
+
* phase's last progress value is *displaced* — statuses are throttled, so a
|
|
697
|
+
* percentage queued behind the window would otherwise fire after the work it
|
|
698
|
+
* measured had ended (ADR-071).
|
|
699
|
+
*
|
|
700
|
+
* **A phase does not lose its bar because nothing is measuring it this
|
|
701
|
+
* instant.** Between reads a slot reports the label alone, and when every slot
|
|
702
|
+
* is between reads at once the aggregate has no measurement — a determinate bar
|
|
703
|
+
* would drop to an indeterminate spinner and return a tick later. The phase's
|
|
704
|
+
* last reading is held and re-sent instead, and dropped the moment the phase
|
|
705
|
+
* changes.
|
|
706
|
+
*/
|
|
707
|
+
export function createStatusFanOut(statusCallback) {
|
|
708
|
+
const aggregate = createStatusAggregate({ holdLastReading: true });
|
|
709
|
+
return () => {
|
|
710
|
+
const slot = aggregate.add();
|
|
711
|
+
return status => {
|
|
712
|
+
const out = aggregate.update(slot, status);
|
|
713
|
+
if (out !== undefined) {
|
|
714
|
+
statusCallback?.(out);
|
|
715
|
+
}
|
|
716
|
+
};
|
|
717
|
+
};
|
|
718
|
+
}
|
|
719
|
+
/**
|
|
720
|
+
* Does this reading say the work is finished? A fan-out's aggregate exists only
|
|
721
|
+
* while a slot is in flight, so a full one is never the truth: it is produced by
|
|
722
|
+
* a slot that has retired its read while another is still measuring, and the
|
|
723
|
+
* moment the retired one opens its next read the fraction falls back.
|
|
724
|
+
*
|
|
725
|
+
* So a complete reading is neither held nor shown when there is a real one to
|
|
726
|
+
* show instead; the phase ending is what moves the label on. Not a clamp on the
|
|
727
|
+
* arithmetic — {@link aggregateStatus} still reports what it computes, and a bar
|
|
728
|
+
* that falls because a region *joined* the batch still falls, which is true.
|
|
729
|
+
*/
|
|
730
|
+
function readsComplete(status) {
|
|
731
|
+
return status.total > 0 && status.current >= status.total;
|
|
732
|
+
}
|
|
733
|
+
/**
|
|
734
|
+
* Is `status` the same determinate phase as `previous`, still running? Only a
|
|
735
|
+
* measurement of the same phase moving forward is; everything else retires it
|
|
736
|
+
* (ADR-080). Three shapes that are easy to miss, and all of them common:
|
|
737
|
+
*
|
|
738
|
+
* - the *enclosing* label a nested phase closes onto — a plain string, not `''`.
|
|
739
|
+
* The canvas feature fetch is exactly that, an adapter's byte-counted
|
|
740
|
+
* "Downloading features" inside the RPC's own.
|
|
741
|
+
* - a different phase's label, with no `''` between them.
|
|
742
|
+
* - a measurement moving *backwards* under the same label, which is a second
|
|
743
|
+
* phase of that name starting at zero. Tabix's redispatch does it when a
|
|
744
|
+
* feature overhangs the query.
|
|
745
|
+
* - a {@link PhaseFailure}, which retires the phase whatever label it carries.
|
|
746
|
+
*/
|
|
747
|
+
function continuesPhase(previous, status) {
|
|
748
|
+
const reading = statusReading(status);
|
|
749
|
+
return (reading !== undefined &&
|
|
750
|
+
reading.message === previous.message &&
|
|
751
|
+
reading.current >= previous.current);
|
|
752
|
+
}
|
|
753
|
+
/**
|
|
754
|
+
* The single per-iteration callback for long synchronous worker loops. The
|
|
755
|
+
* returned `report(current)` is called once per outer-loop iteration and does
|
|
756
|
+
* two throttled jobs on each call:
|
|
757
|
+
*
|
|
758
|
+
* - checks the stop token via the existing throttled {@link checkStopTokenThrottled}
|
|
759
|
+
* machinery, so cancellation interrupts the loop within milliseconds instead
|
|
760
|
+
* of only at phase boundaries, and
|
|
761
|
+
* - emits a {@link StatusWithProgress} through `statusCallback` at most once per
|
|
762
|
+
* `throttleMs`, so the main thread gets a live percentage without flooding
|
|
763
|
+
* the postMessage channel.
|
|
764
|
+
*
|
|
765
|
+
* Both jobs are optional: with no `statusCallback`/`total` this is purely a
|
|
766
|
+
* throttled cancellation tick, so a loop has exactly one inner callback whether
|
|
767
|
+
* or not it drives the progress UI.
|
|
768
|
+
*
|
|
769
|
+
* Emission is gated on wall-clock time (`throttleMs`) through {@link
|
|
770
|
+
* createTimeGate}, which thins the `Date.now()` reads as well as the emits —
|
|
771
|
+
* see there for why its stride is learned rather than fixed. Keep the loop a
|
|
772
|
+
* plain `for` and call `report()` once per item (it owns the counter), or
|
|
773
|
+
* `report(n)` for an explicit position.
|
|
774
|
+
*/
|
|
775
|
+
export function createProgressReporter({ label = '', total, statusCallback, stopToken, stopTokenCheck, throttleMs = 100, }) {
|
|
776
|
+
const checker = stopTokenCheck ?? createStopTokenChecker(stopToken);
|
|
777
|
+
const emitDue = createTimeGate();
|
|
778
|
+
let count = 0;
|
|
779
|
+
return (current = count) => {
|
|
780
|
+
count = current + 1;
|
|
781
|
+
checkStopTokenThrottled(checker);
|
|
782
|
+
if (statusCallback !== undefined &&
|
|
783
|
+
total !== undefined &&
|
|
784
|
+
emitDue(throttleMs)) {
|
|
785
|
+
statusCallback({ message: label, current, total });
|
|
786
|
+
}
|
|
787
|
+
};
|
|
788
|
+
}
|
|
789
|
+
/**
|
|
790
|
+
* Run a measurable phase: shows `label` at 0%, hands `fn` a {@link
|
|
791
|
+
* ProgressReporter} to drive during the work, then checks the stop token once
|
|
792
|
+
* more and restores the enclosing phase. The determinate counterpart to
|
|
793
|
+
* `updateStatus`, and it nests the same way — see {@link openPhase}.
|
|
794
|
+
*/
|
|
795
|
+
export async function withProgress({ label, total, statusCallback, stopToken, }, fn) {
|
|
796
|
+
const report = createProgressReporter({
|
|
797
|
+
label,
|
|
798
|
+
total,
|
|
799
|
+
statusCallback,
|
|
800
|
+
stopToken,
|
|
801
|
+
});
|
|
802
|
+
const endPhase = openPhase(statusCallback, label);
|
|
803
|
+
// pessimistic for the same reason as `updateStatus`: a phase that leaves this
|
|
804
|
+
// scope any way other than returning did not finish its work
|
|
805
|
+
let outcome = 'failed';
|
|
806
|
+
try {
|
|
807
|
+
// inside the try, because `report` checks the stop token before it emits and
|
|
808
|
+
// so throws here on a token already stopped. Outside, that threw past the
|
|
809
|
+
// close and left the phase open on the channel — a slot whose last word is a
|
|
810
|
+
// label is one `aggregateStatus` counts as in flight for the rest of the
|
|
811
|
+
// batch.
|
|
812
|
+
report(0);
|
|
813
|
+
const result = await withStopTokenCheck(stopToken, () => fn(report));
|
|
814
|
+
outcome = 'completed';
|
|
815
|
+
return result;
|
|
816
|
+
}
|
|
817
|
+
finally {
|
|
818
|
+
endPhase(outcome);
|
|
819
|
+
}
|
|
820
|
+
}
|