@pierre/diffs 1.3.0-beta.6 → 1.3.0-beta.8

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 (180) hide show
  1. package/dist/components/CodeView.d.ts +90 -5
  2. package/dist/components/CodeView.d.ts.map +1 -1
  3. package/dist/components/CodeView.js +291 -38
  4. package/dist/components/CodeView.js.map +1 -1
  5. package/dist/components/File.d.ts +1 -0
  6. package/dist/components/File.d.ts.map +1 -1
  7. package/dist/components/File.js +20 -6
  8. package/dist/components/File.js.map +1 -1
  9. package/dist/components/FileDiff.d.ts +38 -23
  10. package/dist/components/FileDiff.d.ts.map +1 -1
  11. package/dist/components/FileDiff.js +144 -61
  12. package/dist/components/FileDiff.js.map +1 -1
  13. package/dist/components/UnresolvedFile.d.ts +3 -2
  14. package/dist/components/UnresolvedFile.d.ts.map +1 -1
  15. package/dist/components/UnresolvedFile.js +4 -2
  16. package/dist/components/UnresolvedFile.js.map +1 -1
  17. package/dist/components/VirtualizedFile.d.ts.map +1 -1
  18. package/dist/components/VirtualizedFile.js +6 -8
  19. package/dist/components/VirtualizedFile.js.map +1 -1
  20. package/dist/components/VirtualizedFileDiff.d.ts +13 -5
  21. package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
  22. package/dist/components/VirtualizedFileDiff.js +192 -55
  23. package/dist/components/VirtualizedFileDiff.js.map +1 -1
  24. package/dist/components/Virtualizer.d.ts +2 -0
  25. package/dist/components/Virtualizer.d.ts.map +1 -1
  26. package/dist/components/Virtualizer.js +16 -3
  27. package/dist/components/Virtualizer.js.map +1 -1
  28. package/dist/constants.d.ts +3 -1
  29. package/dist/constants.d.ts.map +1 -1
  30. package/dist/constants.js +3 -1
  31. package/dist/constants.js.map +1 -1
  32. package/dist/editor/command.d.ts +1 -1
  33. package/dist/editor/command.d.ts.map +1 -1
  34. package/dist/editor/command.js +8 -0
  35. package/dist/editor/command.js.map +1 -1
  36. package/dist/editor/editor.d.ts +10 -3
  37. package/dist/editor/editor.d.ts.map +1 -1
  38. package/dist/editor/editor.js +325 -135
  39. package/dist/editor/editor.js.map +1 -1
  40. package/dist/editor/editor2.js +1 -1
  41. package/dist/editor/lineAnnotations.d.ts.map +1 -1
  42. package/dist/editor/lineAnnotations.js +84 -12
  43. package/dist/editor/lineAnnotations.js.map +1 -1
  44. package/dist/editor/marker.d.ts +5 -3
  45. package/dist/editor/marker.d.ts.map +1 -1
  46. package/dist/editor/marker.js +35 -12
  47. package/dist/editor/marker.js.map +1 -1
  48. package/dist/editor/matchBrackets.d.ts +8 -0
  49. package/dist/editor/matchBrackets.d.ts.map +1 -0
  50. package/dist/editor/matchBrackets.js +146 -0
  51. package/dist/editor/matchBrackets.js.map +1 -0
  52. package/dist/editor/popover.d.ts +45 -0
  53. package/dist/editor/popover.d.ts.map +1 -0
  54. package/dist/editor/popover.js +145 -0
  55. package/dist/editor/popover.js.map +1 -0
  56. package/dist/editor/selection.d.ts +14 -2
  57. package/dist/editor/selection.d.ts.map +1 -1
  58. package/dist/editor/selection.js +142 -41
  59. package/dist/editor/selection.js.map +1 -1
  60. package/dist/editor/selectionAction.d.ts +20 -3
  61. package/dist/editor/selectionAction.d.ts.map +1 -1
  62. package/dist/editor/selectionAction.js +41 -10
  63. package/dist/editor/selectionAction.js.map +1 -1
  64. package/dist/editor/textDocument.d.ts +2 -0
  65. package/dist/editor/textDocument.d.ts.map +1 -1
  66. package/dist/editor/textDocument.js +22 -6
  67. package/dist/editor/textDocument.js.map +1 -1
  68. package/dist/editor/textMeasure.d.ts.map +1 -1
  69. package/dist/editor/textMeasure.js +25 -7
  70. package/dist/editor/textMeasure.js.map +1 -1
  71. package/dist/editor/tokenzier.d.ts +6 -7
  72. package/dist/editor/tokenzier.d.ts.map +1 -1
  73. package/dist/editor/tokenzier.js +83 -34
  74. package/dist/editor/tokenzier.js.map +1 -1
  75. package/dist/editor/utils.d.ts +3 -1
  76. package/dist/editor/utils.d.ts.map +1 -1
  77. package/dist/editor/utils.js +14 -1
  78. package/dist/editor/utils.js.map +1 -1
  79. package/dist/index.d.ts +9 -7
  80. package/dist/index.js +6 -4
  81. package/dist/managers/InteractionManager.d.ts.map +1 -1
  82. package/dist/managers/InteractionManager.js +0 -1
  83. package/dist/managers/InteractionManager.js.map +1 -1
  84. package/dist/managers/ResizeManager.d.ts +10 -2
  85. package/dist/managers/ResizeManager.d.ts.map +1 -1
  86. package/dist/managers/ResizeManager.js +33 -13
  87. package/dist/managers/ResizeManager.js.map +1 -1
  88. package/dist/react/CodeView.d.ts +25 -1
  89. package/dist/react/CodeView.d.ts.map +1 -1
  90. package/dist/react/CodeView.js +76 -17
  91. package/dist/react/CodeView.js.map +1 -1
  92. package/dist/react/EditorContext.d.ts +2 -2
  93. package/dist/react/EditorContext.d.ts.map +1 -1
  94. package/dist/react/EditorContext.js.map +1 -1
  95. package/dist/react/MultiFileDiff.d.ts +3 -4
  96. package/dist/react/MultiFileDiff.d.ts.map +1 -1
  97. package/dist/react/MultiFileDiff.js.map +1 -1
  98. package/dist/react/index.d.ts +2 -2
  99. package/dist/react/utils/useFileDiffInstance.js +14 -15
  100. package/dist/react/utils/useFileDiffInstance.js.map +1 -1
  101. package/dist/renderers/DiffHunksRenderer.d.ts +2 -2
  102. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  103. package/dist/renderers/DiffHunksRenderer.js +45 -23
  104. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  105. package/dist/renderers/FileRenderer.d.ts +2 -1
  106. package/dist/renderers/FileRenderer.d.ts.map +1 -1
  107. package/dist/renderers/FileRenderer.js +58 -38
  108. package/dist/renderers/FileRenderer.js.map +1 -1
  109. package/dist/ssr/index.d.ts +2 -2
  110. package/dist/ssr/preloadDiffs.d.ts +11 -10
  111. package/dist/ssr/preloadDiffs.d.ts.map +1 -1
  112. package/dist/ssr/preloadDiffs.js +14 -6
  113. package/dist/ssr/preloadDiffs.js.map +1 -1
  114. package/dist/types.d.ts +100 -6
  115. package/dist/types.d.ts.map +1 -1
  116. package/dist/utils/applyLineTextWithNewline.d.ts +5 -0
  117. package/dist/utils/applyLineTextWithNewline.d.ts.map +1 -0
  118. package/dist/utils/applyLineTextWithNewline.js +11 -0
  119. package/dist/utils/applyLineTextWithNewline.js.map +1 -0
  120. package/dist/utils/areHunkDataEqual.js +1 -1
  121. package/dist/utils/areHunkDataEqual.js.map +1 -1
  122. package/dist/utils/areManagedSnapshotsEqual.d.ts +2 -2
  123. package/dist/utils/areManagedSnapshotsEqual.d.ts.map +1 -1
  124. package/dist/utils/areManagedSnapshotsEqual.js +5 -0
  125. package/dist/utils/areManagedSnapshotsEqual.js.map +1 -1
  126. package/dist/utils/awaitWithTimeout.d.ts +5 -0
  127. package/dist/utils/awaitWithTimeout.d.ts.map +1 -0
  128. package/dist/utils/awaitWithTimeout.js +15 -0
  129. package/dist/utils/awaitWithTimeout.js.map +1 -0
  130. package/dist/utils/cloneFileDiffMetadata.d.ts +7 -0
  131. package/dist/utils/cloneFileDiffMetadata.d.ts.map +1 -0
  132. package/dist/utils/cloneFileDiffMetadata.js +16 -0
  133. package/dist/utils/cloneFileDiffMetadata.js.map +1 -0
  134. package/dist/utils/computeEstimatedDiffHeights.d.ts +3 -1
  135. package/dist/utils/computeEstimatedDiffHeights.d.ts.map +1 -1
  136. package/dist/utils/computeEstimatedDiffHeights.js +8 -1
  137. package/dist/utils/computeEstimatedDiffHeights.js.map +1 -1
  138. package/dist/utils/createCodeViewHeaderFooterHostElement.d.ts +5 -0
  139. package/dist/utils/createCodeViewHeaderFooterHostElement.d.ts.map +1 -0
  140. package/dist/utils/createCodeViewHeaderFooterHostElement.js +19 -0
  141. package/dist/utils/createCodeViewHeaderFooterHostElement.js.map +1 -0
  142. package/dist/utils/createPreElement.js +0 -1
  143. package/dist/utils/createPreElement.js.map +1 -1
  144. package/dist/utils/getDiffFileInput.d.ts +14 -0
  145. package/dist/utils/getDiffFileInput.d.ts.map +1 -0
  146. package/dist/utils/getDiffFileInput.js +24 -0
  147. package/dist/utils/getDiffFileInput.js.map +1 -0
  148. package/dist/utils/getDiffHunksRendererOptions.js +1 -0
  149. package/dist/utils/getDiffHunksRendererOptions.js.map +1 -1
  150. package/dist/utils/getFiletypeFromFileName.d.ts.map +1 -1
  151. package/dist/utils/getFiletypeFromFileName.js +2 -0
  152. package/dist/utils/getFiletypeFromFileName.js.map +1 -1
  153. package/dist/utils/hydratePartialDiff.d.ts +10 -0
  154. package/dist/utils/hydratePartialDiff.d.ts.map +1 -0
  155. package/dist/utils/hydratePartialDiff.js +140 -0
  156. package/dist/utils/hydratePartialDiff.js.map +1 -0
  157. package/dist/utils/iterateOverDiff.js +3 -3
  158. package/dist/utils/iterateOverDiff.js.map +1 -1
  159. package/dist/utils/parseDiffFromFile.d.ts +1 -1
  160. package/dist/utils/parseDiffFromFile.d.ts.map +1 -1
  161. package/dist/utils/parseDiffFromFile.js +26 -5
  162. package/dist/utils/parseDiffFromFile.js.map +1 -1
  163. package/dist/utils/setWrapperNodeProps.js +0 -1
  164. package/dist/utils/setWrapperNodeProps.js.map +1 -1
  165. package/dist/utils/updateDiffHunks.d.ts +5 -1
  166. package/dist/utils/updateDiffHunks.d.ts.map +1 -1
  167. package/dist/utils/updateDiffHunks.js +48 -4
  168. package/dist/utils/updateDiffHunks.js.map +1 -1
  169. package/dist/worker/WorkerPoolManager.d.ts +7 -2
  170. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  171. package/dist/worker/WorkerPoolManager.js +78 -15
  172. package/dist/worker/WorkerPoolManager.js.map +1 -1
  173. package/dist/worker/index.d.ts +2 -2
  174. package/dist/worker/types.d.ts +7 -1
  175. package/dist/worker/types.d.ts.map +1 -1
  176. package/dist/worker/worker-portable.js +5 -3
  177. package/dist/worker/worker-portable.js.map +1 -1
  178. package/dist/worker/worker.js +5 -3
  179. package/dist/worker/worker.js.map +1 -1
  180. package/package.json +1 -1
