@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.
Files changed (637) hide show
  1. package/README.md +1709 -390
  2. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
  3. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -5
  4. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +3 -5
  5. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +34 -29
  6. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +1 -4
  7. package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +11 -0
  8. package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +37 -14
  9. package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
  10. package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +15 -31
  11. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +4 -3
  12. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +12 -25
  13. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.d.ts +11 -0
  14. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.js +11 -0
  15. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +8 -0
  16. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +24 -0
  17. package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +6 -4
  18. package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.d.ts +4 -0
  19. package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.js +17 -0
  20. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
  21. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +5 -3
  22. package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +6 -2
  23. package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +7 -18
  24. package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.d.ts +16 -0
  25. package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.js +49 -0
  26. package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +0 -8
  27. package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +6 -29
  28. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +7 -34
  29. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +2 -2
  30. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.js +2 -2
  31. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +3 -1
  32. package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +12 -0
  33. package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +12 -5
  34. package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceData.js +8 -5
  35. package/esm/BaseFeatureWidget/configSchema.d.ts +1 -1
  36. package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
  37. package/esm/BaseFeatureWidget/formatDetails.js +62 -83
  38. package/esm/BaseFeatureWidget/index.d.ts +2 -1
  39. package/esm/BaseFeatureWidget/stateModelFactory.d.ts +42 -29
  40. package/esm/BaseFeatureWidget/stateModelFactory.js +98 -98
  41. package/esm/BaseFeatureWidget/types.d.ts +12 -6
  42. package/esm/BaseFeatureWidget/util.d.ts +0 -10
  43. package/esm/BaseFeatureWidget/util.js +0 -17
  44. package/esm/CorePlugin.js +34 -3
  45. package/esm/PluginLoader.d.ts +24 -13
  46. package/esm/PluginLoader.js +167 -51
  47. package/esm/PluginManager.d.ts +130 -24
  48. package/esm/PluginManager.js +180 -32
  49. package/esm/ReExports/MuiDataGridReExports.d.ts +1 -0
  50. package/esm/ReExports/MuiDataGridReExports.js +2 -2
  51. package/esm/ReExports/coreModules.generated.d.ts +2 -0
  52. package/esm/ReExports/coreModules.generated.js +530 -0
  53. package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
  54. package/esm/ReExports/coreWorkerModules.generated.js +490 -0
  55. package/esm/ReExports/frameworkModules.d.ts +2 -0
  56. package/esm/ReExports/frameworkModules.js +68 -0
  57. package/esm/ReExports/frameworkShared.d.ts +12 -0
  58. package/esm/ReExports/frameworkShared.js +16 -0
  59. package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
  60. package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
  61. package/esm/ReExports/list.js +528 -79
  62. package/esm/ReExports/modules.d.ts +1 -1
  63. package/esm/ReExports/modules.js +10 -165
  64. package/esm/ReExports/registry.d.ts +1 -0
  65. package/esm/ReExports/registry.js +23 -5
  66. package/esm/ReExports/uiStub.d.ts +3 -0
  67. package/esm/ReExports/uiStub.js +33 -0
  68. package/esm/ReExports/workerModules.d.ts +2 -0
  69. package/esm/ReExports/workerModules.js +11 -0
  70. package/esm/TextSearch/TextSearchManager.d.ts +27 -13
  71. package/esm/TextSearch/TextSearchManager.js +77 -36
  72. package/esm/TextSearch/places.d.ts +12 -0
  73. package/esm/TextSearch/places.js +94 -0
  74. package/esm/assemblyManager/assembly.d.ts +21 -19
  75. package/esm/assemblyManager/assembly.js +28 -26
  76. package/esm/assemblyManager/assemblyAdapters.d.ts +1 -1
  77. package/esm/assemblyManager/assemblyAdapters.js +8 -2
  78. package/esm/assemblyManager/assemblyConfigSchema.d.ts +31 -90
  79. package/esm/assemblyManager/assemblyConfigSchema.js +35 -47
  80. package/esm/assemblyManager/assemblyManager.d.ts +35 -180
  81. package/esm/assemblyManager/assemblyManager.js +47 -51
  82. package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +25 -18
  83. package/esm/assemblyManager/expandAssemblyConfigShorthand.js +78 -49
  84. package/esm/assemblyManager/geneticCodes.js +2 -5
  85. package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +10 -0
  86. package/esm/assemblyManager/getSequenceAdapterConfig.js +10 -0
  87. package/esm/assemblyManager/indexAssemblyNames.d.ts +9 -0
  88. package/esm/assemblyManager/indexAssemblyNames.js +22 -0
  89. package/esm/assemblyManager/loadRefNameMap.d.ts +1 -1
  90. package/esm/assemblyManager/loadRefNameMap.js +4 -9
  91. package/esm/assemblyManager/refNameMapKey.d.ts +7 -0
  92. package/esm/assemblyManager/refNameMapKey.js +12 -0
  93. package/esm/checkPlugins.d.ts +2 -0
  94. package/esm/checkPlugins.js +38 -17
  95. package/esm/configuration/bamIndexFields.d.ts +49 -0
  96. package/esm/configuration/bamIndexFields.js +41 -0
  97. package/esm/configuration/configurationSchema.d.ts +101 -71
  98. package/esm/configuration/configurationSchema.js +207 -134
  99. package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
  100. package/esm/configuration/configurationSchemaUnion.js +56 -0
  101. package/esm/configuration/configurationSlot.d.ts +150 -60
  102. package/esm/configuration/configurationSlot.js +103 -75
  103. package/esm/configuration/fillLocations.d.ts +14 -0
  104. package/esm/configuration/fillLocations.js +14 -0
  105. package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
  106. package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
  107. package/esm/configuration/formatDetailsConfigSchema.js +10 -13
  108. package/esm/configuration/fullConfSnapshot.d.ts +4 -19
  109. package/esm/configuration/fullConfSnapshot.js +30 -52
  110. package/esm/configuration/getConf.d.ts +45 -41
  111. package/esm/configuration/getConf.js +111 -44
  112. package/esm/configuration/index.d.ts +26 -11
  113. package/esm/configuration/index.js +16 -7
  114. package/esm/configuration/indexType.d.ts +26 -0
  115. package/esm/configuration/indexType.js +38 -0
  116. package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
  117. package/esm/configuration/mergeFormatCallbacks.js +13 -10
  118. package/esm/configuration/plot.d.ts +61 -0
  119. package/esm/configuration/plot.js +142 -0
  120. package/esm/configuration/readConfObject.d.ts +2 -24
  121. package/esm/configuration/readConfObject.js +20 -63
  122. package/esm/configuration/requirements.d.ts +37 -0
  123. package/esm/configuration/requirements.js +88 -0
  124. package/esm/configuration/schemaRegistry.d.ts +32 -15
  125. package/esm/configuration/schemaRegistry.js +33 -35
  126. package/esm/configuration/schemaTypes.d.ts +21 -5
  127. package/esm/configuration/schemaTypes.js +66 -55
  128. package/esm/configuration/slotFacade.d.ts +12 -29
  129. package/esm/configuration/slotFacade.js +44 -23
  130. package/esm/configuration/snapshotPreprocess.d.ts +43 -0
  131. package/esm/configuration/snapshotPreprocess.js +161 -0
  132. package/esm/configuration/tabixIndexFields.d.ts +30 -4
  133. package/esm/configuration/tabixIndexFields.js +21 -4
  134. package/esm/configuration/tabixShorthand.d.ts +34 -17
  135. package/esm/configuration/tabixShorthand.js +49 -22
  136. package/esm/configuration/types.d.ts +182 -43
  137. package/esm/configuration/uriShorthand.d.ts +9 -0
  138. package/esm/configuration/uriShorthand.js +16 -0
  139. package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +13 -19
  140. package/esm/data_adapters/BaseAdapter/BaseAdapter.js +12 -19
  141. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +40 -2
  142. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +68 -5
  143. package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +40 -0
  144. package/esm/data_adapters/BaseAdapter/featureDensity.js +31 -0
  145. package/esm/data_adapters/BaseAdapter/index.d.ts +23 -3
  146. package/esm/data_adapters/BaseAdapter/index.js +1 -0
  147. package/esm/data_adapters/BaseAdapter/rowSources.d.ts +37 -0
  148. package/esm/data_adapters/BaseAdapter/rowSources.js +7 -0
  149. package/esm/data_adapters/BaseAdapter/stats.d.ts +33 -1
  150. package/esm/data_adapters/BaseAdapter/stats.js +52 -13
  151. package/esm/data_adapters/BaseAdapter/types.d.ts +8 -12
  152. package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
  153. package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
  154. package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +7 -11
  155. package/esm/data_adapters/CytobandAdapter/configSchema.js +3 -17
  156. package/esm/data_adapters/dataAdapterCache.d.ts +19 -2
  157. package/esm/data_adapters/dataAdapterCache.js +44 -10
  158. package/esm/data_adapters/getFeatureAdapter.d.ts +6 -4
  159. package/esm/data_adapters/getFeatureAdapter.js +8 -8
  160. package/esm/data_adapters/getSequenceSubAdapter.d.ts +7 -9
  161. package/esm/data_adapters/getSequenceSubAdapter.js +8 -10
  162. package/esm/pluggableElementTypes/AdapterType.d.ts +8 -8
  163. package/esm/pluggableElementTypes/AdapterType.js +1 -1
  164. package/esm/pluggableElementTypes/DisplayType.d.ts +53 -16
  165. package/esm/pluggableElementTypes/DisplayType.js +28 -12
  166. package/esm/pluggableElementTypes/LazyStateModelElement.d.ts +32 -0
  167. package/esm/pluggableElementTypes/LazyStateModelElement.js +77 -0
  168. package/esm/pluggableElementTypes/PluggableElementBase.d.ts +3 -5
  169. package/esm/pluggableElementTypes/PluggableElementBase.js +3 -5
  170. package/esm/pluggableElementTypes/RpcMethodType.d.ts +11 -1
  171. package/esm/pluggableElementTypes/RpcMethodType.js +25 -9
  172. package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
  173. package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
  174. package/esm/pluggableElementTypes/ViewType.d.ts +20 -4
  175. package/esm/pluggableElementTypes/ViewType.js +32 -4
  176. package/esm/pluggableElementTypes/WidgetType.d.ts +6 -0
  177. package/esm/pluggableElementTypes/WidgetType.js +6 -0
  178. package/esm/pluggableElementTypes/addMenuItems.d.ts +3 -2
  179. package/esm/pluggableElementTypes/extendElementType.d.ts +1 -2
  180. package/esm/pluggableElementTypes/extendElementType.js +9 -5
  181. package/esm/pluggableElementTypes/index.d.ts +2 -1
  182. package/esm/pluggableElementTypes/index.js +2 -9
  183. package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
  184. package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +122 -28
  185. package/esm/pluggableElementTypes/models/BaseDisplayModel.js +155 -11
  186. package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
  187. package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
  188. package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +87 -18
  189. package/esm/pluggableElementTypes/models/BaseViewModel.js +54 -11
  190. package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
  191. package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +15 -11
  192. package/esm/pluggableElementTypes/models/assertDisplayContract.js +25 -32
  193. package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
  194. package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
  195. package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
  196. package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +108 -147
  197. package/esm/pluggableElementTypes/models/baseTrackConfig.js +96 -73
  198. package/esm/pluggableElementTypes/models/components/SaveTrackData.js +4 -6
  199. package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
  200. package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
  201. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +23 -13
  202. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +80 -48
  203. package/esm/pluggableElementTypes/models/index.d.ts +2 -3
  204. package/esm/pluggableElementTypes/models/index.js +2 -3
  205. package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +15 -1
  206. package/esm/pluggableElementTypes/models/migrateTrackConfig.js +85 -25
  207. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +4 -3
  208. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +141 -19
  209. package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
  210. package/esm/pluginDefinitions.d.ts +34 -7
  211. package/esm/pluginDefinitions.js +54 -20
  212. package/esm/rpc/BaseRpcDriver.d.ts +2 -2
  213. package/esm/rpc/BaseRpcDriver.js +25 -30
  214. package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
  215. package/esm/rpc/MainThreadRpcDriver.js +13 -8
  216. package/esm/rpc/RpcClient.d.ts +18 -6
  217. package/esm/rpc/RpcClient.js +51 -16
  218. package/esm/rpc/RpcManager.d.ts +14 -10
  219. package/esm/rpc/RpcManager.js +11 -1
  220. package/esm/rpc/RpcRegistry.d.ts +40 -7
  221. package/esm/rpc/RpcServer.d.ts +3 -1
  222. package/esm/rpc/RpcServer.js +19 -12
  223. package/esm/rpc/WebWorkerRpcDriver.d.ts +11 -4
  224. package/esm/rpc/WebWorkerRpcDriver.js +64 -68
  225. package/esm/rpc/byteBudget.d.ts +20 -5
  226. package/esm/rpc/byteBudget.js +16 -5
  227. package/esm/rpc/configSchema.d.ts +7 -21
  228. package/esm/rpc/coreRpcMethods.d.ts +4 -0
  229. package/esm/rpc/coreRpcMethods.js +4 -0
  230. package/esm/rpc/methods/CoreGetEncodedFeature.d.ts +13 -0
  231. package/esm/rpc/methods/CoreGetEncodedFeature.js +32 -0
  232. package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +16 -0
  233. package/esm/rpc/methods/CoreGetEncodedLayers.js +59 -0
  234. package/esm/rpc/methods/CoreGetExportData.js +3 -4
  235. package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
  236. package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
  237. package/esm/rpc/methods/CoreGetFeatures.js +3 -5
  238. package/esm/rpc/methods/CoreGetRefNames.js +2 -12
  239. package/esm/rpc/methods/CoreGetRegionByteEstimate.js +1 -1
  240. package/esm/rpc/methods/CoreGetSequence.js +2 -2
  241. package/esm/rpc/methods/CoreLoadAdapterCode.d.ts +13 -0
  242. package/esm/rpc/methods/CoreLoadAdapterCode.js +16 -0
  243. package/esm/rpc/methods/layerFeatures.d.ts +33 -0
  244. package/esm/rpc/methods/layerFeatures.js +29 -0
  245. package/esm/svg/SvgExport.js +6 -7
  246. package/esm/svg/SvgThemeProviders.d.ts +12 -0
  247. package/esm/svg/SvgThemeProviders.js +15 -0
  248. package/esm/svg/exportViewSvg.d.ts +28 -0
  249. package/esm/svg/exportViewSvg.js +13 -0
  250. package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
  251. package/esm/svg/normalizeSvgMarkup.js +99 -0
  252. package/esm/svg/serializeSvg.d.ts +7 -0
  253. package/esm/svg/serializeSvg.js +11 -0
  254. package/esm/svg/svgId.d.ts +1 -1
  255. package/esm/svg/svgId.js +1 -1
  256. package/esm/svg/svgReady.d.ts +9 -7
  257. package/esm/svg/svgReady.js +8 -7
  258. package/esm/svg/trackNames.d.ts +7 -5
  259. package/esm/svg/trackNames.js +12 -9
  260. package/esm/svg/wrapSvgExport.js +6 -74
  261. package/esm/ui/AddCustomPluginDialog.js +3 -8
  262. package/esm/ui/AppReadyMarker.d.ts +45 -0
  263. package/esm/ui/AppReadyMarker.js +89 -0
  264. package/esm/ui/BaseExportSvgDialog.d.ts +1 -1
  265. package/esm/ui/CascadingMenu.js +181 -104
  266. package/esm/ui/DropDownMenu.js +2 -1
  267. package/esm/ui/ErrorBanner.js +1 -1
  268. package/esm/ui/ErrorBoundary.d.ts +2 -2
  269. package/esm/ui/ErrorMessageStackTraceContents.js +2 -1
  270. package/esm/ui/ErrorMessageStackTraceDialog.js +5 -11
  271. package/esm/ui/ExportSvgDialog.d.ts +1 -1
  272. package/esm/ui/FileDropZone.js +2 -1
  273. package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
  274. package/esm/ui/HoverMenu.d.ts +1 -2
  275. package/esm/ui/HoverMenu.js +6 -3
  276. package/esm/ui/JexlFilterDialog.d.ts +13 -10
  277. package/esm/ui/JexlFilterDialog.js +122 -50
  278. package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
  279. package/esm/ui/JexlFilterRowEditors.js +90 -0
  280. package/esm/ui/LazyBaseTooltip.d.ts +4 -0
  281. package/esm/ui/LazyBaseTooltip.js +9 -0
  282. package/esm/ui/LegendSwatchGlyph.js +26 -21
  283. package/esm/ui/LoadingOverlay.d.ts +14 -0
  284. package/esm/ui/LoadingOverlay.js +4 -2
  285. package/esm/ui/MenuTypes.d.ts +23 -53
  286. package/esm/ui/MenuTypes.js +3 -0
  287. package/esm/ui/MonospaceTextField.d.ts +2 -1
  288. package/esm/ui/MonospaceTextField.js +23 -20
  289. package/esm/ui/PaletteContext.d.ts +10 -5
  290. package/esm/ui/PaletteContext.js +44 -6
  291. package/esm/ui/RefNameAutocomplete/SearchOption.d.ts +13 -0
  292. package/esm/ui/RefNameAutocomplete/SearchOption.js +45 -0
  293. package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
  294. package/esm/ui/RefNameAutocomplete/index.js +8 -2
  295. package/esm/ui/RefNameAutocomplete/util.d.ts +13 -0
  296. package/esm/ui/RefNameAutocomplete/util.js +42 -1
  297. package/esm/ui/ResizeHandle.d.ts +3 -1
  298. package/esm/ui/ResizeHandle.js +44 -11
  299. package/esm/ui/ScrollChrome.d.ts +13 -0
  300. package/esm/ui/ScrollChrome.js +11 -0
  301. package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
  302. package/esm/ui/ScrollEdgeShadow.js +14 -35
  303. package/esm/ui/ScrollZoomToggle.d.ts +4 -27
  304. package/esm/ui/ScrollZoomToggle.js +34 -51
  305. package/esm/ui/SessionJsonPanel.d.ts +3 -0
  306. package/esm/ui/SessionJsonPanel.js +14 -0
  307. package/esm/ui/SettingsChangesTable.d.ts +1 -0
  308. package/esm/ui/SettingsChangesTable.js +49 -11
  309. package/esm/ui/ShareLinkField.d.ts +1 -3
  310. package/esm/ui/ShareLinkField.js +13 -40
  311. package/esm/ui/SizeSliderRow.d.ts +1 -3
  312. package/esm/ui/SizeSliderRow.js +4 -6
  313. package/esm/ui/SnackbarModel.js +79 -67
  314. package/esm/ui/StatusProgressBar.js +2 -2
  315. package/esm/ui/SvgColorLegend.d.ts +9 -4
  316. package/esm/ui/SvgColorLegend.js +82 -41
  317. package/esm/ui/VerticalScrollbar.d.ts +13 -34
  318. package/esm/ui/VerticalScrollbar.js +29 -83
  319. package/esm/ui/ViewLoadingScreen.d.ts +5 -4
  320. package/esm/ui/ViewLoadingScreen.js +8 -32
  321. package/esm/ui/colorScale.d.ts +92 -0
  322. package/esm/ui/colorScale.js +72 -0
  323. package/esm/ui/colors.d.ts +64 -0
  324. package/esm/ui/colors.js +230 -1
  325. package/esm/ui/hoverBoxStyle.d.ts +14 -2
  326. package/esm/ui/hoverBoxStyle.js +17 -2
  327. package/esm/ui/index.d.ts +12 -12
  328. package/esm/ui/index.js +14 -22
  329. package/esm/ui/launchViewMenu.js +15 -5
  330. package/esm/ui/legendMenuItem.d.ts +10 -32
  331. package/esm/ui/legendMenuItem.js +9 -36
  332. package/esm/ui/legendSpec.d.ts +15 -8
  333. package/esm/ui/legendSpec.js +14 -23
  334. package/esm/ui/makeSizeMenu.d.ts +0 -6
  335. package/esm/ui/makeSizeMenu.js +6 -30
  336. package/esm/ui/measureLegendText.js +1 -1
  337. package/esm/ui/menuItemAdornment.d.ts +9 -20
  338. package/esm/ui/menuItemAdornment.js +10 -32
  339. package/esm/ui/menuItems.d.ts +2 -7
  340. package/esm/ui/menuItems.js +1 -6
  341. package/esm/ui/multiTrackMenuItems.d.ts +6 -0
  342. package/esm/ui/palette.d.ts +118 -116
  343. package/esm/ui/palette.js +114 -75
  344. package/esm/ui/replaceViewAction.d.ts +1 -1
  345. package/esm/ui/replaceViewAction.js +1 -1
  346. package/esm/ui/theme.d.ts +43 -119
  347. package/esm/ui/theme.js +62 -78
  348. package/esm/ui/toggleMenuItems.d.ts +1 -3
  349. package/esm/ui/toggleMenuItems.js +6 -5
  350. package/esm/ui/useAssemblySelection.d.ts +4 -4
  351. package/esm/ui/viewHeaderHeight.d.ts +1 -0
  352. package/esm/ui/viewHeaderHeight.js +1 -0
  353. package/esm/util/Base1DUtils.d.ts +5 -3
  354. package/esm/util/Base1DUtils.js +14 -6
  355. package/esm/util/Base1DViewModel.d.ts +2 -1
  356. package/esm/util/Base1DViewModel.js +3 -2
  357. package/esm/util/SvgCanvas.d.ts +15 -13
  358. package/esm/util/SvgCanvas.js +76 -56
  359. package/esm/util/TimeTraveller.d.ts +3 -0
  360. package/esm/util/TimeTraveller.js +34 -2
  361. package/esm/util/aborting.d.ts +39 -0
  362. package/esm/util/aborting.js +88 -6
  363. package/esm/util/adapterMetadata.d.ts +1 -1
  364. package/esm/util/adapterMetadata.js +6 -5
  365. package/esm/util/addAndShowTrack.d.ts +2 -5
  366. package/esm/util/addAndShowTrack.js +5 -1
  367. package/esm/util/addRelativeUris.d.ts +17 -5
  368. package/esm/util/addRelativeUris.js +46 -10
  369. package/esm/util/addTrackFromWidget.d.ts +2 -5
  370. package/esm/util/addTrackFromWidget.js +5 -4
  371. package/esm/util/aggregateFieldName.d.ts +10 -0
  372. package/esm/util/aggregateFieldName.js +8 -0
  373. package/esm/util/analytics.js +46 -13
  374. package/esm/util/animationAllowed.d.ts +9 -0
  375. package/esm/util/animationAllowed.js +13 -0
  376. package/esm/util/applyRowResizeWheel.d.ts +10 -5
  377. package/esm/util/applyRowResizeWheel.js +10 -21
  378. package/esm/util/bandHeight.d.ts +10 -0
  379. package/esm/util/bandHeight.js +29 -0
  380. package/esm/util/bandLayout.d.ts +4 -4
  381. package/esm/util/bandLayout.js +4 -4
  382. package/esm/util/baseDisplayConfig.d.ts +8 -0
  383. package/esm/util/baseDisplayConfig.js +27 -0
  384. package/esm/util/bezierConnector.d.ts +4 -3
  385. package/esm/util/bezierConnector.js +38 -45
  386. package/esm/util/bgzfWorkerPool.d.ts +20 -74
  387. package/esm/util/bgzfWorkerPool.js +20 -74
  388. package/esm/util/binnedAggregate.d.ts +17 -0
  389. package/esm/util/binnedAggregate.js +275 -0
  390. package/esm/util/cacheBudgets.d.ts +22 -19
  391. package/esm/util/cacheBudgets.js +22 -19
  392. package/esm/util/cachedSetup.d.ts +16 -6
  393. package/esm/util/cachedSetup.js +108 -38
  394. package/esm/util/categoricalField.d.ts +56 -0
  395. package/esm/util/categoricalField.js +73 -0
  396. package/esm/util/cellMatches.d.ts +23 -0
  397. package/esm/util/cellMatches.js +264 -0
  398. package/esm/util/cellsStep.d.ts +29 -0
  399. package/esm/util/cellsStep.js +437 -0
  400. package/esm/util/clampToContig.d.ts +17 -0
  401. package/esm/util/clampToContig.js +19 -0
  402. package/esm/util/coarseStripHTML.js +1 -2
  403. package/esm/util/color/cssColorsLevel4.d.ts +1 -0
  404. package/esm/util/color/cssColorsLevel4.js +1 -0
  405. package/esm/util/color/index.d.ts +5 -3
  406. package/esm/util/color/index.js +7 -4
  407. package/esm/util/colorBits.d.ts +3 -3
  408. package/esm/util/colorBits.js +19 -44
  409. package/esm/util/colorRamp.d.ts +49 -5
  410. package/esm/util/colorRamp.js +169 -18
  411. package/esm/util/colorScale.d.ts +156 -0
  412. package/esm/util/colorScale.js +243 -0
  413. package/esm/util/colorSchemes.d.ts +21 -0
  414. package/esm/util/colorSchemes.js +30 -0
  415. package/esm/util/copyToClipboard.js +8 -1
  416. package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +21 -23
  417. package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +21 -52
  418. package/esm/util/createSvgRasterCanvas.d.ts +10 -0
  419. package/esm/util/cssColorParse.d.ts +15 -0
  420. package/esm/util/cssColorParse.js +53 -0
  421. package/esm/util/diagonalizeRegions.d.ts +2 -3
  422. package/esm/util/diagonalizeRegions.js +8 -13
  423. package/esm/util/expandLooseSearchIndex.d.ts +19 -0
  424. package/esm/util/expandLooseSearchIndex.js +29 -0
  425. package/esm/util/featureTable.d.ts +224 -0
  426. package/esm/util/featureTable.js +366 -0
  427. package/esm/util/featureTransforms.d.ts +81 -0
  428. package/esm/util/featureTransforms.js +1231 -0
  429. package/esm/util/featureTypes.d.ts +24 -0
  430. package/esm/util/featureTypes.js +35 -0
  431. package/esm/util/fetchAndMaybeUnzip.js +16 -9
  432. package/esm/util/fetchContext.d.ts +7 -8
  433. package/esm/util/fetchContext.js +3 -3
  434. package/esm/util/fetchHub.d.ts +4 -2
  435. package/esm/util/fetchHub.js +2 -2
  436. package/esm/util/fetchPhases.d.ts +10 -10
  437. package/esm/util/fetchSeq.d.ts +2 -3
  438. package/esm/util/fetchSeq.js +2 -2
  439. package/esm/util/fieldReader.d.ts +17 -0
  440. package/esm/util/fieldReader.js +62 -0
  441. package/esm/util/formatBytes.js +1 -1
  442. package/esm/util/formatGuessers.d.ts +25 -14
  443. package/esm/util/formatGuessers.js +42 -27
  444. package/esm/util/formatRelativeTime.js +1 -1
  445. package/esm/util/freezeDeep.d.ts +8 -10
  446. package/esm/util/freezeDeep.js +8 -10
  447. package/esm/util/getLocationUri.d.ts +2 -1
  448. package/esm/util/getLocationUri.js +8 -2
  449. package/esm/util/groupKeys.d.ts +76 -0
  450. package/esm/util/groupKeys.js +156 -0
  451. package/esm/util/highlights.d.ts +10 -6
  452. package/esm/util/highlights.js +12 -25
  453. package/esm/util/hooks.d.ts +31 -2
  454. package/esm/util/hooks.js +72 -3
  455. package/esm/util/index.d.ts +11 -11
  456. package/esm/util/index.js +11 -10
  457. package/esm/util/indexCandidates.d.ts +1 -31
  458. package/esm/util/indexCandidates.js +5 -63
  459. package/esm/util/installFetch.d.ts +77 -37
  460. package/esm/util/installFetch.js +65 -38
  461. package/esm/util/installInitAutorun.d.ts +14 -13
  462. package/esm/util/installInitAutorun.js +17 -17
  463. package/esm/util/installPrerequisiteFetch.d.ts +115 -0
  464. package/esm/util/installPrerequisiteFetch.js +111 -0
  465. package/esm/util/intervals.js +9 -4
  466. package/esm/util/io/index.js +22 -15
  467. package/esm/util/isDataCurrent.d.ts +7 -5
  468. package/esm/util/isDataCurrent.js +9 -6
  469. package/esm/util/isTextEntryFocused.d.ts +7 -0
  470. package/esm/util/isTextEntryFocused.js +16 -0
  471. package/esm/util/jexl.js +24 -21
  472. package/esm/util/jexlFilterRows.d.ts +89 -0
  473. package/esm/util/jexlFilterRows.js +252 -0
  474. package/esm/util/jexlFilters.d.ts +32 -57
  475. package/esm/util/jexlFilters.js +31 -29
  476. package/esm/util/jexlStrings.d.ts +3 -4
  477. package/esm/util/jexlStrings.js +2 -3
  478. package/esm/util/layouts/GranularRectLayout.d.ts +8 -1
  479. package/esm/util/layouts/GranularRectLayout.js +25 -8
  480. package/esm/util/lazyAfterAttach.d.ts +13 -0
  481. package/esm/util/lazyAfterAttach.js +31 -0
  482. package/esm/util/lazyWithPreload.d.ts +19 -0
  483. package/esm/util/lazyWithPreload.js +27 -0
  484. package/esm/util/legendCandidates.d.ts +72 -0
  485. package/esm/util/legendCandidates.js +138 -0
  486. package/esm/util/locString.js +5 -2
  487. package/esm/util/localStorage.js +4 -4
  488. package/esm/util/markEncoding.d.ts +150 -0
  489. package/esm/util/markEncoding.js +885 -0
  490. package/esm/util/markEncodingTypes.d.ts +595 -0
  491. package/esm/util/markEncodingTypes.js +8 -0
  492. package/esm/util/mst-reflection.d.ts +2 -20
  493. package/esm/util/mst-reflection.js +3 -53
  494. package/esm/util/mstUtils.d.ts +31 -23
  495. package/esm/util/mstUtils.js +39 -24
  496. package/esm/util/numericUtils.d.ts +7 -0
  497. package/esm/util/numericUtils.js +16 -0
  498. package/esm/util/numericValue.d.ts +14 -0
  499. package/esm/util/numericValue.js +34 -0
  500. package/esm/util/openFeatureWidget.d.ts +5 -0
  501. package/esm/util/openFeatureWidget.js +2 -2
  502. package/esm/util/openViews.d.ts +17 -0
  503. package/esm/util/openViews.js +22 -0
  504. package/esm/util/parentWalk.d.ts +1 -1
  505. package/esm/util/parentWalk.js +1 -1
  506. package/esm/util/parseLineByLine.d.ts +4 -5
  507. package/esm/util/parseLineByLine.js +8 -14
  508. package/esm/util/pluginStore.d.ts +6 -8
  509. package/esm/util/pluginStore.js +17 -16
  510. package/esm/util/preloadComponent.d.ts +5 -0
  511. package/esm/util/preloadComponent.js +11 -0
  512. package/esm/util/progress.d.ts +22 -22
  513. package/esm/util/progress.js +27 -26
  514. package/esm/util/quantileExtent.d.ts +49 -0
  515. package/esm/util/quantileExtent.js +162 -0
  516. package/esm/util/range.d.ts +13 -9
  517. package/esm/util/range.js +17 -8
  518. package/esm/util/renameRegions.d.ts +26 -6
  519. package/esm/util/renameRegions.js +68 -54
  520. package/esm/util/renderToStaticMarkup.js +24 -14
  521. package/esm/util/rxjs.d.ts +23 -8
  522. package/esm/util/rxjs.js +61 -15
  523. package/esm/util/samplesTsv.d.ts +49 -0
  524. package/esm/util/samplesTsv.js +86 -0
  525. package/esm/util/scheduleDetachedDestroy.d.ts +18 -0
  526. package/esm/util/scheduleDetachedDestroy.js +24 -0
  527. package/esm/util/scrollLatch.d.ts +1 -0
  528. package/esm/util/scrollLatch.js +8 -0
  529. package/esm/util/selectEncodedFeature.d.ts +16 -0
  530. package/esm/util/selectEncodedFeature.js +34 -0
  531. package/esm/util/sessionSharing.d.ts +7 -5
  532. package/esm/util/sessionSharing.js +23 -23
  533. package/esm/util/shapeNameList.d.ts +2 -0
  534. package/esm/util/shapeNameList.js +6 -0
  535. package/esm/util/shapeNames.d.ts +7 -0
  536. package/esm/util/shapeNames.js +11 -0
  537. package/esm/util/simpleFeature.d.ts +0 -1
  538. package/esm/util/springAnimate.js +1 -1
  539. package/esm/util/starFusion.d.ts +26 -0
  540. package/esm/util/starFusion.js +37 -0
  541. package/esm/util/stepTables.d.ts +96 -0
  542. package/esm/util/stepTables.js +277 -0
  543. package/esm/util/svAlt.d.ts +145 -0
  544. package/esm/util/svAlt.js +364 -0
  545. package/esm/util/svgColorProps.d.ts +11 -0
  546. package/esm/util/svgColorProps.js +28 -1
  547. package/esm/util/systemColorScheme.d.ts +12 -0
  548. package/esm/util/systemColorScheme.js +27 -0
  549. package/esm/util/tabix.d.ts +19 -10
  550. package/esm/util/tabix.js +19 -14
  551. package/esm/util/thresholdScale.d.ts +91 -0
  552. package/esm/util/thresholdScale.js +166 -0
  553. package/esm/util/timeGate.d.ts +4 -5
  554. package/esm/util/timeGate.js +4 -5
  555. package/esm/util/trackConfigDelta.d.ts +26 -26
  556. package/esm/util/trackConfigDelta.js +63 -47
  557. package/esm/util/tracks.d.ts +120 -66
  558. package/esm/util/tracks.js +501 -151
  559. package/esm/util/translateTranscript.d.ts +44 -0
  560. package/esm/util/translateTranscript.js +102 -0
  561. package/esm/util/types/data.d.ts +0 -2
  562. package/esm/util/types/index.d.ts +121 -22
  563. package/esm/util/types/index.js +9 -0
  564. package/esm/util/types/mst.d.ts +3 -0
  565. package/esm/util/types/mst.js +4 -0
  566. package/esm/util/types/renameIds.d.ts +1 -0
  567. package/esm/util/types/renameIds.js +29 -0
  568. package/esm/util/types/services.d.ts +1 -1
  569. package/esm/util/unknownSnapshotKeys.d.ts +53 -0
  570. package/esm/util/unknownSnapshotKeys.js +76 -0
  571. package/esm/util/useFeatureSequence.js +5 -5
  572. package/esm/util/useFetch.d.ts +3 -4
  573. package/esm/util/useFetch.js +19 -10
  574. package/esm/util/useFetchPlugins.d.ts +6 -2
  575. package/esm/util/useFetchPlugins.js +7 -3
  576. package/esm/util/usePanZoom.js +10 -3
  577. package/esm/util/usePanelVirtualScroll.d.ts +7 -35
  578. package/esm/util/usePanelVirtualScroll.js +9 -36
  579. package/esm/util/useRafCommit.js +1 -0
  580. package/esm/util/useRowVirtualScroll.d.ts +6 -29
  581. package/esm/util/useRowVirtualScroll.js +8 -49
  582. package/esm/util/useVirtualScrollWheel.d.ts +20 -4
  583. package/esm/util/useVirtualScrollWheel.js +40 -74
  584. package/esm/util/viewHighlights.d.ts +3 -0
  585. package/esm/util/viewHighlights.js +5 -0
  586. package/esm/util/viewStatus.d.ts +47 -15
  587. package/esm/util/viewStatus.js +34 -0
  588. package/esm/util/wheelZoom.d.ts +7 -1
  589. package/esm/util/wheelZoom.js +85 -19
  590. package/esm/util/whenViewSettled.d.ts +55 -8
  591. package/esm/util/whenViewSettled.js +56 -7
  592. package/esm/util/withFeatureDetails.js +4 -0
  593. package/esm/util/withLaunchInput.d.ts +174 -0
  594. package/esm/util/withLaunchInput.js +274 -0
  595. package/package.json +75 -24
  596. package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +0 -2
  597. package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +0 -8
  598. package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +0 -8
  599. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
  600. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
  601. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
  602. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
  603. package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
  604. package/esm/ReExports/BaseFeatureDetails.js +0 -10
  605. package/esm/ReExports/index.d.ts +0 -1
  606. package/esm/ReExports/index.js +0 -1
  607. package/esm/ReExports/publicUtil.d.ts +0 -1
  608. package/esm/ReExports/publicUtil.js +0 -28
  609. package/esm/configuration/promotableDefaults.d.ts +0 -199
  610. package/esm/configuration/promotableDefaults.js +0 -326
  611. package/esm/configuration/promotablePin.d.ts +0 -55
  612. package/esm/configuration/promotablePin.js +0 -1
  613. package/esm/configuration/promotableResolve.d.ts +0 -108
  614. package/esm/configuration/promotableResolve.js +0 -117
  615. package/esm/configuration/promotableSlots.d.ts +0 -12
  616. package/esm/configuration/promotableSlots.js +0 -45
  617. package/esm/configuration/slotShape.d.ts +0 -12
  618. package/esm/configuration/slotShape.js +0 -84
  619. package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
  620. package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
  621. package/esm/ui/PinAdornment.d.ts +0 -5
  622. package/esm/ui/PinAdornment.js +0 -79
  623. package/esm/ui/SvgGradientLegend.d.ts +0 -26
  624. package/esm/ui/SvgGradientLegend.js +0 -26
  625. package/esm/ui/highlightChipReveal.d.ts +0 -32
  626. package/esm/ui/highlightChipReveal.js +0 -39
  627. package/esm/ui/promotableMenuItems.d.ts +0 -19
  628. package/esm/ui/promotableMenuItems.js +0 -89
  629. package/esm/ui/promotablePinCoverage.d.ts +0 -44
  630. package/esm/ui/promotablePinCoverage.js +0 -87
  631. package/esm/util/applyInitSettings.d.ts +0 -79
  632. package/esm/util/applyInitSettings.js +0 -91
  633. package/esm/util/openDisplays.d.ts +0 -23
  634. package/esm/util/openDisplays.js +0 -79
  635. package/esm/util/stopToken.d.ts +0 -211
  636. package/esm/util/stopToken.js +0 -438
  637. /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 their chunks
