@jbrowse/core 5.0.0-beta.1 → 5.0.0-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (611) hide show
  1. package/README.md +1476 -265
  2. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
  3. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -3
  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 +16 -9
  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 +50 -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/configSchema.d.ts +1 -1
  35. package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
  36. package/esm/BaseFeatureWidget/formatDetails.js +62 -83
  37. package/esm/BaseFeatureWidget/index.d.ts +2 -1
  38. package/esm/BaseFeatureWidget/stateModelFactory.d.ts +42 -29
  39. package/esm/BaseFeatureWidget/stateModelFactory.js +98 -98
  40. package/esm/BaseFeatureWidget/types.d.ts +12 -6
  41. package/esm/BaseFeatureWidget/util.d.ts +0 -10
  42. package/esm/BaseFeatureWidget/util.js +0 -17
  43. package/esm/CorePlugin.js +2 -2
  44. package/esm/PluginLoader.d.ts +24 -13
  45. package/esm/PluginLoader.js +167 -51
  46. package/esm/PluginManager.d.ts +130 -24
  47. package/esm/PluginManager.js +180 -32
  48. package/esm/ReExports/MuiDataGridReExports.d.ts +1 -0
  49. package/esm/ReExports/MuiDataGridReExports.js +2 -2
  50. package/esm/ReExports/coreModules.generated.d.ts +2 -0
  51. package/esm/ReExports/coreModules.generated.js +528 -0
  52. package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
  53. package/esm/ReExports/coreWorkerModules.generated.js +488 -0
  54. package/esm/ReExports/frameworkModules.d.ts +2 -0
  55. package/esm/ReExports/frameworkModules.js +68 -0
  56. package/esm/ReExports/frameworkShared.d.ts +12 -0
  57. package/esm/ReExports/frameworkShared.js +16 -0
  58. package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
  59. package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
  60. package/esm/ReExports/list.js +527 -79
  61. package/esm/ReExports/modules.d.ts +1 -1
  62. package/esm/ReExports/modules.js +10 -165
  63. package/esm/ReExports/registry.d.ts +1 -0
  64. package/esm/ReExports/registry.js +23 -5
  65. package/esm/ReExports/uiStub.d.ts +3 -0
  66. package/esm/ReExports/uiStub.js +33 -0
  67. package/esm/ReExports/workerModules.d.ts +2 -0
  68. package/esm/ReExports/workerModules.js +11 -0
  69. package/esm/TextSearch/TextSearchManager.d.ts +27 -13
  70. package/esm/TextSearch/TextSearchManager.js +77 -36
  71. package/esm/TextSearch/places.d.ts +12 -0
  72. package/esm/TextSearch/places.js +94 -0
  73. package/esm/assemblyManager/assembly.d.ts +21 -19
  74. package/esm/assemblyManager/assembly.js +28 -26
  75. package/esm/assemblyManager/assemblyAdapters.d.ts +1 -1
  76. package/esm/assemblyManager/assemblyAdapters.js +8 -2
  77. package/esm/assemblyManager/assemblyConfigSchema.d.ts +31 -90
  78. package/esm/assemblyManager/assemblyConfigSchema.js +35 -47
  79. package/esm/assemblyManager/assemblyManager.d.ts +35 -180
  80. package/esm/assemblyManager/assemblyManager.js +47 -51
  81. package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +25 -18
  82. package/esm/assemblyManager/expandAssemblyConfigShorthand.js +78 -49
  83. package/esm/assemblyManager/geneticCodes.js +2 -5
  84. package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +10 -0
  85. package/esm/assemblyManager/getSequenceAdapterConfig.js +10 -0
  86. package/esm/assemblyManager/indexAssemblyNames.d.ts +9 -0
  87. package/esm/assemblyManager/indexAssemblyNames.js +22 -0
  88. package/esm/assemblyManager/loadRefNameMap.d.ts +1 -1
  89. package/esm/assemblyManager/loadRefNameMap.js +4 -9
  90. package/esm/assemblyManager/refNameMapKey.d.ts +7 -0
  91. package/esm/assemblyManager/refNameMapKey.js +12 -0
  92. package/esm/checkPlugins.d.ts +2 -0
  93. package/esm/checkPlugins.js +38 -17
  94. package/esm/configuration/bamIndexFields.d.ts +49 -0
  95. package/esm/configuration/bamIndexFields.js +41 -0
  96. package/esm/configuration/configurationSchema.d.ts +101 -71
  97. package/esm/configuration/configurationSchema.js +207 -134
  98. package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
  99. package/esm/configuration/configurationSchemaUnion.js +56 -0
  100. package/esm/configuration/configurationSlot.d.ts +150 -60
  101. package/esm/configuration/configurationSlot.js +103 -75
  102. package/esm/configuration/fillLocations.d.ts +14 -0
  103. package/esm/configuration/fillLocations.js +14 -0
  104. package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
  105. package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
  106. package/esm/configuration/formatDetailsConfigSchema.js +10 -13
  107. package/esm/configuration/fullConfSnapshot.d.ts +4 -19
  108. package/esm/configuration/fullConfSnapshot.js +30 -52
  109. package/esm/configuration/getConf.d.ts +45 -41
  110. package/esm/configuration/getConf.js +111 -44
  111. package/esm/configuration/index.d.ts +24 -11
  112. package/esm/configuration/index.js +15 -7
  113. package/esm/configuration/indexType.d.ts +26 -0
  114. package/esm/configuration/indexType.js +38 -0
  115. package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
  116. package/esm/configuration/mergeFormatCallbacks.js +13 -10
  117. package/esm/configuration/readConfObject.d.ts +2 -24
  118. package/esm/configuration/readConfObject.js +20 -63
  119. package/esm/configuration/requirements.d.ts +37 -0
  120. package/esm/configuration/requirements.js +88 -0
  121. package/esm/configuration/schemaRegistry.d.ts +32 -15
  122. package/esm/configuration/schemaRegistry.js +33 -35
  123. package/esm/configuration/schemaTypes.d.ts +21 -5
  124. package/esm/configuration/schemaTypes.js +66 -55
  125. package/esm/configuration/slotFacade.d.ts +12 -29
  126. package/esm/configuration/slotFacade.js +44 -23
  127. package/esm/configuration/snapshotPreprocess.d.ts +43 -0
  128. package/esm/configuration/snapshotPreprocess.js +161 -0
  129. package/esm/configuration/tabixIndexFields.d.ts +30 -4
  130. package/esm/configuration/tabixIndexFields.js +21 -4
  131. package/esm/configuration/tabixShorthand.d.ts +34 -17
  132. package/esm/configuration/tabixShorthand.js +49 -22
  133. package/esm/configuration/types.d.ts +182 -43
  134. package/esm/configuration/uriShorthand.d.ts +9 -0
  135. package/esm/configuration/uriShorthand.js +16 -0
  136. package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +13 -19
  137. package/esm/data_adapters/BaseAdapter/BaseAdapter.js +12 -19
  138. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +40 -2
  139. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +68 -5
  140. package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +40 -0
  141. package/esm/data_adapters/BaseAdapter/featureDensity.js +31 -0
  142. package/esm/data_adapters/BaseAdapter/index.d.ts +23 -3
  143. package/esm/data_adapters/BaseAdapter/index.js +1 -0
  144. package/esm/data_adapters/BaseAdapter/rowSources.d.ts +37 -0
  145. package/esm/data_adapters/BaseAdapter/rowSources.js +7 -0
  146. package/esm/data_adapters/BaseAdapter/stats.d.ts +33 -1
  147. package/esm/data_adapters/BaseAdapter/stats.js +52 -13
  148. package/esm/data_adapters/BaseAdapter/types.d.ts +8 -12
  149. package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
  150. package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
  151. package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +7 -11
  152. package/esm/data_adapters/CytobandAdapter/configSchema.js +3 -17
  153. package/esm/data_adapters/dataAdapterCache.d.ts +19 -2
  154. package/esm/data_adapters/dataAdapterCache.js +44 -10
  155. package/esm/data_adapters/getFeatureAdapter.d.ts +6 -4
  156. package/esm/data_adapters/getFeatureAdapter.js +8 -8
  157. package/esm/data_adapters/getSequenceSubAdapter.d.ts +7 -9
  158. package/esm/data_adapters/getSequenceSubAdapter.js +8 -10
  159. package/esm/pluggableElementTypes/AdapterType.d.ts +8 -8
  160. package/esm/pluggableElementTypes/AdapterType.js +1 -1
  161. package/esm/pluggableElementTypes/DisplayType.d.ts +46 -16
  162. package/esm/pluggableElementTypes/DisplayType.js +22 -12
  163. package/esm/pluggableElementTypes/LazyStateModelElement.d.ts +32 -0
  164. package/esm/pluggableElementTypes/LazyStateModelElement.js +77 -0
  165. package/esm/pluggableElementTypes/PluggableElementBase.d.ts +3 -5
  166. package/esm/pluggableElementTypes/PluggableElementBase.js +3 -5
  167. package/esm/pluggableElementTypes/RpcMethodType.d.ts +11 -1
  168. package/esm/pluggableElementTypes/RpcMethodType.js +25 -9
  169. package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
  170. package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
  171. package/esm/pluggableElementTypes/ViewType.d.ts +20 -4
  172. package/esm/pluggableElementTypes/ViewType.js +32 -4
  173. package/esm/pluggableElementTypes/addMenuItems.d.ts +3 -2
  174. package/esm/pluggableElementTypes/extendElementType.d.ts +1 -2
  175. package/esm/pluggableElementTypes/extendElementType.js +9 -5
  176. package/esm/pluggableElementTypes/index.d.ts +2 -1
  177. package/esm/pluggableElementTypes/index.js +1 -1
  178. package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
  179. package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +65 -27
  180. package/esm/pluggableElementTypes/models/BaseDisplayModel.js +72 -10
  181. package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
  182. package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
  183. package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +85 -16
  184. package/esm/pluggableElementTypes/models/BaseViewModel.js +53 -10
  185. package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
  186. package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +15 -11
  187. package/esm/pluggableElementTypes/models/assertDisplayContract.js +25 -32
  188. package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
  189. package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
  190. package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
  191. package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +108 -147
  192. package/esm/pluggableElementTypes/models/baseTrackConfig.js +96 -73
  193. package/esm/pluggableElementTypes/models/components/SaveTrackData.js +4 -6
  194. package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
  195. package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
  196. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +23 -13
  197. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +80 -48
  198. package/esm/pluggableElementTypes/models/index.d.ts +2 -3
  199. package/esm/pluggableElementTypes/models/index.js +2 -3
  200. package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +15 -1
  201. package/esm/pluggableElementTypes/models/migrateTrackConfig.js +85 -25
  202. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +4 -3
  203. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +141 -19
  204. package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
  205. package/esm/pluginDefinitions.d.ts +34 -7
  206. package/esm/pluginDefinitions.js +54 -20
  207. package/esm/rpc/BaseRpcDriver.d.ts +2 -2
  208. package/esm/rpc/BaseRpcDriver.js +25 -30
  209. package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
  210. package/esm/rpc/MainThreadRpcDriver.js +13 -8
  211. package/esm/rpc/RpcClient.d.ts +18 -6
  212. package/esm/rpc/RpcClient.js +51 -16
  213. package/esm/rpc/RpcManager.d.ts +14 -10
  214. package/esm/rpc/RpcManager.js +11 -1
  215. package/esm/rpc/RpcRegistry.d.ts +40 -7
  216. package/esm/rpc/RpcServer.d.ts +3 -1
  217. package/esm/rpc/RpcServer.js +19 -12
  218. package/esm/rpc/WebWorkerRpcDriver.d.ts +11 -4
  219. package/esm/rpc/WebWorkerRpcDriver.js +64 -68
  220. package/esm/rpc/byteBudget.d.ts +20 -5
  221. package/esm/rpc/byteBudget.js +16 -5
  222. package/esm/rpc/configSchema.d.ts +7 -21
  223. package/esm/rpc/coreRpcMethods.d.ts +4 -0
  224. package/esm/rpc/coreRpcMethods.js +4 -0
  225. package/esm/rpc/methods/CoreGetEncodedFeature.d.ts +13 -0
  226. package/esm/rpc/methods/CoreGetEncodedFeature.js +32 -0
  227. package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +16 -0
  228. package/esm/rpc/methods/CoreGetEncodedLayers.js +59 -0
  229. package/esm/rpc/methods/CoreGetExportData.js +3 -4
  230. package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
  231. package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
  232. package/esm/rpc/methods/CoreGetFeatures.js +3 -5
  233. package/esm/rpc/methods/CoreGetRefNames.js +2 -12
  234. package/esm/rpc/methods/CoreGetRegionByteEstimate.js +1 -1
  235. package/esm/rpc/methods/CoreGetSequence.js +2 -2
  236. package/esm/rpc/methods/CoreLoadAdapterCode.d.ts +13 -0
  237. package/esm/rpc/methods/CoreLoadAdapterCode.js +16 -0
  238. package/esm/rpc/methods/layerFeatures.d.ts +33 -0
  239. package/esm/rpc/methods/layerFeatures.js +29 -0
  240. package/esm/svg/SvgExport.js +6 -7
  241. package/esm/svg/SvgThemeProviders.d.ts +12 -0
  242. package/esm/svg/SvgThemeProviders.js +15 -0
  243. package/esm/svg/exportViewSvg.d.ts +28 -0
  244. package/esm/svg/exportViewSvg.js +13 -0
  245. package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
  246. package/esm/svg/normalizeSvgMarkup.js +99 -0
  247. package/esm/svg/serializeSvg.d.ts +7 -0
  248. package/esm/svg/serializeSvg.js +11 -0
  249. package/esm/svg/svgId.d.ts +1 -1
  250. package/esm/svg/svgId.js +1 -1
  251. package/esm/svg/svgReady.d.ts +9 -7
  252. package/esm/svg/svgReady.js +8 -7
  253. package/esm/svg/trackNames.d.ts +7 -5
  254. package/esm/svg/trackNames.js +12 -9
  255. package/esm/svg/wrapSvgExport.js +6 -74
  256. package/esm/ui/AddCustomPluginDialog.js +3 -8
  257. package/esm/ui/AppReadyMarker.d.ts +45 -0
  258. package/esm/ui/AppReadyMarker.js +89 -0
  259. package/esm/ui/BaseExportSvgDialog.d.ts +1 -1
  260. package/esm/ui/CascadingMenu.js +181 -104
  261. package/esm/ui/DropDownMenu.js +2 -1
  262. package/esm/ui/ErrorBanner.js +1 -1
  263. package/esm/ui/ErrorBoundary.d.ts +2 -2
  264. package/esm/ui/ErrorMessageStackTraceContents.js +2 -1
  265. package/esm/ui/ErrorMessageStackTraceDialog.js +5 -11
  266. package/esm/ui/ExportSvgDialog.d.ts +1 -1
  267. package/esm/ui/FileDropZone.js +2 -1
  268. package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
  269. package/esm/ui/HoverMenu.d.ts +1 -2
  270. package/esm/ui/HoverMenu.js +6 -3
  271. package/esm/ui/JexlFilterDialog.d.ts +13 -10
  272. package/esm/ui/JexlFilterDialog.js +122 -49
  273. package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
  274. package/esm/ui/JexlFilterRowEditors.js +90 -0
  275. package/esm/ui/LazyBaseTooltip.d.ts +4 -0
  276. package/esm/ui/LazyBaseTooltip.js +9 -0
  277. package/esm/ui/LegendSwatchGlyph.js +26 -21
  278. package/esm/ui/LoadingOverlay.d.ts +14 -0
  279. package/esm/ui/LoadingOverlay.js +4 -2
  280. package/esm/ui/MenuTypes.d.ts +23 -53
  281. package/esm/ui/MenuTypes.js +3 -0
  282. package/esm/ui/MonospaceTextField.d.ts +2 -1
  283. package/esm/ui/MonospaceTextField.js +23 -20
  284. package/esm/ui/PaletteContext.d.ts +10 -5
  285. package/esm/ui/PaletteContext.js +44 -6
  286. package/esm/ui/RefNameAutocomplete/SearchOption.d.ts +13 -0
  287. package/esm/ui/RefNameAutocomplete/SearchOption.js +45 -0
  288. package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
  289. package/esm/ui/RefNameAutocomplete/index.js +8 -2
  290. package/esm/ui/RefNameAutocomplete/util.d.ts +13 -0
  291. package/esm/ui/RefNameAutocomplete/util.js +42 -1
  292. package/esm/ui/ResizeHandle.d.ts +3 -1
  293. package/esm/ui/ResizeHandle.js +44 -11
  294. package/esm/ui/ScrollChrome.d.ts +13 -0
  295. package/esm/ui/ScrollChrome.js +11 -0
  296. package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
  297. package/esm/ui/ScrollEdgeShadow.js +14 -35
  298. package/esm/ui/ScrollZoomToggle.d.ts +4 -27
  299. package/esm/ui/ScrollZoomToggle.js +34 -51
  300. package/esm/ui/SessionJsonPanel.d.ts +3 -0
  301. package/esm/ui/SessionJsonPanel.js +14 -0
  302. package/esm/ui/SettingsChangesTable.d.ts +1 -0
  303. package/esm/ui/SettingsChangesTable.js +49 -11
  304. package/esm/ui/ShareLinkField.d.ts +1 -3
  305. package/esm/ui/ShareLinkField.js +13 -40
  306. package/esm/ui/SizeSliderRow.d.ts +1 -3
  307. package/esm/ui/SizeSliderRow.js +4 -6
  308. package/esm/ui/SnackbarModel.js +79 -67
  309. package/esm/ui/StatusProgressBar.js +2 -2
  310. package/esm/ui/SvgColorLegend.d.ts +9 -4
  311. package/esm/ui/SvgColorLegend.js +82 -41
  312. package/esm/ui/VerticalScrollbar.d.ts +13 -34
  313. package/esm/ui/VerticalScrollbar.js +29 -83
  314. package/esm/ui/ViewLoadingScreen.d.ts +5 -4
  315. package/esm/ui/ViewLoadingScreen.js +8 -32
  316. package/esm/ui/colorScale.d.ts +92 -0
  317. package/esm/ui/colorScale.js +72 -0
  318. package/esm/ui/colors.d.ts +64 -0
  319. package/esm/ui/colors.js +230 -1
  320. package/esm/ui/hoverBoxStyle.d.ts +14 -2
  321. package/esm/ui/hoverBoxStyle.js +17 -2
  322. package/esm/ui/index.d.ts +12 -12
  323. package/esm/ui/index.js +14 -22
  324. package/esm/ui/launchViewMenu.js +15 -5
  325. package/esm/ui/legendMenuItem.d.ts +10 -32
  326. package/esm/ui/legendMenuItem.js +9 -36
  327. package/esm/ui/legendSpec.d.ts +15 -8
  328. package/esm/ui/legendSpec.js +14 -23
  329. package/esm/ui/makeSizeMenu.d.ts +0 -6
  330. package/esm/ui/makeSizeMenu.js +6 -30
  331. package/esm/ui/measureLegendText.js +1 -1
  332. package/esm/ui/menuItemAdornment.d.ts +9 -20
  333. package/esm/ui/menuItemAdornment.js +10 -32
  334. package/esm/ui/menuItems.d.ts +2 -7
  335. package/esm/ui/menuItems.js +1 -6
  336. package/esm/ui/multiTrackMenuItems.d.ts +6 -0
  337. package/esm/ui/palette.d.ts +118 -116
  338. package/esm/ui/palette.js +114 -75
  339. package/esm/ui/replaceViewAction.d.ts +1 -1
  340. package/esm/ui/replaceViewAction.js +1 -1
  341. package/esm/ui/theme.d.ts +43 -119
  342. package/esm/ui/theme.js +62 -78
  343. package/esm/ui/toggleMenuItems.d.ts +1 -3
  344. package/esm/ui/toggleMenuItems.js +6 -5
  345. package/esm/ui/useAssemblySelection.d.ts +4 -4
  346. package/esm/ui/viewHeaderHeight.d.ts +1 -0
  347. package/esm/ui/viewHeaderHeight.js +1 -0
  348. package/esm/util/Base1DUtils.d.ts +5 -3
  349. package/esm/util/Base1DUtils.js +14 -6
  350. package/esm/util/Base1DViewModel.d.ts +2 -1
  351. package/esm/util/Base1DViewModel.js +3 -2
  352. package/esm/util/SvgCanvas.d.ts +15 -13
  353. package/esm/util/SvgCanvas.js +76 -56
  354. package/esm/util/aborting.d.ts +39 -0
  355. package/esm/util/aborting.js +88 -6
  356. package/esm/util/adapterMetadata.d.ts +1 -1
  357. package/esm/util/adapterMetadata.js +6 -5
  358. package/esm/util/addAndShowTrack.d.ts +2 -5
  359. package/esm/util/addAndShowTrack.js +5 -1
  360. package/esm/util/addRelativeUris.d.ts +17 -5
  361. package/esm/util/addRelativeUris.js +46 -10
  362. package/esm/util/addTrackFromWidget.d.ts +2 -5
  363. package/esm/util/addTrackFromWidget.js +5 -4
  364. package/esm/util/aggregateFieldName.d.ts +10 -0
  365. package/esm/util/aggregateFieldName.js +8 -0
  366. package/esm/util/analytics.js +46 -13
  367. package/esm/util/animationAllowed.d.ts +9 -0
  368. package/esm/util/animationAllowed.js +13 -0
  369. package/esm/util/applyRowResizeWheel.d.ts +10 -5
  370. package/esm/util/applyRowResizeWheel.js +10 -21
  371. package/esm/util/bandHeight.d.ts +10 -0
  372. package/esm/util/bandHeight.js +29 -0
  373. package/esm/util/bandLayout.d.ts +4 -4
  374. package/esm/util/bandLayout.js +4 -4
  375. package/esm/util/bezierConnector.d.ts +4 -3
  376. package/esm/util/bezierConnector.js +38 -45
  377. package/esm/util/bgzfWorkerPool.d.ts +20 -74
  378. package/esm/util/bgzfWorkerPool.js +20 -74
  379. package/esm/util/binnedAggregate.d.ts +17 -0
  380. package/esm/util/binnedAggregate.js +275 -0
  381. package/esm/util/cacheBudgets.d.ts +22 -19
  382. package/esm/util/cacheBudgets.js +22 -19
  383. package/esm/util/cachedSetup.d.ts +1 -1
  384. package/esm/util/cachedSetup.js +2 -2
  385. package/esm/util/categoricalField.d.ts +56 -0
  386. package/esm/util/categoricalField.js +73 -0
  387. package/esm/util/clampToContig.d.ts +17 -0
  388. package/esm/util/clampToContig.js +19 -0
  389. package/esm/util/coarseStripHTML.js +1 -2
  390. package/esm/util/color/cssColorsLevel4.d.ts +1 -0
  391. package/esm/util/color/cssColorsLevel4.js +1 -0
  392. package/esm/util/color/index.d.ts +5 -3
  393. package/esm/util/color/index.js +7 -4
  394. package/esm/util/colorBits.d.ts +3 -3
  395. package/esm/util/colorBits.js +19 -44
  396. package/esm/util/colorRamp.d.ts +49 -5
  397. package/esm/util/colorRamp.js +169 -18
  398. package/esm/util/colorScale.d.ts +156 -0
  399. package/esm/util/colorScale.js +243 -0
  400. package/esm/util/colorSchemes.d.ts +21 -0
  401. package/esm/util/colorSchemes.js +30 -0
  402. package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +21 -23
  403. package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +21 -52
  404. package/esm/util/createSvgRasterCanvas.d.ts +10 -0
  405. package/esm/util/cssColorParse.d.ts +15 -0
  406. package/esm/util/cssColorParse.js +53 -0
  407. package/esm/util/diagonalizeRegions.d.ts +2 -3
  408. package/esm/util/diagonalizeRegions.js +8 -13
  409. package/esm/util/expandLooseSearchIndex.d.ts +19 -0
  410. package/esm/util/expandLooseSearchIndex.js +29 -0
  411. package/esm/util/featureTable.d.ts +224 -0
  412. package/esm/util/featureTable.js +366 -0
  413. package/esm/util/featureTransforms.d.ts +80 -0
  414. package/esm/util/featureTransforms.js +1579 -0
  415. package/esm/util/featureTypes.d.ts +24 -0
  416. package/esm/util/featureTypes.js +35 -0
  417. package/esm/util/fetchAndMaybeUnzip.js +16 -9
  418. package/esm/util/fetchContext.d.ts +7 -8
  419. package/esm/util/fetchContext.js +3 -3
  420. package/esm/util/fetchHub.d.ts +4 -2
  421. package/esm/util/fetchHub.js +2 -2
  422. package/esm/util/fetchPhases.d.ts +10 -10
  423. package/esm/util/fetchSeq.d.ts +2 -3
  424. package/esm/util/fetchSeq.js +2 -2
  425. package/esm/util/fieldReader.d.ts +17 -0
  426. package/esm/util/fieldReader.js +62 -0
  427. package/esm/util/freezeDeep.d.ts +8 -10
  428. package/esm/util/freezeDeep.js +8 -10
  429. package/esm/util/groupKeys.d.ts +77 -0
  430. package/esm/util/groupKeys.js +155 -0
  431. package/esm/util/highlights.d.ts +10 -6
  432. package/esm/util/highlights.js +12 -25
  433. package/esm/util/hooks.d.ts +31 -2
  434. package/esm/util/hooks.js +72 -3
  435. package/esm/util/index.d.ts +11 -11
  436. package/esm/util/index.js +11 -10
  437. package/esm/util/indexCandidates.d.ts +1 -31
  438. package/esm/util/indexCandidates.js +5 -63
  439. package/esm/util/installFetch.d.ts +77 -37
  440. package/esm/util/installFetch.js +65 -38
  441. package/esm/util/installInitAutorun.d.ts +14 -13
  442. package/esm/util/installInitAutorun.js +17 -17
  443. package/esm/util/installPrerequisiteFetch.d.ts +115 -0
  444. package/esm/util/installPrerequisiteFetch.js +111 -0
  445. package/esm/util/io/index.js +19 -14
  446. package/esm/util/isDataCurrent.d.ts +7 -5
  447. package/esm/util/isDataCurrent.js +9 -6
  448. package/esm/util/isTextEntryFocused.d.ts +7 -0
  449. package/esm/util/isTextEntryFocused.js +16 -0
  450. package/esm/util/jexl.js +24 -21
  451. package/esm/util/jexlFilterRows.d.ts +89 -0
  452. package/esm/util/jexlFilterRows.js +252 -0
  453. package/esm/util/jexlFilters.d.ts +20 -27
  454. package/esm/util/jexlFilters.js +23 -11
  455. package/esm/util/jexlStrings.d.ts +3 -4
  456. package/esm/util/jexlStrings.js +2 -3
  457. package/esm/util/layouts/GranularRectLayout.d.ts +8 -1
  458. package/esm/util/layouts/GranularRectLayout.js +25 -8
  459. package/esm/util/lazyAfterAttach.d.ts +13 -0
  460. package/esm/util/lazyAfterAttach.js +31 -0
  461. package/esm/util/lazyWithPreload.d.ts +19 -0
  462. package/esm/util/lazyWithPreload.js +27 -0
  463. package/esm/util/legendCandidates.d.ts +72 -0
  464. package/esm/util/legendCandidates.js +138 -0
  465. package/esm/util/localStorage.js +4 -4
  466. package/esm/util/markEncoding.d.ts +150 -0
  467. package/esm/util/markEncoding.js +845 -0
  468. package/esm/util/markEncodingTypes.d.ts +588 -0
  469. package/esm/util/markEncodingTypes.js +8 -0
  470. package/esm/util/mst-reflection.d.ts +2 -20
  471. package/esm/util/mst-reflection.js +3 -53
  472. package/esm/util/mstUtils.d.ts +31 -23
  473. package/esm/util/mstUtils.js +39 -24
  474. package/esm/util/numericUtils.d.ts +7 -0
  475. package/esm/util/numericUtils.js +16 -0
  476. package/esm/util/numericValue.d.ts +14 -0
  477. package/esm/util/numericValue.js +34 -0
  478. package/esm/util/openFeatureWidget.d.ts +5 -0
  479. package/esm/util/openFeatureWidget.js +2 -2
  480. package/esm/util/openViews.d.ts +17 -0
  481. package/esm/util/openViews.js +22 -0
  482. package/esm/util/parentWalk.d.ts +1 -1
  483. package/esm/util/parentWalk.js +1 -1
  484. package/esm/util/parseLineByLine.d.ts +4 -5
  485. package/esm/util/parseLineByLine.js +8 -14
  486. package/esm/util/pluginStore.d.ts +6 -8
  487. package/esm/util/pluginStore.js +17 -16
  488. package/esm/util/preloadComponent.d.ts +5 -0
  489. package/esm/util/preloadComponent.js +11 -0
  490. package/esm/util/progress.d.ts +22 -22
  491. package/esm/util/progress.js +27 -26
  492. package/esm/util/quantileExtent.d.ts +49 -0
  493. package/esm/util/quantileExtent.js +162 -0
  494. package/esm/util/range.d.ts +13 -9
  495. package/esm/util/range.js +17 -8
  496. package/esm/util/renameRegions.d.ts +26 -6
  497. package/esm/util/renameRegions.js +68 -54
  498. package/esm/util/renderToStaticMarkup.js +24 -14
  499. package/esm/util/rxjs.d.ts +23 -8
  500. package/esm/util/rxjs.js +61 -15
  501. package/esm/util/samplesTsv.d.ts +49 -0
  502. package/esm/util/samplesTsv.js +86 -0
  503. package/esm/util/scheduleDetachedDestroy.d.ts +18 -0
  504. package/esm/util/scheduleDetachedDestroy.js +24 -0
  505. package/esm/util/scrollLatch.d.ts +1 -0
  506. package/esm/util/scrollLatch.js +8 -0
  507. package/esm/util/selectEncodedFeature.d.ts +16 -0
  508. package/esm/util/selectEncodedFeature.js +34 -0
  509. package/esm/util/sessionSharing.d.ts +7 -5
  510. package/esm/util/sessionSharing.js +23 -23
  511. package/esm/util/shapeNameList.d.ts +2 -0
  512. package/esm/util/shapeNameList.js +6 -0
  513. package/esm/util/shapeNames.d.ts +7 -0
  514. package/esm/util/shapeNames.js +11 -0
  515. package/esm/util/simpleFeature.d.ts +0 -1
  516. package/esm/util/starFusion.d.ts +26 -0
  517. package/esm/util/starFusion.js +37 -0
  518. package/esm/util/stepTables.d.ts +82 -0
  519. package/esm/util/stepTables.js +243 -0
  520. package/esm/util/svAlt.d.ts +145 -0
  521. package/esm/util/svAlt.js +364 -0
  522. package/esm/util/svgColorProps.d.ts +11 -0
  523. package/esm/util/svgColorProps.js +28 -1
  524. package/esm/util/systemColorScheme.d.ts +12 -0
  525. package/esm/util/systemColorScheme.js +27 -0
  526. package/esm/util/tabix.d.ts +13 -8
  527. package/esm/util/tabix.js +17 -12
  528. package/esm/util/thresholdScale.d.ts +91 -0
  529. package/esm/util/thresholdScale.js +166 -0
  530. package/esm/util/timeGate.d.ts +4 -5
  531. package/esm/util/timeGate.js +4 -5
  532. package/esm/util/trackConfigDelta.d.ts +26 -26
  533. package/esm/util/trackConfigDelta.js +63 -47
  534. package/esm/util/tracks.d.ts +121 -40
  535. package/esm/util/tracks.js +497 -112
  536. package/esm/util/translateTranscript.d.ts +44 -0
  537. package/esm/util/translateTranscript.js +102 -0
  538. package/esm/util/types/data.d.ts +0 -2
  539. package/esm/util/types/index.d.ts +121 -22
  540. package/esm/util/types/index.js +9 -0
  541. package/esm/util/types/mst.d.ts +3 -0
  542. package/esm/util/types/mst.js +4 -0
  543. package/esm/util/types/renameIds.d.ts +1 -0
  544. package/esm/util/types/renameIds.js +29 -0
  545. package/esm/util/types/services.d.ts +1 -1
  546. package/esm/util/unknownSnapshotKeys.d.ts +51 -0
  547. package/esm/util/unknownSnapshotKeys.js +82 -0
  548. package/esm/util/useFeatureSequence.js +5 -5
  549. package/esm/util/useFetch.d.ts +3 -4
  550. package/esm/util/useFetch.js +19 -10
  551. package/esm/util/useFetchPlugins.d.ts +6 -2
  552. package/esm/util/useFetchPlugins.js +7 -3
  553. package/esm/util/usePanelVirtualScroll.d.ts +7 -35
  554. package/esm/util/usePanelVirtualScroll.js +9 -36
  555. package/esm/util/useRowVirtualScroll.d.ts +6 -29
  556. package/esm/util/useRowVirtualScroll.js +8 -49
  557. package/esm/util/useVirtualScrollWheel.d.ts +20 -4
  558. package/esm/util/useVirtualScrollWheel.js +40 -74
  559. package/esm/util/viewHighlights.d.ts +3 -0
  560. package/esm/util/viewHighlights.js +5 -0
  561. package/esm/util/viewStatus.d.ts +47 -15
  562. package/esm/util/viewStatus.js +34 -0
  563. package/esm/util/wheelZoom.d.ts +7 -1
  564. package/esm/util/wheelZoom.js +85 -19
  565. package/esm/util/whenViewSettled.d.ts +55 -8
  566. package/esm/util/whenViewSettled.js +56 -7
  567. package/esm/util/withLaunchInput.d.ts +174 -0
  568. package/esm/util/withLaunchInput.js +274 -0
  569. package/package.json +70 -20
  570. package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +0 -2
  571. package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +0 -8
  572. package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +0 -8
  573. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
  574. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
  575. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
  576. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
  577. package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
  578. package/esm/ReExports/BaseFeatureDetails.js +0 -10
  579. package/esm/ReExports/index.d.ts +0 -1
  580. package/esm/ReExports/index.js +0 -1
  581. package/esm/ReExports/publicUtil.d.ts +0 -1
  582. package/esm/ReExports/publicUtil.js +0 -28
  583. package/esm/configuration/promotableDefaults.d.ts +0 -199
  584. package/esm/configuration/promotableDefaults.js +0 -326
  585. package/esm/configuration/promotablePin.d.ts +0 -55
  586. package/esm/configuration/promotablePin.js +0 -1
  587. package/esm/configuration/promotableResolve.d.ts +0 -108
  588. package/esm/configuration/promotableResolve.js +0 -117
  589. package/esm/configuration/promotableSlots.d.ts +0 -12
  590. package/esm/configuration/promotableSlots.js +0 -45
  591. package/esm/configuration/slotShape.d.ts +0 -12
  592. package/esm/configuration/slotShape.js +0 -84
  593. package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
  594. package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
  595. package/esm/ui/PinAdornment.d.ts +0 -5
  596. package/esm/ui/PinAdornment.js +0 -79
  597. package/esm/ui/SvgGradientLegend.d.ts +0 -26
  598. package/esm/ui/SvgGradientLegend.js +0 -26
  599. package/esm/ui/highlightChipReveal.d.ts +0 -32
  600. package/esm/ui/highlightChipReveal.js +0 -39
  601. package/esm/ui/promotableMenuItems.d.ts +0 -19
  602. package/esm/ui/promotableMenuItems.js +0 -89
  603. package/esm/ui/promotablePinCoverage.d.ts +0 -44
  604. package/esm/ui/promotablePinCoverage.js +0 -87
  605. package/esm/util/applyInitSettings.d.ts +0 -79
  606. package/esm/util/applyInitSettings.js +0 -91
  607. package/esm/util/openDisplays.d.ts +0 -23
  608. package/esm/util/openDisplays.js +0 -79
  609. package/esm/util/stopToken.d.ts +0 -211
  610. package/esm/util/stopToken.js +0 -438
  611. /package/esm/{BaseFeatureWidget/BaseFeatureDetail/types.js → data_adapters/BaseAdapter/zoomRange.js} +0 -0
