@pierre/diffs 1.0.10 → 1.1.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 (341) hide show
  1. package/dist/components/AdvancedVirtualizedFileDiff.d.ts +40 -0
  2. package/dist/components/AdvancedVirtualizedFileDiff.d.ts.map +1 -0
  3. package/dist/components/AdvancedVirtualizedFileDiff.js +145 -0
  4. package/dist/components/AdvancedVirtualizedFileDiff.js.map +1 -0
  5. package/dist/components/AdvancedVirtualizer.d.ts +38 -0
  6. package/dist/components/AdvancedVirtualizer.d.ts.map +1 -0
  7. package/dist/components/AdvancedVirtualizer.js +201 -0
  8. package/dist/components/AdvancedVirtualizer.js.map +1 -0
  9. package/dist/components/File.d.ts +59 -32
  10. package/dist/components/File.d.ts.map +1 -1
  11. package/dist/components/File.js +297 -53
  12. package/dist/components/File.js.map +1 -1
  13. package/dist/components/FileDiff.d.ts +87 -39
  14. package/dist/components/FileDiff.d.ts.map +1 -1
  15. package/dist/components/FileDiff.js +687 -109
  16. package/dist/components/FileDiff.js.map +1 -1
  17. package/dist/components/FileStream.d.ts +6 -0
  18. package/dist/components/FileStream.d.ts.map +1 -1
  19. package/dist/components/FileStream.js +74 -12
  20. package/dist/components/FileStream.js.map +1 -1
  21. package/dist/components/VirtualizedFile.d.ts +33 -0
  22. package/dist/components/VirtualizedFile.d.ts.map +1 -0
  23. package/dist/components/VirtualizedFile.js +227 -0
  24. package/dist/components/VirtualizedFile.js.map +1 -0
  25. package/dist/components/VirtualizedFileDiff.d.ts +39 -0
  26. package/dist/components/VirtualizedFileDiff.d.ts.map +1 -0
  27. package/dist/components/VirtualizedFileDiff.js +316 -0
  28. package/dist/components/VirtualizedFileDiff.js.map +1 -0
  29. package/dist/components/Virtualizer.d.ts +63 -0
  30. package/dist/components/Virtualizer.d.ts.map +1 -0
  31. package/dist/components/Virtualizer.js +369 -0
  32. package/dist/components/Virtualizer.js.map +1 -0
  33. package/dist/components/VirtulizerDevelopment.d.ts +14 -0
  34. package/dist/components/VirtulizerDevelopment.d.ts.map +1 -0
  35. package/dist/components/web-components.d.ts +1 -1
  36. package/dist/components/web-components.d.ts.map +1 -1
  37. package/dist/constants.d.ts +7 -3
  38. package/dist/constants.d.ts.map +1 -1
  39. package/dist/constants.js +20 -2
  40. package/dist/constants.js.map +1 -1
  41. package/dist/highlighter/languages/areLanguagesAttached.d.ts.map +1 -1
  42. package/dist/highlighter/languages/attachResolvedLanguages.d.ts.map +1 -1
  43. package/dist/highlighter/languages/cleanUpResolvedLanguages.d.ts.map +1 -1
  44. package/dist/highlighter/languages/constants.d.ts +3 -1
  45. package/dist/highlighter/languages/constants.d.ts.map +1 -1
  46. package/dist/highlighter/languages/constants.js +2 -1
  47. package/dist/highlighter/languages/constants.js.map +1 -1
  48. package/dist/highlighter/languages/getResolvedLanguages.d.ts.map +1 -1
  49. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts +1 -1
  50. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts.map +1 -1
  51. package/dist/highlighter/languages/hasResolvedLanguages.d.ts.map +1 -1
  52. package/dist/highlighter/languages/registerCustomLanguage.d.ts +19 -0
  53. package/dist/highlighter/languages/registerCustomLanguage.d.ts.map +1 -0
  54. package/dist/highlighter/languages/registerCustomLanguage.js +21 -0
  55. package/dist/highlighter/languages/registerCustomLanguage.js.map +1 -0
  56. package/dist/highlighter/languages/resolveLanguage.d.ts +1 -1
  57. package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -1
  58. package/dist/highlighter/languages/resolveLanguage.js +4 -3
  59. package/dist/highlighter/languages/resolveLanguage.js.map +1 -1
  60. package/dist/highlighter/languages/resolveLanguages.d.ts.map +1 -1
  61. package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
  62. package/dist/highlighter/shared_highlighter.js.map +1 -1
  63. package/dist/highlighter/themes/areThemesAttached.d.ts.map +1 -1
  64. package/dist/highlighter/themes/attachResolvedThemes.d.ts.map +1 -1
  65. package/dist/highlighter/themes/cleanUpResolvedThemes.d.ts.map +1 -1
  66. package/dist/highlighter/themes/constants.d.ts.map +1 -1
  67. package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts.map +1 -1
  68. package/dist/highlighter/themes/getResolvedThemes.d.ts.map +1 -1
  69. package/dist/highlighter/themes/hasResolvedThemes.d.ts.map +1 -1
  70. package/dist/highlighter/themes/registerCustomCSSVariableTheme.d.ts.map +1 -1
  71. package/dist/highlighter/themes/registerCustomTheme.d.ts.map +1 -1
  72. package/dist/highlighter/themes/resolveTheme.d.ts.map +1 -1
  73. package/dist/highlighter/themes/resolveThemes.d.ts.map +1 -1
  74. package/dist/index.d.ts +27 -13
  75. package/dist/index.js +22 -8
  76. package/dist/managers/LineSelectionManager.d.ts +14 -15
  77. package/dist/managers/LineSelectionManager.d.ts.map +1 -1
  78. package/dist/managers/LineSelectionManager.js +66 -78
  79. package/dist/managers/LineSelectionManager.js.map +1 -1
  80. package/dist/managers/MouseEventManager.d.ts +13 -6
  81. package/dist/managers/MouseEventManager.d.ts.map +1 -1
  82. package/dist/managers/MouseEventManager.js +161 -47
  83. package/dist/managers/MouseEventManager.js.map +1 -1
  84. package/dist/managers/ResizeManager.d.ts +6 -1
  85. package/dist/managers/ResizeManager.d.ts.map +1 -1
  86. package/dist/managers/ResizeManager.js +114 -64
  87. package/dist/managers/ResizeManager.js.map +1 -1
  88. package/dist/managers/ScrollSyncManager.d.ts.map +1 -1
  89. package/dist/managers/UniversalRenderingManager.d.ts.map +1 -1
  90. package/dist/react/File.d.ts +1 -0
  91. package/dist/react/File.d.ts.map +1 -1
  92. package/dist/react/File.js +2 -1
  93. package/dist/react/File.js.map +1 -1
  94. package/dist/react/FileDiff.d.ts +1 -0
  95. package/dist/react/FileDiff.d.ts.map +1 -1
  96. package/dist/react/FileDiff.js +2 -1
  97. package/dist/react/FileDiff.js.map +1 -1
  98. package/dist/react/MultiFileDiff.d.ts +1 -0
  99. package/dist/react/MultiFileDiff.d.ts.map +1 -1
  100. package/dist/react/MultiFileDiff.js +4 -3
  101. package/dist/react/MultiFileDiff.js.map +1 -1
  102. package/dist/react/PatchDiff.d.ts +1 -0
  103. package/dist/react/PatchDiff.d.ts.map +1 -1
  104. package/dist/react/PatchDiff.js +3 -2
  105. package/dist/react/PatchDiff.js.map +1 -1
  106. package/dist/react/Virtualizer.d.ts +25 -0
  107. package/dist/react/Virtualizer.d.ts.map +1 -0
  108. package/dist/react/Virtualizer.js +38 -0
  109. package/dist/react/Virtualizer.js.map +1 -0
  110. package/dist/react/WorkerPoolContext.d.ts.map +1 -1
  111. package/dist/react/WorkerPoolContext.js +1 -1
  112. package/dist/react/WorkerPoolContext.js.map +1 -1
  113. package/dist/react/constants.d.ts.map +1 -1
  114. package/dist/react/index.d.ts +3 -2
  115. package/dist/react/index.js +2 -1
  116. package/dist/react/jsx.d.ts.map +1 -1
  117. package/dist/react/types.d.ts +5 -3
  118. package/dist/react/types.d.ts.map +1 -1
  119. package/dist/react/utils/renderDiffChildren.d.ts +9 -9
  120. package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
  121. package/dist/react/utils/renderDiffChildren.js +3 -3
  122. package/dist/react/utils/renderDiffChildren.js.map +1 -1
  123. package/dist/react/utils/renderFileChildren.d.ts +5 -5
  124. package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
  125. package/dist/react/utils/templateRender.d.ts.map +1 -1
  126. package/dist/react/utils/useFileDiffInstance.d.ts +5 -3
  127. package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
  128. package/dist/react/utils/useFileDiffInstance.js +6 -2
  129. package/dist/react/utils/useFileDiffInstance.js.map +1 -1
  130. package/dist/react/utils/useFileInstance.d.ts +5 -3
  131. package/dist/react/utils/useFileInstance.d.ts.map +1 -1
  132. package/dist/react/utils/useFileInstance.js +6 -2
  133. package/dist/react/utils/useFileInstance.js.map +1 -1
  134. package/dist/react/utils/useStableCallback.d.ts.map +1 -1
  135. package/dist/react/utils/useStableCallback.js.map +1 -1
  136. package/dist/renderers/DiffHunksRenderer.d.ts +21 -15
  137. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  138. package/dist/renderers/DiffHunksRenderer.js +392 -357
  139. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  140. package/dist/renderers/FileRenderer.d.ts +13 -5
  141. package/dist/renderers/FileRenderer.d.ts.map +1 -1
  142. package/dist/renderers/FileRenderer.js +101 -35
  143. package/dist/renderers/FileRenderer.js.map +1 -1
  144. package/dist/shiki-stream/stream.d.ts +2 -2
  145. package/dist/shiki-stream/stream.d.ts.map +1 -1
  146. package/dist/shiki-stream/stream.js.map +1 -1
  147. package/dist/shiki-stream/tokenizer.d.ts +2 -2
  148. package/dist/shiki-stream/tokenizer.d.ts.map +1 -1
  149. package/dist/shiki-stream/tokenizer.js.map +1 -1
  150. package/dist/shiki-stream/types.d.ts +18 -18
  151. package/dist/shiki-stream/types.d.ts.map +1 -1
  152. package/dist/sprite.d.ts +1 -1
  153. package/dist/sprite.d.ts.map +1 -1
  154. package/dist/ssr/FileDiffReact.d.ts.map +1 -1
  155. package/dist/ssr/FileDiffReact.js +1 -1
  156. package/dist/ssr/index.d.ts +2 -2
  157. package/dist/ssr/preloadDiffs.d.ts.map +1 -1
  158. package/dist/ssr/preloadFile.d.ts.map +1 -1
  159. package/dist/ssr/preloadPatchFile.d.ts.map +1 -1
  160. package/dist/ssr/preloadPatchFile.js.map +1 -1
  161. package/dist/ssr/renderHTML.d.ts.map +1 -1
  162. package/dist/style.js +1 -1
  163. package/dist/style.js.map +1 -1
  164. package/dist/types.d.ts +311 -74
  165. package/dist/types.d.ts.map +1 -1
  166. package/dist/utils/areDiffLineAnnotationsEqual.d.ts +7 -0
  167. package/dist/utils/areDiffLineAnnotationsEqual.d.ts.map +1 -0
  168. package/dist/utils/areDiffLineAnnotationsEqual.js +8 -0
  169. package/dist/utils/areDiffLineAnnotationsEqual.js.map +1 -0
  170. package/dist/utils/areFilesEqual.d.ts.map +1 -1
  171. package/dist/utils/areHunkDataEqual.d.ts +7 -0
  172. package/dist/utils/areHunkDataEqual.d.ts.map +1 -0
  173. package/dist/utils/areHunkDataEqual.js +8 -0
  174. package/dist/utils/areHunkDataEqual.js.map +1 -0
  175. package/dist/utils/areLineAnnotationsEqual.d.ts +7 -0
  176. package/dist/utils/areLineAnnotationsEqual.d.ts.map +1 -0
  177. package/dist/utils/areLineAnnotationsEqual.js +8 -0
  178. package/dist/utils/areLineAnnotationsEqual.js.map +1 -0
  179. package/dist/utils/areObjectsEqual.d.ts.map +1 -1
  180. package/dist/utils/areOptionsEqual.d.ts +1 -1
  181. package/dist/utils/areOptionsEqual.d.ts.map +1 -1
  182. package/dist/utils/arePrePropertiesEqual.d.ts +7 -0
  183. package/dist/utils/arePrePropertiesEqual.d.ts.map +1 -0
  184. package/dist/utils/arePrePropertiesEqual.js +9 -0
  185. package/dist/utils/arePrePropertiesEqual.js.map +1 -0
  186. package/dist/utils/areRenderRangesEqual.d.ts +7 -0
  187. package/dist/utils/areRenderRangesEqual.d.ts.map +1 -0
  188. package/dist/utils/areRenderRangesEqual.js +9 -0
  189. package/dist/utils/areRenderRangesEqual.js.map +1 -0
  190. package/dist/utils/areSelectionsEqual.d.ts.map +1 -1
  191. package/dist/utils/areThemesEqual.d.ts.map +1 -1
  192. package/dist/utils/areVirtualWindowSpecsEqual.d.ts +7 -0
  193. package/dist/utils/areVirtualWindowSpecsEqual.d.ts.map +1 -0
  194. package/dist/utils/areVirtualWindowSpecsEqual.js +9 -0
  195. package/dist/utils/areVirtualWindowSpecsEqual.js.map +1 -0
  196. package/dist/utils/areWorkerStatsEqual.d.ts +8 -0
  197. package/dist/utils/areWorkerStatsEqual.d.ts.map +1 -0
  198. package/dist/utils/areWorkerStatsEqual.js +9 -0
  199. package/dist/utils/areWorkerStatsEqual.js.map +1 -0
  200. package/dist/utils/cleanLastNewline.d.ts.map +1 -1
  201. package/dist/utils/createAnnotationElement.d.ts.map +1 -1
  202. package/dist/utils/createAnnotationWrapperNode.d.ts.map +1 -1
  203. package/dist/utils/createContentColumn.d.ts +7 -0
  204. package/dist/utils/createContentColumn.d.ts.map +1 -0
  205. package/dist/utils/createContentColumn.js +17 -0
  206. package/dist/utils/createContentColumn.js.map +1 -0
  207. package/dist/utils/createEmptyRowBuffer.d.ts.map +1 -1
  208. package/dist/utils/createEmptyRowBuffer.js +2 -1
  209. package/dist/utils/createEmptyRowBuffer.js.map +1 -1
  210. package/dist/utils/createFileHeaderElement.d.ts.map +1 -1
  211. package/dist/utils/createHoverContentNode.d.ts.map +1 -1
  212. package/dist/utils/createNoNewlineElement.d.ts +2 -1
  213. package/dist/utils/createNoNewlineElement.d.ts.map +1 -1
  214. package/dist/utils/createNoNewlineElement.js +3 -6
  215. package/dist/utils/createNoNewlineElement.js.map +1 -1
  216. package/dist/utils/createPreElement.d.ts +2 -1
  217. package/dist/utils/createPreElement.d.ts.map +1 -1
  218. package/dist/utils/createPreElement.js +4 -3
  219. package/dist/utils/createPreElement.js.map +1 -1
  220. package/dist/utils/createRowNodes.d.ts.map +1 -1
  221. package/dist/utils/createSeparator.d.ts.map +1 -1
  222. package/dist/utils/createSeparator.js +2 -2
  223. package/dist/utils/createSeparator.js.map +1 -1
  224. package/dist/utils/createSpanNodeFromToken.d.ts.map +1 -1
  225. package/dist/utils/createSpanNodeFromToken.js.map +1 -1
  226. package/dist/utils/createStyleElement.d.ts.map +1 -1
  227. package/dist/utils/createTransformerWithState.d.ts.map +1 -1
  228. package/dist/utils/createTransformerWithState.js +1 -1
  229. package/dist/utils/createTransformerWithState.js.map +1 -1
  230. package/dist/utils/createUnsafeCSSStyleNode.d.ts.map +1 -1
  231. package/dist/utils/createWindowFromScrollPosition.d.ts +22 -0
  232. package/dist/utils/createWindowFromScrollPosition.d.ts.map +1 -0
  233. package/dist/utils/createWindowFromScrollPosition.js +26 -0
  234. package/dist/utils/createWindowFromScrollPosition.js.map +1 -0
  235. package/dist/utils/cssWrappers.d.ts.map +1 -1
  236. package/dist/utils/diffAcceptRejectHunk.d.ts +1 -1
  237. package/dist/utils/diffAcceptRejectHunk.d.ts.map +1 -1
  238. package/dist/utils/diffAcceptRejectHunk.js +36 -21
  239. package/dist/utils/diffAcceptRejectHunk.js.map +1 -1
  240. package/dist/utils/formatCSSVariablePrefix.d.ts +1 -1
  241. package/dist/utils/formatCSSVariablePrefix.d.ts.map +1 -1
  242. package/dist/utils/getFiletypeFromFileName.d.ts +2 -1
  243. package/dist/utils/getFiletypeFromFileName.d.ts.map +1 -1
  244. package/dist/utils/getFiletypeFromFileName.js +14 -4
  245. package/dist/utils/getFiletypeFromFileName.js.map +1 -1
  246. package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
  247. package/dist/utils/getHighlighterThemeStyles.d.ts.map +1 -1
  248. package/dist/utils/getHunkSeparatorSlotName.d.ts +3 -1
  249. package/dist/utils/getHunkSeparatorSlotName.d.ts.map +1 -1
  250. package/dist/utils/getHunkSeparatorSlotName.js.map +1 -1
  251. package/dist/utils/getIconForType.d.ts +1 -1
  252. package/dist/utils/getIconForType.d.ts.map +1 -1
  253. package/dist/utils/getLineAnnotationName.d.ts.map +1 -1
  254. package/dist/utils/getLineEndingType.d.ts +1 -1
  255. package/dist/utils/getLineEndingType.d.ts.map +1 -1
  256. package/dist/utils/getLineNodes.d.ts.map +1 -1
  257. package/dist/utils/getOrCreateCodeNode.d.ts +16 -0
  258. package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -0
  259. package/dist/utils/getOrCreateCodeNode.js +16 -0
  260. package/dist/utils/getOrCreateCodeNode.js.map +1 -0
  261. package/dist/utils/getSingularPatch.d.ts.map +1 -1
  262. package/dist/utils/getThemes.d.ts.map +1 -1
  263. package/dist/utils/getTotalLineCountFromHunks.d.ts.map +1 -1
  264. package/dist/utils/getTotalLineCountFromHunks.js +1 -1
  265. package/dist/utils/getTotalLineCountFromHunks.js.map +1 -1
  266. package/dist/utils/hast_utils.d.ts +6 -2
  267. package/dist/utils/hast_utils.d.ts.map +1 -1
  268. package/dist/utils/hast_utils.js +34 -1
  269. package/dist/utils/hast_utils.js.map +1 -1
  270. package/dist/utils/isDefaultRenderRange.d.ts +7 -0
  271. package/dist/utils/isDefaultRenderRange.d.ts.map +1 -0
  272. package/dist/utils/isDefaultRenderRange.js +8 -0
  273. package/dist/utils/isDefaultRenderRange.js.map +1 -0
  274. package/dist/utils/isWorkerContext.d.ts.map +1 -1
  275. package/dist/utils/iterateOverDiff.d.ts +54 -0
  276. package/dist/utils/iterateOverDiff.d.ts.map +1 -0
  277. package/dist/utils/iterateOverDiff.js +397 -0
  278. package/dist/utils/iterateOverDiff.js.map +1 -0
  279. package/dist/utils/iterateOverFile.d.ts +50 -0
  280. package/dist/utils/iterateOverFile.d.ts.map +1 -0
  281. package/dist/utils/iterateOverFile.js +49 -0
  282. package/dist/utils/iterateOverFile.js.map +1 -0
  283. package/dist/utils/parseDiffDecorations.d.ts.map +1 -1
  284. package/dist/utils/parseDiffFromFile.d.ts +6 -6
  285. package/dist/utils/parseDiffFromFile.d.ts.map +1 -1
  286. package/dist/utils/parseDiffFromFile.js +10 -7
  287. package/dist/utils/parseDiffFromFile.js.map +1 -1
  288. package/dist/utils/parseLineType.d.ts +1 -1
  289. package/dist/utils/parseLineType.d.ts.map +1 -1
  290. package/dist/utils/parsePatchFiles.d.ts +25 -11
  291. package/dist/utils/parsePatchFiles.d.ts.map +1 -1
  292. package/dist/utils/parsePatchFiles.js +221 -163
  293. package/dist/utils/parsePatchFiles.js.map +1 -1
  294. package/dist/utils/prerenderHTMLIfNecessary.d.ts.map +1 -1
  295. package/dist/utils/processLine.d.ts.map +1 -1
  296. package/dist/utils/processLine.js +11 -27
  297. package/dist/utils/processLine.js.map +1 -1
  298. package/dist/utils/renderDiffWithHighlighter.d.ts +8 -2
  299. package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
  300. package/dist/utils/renderDiffWithHighlighter.js +152 -228
  301. package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
  302. package/dist/utils/renderFileWithHighlighter.d.ts +7 -2
  303. package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
  304. package/dist/utils/renderFileWithHighlighter.js +30 -4
  305. package/dist/utils/renderFileWithHighlighter.js.map +1 -1
  306. package/dist/utils/resolveVirtualFileMetrics.d.ts +7 -0
  307. package/dist/utils/resolveVirtualFileMetrics.d.ts.map +1 -0
  308. package/dist/utils/resolveVirtualFileMetrics.js +25 -0
  309. package/dist/utils/resolveVirtualFileMetrics.js.map +1 -0
  310. package/dist/utils/setLanguageOverride.d.ts +2 -1
  311. package/dist/utils/setLanguageOverride.d.ts.map +1 -1
  312. package/dist/utils/setLanguageOverride.js.map +1 -1
  313. package/dist/utils/setWrapperNodeProps.d.ts +4 -7
  314. package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
  315. package/dist/utils/setWrapperNodeProps.js +19 -12
  316. package/dist/utils/setWrapperNodeProps.js.map +1 -1
  317. package/dist/utils/splitFileContents.d.ts +12 -0
  318. package/dist/utils/splitFileContents.d.ts.map +1 -0
  319. package/dist/utils/splitFileContents.js +17 -0
  320. package/dist/utils/splitFileContents.js.map +1 -0
  321. package/dist/utils/trimPatchContext.d.ts +11 -0
  322. package/dist/utils/trimPatchContext.d.ts.map +1 -0
  323. package/dist/utils/trimPatchContext.js +99 -0
  324. package/dist/utils/trimPatchContext.js.map +1 -0
  325. package/dist/worker/WorkerPoolManager.d.ts +11 -4
  326. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  327. package/dist/worker/WorkerPoolManager.js +153 -61
  328. package/dist/worker/WorkerPoolManager.js.map +1 -1
  329. package/dist/worker/getOrCreateWorkerPoolSingleton.d.ts.map +1 -1
  330. package/dist/worker/getOrCreateWorkerPoolSingleton.js.map +1 -1
  331. package/dist/worker/types.d.ts +32 -25
  332. package/dist/worker/types.d.ts.map +1 -1
  333. package/dist/worker/worker-portable.js +902 -312
  334. package/dist/worker/worker-portable.js.map +1 -1
  335. package/dist/worker/worker.js +657 -268
  336. package/dist/worker/worker.js.map +1 -1
  337. package/package.json +52 -50
  338. package/dist/utils/createCodeNode.d.ts +0 -12
  339. package/dist/utils/createCodeNode.d.ts.map +0 -1
  340. package/dist/utils/createCodeNode.js +0 -12
  341. package/dist/utils/createCodeNode.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerPoolManager.d.ts","names":["options: WorkerPoolOptions"],"sources":["../../src/worker/WorkerPoolManager.ts"],"sourcesContent":[],"mappings":";;;;;UAmDU,eAAA;aACG,SAAA,CAAU,eAAe;EAL/B,SAIG,EAEG,SAAA,CAAU,MAFb,CAAA,MAAA,EAE4B,gBAF5B,CAAA;;UAYA,eAAA,CAXa;EACe,QAAA,EAAA,EAAA,IAAA;;AAAf,cAcV,iBAAA,CAdU;EAAA,QAUb,OAAA;EAIV,QAAa,WAAA;EAkBQ,QAAA,aAAA;EAEf,QAAA,WAAA;EACA,QAAA,OAAA;EACA,QAAA,SAAA;EACA,QAAA,YAAA;EACC,QAAA,aAAA;EAYoB,QAAA,gBAAA;EAAe,QAAA,aAAA;EAMf,QAAA,kBAAA;EAAmB,QAAA,SAAA;EAM3B,QAAA,SAAA;EAcf,WAAA,CAAA,OAAA,EA5CiB,iBA4CjB,EAAA;IAAA,KAAA;IAAA,KAAA;IAAA,YAAA;IAAA;EAAA,CAAA,EAtCG,iCAsCH;EACA,aAAA,CAAA,CAAA,EAAA,OAAA;EACA,kBAAA,CAAA,IAAA,EA5BuB,YA4BvB,CAAA,EA5BsC,gBA4BtC,GAAA,SAAA;EACS,kBAAA,CAAA,IAAA,EAvBc,gBAuBd,CAAA,EAvBiC,gBAuBjC,GAAA,SAAA;EAAR,aAAA,CAAA,CAAA,EAjBc,eAiBd;EAAkC,kBAAA,CAAA,QAAA,EAAA,MAAA,CAAA,EAAA,OAAA;EAoDb,kBAAA,CAAA,QAAA,EAAA,MAAA,CAAA,EAAA,OAAA;EAKA,gBAAA,CAAA;IAAA,KAAA;IAAA,YAAA;IAAA;EAAA,CAAA,EAzDrB,OAyDqB,CAzDb,sBAyDa,CAAA,CAAA,EAzDa,OAyDb,CAAA,IAAA,CAAA;EA8CU,oBAAA,CAAA,CAAA,EAnDV,iBAmDU;EAOE,oBAAA,CAAA,CAAA,EArDZ,iBAqDY;EAQR,QAAA,yBAAA;EAA4B,uBAAA,CAAA,QAAA,EAftB,eAesB,CAAA,EAAA,GAAA,GAAA,IAAA;EA8H7B,yBAAA,CAAA,QAAA,EAtIS,eAsIT,CAAA,EAAA,IAAA;EAA4B,aAAA,CAAA,CAAA,EAAA,OAAA;EAIjC,UAAA,CAAA,SAAA,CAAA,EAlIM,kBAkIN,EAAA,CAAA,EAlIkC,OAkIlC,CAAA,IAAA,CAAA;EAAe,QAAA,iBAAA;EAczB,QAAA,UAAA;EACJ,gBAAA,CAAA,QAAA,EAnBmB,oBAmBnB,EAAA,IAAA,EAnB+C,YAmB/C,CAAA,EAAA,IAAA;EAKc,eAAA,CAAA,IAAA,EApBA,YAoBA,CAAA,EApBe,gBAoBf,GAAA,SAAA;EAAmB,gBAAA,CAAA,QAAA,EAN7B,oBAM6B,EAAA,IAAA,EALjC,gBAKiC,CAAA,EAAA,IAAA;EA8B7B,eAAA,CAAA,IAAA,EA9BU,gBA8BV,CAAA,EA9B6B,gBA8B7B,GAAA,SAAA;EAAA,SAAA,CAAA,CAAA,EAAA,IAAA;;cAAA"}
