@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,7 +1,9 @@
1
+ import { makeAbortError } from '../util/aborting.js';
1
2
  import { deserializeError } from './serializeError/index.js';
2
3
  export default class RpcClient {
3
4
  worker;
4
5
  pending = new Map();
6
+ destroyed = false;
5
7
  events = new Map();
6
8
  counter = 0;
7
9
  constructor(worker) {
@@ -39,10 +41,9 @@ export default class RpcClient {
39
41
  if (idx !== -1) {
40
42
  listeners.splice(idx, 1);
41
43
  }
42
- // drop the emptied key, not just the listener: every RPC call mints its
43
- // own `message-<nanoid>` status channel (WebWorkerHandle.call), so a
44
- // retained empty array is one dead Map entry per call for the life of the
45
- // page — six figures of them in a long session
44
+ // drop the emptied key, not just the listener: every reporting call
45
+ // mints its own status channel (WebWorkerHandle.call), so a retained
46
+ // empty array is one dead Map entry per call for the life of the page
46
47
  if (listeners.length === 0) {
47
48
  this.events.delete(event);
48
49
  }
@@ -90,6 +91,7 @@ export default class RpcClient {
90
91
  // never arrive, so reject it here instead of leaving the caller's promise (and
91
92
  // everything its continuation holds) unsettled forever
92
93
  destroy() {
94
+ this.destroyed = true;
93
95
  this.rejectAllPending(new Error('RPC worker was terminated'));
94
96
  this.events.clear();
95
97
  }
@@ -125,28 +127,61 @@ export default class RpcClient {
125
127
  }
126
128
  }
127
129
  /**
128
- * Tell this worker that a stop token has been stopped, so the calls running
129
- * there see it at their next await boundary and drop their in-flight reads.
130
- * Fire-and-forget: it settles no pending call, and a worker holding nothing
131
- * under that id ignores it.
130
+ * Abort the call `uid`, so the signal it runs under in the worker aborts.
131
+ * Fire-and-forget: it settles no pending call, and a worker no longer running
132
+ * that call ignores it.
132
133
  */
133
- notifyStopToken(id) {
134
- this.worker.postMessage({ stopToken: id, libRpc: true });
134
+ abort(uid) {
135
+ this.worker.postMessage({ abort: uid, libRpc: true });
135
136
  }
136
- // No transfer list: transferables flow only worker → main, in a reply's
137
- // rpcResult wrapper. Transferring an argument would neuter the main thread's
138
- // own buffer — this took an option for one and nothing ever passed it.
139
- call(method, data) {
137
+ /**
138
+ * No transfer list: transferables flow only worker → main, in a reply's
139
+ * rpcResult wrapper. Transferring an argument would neuter the main thread's
140
+ * own buffer — this took an option for one and nothing ever passed it.
141
+ *
142
+ * With a `signal`, the worker runs the method under a signal of its own and
143
+ * aborts it when this one aborts. The uid is the call's identity on both
144
+ * sides, so the abort frame needs nothing else; the listener is attached
145
+ * before the call frame is posted and removed when the call settles, so an
146
+ * abort in between reaches a worker still running the call, and one after
147
+ * reaches nothing.
148
+ */
149
+ call(method, data, signal) {
140
150
  const uid = String(++this.counter);
141
151
  return new Promise((resolve, reject) => {
142
- this.pending.set(uid, { resolve, reject });
152
+ if (this.destroyed) {
153
+ reject(new Error('RPC worker was terminated'));
154
+ return;
155
+ }
156
+ if (signal?.aborted) {
157
+ reject(makeAbortError());
158
+ return;
159
+ }
160
+ const onAbort = () => {
161
+ this.abort(uid);
162
+ };
163
+ signal?.addEventListener('abort', onAbort, { once: true });
164
+ const detach = () => {
165
+ signal?.removeEventListener('abort', onAbort);
166
+ };
167
+ this.pending.set(uid, {
168
+ resolve: value => {
169
+ detach();
170
+ resolve(value);
171
+ },
172
+ reject: error => {
173
+ detach();
174
+ reject(error);
175
+ },
176
+ });
143
177
  try {
144
- this.worker.postMessage({ method, uid, data, libRpc: true }, []);
178
+ this.worker.postMessage({ method, uid, data, libRpc: true, abortable: signal !== undefined }, []);
145
179
  }
146
180
  catch (e) {
147
181
  // a non-cloneable payload throws here, which rejects this promise; drop
148
182
  // the entry that is now waiting on a reply the worker never received
149
183
  this.pending.delete(uid);
184
+ detach();
150
185
  throw e;
151
186
  }
152
187
  });
@@ -9,18 +9,16 @@ export interface RpcManagerOptions {
9
9
  export default class RpcManager {
10
10
  static configSchema: import("../configuration/configurationSchema.ts").ConfigurationSchemaType<{
11
11
  readonly defaultDriver: {
12
- readonly type: "string";
13
- readonly description: "the RPC driver to run data fetching on: MainThreadRpcDriver or WebWorkerRpcDriver. Leave empty to use the default for this application";
14
- readonly defaultValue: "";
15
- readonly advanced: true;
12
+ type: "string";
13
+ } & {
14
+ defaultValue: string;
16
15
  };
17
16
  readonly workerCount: {
18
- readonly type: "number";
19
- readonly description: "The number of workers to use. If 0 (the default) JBrowse will decide how many workers to use.";
20
- readonly defaultValue: 0;
21
- readonly advanced: true;
17
+ type: "number";
18
+ } & {
19
+ defaultValue: number;
22
20
  };
23
- }, import("../configuration/configurationSchema.ts").ConfigurationSchemaOptions<undefined, undefined>>;
21
+ }, import("../configuration/configurationSchema.ts").ConfigurationSchemaOptions<undefined, undefined, undefined, import("../configuration/requirements.ts").ConfigurationSchemaRequirement<Partial<Record<string, string[]>>, string>, any>>;
24
22
  private pluginManager;
25
23
  private mainConfiguration;
26
24
  private hostDriverName;
@@ -60,7 +58,7 @@ export default class RpcManager {
60
58
  private makeDriver;
61
59
  /**
62
60
  * `args` carries the method's data and the caller's handles on the operation —
63
- * the stop token and the status callback. Both handles are always accepted,
61
+ * the signal and the status callback. Both handles are always accepted,
64
62
  * for every method, because {@link RpcHandles} is part of `RpcCallArgs` rather
65
63
  * than of any registry entry.
66
64
  *
@@ -121,4 +119,10 @@ export default class RpcManager {
121
119
  * second driver and a second pool that nothing will ever destroy. ADR-086.
122
120
  */
123
121
  destroy(): void;
122
+ /**
123
+ * Build the driver and let it start what the first call would wait for — a
124
+ * web worker's bundle and runtime plugins — while the host is still building
125
+ * its session.
126
+ */
127
+ warmUp(): void;
124
128
  }
@@ -82,7 +82,7 @@ export default class RpcManager {
82
82
  }
83
83
  /**
84
84
  * `args` carries the method's data and the caller's handles on the operation —
85
- * the stop token and the status callback. Both handles are always accepted,
85
+ * the signal and the status callback. Both handles are always accepted,
86
86
  * for every method, because {@link RpcHandles} is part of `RpcCallArgs` rather
87
87
  * than of any registry entry.
88
88
  *
@@ -187,4 +187,14 @@ export default class RpcManager {
187
187
  this.driver?.destroy();
188
188
  this.driver = undefined;
189
189
  }
190
+ /**
191
+ * Build the driver and let it start what the first call would wait for — a
192
+ * web worker's bundle and runtime plugins — while the host is still building
193
+ * its session.
194
+ */
195
+ warmUp() {
196
+ if (!this.destroyed) {
197
+ this.getDriver().warmUp();
198
+ }
199
+ }
190
200
  }
@@ -1,10 +1,11 @@
1
+ import type { FeatureDensity } from '../data_adapters/BaseAdapter/featureDensity.ts';
2
+ import type { CoreGetEncodedLayersArgs, EncodedLayersResult } from '../util/markEncodingTypes.ts';
1
3
  import type { StatusCallback } from '../util/progress.ts';
2
4
  import type { UnwrapRpcResult } from '../util/rpc.ts';
3
5
  import type { Feature, SimpleFeatureSerialized } from '../util/simpleFeature.ts';
4
- import type { StopToken } from '../util/stopToken.ts';
5
6
  import type { NoAssemblyRegion } from '../util/types/data.ts';
6
7
  import type { RpcResult } from './RpcServer.ts';
7
- import type { ByteEstimateScope } from './byteBudget.ts';
8
+ import type { ByteEstimateScope, RegionTooLargeResult } from './byteBudget.ts';
8
9
  export interface RegionLike {
9
10
  refName: string;
10
11
  start: number;
@@ -15,8 +16,8 @@ export interface RpcRegistry {
15
16
  CoreGetRefNames: {
16
17
  args: {
17
18
  adapterConfig: Record<string, unknown>;
18
- sequenceAdapter?: Record<string, unknown>;
19
19
  assemblyName?: string;
20
+ haplotypes?: string[];
20
21
  };
21
22
  return: string[];
22
23
  };
@@ -37,12 +38,23 @@ export interface RpcRegistry {
37
38
  args: {
38
39
  regions: RegionLike[];
39
40
  adapterConfig: Record<string, unknown>;
40
- sequenceAdapter?: Record<string, unknown>;
41
41
  opts?: Record<string, unknown>;
42
42
  };
43
43
  return: Feature[];
44
44
  wire: SimpleFeatureSerialized[];
45
45
  };
46
+ CoreGetEncodedLayers: {
47
+ args: CoreGetEncodedLayersArgs;
48
+ return: EncodedLayersResult | RegionTooLargeResult;
49
+ transferables: EncodedLayersResult;
50
+ };
51
+ CoreGetEncodedFeature: {
52
+ args: Omit<CoreGetEncodedLayersArgs, 'byteLimit'> & {
53
+ layer: number;
54
+ featureIndex: number;
55
+ };
56
+ return: SimpleFeatureSerialized | undefined;
57
+ };
46
58
  CoreGetRegionByteEstimate: {
47
59
  args: {
48
60
  adapterConfig: Record<string, unknown>;
@@ -52,9 +64,20 @@ export interface RpcRegistry {
52
64
  };
53
65
  return: number | undefined;
54
66
  };
67
+ CoreGetFeatureDensity: {
68
+ args: {
69
+ adapterConfig: Record<string, unknown>;
70
+ regions: RegionLike[];
71
+ bpPerPx: number;
72
+ headers?: Record<string, string>;
73
+ };
74
+ return: FeatureDensity[] | undefined;
75
+ };
55
76
  CoreGetInfo: {
56
77
  args: {
57
78
  adapterConfig: Record<string, unknown>;
79
+ haplotypes?: string[];
80
+ assemblyName?: string;
58
81
  };
59
82
  return: unknown;
60
83
  };
@@ -77,6 +100,12 @@ export interface RpcRegistry {
77
100
  args: Record<string, unknown>;
78
101
  return: void;
79
102
  };
103
+ CoreLoadAdapterCode: {
104
+ args: {
105
+ adapterTypes: string[];
106
+ };
107
+ return: void;
108
+ };
80
109
  }
81
110
  export type RpcMethodName = keyof RpcRegistry;
82
111
  export type RpcArgs<M extends RpcMethodName> = RpcRegistry[M]['args'];
@@ -104,12 +133,15 @@ export type RpcReturn<M extends RpcMethodName> = RpcRegistry[M]['return'];
104
133
  * the pattern the type exists to support.
105
134
  */
106
135
  export type RpcHandles = {
107
- stopToken?: StopToken;
136
+ signal?: AbortSignal;
108
137
  statusCallback?: StatusCallback;
109
138
  };
110
139
  export type RpcSession = {
111
140
  sessionId: string;
112
141
  };
142
+ export type RpcReference = {
143
+ sequenceAdapter?: Record<string, unknown>;
144
+ };
113
145
  export type RpcCallContext = RpcSession & RpcHandles;
114
146
  /**
115
147
  * What {@link RpcExecuteArgs} and {@link RpcWireReturn} resolve to for a method
@@ -136,7 +168,8 @@ export interface NotInRpcRegistry<M extends string> {
136
168
  }
137
169
  /**
138
170
  * What a registered method's `execute` actually receives: its declared args,
139
- * plus the session it is pinned to, plus the handles the driver merged in.
171
+ * plus the session it is pinned to, the handles the driver merged in and the
172
+ * reference renaming added.
140
173
  *
141
174
  * Derived rather than hand-written, for the reason {@link RpcWireReturn} is:
142
175
  * the return type has been checked against the registry for a while and the
@@ -144,7 +177,7 @@ export interface NotInRpcRegistry<M extends string> {
144
177
  * parameterized with its own name (`RpcMethodType<'CoreGetSequence'>`) gets
145
178
  * both ends checked.
146
179
  */
147
- export type RpcExecuteArgs<M extends string> = M extends RpcMethodName ? RpcArgs<M & RpcMethodName> & RpcCallContext : string extends M ? unknown : NotInRpcRegistry<M>;
180
+ export type RpcExecuteArgs<M extends string> = M extends RpcMethodName ? RpcArgs<M & RpcMethodName> & RpcCallContext & RpcReference : string extends M ? unknown : NotInRpcRegistry<M>;
148
181
  /**
149
182
  * What a CALLER passes to `rpcManager.call`: the method's own data, plus the
150
183
  * {@link RpcHandles} every method takes. No {@link RpcSession} — that one is
@@ -12,11 +12,13 @@ interface RpcMessageData {
12
12
  uid: string;
13
13
  libRpc?: true;
14
14
  data: unknown;
15
- stopToken?: string;
15
+ abortable?: boolean;
16
+ abort?: string;
16
17
  }
17
18
  export default class RpcServer {
18
19
  protected methods: Record<string, Procedure>;
19
20
  private self;
21
+ private aborters;
20
22
  constructor(methods: Record<string, Procedure>);
21
23
  handler(e: MessageEvent<RpcMessageData>): void;
22
24
  private post;
@@ -1,5 +1,4 @@
1
1
  import { isRpcResult } from '../util/rpc.js';
2
- import { markStopTokenStopped } from '../util/stopToken.js';
3
2
  import { bufferPaths, containerEntries, explainTransferError, } from './explainTransferError.js';
4
3
  import { serializeError } from './serializeError/index.js';
5
4
  // `self` is a DedicatedWorkerGlobalScope in the worker, but the DOM lib types the
@@ -126,6 +125,7 @@ export function rpcResultWithArrayBuffers(value) {
126
125
  export default class RpcServer {
127
126
  methods;
128
127
  self;
128
+ aborters = new Map();
129
129
  constructor(methods) {
130
130
  if (!workerSelf) {
131
131
  throw new Error('RpcServer must be constructed in a worker global scope');
@@ -143,31 +143,38 @@ export default class RpcServer {
143
143
  });
144
144
  }
145
145
  handler(e) {
146
- const { libRpc, method, uid, data, stopToken } = e.data;
146
+ const { libRpc, method, uid, data, abort, abortable } = e.data;
147
147
  if (!libRpc) {
148
148
  return;
149
149
  }
150
- if (stopToken !== undefined) {
151
- // Every in-flight method holding this token now sees it as stopped at its
152
- // next await boundary, and any AbortSignal taken against it aborts, so a
153
- // canceled read drops off the socket. Handled ahead of the method lookup:
154
- // this frame has no method name and would otherwise land in the unknown
155
- // method branch with no uid to reply to.
156
- markStopTokenStopped(stopToken);
150
+ if (abort !== undefined) {
151
+ // Handled ahead of the method lookup: this frame has no method name and
152
+ // would otherwise land in the unknown method branch with no uid to reply
153
+ // to. A call that already settled left no controller, so a late abort is
154
+ // a no-op.
155
+ this.aborters.get(abort)?.abort();
157
156
  return;
158
157
  }
159
158
  const methodFn = Object.hasOwn(this.methods, method)
160
159
  ? this.methods[method]
161
160
  : undefined;
162
161
  if (methodFn) {
163
- // wrap so a synchronous throw inside methodFn still routes to .throw()
164
- ;
165
- (async () => methodFn(data))()
162
+ const controller = abortable ? new AbortController() : undefined;
163
+ if (controller) {
164
+ this.aborters.set(uid, controller);
165
+ }
166
+ const args = controller
167
+ ? { ...data, signal: controller.signal }
168
+ : data;
169
+ (async () => methodFn(args))()
166
170
  .then(response => {
167
171
  this.reply(uid, response, method);
168
172
  })
169
173
  .catch((error) => {
170
174
  this.throw(uid, serializeError(error));
175
+ })
176
+ .finally(() => {
177
+ this.aborters.delete(uid);
171
178
  });
172
179
  }
173
180
  else {
@@ -4,14 +4,15 @@ import type { AnyConfigurationModel } from '../configuration/index.ts';
4
4
  import type RpcMethodType from '../pluggableElementTypes/RpcMethodType.ts';
5
5
  import type { PluginDefinition } from '../pluginDefinitions.ts';
6
6
  import type { StatusCallback } from '../util/progress.ts';
7
+ import type { RpcHandles } from './RpcRegistry.ts';
7
8
  export interface WorkerHandle {
8
9
  destroy(): void;
9
10
  onError?(callback: () => void): void;
10
- notifyStopToken?(id: string): void;
11
11
  on?(eventName: string, listener: (data: unknown) => void): void;
12
12
  postMessage?(message: unknown): void;
13
13
  call(functionName: string, args?: unknown, options?: {
14
14
  statusCallback?: StatusCallback;
15
+ signal?: AbortSignal;
15
16
  }): Promise<unknown>;
16
17
  }
17
18
  declare module '@jbrowse/core/PluginManager' {
@@ -43,7 +44,6 @@ export default class WebWorkerRpcDriver extends BaseRpcDriver {
43
44
  private lastWorkerAssignment;
44
45
  private workerAssignments;
45
46
  private workerPool?;
46
- private unregisterBroadcaster;
47
47
  private destroyed;
48
48
  constructor(pluginManager: PluginManager, config: AnyConfigurationModel, options: WebWorkerRpcDriverOptions);
49
49
  /**
@@ -57,6 +57,12 @@ export default class WebWorkerRpcDriver extends BaseRpcDriver {
57
57
  destroy(): void;
58
58
  private createWorkerPool;
59
59
  private getWorkerPool;
60
+ /**
61
+ * Boot the first worker now rather than on the first call, so its bundle and
62
+ * runtime plugins load while the page builds the session. The first session
63
+ * is assigned to that worker.
64
+ */
65
+ warmUp(): void;
60
66
  getWorker(sessionId: string): Promise<WorkerHandle>;
61
67
  /**
62
68
  * Hand a freshly booted worker to whatever plugins want to extend it, and use
@@ -68,11 +74,12 @@ export default class WebWorkerRpcDriver extends BaseRpcDriver {
68
74
  * call", so folding at dispatch needed a WeakMap to stop rebuilding a
69
75
  * plugin's wrapper per RPC; once per boot has nothing to memoize.
70
76
  */
77
+ extendsWorkers(): boolean;
71
78
  extendWorker(worker: WorkerHandle): WorkerHandle;
72
- protected transport(sessionId: string, rpcMethod: RpcMethodType, serializedArgs: Record<string, unknown>, statusCallback: StatusCallback | undefined): Promise<unknown>;
79
+ protected transport(sessionId: string, rpcMethod: RpcMethodType, serializedArgs: Record<string, unknown>, handles: RpcHandles): Promise<unknown>;
73
80
  /**
74
81
  * Boot one worker and run the configuration handshake. Overridable so a test
75
82
  * can hand the pool a fake handle without a `Worker`; nothing in the app does.
76
83
  */
77
- makeWorker(): Promise<WorkerHandle>;
84
+ makeWorker(onHandle?: (handle: WorkerHandle) => void): Promise<WorkerHandle>;
78
85
  }
@@ -1,6 +1,5 @@
1
1
  import { readConfObject } from '../configuration/index.js';
2
2
  import { clamp } from '../util/index.js';
3
- import { registerStopTokenBroadcaster } from '../util/stopToken.js';
4
3
  import BaseRpcDriver, { CORE_FREE_RESOURCES } from './BaseRpcDriver.js';
5
4
  import RpcClient from './RpcClient.js';
6
5
  import { deserializeError } from './serializeError/index.js';
@@ -36,9 +35,6 @@ class WebWorkerHandle {
36
35
  onError(callback) {
37
36
  this.client.on('error', callback);
38
37
  }
39
- notifyStopToken(id) {
40
- this.client.notifyStopToken(id);
41
- }
42
38
  // the two halves of {@link WorkerHandle}'s plugin-facing pair
43
39
  on(eventName, listener) {
44
40
  this.client.on(eventName, listener);
@@ -73,9 +69,9 @@ class WebWorkerHandle {
73
69
  // `Core-extendWorker` wrapper written against that interface may well call
74
70
  // `worker.call(name, args)` — which destructured `undefined` and threw
75
71
  opts = {}) {
76
- const { statusCallback } = opts;
72
+ const { statusCallback, signal } = opts;
77
73
  if (!statusCallback) {
78
- return this.client.call(funcName, args);
74
+ return this.client.call(funcName, args, signal);
79
75
  }
80
76
  const channel = `message-${++this.channelCount}`;
81
77
  // RpcClient is a generic event emitter (it also carries 'error' events), so
@@ -87,8 +83,7 @@ class WebWorkerHandle {
87
83
  };
88
84
  this.client.on(channel, listener);
89
85
  try {
90
- const result = await this.client.call(funcName, { ...args, channel });
91
- return result;
86
+ return await this.client.call(funcName, { ...args, channel }, signal);
92
87
  }
93
88
  finally {
94
89
  this.client.off(channel, listener);
@@ -115,11 +110,21 @@ class LazyWorker {
115
110
  }
116
111
  async getWorker() {
117
112
  if (!this.workerP) {
118
- const booted = this.driver.makeWorker();
113
+ let early;
114
+ const booted = this.driver.makeWorker(handle => {
115
+ early = handle;
116
+ });
119
117
  this.bootP = booted;
120
- // once per booted worker by construction, rather than per dispatch behind
121
- // a memo
122
- this.workerP = booted.then(worker => this.driver.extendWorker(worker));
118
+ // A booting worker holds the calls it is sent, so with nothing to extend
119
+ // them a call goes out now rather than when the page gets round to the
120
+ // worker's 'ready'. A boot that fails rejects those calls with the
121
+ // handle. An extended worker is extended once booted, as promised.
122
+ this.workerP =
123
+ early && !this.driver.extendsWorkers()
124
+ ? Promise.resolve(early)
125
+ : // once per booted worker by construction, rather than per dispatch
126
+ // behind a memo
127
+ booted.then(worker => this.driver.extendWorker(worker));
123
128
  // drop this slot so the next getWorker re-boots, whether the boot failed
124
129
  // or the booted worker later died (a dead worker never replies)
125
130
  const invalidate = () => {
@@ -151,24 +156,9 @@ class LazyWorker {
151
156
  this.workerP = undefined;
152
157
  }
153
158
  /**
154
- * Forward a stopped token id, but never boot a worker to do it: an unbooted
155
- * slot is running nothing to cancel. Routed through the same promise the
156
- * dispatching call awaits, so a stop issued while this slot is still booting
157
- * still lands after the call it means to cancel rather than ahead of the
158
- * worker's message listener existing.
159
- */
160
- notifyStopToken(id) {
161
- this.bootP
162
- ?.then(worker => {
163
- worker.notifyStopToken?.(id);
164
- })
165
- .catch(() => { });
166
- }
167
- /**
168
- * Drop a session's cached adapters on this slot's worker — and, like
169
- * {@link notifyStopToken}, never boot one to do it. A slot that never booted
170
- * has no cache to free, and booting one there costs a whole worker bundle and
171
- * every runtime plugin to say so.
159
+ * Drop a session's cached adapters on this slot's worker, and never boot one
160
+ * to do it. A slot that never booted has no cache to free, and booting one
161
+ * there costs a whole worker bundle and every runtime plugin to say so.
172
162
  *
173
163
  * Through the extended handle, because it is a `call`: a plugin that wraps
174
164
  * calls should see this one.
@@ -197,17 +187,6 @@ export default class WebWorkerRpcDriver extends BaseRpcDriver {
197
187
  // sessionId -> worker number
198
188
  workerAssignments = new Map();
199
189
  workerPool;
200
- // a stopped token has to reach the thread actually running the work, and this
201
- // is the seam that carries it. Broadcast rather than routed per call: one
202
- // token is commonly in flight on several calls at once, and a worker holding
203
- // nothing under that id ignores the frame.
204
- //
205
- // Registered with the POOL, not in the constructor, so that a driver which
206
- // never boots a worker stays out of the module-global broadcaster set — and
207
- // registered only once the pool exists to receive the broadcast, since a
208
- // `createWorkerPool` that threw after registering left an entry no `destroy`
209
- // could ever reach.
210
- unregisterBroadcaster = () => { };
211
190
  // `destroy` is terminal: `getWorkerPool` refuses rather than letting its `??=`
212
191
  // build a second pool for a driver whose teardown already ran. ADR-086.
213
192
  destroyed = false;
@@ -233,7 +212,6 @@ export default class WebWorkerRpcDriver extends BaseRpcDriver {
233
212
  // discarding the driver so its worker threads don't outlive it
234
213
  destroy() {
235
214
  this.destroyed = true;
236
- this.unregisterBroadcaster();
237
215
  for (const worker of this.workerPool ?? []) {
238
216
  worker.destroy();
239
217
  }
@@ -245,13 +223,7 @@ export default class WebWorkerRpcDriver extends BaseRpcDriver {
245
223
  // workerCount 0 (the config default) means "decide from hardware"
246
224
  const workerCount = readConfObject(this.config, 'workerCount') ||
247
225
  clamp(detectHardwareConcurrency() - 1, 1, 5);
248
- const pool = Array.from({ length: workerCount }, () => new LazyWorker(this));
249
- this.unregisterBroadcaster = registerStopTokenBroadcaster(id => {
250
- for (const worker of pool) {
251
- worker.notifyStopToken(id);
252
- }
253
- });
254
- return pool;
226
+ return Array.from({ length: workerCount }, () => new LazyWorker(this));
255
227
  }
256
228
  getWorkerPool() {
257
229
  if (this.destroyed) {
@@ -259,6 +231,18 @@ export default class WebWorkerRpcDriver extends BaseRpcDriver {
259
231
  }
260
232
  return (this.workerPool ??= this.createWorkerPool());
261
233
  }
234
+ /**
235
+ * Boot the first worker now rather than on the first call, so its bundle and
236
+ * runtime plugins load while the page builds the session. The first session
237
+ * is assigned to that worker.
238
+ */
239
+ warmUp() {
240
+ if (!this.destroyed) {
241
+ this.getWorkerPool()[0]
242
+ ?.getWorker()
243
+ .catch(() => { });
244
+ }
245
+ }
262
246
  async getWorker(sessionId) {
263
247
  const workers = this.getWorkerPool();
264
248
  let workerNumber = this.workerAssignments.get(sessionId);
@@ -279,21 +263,24 @@ export default class WebWorkerRpcDriver extends BaseRpcDriver {
279
263
  * call", so folding at dispatch needed a WeakMap to stop rebuilding a
280
264
  * plugin's wrapper per RPC; once per boot has nothing to memoize.
281
265
  */
266
+ extendsWorkers() {
267
+ return (this.pluginManager.extensionPointCallbackCount('Core-extendWorker') > 0);
268
+ }
282
269
  extendWorker(worker) {
283
270
  return this.pluginManager.evaluateExtensionPoint(
284
271
  /** #extensionPoint Core-extendWorker | sync | Take a booted RPC web worker: subscribe to the events it emits, post to it, or wrap its `call`. Fired once per booted worker, not per call */
285
272
  'Core-extendWorker', worker);
286
273
  }
287
274
  // get this session's sticky worker and hand off the already-serialized args
288
- async transport(sessionId, rpcMethod, serializedArgs, statusCallback) {
275
+ async transport(sessionId, rpcMethod, serializedArgs, handles) {
289
276
  const worker = await this.getWorker(sessionId);
290
- return worker.call(rpcMethod.name, serializedArgs, { statusCallback });
277
+ return worker.call(rpcMethod.name, serializedArgs, handles);
291
278
  }
292
279
  /**
293
280
  * Boot one worker and run the configuration handshake. Overridable so a test
294
281
  * can hand the pool a fake handle without a `Worker`; nothing in the app does.
295
282
  */
296
- async makeWorker() {
283
+ async makeWorker(onHandle) {
297
284
  // one RpcClient per worker so we can do our own state-group-aware load
298
285
  // balancing across the pool
299
286
  const instance = this.options.makeWorkerInstance();
@@ -317,6 +304,23 @@ export default class WebWorkerRpcDriver extends BaseRpcDriver {
317
304
  handle.destroy();
318
305
  reject(error);
319
306
  };
307
+ // The worker waits in receiveConfiguration(), which has no timeout, so an
308
+ // unclonable boot configuration has to fail the boot rather than leave
309
+ // both sides waiting.
310
+ const sendConfig = () => {
311
+ try {
312
+ const { plugins, windowHref, numberGrouping } = this.options;
313
+ instance.postMessage({
314
+ message: 'config',
315
+ config: { plugins, windowHref, numberGrouping },
316
+ });
317
+ }
318
+ catch (e) {
319
+ fail(new Error(`could not send the worker its boot configuration`, {
320
+ cause: e,
321
+ }));
322
+ }
323
+ };
320
324
  const onMessage = (e) => {
321
325
  switch (e.data.message) {
322
326
  case 'ready': {
@@ -325,22 +329,7 @@ export default class WebWorkerRpcDriver extends BaseRpcDriver {
325
329
  break;
326
330
  }
327
331
  case 'readyForConfig': {
328
- // The worker is waiting in receiveConfiguration(), which has no
329
- // timeout, and this listener's throw would escape before cleanup or
330
- // fail could run — so an unclonable boot configuration left both
331
- // sides waiting forever rather than reporting anything.
332
- try {
333
- const { plugins, windowHref, numberGrouping } = this.options;
334
- instance.postMessage({
335
- message: 'config',
336
- config: { plugins, windowHref, numberGrouping },
337
- });
338
- }
339
- catch (e) {
340
- fail(new Error(`could not send the worker its boot configuration`, {
341
- cause: e,
342
- }));
343
- }
332
+ sendConfig();
344
333
  break;
345
334
  }
346
335
  case 'error': {
@@ -357,6 +346,13 @@ export default class WebWorkerRpcDriver extends BaseRpcDriver {
357
346
  };
358
347
  instance.addEventListener('message', onMessage);
359
348
  instance.addEventListener('error', onError);
349
+ // A dedicated worker holds what it is sent until its script has run, and
350
+ // receiveConfiguration listens from that run, so the config can go now,
351
+ // and a worker created before this driver needs no readyForConfig. It is
352
+ // sent again on readyForConfig for a worker whose startup awaits chunks
353
+ // and so would drop this one; the worker keeps the first.
354
+ sendConfig();
355
+ onHandle?.(handle);
360
356
  });
361
357
  }
362
358
  }