@@ -26,6 +26,11 @@ var WorkerPoolTerminatedError = class extends Error {
26
26
  super("WorkerPoolManager: operation canceled because the pool terminated");
27
27
  }
28
28
  };
29
+ var WorkerPoolTaskCanceledError = class extends Error {
30
+ constructor() {
31
+ super("WorkerPoolManager: operation canceled before the task completed");
32
+ }
33
+ };
29
34
  var WorkerPoolManager = class {
30
35
  options;
31
36
  highlighter;
@@ -269,6 +274,7 @@ var WorkerPoolManager = class {
269
274
  }
270
275
  this.initialized = false;
271
276
  this.workersFailed = true;
277
+ for (const task of this.queuedTasks) this.rejectRenderTaskCallbacks(task, normalizeWorkerError(e));
272
278
  this.queueBroadcastStateChanges();
273
279
  reject(e);
274
280
  }
@@ -353,6 +359,11 @@ var WorkerPoolManager = class {
353
359
  });
354
360
  }
355
361
  primeFileHighlightCache(file) {
362
+ if (!this.isWorkingPool()) return Promise.reject(/* @__PURE__ */ new Error("WorkerPoolManager.primeFileHighlightCache: worker pool is not working"));
363
+ const task = this.getOrCreateFileHighlightCacheTask(file);
364
+ return task != null ? this.createRenderTaskCallbacks(task) : Promise.resolve();
365
+ }
366
+ getOrCreateFileHighlightCacheTask(file) {
356
367
  if (file.cacheKey == null) {
357
368
  console.warn(`WorkerPoolManager.primeFileHighlightCache: priming highlight cache requires file.cacheKey; skipping "${file.name}".`);
358
369
  return;
@@ -361,11 +372,16 @@ var WorkerPoolManager = class {
361
372
  const highlightKey = this.getFileHighlightKey(file);
362
373
  if (highlightKey == null || isFilePlainText(file) || cachedResult != null && areFileRenderOptionsEqual(cachedResult.options, this.getFileRenderOptions())) return;
363
374
  const existingTask = this.getTaskByHighlightKey(highlightKey);
364
- if (existingTask != null) existingTask.primeCache = true;
365
- else this.submitCacheTask({
366
- type: "file",
367
- file
368
- }, highlightKey);
375
+ if (existingTask != null) {
376
+ existingTask.primeCache = true;
377
+ return existingTask.type === "file" ? existingTask : void 0;
378
+ } else {
379
+ const task = this.submitCacheTask({
380
+ type: "file",
381
+ file
382
+ }, highlightKey);
383
+ return task.type === "file" ? task : void 0;
384
+ }
369
385
  }
370
386
  getPlainFileAST(file, startingLine, totalLines, lines) {
371
387
  if (this.highlighter == null) {
@@ -388,6 +404,11 @@ var WorkerPoolManager = class {
388
404
  });
389
405
  }
390
406
  primeDiffHighlightCache(diff) {
407
+ if (!this.isWorkingPool()) return Promise.reject(/* @__PURE__ */ new Error("WorkerPoolManager.primeDiffHighlightCache: worker pool is not working"));
408
+ const task = this.getOrCreateDiffHighlightCacheTask(diff);
409
+ return task != null ? this.createRenderTaskCallbacks(task) : Promise.resolve();
410
+ }
411
+ getOrCreateDiffHighlightCacheTask(diff) {
391
412
  if (diff.cacheKey == null) {
392
413
  console.warn(`WorkerPoolManager.primeDiffHighlightCache: priming highlight cache requires diff.cacheKey; skipping "${diff.prevName ?? diff.name}" -> "${diff.name}".`);
393
414
  return;
@@ -396,11 +417,16 @@ var WorkerPoolManager = class {
396
417
  const highlightKey = this.getDiffHighlightKey(diff);
397
418
  if (highlightKey == null || isDiffPlainText(diff) || cachedResult != null && areDiffRenderOptionsEqual(cachedResult.options, this.getDiffRenderOptions())) return;
398
419
  const existingTask = this.getTaskByHighlightKey(highlightKey);
399
- if (existingTask != null) existingTask.primeCache = true;
400
- else this.submitCacheTask({
401
- type: "diff",
402
- diff
403
- }, highlightKey);
420
+ if (existingTask != null) {
421
+ existingTask.primeCache = true;
422
+ return existingTask.type === "diff" ? existingTask : void 0;
423
+ } else {
424
+ const task = this.submitCacheTask({
425
+ type: "diff",
426
+ diff
427
+ }, highlightKey);
428
+ return task.type === "diff" ? task : void 0;
429
+ }
404
430
  }
405
431
  getPlainDiffAST(diff, startingLine, totalLines, expandedHunks, collapsedContextThreshold) {
406
432
  return this.highlighter != null ? renderDiffWithHighlighter(diff, this.highlighter, this.renderOptions, {
@@ -415,6 +441,8 @@ var WorkerPoolManager = class {
415
441
  this.lifecycleGeneration++;
416
442
  this.cancelActiveWorkerTasks();
417
443
  this.terminateWorkers();
444
+ const error = new WorkerPoolTerminatedError();
445
+ for (const task of this.queuedTasks) this.rejectRenderTaskCallbacks(task, error);
418
446
  this.fileCache.clear();
419
447
  this.diffCache.clear();
420
448
  this.activeRequestByInstance.clear();
@@ -438,6 +466,7 @@ var WorkerPoolManager = class {
438
466
  cancelActiveWorkerTasks() {
439
467
  const error = new WorkerPoolTerminatedError();
440
468
  for (const task of this.activeTaskById.values()) if ("reject" in task) task.reject(error);
469
+ else if (isRenderTask(task)) this.rejectRenderTaskCallbacks(task, error);
441
470
  }
442
471
  terminateWorkers() {
443
472
  for (const managedWorker of this.workers) managedWorker.worker.terminate();
@@ -486,6 +515,7 @@ var WorkerPoolManager = class {
486
515
  instances: /* @__PURE__ */ new Set([instance]),
487
516
  primeCache: false,
488
517
  highlightKey,
518
+ callbacks: /* @__PURE__ */ new Set(),
489
519
  renderOptionsVersion,
490
520
  requestStart
491
521
  };
@@ -499,6 +529,7 @@ var WorkerPoolManager = class {
499
529
  instances: /* @__PURE__ */ new Set([instance]),
500
530
  primeCache: false,
501
531
  highlightKey,
532
+ callbacks: /* @__PURE__ */ new Set(),
502
533
  renderOptionsVersion,
503
534
  requestStart
504
535
  };
@@ -523,6 +554,7 @@ var WorkerPoolManager = class {
523
554
  instances: /* @__PURE__ */ new Set(),
524
555
  primeCache: true,
525
556
  highlightKey,
557
+ callbacks: /* @__PURE__ */ new Set(),
526
558
  renderOptionsVersion,
527
559
  requestStart
528
560
  };
@@ -536,12 +568,14 @@ var WorkerPoolManager = class {
536
568
  instances: /* @__PURE__ */ new Set(),
537
569
  primeCache: true,
538
570
  highlightKey,
571
+ callbacks: /* @__PURE__ */ new Set(),
539
572
  renderOptionsVersion,
540
573
  requestStart
541
574
  };
542
575
  }
543
576
  })();
544
577
  this.enqueueRenderTask(task);
578
+ return task;
545
579
  }
546
580
  enqueueRenderTask(task, instance) {
547
581
  this.queuedTasks.push(task);
@@ -563,7 +597,8 @@ var WorkerPoolManager = class {
563
597
  return;
564
598
  }
565
599
  this.executeTask(availableWorker, task);
566
- } catch {
600
+ } catch (error) {
601
+ this.rejectRenderTaskCallbacks(task, normalizeWorkerError(error));
567
602
  this.cleanWorkerAndTask(availableWorker, task);
568
603
  this.queueBroadcastStateChanges();
569
604
  if (this.queuedTasks.length > 0) this.queueDrain();
@@ -577,8 +612,10 @@ var WorkerPoolManager = class {
577
612
  const error = new Error(response.error);
578
613
  if (response.stack) error.stack = response.stack;
579
614
  if ("reject" in task) task.reject(error);
580
- else if (isRenderTask(task)) this.notifyHighlightError(task, error);
581
- else throw new Error("handleWorkerMessage: unknown task type");
615
+ else if (isRenderTask(task)) {
616
+ this.notifyHighlightError(task, error);
617
+ this.rejectRenderTaskCallbacks(task, error);
618
+ } else throw new Error("handleWorkerMessage: unknown task type");
582
619
  throw error;
583
620
  } else switch (response.requestType) {
584
621
  case "initialize":
@@ -600,6 +637,7 @@ var WorkerPoolManager = class {
600
637
  result,
601
638
  options
602
639
  });
640
+ this.resolveRenderTaskCallbacks(task);
603
641
  this.notifyFileInstances(task, result, options);
604
642
  break;
605
643
  }
@@ -613,6 +651,7 @@ var WorkerPoolManager = class {
613
651
  result,
614
652
  options
615
653
  });
654
+ this.resolveRenderTaskCallbacks(task);
616
655
  this.notifyDiffInstances(task, result, options);
617
656
  break;
618
657
  }
@@ -643,6 +682,7 @@ var WorkerPoolManager = class {
643
682
  if (managedWorker.pendingSetupRequestId === requestId) managedWorker.pendingSetupRequestId = void 0;
644
683
  if (task != null) {
645
684
  if (isRenderTask(task)) {
685
+ this.rejectRenderTaskCallbacks(task, new WorkerPoolTaskCanceledError());
646
686
  this.clearInstanceRequests(task);
647
687
  this.clearHighlightKey(task);
648
688
  }
@@ -657,8 +697,10 @@ var WorkerPoolManager = class {
657
697
  managedWorker.worker.postMessage(task.request);
658
698
  } catch (error) {
659
699
  console.error("Failed to post message to worker:", error);
660
- if (isRenderTask(task)) this.notifyHighlightError(task, error);
661
- else if ("reject" in task) task.reject(error);
700
+ if (isRenderTask(task)) {
701
+ this.notifyHighlightError(task, error);
702
+ this.rejectRenderTaskCallbacks(task, normalizeWorkerError(error));
703
+ } else if ("reject" in task) task.reject(error);
662
704
  this.cleanWorkerAndTask(managedWorker, task);
663
705
  if (this.queuedTasks.length > 0) this.queueDrain();
664
706
  }
@@ -728,14 +770,32 @@ var WorkerPoolManager = class {
728
770
  removeQueuedTask(task) {
729
771
  const index = this.queuedTasks.indexOf(task);
730
772
  if (index !== -1) this.queuedTasks.splice(index, 1);
773
+ this.rejectRenderTaskCallbacks(task, new WorkerPoolTaskCanceledError());
731
774
  this.clearQueuedInstanceRequests(task);
732
775
  this.clearHighlightKey(task);
733
776
  }
734
777
  removeActiveTask(task) {
778
+ this.rejectRenderTaskCallbacks(task, new WorkerPoolTaskCanceledError());
735
779
  this.clearInstanceRequests(task);
736
780
  this.clearHighlightKey(task);
737
781
  this.activeTaskById.delete(task.id);
738
782
  }
783
+ createRenderTaskCallbacks(task) {
784
+ return new Promise((resolve, reject) => {
785
+ task.callbacks.add({
786
+ resolve,
787
+ reject
788
+ });
789
+ });
790
+ }
791
+ resolveRenderTaskCallbacks(task) {
792
+ for (const callbacks of task.callbacks) callbacks.resolve();
793
+ task.callbacks.clear();
794
+ }
795
+ rejectRenderTaskCallbacks(task, error) {
796
+ for (const callbacks of task.callbacks) callbacks.reject(error);
797
+ task.callbacks.clear();
798
+ }
739
799
  invalidateRenderTasks() {
740
800
  for (let index = this.queuedTasks.length - 1; index >= 0; index--) {
741
801
  const task = this.queuedTasks[index];
@@ -811,6 +871,9 @@ function isRenderTask(task) {
811
871
  function getInstances(task) {
812
872
  return task.instances;
813
873
  }
874
+ function normalizeWorkerError(error) {
875
+ return error instanceof Error ? error : new Error(String(error));
876
+ }
814
877
  //#endregion
815
878
  export { WorkerPoolManager };
816
879
 
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerPoolManager.js","names":[],"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 HighlighterTypes,\n HunkExpansionRegion,\n RenderDiffOptions,\n RenderDiffResult,\n RenderFileOptions,\n RenderFileResult,\n SupportedLanguages,\n ThemedDiffResult,\n ThemedFileResult,\n ThemeRegistrationResolved,\n} from '../types';\nimport { areDiffRenderOptionsEqual } from '../utils/areDiffRenderOptionsEqual';\nimport { areDiffTargetsEqual } from '../utils/areDiffTargetsEqual';\nimport { areFileRenderOptionsEqual } from '../utils/areFileRenderOptionsEqual';\nimport { areFilesEqual } from '../utils/areFilesEqual';\nimport { areThemesEqual } from '../utils/areThemesEqual';\nimport {\n getCustomExtensionsMap,\n getCustomExtensionsVersion,\n getFiletypeFromFileName,\n} from '../utils/getFiletypeFromFileName';\nimport { getThemes } from '../utils/getThemes';\nimport { isDiffPlainText } from '../utils/isDiffPlainText';\nimport { isFilePlainText } from '../utils/isFilePlainText';\nimport { renderDiffWithHighlighter } from '../utils/renderDiffWithHighlighter';\nimport { renderFileWithHighlighter } from '../utils/renderFileWithHighlighter';\nimport type {\n AllWorkerTasks,\n DiffRendererInstance,\n FileRendererInstance,\n InitializeWorkerRequest,\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\nclass WorkerPoolTerminatedError extends Error {\n constructor() {\n super('WorkerPoolManager: operation canceled because the pool terminated');\n }\n}\n\ninterface GetCachesResult {\n fileCache: LRUMapPkg.LRUMap<string, RenderFileResult>;\n diffCache: LRUMapPkg.LRUMap<string, RenderDiffResult>;\n}\n\ninterface ManagedWorker {\n worker: Worker;\n requestId: string | undefined;\n pendingSetupRequestId: WorkerRequestId | undefined;\n initialized: boolean;\n langs: Set<SupportedLanguages>;\n customExtensionsVersion: number;\n}\n\ninterface ThemeSubscriber {\n onThemeChange(): void;\n}\n\ntype RenderTask = RenderFileTask | RenderDiffTask;\n\ntype RenderTaskInstance = FileRendererInstance | DiffRendererInstance;\n\nexport class WorkerPoolManager {\n private highlighter: DiffsHighlighter | undefined;\n private readonly preferredHighlighter: HighlighterTypes;\n private renderOptions: WorkerRenderingOptions;\n private renderOptionsRequestVersion = 0;\n private renderOptionsVersion = 0;\n private initialized: Promise<void> | boolean = false;\n private workers: ManagedWorker[] = [];\n // Tasks that are waiting to get processed by a worker\n private queuedTasks: RenderTask[] = [];\n private queuedTaskByInstance = new Map<RenderTaskInstance, RenderTask>();\n\n // Tasks that map to highlightKey are essentially singular, so we only\n // need one map to include queued and active\n private taskByHighlightKey = new Map<string, RenderTask>();\n\n // Tasks that have already been sent to a worker and are awaiting a response.\n private activeTaskById = new Map<WorkerRequestId, AllWorkerTasks>();\n private activeRequestByInstance = new Map<\n RenderTaskInstance,\n WorkerRequestId\n >();\n\n private nextRequestId = 0;\n private themeSubscribers = new Set<ThemeSubscriber>();\n private workersFailed = false;\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 // Incremented on terminate so async lifecycle work can identify stale results.\n private lifecycleGeneration = 0;\n\n constructor(\n private options: WorkerPoolOptions,\n {\n langs,\n theme = DEFAULT_THEMES,\n useTokenTransformer = false,\n lineDiffType = 'word-alt',\n maxLineDiffLength = 1000,\n tokenizeMaxLineLength = 1000,\n preferredHighlighter = 'shiki-js',\n }: WorkerInitializationRenderOptions\n ) {\n this.preferredHighlighter = preferredHighlighter;\n this.renderOptions = {\n theme,\n useTokenTransformer,\n lineDiffType,\n maxLineDiffLength,\n tokenizeMaxLineLength,\n };\n this.fileCache = new LRUMapPkg.LRUMap(options.totalASTLRUCacheSize ?? 100);\n this.diffCache = new LRUMapPkg.LRUMap(options.totalASTLRUCacheSize ?? 100);\n this.queueInitialization(langs);\n }\n\n public isWorkingPool(): boolean {\n return !this.workersFailed;\n }\n\n public getFileResultCache(file: FileContents): RenderFileResult | undefined {\n return file.cacheKey != null\n ? this.fileCache.get(file.cacheKey)\n : undefined;\n }\n\n public getDiffResultCache(\n diff: FileDiffMetadata\n ): RenderDiffResult | undefined {\n return diff.cacheKey != null\n ? this.diffCache.get(diff.cacheKey)\n : undefined;\n }\n\n public inspectCaches(): GetCachesResult {\n const { fileCache, diffCache } = this;\n return { fileCache, diffCache };\n }\n\n public evictFileFromCache(cacheKey: string): boolean {\n try {\n return this.fileCache.delete(cacheKey) !== undefined;\n } finally {\n this.queueBroadcastStateChanges();\n }\n }\n\n public 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 = this.renderOptions.theme ?? DEFAULT_THEMES,\n useTokenTransformer = this.renderOptions.useTokenTransformer ?? false,\n lineDiffType = this.renderOptions.lineDiffType ?? 'word-alt',\n maxLineDiffLength = this.renderOptions.maxLineDiffLength ?? 1000,\n tokenizeMaxLineLength = this.renderOptions.tokenizeMaxLineLength ?? 1000,\n }: Partial<WorkerRenderingOptions>): Promise<void> {\n const { lifecycleGeneration } = this;\n const renderOptionsRequestVersion = ++this.renderOptionsRequestVersion;\n const isCurrentRequest = (): boolean =>\n this.isCurrentLifecycle(lifecycleGeneration) &&\n this.renderOptionsRequestVersion === renderOptionsRequestVersion;\n try {\n const newRenderOptions: WorkerRenderingOptions = {\n theme,\n useTokenTransformer,\n lineDiffType,\n maxLineDiffLength,\n tokenizeMaxLineLength,\n };\n if (!this.isInitialized()) {\n await this.initialize();\n }\n if (\n !isCurrentRequest() ||\n areDiffRenderOptionsEqual(newRenderOptions, this.renderOptions)\n ) {\n return;\n }\n\n const themeNames = getThemes(theme);\n let resolvedThemes: ThemeRegistrationResolved[] = [];\n if (!areThemesEqual(newRenderOptions.theme, this.renderOptions.theme)) {\n if (hasResolvedThemes(themeNames)) {\n resolvedThemes = getResolvedThemes(themeNames);\n } else {\n resolvedThemes = await resolveThemes(themeNames);\n }\n }\n\n if (!isCurrentRequest()) {\n return;\n }\n\n if (this.highlighter != null) {\n attachResolvedThemes(resolvedThemes, this.highlighter);\n } else {\n const highlighter = await getSharedHighlighter({\n themes: themeNames,\n langs: ['text'],\n preferredHighlighter: this.preferredHighlighter,\n });\n if (!isCurrentRequest()) {\n return;\n }\n this.highlighter = highlighter;\n }\n\n const workerSetup = this.setRenderOptionsOnWorkers(\n newRenderOptions,\n resolvedThemes\n );\n\n this.renderOptions = newRenderOptions;\n this.renderOptionsVersion++;\n this.diffCache.clear();\n this.fileCache.clear();\n this.invalidateRenderTasks();\n\n for (const instance of this.themeSubscribers) {\n instance.onThemeChange();\n }\n\n await workerSetup;\n } catch (error) {\n if (error instanceof WorkerPoolTerminatedError || !isCurrentRequest()) {\n return;\n }\n throw error;\n }\n }\n\n public getFileRenderOptions(): RenderFileOptions {\n const { tokenizeMaxLineLength, theme, useTokenTransformer } =\n this.renderOptions;\n return { theme, useTokenTransformer, tokenizeMaxLineLength };\n }\n\n public 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 // Render-option updates are posted immediately, but the worker stays\n // unavailable for new render work until it acknowledges this message.\n this.activeTaskById.set(id, task);\n managedWorker.pendingSetupRequestId = id;\n managedWorker.worker.postMessage(task.request);\n })\n );\n }\n await Promise.all(taskPromises);\n }\n\n public 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 public unsubscribeToThemeChanges(instance: ThemeSubscriber): void {\n this.themeSubscribers.delete(instance);\n this.queueBroadcastStateChanges();\n }\n\n public 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 public cleanUpTasks(instance: RenderTaskInstance): void {\n this.detachInstanceFromQueuedTasks(instance);\n const requestId = this.activeRequestByInstance.get(instance);\n if (requestId != null) {\n const task = this.activeTaskById.get(requestId);\n if (isRenderTask(task)) {\n this.detachInstanceFromRenderTask(task, instance);\n if (!task.primeCache && task.instances.size === 0) {\n this.removeActiveTask(task);\n }\n } else {\n this.activeTaskById.delete(requestId);\n }\n }\n this.activeRequestByInstance.delete(instance);\n this.queueBroadcastStateChanges();\n }\n\n public isInitialized(): boolean {\n return this.initialized === true;\n }\n\n public async initialize(languages: SupportedLanguages[] = []): Promise<void> {\n if (this.initialized === true) {\n return;\n } else if (this.initialized === false) {\n const { lifecycleGeneration } = this;\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 if (!this.isCurrentLifecycle(lifecycleGeneration)) {\n resolve();\n return;\n }\n\n let resolvedLanguages: ResolvedLanguage[] = [];\n if (hasResolvedLanguages(languages)) {\n resolvedLanguages = getResolvedLanguages(languages);\n } else {\n resolvedLanguages = await resolveLanguages(languages);\n }\n if (!this.isCurrentLifecycle(lifecycleGeneration)) {\n resolve();\n return;\n }\n\n const [highlighter] = await Promise.all([\n getSharedHighlighter({\n themes,\n langs: ['text', ...languages],\n preferredHighlighter: this.preferredHighlighter,\n }),\n this.initializeWorkers(resolvedThemes, resolvedLanguages),\n ]);\n\n if (!this.isCurrentLifecycle(lifecycleGeneration)) {\n this.terminateWorkers();\n resolve();\n return;\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 if (\n e instanceof WorkerPoolTerminatedError ||\n !this.isCurrentLifecycle(lifecycleGeneration)\n ) {\n resolve();\n return;\n }\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 const customExtensionVersion = getCustomExtensionsVersion();\n const customExtensionMap =\n customExtensionVersion > 0 ? getCustomExtensionsMap() : undefined;\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 requestId: undefined,\n pendingSetupRequestId: undefined,\n initialized: false,\n langs: new Set(['text', ...resolvedLanguages.map(({ name }) => name)]),\n customExtensionsVersion: 0,\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 preferredHighlighter: this.preferredHighlighter,\n resolvedThemes,\n resolvedLanguages,\n customExtensionsVersion:\n customExtensionMap != null ? customExtensionVersion : undefined,\n customExtensionMap,\n },\n resolve() {\n managedWorker.initialized = true;\n resolve();\n },\n reject,\n requestStart: Date.now(),\n };\n this.activeTaskById.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.queuedTasks.length === 0) {\n return;\n }\n for (let i = 0; i < this.queuedTasks.length; ) {\n const task = this.queuedTasks[i];\n // If any instance has a request in progress, we should wait for it to\n // finish before starting work that would notify that instance.\n if (this.hasActiveRequest(task)) {\n i++;\n continue;\n }\n const langs = getLangsFromTask(task);\n const availableWorker = this.getAvailableWorker(langs);\n if (availableWorker == null) {\n break;\n }\n this.queuedTasks.splice(i, 1);\n this.assignWorkerToTask(task, availableWorker);\n void this.resolveLanguagesAndExecuteTask(availableWorker, task, langs);\n }\n this.queueBroadcastStateChanges();\n };\n\n public highlightFileAST(\n instance: FileRendererInstance,\n file: FileContents\n ): void {\n const cachedResult = this.getFileResultCache(file);\n // If we've already highlighted the file or it's plain text, we should not\n // attempt to highlight. This should be mostly never hit, but it's just an\n // extra level of safety\n if (\n isFilePlainText(file) ||\n (cachedResult != null &&\n areFileRenderOptionsEqual(\n cachedResult.options,\n this.getFileRenderOptions()\n ))\n ) {\n return;\n }\n if (!this.hasMatchingFileInstanceTask(instance, file)) {\n this.submitTask(instance, { type: 'file', file });\n }\n }\n\n public primeFileHighlightCache(file: FileContents): void {\n if (file.cacheKey == null) {\n console.warn(\n `WorkerPoolManager.primeFileHighlightCache: priming highlight cache requires file.cacheKey; skipping \"${file.name}\".`\n );\n return;\n }\n const cachedResult = this.getFileResultCache(file);\n const highlightKey = this.getFileHighlightKey(file);\n if (\n highlightKey == null ||\n isFilePlainText(file) ||\n (cachedResult != null &&\n areFileRenderOptionsEqual(\n cachedResult.options,\n this.getFileRenderOptions()\n ))\n ) {\n return;\n }\n const existingTask = this.getTaskByHighlightKey(highlightKey);\n if (existingTask != null) {\n existingTask.primeCache = true;\n } else {\n this.submitCacheTask({ type: 'file', file }, highlightKey);\n }\n }\n\n public getPlainFileAST(\n file: FileContents,\n startingLine: number,\n totalLines: number,\n lines?: string[]\n ): ThemedFileResult | undefined {\n if (this.highlighter == null) {\n this.queueInitialization();\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 public highlightDiffAST(\n instance: DiffRendererInstance,\n diff: FileDiffMetadata\n ): void {\n const cachedResult = this.getDiffResultCache(diff);\n // If we've already highlighted the diff or it's plain text, we should not\n // attempt to highlight. This should be mostly never hit, but it's just an\n // extra level of safety\n if (\n isDiffPlainText(diff) ||\n (cachedResult != null &&\n areDiffRenderOptionsEqual(\n cachedResult.options,\n this.getDiffRenderOptions()\n ))\n ) {\n return;\n }\n if (!this.hasMatchingDiffInstanceTask(instance, diff)) {\n this.submitTask(instance, { type: 'diff', diff });\n }\n }\n\n public primeDiffHighlightCache(diff: FileDiffMetadata): void {\n if (diff.cacheKey == null) {\n console.warn(\n `WorkerPoolManager.primeDiffHighlightCache: priming highlight cache requires diff.cacheKey; skipping \"${diff.prevName ?? diff.name}\" -> \"${diff.name}\".`\n );\n return;\n }\n const cachedResult = this.getDiffResultCache(diff);\n const highlightKey = this.getDiffHighlightKey(diff);\n if (\n highlightKey == null ||\n isDiffPlainText(diff) ||\n (cachedResult != null &&\n areDiffRenderOptionsEqual(\n cachedResult.options,\n this.getDiffRenderOptions()\n ))\n ) {\n return;\n }\n const existingTask = this.getTaskByHighlightKey(highlightKey);\n if (existingTask != null) {\n existingTask.primeCache = true;\n } else {\n this.submitCacheTask({ type: 'diff', diff }, highlightKey);\n }\n }\n\n public 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 public terminate(): void {\n this.lifecycleGeneration++;\n this.cancelActiveWorkerTasks();\n this.terminateWorkers();\n this.fileCache.clear();\n this.diffCache.clear();\n this.activeRequestByInstance.clear();\n this.queuedTasks.length = 0;\n this.queuedTaskByInstance.clear();\n this.taskByHighlightKey.clear();\n this.activeTaskById.clear();\n this.highlighter = undefined;\n this.initialized = false;\n this.workersFailed = false;\n this.queueBroadcastStateChanges();\n }\n\n private isCurrentLifecycle(lifecycleGeneration: number): boolean {\n return this.lifecycleGeneration === lifecycleGeneration;\n }\n\n private queueInitialization(languages?: SupportedLanguages[]): void {\n void this.initialize(languages).catch((error) => {\n console.error(error);\n });\n }\n\n private cancelActiveWorkerTasks(): void {\n const error = new WorkerPoolTerminatedError();\n for (const task of this.activeTaskById.values()) {\n if ('reject' in task) {\n task.reject(error);\n }\n }\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 public 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(\n (w) => w.requestId != null || w.pendingSetupRequestId != null\n ).length,\n queuedTasks: this.queuedTasks.length,\n activeTasks: this.activeTaskById.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 this.queueInitialization();\n }\n\n const highlightKey = this.getHighlightKeyForRequest(request);\n const existingTask =\n highlightKey != null\n ? this.getTaskByHighlightKey(highlightKey)\n : undefined;\n if (existingTask != null) {\n this.detachInstanceFromQueuedTasks(instance, existingTask);\n this.addInstanceToTask(existingTask, instance);\n this.queueBroadcastStateChanges();\n return;\n }\n\n this.detachInstanceFromQueuedTasks(instance);\n const id = this.generateRequestId();\n const requestStart = Date.now();\n const { renderOptionsVersion } = this;\n const task: RenderTask = (() => {\n switch (request.type) {\n case 'file':\n return {\n type: 'file',\n id,\n request: { ...request, id },\n instances: new Set([instance as FileRendererInstance]),\n primeCache: false,\n highlightKey,\n renderOptionsVersion,\n requestStart,\n };\n case 'diff':\n return {\n type: 'diff',\n id,\n request: { ...request, id },\n instances: new Set([instance as DiffRendererInstance]),\n primeCache: false,\n highlightKey,\n renderOptionsVersion,\n requestStart,\n };\n }\n })();\n this.enqueueRenderTask(task, instance);\n }\n\n private submitCacheTask(request: SubmitRequest, highlightKey: string): void {\n if (this.initialized === false) {\n this.queueInitialization();\n }\n const id = this.generateRequestId();\n const requestStart = Date.now();\n const { renderOptionsVersion } = this;\n const task: RenderTask = (() => {\n switch (request.type) {\n case 'file':\n return {\n type: 'file',\n id,\n request: { ...request, id },\n instances: new Set<FileRendererInstance>(),\n primeCache: true,\n highlightKey,\n renderOptionsVersion,\n requestStart,\n };\n case 'diff':\n return {\n type: 'diff',\n id,\n request: { ...request, id },\n instances: new Set<DiffRendererInstance>(),\n primeCache: true,\n highlightKey,\n renderOptionsVersion,\n requestStart,\n };\n }\n })();\n this.enqueueRenderTask(task);\n }\n\n private enqueueRenderTask(\n task: RenderTask,\n instance?: RenderTaskInstance\n ): void {\n this.queuedTasks.push(task);\n if (instance != null) {\n this.queuedTaskByInstance.set(instance, task);\n }\n if (task.highlightKey != null) {\n this.taskByHighlightKey.set(task.highlightKey, task);\n }\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 // If the task has been cleaned up after awaiting language resolving,\n // lets fully clean it up\n if (!this.activeTaskById.has(task.id)) {\n if (availableWorker.requestId === task.id) {\n this.cleanWorkerAndTask(availableWorker, task);\n this.queueBroadcastStateChanges();\n if (this.queuedTasks.length > 0) {\n this.queueDrain();\n }\n }\n return;\n }\n this.executeTask(availableWorker, task);\n } catch {\n this.cleanWorkerAndTask(availableWorker, task);\n this.queueBroadcastStateChanges();\n if (this.queuedTasks.length > 0) {\n this.queueDrain();\n }\n }\n }\n\n private handleWorkerMessage(\n managedWorker: ManagedWorker,\n response: WorkerResponse\n ): void {\n const task = this.activeTaskById.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 if (isRenderTask(task)) {\n this.notifyHighlightError(task, error);\n } else {\n throw new Error('handleWorkerMessage: unknown task type');\n }\n throw error;\n } else {\n switch (response.requestType) {\n case 'initialize':\n if (task.type !== 'initialize') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n this.syncCustomExtensionVersion(managedWorker, task.request);\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 if (\n !this.isCurrentRenderTask(task) ||\n !areFileRenderOptionsEqual(options, this.getFileRenderOptions())\n ) {\n throw IGNORE_RESPONSE;\n }\n const { request } = task;\n this.syncCustomExtensionVersion(managedWorker, request);\n if (request.file.cacheKey != null) {\n this.fileCache.set(request.file.cacheKey, { result, options });\n }\n this.notifyFileInstances(task, 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 if (\n !this.isCurrentRenderTask(task) ||\n !areDiffRenderOptionsEqual(options, this.getDiffRenderOptions())\n ) {\n throw IGNORE_RESPONSE;\n }\n const { request } = task;\n this.syncCustomExtensionVersion(managedWorker, request);\n if (request.diff.cacheKey != null) {\n this.diffCache.set(request.diff.cacheKey, { result, options });\n }\n this.notifyDiffInstances(task, 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 this.cleanWorkerAndTask(managedWorker, task, response.id);\n this.queueBroadcastStateChanges();\n if (this.queuedTasks.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 this.queueBroadcastStateChanges();\n }\n\n private assignWorkerToTask(\n task: AllWorkerTasks,\n managedWorker: ManagedWorker\n ) {\n managedWorker.requestId = task.id;\n if (isRenderTask(task)) {\n this.clearQueuedInstanceRequests(task);\n this.trackInstanceRequests(task);\n }\n this.activeTaskById.set(task.id, task);\n }\n\n private cleanWorkerAndTask(\n managedWorker: ManagedWorker,\n task?: AllWorkerTasks,\n requestId: WorkerRequestId | undefined = task?.id\n ) {\n if (managedWorker.requestId === requestId) {\n managedWorker.requestId = undefined;\n }\n if (managedWorker.pendingSetupRequestId === requestId) {\n managedWorker.pendingSetupRequestId = undefined;\n }\n if (task != null) {\n if (isRenderTask(task)) {\n this.clearInstanceRequests(task);\n this.clearHighlightKey(task);\n }\n this.activeTaskById.delete(task.id);\n }\n }\n\n private executeTask(\n managedWorker: ManagedWorker,\n task: AllWorkerTasks\n ): void {\n if (shouldSyncCustomExtensions(task.request)) {\n this.maybeAttachCustomExtensions(managedWorker, task.request);\n }\n if (!this.activeTaskById.has(task.id)) {\n this.assignWorkerToTask(task, managedWorker);\n }\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 console.error('Failed to post message to worker:', error);\n if (isRenderTask(task)) {\n this.notifyHighlightError(task, error);\n } else if ('reject' in task) {\n task.reject(error as Error);\n }\n this.cleanWorkerAndTask(managedWorker, task);\n if (this.queuedTasks.length > 0) {\n this.queueDrain();\n }\n }\n this.queueBroadcastStateChanges();\n }\n\n private maybeAttachCustomExtensions(\n managedWorker: ManagedWorker,\n request: InitializeWorkerRequest | RenderFileRequest | RenderDiffRequest\n ): void {\n if (request.customExtensionsVersion != null) {\n return;\n }\n const version = getCustomExtensionsVersion();\n if (managedWorker.customExtensionsVersion >= version) {\n return;\n }\n request.customExtensionsVersion = version;\n request.customExtensionMap = getCustomExtensionsMap();\n }\n\n private syncCustomExtensionVersion(\n managedWorker: ManagedWorker,\n request: InitializeWorkerRequest | RenderFileRequest | RenderDiffRequest\n ): void {\n if (request.customExtensionsVersion == null) {\n return;\n }\n managedWorker.customExtensionsVersion = request.customExtensionsVersion;\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 (\n managedWorker.requestId != null ||\n managedWorker.pendingSetupRequestId != null ||\n !managedWorker.initialized\n ) {\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 getFileHighlightKey(file: FileContents): string | undefined {\n if (file.cacheKey == null) {\n return undefined;\n }\n return `file:${file.cacheKey}:${this.renderOptionsVersion}`;\n }\n\n private getDiffHighlightKey(diff: FileDiffMetadata): string | undefined {\n if (diff.cacheKey == null) {\n return undefined;\n }\n return `diff:${diff.cacheKey}:${this.renderOptionsVersion}`;\n }\n\n private getHighlightKeyForRequest(\n request: SubmitRequest\n ): string | undefined {\n switch (request.type) {\n case 'file':\n return this.getFileHighlightKey(request.file);\n case 'diff':\n return this.getDiffHighlightKey(request.diff);\n }\n }\n\n private hasActiveRequest(task: RenderTask): boolean {\n for (const instance of getInstances(task)) {\n if (this.activeRequestByInstance.has(instance)) {\n return true;\n }\n }\n return false;\n }\n\n private addInstanceToTask(\n task: RenderTask,\n instance: FileRendererInstance | DiffRendererInstance\n ): void {\n if (task.type === 'file') {\n task.instances.add(instance as FileRendererInstance);\n } else {\n task.instances.add(instance as DiffRendererInstance);\n }\n if (this.activeTaskById.has(task.id)) {\n this.activeRequestByInstance.set(instance, task.id);\n } else {\n this.queuedTaskByInstance.set(instance, task);\n }\n }\n\n private detachInstanceFromQueuedTasks(\n instance: RenderTaskInstance,\n exceptTask?: RenderTask\n ): void {\n const task = this.queuedTaskByInstance.get(instance);\n if (task == null || task === exceptTask) {\n return;\n }\n this.queuedTaskByInstance.delete(instance);\n this.detachInstanceFromRenderTask(task, instance);\n if (!task.primeCache && task.instances.size === 0) {\n this.removeQueuedTask(task);\n }\n }\n\n private detachInstanceFromRenderTask(\n task: RenderTask,\n instance: RenderTaskInstance\n ): void {\n if (task.type === 'file') {\n task.instances.delete(instance as FileRendererInstance);\n } else {\n task.instances.delete(instance as DiffRendererInstance);\n }\n }\n\n private removeQueuedTask(task: RenderTask): void {\n const index = this.queuedTasks.indexOf(task);\n if (index !== -1) {\n this.queuedTasks.splice(index, 1);\n }\n this.clearQueuedInstanceRequests(task);\n this.clearHighlightKey(task);\n }\n\n private removeActiveTask(task: RenderTask): void {\n this.clearInstanceRequests(task);\n this.clearHighlightKey(task);\n this.activeTaskById.delete(task.id);\n }\n\n private invalidateRenderTasks(): void {\n for (let index = this.queuedTasks.length - 1; index >= 0; index--) {\n const task = this.queuedTasks[index];\n if (task.renderOptionsVersion !== this.renderOptionsVersion) {\n this.removeQueuedTask(task);\n }\n }\n\n for (const task of Array.from(this.activeTaskById.values())) {\n if (\n isRenderTask(task) &&\n task.renderOptionsVersion !== this.renderOptionsVersion\n ) {\n this.removeActiveTask(task);\n }\n }\n }\n\n private clearQueuedInstanceRequests(task: RenderTask): void {\n for (const instance of getInstances(task)) {\n if (this.queuedTaskByInstance.get(instance) === task) {\n this.queuedTaskByInstance.delete(instance);\n }\n }\n }\n\n private clearHighlightKey(task: RenderTask): void {\n if (\n task.highlightKey != null &&\n this.taskByHighlightKey.get(task.highlightKey) === task\n ) {\n this.taskByHighlightKey.delete(task.highlightKey);\n }\n }\n\n private trackInstanceRequests(task: RenderTask): void {\n for (const instance of getInstances(task)) {\n this.activeRequestByInstance.set(instance, task.id);\n }\n }\n\n private clearInstanceRequests(task: RenderTask): void {\n for (const instance of getInstances(task)) {\n if (this.activeRequestByInstance.get(instance) === task.id) {\n this.activeRequestByInstance.delete(instance);\n }\n }\n }\n\n private notifyFileInstances(\n task: RenderFileTask,\n result: ThemedFileResult,\n options: RenderFileOptions\n ): void {\n for (const instance of task.instances) {\n if (this.activeRequestByInstance.get(instance) === task.id) {\n instance.onHighlightSuccess(task.request.file, result, options);\n }\n }\n }\n\n private notifyDiffInstances(\n task: RenderDiffTask,\n result: ThemedDiffResult,\n options: RenderDiffOptions\n ): void {\n for (const instance of task.instances) {\n if (this.activeRequestByInstance.get(instance) === task.id) {\n instance.onHighlightSuccess(task.request.diff, result, options);\n }\n }\n }\n\n private notifyHighlightError(task: RenderTask, error: unknown): void {\n for (const instance of getInstances(task)) {\n if (this.activeRequestByInstance.get(instance) === task.id) {\n instance.onHighlightError(error);\n }\n }\n }\n\n private hasMatchingFileInstanceTask(\n instance: FileRendererInstance,\n file: FileContents\n ): boolean {\n for (const task of this.iterateRenderTasks()) {\n if (\n task.type === 'file' &&\n this.isCurrentRenderTask(task) &&\n task.instances.has(instance) &&\n areFilesEqual(file, task.request.file)\n ) {\n return true;\n }\n }\n return false;\n }\n\n private hasMatchingDiffInstanceTask(\n instance: DiffRendererInstance,\n diff: FileDiffMetadata\n ): boolean {\n for (const task of this.iterateRenderTasks()) {\n if (\n task.type === 'diff' &&\n this.isCurrentRenderTask(task) &&\n task.instances.has(instance) &&\n areDiffTargetsEqual(task.request.diff, diff)\n ) {\n return true;\n }\n }\n return false;\n }\n\n private getTaskByHighlightKey(highlightKey: string): RenderTask | undefined {\n const task = this.taskByHighlightKey.get(highlightKey);\n return task != null && this.isCurrentRenderTask(task) ? task : undefined;\n }\n\n private isCurrentRenderTask(task: RenderTask): boolean {\n return task.renderOptionsVersion === this.renderOptionsVersion;\n }\n\n private *iterateRenderTasks(): Generator<RenderTask> {\n for (const task of this.queuedTasks) {\n yield task;\n }\n for (const task of this.activeTaskById.values()) {\n if (isRenderTask(task)) {\n yield task;\n }\n }\n }\n\n private generateRequestId(): WorkerRequestId {\n return `req_${++this.nextRequestId}`;\n }\n}\n\nfunction shouldSyncCustomExtensions(\n request: AllWorkerTasks['request']\n): request is InitializeWorkerRequest | RenderFileRequest | RenderDiffRequest {\n return (\n request.type === 'initialize' ||\n request.type === 'file' ||\n request.type === 'diff'\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\nfunction isRenderTask(task: AllWorkerTasks | undefined): task is RenderTask {\n return task?.type === 'file' || task?.type === 'diff';\n}\n\nfunction getInstances(\n task: RenderTask\n): Set<FileRendererInstance | DiffRendererInstance> {\n return task.instances as Set<FileRendererInstance | DiffRendererInstance>;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"WorkerPoolManager.js","names":[],"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 HighlighterTypes,\n HunkExpansionRegion,\n RenderDiffOptions,\n RenderDiffResult,\n RenderFileOptions,\n RenderFileResult,\n SupportedLanguages,\n ThemedDiffResult,\n ThemedFileResult,\n ThemeRegistrationResolved,\n} from '../types';\nimport { areDiffRenderOptionsEqual } from '../utils/areDiffRenderOptionsEqual';\nimport { areDiffTargetsEqual } from '../utils/areDiffTargetsEqual';\nimport { areFileRenderOptionsEqual } from '../utils/areFileRenderOptionsEqual';\nimport { areFilesEqual } from '../utils/areFilesEqual';\nimport { areThemesEqual } from '../utils/areThemesEqual';\nimport {\n getCustomExtensionsMap,\n getCustomExtensionsVersion,\n getFiletypeFromFileName,\n} from '../utils/getFiletypeFromFileName';\nimport { getThemes } from '../utils/getThemes';\nimport { isDiffPlainText } from '../utils/isDiffPlainText';\nimport { isFilePlainText } from '../utils/isFilePlainText';\nimport { renderDiffWithHighlighter } from '../utils/renderDiffWithHighlighter';\nimport { renderFileWithHighlighter } from '../utils/renderFileWithHighlighter';\nimport type {\n AllWorkerTasks,\n DiffRendererInstance,\n FileRendererInstance,\n InitializeWorkerRequest,\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\nclass WorkerPoolTerminatedError extends Error {\n constructor() {\n super('WorkerPoolManager: operation canceled because the pool terminated');\n }\n}\n\nclass WorkerPoolTaskCanceledError extends Error {\n constructor() {\n super('WorkerPoolManager: operation canceled before the task completed');\n }\n}\n\ninterface GetCachesResult {\n fileCache: LRUMapPkg.LRUMap<string, RenderFileResult>;\n diffCache: LRUMapPkg.LRUMap<string, RenderDiffResult>;\n}\n\ninterface ManagedWorker {\n worker: Worker;\n requestId: string | undefined;\n pendingSetupRequestId: WorkerRequestId | undefined;\n initialized: boolean;\n langs: Set<SupportedLanguages>;\n customExtensionsVersion: number;\n}\n\ninterface ThemeSubscriber {\n onThemeChange(): void;\n}\n\ntype RenderTask = RenderFileTask | RenderDiffTask;\n\ntype RenderTaskInstance = FileRendererInstance | DiffRendererInstance;\n\nexport class WorkerPoolManager {\n private highlighter: DiffsHighlighter | undefined;\n private readonly preferredHighlighter: HighlighterTypes;\n private renderOptions: WorkerRenderingOptions;\n private renderOptionsRequestVersion = 0;\n private renderOptionsVersion = 0;\n private initialized: Promise<void> | boolean = false;\n private workers: ManagedWorker[] = [];\n // Tasks that are waiting to get processed by a worker\n private queuedTasks: RenderTask[] = [];\n private queuedTaskByInstance = new Map<RenderTaskInstance, RenderTask>();\n\n // Tasks that map to highlightKey are essentially singular, so we only\n // need one map to include queued and active\n private taskByHighlightKey = new Map<string, RenderTask>();\n\n // Tasks that have already been sent to a worker and are awaiting a response.\n private activeTaskById = new Map<WorkerRequestId, AllWorkerTasks>();\n private activeRequestByInstance = new Map<\n RenderTaskInstance,\n WorkerRequestId\n >();\n\n private nextRequestId = 0;\n private themeSubscribers = new Set<ThemeSubscriber>();\n private workersFailed = false;\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 // Incremented on terminate so async lifecycle work can identify stale results.\n private lifecycleGeneration = 0;\n\n constructor(\n private options: WorkerPoolOptions,\n {\n langs,\n theme = DEFAULT_THEMES,\n useTokenTransformer = false,\n lineDiffType = 'word-alt',\n maxLineDiffLength = 1000,\n tokenizeMaxLineLength = 1000,\n preferredHighlighter = 'shiki-js',\n }: WorkerInitializationRenderOptions\n ) {\n this.preferredHighlighter = preferredHighlighter;\n this.renderOptions = {\n theme,\n useTokenTransformer,\n lineDiffType,\n maxLineDiffLength,\n tokenizeMaxLineLength,\n };\n this.fileCache = new LRUMapPkg.LRUMap(options.totalASTLRUCacheSize ?? 100);\n this.diffCache = new LRUMapPkg.LRUMap(options.totalASTLRUCacheSize ?? 100);\n this.queueInitialization(langs);\n }\n\n public isWorkingPool(): boolean {\n return !this.workersFailed;\n }\n\n public getFileResultCache(file: FileContents): RenderFileResult | undefined {\n return file.cacheKey != null\n ? this.fileCache.get(file.cacheKey)\n : undefined;\n }\n\n public getDiffResultCache(\n diff: FileDiffMetadata\n ): RenderDiffResult | undefined {\n return diff.cacheKey != null\n ? this.diffCache.get(diff.cacheKey)\n : undefined;\n }\n\n public inspectCaches(): GetCachesResult {\n const { fileCache, diffCache } = this;\n return { fileCache, diffCache };\n }\n\n public evictFileFromCache(cacheKey: string): boolean {\n try {\n return this.fileCache.delete(cacheKey) !== undefined;\n } finally {\n this.queueBroadcastStateChanges();\n }\n }\n\n public 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 = this.renderOptions.theme ?? DEFAULT_THEMES,\n useTokenTransformer = this.renderOptions.useTokenTransformer ?? false,\n lineDiffType = this.renderOptions.lineDiffType ?? 'word-alt',\n maxLineDiffLength = this.renderOptions.maxLineDiffLength ?? 1000,\n tokenizeMaxLineLength = this.renderOptions.tokenizeMaxLineLength ?? 1000,\n }: Partial<WorkerRenderingOptions>): Promise<void> {\n const { lifecycleGeneration } = this;\n const renderOptionsRequestVersion = ++this.renderOptionsRequestVersion;\n const isCurrentRequest = (): boolean =>\n this.isCurrentLifecycle(lifecycleGeneration) &&\n this.renderOptionsRequestVersion === renderOptionsRequestVersion;\n try {\n const newRenderOptions: WorkerRenderingOptions = {\n theme,\n useTokenTransformer,\n lineDiffType,\n maxLineDiffLength,\n tokenizeMaxLineLength,\n };\n if (!this.isInitialized()) {\n await this.initialize();\n }\n if (\n !isCurrentRequest() ||\n areDiffRenderOptionsEqual(newRenderOptions, this.renderOptions)\n ) {\n return;\n }\n\n const themeNames = getThemes(theme);\n let resolvedThemes: ThemeRegistrationResolved[] = [];\n if (!areThemesEqual(newRenderOptions.theme, this.renderOptions.theme)) {\n if (hasResolvedThemes(themeNames)) {\n resolvedThemes = getResolvedThemes(themeNames);\n } else {\n resolvedThemes = await resolveThemes(themeNames);\n }\n }\n\n if (!isCurrentRequest()) {\n return;\n }\n\n if (this.highlighter != null) {\n attachResolvedThemes(resolvedThemes, this.highlighter);\n } else {\n const highlighter = await getSharedHighlighter({\n themes: themeNames,\n langs: ['text'],\n preferredHighlighter: this.preferredHighlighter,\n });\n if (!isCurrentRequest()) {\n return;\n }\n this.highlighter = highlighter;\n }\n\n const workerSetup = this.setRenderOptionsOnWorkers(\n newRenderOptions,\n resolvedThemes\n );\n\n this.renderOptions = newRenderOptions;\n this.renderOptionsVersion++;\n this.diffCache.clear();\n this.fileCache.clear();\n this.invalidateRenderTasks();\n\n for (const instance of this.themeSubscribers) {\n instance.onThemeChange();\n }\n\n await workerSetup;\n } catch (error) {\n if (error instanceof WorkerPoolTerminatedError || !isCurrentRequest()) {\n return;\n }\n throw error;\n }\n }\n\n public getFileRenderOptions(): RenderFileOptions {\n const { tokenizeMaxLineLength, theme, useTokenTransformer } =\n this.renderOptions;\n return { theme, useTokenTransformer, tokenizeMaxLineLength };\n }\n\n public 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 // Render-option updates are posted immediately, but the worker stays\n // unavailable for new render work until it acknowledges this message.\n this.activeTaskById.set(id, task);\n managedWorker.pendingSetupRequestId = id;\n managedWorker.worker.postMessage(task.request);\n })\n );\n }\n await Promise.all(taskPromises);\n }\n\n public 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 public unsubscribeToThemeChanges(instance: ThemeSubscriber): void {\n this.themeSubscribers.delete(instance);\n this.queueBroadcastStateChanges();\n }\n\n public 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 public cleanUpTasks(instance: RenderTaskInstance): void {\n this.detachInstanceFromQueuedTasks(instance);\n const requestId = this.activeRequestByInstance.get(instance);\n if (requestId != null) {\n const task = this.activeTaskById.get(requestId);\n if (isRenderTask(task)) {\n this.detachInstanceFromRenderTask(task, instance);\n if (!task.primeCache && task.instances.size === 0) {\n this.removeActiveTask(task);\n }\n } else {\n this.activeTaskById.delete(requestId);\n }\n }\n this.activeRequestByInstance.delete(instance);\n this.queueBroadcastStateChanges();\n }\n\n public isInitialized(): boolean {\n return this.initialized === true;\n }\n\n public async initialize(languages: SupportedLanguages[] = []): Promise<void> {\n if (this.initialized === true) {\n return;\n } else if (this.initialized === false) {\n const { lifecycleGeneration } = this;\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 if (!this.isCurrentLifecycle(lifecycleGeneration)) {\n resolve();\n return;\n }\n\n let resolvedLanguages: ResolvedLanguage[] = [];\n if (hasResolvedLanguages(languages)) {\n resolvedLanguages = getResolvedLanguages(languages);\n } else {\n resolvedLanguages = await resolveLanguages(languages);\n }\n if (!this.isCurrentLifecycle(lifecycleGeneration)) {\n resolve();\n return;\n }\n\n const [highlighter] = await Promise.all([\n getSharedHighlighter({\n themes,\n langs: ['text', ...languages],\n preferredHighlighter: this.preferredHighlighter,\n }),\n this.initializeWorkers(resolvedThemes, resolvedLanguages),\n ]);\n\n if (!this.isCurrentLifecycle(lifecycleGeneration)) {\n this.terminateWorkers();\n resolve();\n return;\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 if (\n e instanceof WorkerPoolTerminatedError ||\n !this.isCurrentLifecycle(lifecycleGeneration)\n ) {\n resolve();\n return;\n }\n this.initialized = false;\n this.workersFailed = true;\n for (const task of this.queuedTasks) {\n this.rejectRenderTaskCallbacks(task, normalizeWorkerError(e));\n }\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 const customExtensionVersion = getCustomExtensionsVersion();\n const customExtensionMap =\n customExtensionVersion > 0 ? getCustomExtensionsMap() : undefined;\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 requestId: undefined,\n pendingSetupRequestId: undefined,\n initialized: false,\n langs: new Set(['text', ...resolvedLanguages.map(({ name }) => name)]),\n customExtensionsVersion: 0,\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 preferredHighlighter: this.preferredHighlighter,\n resolvedThemes,\n resolvedLanguages,\n customExtensionsVersion:\n customExtensionMap != null ? customExtensionVersion : undefined,\n customExtensionMap,\n },\n resolve() {\n managedWorker.initialized = true;\n resolve();\n },\n reject,\n requestStart: Date.now(),\n };\n this.activeTaskById.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.queuedTasks.length === 0) {\n return;\n }\n for (let i = 0; i < this.queuedTasks.length; ) {\n const task = this.queuedTasks[i];\n // If any instance has a request in progress, we should wait for it to\n // finish before starting work that would notify that instance.\n if (this.hasActiveRequest(task)) {\n i++;\n continue;\n }\n const langs = getLangsFromTask(task);\n const availableWorker = this.getAvailableWorker(langs);\n if (availableWorker == null) {\n break;\n }\n this.queuedTasks.splice(i, 1);\n this.assignWorkerToTask(task, availableWorker);\n void this.resolveLanguagesAndExecuteTask(availableWorker, task, langs);\n }\n this.queueBroadcastStateChanges();\n };\n\n public highlightFileAST(\n instance: FileRendererInstance,\n file: FileContents\n ): void {\n const cachedResult = this.getFileResultCache(file);\n // If we've already highlighted the file or it's plain text, we should not\n // attempt to highlight. This should be mostly never hit, but it's just an\n // extra level of safety\n if (\n isFilePlainText(file) ||\n (cachedResult != null &&\n areFileRenderOptionsEqual(\n cachedResult.options,\n this.getFileRenderOptions()\n ))\n ) {\n return;\n }\n if (!this.hasMatchingFileInstanceTask(instance, file)) {\n this.submitTask(instance, { type: 'file', file });\n }\n }\n\n public primeFileHighlightCache(file: FileContents): Promise<void> {\n if (!this.isWorkingPool()) {\n return Promise.reject(\n new Error(\n 'WorkerPoolManager.primeFileHighlightCache: worker pool is not working'\n )\n );\n }\n\n const task = this.getOrCreateFileHighlightCacheTask(file);\n return task != null\n ? this.createRenderTaskCallbacks(task)\n : Promise.resolve();\n }\n\n private getOrCreateFileHighlightCacheTask(\n file: FileContents\n ): RenderFileTask | undefined {\n if (file.cacheKey == null) {\n console.warn(\n `WorkerPoolManager.primeFileHighlightCache: priming highlight cache requires file.cacheKey; skipping \"${file.name}\".`\n );\n return undefined;\n }\n const cachedResult = this.getFileResultCache(file);\n const highlightKey = this.getFileHighlightKey(file);\n if (\n highlightKey == null ||\n isFilePlainText(file) ||\n (cachedResult != null &&\n areFileRenderOptionsEqual(\n cachedResult.options,\n this.getFileRenderOptions()\n ))\n ) {\n return undefined;\n }\n const existingTask = this.getTaskByHighlightKey(highlightKey);\n if (existingTask != null) {\n existingTask.primeCache = true;\n return existingTask.type === 'file' ? existingTask : undefined;\n } else {\n const task = this.submitCacheTask({ type: 'file', file }, highlightKey);\n return task.type === 'file' ? task : undefined;\n }\n }\n\n public getPlainFileAST(\n file: FileContents,\n startingLine: number,\n totalLines: number,\n lines?: string[]\n ): ThemedFileResult | undefined {\n if (this.highlighter == null) {\n this.queueInitialization();\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 public highlightDiffAST(\n instance: DiffRendererInstance,\n diff: FileDiffMetadata\n ): void {\n const cachedResult = this.getDiffResultCache(diff);\n // If we've already highlighted the diff or it's plain text, we should not\n // attempt to highlight. This should be mostly never hit, but it's just an\n // extra level of safety\n if (\n isDiffPlainText(diff) ||\n (cachedResult != null &&\n areDiffRenderOptionsEqual(\n cachedResult.options,\n this.getDiffRenderOptions()\n ))\n ) {\n return;\n }\n if (!this.hasMatchingDiffInstanceTask(instance, diff)) {\n this.submitTask(instance, { type: 'diff', diff });\n }\n }\n\n public primeDiffHighlightCache(diff: FileDiffMetadata): Promise<void> {\n if (!this.isWorkingPool()) {\n return Promise.reject(\n new Error(\n 'WorkerPoolManager.primeDiffHighlightCache: worker pool is not working'\n )\n );\n }\n\n const task = this.getOrCreateDiffHighlightCacheTask(diff);\n return task != null\n ? this.createRenderTaskCallbacks(task)\n : Promise.resolve();\n }\n\n private getOrCreateDiffHighlightCacheTask(\n diff: FileDiffMetadata\n ): RenderDiffTask | undefined {\n if (diff.cacheKey == null) {\n console.warn(\n `WorkerPoolManager.primeDiffHighlightCache: priming highlight cache requires diff.cacheKey; skipping \"${diff.prevName ?? diff.name}\" -> \"${diff.name}\".`\n );\n return undefined;\n }\n const cachedResult = this.getDiffResultCache(diff);\n const highlightKey = this.getDiffHighlightKey(diff);\n if (\n highlightKey == null ||\n isDiffPlainText(diff) ||\n (cachedResult != null &&\n areDiffRenderOptionsEqual(\n cachedResult.options,\n this.getDiffRenderOptions()\n ))\n ) {\n return undefined;\n }\n const existingTask = this.getTaskByHighlightKey(highlightKey);\n if (existingTask != null) {\n existingTask.primeCache = true;\n return existingTask.type === 'diff' ? existingTask : undefined;\n } else {\n const task = this.submitCacheTask({ type: 'diff', diff }, highlightKey);\n return task.type === 'diff' ? task : undefined;\n }\n }\n\n public 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 public terminate(): void {\n this.lifecycleGeneration++;\n this.cancelActiveWorkerTasks();\n this.terminateWorkers();\n const error = new WorkerPoolTerminatedError();\n for (const task of this.queuedTasks) {\n this.rejectRenderTaskCallbacks(task, error);\n }\n this.fileCache.clear();\n this.diffCache.clear();\n this.activeRequestByInstance.clear();\n this.queuedTasks.length = 0;\n this.queuedTaskByInstance.clear();\n this.taskByHighlightKey.clear();\n this.activeTaskById.clear();\n this.highlighter = undefined;\n this.initialized = false;\n this.workersFailed = false;\n this.queueBroadcastStateChanges();\n }\n\n private isCurrentLifecycle(lifecycleGeneration: number): boolean {\n return this.lifecycleGeneration === lifecycleGeneration;\n }\n\n private queueInitialization(languages?: SupportedLanguages[]): void {\n void this.initialize(languages).catch((error) => {\n console.error(error);\n });\n }\n\n private cancelActiveWorkerTasks(): void {\n const error = new WorkerPoolTerminatedError();\n for (const task of this.activeTaskById.values()) {\n if ('reject' in task) {\n task.reject(error);\n } else if (isRenderTask(task)) {\n this.rejectRenderTaskCallbacks(task, error);\n }\n }\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 public 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(\n (w) => w.requestId != null || w.pendingSetupRequestId != null\n ).length,\n queuedTasks: this.queuedTasks.length,\n activeTasks: this.activeTaskById.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 this.queueInitialization();\n }\n\n const highlightKey = this.getHighlightKeyForRequest(request);\n const existingTask =\n highlightKey != null\n ? this.getTaskByHighlightKey(highlightKey)\n : undefined;\n if (existingTask != null) {\n this.detachInstanceFromQueuedTasks(instance, existingTask);\n this.addInstanceToTask(existingTask, instance);\n this.queueBroadcastStateChanges();\n return;\n }\n\n this.detachInstanceFromQueuedTasks(instance);\n const id = this.generateRequestId();\n const requestStart = Date.now();\n const { renderOptionsVersion } = this;\n const task: RenderTask = (() => {\n switch (request.type) {\n case 'file':\n return {\n type: 'file',\n id,\n request: { ...request, id },\n instances: new Set([instance as FileRendererInstance]),\n primeCache: false,\n highlightKey,\n callbacks: new Set(),\n renderOptionsVersion,\n requestStart,\n };\n case 'diff':\n return {\n type: 'diff',\n id,\n request: { ...request, id },\n instances: new Set([instance as DiffRendererInstance]),\n primeCache: false,\n highlightKey,\n callbacks: new Set(),\n renderOptionsVersion,\n requestStart,\n };\n }\n })();\n this.enqueueRenderTask(task, instance);\n }\n\n private submitCacheTask(\n request: SubmitRequest,\n highlightKey: string\n ): RenderTask {\n if (this.initialized === false) {\n this.queueInitialization();\n }\n const id = this.generateRequestId();\n const requestStart = Date.now();\n const { renderOptionsVersion } = this;\n const task: RenderTask = (() => {\n switch (request.type) {\n case 'file':\n return {\n type: 'file',\n id,\n request: { ...request, id },\n instances: new Set<FileRendererInstance>(),\n primeCache: true,\n highlightKey,\n callbacks: new Set(),\n renderOptionsVersion,\n requestStart,\n };\n case 'diff':\n return {\n type: 'diff',\n id,\n request: { ...request, id },\n instances: new Set<DiffRendererInstance>(),\n primeCache: true,\n highlightKey,\n callbacks: new Set(),\n renderOptionsVersion,\n requestStart,\n };\n }\n })();\n this.enqueueRenderTask(task);\n return task;\n }\n\n private enqueueRenderTask(\n task: RenderTask,\n instance?: RenderTaskInstance\n ): void {\n this.queuedTasks.push(task);\n if (instance != null) {\n this.queuedTaskByInstance.set(instance, task);\n }\n if (task.highlightKey != null) {\n this.taskByHighlightKey.set(task.highlightKey, task);\n }\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 // If the task has been cleaned up after awaiting language resolving,\n // lets fully clean it up\n if (!this.activeTaskById.has(task.id)) {\n if (availableWorker.requestId === task.id) {\n this.cleanWorkerAndTask(availableWorker, task);\n this.queueBroadcastStateChanges();\n if (this.queuedTasks.length > 0) {\n this.queueDrain();\n }\n }\n return;\n }\n this.executeTask(availableWorker, task);\n } catch (error) {\n this.rejectRenderTaskCallbacks(task, normalizeWorkerError(error));\n this.cleanWorkerAndTask(availableWorker, task);\n this.queueBroadcastStateChanges();\n if (this.queuedTasks.length > 0) {\n this.queueDrain();\n }\n }\n }\n\n private handleWorkerMessage(\n managedWorker: ManagedWorker,\n response: WorkerResponse\n ): void {\n const task = this.activeTaskById.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 if (isRenderTask(task)) {\n this.notifyHighlightError(task, error);\n this.rejectRenderTaskCallbacks(task, error);\n } else {\n throw new Error('handleWorkerMessage: unknown task type');\n }\n throw error;\n } else {\n switch (response.requestType) {\n case 'initialize':\n if (task.type !== 'initialize') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n this.syncCustomExtensionVersion(managedWorker, task.request);\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 if (\n !this.isCurrentRenderTask(task) ||\n !areFileRenderOptionsEqual(options, this.getFileRenderOptions())\n ) {\n throw IGNORE_RESPONSE;\n }\n const { request } = task;\n this.syncCustomExtensionVersion(managedWorker, request);\n if (request.file.cacheKey != null) {\n this.fileCache.set(request.file.cacheKey, { result, options });\n }\n this.resolveRenderTaskCallbacks(task);\n this.notifyFileInstances(task, 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 if (\n !this.isCurrentRenderTask(task) ||\n !areDiffRenderOptionsEqual(options, this.getDiffRenderOptions())\n ) {\n throw IGNORE_RESPONSE;\n }\n const { request } = task;\n this.syncCustomExtensionVersion(managedWorker, request);\n if (request.diff.cacheKey != null) {\n this.diffCache.set(request.diff.cacheKey, { result, options });\n }\n this.resolveRenderTaskCallbacks(task);\n this.notifyDiffInstances(task, 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 this.cleanWorkerAndTask(managedWorker, task, response.id);\n this.queueBroadcastStateChanges();\n if (this.queuedTasks.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 this.queueBroadcastStateChanges();\n }\n\n private assignWorkerToTask(\n task: AllWorkerTasks,\n managedWorker: ManagedWorker\n ) {\n managedWorker.requestId = task.id;\n if (isRenderTask(task)) {\n this.clearQueuedInstanceRequests(task);\n this.trackInstanceRequests(task);\n }\n this.activeTaskById.set(task.id, task);\n }\n\n private cleanWorkerAndTask(\n managedWorker: ManagedWorker,\n task?: AllWorkerTasks,\n requestId: WorkerRequestId | undefined = task?.id\n ) {\n if (managedWorker.requestId === requestId) {\n managedWorker.requestId = undefined;\n }\n if (managedWorker.pendingSetupRequestId === requestId) {\n managedWorker.pendingSetupRequestId = undefined;\n }\n if (task != null) {\n if (isRenderTask(task)) {\n this.rejectRenderTaskCallbacks(task, new WorkerPoolTaskCanceledError());\n this.clearInstanceRequests(task);\n this.clearHighlightKey(task);\n }\n this.activeTaskById.delete(task.id);\n }\n }\n\n private executeTask(\n managedWorker: ManagedWorker,\n task: AllWorkerTasks\n ): void {\n if (shouldSyncCustomExtensions(task.request)) {\n this.maybeAttachCustomExtensions(managedWorker, task.request);\n }\n if (!this.activeTaskById.has(task.id)) {\n this.assignWorkerToTask(task, managedWorker);\n }\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 console.error('Failed to post message to worker:', error);\n if (isRenderTask(task)) {\n this.notifyHighlightError(task, error);\n this.rejectRenderTaskCallbacks(task, normalizeWorkerError(error));\n } else if ('reject' in task) {\n task.reject(error as Error);\n }\n this.cleanWorkerAndTask(managedWorker, task);\n if (this.queuedTasks.length > 0) {\n this.queueDrain();\n }\n }\n this.queueBroadcastStateChanges();\n }\n\n private maybeAttachCustomExtensions(\n managedWorker: ManagedWorker,\n request: InitializeWorkerRequest | RenderFileRequest | RenderDiffRequest\n ): void {\n if (request.customExtensionsVersion != null) {\n return;\n }\n const version = getCustomExtensionsVersion();\n if (managedWorker.customExtensionsVersion >= version) {\n return;\n }\n request.customExtensionsVersion = version;\n request.customExtensionMap = getCustomExtensionsMap();\n }\n\n private syncCustomExtensionVersion(\n managedWorker: ManagedWorker,\n request: InitializeWorkerRequest | RenderFileRequest | RenderDiffRequest\n ): void {\n if (request.customExtensionsVersion == null) {\n return;\n }\n managedWorker.customExtensionsVersion = request.customExtensionsVersion;\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 (\n managedWorker.requestId != null ||\n managedWorker.pendingSetupRequestId != null ||\n !managedWorker.initialized\n ) {\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 getFileHighlightKey(file: FileContents): string | undefined {\n if (file.cacheKey == null) {\n return undefined;\n }\n return `file:${file.cacheKey}:${this.renderOptionsVersion}`;\n }\n\n private getDiffHighlightKey(diff: FileDiffMetadata): string | undefined {\n if (diff.cacheKey == null) {\n return undefined;\n }\n return `diff:${diff.cacheKey}:${this.renderOptionsVersion}`;\n }\n\n private getHighlightKeyForRequest(\n request: SubmitRequest\n ): string | undefined {\n switch (request.type) {\n case 'file':\n return this.getFileHighlightKey(request.file);\n case 'diff':\n return this.getDiffHighlightKey(request.diff);\n }\n }\n\n private hasActiveRequest(task: RenderTask): boolean {\n for (const instance of getInstances(task)) {\n if (this.activeRequestByInstance.has(instance)) {\n return true;\n }\n }\n return false;\n }\n\n private addInstanceToTask(\n task: RenderTask,\n instance: FileRendererInstance | DiffRendererInstance\n ): void {\n if (task.type === 'file') {\n task.instances.add(instance as FileRendererInstance);\n } else {\n task.instances.add(instance as DiffRendererInstance);\n }\n if (this.activeTaskById.has(task.id)) {\n this.activeRequestByInstance.set(instance, task.id);\n } else {\n this.queuedTaskByInstance.set(instance, task);\n }\n }\n\n private detachInstanceFromQueuedTasks(\n instance: RenderTaskInstance,\n exceptTask?: RenderTask\n ): void {\n const task = this.queuedTaskByInstance.get(instance);\n if (task == null || task === exceptTask) {\n return;\n }\n this.queuedTaskByInstance.delete(instance);\n this.detachInstanceFromRenderTask(task, instance);\n if (!task.primeCache && task.instances.size === 0) {\n this.removeQueuedTask(task);\n }\n }\n\n private detachInstanceFromRenderTask(\n task: RenderTask,\n instance: RenderTaskInstance\n ): void {\n if (task.type === 'file') {\n task.instances.delete(instance as FileRendererInstance);\n } else {\n task.instances.delete(instance as DiffRendererInstance);\n }\n }\n\n private removeQueuedTask(task: RenderTask): void {\n const index = this.queuedTasks.indexOf(task);\n if (index !== -1) {\n this.queuedTasks.splice(index, 1);\n }\n this.rejectRenderTaskCallbacks(task, new WorkerPoolTaskCanceledError());\n this.clearQueuedInstanceRequests(task);\n this.clearHighlightKey(task);\n }\n\n private removeActiveTask(task: RenderTask): void {\n this.rejectRenderTaskCallbacks(task, new WorkerPoolTaskCanceledError());\n this.clearInstanceRequests(task);\n this.clearHighlightKey(task);\n this.activeTaskById.delete(task.id);\n }\n\n private createRenderTaskCallbacks(task: RenderTask): Promise<void> {\n return new Promise((resolve, reject) => {\n task.callbacks.add({ resolve, reject });\n });\n }\n\n private resolveRenderTaskCallbacks(task: RenderTask): void {\n for (const callbacks of task.callbacks) {\n callbacks.resolve();\n }\n task.callbacks.clear();\n }\n\n private rejectRenderTaskCallbacks(task: RenderTask, error: Error): void {\n for (const callbacks of task.callbacks) {\n callbacks.reject(error);\n }\n task.callbacks.clear();\n }\n\n private invalidateRenderTasks(): void {\n for (let index = this.queuedTasks.length - 1; index >= 0; index--) {\n const task = this.queuedTasks[index];\n if (task.renderOptionsVersion !== this.renderOptionsVersion) {\n this.removeQueuedTask(task);\n }\n }\n\n for (const task of Array.from(this.activeTaskById.values())) {\n if (\n isRenderTask(task) &&\n task.renderOptionsVersion !== this.renderOptionsVersion\n ) {\n this.removeActiveTask(task);\n }\n }\n }\n\n private clearQueuedInstanceRequests(task: RenderTask): void {\n for (const instance of getInstances(task)) {\n if (this.queuedTaskByInstance.get(instance) === task) {\n this.queuedTaskByInstance.delete(instance);\n }\n }\n }\n\n private clearHighlightKey(task: RenderTask): void {\n if (\n task.highlightKey != null &&\n this.taskByHighlightKey.get(task.highlightKey) === task\n ) {\n this.taskByHighlightKey.delete(task.highlightKey);\n }\n }\n\n private trackInstanceRequests(task: RenderTask): void {\n for (const instance of getInstances(task)) {\n this.activeRequestByInstance.set(instance, task.id);\n }\n }\n\n private clearInstanceRequests(task: RenderTask): void {\n for (const instance of getInstances(task)) {\n if (this.activeRequestByInstance.get(instance) === task.id) {\n this.activeRequestByInstance.delete(instance);\n }\n }\n }\n\n private notifyFileInstances(\n task: RenderFileTask,\n result: ThemedFileResult,\n options: RenderFileOptions\n ): void {\n for (const instance of task.instances) {\n if (this.activeRequestByInstance.get(instance) === task.id) {\n instance.onHighlightSuccess(task.request.file, result, options);\n }\n }\n }\n\n private notifyDiffInstances(\n task: RenderDiffTask,\n result: ThemedDiffResult,\n options: RenderDiffOptions\n ): void {\n for (const instance of task.instances) {\n if (this.activeRequestByInstance.get(instance) === task.id) {\n instance.onHighlightSuccess(task.request.diff, result, options);\n }\n }\n }\n\n private notifyHighlightError(task: RenderTask, error: unknown): void {\n for (const instance of getInstances(task)) {\n if (this.activeRequestByInstance.get(instance) === task.id) {\n instance.onHighlightError(error);\n }\n }\n }\n\n private hasMatchingFileInstanceTask(\n instance: FileRendererInstance,\n file: FileContents\n ): boolean {\n for (const task of this.iterateRenderTasks()) {\n if (\n task.type === 'file' &&\n this.isCurrentRenderTask(task) &&\n task.instances.has(instance) &&\n areFilesEqual(file, task.request.file)\n ) {\n return true;\n }\n }\n return false;\n }\n\n private hasMatchingDiffInstanceTask(\n instance: DiffRendererInstance,\n diff: FileDiffMetadata\n ): boolean {\n for (const task of this.iterateRenderTasks()) {\n if (\n task.type === 'diff' &&\n this.isCurrentRenderTask(task) &&\n task.instances.has(instance) &&\n areDiffTargetsEqual(task.request.diff, diff)\n ) {\n return true;\n }\n }\n return false;\n }\n\n private getTaskByHighlightKey(highlightKey: string): RenderTask | undefined {\n const task = this.taskByHighlightKey.get(highlightKey);\n return task != null && this.isCurrentRenderTask(task) ? task : undefined;\n }\n\n private isCurrentRenderTask(task: RenderTask): boolean {\n return task.renderOptionsVersion === this.renderOptionsVersion;\n }\n\n private *iterateRenderTasks(): Generator<RenderTask> {\n for (const task of this.queuedTasks) {\n yield task;\n }\n for (const task of this.activeTaskById.values()) {\n if (isRenderTask(task)) {\n yield task;\n }\n }\n }\n\n private generateRequestId(): WorkerRequestId {\n return `req_${++this.nextRequestId}`;\n }\n}\n\nfunction shouldSyncCustomExtensions(\n request: AllWorkerTasks['request']\n): request is InitializeWorkerRequest | RenderFileRequest | RenderDiffRequest {\n return (\n request.type === 'initialize' ||\n request.type === 'file' ||\n request.type === 'diff'\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\nfunction isRenderTask(task: AllWorkerTasks | undefined): task is RenderTask {\n return task?.type === 'file' || task?.type === 'diff';\n}\n\nfunction getInstances(\n task: RenderTask\n): Set<FileRendererInstance | DiffRendererInstance> {\n return task.instances as Set<FileRendererInstance | DiffRendererInstance>;\n}\n\nfunction normalizeWorkerError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { AllWorkerTasks, DiffRendererInstance, FileRendererInstance, InitializeSuccessResponse, InitializeWorkerRequest, InitializeWorkerTask, RegisterThemeSuccessResponse, RenderDiffRequest, RenderDiffSuccessResponse, RenderDiffTask, RenderErrorResponse, RenderFileRequest, RenderFileSuccessResponse, RenderFileTask, RenderSuccessResponse, ResolvedLanguage, SetRenderOptionsWorkerRequest, SetRenderOptionsWorkerTask, SubmitRequest, WorkerInitializationRenderOptions, WorkerPoolOptions, WorkerRenderingOptions, WorkerRequest, WorkerRequestId, WorkerResponse, WorkerStats } from "./types.js";
1
+ import { AllWorkerTasks, DiffRendererInstance, FileRendererInstance, InitializeSuccessResponse, InitializeWorkerRequest, InitializeWorkerTask, RegisterThemeSuccessResponse, RenderDiffRequest, RenderDiffSuccessResponse, RenderDiffTask, RenderErrorResponse, RenderFileRequest, RenderFileSuccessResponse, RenderFileTask, RenderSuccessResponse, RenderTaskCallbacks, ResolvedLanguage, SetRenderOptionsWorkerRequest, SetRenderOptionsWorkerTask, SubmitRequest, WorkerInitializationRenderOptions, WorkerPoolOptions, WorkerRenderingOptions, WorkerRequest, WorkerRequestId, WorkerResponse, WorkerStats } from "./types.js";
2
2
  import { WorkerPoolManager } from "./WorkerPoolManager.js";
3
3
  import { SetupWorkerPoolProps, getOrCreateWorkerPoolSingleton, terminateWorkerPoolSingleton } from "./getOrCreateWorkerPoolSingleton.js";
4
- export { AllWorkerTasks, DiffRendererInstance, FileRendererInstance, InitializeSuccessResponse, InitializeWorkerRequest, InitializeWorkerTask, RegisterThemeSuccessResponse, RenderDiffRequest, RenderDiffSuccessResponse, RenderDiffTask, RenderErrorResponse, RenderFileRequest, RenderFileSuccessResponse, RenderFileTask, RenderSuccessResponse, ResolvedLanguage, SetRenderOptionsWorkerRequest, SetRenderOptionsWorkerTask, SetupWorkerPoolProps, SubmitRequest, WorkerInitializationRenderOptions, WorkerPoolManager, WorkerPoolOptions, WorkerRenderingOptions, WorkerRequest, WorkerRequestId, WorkerResponse, WorkerStats, getOrCreateWorkerPoolSingleton, terminateWorkerPoolSingleton };
4
+ export { AllWorkerTasks, DiffRendererInstance, FileRendererInstance, InitializeSuccessResponse, InitializeWorkerRequest, InitializeWorkerTask, RegisterThemeSuccessResponse, RenderDiffRequest, RenderDiffSuccessResponse, RenderDiffTask, RenderErrorResponse, RenderFileRequest, RenderFileSuccessResponse, RenderFileTask, RenderSuccessResponse, RenderTaskCallbacks, ResolvedLanguage, SetRenderOptionsWorkerRequest, SetRenderOptionsWorkerTask, SetupWorkerPoolProps, SubmitRequest, WorkerInitializationRenderOptions, WorkerPoolManager, WorkerPoolOptions, WorkerRenderingOptions, WorkerRequest, WorkerRequestId, WorkerResponse, WorkerStats, getOrCreateWorkerPoolSingleton, terminateWorkerPoolSingleton };
@@ -126,6 +126,10 @@ interface SetRenderOptionsWorkerTask {
126
126
  reject(error: Error): void;
127
127
  requestStart: number;
128
128
  }
129
+ interface RenderTaskCallbacks {
130
+ resolve(): void;
131
+ reject(error: Error): void;
132
+ }
129
133
  interface RenderFileTask {
130
134
  type: 'file';
131
135
  id: WorkerRequestId;
@@ -133,6 +137,7 @@ interface RenderFileTask {
133
137
  instances: Set<FileRendererInstance>;
134
138
  primeCache: boolean;
135
139
  highlightKey?: string;
140
+ callbacks: Set<RenderTaskCallbacks>;
136
141
  renderOptionsVersion: number;
137
142
  requestStart: number;
138
143
  }
@@ -143,6 +148,7 @@ interface RenderDiffTask {
143
148
  instances: Set<DiffRendererInstance>;
144
149
  primeCache: boolean;
145
150
  highlightKey?: string;
151
+ callbacks: Set<RenderTaskCallbacks>;
146
152
  renderOptionsVersion: number;
147
153
  requestStart: number;
148
154
  }
@@ -159,5 +165,5 @@ interface WorkerStats {
159
165
  diffCacheSize: number;
160
166
  }
161
167
  //#endregion
162
- export { AllWorkerTasks, DiffRendererInstance, FileRendererInstance, InitializeSuccessResponse, InitializeWorkerRequest, InitializeWorkerTask, RegisterThemeSuccessResponse, RenderDiffRequest, RenderDiffSuccessResponse, RenderDiffTask, RenderErrorResponse, RenderFileRequest, RenderFileSuccessResponse, RenderFileTask, RenderSuccessResponse, ResolvedLanguage, SetRenderOptionsWorkerRequest, SetRenderOptionsWorkerTask, SubmitRequest, WorkerInitializationRenderOptions, WorkerPoolOptions, WorkerRenderingOptions, WorkerRequest, WorkerRequestId, WorkerResponse, WorkerStats };
168
+ export { AllWorkerTasks, DiffRendererInstance, FileRendererInstance, InitializeSuccessResponse, InitializeWorkerRequest, InitializeWorkerTask, RegisterThemeSuccessResponse, RenderDiffRequest, RenderDiffSuccessResponse, RenderDiffTask, RenderErrorResponse, RenderFileRequest, RenderFileSuccessResponse, RenderFileTask, RenderSuccessResponse, RenderTaskCallbacks, ResolvedLanguage, SetRenderOptionsWorkerRequest, SetRenderOptionsWorkerTask, SubmitRequest, WorkerInitializationRenderOptions, WorkerPoolOptions, WorkerRenderingOptions, WorkerRequest, WorkerRequestId, WorkerResponse, WorkerStats };
163
169
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../src/worker/types.ts"],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../src/worker/types.ts"],"mappings":"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"}