1
+ {"version":3,"file":"WorkerPoolManager.d.ts","names":["LRUMapPkg","FileContents","FileDiffMetadata","HunkExpansionRegion","RenderDiffOptions","RenderDiffResult","RenderFileOptions","RenderFileResult","SupportedLanguages","ThemedDiffResult","ThemedFileResult","DiffRendererInstance","FileRendererInstance","WorkerInitializationRenderOptions","WorkerPoolOptions","WorkerRenderingOptions","WorkerStats","GetCachesResult","LRUMap","ThemeSubscriber","WorkerPoolManager","langs","theme","lineDiffType","tokenizeMaxLineLength","Partial","Promise","Map"],"sources":["../../src/worker/WorkerPoolManager.d.ts"],"sourcesContent":["import LRUMapPkg from 'lru_map';\nimport type { FileContents, FileDiffMetadata, HunkExpansionRegion, RenderDiffOptions, RenderDiffResult, RenderFileOptions, RenderFileResult, SupportedLanguages, ThemedDiffResult, ThemedFileResult } from '../types';\nimport type { DiffRendererInstance, FileRendererInstance, WorkerInitializationRenderOptions, WorkerPoolOptions, WorkerRenderingOptions, WorkerStats } from './types';\ninterface GetCachesResult {\n fileCache: LRUMapPkg.LRUMap<string, RenderFileResult>;\n diffCache: LRUMapPkg.LRUMap<string, RenderDiffResult>;\n}\ninterface ThemeSubscriber {\n rerender(): void;\n}\nexport declare class WorkerPoolManager {\n private options;\n private highlighter;\n private renderOptions;\n private initialized;\n private workers;\n private taskQueue;\n private pendingTasks;\n private nextRequestId;\n private themeSubscribers;\n private workersFailed;\n private instanceRequestMap;\n private statSubscribers;\n private fileCache;\n private diffCache;\n private _queuedBroadcast;\n constructor(options: WorkerPoolOptions, { langs, theme, lineDiffType, tokenizeMaxLineLength }: WorkerInitializationRenderOptions);\n isWorkingPool(): boolean;\n getFileResultCache(file: FileContents): RenderFileResult | undefined;\n getDiffResultCache(diff: FileDiffMetadata): RenderDiffResult | undefined;\n inspectCaches(): GetCachesResult;\n evictFileFromCache(cacheKey: string): boolean;\n evictDiffFromCache(cacheKey: string): boolean;\n setRenderOptions({ theme, lineDiffType, tokenizeMaxLineLength }: Partial<WorkerRenderingOptions>): Promise<void>;\n getFileRenderOptions(): RenderFileOptions;\n getDiffRenderOptions(): RenderDiffOptions;\n private setRenderOptionsOnWorkers;\n subscribeToThemeChanges(instance: ThemeSubscriber): () => void;\n unsubscribeToThemeChanges(instance: ThemeSubscriber): void;\n subscribeToStatChanges(callback: (stats: WorkerStats) => unknown): () => void;\n private queueBroadcastStateChanges;\n private _broadcastStateChanges;\n cleanUpPendingTasks(instance: FileRendererInstance | DiffRendererInstance): void;\n isInitialized(): boolean;\n initialize(languages?: SupportedLanguages[]): Promise<void>;\n private initializeWorkers;\n private drainQueue;\n highlightFileAST(instance: FileRendererInstance, file: FileContents): void;\n getPlainFileAST(file: FileContents, startingLine: number, totalLines: number, lines?: string[]): ThemedFileResult | undefined;\n highlightDiffAST(instance: DiffRendererInstance, diff: FileDiffMetadata): void;\n getPlainDiffAST(diff: FileDiffMetadata, startingLine: number, totalLines: number, expandedHunks?: Map<number, HunkExpansionRegion> | true, collapsedContextThreshold?: number): ThemedDiffResult | undefined;\n terminate(): void;\n private terminateWorkers;\n getStats(): WorkerStats;\n private submitTask;\n private resolveLanguagesAndExecuteTask;\n private handleWorkerMessage;\n private _queuedDrain;\n private queueDrain;\n private assignWorkerToTask;\n private clearWorkerTask;\n private executeTask;\n private getAvailableWorker;\n private generateRequestId;\n}\nexport {};\n//# sourceMappingURL=WorkerPoolManager.d.ts.map"],"mappings":"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"}
@@ -6,6 +6,7 @@ import { hasResolvedThemes } from "../highlighter/themes/hasResolvedThemes.js";
6
6
  import { areThemesEqual } from "../utils/areThemesEqual.js";
