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