@@ -9,11 +9,10 @@ export async function writeAWSAnalytics(rootModel, initialTimestamp, sessionQuer
9
9
  try {
10
10
  const url = 'https://analytics.jbrowse.org/api/v1';
11
11
  const multiAssemblyTracks = rootModel.jbrowse.tracks.filter(track => readConfObject(track, 'assemblyNames').length > 1).length;
12
- // which rendering backend is actually drawing (WebGPU/WebGL2/Canvas2D) —
13
- // capabilities *and* any page-wide pin, so a session that fell back to
14
- // Canvas2D is counted as Canvas2D rather than as what the hardware could
15
- // have done. Reporting the capability answer here is what made "how many
16
- // users end up on Canvas2D" unanswerable.
12
+ // The rung createGpuHal built where a display has built one by idle time,
13
+ // else the ladder's prediction with any page-wide pin applied — so a
14
+ // session that fell back to Canvas2D is counted as Canvas2D rather than as
15
+ // what the hardware could have done.
17
16
  const capabilities = await getGraphicsCapabilities();
18
17
  const renderer = effectiveRenderer(capabilities);
19
18
  // The coarse bit only. `glRenderer` names the exact driver and stays local
@@ -120,14 +119,48 @@ export function doAnalytics(rootModel, initialTimestamp, initialSessionQuery) {
120
119
  !analyticsSent &&
121
120
  !readConfObject(rootModel.jbrowse.configuration, 'disableAnalytics')) {
122
121
  analyticsSent = true;
123
- // Defer off the critical load path: writeGAAnalytics injects a third-party
124
- // Google Analytics script and writeAWSAnalytics probes graphics
125
- // capabilities, together ~hundreds of ms of main-thread work at startup.
126
- // loadTime is still measured from initialTimestamp, so the reported metric
127
- // is unaffected by running these when the browser is idle.
128
- rIC(() => {
129
- void writeAWSAnalytics(rootModel, initialTimestamp, initialSessionQuery);
130
- void writeGAAnalytics(rootModel, initialTimestamp);
122
+ // writeGAAnalytics injects Google's scripts and writeAWSAnalytics probes
123
+ // graphics capabilities, hundreds of ms of main-thread work together. Idle
124
+ // time alone is not late enough: a load spends most of its time idle,
125
+ // waiting on the network, so rIC ran them mid-boot. The writers measure
126
+ // loadTime up to when they run, so the start they get is moved forward by
127
+ // the wait, and loadTime still ends here.
128
+ const calledAt = Date.now();
129
+ afterAppReady(() => {
130
+ rIC(() => {
131
+ const start = initialTimestamp + (Date.now() - calledAt);
132
+ void writeAWSAnalytics(rootModel, start, initialSessionQuery);
133
+ void writeGAAnalytics(rootModel, start);
134
+ });
131
135
  });
132
136
  }
133
137
  }
138
+ // `[data-app-phase="ready"]`, or a timeout for a page that never shows one
139
+ // (Desktop's start screen)
140
+ function afterAppReady(callback, maxWaitMs = 10_000) {
141
+ const isReady = () => document.querySelector('[data-app-phase="ready"]') !== null;
142
+ if (isReady()) {
143
+ callback();
144
+ return;
145
+ }
146
+ let done = false;
147
+ const finish = () => {
148
+ if (!done) {
149
+ done = true;
150
+ observer.disconnect();
151
+ clearTimeout(timer);
152
+ callback();
153
+ }
154
+ };
155
+ const observer = new MutationObserver(() => {
156
+ if (isReady()) {
157
+ finish();
158
+ }
159
+ });
160
+ const timer = setTimeout(finish, maxWaitMs);
161
+ observer.observe(document.body, {
162
+ subtree: true,
163
+ childList: true,
164
+ attributeFilter: ['data-app-phase'],
165
+ });
166
+ }
@@ -15,3 +15,12 @@ import type { AnimationMode } from './types/index.ts';
15
15
  * honors it.
16
16
  */
17
17
  export declare function animationAllowed(mode: AnimationMode): boolean;
18
+ /** how long a layout morph takes from where it drew to where it now draws */
19
+ export declare const MORPH_DURATION_MS = 300;
20
+ export declare function easeInOutCubic(t: number): number;
21
+ /**
22
+ * The wall clock a morph is timed on. Falls back to the epoch clock rather than
23
+ * a constant where `performance` is missing: a clock that never advances
24
+ * leaves a frame loop at progress 0 forever.
25
+ */
26
+ export declare function morphClockMs(): number;
@@ -20,3 +20,16 @@ export function animationAllowed(mode) {
20
20
  return (hasFrameClock &&
21
21
  (mode === 'enabled' || (mode === 'system' && !prefersReduced)));
22
22
  }
23
+ /** how long a layout morph takes from where it drew to where it now draws */
24
+ export const MORPH_DURATION_MS = 300;
25
+ export function easeInOutCubic(t) {
26
+ return t < 0.5 ? 4 * t * t * t : 1 - (-2 * t + 2) ** 3 / 2;
27
+ }
28
+ /**
29
+ * The wall clock a morph is timed on. Falls back to the epoch clock rather than
30
+ * a constant where `performance` is missing: a clock that never advances
31
+ * leaves a frame loop at progress 0 forever.
32
+ */
33
+ export function morphClockMs() {
34
+ return typeof performance === 'undefined' ? Date.now() : performance.now();
35
+ }
@@ -1,10 +1,15 @@
1
- interface RowResizeTarget {
1
+ import type { VirtualScrollModel } from './useVirtualScrollWheel.ts';
2
+ export interface RowResizeTarget extends VirtualScrollModel {
3
+ /** resolved, never the 0/fit sentinel — this is divided by */
2
4
  effectiveRowHeight: number;
3
- scrollTop: number;
4
5
  nrow: number;
5
- viewportHeight: number;
6
6
  setRowHeight: (n: number) => void;
7
- setScrollTop: (n: number) => void;
8
7
  }
8
+ /**
9
+ * shift+wheel over a row stack: resize the rows, pinning the row under the
10
+ * cursor. The floor is the fit height, so rows never shrink past filling the
11
+ * viewport. The cap stops a gesture but never moves rows on its own, so it
12
+ * rises to a current height already above it (a pinned `rowHeight` is
13
+ * unbounded).
14
+ */
9
15
  export declare function applyRowResizeWheel(e: WheelEvent, el: HTMLElement, model: RowResizeTarget): void;
10
- export {};
@@ -1,30 +1,19 @@
1
- // shift+wheel resizes the sample rows (a vertical-zoom gesture) rather than
2
- // scrolling, keeping the row under the cursor pinned in place as the height
3
- // changes. Shared by every row-stack display — both variant displays and MAF —
4
- // so the gesture stays identical wherever rows have a resolved height and a
5
- // scroll offset. setScrollTop clamps to the new scrollableHeight, so the raw
6
- // target is passed through unclamped.
7
1
  import { normalizeWheelDelta } from './wheelZoom.js';
8
2
  const MAX_ROW_HEIGHT = 20;
9
- // px of row-height change per pixel of normalized wheel scroll. A mouse notch
10
- // (~100px) nudges the height ~0.4px; a trackpad's small continuous deltas
11
- // accumulate smoothly instead of the old sign-based ±1-per-event, which flew
12
- // through the whole range on a trackpad's event flood.
3
+ // A mouse notch (~100px) nudges the height ~0.4px, and a trackpad's small
4
+ // deltas accumulate smoothly rather than flying through the range.
13
5
  const RESIZE_PX_PER_WHEEL_PX = 1 / 240;
6
+ /**
7
+ * shift+wheel over a row stack: resize the rows, pinning the row under the
8
+ * cursor. The floor is the fit height, so rows never shrink past filling the
9
+ * viewport. The cap stops a gesture but never moves rows on its own, so it
10
+ * rises to a current height already above it (a pinned `rowHeight` is
11
+ * unbounded).
12
+ */
14
13
  export function applyRowResizeWheel(e, el, model) {
15
14
  e.preventDefault();
16
- // scroll up (deltaY < 0) grows rows; proportional to the normalized delta so
17
- // the speed is consistent across mice/trackpads and finer than ±1/event.
18
15
  const delta = -normalizeWheelDelta(e.deltaY, e.deltaMode) * RESIZE_PX_PER_WHEEL_PX;
19
- // guard nrow=0 (no samples) so the auto-fit floor stays finite
20
- const minRowHeight = model.viewportHeight / Math.max(1, model.nrow);
21
- // The cap may stop the gesture going further; it may never move the rows on
22
- // its own. So both heights that can already sit above MAX_ROW_HEIGHT raise
23
- // it: the auto-fit floor (few samples), and the current height (a pinned
24
- // `rowHeight` — the config slot and the "Custom..." dialog are both
25
- // unbounded, and MAF's own docs example is 12 while a bases-mode row wants
26
- // more). Without the second, a 40px pinned row met `min(20, 40.4)` on the
27
- // first notch of a *grow* gesture and halved.
16
+ const minRowHeight = model.scrollViewportHeight / Math.max(1, model.nrow);
28
17
  const maxRowHeight = Math.max(MAX_ROW_HEIGHT, minRowHeight, model.effectiveRowHeight);
29
18
  const newRowHeight = Math.max(minRowHeight, Math.min(maxRowHeight, model.effectiveRowHeight + delta));
30
19
  const mouseY = e.clientY - el.getBoundingClientRect().top;
@@ -51,3 +51,13 @@ export declare function boundBandHeight(n: number, { min, max }?: BandBounds): n
51
51
  * display height so the plot below cannot be squashed to nothing
52
52
  */
53
53
  export declare function clampBandHeight(current: number, target: number, bounds?: BandBounds): number;
54
+ /**
55
+ * #api core/util
56
+ * Heights after growing or shrinking a stack of bands by `distance` px in all:
57
+ * the one rule every whole-stack resize uses. Each band takes its share of the
58
+ * height it has above `floor`, so the tall bands give and take the most, and
59
+ * none goes below `floor`, or below its own height if it already sits under it
60
+ * (the {@link clampBandHeight} rule). Whole pixels, rounded by largest
61
+ * remainder, so the stack moves by exactly the rounded distance.
62
+ */
63
+ export declare function scaleBandHeights(heights: number[], distance: number, floor?: number): number[];
@@ -54,3 +54,32 @@ export function clampBandHeight(current, target, bounds = {}) {
54
54
  const { min = MIN_BAND_HEIGHT } = bounds;
55
55
  return boundBandHeight(target, { ...bounds, min: Math.min(min, current) });
56
56
  }
57
+ /**
58
+ * #api core/util
59
+ * Heights after growing or shrinking a stack of bands by `distance` px in all:
60
+ * the one rule every whole-stack resize uses. Each band takes its share of the
61
+ * height it has above `floor`, so the tall bands give and take the most, and
62
+ * none goes below `floor`, or below its own height if it already sits under it
63
+ * (the {@link clampBandHeight} rule). Whole pixels, rounded by largest
64
+ * remainder, so the stack moves by exactly the rounded distance.
65
+ */
66
+ export function scaleBandHeights(heights, distance, floor = MIN_BAND_HEIGHT) {
67
+ const floors = heights.map(h => Math.min(h, floor));
68
+ const room = heights.map((h, i) => h - floors[i]);
69
+ const roomTotal = room.reduce((a, b) => a + b, 0);
70
+ const target = Math.max(0, Math.round(roomTotal + distance));
71
+ const exact = room.map(r => roomTotal > 0 ? (r * target) / roomTotal : target / heights.length);
72
+ const whole = exact.map(e => Math.floor(e));
73
+ let left = target - whole.reduce((a, b) => a + b, 0);
74
+ const byRemainder = exact
75
+ .map((e, i) => ({ i, frac: e - whole[i] }))
76
+ .sort((a, b) => b.frac - a.frac);
77
+ for (const { i } of byRemainder) {
78
+ if (left <= 0) {
79
+ break;
80
+ }
81
+ whole[i] = whole[i] + 1;
82
+ left -= 1;
83
+ }
84
+ return whole.map((w, i) => w + floors[i]);
85
+ }
@@ -39,11 +39,11 @@ export interface BandStack<K extends string> {
39
39
  /**
40
40
  * #api core/util
41
41
  * Fold an ordered set of bands into tops and a bottom. The order is the
42
- * argument, so a display states its band order exactly once; reserve, paint
43
- * and pick all read the same fold, which is what keeps "the reserver and the
44
- * painter read one function" true by construction rather than by prose.
42
+ * argument, so a display states its band order exactly once. Reserve, paint
43
+ * and pick all call this function, so the reserved and painted positions
44
+ * cannot disagree.
45
45
  *
46
- * Only the fold is shared. What varies per display stays there: per-lane
46
+ * Only the fold is shared; the rest stays in each display. Per-lane
47
47
  * iteration runs this once per lane, sticky-vs-scrolling is a property of how
48
48
  * the result is projected to the screen, and a band drawn outside its
49
49
  * reservation (an overlay) carries its own draw rect beside the stack.
@@ -14,11 +14,11 @@ export function reservedPx(band) {
14
14
  /**
15
15
  * #api core/util
16
16
  * Fold an ordered set of bands into tops and a bottom. The order is the
17
- * argument, so a display states its band order exactly once; reserve, paint
18
- * and pick all read the same fold, which is what keeps "the reserver and the
19
- * painter read one function" true by construction rather than by prose.
17
+ * argument, so a display states its band order exactly once. Reserve, paint
18
+ * and pick all call this function, so the reserved and painted positions
19
+ * cannot disagree.
20
20
  *
21
- * Only the fold is shared. What varies per display stays there: per-lane
21
+ * Only the fold is shared; the rest stays in each display. Per-lane
22
22
  * iteration runs this once per lane, sticky-vs-scrolling is a property of how
23
23
  * the result is projected to the screen, and a band drawn outside its
24
24
  * reservation (an overlay) carries its own draw rect beside the stack.
@@ -1,5 +1,6 @@
1
- export declare const BEZIER_CONNECTOR_MAX_REACH_PX: number;
2
- export declare function bezierConnectorPath({ x1, y1, x2, y2, s1, s2, leadingEnd2, reversed1, reversed2, maxHandlePx, dip, }: {
1
+ export declare const CUBIC_APEX_RATIO = 0.75;
2
+ export declare const BEZIER_CONNECTOR_MAX_REACH_PX = 110;
3
+ export declare function bezierConnectorPath({ x1, y1, x2, y2, s1, s2, leadingEnd2, reversed1, reversed2, maxHandlePx, dipPx, }: {
3
4
  x1: number;
4
5
  y1: number;
5
6
  x2: number;
@@ -10,5 +11,5 @@ export declare function bezierConnectorPath({ x1, y1, x2, y2, s1, s2, leadingEnd
10
11
  reversed1?: boolean;
11
12
  reversed2?: boolean;
12
13
  maxHandlePx?: number;
13
- dip?: boolean;
14
+ dipPx?: number;
14
15
  }): string;
@@ -19,43 +19,38 @@ const SPAN_FACTOR = 0.3;
19
19
  // its leading end: unbounded, that hook grows with the arc, and a full-width
20
20
  // inversion flings a ~500px curl back across unrelated reads.
21
21
  const MAX_HANDLE_PX = 200;
22
+ // A symmetric cubic's extreme sits 3/4 of the way from its baseline to its
23
+ // control points, so an arc asked to reach a given apex puts its controls 4/3
24
+ // past it. Exported because the sashimi overlay solves the same equation in the
25
+ // other direction, and the two spellings drifting apart would put the insert-
26
+ // size ruler's labels at heights nothing plots at.
27
+ export const CUBIC_APEX_RATIO = 0.75;
22
28
  // Vertical bow applied to a connection whose two endpoints share (or nearly
23
29
  // share) a row — e.g. a chain whose split segments are all laid out on one
24
30
  // pileup row. Without it the horizontal-only handles collapse the cubic to a
25
31
  // flat, invisible line lying on the row; the bow lifts the control points so
26
32
  // the curve arcs into a visible hump. This is the control-point lift, not the
27
- // height the curve reaches: a cubic with both control points lifted by `bow`
28
- // apexes at 0.75 * bow.
33
+ // height the curve reaches.
29
34
  const MAX_BOW_PX = 30;
30
35
  // A discordant connection bows *down* instead of up, so the two classes read
31
36
  // apart at a glance. Both renderers follow this: BreakpointSplitView dips its
32
- // same-level discordant links, and the pileup overlay dips every curve it draws
33
- // (its normal-orientation pairs are plain lines, so a curve there is always
34
- // discordant). Keep it that way — a renderer that opts out makes "below the
35
- // reads" mean two different things in two views of the same data.
37
+ // same-level discordant links, and the pileup overlay dips every discordant
38
+ // curve it draws (a normal-orientation pair is a plain line, or bows up over its
39
+ // row where a hidden-segment one would lie on a chain's connecting line). Keep
40
+ // it that way — a renderer that opts out makes "below the reads" mean two
41
+ // different things in two views of the same data.
36
42
  //
37
- // Depth comes from the connection's own horizontal span
38
- // rather than reaching for some fixed row: with "view as pairs" / "link
39
- // supplementary alignments" every qname lands on one row, so dipping to a
40
- // shared row bottoms every curve out at the same depth and they collapse into
41
- // spaghetti. Keying on span makes the depth mean something — wide events dive
42
- // deeper than narrow ones — and lets the curves nest.
43
- //
44
- // Depth saturates toward MAX_DIP_PX rather than clamping at it. A hard cap
45
- // reintroduces exactly the problem being fixed: every connection wider than the
46
- // cap point bottoms out at an identical depth, and at any plausible cap a
47
- // typical view is mostly wider. This form stays strictly increasing in span at
48
- // every width while staying bounded. DIP_HALF_SPAN_PX is the span at which the
49
- // dip reaches half its maximum.
50
- const MAX_DIP_PX = 110;
51
- const DIP_HALF_SPAN_PX = 500;
52
- // How far a curve can stray outside the band between its two endpoints. A cubic
53
- // with both control points offset by `d` apexes at 0.75 * d, and the dip — the
54
- // deeper of the two shaping terms — saturates toward MAX_DIP_PX, so this bounds
55
- // both. A caller that culls off-screen curves has to pad its viewport test by
56
- // this: the shaping is applied to the *control points*, so a curve whose two
43
+ // HOW DEEP is the renderer's call, not this file's. Depth is the mark's one free
44
+ // channel, and only the renderer knows the band the ink has to survive in — the
45
+ // pileup clips each section at its band bottom, and the split view bleeds a
46
+ // too-deep dip into the panel below. So callers pass the depth they want and
47
+ // `discordantDipPx` (@jbrowse/sv-core) is the law the two of them share.
48
+ // How far a curve can stray outside the band between its two endpoints. The dip
49
+ // is the deeper of the two shaping terms, so this is a ceiling on it, applied
50
+ // here rather than trusted to a caller: a culler pads its viewport test by this,
51
+ // and the shaping is applied to the *control points*, so a curve whose two
57
52
  // endpoints both sit just outside the viewport can still have a visible body.
58
- export const BEZIER_CONNECTOR_MAX_REACH_PX = 0.75 * MAX_DIP_PX;
53
+ export const BEZIER_CONNECTOR_MAX_REACH_PX = 110;
59
54
  // Sign (+1/-1) of an endpoint's horizontal control handle. The handle leaves a
60
55
  // trailing (3') endpoint along the read's reading direction (`strand`); at a
61
56
  // split junction's leading (5') endpoint it flips, so the curve arrives flowing
@@ -75,19 +70,6 @@ function shapingBudget(p1, p2) {
75
70
  function bowHeight(p1, p2, budget) {
76
71
  return Math.min(budget, Math.max(0, MAX_BOW_PX - Math.abs(p2.y - p1.y)));
77
72
  }
78
- // Negative = the control points drop below the reads (see MAX_DIP_PX). Keyed on
79
- // horizontal span alone: two reads a few px apart describe a small event and get
80
- // a small dip, however tall their track happens to be.
81
- //
82
- // Budget-clamped like the bow. At the current tuning the saturating curve
83
- // already resolves under the budget at every span (worst ratio ~0.73, as span
84
- // → 0), so this is inert — it's here so retuning MAX_DIP_PX / DIP_HALF_SPAN_PX
85
- // can't silently reintroduce the fold-back squiggle SPAN_FACTOR exists to
86
- // prevent. Pinned by 'the dip never outgrows its shaping budget'.
87
- function dipHeight(p1, p2, budget) {
88
- const span = Math.abs(p2.x - p1.x);
89
- return -Math.min(budget, MAX_DIP_PX * (span / (span + DIP_HALF_SPAN_PX)));
90
- }
91
73
  function cubicPath(from, ctrl1, ctrl2, to) {
92
74
  return `M ${from.x} ${from.y} C ${ctrl1.x} ${ctrl1.y} ${ctrl2.x} ${ctrl2.y} ${to.x} ${to.y}`;
93
75
  }
@@ -95,14 +77,25 @@ export function bezierConnectorPath({ x1, y1, x2, y2, s1, s2,
95
77
  // The second endpoint is a split junction's 5' leading edge (its handle flips
96
78
  // to fold the curve into the next segment); false for a paired mate's 3' edge.
97
79
  leadingEnd2 = false, reversed1 = false, reversed2 = false, maxHandlePx = MAX_HANDLE_PX,
98
- // This connection is discordant (aberrant pair orientation, or a split
99
- // junction's strand flip): it dips below the reads instead of arcing over
100
- // them, so the two classes are tellable apart by shape alone.
101
- dip = false, }) {
80
+ // Depth, in px, of the dip a discordant connection draws instead of the bow a
81
+ // concordant one gets — aberrant pair orientation, or a split junction's
82
+ // strand flip, so the two classes are tellable apart by shape alone. It is
83
+ // the depth of the curve's APEX — what a caller can bound by the room it has —
84
+ // and CUBIC_APEX_RATIO converts it to the control-point drop that puts the ink
85
+ // there. Leave it out to bow up.
86
+ dipPx, }) {
102
87
  const from = { x: x1, y: y1 };
103
88
  const to = { x: x2, y: y2 };
104
89
  const budget = shapingBudget(from, to);
105
90
  const handle = Math.min(maxHandlePx, budget);
106
- const bow = dip ? dipHeight(from, to, budget) : bowHeight(from, to, budget);
91
+ // The dip is deliberately not clamped to the budget, unlike the bow. The
92
+ // budget stops the cubic folding back over itself, and only the horizontal
93
+ // handles can do that — a vertical offset leaves x(t) monotonic however deep
94
+ // it goes, so a big event squeezed into a few px draws a narrow trough rather
95
+ // than a squiggle. Pinned by 'a dipped connection never overshoots its
96
+ // endpoints in x'.
97
+ const bow = dipPx === undefined
98
+ ? bowHeight(from, to, budget)
99
+ : -Math.min(dipPx, BEZIER_CONNECTOR_MAX_REACH_PX) / CUBIC_APEX_RATIO;
107
100
  return cubicPath(from, { x: x1 + handle * tangentSign(s1, false, reversed1), y: y1 - bow }, { x: x2 + handle * tangentSign(s2, leadingEnd2, reversed2), y: y2 - bow }, to);
108
101
  }
@@ -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;