7
7
  import { getFiletypeFromFileName } from "../utils/getFiletypeFromFileName.js";
8
8
  import { renderFileWithHighlighter } from "../utils/renderFileWithHighlighter.js";
9
+ import { areFilesEqual } from "../utils/areFilesEqual.js";
9
10
  import { renderDiffWithHighlighter } from "../utils/renderDiffWithHighlighter.js";
10
11
  import { getResolvedLanguages } from "../highlighter/languages/getResolvedLanguages.js";
11
12
  import { hasResolvedLanguages } from "../highlighter/languages/hasResolvedLanguages.js";
@@ -21,14 +22,16 @@ var WorkerPoolManager = class {
21
22
  renderOptions;
22
23
  initialized = false;
23
24
  workers = [];
24
- taskQueue = [];
25
+ taskQueue = /* @__PURE__ */ new Map();
25
26
  pendingTasks = /* @__PURE__ */ new Map();
26
27
  nextRequestId = 0;
27
28
  themeSubscribers = /* @__PURE__ */ new Set();
28
29
  workersFailed = false;
29
30
  instanceRequestMap = /* @__PURE__ */ new Map();
31
+ statSubscribers = /* @__PURE__ */ new Set();
30
32
  fileCache;
31
33
  diffCache;
34
+ _queuedBroadcast;
32
35
  constructor(options, { langs, theme = DEFAULT_THEMES, lineDiffType = "word-alt", tokenizeMaxLineLength = 1e3 }) {
33
36
  this.options = options;
34
37
  this.renderOptions = {
@@ -57,10 +60,18 @@ var WorkerPoolManager = class {
57
60
  };
58
61
  }
59
62
  evictFileFromCache(cacheKey) {
60
- return this.fileCache.delete(cacheKey) !== void 0;
63
+ try {
64
+ return this.fileCache.delete(cacheKey) !== void 0;
65
+ } finally {
66
+ this.queueBroadcastStateChanges();
67
+ }
61
68
  }
62
69
  evictDiffFromCache(cacheKey) {
63
- return this.diffCache.delete(cacheKey) !== void 0;
70
+ try {
71
+ return this.diffCache.delete(cacheKey) !== void 0;
72
+ } finally {
73
+ this.queueBroadcastStateChanges();
74
+ }
64
75
  }
65
76
  async setRenderOptions({ theme = DEFAULT_THEMES, lineDiffType = "word-alt", tokenizeMaxLineLength = 1e3 }) {
66
77
  const newRenderOptions = {
@@ -132,51 +143,85 @@ var WorkerPoolManager = class {
132
143
  }
133
144
  subscribeToThemeChanges(instance) {
134
145
  this.themeSubscribers.add(instance);
146
+ this.queueBroadcastStateChanges();
135
147
  return () => {
136
148
  this.unsubscribeToThemeChanges(instance);
149
+ this.queueBroadcastStateChanges();
137
150
  };
138
151
  }
139
152
  unsubscribeToThemeChanges(instance) {
140
153
  this.themeSubscribers.delete(instance);
154
+ this.queueBroadcastStateChanges();
155
+ }
156
+ subscribeToStatChanges(callback) {
157
+ this.statSubscribers.add(callback);
158
+ callback(this.getStats());
159
+ return () => {
160
+ this.statSubscribers.delete(callback);
161
+ };
162
+ }
163
+ queueBroadcastStateChanges() {
164
+ if (this._queuedBroadcast != null) return;
165
+ this._queuedBroadcast = requestAnimationFrame(this._broadcastStateChanges);
166
+ }
167
+ _broadcastStateChanges = () => {
168
+ if (this._queuedBroadcast != null) {
169
+ cancelAnimationFrame(this._queuedBroadcast);
170
+ this._queuedBroadcast = void 0;
171
+ }
172
+ const stats = this.getStats();
173
+ for (const callback of this.statSubscribers) callback(stats);
174
+ };
175
+ cleanUpPendingTasks(instance) {
176
+ this.taskQueue.delete(instance);
177
+ const requestId = this.instanceRequestMap.get(instance);
178
+ if (requestId != null) {
179
+ this.pendingTasks.delete(requestId);
180
+ this.instanceRequestMap.delete(instance);
181
+ }
182
+ this.queueBroadcastStateChanges();
141
183
  }
142
184
  isInitialized() {
143
185
  return this.initialized === true;
144
186
  }
145
187
  async initialize(languages = []) {
146
188
  if (this.initialized === true) return;
147
- else if (this.initialized === false) this.initialized = new Promise((resolve, reject) => {
148
- (async () => {
149
- try {
150
- const themes = getThemes(this.renderOptions.theme);
151
- let resolvedThemes = [];
152
- if (hasResolvedThemes(themes)) resolvedThemes = getResolvedThemes(themes);
153
- else resolvedThemes = await resolveThemes(themes);
154
- let resolvedLanguages = [];
155
- if (hasResolvedLanguages(languages)) resolvedLanguages = getResolvedLanguages(languages);
156
- else resolvedLanguages = await resolveLanguages(languages);
157
- const [highlighter] = await Promise.all([getSharedHighlighter({
158
- themes,
159
- langs: ["text", ...languages]
160
- }), this.initializeWorkers(resolvedThemes, resolvedLanguages)]);
161
- if (this.initialized === false) {
162
- this.terminateWorkers();
163
- reject();
164
- return;
189
+ else if (this.initialized === false) {
190
+ this.initialized = new Promise((resolve, reject) => {
191
+ (async () => {
192
+ try {
193
+ const themes = getThemes(this.renderOptions.theme);
194
+ let resolvedThemes = [];
195
+ if (hasResolvedThemes(themes)) resolvedThemes = getResolvedThemes(themes);
196
+ else resolvedThemes = await resolveThemes(themes);
197
+ let resolvedLanguages = [];
198
+ if (hasResolvedLanguages(languages)) resolvedLanguages = getResolvedLanguages(languages);
199
+ else resolvedLanguages = await resolveLanguages(languages);
200
+ const [highlighter] = await Promise.all([getSharedHighlighter({
201
+ themes,
202
+ langs: ["text", ...languages]
203
+ }), this.initializeWorkers(resolvedThemes, resolvedLanguages)]);
204
+ if (this.initialized === false) {
205
+ this.terminateWorkers();
206
+ throw new Error("WorkerPoolManager: workers failed to initialize");
207
+ }
208
+ this.highlighter = highlighter;
209
+ this.initialized = true;
210
+ this.diffCache.clear();
211
+ this.fileCache.clear();
212
+ this.drainQueue();
213
+ this.queueBroadcastStateChanges();
214
+ resolve();
215
+ } catch (e) {
216
+ this.initialized = false;
217
+ this.workersFailed = true;
218
+ this.queueBroadcastStateChanges();
219
+ reject(e);
165
220
  }
166
- this.highlighter = highlighter;
167
- this.initialized = true;
168
- this.diffCache.clear();
169
- this.fileCache.clear();
170
- this.drainQueue();
171
- resolve();
172
- } catch (e) {
173
- this.initialized = false;
174
- this.workersFailed = true;
175
- reject(e);
176
- }
177
- })();
178
- });
179
- else return this.initialized;
221
+ })();
222
+ });
223
+ this.queueBroadcastStateChanges();
224
+ } else return this.initialized;
180
225
  }
181
226
  async initializeWorkers(resolvedThemes, resolvedLanguages) {
182
227
  this.workersFailed = false;
@@ -186,7 +231,7 @@ var WorkerPoolManager = class {
186
231
  const worker = this.options.workerFactory();
187
232
  const managedWorker = {
188
233
  worker,
189
- busy: false,
234
+ request_id: void 0,
190
235
  initialized: false,
191
236
  langs: new Set(["text", ...resolvedLanguages.map(({ name }) => name)])
192
237
  };
@@ -222,48 +267,65 @@ var WorkerPoolManager = class {
222
267
  }
223
268
  drainQueue = () => {
224
269
  this._queuedDrain = void 0;
225
- if (this.initialized !== true || this.taskQueue.length === 0) return;
226
- while (this.taskQueue.length > 0) {
227
- const task = this.taskQueue[0];
270
+ if (this.initialized !== true || this.taskQueue.size === 0) return;
271
+ for (const [instance, task] of this.taskQueue) {
272
+ if (this.instanceRequestMap.has(instance)) continue;
228
273
  const langs = getLangsFromTask(task);
229
274
  const availableWorker = this.getAvailableWorker(langs);
230
275
  if (availableWorker == null) break;
231
- this.taskQueue.shift();
276
+ this.assignWorkerToTask(task, availableWorker);
232
277
  this.resolveLanguagesAndExecuteTask(availableWorker, task, langs);
233
278
  }
279
+ this.queueBroadcastStateChanges();
234
280
  };
235
281
  highlightFileAST(instance, file) {
282
+ if ((file.lang ?? getFiletypeFromFileName(file.name)) === "text") return;
283
+ for (const tasks of [this.taskQueue, this.pendingTasks.values()]) for (const task of tasks) if ("instance" in task && task.instance === instance && task.request.type === "file" && areFilesEqual(file, task.request.file)) return;
236
284
  this.submitTask(instance, {
237
285
  type: "file",
238
286
  file
239
287
  });
240
288
  }
241
- getPlainFileAST(file) {
289
+ getPlainFileAST(file, startingLine, totalLines, lines) {
242
290
  if (this.highlighter == null) {
243
291
  this.initialize();
244
292
  return;
245
293
  }
246
- return renderFileWithHighlighter(file, this.highlighter, this.renderOptions, true);
294
+ return renderFileWithHighlighter(file, this.highlighter, this.renderOptions, {
295
+ forcePlainText: true,
296
+ startingLine,
297
+ totalLines,
298
+ lines
299
+ });
247
300
  }
248
301
  highlightDiffAST(instance, diff) {
302
+ if ((diff.lang ?? getFiletypeFromFileName(diff.name)) === "text") return;
303
+ for (const tasks of [this.taskQueue, this.pendingTasks.values()]) for (const task of tasks) if ("instance" in task && task.instance === instance && task.request.type === "diff" && task.request.diff === diff) return;
249
304
  this.submitTask(instance, {
250
305
  type: "diff",
251
306
  diff
252
307
  });
253
308
  }
254
- getPlainDiffAST(diff) {
255
- return this.highlighter != null ? renderDiffWithHighlighter(diff, this.highlighter, this.renderOptions, true) : void 0;
309
+ getPlainDiffAST(diff, startingLine, totalLines, expandedHunks, collapsedContextThreshold) {
310
+ return this.highlighter != null ? renderDiffWithHighlighter(diff, this.highlighter, this.renderOptions, {
311
+ forcePlainText: true,
312
+ startingLine,
313
+ totalLines,
314
+ expandedHunks,
315
+ collapsedContextThreshold
316
+ }) : void 0;
256
317
  }
257
318
  terminate() {
258
319
  this.terminateWorkers();
259
320
  this.fileCache.clear();
260
321
  this.diffCache.clear();
261
322
  this.instanceRequestMap.clear();
262
- this.taskQueue.length = 0;
323
+ this.taskQueue.clear();
263
324
  this.pendingTasks.clear();
264
325
  this.highlighter = void 0;
265
326
  this.initialized = false;
266
327
  this.workersFailed = false;
328
+ this.queueBroadcastStateChanges();
267
329
  }
268
330
  terminateWorkers() {
269
331
  for (const managedWorker of this.workers) managedWorker.worker.terminate();
@@ -271,10 +333,19 @@ var WorkerPoolManager = class {
271
333
  }
272
334
  getStats() {
273
335
  return {
336
+ managerState: (() => {
337
+ if (this.initialized === false) return "waiting";
338
+ if (this.initialized !== true) return "initializing";
339
+ return "initialized";
340
+ })(),
274
341
  totalWorkers: this.workers.length,
275
- busyWorkers: this.workers.filter((w) => w.busy).length,
276
- queuedTasks: this.taskQueue.length,
277
- pendingTasks: this.pendingTasks.size
342
+ workersFailed: this.workersFailed,
343
+ busyWorkers: this.workers.filter((w) => w.request_id != null).length,
344
+ queuedTasks: this.taskQueue.size,
345
+ pendingTasks: this.pendingTasks.size,
346
+ themeSubscribers: this.themeSubscribers.size,
347
+ fileCacheSize: this.fileCache.size,
348
+ diffCacheSize: this.diffCache.size
278
349
  };
279
350
  }
280
351
  submitTask(instance, request) {
@@ -305,22 +376,23 @@ var WorkerPoolManager = class {
305
376
  };
306
377
  }
307
378
  })();
308
- this.instanceRequestMap.set(instance, id);
309
- this.taskQueue.push(task);
379
+ this.taskQueue.set(instance, task);
310
380
  this.queueDrain();
311
381
  }
312
382
  async resolveLanguagesAndExecuteTask(availableWorker, task, langs) {
313
- if (task.type === "file" || task.type === "diff") {
383
+ try {
314
384
  const workerMissingLangs = langs.filter((lang) => !availableWorker.langs.has(lang));
315
385
  if (workerMissingLangs.length > 0) if (hasResolvedLanguages(workerMissingLangs)) task.request.resolvedLanguages = getResolvedLanguages(workerMissingLangs);
316
386
  else task.request.resolvedLanguages = await resolveLanguages(workerMissingLangs);
387
+ this.executeTask(availableWorker, task);
388
+ } catch {
389
+ this.clearWorkerTask(task, availableWorker);
317
390
  }
318
- this.executeTask(availableWorker, task);
319
391
  }
320
392
  handleWorkerMessage(managedWorker, response) {
321
393
  const task = this.pendingTasks.get(response.id);
322
394
  try {
323
- if (task == null) throw new Error("handleWorkerMessage: Received response for unknown task");
395
+ if (task == null) throw IGNORE_RESPONSE;
324
396
  else if (response.type === "error") {
325
397
  const error = new Error(response.error);
326
398
  if (response.stack) error.stack = response.stack;
@@ -365,26 +437,46 @@ var WorkerPoolManager = class {
365
437
  } catch (error) {
366
438
  if (error !== IGNORE_RESPONSE) console.error(error, task, response);
367
439
  }
368
- if (task != null && "instance" in task && this.instanceRequestMap.get(task.instance) === response.id) this.instanceRequestMap.delete(task.instance);
369
- this.pendingTasks.delete(response.id);
370
- managedWorker.busy = false;
371
- if (this.taskQueue.length > 0) this.queueDrain();
440
+ if (task != null) this.clearWorkerTask(task, managedWorker);
441
+ this.queueBroadcastStateChanges();
442
+ if (this.taskQueue.size > 0) this.queueDrain();
372
443
  }
373
444
  _queuedDrain;
374
445
  queueDrain() {
375
446
  if (this._queuedDrain != null) return;
376
447
  this._queuedDrain = Promise.resolve().then(this.drainQueue);
448
+ this.queueBroadcastStateChanges();
377
449
  }
378
- executeTask(managedWorker, task) {
379
- managedWorker.busy = true;
450
+ assignWorkerToTask(task, managedWorker) {
451
+ managedWorker.request_id = task.id;
452
+ if ("instance" in task) {
453
+ this.taskQueue.delete(task.instance);
454
+ this.instanceRequestMap.set(task.instance, task.id);
455
+ }
380
456
  this.pendingTasks.set(task.id, task);
457
+ }
458
+ clearWorkerTask(task, managedWorker) {
459
+ managedWorker.request_id = void 0;
460
+ if ("instance" in task) this.instanceRequestMap.delete(task.instance);
461
+ this.pendingTasks.delete(task.id);
462
+ }
463
+ executeTask(managedWorker, task) {
464
+ this.assignWorkerToTask(task, managedWorker);
381
465
  for (const lang of getLangsFromTask(task)) managedWorker.langs.add(lang);
382
- managedWorker.worker.postMessage(task.request);
466
+ try {
467
+ managedWorker.worker.postMessage(task.request);
468
+ } catch (error) {
469
+ this.clearWorkerTask(task, managedWorker);
470
+ console.error("Failed to post message to worker:", error);
471
+ if ("instance" in task) task.instance.onHighlightError(error);
472
+ else if ("reject" in task) task.reject(error);
473
+ }
474
+ this.queueBroadcastStateChanges();
383
475
  }
384
476
  getAvailableWorker(langs) {
385
477
  let worker;
386
478
  for (const managedWorker of this.workers) {
387
- if (managedWorker.busy || !managedWorker.initialized) continue;
479
+ if (managedWorker.request_id != null || !managedWorker.initialized) continue;
388
480
  worker = managedWorker;
389
481
  if (langs.length === 0) break;
390
482
  let hasEveryLang = true;
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerPoolManager.js","names":["options: WorkerPoolOptions","newRenderOptions: WorkerRenderingOptions","resolvedThemes: ThemeRegistrationResolved[]","taskPromises: Promise<void>[]","task: SetRenderOptionsWorkerTask","resolvedLanguages: ResolvedLanguage[]","initPromises: Promise<unknown>[]","managedWorker: ManagedWorker","task: InitializeWorkerTask","task: RenderFileTask | RenderDiffTask","worker: ManagedWorker | undefined"],"sources":["../../src/worker/WorkerPoolManager.ts"],"sourcesContent":["import LRUMapPkg from 'lru_map';\n\nimport { DEFAULT_THEMES } from '../constants';\nimport { getResolvedLanguages } from '../highlighter/languages/getResolvedLanguages';\nimport { hasResolvedLanguages } from '../highlighter/languages/hasResolvedLanguages';\nimport { resolveLanguages } from '../highlighter/languages/resolveLanguages';\nimport { getSharedHighlighter } from '../highlighter/shared_highlighter';\nimport { attachResolvedThemes } from '../highlighter/themes/attachResolvedThemes';\nimport { getResolvedThemes } from '../highlighter/themes/getResolvedThemes';\nimport { hasResolvedThemes } from '../highlighter/themes/hasResolvedThemes';\nimport { resolveThemes } from '../highlighter/themes/resolveThemes';\nimport type {\n DiffsHighlighter,\n FileContents,\n FileDiffMetadata,\n RenderDiffOptions,\n RenderDiffResult,\n RenderFileOptions,\n RenderFileResult,\n SupportedLanguages,\n ThemeRegistrationResolved,\n ThemedDiffResult,\n ThemedFileResult,\n} from '../types';\nimport { areThemesEqual } from '../utils/areThemesEqual';\nimport { getFiletypeFromFileName } from '../utils/getFiletypeFromFileName';\nimport { getThemes } from '../utils/getThemes';\nimport { renderDiffWithHighlighter } from '../utils/renderDiffWithHighlighter';\nimport { renderFileWithHighlighter } from '../utils/renderFileWithHighlighter';\nimport type {\n AllWorkerTasks,\n DiffRendererInstance,\n FileRendererInstance,\n InitializeWorkerTask,\n RenderDiffRequest,\n RenderDiffTask,\n RenderFileRequest,\n RenderFileTask,\n ResolvedLanguage,\n SetRenderOptionsWorkerTask,\n SubmitRequest,\n WorkerInitializationRenderOptions,\n WorkerPoolOptions,\n WorkerRenderingOptions,\n WorkerRequestId,\n WorkerResponse,\n WorkerStats,\n} from './types';\n\nconst IGNORE_RESPONSE = Symbol('IGNORE_RESPONSE');\n\ninterface GetCachesResult {\n fileCache: LRUMapPkg.LRUMap<string, RenderFileResult>;\n diffCache: LRUMapPkg.LRUMap<string, RenderDiffResult>;\n}\n\ninterface ManagedWorker {\n worker: Worker;\n busy: boolean;\n initialized: boolean;\n langs: Set<SupportedLanguages>;\n}\n\ninterface ThemeSubscriber {\n rerender(): void;\n}\n\nexport class WorkerPoolManager {\n private highlighter: DiffsHighlighter | undefined;\n private renderOptions: WorkerRenderingOptions;\n private initialized: Promise<void> | boolean = false;\n private workers: ManagedWorker[] = [];\n private taskQueue: AllWorkerTasks[] = [];\n private pendingTasks = new Map<WorkerRequestId, AllWorkerTasks>();\n private nextRequestId = 0;\n private themeSubscribers = new Set<ThemeSubscriber>();\n private workersFailed = false;\n private instanceRequestMap = new Map<\n FileRendererInstance | DiffRendererInstance,\n string\n >();\n private fileCache: LRUMapPkg.LRUMap<string, RenderFileResult>;\n private diffCache: LRUMapPkg.LRUMap<string, RenderDiffResult>;\n\n constructor(\n private options: WorkerPoolOptions,\n {\n langs,\n theme = DEFAULT_THEMES,\n lineDiffType = 'word-alt',\n tokenizeMaxLineLength = 1000,\n }: WorkerInitializationRenderOptions\n ) {\n this.renderOptions = { theme, lineDiffType, tokenizeMaxLineLength };\n this.fileCache = new LRUMapPkg.LRUMap(options.totalASTLRUCacheSize ?? 100);\n this.diffCache = new LRUMapPkg.LRUMap(options.totalASTLRUCacheSize ?? 100);\n void this.initialize(langs);\n }\n\n isWorkingPool(): boolean {\n return !this.workersFailed;\n }\n\n getFileResultCache(file: FileContents): RenderFileResult | undefined {\n return file.cacheKey != null\n ? this.fileCache.get(file.cacheKey)\n : undefined;\n }\n\n getDiffResultCache(diff: FileDiffMetadata): RenderDiffResult | undefined {\n return diff.cacheKey != null\n ? this.diffCache.get(diff.cacheKey)\n : undefined;\n }\n\n inspectCaches(): GetCachesResult {\n const { fileCache, diffCache } = this;\n return { fileCache, diffCache };\n }\n\n evictFileFromCache(cacheKey: string): boolean {\n return this.fileCache.delete(cacheKey) !== undefined;\n }\n\n evictDiffFromCache(cacheKey: string): boolean {\n return this.diffCache.delete(cacheKey) !== undefined;\n }\n\n async setRenderOptions({\n theme = DEFAULT_THEMES,\n lineDiffType = 'word-alt',\n tokenizeMaxLineLength = 1000,\n }: Partial<WorkerRenderingOptions>): Promise<void> {\n const newRenderOptions: WorkerRenderingOptions = {\n theme,\n lineDiffType,\n tokenizeMaxLineLength,\n };\n if (!this.isInitialized()) {\n await this.initialize();\n }\n const themesEqual = areThemesEqual(\n newRenderOptions.theme,\n this.renderOptions.theme\n );\n if (\n themesEqual &&\n newRenderOptions.lineDiffType === this.renderOptions.lineDiffType &&\n newRenderOptions.tokenizeMaxLineLength ===\n this.renderOptions.tokenizeMaxLineLength\n ) {\n return;\n }\n\n const themeNames = getThemes(theme);\n let resolvedThemes: ThemeRegistrationResolved[] = [];\n if (!themesEqual) {\n if (hasResolvedThemes(themeNames)) {\n resolvedThemes = getResolvedThemes(themeNames);\n } else {\n resolvedThemes = await resolveThemes(themeNames);\n }\n }\n\n if (this.highlighter != null) {\n attachResolvedThemes(resolvedThemes, this.highlighter);\n await this.setRenderOptionsOnWorkers(newRenderOptions, resolvedThemes);\n } else {\n const [highlighter] = await Promise.all([\n getSharedHighlighter({ themes: themeNames, langs: ['text'] }),\n this.setRenderOptionsOnWorkers(newRenderOptions, resolvedThemes),\n ]);\n this.highlighter = highlighter;\n }\n\n this.renderOptions = newRenderOptions;\n this.diffCache.clear();\n this.fileCache.clear();\n\n for (const instance of this.themeSubscribers) {\n instance.rerender();\n }\n }\n\n getFileRenderOptions(): RenderFileOptions {\n const { tokenizeMaxLineLength, theme } = this.renderOptions;\n return { theme, tokenizeMaxLineLength };\n }\n\n getDiffRenderOptions(): RenderDiffOptions {\n return { ...this.renderOptions };\n }\n\n private async setRenderOptionsOnWorkers(\n renderOptions: WorkerRenderingOptions,\n resolvedThemes: ThemeRegistrationResolved[]\n ): Promise<void> {\n if (this.workersFailed) {\n return;\n }\n if (!this.isInitialized()) {\n await this.initialize();\n }\n const taskPromises: Promise<void>[] = [];\n for (const managedWorker of this.workers) {\n if (!managedWorker.initialized) {\n console.log({ managedWorker });\n throw new Error(\n 'setRenderOptionsOnWorkers: Somehow we have an uninitialized worker'\n );\n }\n taskPromises.push(\n new Promise<void>((resolve, reject) => {\n const id = this.generateRequestId();\n const task: SetRenderOptionsWorkerTask = {\n type: 'set-render-options',\n id,\n request: {\n type: 'set-render-options',\n id,\n renderOptions,\n resolvedThemes,\n },\n resolve,\n reject,\n requestStart: Date.now(),\n };\n this.pendingTasks.set(id, task);\n managedWorker.worker.postMessage(task.request);\n })\n );\n }\n await Promise.all(taskPromises);\n }\n\n subscribeToThemeChanges(instance: ThemeSubscriber): () => void {\n this.themeSubscribers.add(instance);\n return () => {\n this.unsubscribeToThemeChanges(instance);\n };\n }\n\n unsubscribeToThemeChanges(instance: ThemeSubscriber): void {\n this.themeSubscribers.delete(instance);\n }\n\n isInitialized(): boolean {\n return this.initialized === true;\n }\n\n async initialize(languages: SupportedLanguages[] = []): Promise<void> {\n if (this.initialized === true) {\n return;\n } else if (this.initialized === false) {\n this.initialized = new Promise((resolve, reject) => {\n void (async () => {\n try {\n const themes = getThemes(this.renderOptions.theme);\n let resolvedThemes: ThemeRegistrationResolved[] = [];\n if (hasResolvedThemes(themes)) {\n resolvedThemes = getResolvedThemes(themes);\n } else {\n resolvedThemes = await resolveThemes(themes);\n }\n\n let resolvedLanguages: ResolvedLanguage[] = [];\n if (hasResolvedLanguages(languages)) {\n resolvedLanguages = getResolvedLanguages(languages);\n } else {\n resolvedLanguages = await resolveLanguages(languages);\n }\n\n const [highlighter] = await Promise.all([\n getSharedHighlighter({ themes, langs: ['text', ...languages] }),\n this.initializeWorkers(resolvedThemes, resolvedLanguages),\n ]);\n\n // If we were terminated while initializing, we should probably kill\n // any workers that may have been created\n if (this.initialized === false) {\n this.terminateWorkers();\n reject();\n return;\n }\n this.highlighter = highlighter;\n this.initialized = true;\n this.diffCache.clear();\n this.fileCache.clear();\n this.drainQueue();\n resolve();\n } catch (e) {\n this.initialized = false;\n this.workersFailed = true;\n reject(e);\n }\n })();\n });\n } else {\n return this.initialized;\n }\n }\n\n private async initializeWorkers(\n resolvedThemes: ThemeRegistrationResolved[],\n resolvedLanguages: ResolvedLanguage[]\n ): Promise<void> {\n this.workersFailed = false;\n const initPromises: Promise<unknown>[] = [];\n if (this.workers.length > 0) {\n this.terminateWorkers();\n }\n for (let i = 0; i < (this.options.poolSize ?? 8); i++) {\n const worker = this.options.workerFactory();\n const managedWorker: ManagedWorker = {\n worker,\n busy: false,\n initialized: false,\n langs: new Set(['text', ...resolvedLanguages.map(({ name }) => name)]),\n };\n worker.addEventListener(\n 'message',\n (event: MessageEvent<WorkerResponse>) => {\n this.handleWorkerMessage(managedWorker, event.data);\n }\n );\n worker.addEventListener('error', (error) =>\n console.error('Worker error:', error, managedWorker)\n );\n this.workers.push(managedWorker);\n initPromises.push(\n new Promise<void>((resolve, reject) => {\n const id = this.generateRequestId();\n const task: InitializeWorkerTask = {\n type: 'initialize',\n id,\n request: {\n type: 'initialize',\n id,\n renderOptions: this.renderOptions,\n resolvedThemes,\n resolvedLanguages,\n },\n resolve() {\n managedWorker.initialized = true;\n resolve();\n },\n reject,\n requestStart: Date.now(),\n };\n this.pendingTasks.set(id, task);\n this.executeTask(managedWorker, task);\n })\n );\n }\n await Promise.all(initPromises);\n }\n\n private drainQueue = () => {\n this._queuedDrain = undefined;\n // If we are initializing or things got cancelled while initializing, we\n // should not attempt to drain the queue\n if (this.initialized !== true || this.taskQueue.length === 0) {\n return;\n }\n while (this.taskQueue.length > 0) {\n const task = this.taskQueue[0];\n const langs = getLangsFromTask(task);\n const availableWorker = this.getAvailableWorker(langs);\n if (availableWorker == null) {\n break;\n }\n this.taskQueue.shift();\n void this.resolveLanguagesAndExecuteTask(availableWorker, task, langs);\n }\n };\n\n highlightFileAST(instance: FileRendererInstance, file: FileContents): void {\n this.submitTask(instance, { type: 'file', file });\n }\n\n getPlainFileAST(file: FileContents): ThemedFileResult | undefined {\n if (this.highlighter == null) {\n void this.initialize();\n return undefined;\n }\n return renderFileWithHighlighter(\n file,\n this.highlighter,\n this.renderOptions,\n true\n );\n }\n\n highlightDiffAST(\n instance: DiffRendererInstance,\n diff: FileDiffMetadata\n ): void {\n this.submitTask(instance, { type: 'diff', diff });\n }\n\n getPlainDiffAST(diff: FileDiffMetadata): ThemedDiffResult | undefined {\n return this.highlighter != null\n ? renderDiffWithHighlighter(\n diff,\n this.highlighter,\n this.renderOptions,\n true\n )\n : undefined;\n }\n\n terminate(): void {\n this.terminateWorkers();\n this.fileCache.clear();\n this.diffCache.clear();\n this.instanceRequestMap.clear();\n this.taskQueue.length = 0;\n this.pendingTasks.clear();\n this.highlighter = undefined;\n this.initialized = false;\n this.workersFailed = false;\n }\n\n private terminateWorkers() {\n for (const managedWorker of this.workers) {\n managedWorker.worker.terminate();\n }\n this.workers.length = 0;\n }\n\n getStats(): WorkerStats {\n return {\n totalWorkers: this.workers.length,\n busyWorkers: this.workers.filter((w) => w.busy).length,\n queuedTasks: this.taskQueue.length,\n pendingTasks: this.pendingTasks.size,\n };\n }\n\n private submitTask(\n instance: FileRendererInstance,\n request: Omit<RenderFileRequest, 'id'>\n ): void;\n private submitTask(\n instance: DiffRendererInstance,\n request: Omit<RenderDiffRequest, 'id'>\n ): void;\n private submitTask(\n instance: FileRendererInstance | DiffRendererInstance,\n request: SubmitRequest\n ): void {\n if (this.initialized === false) {\n void this.initialize();\n }\n\n const id = this.generateRequestId();\n const requestStart = Date.now();\n const task: RenderFileTask | RenderDiffTask = (() => {\n switch (request.type) {\n case 'file':\n return {\n type: 'file',\n id,\n request: { ...request, id },\n instance: instance as FileRendererInstance,\n requestStart,\n };\n case 'diff':\n return {\n type: 'diff',\n id,\n request: { ...request, id },\n instance: instance as DiffRendererInstance,\n requestStart,\n };\n }\n })();\n\n this.instanceRequestMap.set(instance, id);\n this.taskQueue.push(task);\n this.queueDrain();\n }\n\n private async resolveLanguagesAndExecuteTask(\n availableWorker: ManagedWorker,\n task: AllWorkerTasks,\n langs: SupportedLanguages[]\n ): Promise<void> {\n // Add resolved languages if required\n if (task.type === 'file' || task.type === 'diff') {\n const workerMissingLangs = langs.filter(\n (lang) => !availableWorker.langs.has(lang)\n );\n\n if (workerMissingLangs.length > 0) {\n if (hasResolvedLanguages(workerMissingLangs)) {\n task.request.resolvedLanguages =\n getResolvedLanguages(workerMissingLangs);\n } else {\n task.request.resolvedLanguages =\n await resolveLanguages(workerMissingLangs);\n }\n }\n }\n this.executeTask(availableWorker, task);\n }\n\n private handleWorkerMessage(\n managedWorker: ManagedWorker,\n response: WorkerResponse\n ): void {\n const task = this.pendingTasks.get(response.id);\n try {\n if (task == null) {\n throw new Error(\n 'handleWorkerMessage: Received response for unknown task'\n );\n } else if (response.type === 'error') {\n const error = new Error(response.error);\n if (response.stack) {\n error.stack = response.stack;\n }\n if ('reject' in task) {\n task.reject(error);\n } else {\n task.instance.onHighlightError(error);\n }\n throw error;\n } else {\n // If we've gotten a newer request from the same instance, we should\n // ignore this response either because it's out of order or because we\n // have a newer more important request\n if (\n 'instance' in task &&\n this.instanceRequestMap.get(task.instance) !== response.id\n ) {\n throw IGNORE_RESPONSE;\n }\n switch (response.requestType) {\n case 'initialize':\n if (task.type !== 'initialize') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n task.resolve();\n break;\n case 'set-render-options':\n if (task.type !== 'set-render-options') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n task.resolve();\n break;\n case 'file': {\n if (task.type !== 'file') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n const { result, options } = response;\n const { instance, request } = task;\n if (request.file.cacheKey != null) {\n this.fileCache.set(request.file.cacheKey, { result, options });\n }\n instance.onHighlightSuccess(request.file, result, options);\n break;\n }\n case 'diff': {\n if (task.type !== 'diff') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n const { result, options } = response;\n const { instance, request } = task;\n if (request.diff.cacheKey != null) {\n this.diffCache.set(request.diff.cacheKey, { result, options });\n }\n instance.onHighlightSuccess(request.diff, result, options);\n break;\n }\n }\n }\n } catch (error) {\n if (error !== IGNORE_RESPONSE) {\n console.error(error, task, response);\n }\n }\n\n if (\n task != null &&\n 'instance' in task &&\n this.instanceRequestMap.get(task.instance) === response.id\n ) {\n this.instanceRequestMap.delete(task.instance);\n }\n this.pendingTasks.delete(response.id);\n managedWorker.busy = false;\n if (this.taskQueue.length > 0) {\n // We queue drain so that potentially multiple workers can free up\n // allowing for better language matches if possible\n this.queueDrain();\n }\n }\n\n private _queuedDrain: Promise<void> | undefined;\n private queueDrain() {\n if (this._queuedDrain != null) return;\n this._queuedDrain = Promise.resolve().then(this.drainQueue);\n }\n\n private executeTask(\n managedWorker: ManagedWorker,\n task: AllWorkerTasks\n ): void {\n managedWorker.busy = true;\n this.pendingTasks.set(task.id, task);\n for (const lang of getLangsFromTask(task)) {\n managedWorker.langs.add(lang);\n }\n managedWorker.worker.postMessage(task.request);\n }\n\n private getAvailableWorker(\n langs: SupportedLanguages[]\n ): ManagedWorker | undefined {\n let worker: ManagedWorker | undefined;\n for (const managedWorker of this.workers) {\n if (managedWorker.busy || !managedWorker.initialized) {\n continue;\n }\n worker = managedWorker;\n if (langs.length === 0) {\n break;\n }\n let hasEveryLang = true;\n for (const lang of langs) {\n if (!managedWorker.langs.has(lang)) {\n hasEveryLang = false;\n break;\n }\n }\n if (hasEveryLang) {\n break;\n }\n }\n return worker;\n }\n\n private generateRequestId(): WorkerRequestId {\n return `req_${++this.nextRequestId}`;\n }\n}\n\nfunction getLangsFromTask(task: AllWorkerTasks): SupportedLanguages[] {\n const langs = new Set<SupportedLanguages>();\n if (task.type === 'initialize' || task.type === 'set-render-options') {\n return [];\n }\n switch (task.type) {\n case 'file': {\n langs.add(\n task.request.file.lang ??\n getFiletypeFromFileName(task.request.file.name)\n );\n break;\n }\n case 'diff': {\n langs.add(\n task.request.diff.lang ??\n getFiletypeFromFileName(task.request.diff.name)\n );\n langs.add(\n task.request.diff.lang ??\n getFiletypeFromFileName(task.request.diff.prevName ?? '-')\n );\n break;\n }\n }\n langs.delete('text');\n return Array.from(langs);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"WorkerPoolManager.js","names":["options: WorkerPoolOptions","newRenderOptions: WorkerRenderingOptions","resolvedThemes: ThemeRegistrationResolved[]","taskPromises: Promise<void>[]","task: SetRenderOptionsWorkerTask","resolvedLanguages: ResolvedLanguage[]","initPromises: Promise<unknown>[]","managedWorker: ManagedWorker","task: InitializeWorkerTask","task: RenderFileTask | RenderDiffTask","worker: ManagedWorker | undefined"],"sources":["../../src/worker/WorkerPoolManager.ts"],"sourcesContent":["import LRUMapPkg from 'lru_map';\n\nimport { DEFAULT_THEMES } from '../constants';\nimport { getResolvedLanguages } from '../highlighter/languages/getResolvedLanguages';\nimport { hasResolvedLanguages } from '../highlighter/languages/hasResolvedLanguages';\nimport { resolveLanguages } from '../highlighter/languages/resolveLanguages';\nimport { getSharedHighlighter } from '../highlighter/shared_highlighter';\nimport { attachResolvedThemes } from '../highlighter/themes/attachResolvedThemes';\nimport { getResolvedThemes } from '../highlighter/themes/getResolvedThemes';\nimport { hasResolvedThemes } from '../highlighter/themes/hasResolvedThemes';\nimport { resolveThemes } from '../highlighter/themes/resolveThemes';\nimport type {\n DiffsHighlighter,\n FileContents,\n FileDiffMetadata,\n HunkExpansionRegion,\n RenderDiffOptions,\n RenderDiffResult,\n RenderFileOptions,\n RenderFileResult,\n SupportedLanguages,\n ThemedDiffResult,\n ThemedFileResult,\n ThemeRegistrationResolved,\n} from '../types';\nimport { areFilesEqual } from '../utils/areFilesEqual';\nimport { areThemesEqual } from '../utils/areThemesEqual';\nimport { getFiletypeFromFileName } from '../utils/getFiletypeFromFileName';\nimport { getThemes } from '../utils/getThemes';\nimport { renderDiffWithHighlighter } from '../utils/renderDiffWithHighlighter';\nimport { renderFileWithHighlighter } from '../utils/renderFileWithHighlighter';\nimport type {\n AllWorkerTasks,\n DiffRendererInstance,\n FileRendererInstance,\n InitializeWorkerTask,\n RenderDiffRequest,\n RenderDiffTask,\n RenderFileRequest,\n RenderFileTask,\n ResolvedLanguage,\n SetRenderOptionsWorkerTask,\n SubmitRequest,\n WorkerInitializationRenderOptions,\n WorkerPoolOptions,\n WorkerRenderingOptions,\n WorkerRequestId,\n WorkerResponse,\n WorkerStats,\n} from './types';\n\nconst IGNORE_RESPONSE = Symbol('IGNORE_RESPONSE');\n\ninterface GetCachesResult {\n fileCache: LRUMapPkg.LRUMap<string, RenderFileResult>;\n diffCache: LRUMapPkg.LRUMap<string, RenderDiffResult>;\n}\n\ninterface ManagedWorker {\n worker: Worker;\n request_id: string | undefined;\n initialized: boolean;\n langs: Set<SupportedLanguages>;\n}\n\ninterface ThemeSubscriber {\n rerender(): void;\n}\n\nexport class WorkerPoolManager {\n private highlighter: DiffsHighlighter | undefined;\n private renderOptions: WorkerRenderingOptions;\n private initialized: Promise<void> | boolean = false;\n private workers: ManagedWorker[] = [];\n private taskQueue = new Map<\n FileRendererInstance | DiffRendererInstance,\n RenderDiffTask | RenderFileTask\n >();\n private pendingTasks = new Map<WorkerRequestId, AllWorkerTasks>();\n private nextRequestId = 0;\n private themeSubscribers = new Set<ThemeSubscriber>();\n private workersFailed = false;\n private instanceRequestMap = new Map<\n FileRendererInstance | DiffRendererInstance,\n string\n >();\n private statSubscribers = new Set<(stats: WorkerStats) => unknown>();\n private fileCache: LRUMapPkg.LRUMap<string, RenderFileResult>;\n private diffCache: LRUMapPkg.LRUMap<string, RenderDiffResult>;\n private _queuedBroadcast: number | undefined;\n\n constructor(\n private options: WorkerPoolOptions,\n {\n langs,\n theme = DEFAULT_THEMES,\n lineDiffType = 'word-alt',\n tokenizeMaxLineLength = 1000,\n }: WorkerInitializationRenderOptions\n ) {\n this.renderOptions = { theme, lineDiffType, tokenizeMaxLineLength };\n this.fileCache = new LRUMapPkg.LRUMap(options.totalASTLRUCacheSize ?? 100);\n this.diffCache = new LRUMapPkg.LRUMap(options.totalASTLRUCacheSize ?? 100);\n void this.initialize(langs);\n }\n\n isWorkingPool(): boolean {\n return !this.workersFailed;\n }\n\n getFileResultCache(file: FileContents): RenderFileResult | undefined {\n return file.cacheKey != null\n ? this.fileCache.get(file.cacheKey)\n : undefined;\n }\n\n getDiffResultCache(diff: FileDiffMetadata): RenderDiffResult | undefined {\n return diff.cacheKey != null\n ? this.diffCache.get(diff.cacheKey)\n : undefined;\n }\n\n inspectCaches(): GetCachesResult {\n const { fileCache, diffCache } = this;\n return { fileCache, diffCache };\n }\n\n evictFileFromCache(cacheKey: string): boolean {\n try {\n return this.fileCache.delete(cacheKey) !== undefined;\n } finally {\n this.queueBroadcastStateChanges();\n }\n }\n\n evictDiffFromCache(cacheKey: string): boolean {\n try {\n return this.diffCache.delete(cacheKey) !== undefined;\n } finally {\n this.queueBroadcastStateChanges();\n }\n }\n\n async setRenderOptions({\n theme = DEFAULT_THEMES,\n lineDiffType = 'word-alt',\n tokenizeMaxLineLength = 1000,\n }: Partial<WorkerRenderingOptions>): Promise<void> {\n const newRenderOptions: WorkerRenderingOptions = {\n theme,\n lineDiffType,\n tokenizeMaxLineLength,\n };\n if (!this.isInitialized()) {\n await this.initialize();\n }\n const themesEqual = areThemesEqual(\n newRenderOptions.theme,\n this.renderOptions.theme\n );\n if (\n themesEqual &&\n newRenderOptions.lineDiffType === this.renderOptions.lineDiffType &&\n newRenderOptions.tokenizeMaxLineLength ===\n this.renderOptions.tokenizeMaxLineLength\n ) {\n return;\n }\n\n const themeNames = getThemes(theme);\n let resolvedThemes: ThemeRegistrationResolved[] = [];\n if (!themesEqual) {\n if (hasResolvedThemes(themeNames)) {\n resolvedThemes = getResolvedThemes(themeNames);\n } else {\n resolvedThemes = await resolveThemes(themeNames);\n }\n }\n\n if (this.highlighter != null) {\n attachResolvedThemes(resolvedThemes, this.highlighter);\n await this.setRenderOptionsOnWorkers(newRenderOptions, resolvedThemes);\n } else {\n const [highlighter] = await Promise.all([\n getSharedHighlighter({ themes: themeNames, langs: ['text'] }),\n this.setRenderOptionsOnWorkers(newRenderOptions, resolvedThemes),\n ]);\n this.highlighter = highlighter;\n }\n\n this.renderOptions = newRenderOptions;\n this.diffCache.clear();\n this.fileCache.clear();\n\n for (const instance of this.themeSubscribers) {\n instance.rerender();\n }\n }\n\n getFileRenderOptions(): RenderFileOptions {\n const { tokenizeMaxLineLength, theme } = this.renderOptions;\n return { theme, tokenizeMaxLineLength };\n }\n\n getDiffRenderOptions(): RenderDiffOptions {\n return { ...this.renderOptions };\n }\n\n private async setRenderOptionsOnWorkers(\n renderOptions: WorkerRenderingOptions,\n resolvedThemes: ThemeRegistrationResolved[]\n ): Promise<void> {\n if (this.workersFailed) {\n return;\n }\n if (!this.isInitialized()) {\n await this.initialize();\n }\n const taskPromises: Promise<void>[] = [];\n for (const managedWorker of this.workers) {\n if (!managedWorker.initialized) {\n console.log({ managedWorker });\n throw new Error(\n 'setRenderOptionsOnWorkers: Somehow we have an uninitialized worker'\n );\n }\n taskPromises.push(\n new Promise<void>((resolve, reject) => {\n const id = this.generateRequestId();\n const task: SetRenderOptionsWorkerTask = {\n type: 'set-render-options',\n id,\n request: {\n type: 'set-render-options',\n id,\n renderOptions,\n resolvedThemes,\n },\n resolve,\n reject,\n requestStart: Date.now(),\n };\n // NOTE(amadeus): We intentionally ignore the normal pending requests\n // infra because these tasks should technically interrupt the normal\n // flow and should be processed by the worker when ready immediately\n this.pendingTasks.set(id, task);\n managedWorker.worker.postMessage(task.request);\n })\n );\n }\n await Promise.all(taskPromises);\n }\n\n subscribeToThemeChanges(instance: ThemeSubscriber): () => void {\n this.themeSubscribers.add(instance);\n this.queueBroadcastStateChanges();\n return () => {\n this.unsubscribeToThemeChanges(instance);\n this.queueBroadcastStateChanges();\n };\n }\n\n unsubscribeToThemeChanges(instance: ThemeSubscriber): void {\n this.themeSubscribers.delete(instance);\n this.queueBroadcastStateChanges();\n }\n\n subscribeToStatChanges(\n callback: (stats: WorkerStats) => unknown\n ): () => void {\n this.statSubscribers.add(callback);\n callback(this.getStats());\n return () => {\n this.statSubscribers.delete(callback);\n };\n }\n\n private queueBroadcastStateChanges() {\n if (this._queuedBroadcast != null) return;\n this._queuedBroadcast = requestAnimationFrame(this._broadcastStateChanges);\n }\n\n private _broadcastStateChanges = () => {\n if (this._queuedBroadcast != null) {\n cancelAnimationFrame(this._queuedBroadcast);\n this._queuedBroadcast = undefined;\n }\n const stats = this.getStats();\n for (const callback of this.statSubscribers) {\n callback(stats);\n }\n };\n\n cleanUpPendingTasks(\n instance: FileRendererInstance | DiffRendererInstance\n ): void {\n this.taskQueue.delete(instance);\n const requestId = this.instanceRequestMap.get(instance);\n if (requestId != null) {\n this.pendingTasks.delete(requestId);\n this.instanceRequestMap.delete(instance);\n }\n this.queueBroadcastStateChanges();\n }\n\n isInitialized(): boolean {\n return this.initialized === true;\n }\n\n async initialize(languages: SupportedLanguages[] = []): Promise<void> {\n if (this.initialized === true) {\n return;\n } else if (this.initialized === false) {\n this.initialized = new Promise((resolve, reject) => {\n void (async () => {\n try {\n const themes = getThemes(this.renderOptions.theme);\n let resolvedThemes: ThemeRegistrationResolved[] = [];\n if (hasResolvedThemes(themes)) {\n resolvedThemes = getResolvedThemes(themes);\n } else {\n resolvedThemes = await resolveThemes(themes);\n }\n\n let resolvedLanguages: ResolvedLanguage[] = [];\n if (hasResolvedLanguages(languages)) {\n resolvedLanguages = getResolvedLanguages(languages);\n } else {\n resolvedLanguages = await resolveLanguages(languages);\n }\n\n const [highlighter] = await Promise.all([\n getSharedHighlighter({ themes, langs: ['text', ...languages] }),\n this.initializeWorkers(resolvedThemes, resolvedLanguages),\n ]);\n\n // If we were terminated while initializing, we should probably kill\n // any workers that may have been created\n if (this.initialized === false) {\n this.terminateWorkers();\n throw new Error(\n 'WorkerPoolManager: workers failed to initialize'\n );\n }\n this.highlighter = highlighter;\n this.initialized = true;\n this.diffCache.clear();\n this.fileCache.clear();\n this.drainQueue();\n this.queueBroadcastStateChanges();\n resolve();\n } catch (e) {\n this.initialized = false;\n this.workersFailed = true;\n this.queueBroadcastStateChanges();\n reject(e);\n }\n })();\n });\n this.queueBroadcastStateChanges();\n } else {\n return this.initialized;\n }\n }\n\n private async initializeWorkers(\n resolvedThemes: ThemeRegistrationResolved[],\n resolvedLanguages: ResolvedLanguage[]\n ): Promise<void> {\n this.workersFailed = false;\n const initPromises: Promise<unknown>[] = [];\n if (this.workers.length > 0) {\n this.terminateWorkers();\n }\n for (let i = 0; i < (this.options.poolSize ?? 8); i++) {\n const worker = this.options.workerFactory();\n const managedWorker: ManagedWorker = {\n worker,\n request_id: undefined,\n initialized: false,\n langs: new Set(['text', ...resolvedLanguages.map(({ name }) => name)]),\n };\n worker.addEventListener(\n 'message',\n (event: MessageEvent<WorkerResponse>) => {\n this.handleWorkerMessage(managedWorker, event.data);\n }\n );\n worker.addEventListener('error', (error) =>\n console.error('Worker error:', error, managedWorker)\n );\n this.workers.push(managedWorker);\n initPromises.push(\n new Promise<void>((resolve, reject) => {\n const id = this.generateRequestId();\n const task: InitializeWorkerTask = {\n type: 'initialize',\n id,\n request: {\n type: 'initialize',\n id,\n renderOptions: this.renderOptions,\n resolvedThemes,\n resolvedLanguages,\n },\n resolve() {\n managedWorker.initialized = true;\n resolve();\n },\n reject,\n requestStart: Date.now(),\n };\n this.pendingTasks.set(id, task);\n this.executeTask(managedWorker, task);\n })\n );\n }\n await Promise.all(initPromises);\n }\n\n private drainQueue = () => {\n this._queuedDrain = undefined;\n // If we are initializing or things got cancelled while initializing, we\n // should not attempt to drain the queue\n if (this.initialized !== true || this.taskQueue.size === 0) {\n return;\n }\n for (const [instance, task] of this.taskQueue) {\n // If we have a request in progress for the same instance, we should wait\n // for it to finish\n if (this.instanceRequestMap.has(instance)) {\n continue;\n }\n const langs = getLangsFromTask(task);\n const availableWorker = this.getAvailableWorker(langs);\n if (availableWorker == null) {\n break;\n }\n this.assignWorkerToTask(task, availableWorker);\n void this.resolveLanguagesAndExecuteTask(availableWorker, task, langs);\n }\n this.queueBroadcastStateChanges();\n };\n\n highlightFileAST(instance: FileRendererInstance, file: FileContents): void {\n const computedLang = file.lang ?? getFiletypeFromFileName(file.name);\n if (computedLang === 'text') return;\n // If we already have a task in progress for this same file content, we\n // should drop it\n for (const tasks of [this.taskQueue, this.pendingTasks.values()]) {\n for (const task of tasks) {\n if (\n 'instance' in task &&\n task.instance === instance &&\n task.request.type === 'file' &&\n areFilesEqual(file, task.request.file)\n ) {\n return;\n }\n }\n }\n this.submitTask(instance, { type: 'file', file });\n }\n\n getPlainFileAST(\n file: FileContents,\n startingLine: number,\n totalLines: number,\n lines?: string[]\n ): ThemedFileResult | undefined {\n if (this.highlighter == null) {\n void this.initialize();\n return undefined;\n }\n return renderFileWithHighlighter(\n file,\n this.highlighter,\n this.renderOptions,\n { forcePlainText: true, startingLine, totalLines, lines }\n );\n }\n\n highlightDiffAST(\n instance: DiffRendererInstance,\n diff: FileDiffMetadata\n ): void {\n const computedLang = diff.lang ?? getFiletypeFromFileName(diff.name);\n if (computedLang === 'text') return;\n // If we already have a task in progress for this same diff content, we\n // should ignore executing it again\n for (const tasks of [this.taskQueue, this.pendingTasks.values()]) {\n for (const task of tasks) {\n if (\n 'instance' in task &&\n task.instance === instance &&\n task.request.type === 'diff' &&\n task.request.diff === diff\n ) {\n return;\n }\n }\n }\n this.submitTask(instance, { type: 'diff', diff });\n }\n\n getPlainDiffAST(\n diff: FileDiffMetadata,\n startingLine: number,\n totalLines: number,\n expandedHunks?: Map<number, HunkExpansionRegion> | true,\n collapsedContextThreshold?: number\n ): ThemedDiffResult | undefined {\n return this.highlighter != null\n ? renderDiffWithHighlighter(diff, this.highlighter, this.renderOptions, {\n forcePlainText: true,\n startingLine,\n totalLines,\n expandedHunks,\n collapsedContextThreshold,\n })\n : undefined;\n }\n\n terminate(): void {\n this.terminateWorkers();\n this.fileCache.clear();\n this.diffCache.clear();\n this.instanceRequestMap.clear();\n this.taskQueue.clear();\n this.pendingTasks.clear();\n this.highlighter = undefined;\n this.initialized = false;\n this.workersFailed = false;\n this.queueBroadcastStateChanges();\n }\n\n private terminateWorkers() {\n for (const managedWorker of this.workers) {\n managedWorker.worker.terminate();\n }\n this.workers.length = 0;\n }\n\n getStats(): WorkerStats {\n return {\n managerState: (() => {\n if (this.initialized === false) {\n return 'waiting';\n }\n if (this.initialized !== true) {\n return 'initializing';\n }\n return 'initialized';\n })(),\n totalWorkers: this.workers.length,\n workersFailed: this.workersFailed,\n busyWorkers: this.workers.filter((w) => w.request_id != null).length,\n queuedTasks: this.taskQueue.size,\n pendingTasks: this.pendingTasks.size,\n themeSubscribers: this.themeSubscribers.size,\n fileCacheSize: this.fileCache.size,\n diffCacheSize: this.diffCache.size,\n };\n }\n\n private submitTask(\n instance: FileRendererInstance,\n request: Omit<RenderFileRequest, 'id'>\n ): void;\n private submitTask(\n instance: DiffRendererInstance,\n request: Omit<RenderDiffRequest, 'id'>\n ): void;\n private submitTask(\n instance: FileRendererInstance | DiffRendererInstance,\n request: SubmitRequest\n ): void {\n if (this.initialized === false) {\n void this.initialize();\n }\n\n const id = this.generateRequestId();\n const requestStart = Date.now();\n const task: RenderFileTask | RenderDiffTask = (() => {\n switch (request.type) {\n case 'file':\n return {\n type: 'file',\n id,\n request: { ...request, id },\n instance: instance as FileRendererInstance,\n requestStart,\n };\n case 'diff':\n return {\n type: 'diff',\n id,\n request: { ...request, id },\n instance: instance as DiffRendererInstance,\n requestStart,\n };\n }\n })();\n\n this.taskQueue.set(instance, task);\n this.queueDrain();\n }\n\n private async resolveLanguagesAndExecuteTask(\n availableWorker: ManagedWorker,\n task: RenderFileTask | RenderDiffTask,\n langs: SupportedLanguages[]\n ): Promise<void> {\n try {\n // Add resolved languages if required\n const workerMissingLangs = langs.filter(\n (lang) => !availableWorker.langs.has(lang)\n );\n\n if (workerMissingLangs.length > 0) {\n if (hasResolvedLanguages(workerMissingLangs)) {\n task.request.resolvedLanguages =\n getResolvedLanguages(workerMissingLangs);\n } else {\n task.request.resolvedLanguages =\n await resolveLanguages(workerMissingLangs);\n }\n }\n this.executeTask(availableWorker, task);\n } catch {\n this.clearWorkerTask(task, availableWorker);\n }\n }\n\n private handleWorkerMessage(\n managedWorker: ManagedWorker,\n response: WorkerResponse\n ): void {\n const task = this.pendingTasks.get(response.id);\n try {\n if (task == null) {\n // If we can't find a task for this response, it probably means the\n // component has been unmounted, so we should silently ignore it\n throw IGNORE_RESPONSE;\n } else if (response.type === 'error') {\n const error = new Error(response.error);\n if (response.stack) {\n error.stack = response.stack;\n }\n if ('reject' in task) {\n task.reject(error);\n } else {\n task.instance.onHighlightError(error);\n }\n throw error;\n } else {\n // If we've gotten a newer request from the same instance, we should\n // ignore this response either because it's out of order or because we\n // have a newer more important request\n if (\n 'instance' in task &&\n this.instanceRequestMap.get(task.instance) !== response.id\n ) {\n throw IGNORE_RESPONSE;\n }\n switch (response.requestType) {\n case 'initialize':\n if (task.type !== 'initialize') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n task.resolve();\n break;\n case 'set-render-options':\n if (task.type !== 'set-render-options') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n task.resolve();\n break;\n case 'file': {\n if (task.type !== 'file') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n const { result, options } = response;\n const { instance, request } = task;\n if (request.file.cacheKey != null) {\n this.fileCache.set(request.file.cacheKey, { result, options });\n }\n instance.onHighlightSuccess(request.file, result, options);\n break;\n }\n case 'diff': {\n if (task.type !== 'diff') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n const { result, options } = response;\n const { instance, request } = task;\n if (request.diff.cacheKey != null) {\n this.diffCache.set(request.diff.cacheKey, { result, options });\n }\n instance.onHighlightSuccess(request.diff, result, options);\n break;\n }\n }\n }\n } catch (error) {\n if (error !== IGNORE_RESPONSE) {\n console.error(error, task, response);\n }\n }\n\n if (task != null) {\n this.clearWorkerTask(task, managedWorker);\n }\n this.queueBroadcastStateChanges();\n if (this.taskQueue.size > 0) {\n // We queue drain so that potentially multiple workers can free up\n // allowing for better language matches if possible\n this.queueDrain();\n }\n }\n\n private _queuedDrain: Promise<void> | undefined;\n private queueDrain() {\n if (this._queuedDrain != null) return;\n this._queuedDrain = Promise.resolve().then(this.drainQueue);\n this.queueBroadcastStateChanges();\n }\n\n private assignWorkerToTask(\n task: AllWorkerTasks,\n managedWorker: ManagedWorker\n ) {\n managedWorker.request_id = task.id;\n if ('instance' in task) {\n this.taskQueue.delete(task.instance);\n this.instanceRequestMap.set(task.instance, task.id);\n }\n this.pendingTasks.set(task.id, task);\n }\n\n private clearWorkerTask(task: AllWorkerTasks, managedWorker: ManagedWorker) {\n managedWorker.request_id = undefined;\n if ('instance' in task) {\n this.instanceRequestMap.delete(task.instance);\n }\n this.pendingTasks.delete(task.id);\n }\n\n private executeTask(\n managedWorker: ManagedWorker,\n task: AllWorkerTasks\n ): void {\n this.assignWorkerToTask(task, managedWorker);\n for (const lang of getLangsFromTask(task)) {\n managedWorker.langs.add(lang);\n }\n try {\n managedWorker.worker.postMessage(task.request);\n } catch (error) {\n this.clearWorkerTask(task, managedWorker);\n console.error('Failed to post message to worker:', error);\n if ('instance' in task) {\n task.instance.onHighlightError(error);\n } else if ('reject' in task) {\n task.reject(error as Error);\n }\n }\n this.queueBroadcastStateChanges();\n }\n\n private getAvailableWorker(\n langs: SupportedLanguages[]\n ): ManagedWorker | undefined {\n let worker: ManagedWorker | undefined;\n for (const managedWorker of this.workers) {\n if (managedWorker.request_id != null || !managedWorker.initialized) {\n continue;\n }\n worker = managedWorker;\n if (langs.length === 0) {\n break;\n }\n let hasEveryLang = true;\n for (const lang of langs) {\n if (!managedWorker.langs.has(lang)) {\n hasEveryLang = false;\n break;\n }\n }\n if (hasEveryLang) {\n break;\n }\n }\n return worker;\n }\n\n private generateRequestId(): WorkerRequestId {\n return `req_${++this.nextRequestId}`;\n }\n}\n\nfunction getLangsFromTask(task: AllWorkerTasks): SupportedLanguages[] {\n const langs = new Set<SupportedLanguages>();\n if (task.type === 'initialize' || task.type === 'set-render-options') {\n return [];\n }\n switch (task.type) {\n case 'file': {\n langs.add(\n task.request.file.lang ??\n getFiletypeFromFileName(task.request.file.name)\n );\n break;\n }\n case 'diff': {\n langs.add(\n task.request.diff.lang ??\n getFiletypeFromFileName(task.request.diff.name)\n );\n langs.add(\n task.request.diff.lang ??\n getFiletypeFromFileName(task.request.diff.prevName ?? '-')\n );\n break;\n }\n }\n langs.delete('text');\n return Array.from(langs);\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"getOrCreateWorkerPoolSingleton.d.ts","names":[],"sources":["../../src/worker/getOrCreateWorkerPoolSingleton.ts"],"sourcesContent":[],"mappings":";;;;UAQiB,oBAAA;eACF;EADf,kBAAiB,EAEK,iCADP;AAIf;AACE,iBADc,8BAAA,CACd;EAAA,WAAA;EAAA;AAAA,CAAA,EAEC,oBAFD,CAAA,EAEwB,iBAFxB;AACA,iBAYc,4BAAA,CAAA,CAZd,EAAA,IAAA"}
1
+ {"version":3,"file":"getOrCreateWorkerPoolSingleton.d.ts","names":["WorkerInitializationRenderOptions","WorkerPoolOptions","WorkerPoolManager","SetupWorkerPoolProps","getOrCreateWorkerPoolSingleton","poolOptions","highlighterOptions","terminateWorkerPoolSingleton"],"sources":["../../src/worker/getOrCreateWorkerPoolSingleton.d.ts"],"sourcesContent":["import type { WorkerInitializationRenderOptions, WorkerPoolOptions } from './types';\nimport { WorkerPoolManager } from './WorkerPoolManager';\nexport interface SetupWorkerPoolProps {\n poolOptions: WorkerPoolOptions;\n highlighterOptions: WorkerInitializationRenderOptions;\n}\nexport declare function getOrCreateWorkerPoolSingleton({ poolOptions, highlighterOptions }: SetupWorkerPoolProps): WorkerPoolManager;\nexport declare function terminateWorkerPoolSingleton(): void;\n//# sourceMappingURL=getOrCreateWorkerPoolSingleton.d.ts.map"],"mappings":";;;;UAEiBG,oBAAAA;eACAF;EADAE,kBAAAA,EAEOH,iCADPC;AAGjB;AAAyDI,iBAAjCD,8BAAAA,CAAiCC;EAAAA,WAAAA;EAAAA;AAAAA,CAAAA,EAAmCF,oBAAnCE,CAAAA,EAA0DH,iBAA1DG;AAAaC,iBAC9CC,4BAAAA,CAAAA,CAD8CD,EAAAA,IAAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"getOrCreateWorkerPoolSingleton.js","names":["workerPoolSingletone: WorkerPoolManager | undefined"],"sources":["../../src/worker/getOrCreateWorkerPoolSingleton.ts"],"sourcesContent":["import { WorkerPoolManager } from './WorkerPoolManager';\nimport type {\n WorkerInitializationRenderOptions,\n WorkerPoolOptions,\n} from './types';\n\nlet workerPoolSingletone: WorkerPoolManager | undefined;\n\nexport interface SetupWorkerPoolProps {\n poolOptions: WorkerPoolOptions;\n highlighterOptions: WorkerInitializationRenderOptions;\n}\n\nexport function getOrCreateWorkerPoolSingleton({\n poolOptions,\n highlighterOptions,\n}: SetupWorkerPoolProps): WorkerPoolManager {\n if (workerPoolSingletone == null) {\n workerPoolSingletone = new WorkerPoolManager(\n poolOptions,\n highlighterOptions\n );\n void workerPoolSingletone.initialize();\n }\n return workerPoolSingletone;\n}\n\nexport function terminateWorkerPoolSingleton(): void {\n if (workerPoolSingletone == null) {\n return;\n }\n workerPoolSingletone.terminate();\n workerPoolSingletone = undefined;\n}\n"],"mappings":";;;AAMA,IAAIA;AAOJ,SAAgB,+BAA+B,EAC7C,aACA,sBAC0C;AAC1C,KAAI,wBAAwB,MAAM;AAChC,yBAAuB,IAAI,kBACzB,aACA,mBACD;AACD,EAAK,qBAAqB,YAAY;;AAExC,QAAO;;AAGT,SAAgB,+BAAqC;AACnD,KAAI,wBAAwB,KAC1B;AAEF,sBAAqB,WAAW;AAChC,wBAAuB"}
1
+ {"version":3,"file":"getOrCreateWorkerPoolSingleton.js","names":["workerPoolSingletone: WorkerPoolManager | undefined"],"sources":["../../src/worker/getOrCreateWorkerPoolSingleton.ts"],"sourcesContent":["import type {\n WorkerInitializationRenderOptions,\n WorkerPoolOptions,\n} from './types';\nimport { WorkerPoolManager } from './WorkerPoolManager';\n\nlet workerPoolSingletone: WorkerPoolManager | undefined;\n\nexport interface SetupWorkerPoolProps {\n poolOptions: WorkerPoolOptions;\n highlighterOptions: WorkerInitializationRenderOptions;\n}\n\nexport function getOrCreateWorkerPoolSingleton({\n poolOptions,\n highlighterOptions,\n}: SetupWorkerPoolProps): WorkerPoolManager {\n if (workerPoolSingletone == null) {\n workerPoolSingletone = new WorkerPoolManager(\n poolOptions,\n highlighterOptions\n );\n void workerPoolSingletone.initialize();\n }\n return workerPoolSingletone;\n}\n\nexport function terminateWorkerPoolSingleton(): void {\n if (workerPoolSingletone == null) {\n return;\n }\n workerPoolSingletone.terminate();\n workerPoolSingletone = undefined;\n}\n"],"mappings":";;;AAMA,IAAIA;AAOJ,SAAgB,+BAA+B,EAC7C,aACA,sBAC0C;AAC1C,KAAI,wBAAwB,MAAM;AAChC,yBAAuB,IAAI,kBACzB,aACA,mBACD;AACD,EAAK,qBAAqB,YAAY;;AAExC,QAAO;;AAGT,SAAgB,+BAAqC;AACnD,KAAI,wBAAwB,KAC1B;AAEF,sBAAqB,WAAW;AAChC,wBAAuB"}