@jbrowse/core 5.0.0-beta.1 → 5.0.0-beta.11
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 +1709 -390
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -5
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +3 -5
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +34 -29
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +1 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +37 -14
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +15 -31
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +4 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +12 -25
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.js +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +8 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +24 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +6 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.d.ts +4 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.js +17 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +5 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +6 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +7 -18
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.d.ts +16 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.js +49 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +6 -29
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +7 -34
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.js +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +3 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +12 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +12 -5
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceData.js +8 -5
- package/esm/BaseFeatureWidget/configSchema.d.ts +1 -1
- package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
- package/esm/BaseFeatureWidget/formatDetails.js +62 -83
- package/esm/BaseFeatureWidget/index.d.ts +2 -1
- package/esm/BaseFeatureWidget/stateModelFactory.d.ts +42 -29
- package/esm/BaseFeatureWidget/stateModelFactory.js +98 -98
- package/esm/BaseFeatureWidget/types.d.ts +12 -6
- package/esm/BaseFeatureWidget/util.d.ts +0 -10
- package/esm/BaseFeatureWidget/util.js +0 -17
- package/esm/CorePlugin.js +34 -3
- package/esm/PluginLoader.d.ts +24 -13
- package/esm/PluginLoader.js +167 -51
- package/esm/PluginManager.d.ts +130 -24
- package/esm/PluginManager.js +180 -32
- package/esm/ReExports/MuiDataGridReExports.d.ts +1 -0
- package/esm/ReExports/MuiDataGridReExports.js +2 -2
- package/esm/ReExports/coreModules.generated.d.ts +2 -0
- package/esm/ReExports/coreModules.generated.js +530 -0
- package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/coreWorkerModules.generated.js +490 -0
- package/esm/ReExports/frameworkModules.d.ts +2 -0
- package/esm/ReExports/frameworkModules.js +68 -0
- package/esm/ReExports/frameworkShared.d.ts +12 -0
- package/esm/ReExports/frameworkShared.js +16 -0
- package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
- package/esm/ReExports/list.js +528 -79
- package/esm/ReExports/modules.d.ts +1 -1
- package/esm/ReExports/modules.js +10 -165
- package/esm/ReExports/registry.d.ts +1 -0
- package/esm/ReExports/registry.js +23 -5
- package/esm/ReExports/uiStub.d.ts +3 -0
- package/esm/ReExports/uiStub.js +33 -0
- package/esm/ReExports/workerModules.d.ts +2 -0
- package/esm/ReExports/workerModules.js +11 -0
- package/esm/TextSearch/TextSearchManager.d.ts +27 -13
- package/esm/TextSearch/TextSearchManager.js +77 -36
- package/esm/TextSearch/places.d.ts +12 -0
- package/esm/TextSearch/places.js +94 -0
- package/esm/assemblyManager/assembly.d.ts +21 -19
- package/esm/assemblyManager/assembly.js +28 -26
- package/esm/assemblyManager/assemblyAdapters.d.ts +1 -1
- package/esm/assemblyManager/assemblyAdapters.js +8 -2
- package/esm/assemblyManager/assemblyConfigSchema.d.ts +31 -90
- package/esm/assemblyManager/assemblyConfigSchema.js +35 -47
- package/esm/assemblyManager/assemblyManager.d.ts +35 -180
- package/esm/assemblyManager/assemblyManager.js +47 -51
- package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +25 -18
- package/esm/assemblyManager/expandAssemblyConfigShorthand.js +78 -49
- package/esm/assemblyManager/geneticCodes.js +2 -5
- package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +10 -0
- package/esm/assemblyManager/getSequenceAdapterConfig.js +10 -0
- package/esm/assemblyManager/indexAssemblyNames.d.ts +9 -0
- package/esm/assemblyManager/indexAssemblyNames.js +22 -0
- package/esm/assemblyManager/loadRefNameMap.d.ts +1 -1
- package/esm/assemblyManager/loadRefNameMap.js +4 -9
- package/esm/assemblyManager/refNameMapKey.d.ts +7 -0
- package/esm/assemblyManager/refNameMapKey.js +12 -0
- package/esm/checkPlugins.d.ts +2 -0
- package/esm/checkPlugins.js +38 -17
- package/esm/configuration/bamIndexFields.d.ts +49 -0
- package/esm/configuration/bamIndexFields.js +41 -0
- package/esm/configuration/configurationSchema.d.ts +101 -71
- package/esm/configuration/configurationSchema.js +207 -134
- package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
- package/esm/configuration/configurationSchemaUnion.js +56 -0
- package/esm/configuration/configurationSlot.d.ts +150 -60
- package/esm/configuration/configurationSlot.js +103 -75
- package/esm/configuration/fillLocations.d.ts +14 -0
- package/esm/configuration/fillLocations.js +14 -0
- package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
- package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
- package/esm/configuration/formatDetailsConfigSchema.js +10 -13
- package/esm/configuration/fullConfSnapshot.d.ts +4 -19
- package/esm/configuration/fullConfSnapshot.js +30 -52
- package/esm/configuration/getConf.d.ts +45 -41
- package/esm/configuration/getConf.js +111 -44
- package/esm/configuration/index.d.ts +26 -11
- package/esm/configuration/index.js +16 -7
- package/esm/configuration/indexType.d.ts +26 -0
- package/esm/configuration/indexType.js +38 -0
- package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
- package/esm/configuration/mergeFormatCallbacks.js +13 -10
- package/esm/configuration/plot.d.ts +61 -0
- package/esm/configuration/plot.js +142 -0
- package/esm/configuration/readConfObject.d.ts +2 -24
- package/esm/configuration/readConfObject.js +20 -63
- package/esm/configuration/requirements.d.ts +37 -0
- package/esm/configuration/requirements.js +88 -0
- package/esm/configuration/schemaRegistry.d.ts +32 -15
- package/esm/configuration/schemaRegistry.js +33 -35
- package/esm/configuration/schemaTypes.d.ts +21 -5
- package/esm/configuration/schemaTypes.js +66 -55
- package/esm/configuration/slotFacade.d.ts +12 -29
- package/esm/configuration/slotFacade.js +44 -23
- package/esm/configuration/snapshotPreprocess.d.ts +43 -0
- package/esm/configuration/snapshotPreprocess.js +161 -0
- package/esm/configuration/tabixIndexFields.d.ts +30 -4
- package/esm/configuration/tabixIndexFields.js +21 -4
- package/esm/configuration/tabixShorthand.d.ts +34 -17
- package/esm/configuration/tabixShorthand.js +49 -22
- package/esm/configuration/types.d.ts +182 -43
- package/esm/configuration/uriShorthand.d.ts +9 -0
- package/esm/configuration/uriShorthand.js +16 -0
- package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +13 -19
- package/esm/data_adapters/BaseAdapter/BaseAdapter.js +12 -19
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +40 -2
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +68 -5
- package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +40 -0
- package/esm/data_adapters/BaseAdapter/featureDensity.js +31 -0
- package/esm/data_adapters/BaseAdapter/index.d.ts +23 -3
- package/esm/data_adapters/BaseAdapter/index.js +1 -0
- package/esm/data_adapters/BaseAdapter/rowSources.d.ts +37 -0
- package/esm/data_adapters/BaseAdapter/rowSources.js +7 -0
- package/esm/data_adapters/BaseAdapter/stats.d.ts +33 -1
- package/esm/data_adapters/BaseAdapter/stats.js +52 -13
- package/esm/data_adapters/BaseAdapter/types.d.ts +8 -12
- package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
- package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
- package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +7 -11
- package/esm/data_adapters/CytobandAdapter/configSchema.js +3 -17
- package/esm/data_adapters/dataAdapterCache.d.ts +19 -2
- package/esm/data_adapters/dataAdapterCache.js +44 -10
- package/esm/data_adapters/getFeatureAdapter.d.ts +6 -4
- package/esm/data_adapters/getFeatureAdapter.js +8 -8
- package/esm/data_adapters/getSequenceSubAdapter.d.ts +7 -9
- package/esm/data_adapters/getSequenceSubAdapter.js +8 -10
- package/esm/pluggableElementTypes/AdapterType.d.ts +8 -8
- package/esm/pluggableElementTypes/AdapterType.js +1 -1
- package/esm/pluggableElementTypes/DisplayType.d.ts +53 -16
- package/esm/pluggableElementTypes/DisplayType.js +28 -12
- package/esm/pluggableElementTypes/LazyStateModelElement.d.ts +32 -0
- package/esm/pluggableElementTypes/LazyStateModelElement.js +77 -0
- package/esm/pluggableElementTypes/PluggableElementBase.d.ts +3 -5
- package/esm/pluggableElementTypes/PluggableElementBase.js +3 -5
- package/esm/pluggableElementTypes/RpcMethodType.d.ts +11 -1
- package/esm/pluggableElementTypes/RpcMethodType.js +25 -9
- package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
- package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
- package/esm/pluggableElementTypes/ViewType.d.ts +20 -4
- package/esm/pluggableElementTypes/ViewType.js +32 -4
- package/esm/pluggableElementTypes/WidgetType.d.ts +6 -0
- package/esm/pluggableElementTypes/WidgetType.js +6 -0
- package/esm/pluggableElementTypes/addMenuItems.d.ts +3 -2
- package/esm/pluggableElementTypes/extendElementType.d.ts +1 -2
- package/esm/pluggableElementTypes/extendElementType.js +9 -5
- package/esm/pluggableElementTypes/index.d.ts +2 -1
- package/esm/pluggableElementTypes/index.js +2 -9
- package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
- package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +122 -28
- package/esm/pluggableElementTypes/models/BaseDisplayModel.js +155 -11
- package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
- package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
- package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +87 -18
- package/esm/pluggableElementTypes/models/BaseViewModel.js +54 -11
- package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
- package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +15 -11
- package/esm/pluggableElementTypes/models/assertDisplayContract.js +25 -32
- package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
- package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
- package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
- package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +108 -147
- package/esm/pluggableElementTypes/models/baseTrackConfig.js +96 -73
- package/esm/pluggableElementTypes/models/components/SaveTrackData.js +4 -6
- package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
- package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +23 -13
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +80 -48
- package/esm/pluggableElementTypes/models/index.d.ts +2 -3
- package/esm/pluggableElementTypes/models/index.js +2 -3
- package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +15 -1
- package/esm/pluggableElementTypes/models/migrateTrackConfig.js +85 -25
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +4 -3
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +141 -19
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
- package/esm/pluginDefinitions.d.ts +34 -7
- package/esm/pluginDefinitions.js +54 -20
- package/esm/rpc/BaseRpcDriver.d.ts +2 -2
- package/esm/rpc/BaseRpcDriver.js +25 -30
- package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
- package/esm/rpc/MainThreadRpcDriver.js +13 -8
- package/esm/rpc/RpcClient.d.ts +18 -6
- package/esm/rpc/RpcClient.js +51 -16
- package/esm/rpc/RpcManager.d.ts +14 -10
- package/esm/rpc/RpcManager.js +11 -1
- package/esm/rpc/RpcRegistry.d.ts +40 -7
- package/esm/rpc/RpcServer.d.ts +3 -1
- package/esm/rpc/RpcServer.js +19 -12
- package/esm/rpc/WebWorkerRpcDriver.d.ts +11 -4
- package/esm/rpc/WebWorkerRpcDriver.js +64 -68
- package/esm/rpc/byteBudget.d.ts +20 -5
- package/esm/rpc/byteBudget.js +16 -5
- package/esm/rpc/configSchema.d.ts +7 -21
- package/esm/rpc/coreRpcMethods.d.ts +4 -0
- package/esm/rpc/coreRpcMethods.js +4 -0
- package/esm/rpc/methods/CoreGetEncodedFeature.d.ts +13 -0
- package/esm/rpc/methods/CoreGetEncodedFeature.js +32 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +16 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.js +59 -0
- package/esm/rpc/methods/CoreGetExportData.js +3 -4
- package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
- package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
- package/esm/rpc/methods/CoreGetFeatures.js +3 -5
- package/esm/rpc/methods/CoreGetRefNames.js +2 -12
- package/esm/rpc/methods/CoreGetRegionByteEstimate.js +1 -1
- package/esm/rpc/methods/CoreGetSequence.js +2 -2
- package/esm/rpc/methods/CoreLoadAdapterCode.d.ts +13 -0
- package/esm/rpc/methods/CoreLoadAdapterCode.js +16 -0
- package/esm/rpc/methods/layerFeatures.d.ts +33 -0
- package/esm/rpc/methods/layerFeatures.js +29 -0
- package/esm/svg/SvgExport.js +6 -7
- package/esm/svg/SvgThemeProviders.d.ts +12 -0
- package/esm/svg/SvgThemeProviders.js +15 -0
- package/esm/svg/exportViewSvg.d.ts +28 -0
- package/esm/svg/exportViewSvg.js +13 -0
- package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
- package/esm/svg/normalizeSvgMarkup.js +99 -0
- package/esm/svg/serializeSvg.d.ts +7 -0
- package/esm/svg/serializeSvg.js +11 -0
- package/esm/svg/svgId.d.ts +1 -1
- package/esm/svg/svgId.js +1 -1
- package/esm/svg/svgReady.d.ts +9 -7
- package/esm/svg/svgReady.js +8 -7
- package/esm/svg/trackNames.d.ts +7 -5
- package/esm/svg/trackNames.js +12 -9
- package/esm/svg/wrapSvgExport.js +6 -74
- package/esm/ui/AddCustomPluginDialog.js +3 -8
- package/esm/ui/AppReadyMarker.d.ts +45 -0
- package/esm/ui/AppReadyMarker.js +89 -0
- package/esm/ui/BaseExportSvgDialog.d.ts +1 -1
- package/esm/ui/CascadingMenu.js +181 -104
- package/esm/ui/DropDownMenu.js +2 -1
- package/esm/ui/ErrorBanner.js +1 -1
- package/esm/ui/ErrorBoundary.d.ts +2 -2
- package/esm/ui/ErrorMessageStackTraceContents.js +2 -1
- package/esm/ui/ErrorMessageStackTraceDialog.js +5 -11
- package/esm/ui/ExportSvgDialog.d.ts +1 -1
- package/esm/ui/FileDropZone.js +2 -1
- package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
- package/esm/ui/HoverMenu.d.ts +1 -2
- package/esm/ui/HoverMenu.js +6 -3
- package/esm/ui/JexlFilterDialog.d.ts +13 -10
- package/esm/ui/JexlFilterDialog.js +122 -50
- package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
- package/esm/ui/JexlFilterRowEditors.js +90 -0
- package/esm/ui/LazyBaseTooltip.d.ts +4 -0
- package/esm/ui/LazyBaseTooltip.js +9 -0
- package/esm/ui/LegendSwatchGlyph.js +26 -21
- package/esm/ui/LoadingOverlay.d.ts +14 -0
- package/esm/ui/LoadingOverlay.js +4 -2
- package/esm/ui/MenuTypes.d.ts +23 -53
- package/esm/ui/MenuTypes.js +3 -0
- package/esm/ui/MonospaceTextField.d.ts +2 -1
- package/esm/ui/MonospaceTextField.js +23 -20
- package/esm/ui/PaletteContext.d.ts +10 -5
- package/esm/ui/PaletteContext.js +44 -6
- package/esm/ui/RefNameAutocomplete/SearchOption.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/SearchOption.js +45 -0
- package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
- package/esm/ui/RefNameAutocomplete/index.js +8 -2
- package/esm/ui/RefNameAutocomplete/util.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/util.js +42 -1
- package/esm/ui/ResizeHandle.d.ts +3 -1
- package/esm/ui/ResizeHandle.js +44 -11
- package/esm/ui/ScrollChrome.d.ts +13 -0
- package/esm/ui/ScrollChrome.js +11 -0
- package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
- package/esm/ui/ScrollEdgeShadow.js +14 -35
- package/esm/ui/ScrollZoomToggle.d.ts +4 -27
- package/esm/ui/ScrollZoomToggle.js +34 -51
- package/esm/ui/SessionJsonPanel.d.ts +3 -0
- package/esm/ui/SessionJsonPanel.js +14 -0
- package/esm/ui/SettingsChangesTable.d.ts +1 -0
- package/esm/ui/SettingsChangesTable.js +49 -11
- package/esm/ui/ShareLinkField.d.ts +1 -3
- package/esm/ui/ShareLinkField.js +13 -40
- package/esm/ui/SizeSliderRow.d.ts +1 -3
- package/esm/ui/SizeSliderRow.js +4 -6
- package/esm/ui/SnackbarModel.js +79 -67
- package/esm/ui/StatusProgressBar.js +2 -2
- package/esm/ui/SvgColorLegend.d.ts +9 -4
- package/esm/ui/SvgColorLegend.js +82 -41
- package/esm/ui/VerticalScrollbar.d.ts +13 -34
- package/esm/ui/VerticalScrollbar.js +29 -83
- package/esm/ui/ViewLoadingScreen.d.ts +5 -4
- package/esm/ui/ViewLoadingScreen.js +8 -32
- package/esm/ui/colorScale.d.ts +92 -0
- package/esm/ui/colorScale.js +72 -0
- package/esm/ui/colors.d.ts +64 -0
- package/esm/ui/colors.js +230 -1
- package/esm/ui/hoverBoxStyle.d.ts +14 -2
- package/esm/ui/hoverBoxStyle.js +17 -2
- package/esm/ui/index.d.ts +12 -12
- package/esm/ui/index.js +14 -22
- package/esm/ui/launchViewMenu.js +15 -5
- package/esm/ui/legendMenuItem.d.ts +10 -32
- package/esm/ui/legendMenuItem.js +9 -36
- package/esm/ui/legendSpec.d.ts +15 -8
- package/esm/ui/legendSpec.js +14 -23
- package/esm/ui/makeSizeMenu.d.ts +0 -6
- package/esm/ui/makeSizeMenu.js +6 -30
- package/esm/ui/measureLegendText.js +1 -1
- package/esm/ui/menuItemAdornment.d.ts +9 -20
- package/esm/ui/menuItemAdornment.js +10 -32
- package/esm/ui/menuItems.d.ts +2 -7
- package/esm/ui/menuItems.js +1 -6
- package/esm/ui/multiTrackMenuItems.d.ts +6 -0
- package/esm/ui/palette.d.ts +118 -116
- package/esm/ui/palette.js +114 -75
- package/esm/ui/replaceViewAction.d.ts +1 -1
- package/esm/ui/replaceViewAction.js +1 -1
- package/esm/ui/theme.d.ts +43 -119
- package/esm/ui/theme.js +62 -78
- package/esm/ui/toggleMenuItems.d.ts +1 -3
- package/esm/ui/toggleMenuItems.js +6 -5
- package/esm/ui/useAssemblySelection.d.ts +4 -4
- package/esm/ui/viewHeaderHeight.d.ts +1 -0
- package/esm/ui/viewHeaderHeight.js +1 -0
- package/esm/util/Base1DUtils.d.ts +5 -3
- package/esm/util/Base1DUtils.js +14 -6
- package/esm/util/Base1DViewModel.d.ts +2 -1
- package/esm/util/Base1DViewModel.js +3 -2
- package/esm/util/SvgCanvas.d.ts +15 -13
- package/esm/util/SvgCanvas.js +76 -56
- package/esm/util/TimeTraveller.d.ts +3 -0
- package/esm/util/TimeTraveller.js +34 -2
- package/esm/util/aborting.d.ts +39 -0
- package/esm/util/aborting.js +88 -6
- package/esm/util/adapterMetadata.d.ts +1 -1
- package/esm/util/adapterMetadata.js +6 -5
- package/esm/util/addAndShowTrack.d.ts +2 -5
- package/esm/util/addAndShowTrack.js +5 -1
- package/esm/util/addRelativeUris.d.ts +17 -5
- package/esm/util/addRelativeUris.js +46 -10
- package/esm/util/addTrackFromWidget.d.ts +2 -5
- package/esm/util/addTrackFromWidget.js +5 -4
- package/esm/util/aggregateFieldName.d.ts +10 -0
- package/esm/util/aggregateFieldName.js +8 -0
- package/esm/util/analytics.js +46 -13
- package/esm/util/animationAllowed.d.ts +9 -0
- package/esm/util/animationAllowed.js +13 -0
- package/esm/util/applyRowResizeWheel.d.ts +10 -5
- package/esm/util/applyRowResizeWheel.js +10 -21
- package/esm/util/bandHeight.d.ts +10 -0
- package/esm/util/bandHeight.js +29 -0
- package/esm/util/bandLayout.d.ts +4 -4
- package/esm/util/bandLayout.js +4 -4
- package/esm/util/baseDisplayConfig.d.ts +8 -0
- package/esm/util/baseDisplayConfig.js +27 -0
- package/esm/util/bezierConnector.d.ts +4 -3
- package/esm/util/bezierConnector.js +38 -45
- package/esm/util/bgzfWorkerPool.d.ts +20 -74
- package/esm/util/bgzfWorkerPool.js +20 -74
- package/esm/util/binnedAggregate.d.ts +17 -0
- package/esm/util/binnedAggregate.js +275 -0
- package/esm/util/cacheBudgets.d.ts +22 -19
- package/esm/util/cacheBudgets.js +22 -19
- package/esm/util/cachedSetup.d.ts +16 -6
- package/esm/util/cachedSetup.js +108 -38
- package/esm/util/categoricalField.d.ts +56 -0
- package/esm/util/categoricalField.js +73 -0
- package/esm/util/cellMatches.d.ts +23 -0
- package/esm/util/cellMatches.js +264 -0
- package/esm/util/cellsStep.d.ts +29 -0
- package/esm/util/cellsStep.js +437 -0
- package/esm/util/clampToContig.d.ts +17 -0
- package/esm/util/clampToContig.js +19 -0
- package/esm/util/coarseStripHTML.js +1 -2
- package/esm/util/color/cssColorsLevel4.d.ts +1 -0
- package/esm/util/color/cssColorsLevel4.js +1 -0
- package/esm/util/color/index.d.ts +5 -3
- package/esm/util/color/index.js +7 -4
- package/esm/util/colorBits.d.ts +3 -3
- package/esm/util/colorBits.js +19 -44
- package/esm/util/colorRamp.d.ts +49 -5
- package/esm/util/colorRamp.js +169 -18
- package/esm/util/colorScale.d.ts +156 -0
- package/esm/util/colorScale.js +243 -0
- package/esm/util/colorSchemes.d.ts +21 -0
- package/esm/util/colorSchemes.js +30 -0
- package/esm/util/copyToClipboard.js +8 -1
- package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +21 -23
- package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +21 -52
- package/esm/util/createSvgRasterCanvas.d.ts +10 -0
- package/esm/util/cssColorParse.d.ts +15 -0
- package/esm/util/cssColorParse.js +53 -0
- package/esm/util/diagonalizeRegions.d.ts +2 -3
- package/esm/util/diagonalizeRegions.js +8 -13
- package/esm/util/expandLooseSearchIndex.d.ts +19 -0
- package/esm/util/expandLooseSearchIndex.js +29 -0
- package/esm/util/featureTable.d.ts +224 -0
- package/esm/util/featureTable.js +366 -0
- package/esm/util/featureTransforms.d.ts +81 -0
- package/esm/util/featureTransforms.js +1231 -0
- package/esm/util/featureTypes.d.ts +24 -0
- package/esm/util/featureTypes.js +35 -0
- package/esm/util/fetchAndMaybeUnzip.js +16 -9
- package/esm/util/fetchContext.d.ts +7 -8
- package/esm/util/fetchContext.js +3 -3
- package/esm/util/fetchHub.d.ts +4 -2
- package/esm/util/fetchHub.js +2 -2
- package/esm/util/fetchPhases.d.ts +10 -10
- package/esm/util/fetchSeq.d.ts +2 -3
- package/esm/util/fetchSeq.js +2 -2
- package/esm/util/fieldReader.d.ts +17 -0
- package/esm/util/fieldReader.js +62 -0
- package/esm/util/formatBytes.js +1 -1
- package/esm/util/formatGuessers.d.ts +25 -14
- package/esm/util/formatGuessers.js +42 -27
- package/esm/util/formatRelativeTime.js +1 -1
- package/esm/util/freezeDeep.d.ts +8 -10
- package/esm/util/freezeDeep.js +8 -10
- package/esm/util/getLocationUri.d.ts +2 -1
- package/esm/util/getLocationUri.js +8 -2
- package/esm/util/groupKeys.d.ts +76 -0
- package/esm/util/groupKeys.js +156 -0
- package/esm/util/highlights.d.ts +10 -6
- package/esm/util/highlights.js +12 -25
- package/esm/util/hooks.d.ts +31 -2
- package/esm/util/hooks.js +72 -3
- package/esm/util/index.d.ts +11 -11
- package/esm/util/index.js +11 -10
- package/esm/util/indexCandidates.d.ts +1 -31
- package/esm/util/indexCandidates.js +5 -63
- package/esm/util/installFetch.d.ts +77 -37
- package/esm/util/installFetch.js +65 -38
- package/esm/util/installInitAutorun.d.ts +14 -13
- package/esm/util/installInitAutorun.js +17 -17
- package/esm/util/installPrerequisiteFetch.d.ts +115 -0
- package/esm/util/installPrerequisiteFetch.js +111 -0
- package/esm/util/intervals.js +9 -4
- package/esm/util/io/index.js +22 -15
- package/esm/util/isDataCurrent.d.ts +7 -5
- package/esm/util/isDataCurrent.js +9 -6
- package/esm/util/isTextEntryFocused.d.ts +7 -0
- package/esm/util/isTextEntryFocused.js +16 -0
- package/esm/util/jexl.js +24 -21
- package/esm/util/jexlFilterRows.d.ts +89 -0
- package/esm/util/jexlFilterRows.js +252 -0
- package/esm/util/jexlFilters.d.ts +32 -57
- package/esm/util/jexlFilters.js +31 -29
- package/esm/util/jexlStrings.d.ts +3 -4
- package/esm/util/jexlStrings.js +2 -3
- package/esm/util/layouts/GranularRectLayout.d.ts +8 -1
- package/esm/util/layouts/GranularRectLayout.js +25 -8
- package/esm/util/lazyAfterAttach.d.ts +13 -0
- package/esm/util/lazyAfterAttach.js +31 -0
- package/esm/util/lazyWithPreload.d.ts +19 -0
- package/esm/util/lazyWithPreload.js +27 -0
- package/esm/util/legendCandidates.d.ts +72 -0
- package/esm/util/legendCandidates.js +138 -0
- package/esm/util/locString.js +5 -2
- package/esm/util/localStorage.js +4 -4
- package/esm/util/markEncoding.d.ts +150 -0
- package/esm/util/markEncoding.js +885 -0
- package/esm/util/markEncodingTypes.d.ts +595 -0
- package/esm/util/markEncodingTypes.js +8 -0
- package/esm/util/mst-reflection.d.ts +2 -20
- package/esm/util/mst-reflection.js +3 -53
- package/esm/util/mstUtils.d.ts +31 -23
- package/esm/util/mstUtils.js +39 -24
- package/esm/util/numericUtils.d.ts +7 -0
- package/esm/util/numericUtils.js +16 -0
- package/esm/util/numericValue.d.ts +14 -0
- package/esm/util/numericValue.js +34 -0
- package/esm/util/openFeatureWidget.d.ts +5 -0
- package/esm/util/openFeatureWidget.js +2 -2
- package/esm/util/openViews.d.ts +17 -0
- package/esm/util/openViews.js +22 -0
- package/esm/util/parentWalk.d.ts +1 -1
- package/esm/util/parentWalk.js +1 -1
- package/esm/util/parseLineByLine.d.ts +4 -5
- package/esm/util/parseLineByLine.js +8 -14
- package/esm/util/pluginStore.d.ts +6 -8
- package/esm/util/pluginStore.js +17 -16
- package/esm/util/preloadComponent.d.ts +5 -0
- package/esm/util/preloadComponent.js +11 -0
- package/esm/util/progress.d.ts +22 -22
- package/esm/util/progress.js +27 -26
- package/esm/util/quantileExtent.d.ts +49 -0
- package/esm/util/quantileExtent.js +162 -0
- package/esm/util/range.d.ts +13 -9
- package/esm/util/range.js +17 -8
- package/esm/util/renameRegions.d.ts +26 -6
- package/esm/util/renameRegions.js +68 -54
- package/esm/util/renderToStaticMarkup.js +24 -14
- package/esm/util/rxjs.d.ts +23 -8
- package/esm/util/rxjs.js +61 -15
- package/esm/util/samplesTsv.d.ts +49 -0
- package/esm/util/samplesTsv.js +86 -0
- package/esm/util/scheduleDetachedDestroy.d.ts +18 -0
- package/esm/util/scheduleDetachedDestroy.js +24 -0
- package/esm/util/scrollLatch.d.ts +1 -0
- package/esm/util/scrollLatch.js +8 -0
- package/esm/util/selectEncodedFeature.d.ts +16 -0
- package/esm/util/selectEncodedFeature.js +34 -0
- package/esm/util/sessionSharing.d.ts +7 -5
- package/esm/util/sessionSharing.js +23 -23
- package/esm/util/shapeNameList.d.ts +2 -0
- package/esm/util/shapeNameList.js +6 -0
- package/esm/util/shapeNames.d.ts +7 -0
- package/esm/util/shapeNames.js +11 -0
- package/esm/util/simpleFeature.d.ts +0 -1
- package/esm/util/springAnimate.js +1 -1
- package/esm/util/starFusion.d.ts +26 -0
- package/esm/util/starFusion.js +37 -0
- package/esm/util/stepTables.d.ts +96 -0
- package/esm/util/stepTables.js +277 -0
- package/esm/util/svAlt.d.ts +145 -0
- package/esm/util/svAlt.js +364 -0
- package/esm/util/svgColorProps.d.ts +11 -0
- package/esm/util/svgColorProps.js +28 -1
- package/esm/util/systemColorScheme.d.ts +12 -0
- package/esm/util/systemColorScheme.js +27 -0
- package/esm/util/tabix.d.ts +19 -10
- package/esm/util/tabix.js +19 -14
- package/esm/util/thresholdScale.d.ts +91 -0
- package/esm/util/thresholdScale.js +166 -0
- package/esm/util/timeGate.d.ts +4 -5
- package/esm/util/timeGate.js +4 -5
- package/esm/util/trackConfigDelta.d.ts +26 -26
- package/esm/util/trackConfigDelta.js +63 -47
- package/esm/util/tracks.d.ts +120 -66
- package/esm/util/tracks.js +501 -151
- package/esm/util/translateTranscript.d.ts +44 -0
- package/esm/util/translateTranscript.js +102 -0
- package/esm/util/types/data.d.ts +0 -2
- package/esm/util/types/index.d.ts +121 -22
- package/esm/util/types/index.js +9 -0
- package/esm/util/types/mst.d.ts +3 -0
- package/esm/util/types/mst.js +4 -0
- package/esm/util/types/renameIds.d.ts +1 -0
- package/esm/util/types/renameIds.js +29 -0
- package/esm/util/types/services.d.ts +1 -1
- package/esm/util/unknownSnapshotKeys.d.ts +53 -0
- package/esm/util/unknownSnapshotKeys.js +76 -0
- package/esm/util/useFeatureSequence.js +5 -5
- package/esm/util/useFetch.d.ts +3 -4
- package/esm/util/useFetch.js +19 -10
- package/esm/util/useFetchPlugins.d.ts +6 -2
- package/esm/util/useFetchPlugins.js +7 -3
- package/esm/util/usePanZoom.js +10 -3
- package/esm/util/usePanelVirtualScroll.d.ts +7 -35
- package/esm/util/usePanelVirtualScroll.js +9 -36
- package/esm/util/useRafCommit.js +1 -0
- package/esm/util/useRowVirtualScroll.d.ts +6 -29
- package/esm/util/useRowVirtualScroll.js +8 -49
- package/esm/util/useVirtualScrollWheel.d.ts +20 -4
- package/esm/util/useVirtualScrollWheel.js +40 -74
- package/esm/util/viewHighlights.d.ts +3 -0
- package/esm/util/viewHighlights.js +5 -0
- package/esm/util/viewStatus.d.ts +47 -15
- package/esm/util/viewStatus.js +34 -0
- package/esm/util/wheelZoom.d.ts +7 -1
- package/esm/util/wheelZoom.js +85 -19
- package/esm/util/whenViewSettled.d.ts +55 -8
- package/esm/util/whenViewSettled.js +56 -7
- package/esm/util/withFeatureDetails.js +4 -0
- package/esm/util/withLaunchInput.d.ts +174 -0
- package/esm/util/withLaunchInput.js +274 -0
- package/package.json +75 -24
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +0 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +0 -8
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
- package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
- package/esm/ReExports/BaseFeatureDetails.js +0 -10
- package/esm/ReExports/index.d.ts +0 -1
- package/esm/ReExports/index.js +0 -1
- package/esm/ReExports/publicUtil.d.ts +0 -1
- package/esm/ReExports/publicUtil.js +0 -28
- package/esm/configuration/promotableDefaults.d.ts +0 -199
- package/esm/configuration/promotableDefaults.js +0 -326
- package/esm/configuration/promotablePin.d.ts +0 -55
- package/esm/configuration/promotablePin.js +0 -1
- package/esm/configuration/promotableResolve.d.ts +0 -108
- package/esm/configuration/promotableResolve.js +0 -117
- package/esm/configuration/promotableSlots.d.ts +0 -12
- package/esm/configuration/promotableSlots.js +0 -45
- package/esm/configuration/slotShape.d.ts +0 -12
- package/esm/configuration/slotShape.js +0 -84
- package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
- package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
- package/esm/ui/PinAdornment.d.ts +0 -5
- package/esm/ui/PinAdornment.js +0 -79
- package/esm/ui/SvgGradientLegend.d.ts +0 -26
- package/esm/ui/SvgGradientLegend.js +0 -26
- package/esm/ui/highlightChipReveal.d.ts +0 -32
- package/esm/ui/highlightChipReveal.js +0 -39
- package/esm/ui/promotableMenuItems.d.ts +0 -19
- package/esm/ui/promotableMenuItems.js +0 -89
- package/esm/ui/promotablePinCoverage.d.ts +0 -44
- package/esm/ui/promotablePinCoverage.js +0 -87
- package/esm/util/applyInitSettings.d.ts +0 -79
- package/esm/util/applyInitSettings.js +0 -91
- package/esm/util/openDisplays.d.ts +0 -23
- package/esm/util/openDisplays.js +0 -79
- package/esm/util/stopToken.d.ts +0 -211
- package/esm/util/stopToken.js +0 -438
- /package/esm/{BaseFeatureWidget/BaseFeatureDetail/types.js → data_adapters/BaseAdapter/zoomRange.js} +0 -0
|
@@ -1,78 +1,24 @@
|
|
|
1
1
|
import type { BgzfWorkerPool } from '@gmod/bgzf-filehandle';
|
|
2
2
|
/**
|
|
3
|
-
* The BGZF inflate pool the indexed-format libraries decompress
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* ## Call it, don't hoist it
|
|
24
|
-
*
|
|
25
|
-
* This is a function and not an exported constant on purpose: it spawns workers
|
|
26
|
-
* the first time it is called, and a module-level call would spawn them on
|
|
27
|
-
* import, in every context that pulls in anything from `util`, whether or not a
|
|
28
|
-
* bgzip-backed track is ever opened. Call it where a file is constructed.
|
|
29
|
-
*
|
|
30
|
-
* ## The dynamic import is about bundle weight, and only that
|
|
31
|
-
*
|
|
32
|
-
* `@gmod/bgzf-filehandle` inlines its worker bundle as a base64 string, and
|
|
33
|
-
* `getSharedWorkerPool` is what reaches it, so a **static** import pins that
|
|
34
|
-
* blob into the initial bundle of every entry point that reaches this helper.
|
|
35
|
-
* Measured with esbuild, splitting and minifying, on the import alone:
|
|
36
|
-
*
|
|
37
|
-
* ```
|
|
38
|
-
* static entry 54.7kb (23.4kb gzipped) — the blob is in the initial bundle
|
|
39
|
-
* dynamic entry 114b (141b gzipped) + 123.9kb in a split chunk
|
|
40
|
-
* ```
|
|
41
|
-
*
|
|
42
|
-
* So ~23kb gzipped off every bundle that can reach a bgzip adapter, deferred to
|
|
43
|
-
* a chunk that is only fetched once such a track is actually opened. Core's
|
|
44
|
-
* `util/unzip.ts` and `fetchAndMaybeUnzip.ts` dodge it the same way. It costs
|
|
45
|
-
* nothing to do, because the libraries want a promise anyway — their callers'
|
|
46
|
-
* `configure()` is synchronous and the pool is only available asynchronously.
|
|
47
|
-
*
|
|
48
|
-
* **It is not about test speed**, though it has been described that way. That
|
|
49
|
-
* claim was checked here and did not reproduce: three jbrowse-web variant
|
|
50
|
-
* suites ran 13.887s static against 13.856s dynamic, warm cache, and a 29s
|
|
51
|
-
* reading that started this off turned out to be a cold jest transform cache in
|
|
52
|
-
* a fresh worktree. Don't reintroduce a static import on the grounds that the
|
|
53
|
-
* jest argument was wrong — the bundle argument above is the real one, and it
|
|
54
|
-
* stands on its own.
|
|
55
|
-
*
|
|
56
|
-
* The `catch` is deliberate, but for a plain reason rather than a specific
|
|
57
|
-
* failure: a pool is an optimization, `@gmod/bam` and `@gmod/tabix` both await
|
|
58
|
-
* this, and anything going wrong here has to degrade to inflating in process
|
|
59
|
-
* rather than break every read. A documented CJS-interop throw under jest was
|
|
60
|
-
* the original motivation; that no longer reproduces (core's own suite, the
|
|
61
|
-
* BamAdapter suites and jbrowse-web's Alignments suite all pass with the catch
|
|
62
|
-
* removed), so keep it for the invariant, not the anecdote.
|
|
63
|
-
*
|
|
64
|
-
* ## Safe to pass unconditionally
|
|
65
|
-
*
|
|
66
|
-
* Returns a promise, and the libraries await it at the point of use rather than
|
|
67
|
-
* at construction — which is what lets a synchronous `configure()` hand the
|
|
68
|
-
* pending pool straight over. It resolves to `undefined` wherever Workers
|
|
69
|
-
* cannot be created (node, jest), and `@gmod/bam` and `@gmod/tabix` then take
|
|
70
|
-
* their in-process path, so no caller needs an environment check and the test
|
|
71
|
-
* suites are unaffected.
|
|
72
|
-
*
|
|
73
|
-
* Needs no cross-origin isolation: each worker's range is transferred to it as
|
|
74
|
-
* an ArrayBuffer rather than shared, so this works on an ordinary page. That
|
|
75
|
-
* was the point of dropping SharedArrayBuffer in `@gmod/bgzf-filehandle` 6.4.0
|
|
76
|
-
* — measured, the shared transport was at parity at best.
|
|
3
|
+
* The BGZF inflate pool the indexed-format libraries decompress large chunks on,
|
|
4
|
+
* one per JS context like `decompressedBytesBudget`: one per RPC worker plus one
|
|
5
|
+
* on the main thread. BGZF decompression is 70-90% of a cold query (`@gmod/bam`
|
|
6
|
+
* ADR 0003), and its blocks inflate independently.
|
|
7
|
+
*
|
|
8
|
+
* Holding it costs nothing. `@gmod/bgzf-filehandle` 6.7 starts the workers only
|
|
9
|
+
* when a chunk of at least `POOL_MIN_DECOMPRESSED_BYTES` (0.4MB inflated)
|
|
10
|
+
* arrives, inflates in process while they boot, and inflates in process for good
|
|
11
|
+
* if one of them fails, so no read waits on a worker. What it is worth per
|
|
12
|
+
* format, and why GFF3 and GTF go without it: reference/BGZF_WORKER_POOL.md.
|
|
13
|
+
*
|
|
14
|
+
* A function over a dynamic import because the library inlines its worker bundle
|
|
15
|
+
* as a base64 string, and a static import pins it into every entry point that
|
|
16
|
+
* can reach this helper: measured with esbuild, 23.4kb gzipped against 141b. Test
|
|
17
|
+
* speed is not a reason either way; three jbrowse-web variant suites ran 13.887s
|
|
18
|
+
* static against 13.856s dynamic.
|
|
19
|
+
*
|
|
20
|
+
* Resolves to `undefined` wherever Workers cannot be created (node, jest), which
|
|
21
|
+
* keeps `@gmod/bam` and `@gmod/tabix` on their in-process path, and the `catch`
|
|
22
|
+
* keeps anything else going wrong here on it too.
|
|
77
23
|
*/
|
|
78
24
|
export declare function sharedBgzfWorkerPool(): Promise<BgzfWorkerPool | undefined>;
|
|
@@ -1,78 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The BGZF inflate pool the indexed-format libraries decompress
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* ## Call it, don't hoist it
|
|
23
|
-
*
|
|
24
|
-
* This is a function and not an exported constant on purpose: it spawns workers
|
|
25
|
-
* the first time it is called, and a module-level call would spawn them on
|
|
26
|
-
* import, in every context that pulls in anything from `util`, whether or not a
|
|
27
|
-
* bgzip-backed track is ever opened. Call it where a file is constructed.
|
|
28
|
-
*
|
|
29
|
-
* ## The dynamic import is about bundle weight, and only that
|
|
30
|
-
*
|
|
31
|
-
* `@gmod/bgzf-filehandle` inlines its worker bundle as a base64 string, and
|
|
32
|
-
* `getSharedWorkerPool` is what reaches it, so a **static** import pins that
|
|
33
|
-
* blob into the initial bundle of every entry point that reaches this helper.
|
|
34
|
-
* Measured with esbuild, splitting and minifying, on the import alone:
|
|
35
|
-
*
|
|
36
|
-
* ```
|
|
37
|
-
* static entry 54.7kb (23.4kb gzipped) — the blob is in the initial bundle
|
|
38
|
-
* dynamic entry 114b (141b gzipped) + 123.9kb in a split chunk
|
|
39
|
-
* ```
|
|
40
|
-
*
|
|
41
|
-
* So ~23kb gzipped off every bundle that can reach a bgzip adapter, deferred to
|
|
42
|
-
* a chunk that is only fetched once such a track is actually opened. Core's
|
|
43
|
-
* `util/unzip.ts` and `fetchAndMaybeUnzip.ts` dodge it the same way. It costs
|
|
44
|
-
* nothing to do, because the libraries want a promise anyway — their callers'
|
|
45
|
-
* `configure()` is synchronous and the pool is only available asynchronously.
|
|
46
|
-
*
|
|
47
|
-
* **It is not about test speed**, though it has been described that way. That
|
|
48
|
-
* claim was checked here and did not reproduce: three jbrowse-web variant
|
|
49
|
-
* suites ran 13.887s static against 13.856s dynamic, warm cache, and a 29s
|
|
50
|
-
* reading that started this off turned out to be a cold jest transform cache in
|
|
51
|
-
* a fresh worktree. Don't reintroduce a static import on the grounds that the
|
|
52
|
-
* jest argument was wrong — the bundle argument above is the real one, and it
|
|
53
|
-
* stands on its own.
|
|
54
|
-
*
|
|
55
|
-
* The `catch` is deliberate, but for a plain reason rather than a specific
|
|
56
|
-
* failure: a pool is an optimization, `@gmod/bam` and `@gmod/tabix` both await
|
|
57
|
-
* this, and anything going wrong here has to degrade to inflating in process
|
|
58
|
-
* rather than break every read. A documented CJS-interop throw under jest was
|
|
59
|
-
* the original motivation; that no longer reproduces (core's own suite, the
|
|
60
|
-
* BamAdapter suites and jbrowse-web's Alignments suite all pass with the catch
|
|
61
|
-
* removed), so keep it for the invariant, not the anecdote.
|
|
62
|
-
*
|
|
63
|
-
* ## Safe to pass unconditionally
|
|
64
|
-
*
|
|
65
|
-
* Returns a promise, and the libraries await it at the point of use rather than
|
|
66
|
-
* at construction — which is what lets a synchronous `configure()` hand the
|
|
67
|
-
* pending pool straight over. It resolves to `undefined` wherever Workers
|
|
68
|
-
* cannot be created (node, jest), and `@gmod/bam` and `@gmod/tabix` then take
|
|
69
|
-
* their in-process path, so no caller needs an environment check and the test
|
|
70
|
-
* suites are unaffected.
|
|
71
|
-
*
|
|
72
|
-
* Needs no cross-origin isolation: each worker's range is transferred to it as
|
|
73
|
-
* an ArrayBuffer rather than shared, so this works on an ordinary page. That
|
|
74
|
-
* was the point of dropping SharedArrayBuffer in `@gmod/bgzf-filehandle` 6.4.0
|
|
75
|
-
* — measured, the shared transport was at parity at best.
|
|
2
|
+
* The BGZF inflate pool the indexed-format libraries decompress large chunks on,
|
|
3
|
+
* one per JS context like `decompressedBytesBudget`: one per RPC worker plus one
|
|
4
|
+
* on the main thread. BGZF decompression is 70-90% of a cold query (`@gmod/bam`
|
|
5
|
+
* ADR 0003), and its blocks inflate independently.
|
|
6
|
+
*
|
|
7
|
+
* Holding it costs nothing. `@gmod/bgzf-filehandle` 6.7 starts the workers only
|
|
8
|
+
* when a chunk of at least `POOL_MIN_DECOMPRESSED_BYTES` (0.4MB inflated)
|
|
9
|
+
* arrives, inflates in process while they boot, and inflates in process for good
|
|
10
|
+
* if one of them fails, so no read waits on a worker. What it is worth per
|
|
11
|
+
* format, and why GFF3 and GTF go without it: reference/BGZF_WORKER_POOL.md.
|
|
12
|
+
*
|
|
13
|
+
* A function over a dynamic import because the library inlines its worker bundle
|
|
14
|
+
* as a base64 string, and a static import pins it into every entry point that
|
|
15
|
+
* can reach this helper: measured with esbuild, 23.4kb gzipped against 141b. Test
|
|
16
|
+
* speed is not a reason either way; three jbrowse-web variant suites ran 13.887s
|
|
17
|
+
* static against 13.856s dynamic.
|
|
18
|
+
*
|
|
19
|
+
* Resolves to `undefined` wherever Workers cannot be created (node, jest), which
|
|
20
|
+
* keeps `@gmod/bam` and `@gmod/tabix` on their in-process path, and the `catch`
|
|
21
|
+
* keeps anything else going wrong here on it too.
|
|
76
22
|
*/
|
|
77
23
|
export function sharedBgzfWorkerPool() {
|
|
78
24
|
return import('@gmod/bgzf-filehandle')
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AggregateStep, BinStep } from './markEncodingTypes.ts';
|
|
2
|
+
import type { Staged } from './stepTables.ts';
|
|
3
|
+
/**
|
|
4
|
+
* Whether an interval `bin` and the `aggregate` behind it run as one kernel:
|
|
5
|
+
* the aggregate groups by the bin's two edges, and every field it reads is a
|
|
6
|
+
* plain name, so a piece's value is its row's or one the bin wrote.
|
|
7
|
+
*/
|
|
8
|
+
export declare function fusesBinAggregate(bin: BinStep, agg: AggregateStep): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* An interval `bin` and the `aggregate` grouped by its edges as one walk: each
|
|
11
|
+
* row's bins accumulate straight into their group's sums, with no piece table,
|
|
12
|
+
* the way `binRawRegion` bins a BigWig's raw section. The groups come out in
|
|
13
|
+
* the order the pieces would have met them and each sum adds its pieces in
|
|
14
|
+
* the pieces' order, so the answer is the two steps' to the bit. Undefined
|
|
15
|
+
* where the bins spread too thinly over the region for a dense index.
|
|
16
|
+
*/
|
|
17
|
+
export declare function binnedAggregate({ table, bounds }: Staged, bin: BinStep, agg: AggregateStep): Staged | undefined;
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
// The interval `bin` and the `aggregate` behind it as one kernel, which
|
|
2
|
+
// `runSteps` in featureTransforms.ts reaches by relative path only.
|
|
3
|
+
import { readerOf } from './featureTable.js';
|
|
4
|
+
import { isPlainFieldRef } from './fieldReader.js';
|
|
5
|
+
import { isJexl } from './jexlStrings.js';
|
|
6
|
+
import { BIN_OVERLAP_FIELD, DEFAULT_BIN_AS, OpSums, binSize, groupKey, intervalsOf, isWeighted, madeGroups, stepNumberReader, } from './stepTables.js';
|
|
7
|
+
/**
|
|
8
|
+
* The bin's edges and `overlap` a piece carries, where an `aggregate` reads a
|
|
9
|
+
* field off a piece: the row's own field where the bin wrote none. A later
|
|
10
|
+
* entry of the bin's written fields shadows an earlier one of the same name,
|
|
11
|
+
* as the piece table's columns do.
|
|
12
|
+
*/
|
|
13
|
+
const FROM_ROW = 0;
|
|
14
|
+
const FROM_BIN_START = 1;
|
|
15
|
+
const FROM_BIN_END = 2;
|
|
16
|
+
const FROM_OVERLAP = 3;
|
|
17
|
+
function pieceSource(field, [asStart, asEnd]) {
|
|
18
|
+
return field === BIN_OVERLAP_FIELD
|
|
19
|
+
? FROM_OVERLAP
|
|
20
|
+
: field === asEnd
|
|
21
|
+
? FROM_BIN_END
|
|
22
|
+
: field === asStart
|
|
23
|
+
? FROM_BIN_START
|
|
24
|
+
: FROM_ROW;
|
|
25
|
+
}
|
|
26
|
+
function pick(source, row, lo, hi, overlap) {
|
|
27
|
+
return source === FROM_ROW
|
|
28
|
+
? row
|
|
29
|
+
: source === FROM_BIN_START
|
|
30
|
+
? lo
|
|
31
|
+
: source === FROM_BIN_END
|
|
32
|
+
? hi
|
|
33
|
+
: overlap;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Whether an interval `bin` and the `aggregate` behind it run as one kernel:
|
|
37
|
+
* the aggregate groups by the bin's two edges, and every field it reads is a
|
|
38
|
+
* plain name, so a piece's value is its row's or one the bin wrote.
|
|
39
|
+
*/
|
|
40
|
+
export function fusesBinAggregate(bin, agg) {
|
|
41
|
+
const as = bin.as ?? DEFAULT_BIN_AS;
|
|
42
|
+
const groupby = agg.groupby ?? [];
|
|
43
|
+
const plain = (field) => field === undefined || (isPlainFieldRef(field) && !isJexl(field));
|
|
44
|
+
return (bin.fields !== undefined &&
|
|
45
|
+
as[0] !== as[1] &&
|
|
46
|
+
groupby.length === 2 &&
|
|
47
|
+
as.every(edge => groupby.includes(edge)) &&
|
|
48
|
+
as.every(plain) &&
|
|
49
|
+
agg.ops.every(op => plain(op.field) && plain(op.weight)));
|
|
50
|
+
}
|
|
51
|
+
// Beyond this many bins over the pieces a dense bin index costs more than the
|
|
52
|
+
// pieces would, and the two steps run as written.
|
|
53
|
+
const SPARSE_BINS_PER_PIECE = 2;
|
|
54
|
+
const SPARSE_BINS_SLACK = 65536;
|
|
55
|
+
/**
|
|
56
|
+
* An interval `bin` and the `aggregate` grouped by its edges as one walk: each
|
|
57
|
+
* row's bins accumulate straight into their group's sums, with no piece table,
|
|
58
|
+
* the way `binRawRegion` bins a BigWig's raw section. The groups come out in
|
|
59
|
+
* the order the pieces would have met them and each sum adds its pieces in
|
|
60
|
+
* the pieces' order, so the answer is the two steps' to the bit. Undefined
|
|
61
|
+
* where the bins spread too thinly over the region for a dense index.
|
|
62
|
+
*/
|
|
63
|
+
export function binnedAggregate({ table, bounds }, bin, agg) {
|
|
64
|
+
const size = binSize(bin);
|
|
65
|
+
const as = bin.as ?? DEFAULT_BIN_AS;
|
|
66
|
+
const iv = intervalsOf(table, bin.fields, size, bounds);
|
|
67
|
+
const { lowBin, highBin } = iv;
|
|
68
|
+
const sections = bounds.length - 1;
|
|
69
|
+
// Each section's bins from its lowest, at `offset[s]` in one index.
|
|
70
|
+
const offset = new Float64Array(sections + 1);
|
|
71
|
+
for (let s = 0; s < sections; s++) {
|
|
72
|
+
const span = highBin[s] - lowBin[s] + 1;
|
|
73
|
+
offset[s + 1] = offset[s] + (span > 0 ? span : 0);
|
|
74
|
+
}
|
|
75
|
+
const spans = offset[sections];
|
|
76
|
+
if (spans > SPARSE_BINS_PER_PIECE * iv.pieces + SPARSE_BINS_SLACK) {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
const capacity = Math.min(spans, iv.pieces);
|
|
80
|
+
const groupOfBin = new Int32Array(spans).fill(-1);
|
|
81
|
+
const groupRow = new Uint32Array(capacity);
|
|
82
|
+
const groupBin = new Float64Array(capacity);
|
|
83
|
+
const groupSection = new Uint32Array(capacity);
|
|
84
|
+
const start = new Float64Array(capacity);
|
|
85
|
+
const end = new Float64Array(capacity);
|
|
86
|
+
const startSource = pieceSource('start', as);
|
|
87
|
+
const endSource = pieceSource('end', as);
|
|
88
|
+
// A group's extent is its bin's where the pieces' start and end are the
|
|
89
|
+
// bin's edges, the least and greatest of its pieces' otherwise.
|
|
90
|
+
const binExtent = startSource === FROM_BIN_START && endSource === FROM_BIN_END;
|
|
91
|
+
const readRowStart = readerOf(table.column('start'));
|
|
92
|
+
const readRowEnd = readerOf(table.column('end'));
|
|
93
|
+
const groups = numberGroups({ iv, bounds, size, lowBin, offset, groupOfBin }, { groupRow, groupBin, groupSection, start, end }, binExtent
|
|
94
|
+
? undefined
|
|
95
|
+
: { startSource, endSource, readRowStart, readRowEnd });
|
|
96
|
+
const walk = { iv, bounds, size, lowBin, offset, groupOfBin };
|
|
97
|
+
const ops = agg.ops.map(op => {
|
|
98
|
+
const sums = new OpSums(op, groups);
|
|
99
|
+
const valueSource = op.op === 'count' || op.field === undefined
|
|
100
|
+
? undefined
|
|
101
|
+
: pieceSource(op.field, as);
|
|
102
|
+
const weightSource = op.weight !== undefined && isWeighted(op)
|
|
103
|
+
? pieceSource(op.weight, as)
|
|
104
|
+
: undefined;
|
|
105
|
+
const rowNumbers = (field, source) => field !== undefined && source === FROM_ROW
|
|
106
|
+
? stepNumberReader(table, field, 'an aggregate')
|
|
107
|
+
: undefined;
|
|
108
|
+
const readValue = rowNumbers(op.field, valueSource);
|
|
109
|
+
const readWeight = rowNumbers(op.weight, weightSource);
|
|
110
|
+
if ((valueSource === undefined || readValue) &&
|
|
111
|
+
(weightSource === undefined ||
|
|
112
|
+
readWeight ||
|
|
113
|
+
weightSource === FROM_OVERLAP)) {
|
|
114
|
+
addByRow(walk, sums, readValue, readWeight, weightSource === FROM_OVERLAP);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
addByPiece(walk, sums, valueSource, weightSource, readValue, readWeight);
|
|
118
|
+
}
|
|
119
|
+
return sums.column(groups);
|
|
120
|
+
});
|
|
121
|
+
// A field's value on each group's first piece.
|
|
122
|
+
const each = (field) => {
|
|
123
|
+
const source = pieceSource(field, as);
|
|
124
|
+
const read = readerOf(table.column(field));
|
|
125
|
+
const out = new Array(groups);
|
|
126
|
+
for (let g = 0; g < groups; g++) {
|
|
127
|
+
const i = groupRow[g];
|
|
128
|
+
const lo = groupBin[g] * size;
|
|
129
|
+
const hi = lo + size;
|
|
130
|
+
out[g] =
|
|
131
|
+
source === FROM_ROW
|
|
132
|
+
? read(i)
|
|
133
|
+
: pick(source, 0, lo, hi, Math.min(iv.end[i], hi) - Math.max(iv.start[i], lo));
|
|
134
|
+
}
|
|
135
|
+
return out;
|
|
136
|
+
};
|
|
137
|
+
return madeGroups({
|
|
138
|
+
groups,
|
|
139
|
+
keys: (agg.groupby ?? []).map((field) => [
|
|
140
|
+
field,
|
|
141
|
+
each(field).map(groupKey),
|
|
142
|
+
]),
|
|
143
|
+
ops,
|
|
144
|
+
step: agg,
|
|
145
|
+
refNames: each('refName'),
|
|
146
|
+
start: start.slice(0, groups),
|
|
147
|
+
end: end.slice(0, groups),
|
|
148
|
+
sectionOf: groupSection,
|
|
149
|
+
sections: bounds.length,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Each bin's group, numbered in the order the pieces meet them, with the
|
|
154
|
+
* first piece's row, the bin and the section, and each group's extent: its
|
|
155
|
+
* bin's, or the least start and greatest end its pieces read where `extent`
|
|
156
|
+
* says where they read them. Answers how many groups there are.
|
|
157
|
+
*/
|
|
158
|
+
function numberGroups({ iv, bounds, size, lowBin, offset, groupOfBin }, out, extent) {
|
|
159
|
+
const { groupRow, groupBin, groupSection, start, end } = out;
|
|
160
|
+
let groups = 0;
|
|
161
|
+
for (let s = 0; s + 1 < bounds.length; s++) {
|
|
162
|
+
const base = offset[s] - lowBin[s];
|
|
163
|
+
for (let i = bounds[s]; i < bounds[s + 1]; i++) {
|
|
164
|
+
const first = iv.first[i];
|
|
165
|
+
if (Number.isNaN(first)) {
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
const last = iv.last[i];
|
|
169
|
+
for (let b = first; b <= last; b++) {
|
|
170
|
+
let g = groupOfBin[base + b];
|
|
171
|
+
if (g < 0) {
|
|
172
|
+
g = groups++;
|
|
173
|
+
groupOfBin[base + b] = g;
|
|
174
|
+
groupRow[g] = i;
|
|
175
|
+
groupBin[g] = b;
|
|
176
|
+
groupSection[g] = s;
|
|
177
|
+
start[g] = b * size;
|
|
178
|
+
end[g] = b * size + size;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (extent) {
|
|
184
|
+
start.fill(Infinity);
|
|
185
|
+
end.fill(-Infinity);
|
|
186
|
+
const { startSource, endSource, readRowStart, readRowEnd } = extent;
|
|
187
|
+
for (let s = 0; s + 1 < bounds.length; s++) {
|
|
188
|
+
const base = offset[s] - lowBin[s];
|
|
189
|
+
for (let i = bounds[s]; i < bounds[s + 1]; i++) {
|
|
190
|
+
const first = iv.first[i];
|
|
191
|
+
if (Number.isNaN(first)) {
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
const ownStart = readRowStart(i);
|
|
195
|
+
const ownEnd = readRowEnd(i);
|
|
196
|
+
for (let b = first; b <= iv.last[i]; b++) {
|
|
197
|
+
const g = groupOfBin[base + b];
|
|
198
|
+
const lo = b * size;
|
|
199
|
+
const hi = lo + size;
|
|
200
|
+
const overlap = Math.min(iv.end[i], hi) - Math.max(iv.start[i], lo);
|
|
201
|
+
start[g] = Math.min(start[g], pick(startSource, ownStart, lo, hi, overlap));
|
|
202
|
+
end[g] = Math.max(end[g], pick(endSource, ownEnd, lo, hi, overlap));
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return groups;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* One op's sums where its value is its row's and its weight its row's, its
|
|
211
|
+
* piece's overlap or none: a row whose value or weight is not a number adds
|
|
212
|
+
* nothing to any bin, so it is skipped whole. A piece's overlap is always a
|
|
213
|
+
* number, since the row's ends are.
|
|
214
|
+
*/
|
|
215
|
+
function addByRow({ iv, bounds, size, lowBin, offset, groupOfBin }, { sum, weight, min, max, op }, readValue, readWeight, byOverlap) {
|
|
216
|
+
const readsValue = op !== 'count';
|
|
217
|
+
for (let s = 0; s + 1 < bounds.length; s++) {
|
|
218
|
+
const base = offset[s] - lowBin[s];
|
|
219
|
+
for (let i = bounds[s]; i < bounds[s + 1]; i++) {
|
|
220
|
+
const first = iv.first[i];
|
|
221
|
+
const v = readValue ? readValue(i) : Number.NaN;
|
|
222
|
+
const rowWeight = readWeight ? readWeight(i) : 1;
|
|
223
|
+
if (Number.isNaN(first) ||
|
|
224
|
+
(readsValue && !Number.isFinite(v)) ||
|
|
225
|
+
!Number.isFinite(rowWeight)) {
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
const rowS = iv.start[i];
|
|
229
|
+
const rowE = iv.end[i];
|
|
230
|
+
const last = iv.last[i];
|
|
231
|
+
for (let b = first; b <= last; b++) {
|
|
232
|
+
const g = groupOfBin[base + b];
|
|
233
|
+
const lo = b * size;
|
|
234
|
+
const w = byOverlap
|
|
235
|
+
? Math.min(rowE, lo + size) - Math.max(rowS, lo)
|
|
236
|
+
: rowWeight;
|
|
237
|
+
weight[g] += w;
|
|
238
|
+
if (readsValue) {
|
|
239
|
+
sum[g] += v * w;
|
|
240
|
+
if (v < min[g]) {
|
|
241
|
+
min[g] = v;
|
|
242
|
+
}
|
|
243
|
+
if (v > max[g]) {
|
|
244
|
+
max[g] = v;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/** One op's sums where its value or weight is a field the bin wrote. */
|
|
252
|
+
function addByPiece({ iv, bounds, size, lowBin, offset, groupOfBin }, sums, valueSource, weightSource, readValue, readWeight) {
|
|
253
|
+
for (let s = 0; s + 1 < bounds.length; s++) {
|
|
254
|
+
const base = offset[s] - lowBin[s];
|
|
255
|
+
for (let i = bounds[s]; i < bounds[s + 1]; i++) {
|
|
256
|
+
const first = iv.first[i];
|
|
257
|
+
if (Number.isNaN(first)) {
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
const rowV = readValue ? readValue(i) : Number.NaN;
|
|
261
|
+
const rowW = readWeight ? readWeight(i) : 1;
|
|
262
|
+
const last = iv.last[i];
|
|
263
|
+
for (let b = first; b <= last; b++) {
|
|
264
|
+
const lo = b * size;
|
|
265
|
+
const hi = lo + size;
|
|
266
|
+
const overlap = Math.min(iv.end[i], hi) - Math.max(iv.start[i], lo);
|
|
267
|
+
sums.add(groupOfBin[base + b], valueSource === undefined
|
|
268
|
+
? Number.NaN
|
|
269
|
+
: pick(valueSource, rowV, lo, hi, overlap), weightSource === undefined
|
|
270
|
+
? 1
|
|
271
|
+
: pick(weightSource, rowW, lo, hi, overlap));
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { SharedBudget } from '@gmod/shared-read-cache';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
* in this JS context — so one per RPC worker, plus one on the main
|
|
5
|
-
* which is the scope that actually runs out of memory.
|
|
3
|
+
* The ceiling on what the indexed-format libraries retain, shared by every
|
|
4
|
+
* adapter in this JS context — so one per RPC worker, plus one on the main
|
|
5
|
+
* thread, which is the scope that actually runs out of memory.
|
|
6
6
|
*
|
|
7
|
-
* ## Why
|
|
7
|
+
* ## Why this is not per file
|
|
8
8
|
*
|
|
9
9
|
* `@gmod/bam`, `@gmod/tabix` and `@gmod/cram` each take a per-file budget,
|
|
10
10
|
* sized so that a single track panning never falls off the cliff where a cache
|
|
@@ -29,24 +29,27 @@ import { SharedBudget } from '@gmod/shared-read-cache';
|
|
|
29
29
|
* at hand their space to the one being panned, so the active track keeps a
|
|
30
30
|
* whole working set however many are open.
|
|
31
31
|
*
|
|
32
|
-
* ## The
|
|
32
|
+
* ## The number is not new
|
|
33
33
|
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
34
|
+
* 1 GB is the libraries' own per-file default (`DEFAULT_MAX_CACHE_BYTES` in
|
|
35
|
+
* both `@gmod/bam` and `@gmod/cram`), moved from per-file to per-context. That
|
|
36
|
+
* makes this a strict tightening — retention can only fall — and avoids
|
|
37
|
+
* inventing a number that would need its own justification. With one file open
|
|
38
|
+
* the two ceilings coincide; from the second file on, this one is the one that
|
|
39
|
+
* binds. The budget still has to clear one query's working set or the cliff
|
|
40
|
+
* returns, and on that workload 512 MB shared across three tracks already cost
|
|
41
|
+
* 43 refills where 1 GB cost 4.
|
|
40
42
|
*
|
|
41
|
-
* ##
|
|
43
|
+
* ## One budget, because every member weighs bytes
|
|
42
44
|
*
|
|
43
45
|
* `SharedBudget.total` is a sum over its members, so they must all weigh in the
|
|
44
|
-
* same unit
|
|
45
|
-
* `@gmod/
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
46
|
+
* same unit, and `sizeOf` is opaque, so nothing could catch a mismatch at
|
|
47
|
+
* runtime. `@gmod/bam` and `@gmod/tabix` weigh decompressed bytes, and since 14
|
|
48
|
+
* `@gmod/cram` weighs a decoded slice by `DecodedSlice.byteLength` — its typed
|
|
49
|
+
* columns exactly and its strings by estimate, within 1–8% of the measured heap
|
|
50
|
+
* (its ADR 0013). Before that a CRAM slice weighed its record count, which is
|
|
51
|
+
* why this used to be two budgets named for their units: a million records
|
|
52
|
+
* could not be added to bytes, and never bound long-read data either, where a
|
|
53
|
+
* 6 MB slice counted as 37.
|
|
49
54
|
*/
|
|
50
55
|
export declare const decompressedBytesBudget: SharedBudget;
|
|
51
|
-
/** See {@link decompressedBytesBudget}. Records, not bytes — CRAM only. */
|
|
52
|
-
export declare const decodedRecordsBudget: SharedBudget;
|
package/esm/util/cacheBudgets.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { SharedBudget } from '@gmod/shared-read-cache';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
* in this JS context — so one per RPC worker, plus one on the main
|
|
5
|
-
* which is the scope that actually runs out of memory.
|
|
3
|
+
* The ceiling on what the indexed-format libraries retain, shared by every
|
|
4
|
+
* adapter in this JS context — so one per RPC worker, plus one on the main
|
|
5
|
+
* thread, which is the scope that actually runs out of memory.
|
|
6
6
|
*
|
|
7
|
-
* ## Why
|
|
7
|
+
* ## Why this is not per file
|
|
8
8
|
*
|
|
9
9
|
* `@gmod/bam`, `@gmod/tabix` and `@gmod/cram` each take a per-file budget,
|
|
10
10
|
* sized so that a single track panning never falls off the cliff where a cache
|
|
@@ -29,24 +29,27 @@ import { SharedBudget } from '@gmod/shared-read-cache';
|
|
|
29
29
|
* at hand their space to the one being panned, so the active track keeps a
|
|
30
30
|
* whole working set however many are open.
|
|
31
31
|
*
|
|
32
|
-
* ## The
|
|
32
|
+
* ## The number is not new
|
|
33
33
|
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
34
|
+
* 1 GB is the libraries' own per-file default (`DEFAULT_MAX_CACHE_BYTES` in
|
|
35
|
+
* both `@gmod/bam` and `@gmod/cram`), moved from per-file to per-context. That
|
|
36
|
+
* makes this a strict tightening — retention can only fall — and avoids
|
|
37
|
+
* inventing a number that would need its own justification. With one file open
|
|
38
|
+
* the two ceilings coincide; from the second file on, this one is the one that
|
|
39
|
+
* binds. The budget still has to clear one query's working set or the cliff
|
|
40
|
+
* returns, and on that workload 512 MB shared across three tracks already cost
|
|
41
|
+
* 43 refills where 1 GB cost 4.
|
|
40
42
|
*
|
|
41
|
-
* ##
|
|
43
|
+
* ## One budget, because every member weighs bytes
|
|
42
44
|
*
|
|
43
45
|
* `SharedBudget.total` is a sum over its members, so they must all weigh in the
|
|
44
|
-
* same unit
|
|
45
|
-
* `@gmod/
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
46
|
+
* same unit, and `sizeOf` is opaque, so nothing could catch a mismatch at
|
|
47
|
+
* runtime. `@gmod/bam` and `@gmod/tabix` weigh decompressed bytes, and since 14
|
|
48
|
+
* `@gmod/cram` weighs a decoded slice by `DecodedSlice.byteLength` — its typed
|
|
49
|
+
* columns exactly and its strings by estimate, within 1–8% of the measured heap
|
|
50
|
+
* (its ADR 0013). Before that a CRAM slice weighed its record count, which is
|
|
51
|
+
* why this used to be two budgets named for their units: a million records
|
|
52
|
+
* could not be added to bytes, and never bound long-read data either, where a
|
|
53
|
+
* 6 MB slice counted as 37.
|
|
49
54
|
*/
|
|
50
55
|
export const decompressedBytesBudget = new SharedBudget(1024 * 2 ** 20);
|
|
51
|
-
/** See {@link decompressedBytesBudget}. Records, not bytes — CRAM only. */
|
|
52
|
-
export const decodedRecordsBudget = new SharedBudget(1_000_000);
|