4
- * on, instead of decompressing them on the thread that asked.
5
- *
6
- * BGZF decompression is 70-90% of a cold query (`@gmod/bam` ADR 0003) and BGZF
7
- * blocks are independently inflatable, so spreading them across workers is the
8
- * largest remaining lever in the read path. Measured 1.95x end to end on the
9
- * BAM side: a 22-view pan / zoom out / pan back over 1000x long-read data, real
10
- * HTTP, headless Chrome, 4 workers, with both arms returning the same 38,246
11
- * records.
12
- *
13
- * ## One pool per JS context, like the cache budgets
14
- *
15
- * Same scope and same reason as `decompressedBytesBudget` — see
16
- * {@link ./cacheBudgets.ts} — so one per RPC worker plus one on the main
17
- * thread. That is the scope with spare cores: a track's queries are sticky to a
18
- * single RPC worker, so without a pool every chunk of every query inflates on
19
- * that one thread while the rest of the machine idles. `getSharedWorkerPool()`
20
- * memoizes per context, so every adapter in a worker shares its four workers
21
- * rather than each opening its own.
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 their chunks
3
- * on, instead of decompressing them on the thread that asked.
4
- *
5
- * BGZF decompression is 70-90% of a cold query (`@gmod/bam` ADR 0003) and BGZF
6
- * blocks are independently inflatable, so spreading them across workers is the
7
- * largest remaining lever in the read path. Measured 1.95x end to end on the
8
- * BAM side: a 22-view pan / zoom out / pan back over 1000x long-read data, real
9
- * HTTP, headless Chrome, 4 workers, with both arms returning the same 38,246
10
- * records.
11
- *
12
- * ## One pool per JS context, like the cache budgets
13
- *
14
- * Same scope and same reason as `decompressedBytesBudget` — see
15
- * {@link ./cacheBudgets.ts} — so one per RPC worker plus one on the main
16
- * thread. That is the scope with spare cores: a track's queries are sticky to a
17
- * single RPC worker, so without a pool every chunk of every query inflates on
18
- * that one thread while the rest of the machine idles. `getSharedWorkerPool()`
19
- * memoizes per context, so every adapter in a worker shares its four workers
20
- * rather than each opening its own.
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
- * Ceilings on what the indexed-format libraries retain, shared by every adapter
4
- * in this JS context — so one per RPC worker, plus one on the main thread,
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 these are not per file
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 numbers are not new
32
+ * ## The number is not new
33
33
  *
34
- * Both are the libraries' own per-file defaults, moved from per-file to
35
- * per-context. That makes this a strict tightening — retention can only fall —
36
- * and avoids inventing a number that would need its own justification. The
37
- * budget still has to clear one query's working set or the cliff returns, and
38
- * on that workload 512 MB shared across three tracks already cost 43 refills
39
- * where 1 GB cost 4.
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
- * ## Two budgets, because units cannot mix
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. `@gmod/bam` and `@gmod/tabix` weigh decompressed bytes;
45
- * `@gmod/cram` weighs decoded records, because a decoded record has no cheap
46
- * size. A single budget spanning them would add records to bytes and bound
47
- * neither. `sizeOf` is opaque, so nothing can catch that at runtime — hence two
48
- * budgets named for their units.
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;
@@ -1,10 +1,10 @@
1
1
  import { SharedBudget } from '@gmod/shared-read-cache';
2
2
  /**
3
- * Ceilings on what the indexed-format libraries retain, shared by every adapter
4
- * in this JS context — so one per RPC worker, plus one on the main thread,
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 these are not per file
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 numbers are not new
32
+ * ## The number is not new
33
33
  *
34
- * Both are the libraries' own per-file defaults, moved from per-file to
35
- * per-context. That makes this a strict tightening — retention can only fall —
36
- * and avoids inventing a number that would need its own justification. The
37
- * budget still has to clear one query's working set or the cliff returns, and
38
- * on that workload 512 MB shared across three tracks already cost 43 refills
39
- * where 1 GB cost 4.
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
- * ## Two budgets, because units cannot mix
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. `@gmod/bam` and `@gmod/tabix` weigh decompressed bytes;
45
- * `@gmod/cram` weighs decoded records, because a decoded record has no cheap
46
- * size. A single budget spanning them would add records to bytes and bound
47
- * neither. `sizeOf` is opaque, so nothing can catch that at runtime — hence two
48
- * budgets named for their units.
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);