footprintjs 9.41.0 → 9.43.0

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 (266) hide show
  1. package/AGENTS.md +7 -3
  2. package/CLAUDE.md +12 -11
  3. package/README.md +7 -3
  4. package/dist/advanced.js +4 -3
  5. package/dist/esm/advanced.d.ts +3 -1
  6. package/dist/esm/advanced.js +3 -2
  7. package/dist/esm/index.d.ts +3 -3
  8. package/dist/esm/index.js +1 -1
  9. package/dist/esm/lib/builder/FlowChartBuilder.d.ts +14 -4
  10. package/dist/esm/lib/builder/FlowChartBuilder.js +25 -7
  11. package/dist/esm/lib/builder/types.d.ts +2 -3
  12. package/dist/esm/lib/builder/types.js +1 -1
  13. package/dist/esm/lib/capture/freeze.d.ts +5 -5
  14. package/dist/esm/lib/capture/freeze.js +5 -4
  15. package/dist/esm/lib/contract/index.d.ts +5 -8
  16. package/dist/esm/lib/contract/index.js +5 -10
  17. package/dist/esm/lib/contract/types.d.ts +3 -81
  18. package/dist/esm/lib/contract/types.js +4 -5
  19. package/dist/esm/lib/decide/decide.js +13 -46
  20. package/dist/esm/lib/detach/drivers/batch.d.ts +9 -0
  21. package/dist/esm/lib/detach/drivers/batch.js +79 -0
  22. package/dist/esm/lib/detach/drivers/microtaskBatch.d.ts +17 -20
  23. package/dist/esm/lib/detach/drivers/microtaskBatch.js +20 -72
  24. package/dist/esm/lib/detach/drivers/setImmediate.js +10 -41
  25. package/dist/esm/lib/detach/drivers/setTimeout.js +3 -36
  26. package/dist/esm/lib/detach/types.d.ts +17 -20
  27. package/dist/esm/lib/detach/types.js +9 -11
  28. package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +7 -3
  29. package/dist/esm/lib/engine/handlers/DeciderHandler.js +7 -5
  30. package/dist/esm/lib/engine/handlers/ParallelForEachHandler.d.ts +2 -3
  31. package/dist/esm/lib/engine/handlers/ParallelForEachHandler.js +21 -24
  32. package/dist/esm/lib/engine/handlers/SelectorHandler.d.ts +2 -4
  33. package/dist/esm/lib/engine/handlers/SelectorHandler.js +15 -7
  34. package/dist/esm/lib/engine/handlers/StageRunner.js +11 -22
  35. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +32 -17
  36. package/dist/esm/lib/engine/handlers/SubflowInputMapper.d.ts +4 -3
  37. package/dist/esm/lib/engine/handlers/SubflowInputMapper.js +19 -8
  38. package/dist/esm/lib/engine/handlers/breakFlag.d.ts +3 -0
  39. package/dist/esm/lib/engine/handlers/breakFlag.js +9 -0
  40. package/dist/esm/lib/engine/handlers/commitStage.js +3 -3
  41. package/dist/esm/lib/engine/handlers/servedPause.d.ts +15 -0
  42. package/dist/esm/lib/engine/handlers/servedPause.js +26 -0
  43. package/dist/esm/lib/engine/handlers/stageError.d.ts +20 -0
  44. package/dist/esm/lib/engine/handlers/stageError.js +28 -0
  45. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +6 -1
  46. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +40 -67
  47. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +3 -3
  48. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +4 -8
  49. package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.d.ts +7 -1
  50. package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +28 -48
  51. package/dist/esm/lib/engine/narrative/formatting/resolveText.d.ts +6 -0
  52. package/dist/esm/lib/engine/narrative/formatting/resolveText.js +9 -0
  53. package/dist/esm/lib/engine/narrative/formatting/sentences.d.ts +16 -0
  54. package/dist/esm/lib/engine/narrative/formatting/sentences.js +50 -0
  55. package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +2 -0
  56. package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
  57. package/dist/esm/lib/engine/narrative/recorders/RLENarrativeFlowRecorder.js +3 -7
  58. package/dist/esm/lib/engine/narrative/recorders/SeparateNarrativeFlowRecorder.js +3 -7
  59. package/dist/esm/lib/engine/narrative/recorders/WindowedNarrativeFlowRecorder.d.ts +0 -1
  60. package/dist/esm/lib/engine/narrative/recorders/WindowedNarrativeFlowRecorder.js +5 -10
  61. package/dist/esm/lib/engine/narrative/types.d.ts +18 -8
  62. package/dist/esm/lib/engine/narrative/types.js +1 -1
  63. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +8 -3
  64. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +64 -33
  65. package/dist/esm/lib/engine/types.d.ts +4 -0
  66. package/dist/esm/lib/engine/types.js +1 -1
  67. package/dist/esm/lib/memory/DiagnosticCollector.d.ts +12 -0
  68. package/dist/esm/lib/memory/DiagnosticCollector.js +53 -9
  69. package/dist/esm/lib/memory/EventLog.d.ts +9 -0
  70. package/dist/esm/lib/memory/EventLog.js +24 -1
  71. package/dist/esm/lib/memory/StageContext.d.ts +22 -1
  72. package/dist/esm/lib/memory/StageContext.js +61 -7
  73. package/dist/esm/lib/memory/eventPosition.d.ts +18 -0
  74. package/dist/esm/lib/memory/eventPosition.js +2 -0
  75. package/dist/esm/lib/memory/merge.d.ts +2 -1
  76. package/dist/esm/lib/memory/merge.js +15 -4
  77. package/dist/esm/lib/memory/redaction.d.ts +339 -17
  78. package/dist/esm/lib/memory/redaction.js +993 -32
  79. package/dist/esm/lib/observer-queue/deferredDispatcher.d.ts +2 -2
  80. package/dist/esm/lib/observer-queue/deferredDispatcher.js +3 -3
  81. package/dist/esm/lib/observer-queue/index.d.ts +7 -4
  82. package/dist/esm/lib/observer-queue/index.js +8 -5
  83. package/dist/esm/lib/pause/index.d.ts +1 -1
  84. package/dist/esm/lib/pause/index.js +1 -1
  85. package/dist/esm/lib/pause/record.js +19 -1
  86. package/dist/esm/lib/pause/types.d.ts +20 -0
  87. package/dist/esm/lib/pause/types.js +1 -1
  88. package/dist/esm/lib/reactive/createTypedScope.js +20 -21
  89. package/dist/esm/lib/reactive/index.d.ts +1 -1
  90. package/dist/esm/lib/reactive/index.js +2 -2
  91. package/dist/esm/lib/reactive/types.d.ts +0 -3
  92. package/dist/esm/lib/reactive/types.js +1 -23
  93. package/dist/esm/lib/recorder/EmitRecorder.d.ts +9 -0
  94. package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
  95. package/dist/esm/lib/recorder/InOutRecorder.d.ts +5 -2
  96. package/dist/esm/lib/recorder/InOutRecorder.js +6 -3
  97. package/dist/esm/lib/runner/DeferredObserverTier.d.ts +4 -3
  98. package/dist/esm/lib/runner/DeferredObserverTier.js +5 -4
  99. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +3 -0
  100. package/dist/esm/lib/runner/ExecutionRuntime.js +2 -1
  101. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +11 -9
  102. package/dist/esm/lib/runner/FlowChartExecutor.js +18 -10
  103. package/dist/esm/lib/runner/attach.d.ts +3 -1
  104. package/dist/esm/lib/runner/attach.js +21 -31
  105. package/dist/esm/lib/runner/checkpoint.d.ts +3 -1
  106. package/dist/esm/lib/runner/checkpoint.js +4 -1
  107. package/dist/esm/lib/scope/ScopeFacade.d.ts +13 -1
  108. package/dist/esm/lib/scope/ScopeFacade.js +60 -39
  109. package/dist/esm/lib/scope/protection/createProtectedScope.js +5 -2
  110. package/dist/esm/lib/scope/protection/readonlyInput.d.ts +16 -6
  111. package/dist/esm/lib/scope/protection/readonlyInput.js +72 -9
  112. package/dist/esm/lib/scope/providers/baseStateCompatible.d.ts +10 -24
  113. package/dist/esm/lib/scope/providers/baseStateCompatible.js +35 -35
  114. package/dist/esm/lib/scope/providers/providers.d.ts +2 -2
  115. package/dist/esm/lib/scope/providers/providers.js +3 -3
  116. package/dist/esm/lib/scope/providers/resolve.js +2 -2
  117. package/dist/esm/lib/scope/providers/types.d.ts +4 -2
  118. package/dist/esm/lib/scope/providers/types.js +1 -1
  119. package/dist/esm/lib/scope/recorders/MetricRecorder.d.ts +2 -3
  120. package/dist/esm/lib/scope/recorders/MetricRecorder.js +11 -14
  121. package/dist/esm/lib/scope/runtime.d.ts +48 -0
  122. package/dist/esm/lib/scope/runtime.js +60 -0
  123. package/dist/esm/lib/scope/state/zod/defineScopeFromZod.d.ts +2 -2
  124. package/dist/esm/lib/scope/state/zod/defineScopeFromZod.js +17 -6
  125. package/dist/esm/lib/scope/state/zod/resolver.js +3 -15
  126. package/dist/esm/lib/scope/state/zod/scopeFactory.d.ts +7 -3
  127. package/dist/esm/lib/scope/state/zod/scopeFactory.js +57 -22
  128. package/dist/esm/lib/scope/state/zod/utils/validateHelper.d.ts +27 -18
  129. package/dist/esm/lib/scope/state/zod/utils/validateHelper.js +66 -67
  130. package/dist/esm/recorders.d.ts +3 -0
  131. package/dist/esm/recorders.js +1 -1
  132. package/dist/index.js +1 -1
  133. package/dist/lib/builder/FlowChartBuilder.js +25 -7
  134. package/dist/lib/builder/types.js +1 -1
  135. package/dist/lib/capture/freeze.js +5 -4
  136. package/dist/lib/contract/index.js +6 -13
  137. package/dist/lib/contract/types.js +4 -5
  138. package/dist/lib/decide/decide.js +13 -46
  139. package/dist/lib/detach/drivers/batch.js +83 -0
  140. package/dist/lib/detach/drivers/microtaskBatch.js +20 -72
  141. package/dist/lib/detach/drivers/setImmediate.js +10 -41
  142. package/dist/lib/detach/drivers/setTimeout.js +3 -36
  143. package/dist/lib/detach/types.js +9 -11
  144. package/dist/lib/engine/handlers/ChildrenExecutor.js +7 -3
  145. package/dist/lib/engine/handlers/DeciderHandler.js +7 -5
  146. package/dist/lib/engine/handlers/ParallelForEachHandler.js +21 -24
  147. package/dist/lib/engine/handlers/SelectorHandler.js +15 -7
  148. package/dist/lib/engine/handlers/StageRunner.js +11 -22
  149. package/dist/lib/engine/handlers/SubflowExecutor.js +32 -17
  150. package/dist/lib/engine/handlers/SubflowInputMapper.js +19 -8
  151. package/dist/lib/engine/handlers/breakFlag.js +13 -0
  152. package/dist/lib/engine/handlers/commitStage.js +2 -2
  153. package/dist/lib/engine/handlers/servedPause.js +30 -0
  154. package/dist/lib/engine/handlers/stageError.js +34 -0
  155. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +40 -67
  156. package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +4 -8
  157. package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +28 -48
  158. package/dist/lib/engine/narrative/formatting/resolveText.js +13 -0
  159. package/dist/lib/engine/narrative/formatting/sentences.js +63 -0
  160. package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
  161. package/dist/lib/engine/narrative/recorders/RLENarrativeFlowRecorder.js +3 -7
  162. package/dist/lib/engine/narrative/recorders/SeparateNarrativeFlowRecorder.js +3 -7
  163. package/dist/lib/engine/narrative/recorders/WindowedNarrativeFlowRecorder.js +5 -10
  164. package/dist/lib/engine/narrative/types.js +1 -1
  165. package/dist/lib/engine/traversal/FlowchartTraverser.js +64 -33
  166. package/dist/lib/engine/types.js +1 -1
  167. package/dist/lib/memory/DiagnosticCollector.js +53 -9
  168. package/dist/lib/memory/EventLog.js +24 -1
  169. package/dist/lib/memory/StageContext.js +61 -7
  170. package/dist/lib/memory/eventPosition.js +3 -0
  171. package/dist/lib/memory/merge.js +15 -4
  172. package/dist/lib/memory/redaction.js +997 -33
  173. package/dist/lib/observer-queue/deferredDispatcher.js +3 -3
  174. package/dist/lib/observer-queue/index.js +8 -5
  175. package/dist/lib/pause/index.js +1 -1
  176. package/dist/lib/pause/record.js +19 -1
  177. package/dist/lib/pause/types.js +1 -1
  178. package/dist/lib/reactive/createTypedScope.js +19 -20
  179. package/dist/lib/reactive/index.js +2 -5
  180. package/dist/lib/reactive/types.js +2 -24
  181. package/dist/lib/recorder/EmitRecorder.js +1 -1
  182. package/dist/lib/recorder/InOutRecorder.js +6 -3
  183. package/dist/lib/runner/DeferredObserverTier.js +5 -4
  184. package/dist/lib/runner/ExecutionRuntime.js +2 -1
  185. package/dist/lib/runner/FlowChartExecutor.js +18 -10
  186. package/dist/lib/runner/attach.js +21 -31
  187. package/dist/lib/runner/checkpoint.js +4 -1
  188. package/dist/lib/scope/ScopeFacade.js +60 -39
  189. package/dist/lib/scope/protection/createProtectedScope.js +5 -2
  190. package/dist/lib/scope/protection/readonlyInput.js +74 -10
  191. package/dist/lib/scope/providers/baseStateCompatible.js +37 -36
  192. package/dist/lib/scope/providers/providers.js +3 -3
  193. package/dist/lib/scope/providers/resolve.js +2 -2
  194. package/dist/lib/scope/providers/types.js +1 -1
  195. package/dist/lib/scope/recorders/MetricRecorder.js +11 -14
  196. package/dist/lib/scope/runtime.js +67 -0
  197. package/dist/lib/scope/state/zod/defineScopeFromZod.js +15 -4
  198. package/dist/lib/scope/state/zod/resolver.js +3 -15
  199. package/dist/lib/scope/state/zod/scopeFactory.js +58 -22
  200. package/dist/lib/scope/state/zod/utils/validateHelper.js +70 -68
  201. package/dist/recorders.js +1 -1
  202. package/dist/types/advanced.d.ts +3 -1
  203. package/dist/types/index.d.ts +3 -3
  204. package/dist/types/lib/builder/FlowChartBuilder.d.ts +14 -4
  205. package/dist/types/lib/builder/types.d.ts +2 -3
  206. package/dist/types/lib/capture/freeze.d.ts +5 -5
  207. package/dist/types/lib/contract/index.d.ts +5 -8
  208. package/dist/types/lib/contract/types.d.ts +3 -81
  209. package/dist/types/lib/detach/drivers/batch.d.ts +9 -0
  210. package/dist/types/lib/detach/drivers/microtaskBatch.d.ts +17 -20
  211. package/dist/types/lib/detach/types.d.ts +17 -20
  212. package/dist/types/lib/engine/handlers/ParallelForEachHandler.d.ts +2 -3
  213. package/dist/types/lib/engine/handlers/SelectorHandler.d.ts +2 -4
  214. package/dist/types/lib/engine/handlers/SubflowInputMapper.d.ts +4 -3
  215. package/dist/types/lib/engine/handlers/breakFlag.d.ts +3 -0
  216. package/dist/types/lib/engine/handlers/servedPause.d.ts +15 -0
  217. package/dist/types/lib/engine/handlers/stageError.d.ts +20 -0
  218. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +6 -1
  219. package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +3 -3
  220. package/dist/types/lib/engine/narrative/NarrativeFlowRecorder.d.ts +7 -1
  221. package/dist/types/lib/engine/narrative/formatting/resolveText.d.ts +6 -0
  222. package/dist/types/lib/engine/narrative/formatting/sentences.d.ts +16 -0
  223. package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +2 -0
  224. package/dist/types/lib/engine/narrative/recorders/WindowedNarrativeFlowRecorder.d.ts +0 -1
  225. package/dist/types/lib/engine/narrative/types.d.ts +18 -8
  226. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +8 -3
  227. package/dist/types/lib/engine/types.d.ts +4 -0
  228. package/dist/types/lib/memory/DiagnosticCollector.d.ts +12 -0
  229. package/dist/types/lib/memory/EventLog.d.ts +9 -0
  230. package/dist/types/lib/memory/StageContext.d.ts +22 -1
  231. package/dist/types/lib/memory/eventPosition.d.ts +18 -0
  232. package/dist/types/lib/memory/merge.d.ts +2 -1
  233. package/dist/types/lib/memory/redaction.d.ts +339 -17
  234. package/dist/types/lib/observer-queue/deferredDispatcher.d.ts +2 -2
  235. package/dist/types/lib/observer-queue/index.d.ts +7 -4
  236. package/dist/types/lib/pause/index.d.ts +1 -1
  237. package/dist/types/lib/pause/types.d.ts +20 -0
  238. package/dist/types/lib/reactive/index.d.ts +1 -1
  239. package/dist/types/lib/reactive/types.d.ts +0 -3
  240. package/dist/types/lib/recorder/EmitRecorder.d.ts +9 -0
  241. package/dist/types/lib/recorder/InOutRecorder.d.ts +5 -2
  242. package/dist/types/lib/runner/DeferredObserverTier.d.ts +4 -3
  243. package/dist/types/lib/runner/ExecutionRuntime.d.ts +3 -0
  244. package/dist/types/lib/runner/FlowChartExecutor.d.ts +11 -9
  245. package/dist/types/lib/runner/attach.d.ts +3 -1
  246. package/dist/types/lib/runner/checkpoint.d.ts +3 -1
  247. package/dist/types/lib/scope/ScopeFacade.d.ts +13 -1
  248. package/dist/types/lib/scope/protection/readonlyInput.d.ts +16 -6
  249. package/dist/types/lib/scope/providers/baseStateCompatible.d.ts +10 -24
  250. package/dist/types/lib/scope/providers/providers.d.ts +2 -2
  251. package/dist/types/lib/scope/providers/types.d.ts +4 -2
  252. package/dist/types/lib/scope/recorders/MetricRecorder.d.ts +2 -3
  253. package/dist/types/lib/scope/runtime.d.ts +48 -0
  254. package/dist/types/lib/scope/state/zod/defineScopeFromZod.d.ts +2 -2
  255. package/dist/types/lib/scope/state/zod/scopeFactory.d.ts +7 -3
  256. package/dist/types/lib/scope/state/zod/utils/validateHelper.d.ts +27 -18
  257. package/dist/types/recorders.d.ts +3 -0
  258. package/package.json +4 -3
  259. package/dist/esm/lib/contract/defineContract.d.ts +0 -18
  260. package/dist/esm/lib/contract/defineContract.js +0 -64
  261. package/dist/esm/lib/contract/openapi.d.ts +0 -18
  262. package/dist/esm/lib/contract/openapi.js +0 -98
  263. package/dist/lib/contract/defineContract.js +0 -68
  264. package/dist/lib/contract/openapi.js +0 -102
  265. package/dist/types/lib/contract/defineContract.d.ts +0 -18
  266. package/dist/types/lib/contract/openapi.d.ts +0 -18
@@ -0,0 +1,79 @@
1
+ /**
2
+ * One lifecycle for the three deferred batching drivers. Adapters supply
3
+ * the deferral mechanism; this module owns each batch from registration
4
+ * through dispatch or refusal, and each child's terminal cleanup.
5
+ * Internal only: the consumer contract remains `types.ts · DetachDriver`.
6
+ */
7
+ import { extractErrorInfo } from '../../errors/errorInfo.js';
8
+ import { asImpl, createHandle } from '../handle.js';
9
+ import { register, unregister } from '../registry.js';
10
+ export function createBatchSchedule(defer, runChild) {
11
+ let pending;
12
+ // Taking a batch retires its callback and releases its captured inputs.
13
+ // A callback captured by a scheduler that then threw must never take
14
+ // a newer batch. Retire BEFORE children/error formatting can re-enter.
15
+ function take(batch) {
16
+ if (pending !== batch)
17
+ return [];
18
+ pending = undefined;
19
+ return batch.splice(0);
20
+ }
21
+ return (child, input, refId) => {
22
+ const handle = createHandle(refId);
23
+ register(handle);
24
+ const item = { child, input, handle };
25
+ if (pending) {
26
+ pending.push(item);
27
+ return handle;
28
+ }
29
+ const batch = [item];
30
+ pending = batch;
31
+ try {
32
+ defer(() => {
33
+ // Start siblings in order without awaiting them. Reentrant
34
+ // scheduling belongs to a fresh batch with its own callback.
35
+ for (const work of take(batch)) {
36
+ executeOne(work, runChild).then(undefined, undefined);
37
+ }
38
+ });
39
+ }
40
+ catch (error) {
41
+ const refused = take(batch);
42
+ if (refused.length > 0) {
43
+ const failure = asError(error);
44
+ for (const work of refused) {
45
+ asImpl(work.handle)._markFailed(failure);
46
+ unregister(work.handle.id);
47
+ }
48
+ }
49
+ }
50
+ return handle;
51
+ };
52
+ }
53
+ async function executeOne(item, runChild) {
54
+ const impl = asImpl(item.handle);
55
+ impl._markRunning();
56
+ try {
57
+ impl._markDone(await runChild(item.child, item.input));
58
+ }
59
+ catch (error) {
60
+ impl._markFailed(asError(error));
61
+ }
62
+ finally {
63
+ unregister(impl.id);
64
+ }
65
+ }
66
+ function asError(error) {
67
+ try {
68
+ if (error instanceof Error)
69
+ return error;
70
+ return new Error(extractErrorInfo(error).message);
71
+ }
72
+ catch {
73
+ // Even classification can invoke user code (for example a revoked
74
+ // or stateful Proxy). Describing a refusal must not prevent it from
75
+ // settling the handle. Do not inspect the thrown value again here.
76
+ return new Error('Detached work failed; its thrown value could not be described.');
77
+ }
78
+ }
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2RldGFjaC9kcml2ZXJzL2JhdGNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBR0gsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVV0RCxNQUFNLFVBQVUsbUJBQW1CLENBQ2pDLEtBQWtDLEVBQ2xDLFFBQXFCO0lBRXJCLElBQUksT0FBK0IsQ0FBQztJQUVwQyx3RUFBd0U7SUFDeEUscUVBQXFFO0lBQ3JFLHVFQUF1RTtJQUN2RSxTQUFTLElBQUksQ0FBQyxLQUFpQjtRQUM3QixJQUFJLE9BQU8sS0FBSyxLQUFLO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDakMsT0FBTyxHQUFHLFNBQVMsQ0FBQztRQUNwQixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQzdCLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakIsTUFBTSxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQ3RDLElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsSUFBSSxDQUFDO1lBQ0gsS0FBSyxDQUFDLEdBQUcsRUFBRTtnQkFDVCwyREFBMkQ7Z0JBQzNELDZEQUE2RDtnQkFDN0QsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDL0IsVUFBVSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUN4RCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QixJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDL0IsS0FBSyxNQUFNLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQztvQkFDM0IsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3pDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsS0FBSyxVQUFVLFVBQVUsQ0FBQyxJQUFjLEVBQUUsUUFBcUI7SUFDN0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDcEIsSUFBSSxDQUFDO1FBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNuQyxDQUFDO1lBQVMsQ0FBQztRQUNULFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdEIsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxLQUFjO0lBQzdCLElBQUksQ0FBQztRQUNILElBQUksS0FBSyxZQUFZLEtBQUs7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN6QyxPQUFPLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxrRUFBa0U7UUFDbEUsb0VBQW9FO1FBQ3BFLG1FQUFtRTtRQUNuRSxPQUFPLElBQUksS0FBSyxDQUFDLGdFQUFnRSxDQUFDLENBQUM7SUFDckYsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE9uZSBsaWZlY3ljbGUgZm9yIHRoZSB0aHJlZSBkZWZlcnJlZCBiYXRjaGluZyBkcml2ZXJzLiBBZGFwdGVycyBzdXBwbHlcbiAqIHRoZSBkZWZlcnJhbCBtZWNoYW5pc207IHRoaXMgbW9kdWxlIG93bnMgZWFjaCBiYXRjaCBmcm9tIHJlZ2lzdHJhdGlvblxuICogdGhyb3VnaCBkaXNwYXRjaCBvciByZWZ1c2FsLCBhbmQgZWFjaCBjaGlsZCdzIHRlcm1pbmFsIGNsZWFudXAuXG4gKiBJbnRlcm5hbCBvbmx5OiB0aGUgY29uc3VtZXIgY29udHJhY3QgcmVtYWlucyBgdHlwZXMudHMgwrcgRGV0YWNoRHJpdmVyYC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEZsb3dDaGFydCB9IGZyb20gJy4uLy4uL2J1aWxkZXIvdHlwZXMuanMnO1xuaW1wb3J0IHsgZXh0cmFjdEVycm9ySW5mbyB9IGZyb20gJy4uLy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHsgYXNJbXBsLCBjcmVhdGVIYW5kbGUgfSBmcm9tICcuLi9oYW5kbGUuanMnO1xuaW1wb3J0IHsgcmVnaXN0ZXIsIHVucmVnaXN0ZXIgfSBmcm9tICcuLi9yZWdpc3RyeS5qcyc7XG5pbXBvcnQgdHlwZSB7IENoaWxkUnVubmVyIH0gZnJvbSAnLi4vcnVuQ2hpbGQuanMnO1xuaW1wb3J0IHR5cGUgeyBEZXRhY2hEcml2ZXIsIERldGFjaEhhbmRsZSB9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuaW50ZXJmYWNlIFdvcmtJdGVtIHtcbiAgcmVhZG9ubHkgY2hpbGQ6IEZsb3dDaGFydDtcbiAgcmVhZG9ubHkgaW5wdXQ6IHVua25vd247XG4gIHJlYWRvbmx5IGhhbmRsZTogRGV0YWNoSGFuZGxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQmF0Y2hTY2hlZHVsZShcbiAgZGVmZXI6IChmbHVzaDogKCkgPT4gdm9pZCkgPT4gdm9pZCxcbiAgcnVuQ2hpbGQ6IENoaWxkUnVubmVyLFxuKTogRGV0YWNoRHJpdmVyWydzY2hlZHVsZSddIHtcbiAgbGV0IHBlbmRpbmc6IFdvcmtJdGVtW10gfCB1bmRlZmluZWQ7XG5cbiAgLy8gVGFraW5nIGEgYmF0Y2ggcmV0aXJlcyBpdHMgY2FsbGJhY2sgYW5kIHJlbGVhc2VzIGl0cyBjYXB0dXJlZCBpbnB1dHMuXG4gIC8vIEEgY2FsbGJhY2sgY2FwdHVyZWQgYnkgYSBzY2hlZHVsZXIgdGhhdCB0aGVuIHRocmV3IG11c3QgbmV2ZXIgdGFrZVxuICAvLyBhIG5ld2VyIGJhdGNoLiBSZXRpcmUgQkVGT1JFIGNoaWxkcmVuL2Vycm9yIGZvcm1hdHRpbmcgY2FuIHJlLWVudGVyLlxuICBmdW5jdGlvbiB0YWtlKGJhdGNoOiBXb3JrSXRlbVtdKTogV29ya0l0ZW1bXSB7XG4gICAgaWYgKHBlbmRpbmcgIT09IGJhdGNoKSByZXR1cm4gW107XG4gICAgcGVuZGluZyA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gYmF0Y2guc3BsaWNlKDApO1xuICB9XG5cbiAgcmV0dXJuIChjaGlsZCwgaW5wdXQsIHJlZklkKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlID0gY3JlYXRlSGFuZGxlKHJlZklkKTtcbiAgICByZWdpc3RlcihoYW5kbGUpO1xuICAgIGNvbnN0IGl0ZW0gPSB7IGNoaWxkLCBpbnB1dCwgaGFuZGxlIH07XG4gICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgIHBlbmRpbmcucHVzaChpdGVtKTtcbiAgICAgIHJldHVybiBoYW5kbGU7XG4gICAgfVxuXG4gICAgY29uc3QgYmF0Y2ggPSBbaXRlbV07XG4gICAgcGVuZGluZyA9IGJhdGNoO1xuICAgIHRyeSB7XG4gICAgICBkZWZlcigoKSA9PiB7XG4gICAgICAgIC8vIFN0YXJ0IHNpYmxpbmdzIGluIG9yZGVyIHdpdGhvdXQgYXdhaXRpbmcgdGhlbS4gUmVlbnRyYW50XG4gICAgICAgIC8vIHNjaGVkdWxpbmcgYmVsb25ncyB0byBhIGZyZXNoIGJhdGNoIHdpdGggaXRzIG93biBjYWxsYmFjay5cbiAgICAgICAgZm9yIChjb25zdCB3b3JrIG9mIHRha2UoYmF0Y2gpKSB7XG4gICAgICAgICAgZXhlY3V0ZU9uZSh3b3JrLCBydW5DaGlsZCkudGhlbih1bmRlZmluZWQsIHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCByZWZ1c2VkID0gdGFrZShiYXRjaCk7XG4gICAgICBpZiAocmVmdXNlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGZhaWx1cmUgPSBhc0Vycm9yKGVycm9yKTtcbiAgICAgICAgZm9yIChjb25zdCB3b3JrIG9mIHJlZnVzZWQpIHtcbiAgICAgICAgICBhc0ltcGwod29yay5oYW5kbGUpLl9tYXJrRmFpbGVkKGZhaWx1cmUpO1xuICAgICAgICAgIHVucmVnaXN0ZXIod29yay5oYW5kbGUuaWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYW5kbGU7XG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVPbmUoaXRlbTogV29ya0l0ZW0sIHJ1bkNoaWxkOiBDaGlsZFJ1bm5lcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBpbXBsID0gYXNJbXBsKGl0ZW0uaGFuZGxlKTtcbiAgaW1wbC5fbWFya1J1bm5pbmcoKTtcbiAgdHJ5IHtcbiAgICBpbXBsLl9tYXJrRG9uZShhd2FpdCBydW5DaGlsZChpdGVtLmNoaWxkLCBpdGVtLmlucHV0KSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaW1wbC5fbWFya0ZhaWxlZChhc0Vycm9yKGVycm9yKSk7XG4gIH0gZmluYWxseSB7XG4gICAgdW5yZWdpc3RlcihpbXBsLmlkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc0Vycm9yKGVycm9yOiB1bmtub3duKTogRXJyb3Ige1xuICB0cnkge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihleHRyYWN0RXJyb3JJbmZvKGVycm9yKS5tZXNzYWdlKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gRXZlbiBjbGFzc2lmaWNhdGlvbiBjYW4gaW52b2tlIHVzZXIgY29kZSAoZm9yIGV4YW1wbGUgYSByZXZva2VkXG4gICAgLy8gb3Igc3RhdGVmdWwgUHJveHkpLiBEZXNjcmliaW5nIGEgcmVmdXNhbCBtdXN0IG5vdCBwcmV2ZW50IGl0IGZyb21cbiAgICAvLyBzZXR0bGluZyB0aGUgaGFuZGxlLiBEbyBub3QgaW5zcGVjdCB0aGUgdGhyb3duIHZhbHVlIGFnYWluIGhlcmUuXG4gICAgcmV0dXJuIG5ldyBFcnJvcignRGV0YWNoZWQgd29yayBmYWlsZWQ7IGl0cyB0aHJvd24gdmFsdWUgY291bGQgbm90IGJlIGRlc2NyaWJlZC4nKTtcbiAgfVxufVxuIl19
@@ -1,16 +1,15 @@
1
1
  /**
2
2
  * detach/drivers/microtaskBatch.ts — Batch detached work into ONE microtask.
3
3
  *
4
- * Pattern: Producer-consumer with batched flush. Same shape as
5
- * agentfootprint's `EventDispatcher` flush queue and the React
6
- * reconciler's microtask scheduling — accumulate during the
7
- * current sync slice, drain at the next microtask boundary.
4
+ * Pattern: Producer-consumer with batched flush — accumulate during
5
+ * the current sync slice, drain at the next microtask boundary.
6
+ * `batch.ts · createBatchSchedule` owns the lifecycle shared
7
+ * with the timeout and immediate-tick drivers.
8
8
  * Role: The in-process driver the docs name (no driver is the default:
9
- * every detach call passes one). Cheapest scheduling
10
- * primitive on V8/JSC: one `queueMicrotask` per batch
11
- * regardless of how many work items, so the perf budget
12
- * amortizes. Suitable for browser AND node AND edge runtimes
13
- * (queueMicrotask is universal since 2018).
9
+ * every detach call passes one). One `queueMicrotask` per
10
+ * batch amortizes scheduling cost across its work items.
11
+ * Suitable for browser, Node and edge runtimes that provide
12
+ * `queueMicrotask`.
14
13
  *
15
14
  * Lifecycle:
16
15
  *
@@ -18,7 +17,8 @@
18
17
  * └─ create handle (queued)
19
18
  * └─ register in detachRegistry
20
19
  * └─ push work item onto local queue
21
- * └─ if no microtask scheduled yet → queueMicrotask(flush)
20
+ * └─ if this is a new batch → queueMicrotask(flush)
21
+ * └─ on scheduling failure → retire batch, fail + unregister handles
22
22
  * └─ return handle (sync — passive recorder rule)
23
23
  *
24
24
  * flush() (microtask) ← deferred
@@ -27,18 +27,15 @@
27
27
  * └─ unregister handle from detachRegistry
28
28
  *
29
29
  * Why microtask (and not setImmediate / setTimeout):
30
- * - Microtasks run BEFORE returning to the event loop — guarantees
31
- * the work finishes within the current "tick" if the runtime allows
32
- * - Lowest possible deferral cost (~50ns on modern V8)
33
- * - Works in EVERY JS runtime (browser, node, deno, bun, edge)
34
- * - Doesn't require any timer infrastructure → no GC pressure
30
+ * - Microtasks start BEFORE returning to the event loop; an async
31
+ * child can still finish on a later tick
32
+ * - No timer delay or Node-only scheduling API is required
35
33
  *
36
34
  * Re-entrancy:
37
- * - If `runChild` calls `schedule()` for nested detach, the new item
38
- * lands on the SAME queue. Because `scheduled` flips back to false
39
- * at the start of `flush`, the new item triggers a fresh microtask.
40
- * - Worst-case: O(n) microtasks for n nested levels. Acceptable —
41
- * real-world detach trees are shallow.
35
+ * - A flush retires its batch before starting children. If `runChild`
36
+ * calls `schedule()` for nested detach, it opens a fresh batch and
37
+ * schedules a new microtask.
38
+ * - A chain of n nested detaches needs n microtask boundaries
42
39
  */
43
40
  import { type ChildRunner } from '../runChild.js';
44
41
  import type { DetachDriver } from '../types.js';
@@ -1,16 +1,15 @@
1
1
  /**
2
2
  * detach/drivers/microtaskBatch.ts — Batch detached work into ONE microtask.
3
3
  *
4
- * Pattern: Producer-consumer with batched flush. Same shape as
5
- * agentfootprint's `EventDispatcher` flush queue and the React
6
- * reconciler's microtask scheduling — accumulate during the
7
- * current sync slice, drain at the next microtask boundary.
4
+ * Pattern: Producer-consumer with batched flush — accumulate during
5
+ * the current sync slice, drain at the next microtask boundary.
6
+ * `batch.ts · createBatchSchedule` owns the lifecycle shared
7
+ * with the timeout and immediate-tick drivers.
8
8
  * Role: The in-process driver the docs name (no driver is the default:
9
- * every detach call passes one). Cheapest scheduling
10
- * primitive on V8/JSC: one `queueMicrotask` per batch
11
- * regardless of how many work items, so the perf budget
12
- * amortizes. Suitable for browser AND node AND edge runtimes
13
- * (queueMicrotask is universal since 2018).
9
+ * every detach call passes one). One `queueMicrotask` per
10
+ * batch amortizes scheduling cost across its work items.
11
+ * Suitable for browser, Node and edge runtimes that provide
12
+ * `queueMicrotask`.
14
13
  *
15
14
  * Lifecycle:
16
15
  *
@@ -18,7 +17,8 @@
18
17
  * └─ create handle (queued)
19
18
  * └─ register in detachRegistry
20
19
  * └─ push work item onto local queue
21
- * └─ if no microtask scheduled yet → queueMicrotask(flush)
20
+ * └─ if this is a new batch → queueMicrotask(flush)
21
+ * └─ on scheduling failure → retire batch, fail + unregister handles
22
22
  * └─ return handle (sync — passive recorder rule)
23
23
  *
24
24
  * flush() (microtask) ← deferred
@@ -27,22 +27,18 @@
27
27
  * └─ unregister handle from detachRegistry
28
28
  *
29
29
  * Why microtask (and not setImmediate / setTimeout):
30
- * - Microtasks run BEFORE returning to the event loop — guarantees
31
- * the work finishes within the current "tick" if the runtime allows
32
- * - Lowest possible deferral cost (~50ns on modern V8)
33
- * - Works in EVERY JS runtime (browser, node, deno, bun, edge)
34
- * - Doesn't require any timer infrastructure → no GC pressure
30
+ * - Microtasks start BEFORE returning to the event loop; an async
31
+ * child can still finish on a later tick
32
+ * - No timer delay or Node-only scheduling API is required
35
33
  *
36
34
  * Re-entrancy:
37
- * - If `runChild` calls `schedule()` for nested detach, the new item
38
- * lands on the SAME queue. Because `scheduled` flips back to false
39
- * at the start of `flush`, the new item triggers a fresh microtask.
40
- * - Worst-case: O(n) microtasks for n nested levels. Acceptable —
41
- * real-world detach trees are shallow.
35
+ * - A flush retires its batch before starting children. If `runChild`
36
+ * calls `schedule()` for nested detach, it opens a fresh batch and
37
+ * schedules a new microtask.
38
+ * - A chain of n nested detaches needs n microtask boundaries
42
39
  */
43
- import { asImpl, createHandle } from '../handle.js';
44
- import { register, unregister } from '../registry.js';
45
40
  import { defaultRunChild } from '../runChild.js';
41
+ import { createBatchSchedule } from './batch.js';
46
42
  /**
47
43
  * Build a microtask-batch driver wired to a custom child runner. Most
48
44
  * consumers want the default singleton `microtaskBatchDriver` instead;
@@ -51,64 +47,16 @@ import { defaultRunChild } from '../runChild.js';
51
47
  * tracing context).
52
48
  */
53
49
  export function createMicrotaskBatchDriver(runChild = defaultRunChild) {
54
- // Per-driver-instance queue and flush guard. Closed over by `schedule`
55
- // and `flush` so each call to `createMicrotaskBatchDriver` gets its
56
- // own isolated batch (test isolation, multi-tenant scenarios).
57
- const queue = [];
58
- let scheduled = false;
59
- function flush() {
60
- // Reset BEFORE draining so re-entrant schedule()s during runChild
61
- // queue a fresh microtask instead of joining the in-flight drain.
62
- scheduled = false;
63
- const items = queue.splice(0);
64
- for (const item of items) {
65
- // Each item runs concurrently — no awaits here, so the outer
66
- // for-loop completes within this microtask. Errors inside
67
- // `executeOne` are routed to the handle, not thrown. The promise
68
- // is intentionally not awaited; ignore-promise-returned via the
69
- // explicit no-op .then() pattern that the project's lint config
70
- // accepts (vs `void`, which `no-void` rejects).
71
- executeOne(item, runChild).then(undefined, undefined);
72
- }
73
- }
74
50
  return {
75
51
  name: 'microtask-batch',
76
52
  capabilities: { browserSafe: true, nodeSafe: true, edgeSafe: true },
77
- schedule(child, input, refId) {
78
- const handle = createHandle(refId);
79
- register(handle);
80
- queue.push({ child, input, handle });
81
- if (!scheduled) {
82
- scheduled = true;
83
- queueMicrotask(flush);
84
- }
85
- return handle;
86
- },
53
+ schedule: createBatchSchedule((flush) => queueMicrotask(flush), runChild),
87
54
  };
88
55
  }
89
- /**
90
- * Per-item execution. Marks the handle running, awaits the runner,
91
- * routes outcome to the handle, cleans up the registry entry. Never
92
- * throws — errors land on the handle (passive recorder rule).
93
- */
94
- async function executeOne(item, runChild) {
95
- const impl = asImpl(item.handle);
96
- impl._markRunning();
97
- try {
98
- const result = await runChild(item.child, item.input);
99
- impl._markDone(result);
100
- }
101
- catch (err) {
102
- impl._markFailed(err instanceof Error ? err : new Error(String(err)));
103
- }
104
- finally {
105
- unregister(impl.id);
106
- }
107
- }
108
56
  /**
109
57
  * Ready-made singleton. Most consumers import this and pass it as the first
110
58
  * argument: `executor.detachAndJoinLater(microtaskBatchDriver, child, input)`.
111
59
  * It is not an implicit default — nothing picks a driver for you.
112
60
  */
113
61
  export const microtaskBatchDriver = createMicrotaskBatchDriver();
114
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm90YXNrQmF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2RldGFjaC9kcml2ZXJzL21pY3JvdGFza0JhdGNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlDRztBQUdILE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFvQixlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVNuRTs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQUMsV0FBd0IsZUFBZTtJQUNoRix1RUFBdUU7SUFDdkUsb0VBQW9FO0lBQ3BFLCtEQUErRDtJQUMvRCxNQUFNLEtBQUssR0FBZSxFQUFFLENBQUM7SUFDN0IsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBRXRCLFNBQVMsS0FBSztRQUNaLGtFQUFrRTtRQUNsRSxrRUFBa0U7UUFDbEUsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsNkRBQTZEO1lBQzdELDBEQUEwRDtZQUMxRCxpRUFBaUU7WUFDakUsZ0VBQWdFO1lBQ2hFLGdFQUFnRTtZQUNoRSxnREFBZ0Q7WUFDaEQsVUFBVSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3hELENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksRUFBRSxpQkFBaUI7UUFDdkIsWUFBWSxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7UUFDbkUsUUFBUSxDQUFDLEtBQWdCLEVBQUUsS0FBYyxFQUFFLEtBQWE7WUFDdEQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNqQixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDZixTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUNqQixjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsQ0FBQztZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsVUFBVSxDQUFDLElBQWMsRUFBRSxRQUFxQjtJQUM3RCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNwQixJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztZQUFTLENBQUM7UUFDVCxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFpQiwwQkFBMEIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBkZXRhY2gvZHJpdmVycy9taWNyb3Rhc2tCYXRjaC50cyDigJQgQmF0Y2ggZGV0YWNoZWQgd29yayBpbnRvIE9ORSBtaWNyb3Rhc2suXG4gKlxuICogUGF0dGVybjogIFByb2R1Y2VyLWNvbnN1bWVyIHdpdGggYmF0Y2hlZCBmbHVzaC4gU2FtZSBzaGFwZSBhc1xuICogICAgICAgICAgIGFnZW50Zm9vdHByaW50J3MgYEV2ZW50RGlzcGF0Y2hlcmAgZmx1c2ggcXVldWUgYW5kIHRoZSBSZWFjdFxuICogICAgICAgICAgIHJlY29uY2lsZXIncyBtaWNyb3Rhc2sgc2NoZWR1bGluZyDigJQgYWNjdW11bGF0ZSBkdXJpbmcgdGhlXG4gKiAgICAgICAgICAgY3VycmVudCBzeW5jIHNsaWNlLCBkcmFpbiBhdCB0aGUgbmV4dCBtaWNyb3Rhc2sgYm91bmRhcnkuXG4gKiBSb2xlOiAgICAgVGhlIGluLXByb2Nlc3MgZHJpdmVyIHRoZSBkb2NzIG5hbWUgKG5vIGRyaXZlciBpcyB0aGUgZGVmYXVsdDpcbiAqICAgICAgICAgICBldmVyeSBkZXRhY2ggY2FsbCBwYXNzZXMgb25lKS4gQ2hlYXBlc3Qgc2NoZWR1bGluZ1xuICogICAgICAgICAgIHByaW1pdGl2ZSBvbiBWOC9KU0M6IG9uZSBgcXVldWVNaWNyb3Rhc2tgIHBlciBiYXRjaFxuICogICAgICAgICAgIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgd29yayBpdGVtcywgc28gdGhlIHBlcmYgYnVkZ2V0XG4gKiAgICAgICAgICAgYW1vcnRpemVzLiBTdWl0YWJsZSBmb3IgYnJvd3NlciBBTkQgbm9kZSBBTkQgZWRnZSBydW50aW1lc1xuICogICAgICAgICAgIChxdWV1ZU1pY3JvdGFzayBpcyB1bml2ZXJzYWwgc2luY2UgMjAxOCkuXG4gKlxuICogTGlmZWN5Y2xlOlxuICpcbiAqICAgc2NoZWR1bGUoY2hpbGQsIGlucHV0LCByZWZJZCkgICAgICAgICAgICDihpAgZHJpdmVyIGVudHJ5XG4gKiAgICAg4pSU4pSAIGNyZWF0ZSBoYW5kbGUgKHF1ZXVlZClcbiAqICAgICDilJTilIAgcmVnaXN0ZXIgaW4gZGV0YWNoUmVnaXN0cnlcbiAqICAgICDilJTilIAgcHVzaCB3b3JrIGl0ZW0gb250byBsb2NhbCBxdWV1ZVxuICogICAgIOKUlOKUgCBpZiBubyBtaWNyb3Rhc2sgc2NoZWR1bGVkIHlldCDihpIgcXVldWVNaWNyb3Rhc2soZmx1c2gpXG4gKiAgICAg4pSU4pSAIHJldHVybiBoYW5kbGUgKHN5bmMg4oCUIHBhc3NpdmUgcmVjb3JkZXIgcnVsZSlcbiAqXG4gKiAgIGZsdXNoKCkgKG1pY3JvdGFzaykgICAgICAgICAgICAgICAgICAgICAgIOKGkCBkZWZlcnJlZFxuICogICAgIOKUlOKUgCBzd2FwIG91dCBxdWV1ZSAoZHJhaW4gcmFjZXMgc2FmZWx5KVxuICogICAgIOKUlOKUgCBmb3IgZWFjaCBpdGVtOiBfbWFya1J1bm5pbmcsIGF3YWl0IHJ1bkNoaWxkLCBfbWFya0RvbmUvX21hcmtGYWlsZWRcbiAqICAgICDilJTilIAgdW5yZWdpc3RlciBoYW5kbGUgZnJvbSBkZXRhY2hSZWdpc3RyeVxuICpcbiAqIFdoeSBtaWNyb3Rhc2sgKGFuZCBub3Qgc2V0SW1tZWRpYXRlIC8gc2V0VGltZW91dCk6XG4gKiAgIC0gTWljcm90YXNrcyBydW4gQkVGT1JFIHJldHVybmluZyB0byB0aGUgZXZlbnQgbG9vcCDigJQgZ3VhcmFudGVlc1xuICogICAgIHRoZSB3b3JrIGZpbmlzaGVzIHdpdGhpbiB0aGUgY3VycmVudCBcInRpY2tcIiBpZiB0aGUgcnVudGltZSBhbGxvd3NcbiAqICAgLSBMb3dlc3QgcG9zc2libGUgZGVmZXJyYWwgY29zdCAofjUwbnMgb24gbW9kZXJuIFY4KVxuICogICAtIFdvcmtzIGluIEVWRVJZIEpTIHJ1bnRpbWUgKGJyb3dzZXIsIG5vZGUsIGRlbm8sIGJ1biwgZWRnZSlcbiAqICAgLSBEb2Vzbid0IHJlcXVpcmUgYW55IHRpbWVyIGluZnJhc3RydWN0dXJlIOKGkiBubyBHQyBwcmVzc3VyZVxuICpcbiAqIFJlLWVudHJhbmN5OlxuICogICAtIElmIGBydW5DaGlsZGAgY2FsbHMgYHNjaGVkdWxlKClgIGZvciBuZXN0ZWQgZGV0YWNoLCB0aGUgbmV3IGl0ZW1cbiAqICAgICBsYW5kcyBvbiB0aGUgU0FNRSBxdWV1ZS4gQmVjYXVzZSBgc2NoZWR1bGVkYCBmbGlwcyBiYWNrIHRvIGZhbHNlXG4gKiAgICAgYXQgdGhlIHN0YXJ0IG9mIGBmbHVzaGAsIHRoZSBuZXcgaXRlbSB0cmlnZ2VycyBhIGZyZXNoIG1pY3JvdGFzay5cbiAqICAgLSBXb3JzdC1jYXNlOiBPKG4pIG1pY3JvdGFza3MgZm9yIG4gbmVzdGVkIGxldmVscy4gQWNjZXB0YWJsZSDigJRcbiAqICAgICByZWFsLXdvcmxkIGRldGFjaCB0cmVlcyBhcmUgc2hhbGxvdy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEZsb3dDaGFydCB9IGZyb20gJy4uLy4uL2J1aWxkZXIvdHlwZXMuanMnO1xuaW1wb3J0IHsgYXNJbXBsLCBjcmVhdGVIYW5kbGUgfSBmcm9tICcuLi9oYW5kbGUuanMnO1xuaW1wb3J0IHsgcmVnaXN0ZXIsIHVucmVnaXN0ZXIgfSBmcm9tICcuLi9yZWdpc3RyeS5qcyc7XG5pbXBvcnQgeyB0eXBlIENoaWxkUnVubmVyLCBkZWZhdWx0UnVuQ2hpbGQgfSBmcm9tICcuLi9ydW5DaGlsZC5qcyc7XG5pbXBvcnQgdHlwZSB7IERldGFjaERyaXZlciwgRGV0YWNoSGFuZGxlIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5pbnRlcmZhY2UgV29ya0l0ZW0ge1xuICByZWFkb25seSBjaGlsZDogRmxvd0NoYXJ0O1xuICByZWFkb25seSBpbnB1dDogdW5rbm93bjtcbiAgcmVhZG9ubHkgaGFuZGxlOiBEZXRhY2hIYW5kbGU7XG59XG5cbi8qKlxuICogQnVpbGQgYSBtaWNyb3Rhc2stYmF0Y2ggZHJpdmVyIHdpcmVkIHRvIGEgY3VzdG9tIGNoaWxkIHJ1bm5lci4gTW9zdFxuICogY29uc3VtZXJzIHdhbnQgdGhlIGRlZmF1bHQgc2luZ2xldG9uIGBtaWNyb3Rhc2tCYXRjaERyaXZlcmAgaW5zdGVhZDtcbiAqIHRoaXMgZmFjdG9yeSBleGlzdHMgZm9yIHRlc3RzIGFuZCBmb3IgYWR2YW5jZWQgY29uc3VtZXJzIHdobyB3YW50IHRvXG4gKiBpbmplY3QgdGhlaXIgb3duIHJ1bm5lciAoZS5nLiwgYSBydW5uZXIgdGhhdCB3cmFwcyB0aGUgY2hpbGQgaW4gYVxuICogdHJhY2luZyBjb250ZXh0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1pY3JvdGFza0JhdGNoRHJpdmVyKHJ1bkNoaWxkOiBDaGlsZFJ1bm5lciA9IGRlZmF1bHRSdW5DaGlsZCk6IERldGFjaERyaXZlciB7XG4gIC8vIFBlci1kcml2ZXItaW5zdGFuY2UgcXVldWUgYW5kIGZsdXNoIGd1YXJkLiBDbG9zZWQgb3ZlciBieSBgc2NoZWR1bGVgXG4gIC8vIGFuZCBgZmx1c2hgIHNvIGVhY2ggY2FsbCB0byBgY3JlYXRlTWljcm90YXNrQmF0Y2hEcml2ZXJgIGdldHMgaXRzXG4gIC8vIG93biBpc29sYXRlZCBiYXRjaCAodGVzdCBpc29sYXRpb24sIG11bHRpLXRlbmFudCBzY2VuYXJpb3MpLlxuICBjb25zdCBxdWV1ZTogV29ya0l0ZW1bXSA9IFtdO1xuICBsZXQgc2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZmx1c2goKTogdm9pZCB7XG4gICAgLy8gUmVzZXQgQkVGT1JFIGRyYWluaW5nIHNvIHJlLWVudHJhbnQgc2NoZWR1bGUoKXMgZHVyaW5nIHJ1bkNoaWxkXG4gICAgLy8gcXVldWUgYSBmcmVzaCBtaWNyb3Rhc2sgaW5zdGVhZCBvZiBqb2luaW5nIHRoZSBpbi1mbGlnaHQgZHJhaW4uXG4gICAgc2NoZWR1bGVkID0gZmFsc2U7XG4gICAgY29uc3QgaXRlbXMgPSBxdWV1ZS5zcGxpY2UoMCk7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAvLyBFYWNoIGl0ZW0gcnVucyBjb25jdXJyZW50bHkg4oCUIG5vIGF3YWl0cyBoZXJlLCBzbyB0aGUgb3V0ZXJcbiAgICAgIC8vIGZvci1sb29wIGNvbXBsZXRlcyB3aXRoaW4gdGhpcyBtaWNyb3Rhc2suIEVycm9ycyBpbnNpZGVcbiAgICAgIC8vIGBleGVjdXRlT25lYCBhcmUgcm91dGVkIHRvIHRoZSBoYW5kbGUsIG5vdCB0aHJvd24uIFRoZSBwcm9taXNlXG4gICAgICAvLyBpcyBpbnRlbnRpb25hbGx5IG5vdCBhd2FpdGVkOyBpZ25vcmUtcHJvbWlzZS1yZXR1cm5lZCB2aWEgdGhlXG4gICAgICAvLyBleHBsaWNpdCBuby1vcCAudGhlbigpIHBhdHRlcm4gdGhhdCB0aGUgcHJvamVjdCdzIGxpbnQgY29uZmlnXG4gICAgICAvLyBhY2NlcHRzICh2cyBgdm9pZGAsIHdoaWNoIGBuby12b2lkYCByZWplY3RzKS5cbiAgICAgIGV4ZWN1dGVPbmUoaXRlbSwgcnVuQ2hpbGQpLnRoZW4odW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ21pY3JvdGFzay1iYXRjaCcsXG4gICAgY2FwYWJpbGl0aWVzOiB7IGJyb3dzZXJTYWZlOiB0cnVlLCBub2RlU2FmZTogdHJ1ZSwgZWRnZVNhZmU6IHRydWUgfSxcbiAgICBzY2hlZHVsZShjaGlsZDogRmxvd0NoYXJ0LCBpbnB1dDogdW5rbm93biwgcmVmSWQ6IHN0cmluZyk6IERldGFjaEhhbmRsZSB7XG4gICAgICBjb25zdCBoYW5kbGUgPSBjcmVhdGVIYW5kbGUocmVmSWQpO1xuICAgICAgcmVnaXN0ZXIoaGFuZGxlKTtcbiAgICAgIHF1ZXVlLnB1c2goeyBjaGlsZCwgaW5wdXQsIGhhbmRsZSB9KTtcbiAgICAgIGlmICghc2NoZWR1bGVkKSB7XG4gICAgICAgIHNjaGVkdWxlZCA9IHRydWU7XG4gICAgICAgIHF1ZXVlTWljcm90YXNrKGZsdXNoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYW5kbGU7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBQZXItaXRlbSBleGVjdXRpb24uIE1hcmtzIHRoZSBoYW5kbGUgcnVubmluZywgYXdhaXRzIHRoZSBydW5uZXIsXG4gKiByb3V0ZXMgb3V0Y29tZSB0byB0aGUgaGFuZGxlLCBjbGVhbnMgdXAgdGhlIHJlZ2lzdHJ5IGVudHJ5LiBOZXZlclxuICogdGhyb3dzIOKAlCBlcnJvcnMgbGFuZCBvbiB0aGUgaGFuZGxlIChwYXNzaXZlIHJlY29yZGVyIHJ1bGUpLlxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlT25lKGl0ZW06IFdvcmtJdGVtLCBydW5DaGlsZDogQ2hpbGRSdW5uZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaW1wbCA9IGFzSW1wbChpdGVtLmhhbmRsZSk7XG4gIGltcGwuX21hcmtSdW5uaW5nKCk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuQ2hpbGQoaXRlbS5jaGlsZCwgaXRlbS5pbnB1dCk7XG4gICAgaW1wbC5fbWFya0RvbmUocmVzdWx0KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaW1wbC5fbWFya0ZhaWxlZChlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyKSkpO1xuICB9IGZpbmFsbHkge1xuICAgIHVucmVnaXN0ZXIoaW1wbC5pZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWFkeS1tYWRlIHNpbmdsZXRvbi4gTW9zdCBjb25zdW1lcnMgaW1wb3J0IHRoaXMgYW5kIHBhc3MgaXQgYXMgdGhlIGZpcnN0XG4gKiBhcmd1bWVudDogYGV4ZWN1dG9yLmRldGFjaEFuZEpvaW5MYXRlcihtaWNyb3Rhc2tCYXRjaERyaXZlciwgY2hpbGQsIGlucHV0KWAuXG4gKiBJdCBpcyBub3QgYW4gaW1wbGljaXQgZGVmYXVsdCDigJQgbm90aGluZyBwaWNrcyBhIGRyaXZlciBmb3IgeW91LlxuICovXG5leHBvcnQgY29uc3QgbWljcm90YXNrQmF0Y2hEcml2ZXI6IERldGFjaERyaXZlciA9IGNyZWF0ZU1pY3JvdGFza0JhdGNoRHJpdmVyKCk7XG4iXX0=
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm90YXNrQmF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2RldGFjaC9kcml2ZXJzL21pY3JvdGFza0JhdGNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNDRztBQUVILE9BQU8sRUFBb0IsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxXQUF3QixlQUFlO0lBQ2hGLE9BQU87UUFDTCxJQUFJLEVBQUUsaUJBQWlCO1FBQ3ZCLFlBQVksRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO1FBQ25FLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQztLQUMxRSxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBaUIsMEJBQTBCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZGV0YWNoL2RyaXZlcnMvbWljcm90YXNrQmF0Y2gudHMg4oCUIEJhdGNoIGRldGFjaGVkIHdvcmsgaW50byBPTkUgbWljcm90YXNrLlxuICpcbiAqIFBhdHRlcm46ICBQcm9kdWNlci1jb25zdW1lciB3aXRoIGJhdGNoZWQgZmx1c2gg4oCUIGFjY3VtdWxhdGUgZHVyaW5nXG4gKiAgICAgICAgICAgdGhlIGN1cnJlbnQgc3luYyBzbGljZSwgZHJhaW4gYXQgdGhlIG5leHQgbWljcm90YXNrIGJvdW5kYXJ5LlxuICogICAgICAgICAgIGBiYXRjaC50cyDCtyBjcmVhdGVCYXRjaFNjaGVkdWxlYCBvd25zIHRoZSBsaWZlY3ljbGUgc2hhcmVkXG4gKiAgICAgICAgICAgd2l0aCB0aGUgdGltZW91dCBhbmQgaW1tZWRpYXRlLXRpY2sgZHJpdmVycy5cbiAqIFJvbGU6ICAgICBUaGUgaW4tcHJvY2VzcyBkcml2ZXIgdGhlIGRvY3MgbmFtZSAobm8gZHJpdmVyIGlzIHRoZSBkZWZhdWx0OlxuICogICAgICAgICAgIGV2ZXJ5IGRldGFjaCBjYWxsIHBhc3NlcyBvbmUpLiBPbmUgYHF1ZXVlTWljcm90YXNrYCBwZXJcbiAqICAgICAgICAgICBiYXRjaCBhbW9ydGl6ZXMgc2NoZWR1bGluZyBjb3N0IGFjcm9zcyBpdHMgd29yayBpdGVtcy5cbiAqICAgICAgICAgICBTdWl0YWJsZSBmb3IgYnJvd3NlciwgTm9kZSBhbmQgZWRnZSBydW50aW1lcyB0aGF0IHByb3ZpZGVcbiAqICAgICAgICAgICBgcXVldWVNaWNyb3Rhc2tgLlxuICpcbiAqIExpZmVjeWNsZTpcbiAqXG4gKiAgIHNjaGVkdWxlKGNoaWxkLCBpbnB1dCwgcmVmSWQpICAgICAgICAgICAg4oaQIGRyaXZlciBlbnRyeVxuICogICAgIOKUlOKUgCBjcmVhdGUgaGFuZGxlIChxdWV1ZWQpXG4gKiAgICAg4pSU4pSAIHJlZ2lzdGVyIGluIGRldGFjaFJlZ2lzdHJ5XG4gKiAgICAg4pSU4pSAIHB1c2ggd29yayBpdGVtIG9udG8gbG9jYWwgcXVldWVcbiAqICAgICDilJTilIAgaWYgdGhpcyBpcyBhIG5ldyBiYXRjaCDihpIgcXVldWVNaWNyb3Rhc2soZmx1c2gpXG4gKiAgICAg4pSU4pSAIG9uIHNjaGVkdWxpbmcgZmFpbHVyZSDihpIgcmV0aXJlIGJhdGNoLCBmYWlsICsgdW5yZWdpc3RlciBoYW5kbGVzXG4gKiAgICAg4pSU4pSAIHJldHVybiBoYW5kbGUgKHN5bmMg4oCUIHBhc3NpdmUgcmVjb3JkZXIgcnVsZSlcbiAqXG4gKiAgIGZsdXNoKCkgKG1pY3JvdGFzaykgICAgICAgICAgICAgICAgICAgICAgIOKGkCBkZWZlcnJlZFxuICogICAgIOKUlOKUgCBzd2FwIG91dCBxdWV1ZSAoZHJhaW4gcmFjZXMgc2FmZWx5KVxuICogICAgIOKUlOKUgCBmb3IgZWFjaCBpdGVtOiBfbWFya1J1bm5pbmcsIGF3YWl0IHJ1bkNoaWxkLCBfbWFya0RvbmUvX21hcmtGYWlsZWRcbiAqICAgICDilJTilIAgdW5yZWdpc3RlciBoYW5kbGUgZnJvbSBkZXRhY2hSZWdpc3RyeVxuICpcbiAqIFdoeSBtaWNyb3Rhc2sgKGFuZCBub3Qgc2V0SW1tZWRpYXRlIC8gc2V0VGltZW91dCk6XG4gKiAgIC0gTWljcm90YXNrcyBzdGFydCBCRUZPUkUgcmV0dXJuaW5nIHRvIHRoZSBldmVudCBsb29wOyBhbiBhc3luY1xuICogICAgIGNoaWxkIGNhbiBzdGlsbCBmaW5pc2ggb24gYSBsYXRlciB0aWNrXG4gKiAgIC0gTm8gdGltZXIgZGVsYXkgb3IgTm9kZS1vbmx5IHNjaGVkdWxpbmcgQVBJIGlzIHJlcXVpcmVkXG4gKlxuICogUmUtZW50cmFuY3k6XG4gKiAgIC0gQSBmbHVzaCByZXRpcmVzIGl0cyBiYXRjaCBiZWZvcmUgc3RhcnRpbmcgY2hpbGRyZW4uIElmIGBydW5DaGlsZGBcbiAqICAgICBjYWxscyBgc2NoZWR1bGUoKWAgZm9yIG5lc3RlZCBkZXRhY2gsIGl0IG9wZW5zIGEgZnJlc2ggYmF0Y2ggYW5kXG4gKiAgICAgc2NoZWR1bGVzIGEgbmV3IG1pY3JvdGFzay5cbiAqICAgLSBBIGNoYWluIG9mIG4gbmVzdGVkIGRldGFjaGVzIG5lZWRzIG4gbWljcm90YXNrIGJvdW5kYXJpZXNcbiAqL1xuXG5pbXBvcnQgeyB0eXBlIENoaWxkUnVubmVyLCBkZWZhdWx0UnVuQ2hpbGQgfSBmcm9tICcuLi9ydW5DaGlsZC5qcyc7XG5pbXBvcnQgdHlwZSB7IERldGFjaERyaXZlciB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUJhdGNoU2NoZWR1bGUgfSBmcm9tICcuL2JhdGNoLmpzJztcblxuLyoqXG4gKiBCdWlsZCBhIG1pY3JvdGFzay1iYXRjaCBkcml2ZXIgd2lyZWQgdG8gYSBjdXN0b20gY2hpbGQgcnVubmVyLiBNb3N0XG4gKiBjb25zdW1lcnMgd2FudCB0aGUgZGVmYXVsdCBzaW5nbGV0b24gYG1pY3JvdGFza0JhdGNoRHJpdmVyYCBpbnN0ZWFkO1xuICogdGhpcyBmYWN0b3J5IGV4aXN0cyBmb3IgdGVzdHMgYW5kIGZvciBhZHZhbmNlZCBjb25zdW1lcnMgd2hvIHdhbnQgdG9cbiAqIGluamVjdCB0aGVpciBvd24gcnVubmVyIChlLmcuLCBhIHJ1bm5lciB0aGF0IHdyYXBzIHRoZSBjaGlsZCBpbiBhXG4gKiB0cmFjaW5nIGNvbnRleHQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWljcm90YXNrQmF0Y2hEcml2ZXIocnVuQ2hpbGQ6IENoaWxkUnVubmVyID0gZGVmYXVsdFJ1bkNoaWxkKTogRGV0YWNoRHJpdmVyIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnbWljcm90YXNrLWJhdGNoJyxcbiAgICBjYXBhYmlsaXRpZXM6IHsgYnJvd3NlclNhZmU6IHRydWUsIG5vZGVTYWZlOiB0cnVlLCBlZGdlU2FmZTogdHJ1ZSB9LFxuICAgIHNjaGVkdWxlOiBjcmVhdGVCYXRjaFNjaGVkdWxlKChmbHVzaCkgPT4gcXVldWVNaWNyb3Rhc2soZmx1c2gpLCBydW5DaGlsZCksXG4gIH07XG59XG5cbi8qKlxuICogUmVhZHktbWFkZSBzaW5nbGV0b24uIE1vc3QgY29uc3VtZXJzIGltcG9ydCB0aGlzIGFuZCBwYXNzIGl0IGFzIHRoZSBmaXJzdFxuICogYXJndW1lbnQ6IGBleGVjdXRvci5kZXRhY2hBbmRKb2luTGF0ZXIobWljcm90YXNrQmF0Y2hEcml2ZXIsIGNoaWxkLCBpbnB1dClgLlxuICogSXQgaXMgbm90IGFuIGltcGxpY2l0IGRlZmF1bHQg4oCUIG5vdGhpbmcgcGlja3MgYSBkcml2ZXIgZm9yIHlvdS5cbiAqL1xuZXhwb3J0IGNvbnN0IG1pY3JvdGFza0JhdGNoRHJpdmVyOiBEZXRhY2hEcml2ZXIgPSBjcmVhdGVNaWNyb3Rhc2tCYXRjaERyaXZlcigpO1xuIl19
@@ -26,56 +26,25 @@
26
26
  * available in browsers / Deno / Cloudflare Workers (use
27
27
  * `setTimeoutDriver` for cross-runtime alternative)
28
28
  */
29
- import { asImpl, createHandle } from '../handle.js';
30
- import { register, unregister } from '../registry.js';
31
29
  import { defaultRunChild } from '../runChild.js';
30
+ import { createBatchSchedule } from './batch.js';
32
31
  export function createSetImmediateDriver(runChild = defaultRunChild) {
33
- const queue = [];
34
- let scheduled = false;
35
- function flush() {
36
- scheduled = false;
37
- const items = queue.splice(0);
38
- for (const item of items) {
39
- executeOne(item, runChild).then(undefined, undefined);
40
- }
41
- }
42
32
  return {
43
33
  name: 'set-immediate',
44
34
  capabilities: { nodeSafe: true },
45
35
  validate() {
46
- if (typeof setImmediate !== 'function') {
47
- throw new Error('[detach] setImmediateDriver requires Node.js — global `setImmediate` is not defined ' +
48
- 'in this runtime. Use `microtaskBatchDriver` for cross-runtime use, or `setTimeoutDriver` ' +
49
- 'for browser/edge environments.');
50
- }
51
- },
52
- schedule(child, input, refId) {
53
- const handle = createHandle(refId);
54
- register(handle);
55
- queue.push({ child, input, handle });
56
- if (!scheduled) {
57
- scheduled = true;
58
- // `setImmediate` is non-undefined here in Node; runtime guard
59
- // is in `validate()`. The `!` is a deliberate assertion.
60
- setImmediate(flush);
61
- }
62
- return handle;
36
+ scheduler();
63
37
  },
38
+ schedule: createBatchSchedule((flush) => scheduler()(flush), runChild),
64
39
  };
65
40
  }
66
- async function executeOne(item, runChild) {
67
- const impl = asImpl(item.handle);
68
- impl._markRunning();
69
- try {
70
- const result = await runChild(item.child, item.input);
71
- impl._markDone(result);
72
- }
73
- catch (err) {
74
- impl._markFailed(err instanceof Error ? err : new Error(String(err)));
75
- }
76
- finally {
77
- unregister(impl.id);
41
+ function scheduler() {
42
+ if (typeof setImmediate !== 'function') {
43
+ throw new Error('[detach] setImmediateDriver requires Node.js — global `setImmediate` is not defined ' +
44
+ 'in this runtime. Use `microtaskBatchDriver` for cross-runtime use, or `setTimeoutDriver` ' +
45
+ 'for browser/edge environments.');
78
46
  }
47
+ return setImmediate;
79
48
  }
80
49
  export const setImmediateDriver = createSetImmediateDriver();
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0SW1tZWRpYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9kZXRhY2gvZHJpdmVycy9zZXRJbW1lZGlhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUdILE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFvQixlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQWVuRSxNQUFNLFVBQVUsd0JBQXdCLENBQUMsV0FBd0IsZUFBZTtJQUM5RSxNQUFNLEtBQUssR0FBZSxFQUFFLENBQUM7SUFDN0IsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBRXRCLFNBQVMsS0FBSztRQUNaLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLFVBQVUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN4RCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLEVBQUUsZUFBZTtRQUNyQixZQUFZLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO1FBQ2hDLFFBQVE7WUFDTixJQUFJLE9BQU8sWUFBWSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUN2QyxNQUFNLElBQUksS0FBSyxDQUNiLHNGQUFzRjtvQkFDcEYsMkZBQTJGO29CQUMzRixnQ0FBZ0MsQ0FDbkMsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBQ0QsUUFBUSxDQUFDLEtBQWdCLEVBQUUsS0FBYyxFQUFFLEtBQWE7WUFDdEQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNqQixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDZixTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUNqQiw4REFBOEQ7Z0JBQzlELHlEQUF5RDtnQkFDekQsWUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZCLENBQUM7WUFDRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCxLQUFLLFVBQVUsVUFBVSxDQUFDLElBQWMsRUFBRSxRQUFxQjtJQUM3RCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNwQixJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztZQUFTLENBQUM7UUFDVCxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQWlCLHdCQUF3QixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGRldGFjaC9kcml2ZXJzL3NldEltbWVkaWF0ZS50cyDigJQgRGVmZXIgZGV0YWNoZWQgd29yayB0byBhIE5vZGUuanNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBzZXRJbW1lZGlhdGVgIGJvdW5kYXJ5LlxuICpcbiAqIFBhdHRlcm46ICBTYW1lIHByb2R1Y2VyLWNvbnN1bWVyIGJhdGNoIGZsdXNoIGFzIGBtaWNyb3Rhc2tCYXRjaGAsXG4gKiAgICAgICAgICAgYnV0IHRoZSBkZWZlcnJhbCBpcyBgc2V0SW1tZWRpYXRlYCBpbnN0ZWFkIG9mXG4gKiAgICAgICAgICAgYHF1ZXVlTWljcm90YXNrYC4gWWllbGRzIGNvbnRyb2wgYmFjayB0byB0aGUgZXZlbnQgbG9vcFxuICogICAgICAgICAgIEJFRk9SRSBydW5uaW5nIOKAlCBhbGxvd3MgcGVuZGluZyBJL08gY2FsbGJhY2tzIHRvIGRyYWluXG4gKiAgICAgICAgICAgZmlyc3QsIHdoaWNoIG1pY3JvdGFza3Mgd291bGQgYmxvY2suXG4gKiBSb2xlOiAgICAgTm9kZS1zcGVjaWZpYyBkcml2ZXIgZm9yIFwiZmlyZS1hbmQtZm9yZ2V0IGFmdGVyIHRoZVxuICogICAgICAgICAgIGN1cnJlbnQgSS9PIHRpY2suXCIgVXNlIHdoZW4gdGhlIHBhcmVudCBzdGFnZSBoYW5kbGVzXG4gKiAgICAgICAgICAgbGF0ZW5jeS1zZW5zaXRpdmUgd29yayBhbmQgeW91IGRvbid0IHdhbnQgZGV0YWNoZWQgd29ya1xuICogICAgICAgICAgIHRvIGNvbXBldGUgZm9yIHRoZSBzeW5jaHJvbm91cyBzbGljZS5cbiAqXG4gKiBXaGVuIHRvIHBpY2sgdGhpcyBvdmVyIG1pY3JvdGFza0JhdGNoOlxuICogICAtIFlvdSdyZSBzaGlwcGluZyBsb2dzIC8gbWV0cmljcyBpbiBhIGhvdCBIVFRQIHBhdGggYW5kIGRvbid0XG4gKiAgICAgd2FudCB0aGVtIGJsb2NraW5nIHRoZSByZXNwb25zZSBmcm9tIGJlaW5nIGZsdXNoZWRcbiAqICAgLSBUaGUgZGV0YWNoZWQgd29yayBpdHNlbGYgaXMgQ1BVLWhlYXZ5IGVub3VnaCB0aGF0IHJ1bm5pbmcgaXQgb25cbiAqICAgICB0aGUgc2FtZSBtaWNyb3Rhc2sgY3ljbGUgd291bGQgZGVsYXkgb3RoZXIgbWljcm90YXNrc1xuICogICAtIFlvdSBleHBsaWNpdGx5IHdhbnQgXCJuZXh0IGV2ZW50LWxvb3AgdGlja1wiIHNlbWFudGljcyDigJQgdXNlZnVsXG4gKiAgICAgd2hlbiBpbnRlcmFjdGluZyB3aXRoIHRoaXJkLXBhcnR5IGxpYnJhcmllcyB0aGF0IGV4cGVjdCBhdFxuICogICAgIGxlYXN0IG9uZSBJL08gdGljayBiZXR3ZWVuIHNjaGVkdWxlIGFuZCBleGVjdXRpb25cbiAqXG4gKiBDYXBhYmlsaXR5OlxuICogICAtIGBub2RlU2FmZTogdHJ1ZWAg4oCUIHJlbGllcyBvbiBOb2RlJ3MgYHNldEltbWVkaWF0ZWAsIE5PVFxuICogICAgIGF2YWlsYWJsZSBpbiBicm93c2VycyAvIERlbm8gLyBDbG91ZGZsYXJlIFdvcmtlcnMgKHVzZVxuICogICAgIGBzZXRUaW1lb3V0RHJpdmVyYCBmb3IgY3Jvc3MtcnVudGltZSBhbHRlcm5hdGl2ZSlcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEZsb3dDaGFydCB9IGZyb20gJy4uLy4uL2J1aWxkZXIvdHlwZXMuanMnO1xuaW1wb3J0IHsgYXNJbXBsLCBjcmVhdGVIYW5kbGUgfSBmcm9tICcuLi9oYW5kbGUuanMnO1xuaW1wb3J0IHsgcmVnaXN0ZXIsIHVucmVnaXN0ZXIgfSBmcm9tICcuLi9yZWdpc3RyeS5qcyc7XG5pbXBvcnQgeyB0eXBlIENoaWxkUnVubmVyLCBkZWZhdWx0UnVuQ2hpbGQgfSBmcm9tICcuLi9ydW5DaGlsZC5qcyc7XG5pbXBvcnQgdHlwZSB7IERldGFjaERyaXZlciwgRGV0YWNoSGFuZGxlIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG4vLyBOb2RlLW9ubHkgZ2xvYmFsLiBXZSBkb24ndCBzaGlwIEB0eXBlcy9ub2RlLCBzbyBkZWNsYXJlIHRoZSBtaW5pbWFsXG4vLyBzaGFwZSBoZXJlLiBgc2V0SW1tZWRpYXRlRHJpdmVyYCBhZHZlcnRpc2VzIGBub2RlU2FmZTogdHJ1ZWAgYW5kXG4vLyBgdmFsaWRhdGUoKWAgdGhyb3dzIGhlbHBmdWxseSBpZiBgc2V0SW1tZWRpYXRlYCBpcyB1bmRlZmluZWQgYXQgdXNlXG4vLyB0aW1lIChlLmcuLCBicm93c2VyIGJ1bmRsZSkuXG5kZWNsYXJlIGNvbnN0IHNldEltbWVkaWF0ZTogKChjYjogKCkgPT4gdm9pZCkgPT4gdW5rbm93bikgfCB1bmRlZmluZWQ7XG5cbmludGVyZmFjZSBXb3JrSXRlbSB7XG4gIHJlYWRvbmx5IGNoaWxkOiBGbG93Q2hhcnQ7XG4gIHJlYWRvbmx5IGlucHV0OiB1bmtub3duO1xuICByZWFkb25seSBoYW5kbGU6IERldGFjaEhhbmRsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNldEltbWVkaWF0ZURyaXZlcihydW5DaGlsZDogQ2hpbGRSdW5uZXIgPSBkZWZhdWx0UnVuQ2hpbGQpOiBEZXRhY2hEcml2ZXIge1xuICBjb25zdCBxdWV1ZTogV29ya0l0ZW1bXSA9IFtdO1xuICBsZXQgc2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZmx1c2goKTogdm9pZCB7XG4gICAgc2NoZWR1bGVkID0gZmFsc2U7XG4gICAgY29uc3QgaXRlbXMgPSBxdWV1ZS5zcGxpY2UoMCk7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICBleGVjdXRlT25lKGl0ZW0sIHJ1bkNoaWxkKS50aGVuKHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdzZXQtaW1tZWRpYXRlJyxcbiAgICBjYXBhYmlsaXRpZXM6IHsgbm9kZVNhZmU6IHRydWUgfSxcbiAgICB2YWxpZGF0ZSgpOiB2b2lkIHtcbiAgICAgIGlmICh0eXBlb2Ygc2V0SW1tZWRpYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnW2RldGFjaF0gc2V0SW1tZWRpYXRlRHJpdmVyIHJlcXVpcmVzIE5vZGUuanMg4oCUIGdsb2JhbCBgc2V0SW1tZWRpYXRlYCBpcyBub3QgZGVmaW5lZCAnICtcbiAgICAgICAgICAgICdpbiB0aGlzIHJ1bnRpbWUuIFVzZSBgbWljcm90YXNrQmF0Y2hEcml2ZXJgIGZvciBjcm9zcy1ydW50aW1lIHVzZSwgb3IgYHNldFRpbWVvdXREcml2ZXJgICcgK1xuICAgICAgICAgICAgJ2ZvciBicm93c2VyL2VkZ2UgZW52aXJvbm1lbnRzLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgICBzY2hlZHVsZShjaGlsZDogRmxvd0NoYXJ0LCBpbnB1dDogdW5rbm93biwgcmVmSWQ6IHN0cmluZyk6IERldGFjaEhhbmRsZSB7XG4gICAgICBjb25zdCBoYW5kbGUgPSBjcmVhdGVIYW5kbGUocmVmSWQpO1xuICAgICAgcmVnaXN0ZXIoaGFuZGxlKTtcbiAgICAgIHF1ZXVlLnB1c2goeyBjaGlsZCwgaW5wdXQsIGhhbmRsZSB9KTtcbiAgICAgIGlmICghc2NoZWR1bGVkKSB7XG4gICAgICAgIHNjaGVkdWxlZCA9IHRydWU7XG4gICAgICAgIC8vIGBzZXRJbW1lZGlhdGVgIGlzIG5vbi11bmRlZmluZWQgaGVyZSBpbiBOb2RlOyBydW50aW1lIGd1YXJkXG4gICAgICAgIC8vIGlzIGluIGB2YWxpZGF0ZSgpYC4gVGhlIGAhYCBpcyBhIGRlbGliZXJhdGUgYXNzZXJ0aW9uLlxuICAgICAgICBzZXRJbW1lZGlhdGUhKGZsdXNoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYW5kbGU7XG4gICAgfSxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZU9uZShpdGVtOiBXb3JrSXRlbSwgcnVuQ2hpbGQ6IENoaWxkUnVubmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGltcGwgPSBhc0ltcGwoaXRlbS5oYW5kbGUpO1xuICBpbXBsLl9tYXJrUnVubmluZygpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bkNoaWxkKGl0ZW0uY2hpbGQsIGl0ZW0uaW5wdXQpO1xuICAgIGltcGwuX21hcmtEb25lKHJlc3VsdCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGltcGwuX21hcmtGYWlsZWQoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIgOiBuZXcgRXJyb3IoU3RyaW5nKGVycikpKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB1bnJlZ2lzdGVyKGltcGwuaWQpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzZXRJbW1lZGlhdGVEcml2ZXI6IERldGFjaERyaXZlciA9IGNyZWF0ZVNldEltbWVkaWF0ZURyaXZlcigpO1xuIl19
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0SW1tZWRpYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9kZXRhY2gvZHJpdmVycy9zZXRJbW1lZGlhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUVILE9BQU8sRUFBb0IsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBUWpELE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxXQUF3QixlQUFlO0lBQzlFLE9BQU87UUFDTCxJQUFJLEVBQUUsZUFBZTtRQUNyQixZQUFZLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO1FBQ2hDLFFBQVE7WUFDTixTQUFTLEVBQUUsQ0FBQztRQUNkLENBQUM7UUFDRCxRQUFRLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQztLQUN2RSxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsU0FBUztJQUNoQixJQUFJLE9BQU8sWUFBWSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQ2Isc0ZBQXNGO1lBQ3BGLDJGQUEyRjtZQUMzRixnQ0FBZ0MsQ0FDbkMsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQWlCLHdCQUF3QixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGRldGFjaC9kcml2ZXJzL3NldEltbWVkaWF0ZS50cyDigJQgRGVmZXIgZGV0YWNoZWQgd29yayB0byBhIE5vZGUuanNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBzZXRJbW1lZGlhdGVgIGJvdW5kYXJ5LlxuICpcbiAqIFBhdHRlcm46ICBTYW1lIHByb2R1Y2VyLWNvbnN1bWVyIGJhdGNoIGZsdXNoIGFzIGBtaWNyb3Rhc2tCYXRjaGAsXG4gKiAgICAgICAgICAgYnV0IHRoZSBkZWZlcnJhbCBpcyBgc2V0SW1tZWRpYXRlYCBpbnN0ZWFkIG9mXG4gKiAgICAgICAgICAgYHF1ZXVlTWljcm90YXNrYC4gWWllbGRzIGNvbnRyb2wgYmFjayB0byB0aGUgZXZlbnQgbG9vcFxuICogICAgICAgICAgIEJFRk9SRSBydW5uaW5nIOKAlCBhbGxvd3MgcGVuZGluZyBJL08gY2FsbGJhY2tzIHRvIGRyYWluXG4gKiAgICAgICAgICAgZmlyc3QsIHdoaWNoIG1pY3JvdGFza3Mgd291bGQgYmxvY2suXG4gKiBSb2xlOiAgICAgTm9kZS1zcGVjaWZpYyBkcml2ZXIgZm9yIFwiZmlyZS1hbmQtZm9yZ2V0IGFmdGVyIHRoZVxuICogICAgICAgICAgIGN1cnJlbnQgSS9PIHRpY2suXCIgVXNlIHdoZW4gdGhlIHBhcmVudCBzdGFnZSBoYW5kbGVzXG4gKiAgICAgICAgICAgbGF0ZW5jeS1zZW5zaXRpdmUgd29yayBhbmQgeW91IGRvbid0IHdhbnQgZGV0YWNoZWQgd29ya1xuICogICAgICAgICAgIHRvIGNvbXBldGUgZm9yIHRoZSBzeW5jaHJvbm91cyBzbGljZS5cbiAqXG4gKiBXaGVuIHRvIHBpY2sgdGhpcyBvdmVyIG1pY3JvdGFza0JhdGNoOlxuICogICAtIFlvdSdyZSBzaGlwcGluZyBsb2dzIC8gbWV0cmljcyBpbiBhIGhvdCBIVFRQIHBhdGggYW5kIGRvbid0XG4gKiAgICAgd2FudCB0aGVtIGJsb2NraW5nIHRoZSByZXNwb25zZSBmcm9tIGJlaW5nIGZsdXNoZWRcbiAqICAgLSBUaGUgZGV0YWNoZWQgd29yayBpdHNlbGYgaXMgQ1BVLWhlYXZ5IGVub3VnaCB0aGF0IHJ1bm5pbmcgaXQgb25cbiAqICAgICB0aGUgc2FtZSBtaWNyb3Rhc2sgY3ljbGUgd291bGQgZGVsYXkgb3RoZXIgbWljcm90YXNrc1xuICogICAtIFlvdSBleHBsaWNpdGx5IHdhbnQgXCJuZXh0IGV2ZW50LWxvb3AgdGlja1wiIHNlbWFudGljcyDigJQgdXNlZnVsXG4gKiAgICAgd2hlbiBpbnRlcmFjdGluZyB3aXRoIHRoaXJkLXBhcnR5IGxpYnJhcmllcyB0aGF0IGV4cGVjdCBhdFxuICogICAgIGxlYXN0IG9uZSBJL08gdGljayBiZXR3ZWVuIHNjaGVkdWxlIGFuZCBleGVjdXRpb25cbiAqXG4gKiBDYXBhYmlsaXR5OlxuICogICAtIGBub2RlU2FmZTogdHJ1ZWAg4oCUIHJlbGllcyBvbiBOb2RlJ3MgYHNldEltbWVkaWF0ZWAsIE5PVFxuICogICAgIGF2YWlsYWJsZSBpbiBicm93c2VycyAvIERlbm8gLyBDbG91ZGZsYXJlIFdvcmtlcnMgKHVzZVxuICogICAgIGBzZXRUaW1lb3V0RHJpdmVyYCBmb3IgY3Jvc3MtcnVudGltZSBhbHRlcm5hdGl2ZSlcbiAqL1xuXG5pbXBvcnQgeyB0eXBlIENoaWxkUnVubmVyLCBkZWZhdWx0UnVuQ2hpbGQgfSBmcm9tICcuLi9ydW5DaGlsZC5qcyc7XG5pbXBvcnQgdHlwZSB7IERldGFjaERyaXZlciB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUJhdGNoU2NoZWR1bGUgfSBmcm9tICcuL2JhdGNoLmpzJztcblxuLy8gTm9kZS1vbmx5IGdsb2JhbC4gV2UgZG9uJ3Qgc2hpcCBAdHlwZXMvbm9kZSwgc28gZGVjbGFyZSB0aGUgbWluaW1hbFxuLy8gc2hhcGUgaGVyZS4gYHNldEltbWVkaWF0ZURyaXZlcmAgYWR2ZXJ0aXNlcyBgbm9kZVNhZmU6IHRydWVgLlxuLy8gQm90aCBleHBsaWNpdCBwcmVmbGlnaHQgYW5kIHNjaGVkdWxpbmcgY2hlY2sgYXZhaWxhYmlsaXR5IGxhemlseSxcbi8vIHNvIGltcG9ydGluZyB0aGlzIG1vZHVsZSBkb2VzIG5vdCByZXF1aXJlIHRoZSBOb2RlLW9ubHkgZ2xvYmFsLlxuZGVjbGFyZSBjb25zdCBzZXRJbW1lZGlhdGU6ICgoY2I6ICgpID0+IHZvaWQpID0+IHVua25vd24pIHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2V0SW1tZWRpYXRlRHJpdmVyKHJ1bkNoaWxkOiBDaGlsZFJ1bm5lciA9IGRlZmF1bHRSdW5DaGlsZCk6IERldGFjaERyaXZlciB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3NldC1pbW1lZGlhdGUnLFxuICAgIGNhcGFiaWxpdGllczogeyBub2RlU2FmZTogdHJ1ZSB9LFxuICAgIHZhbGlkYXRlKCk6IHZvaWQge1xuICAgICAgc2NoZWR1bGVyKCk7XG4gICAgfSxcbiAgICBzY2hlZHVsZTogY3JlYXRlQmF0Y2hTY2hlZHVsZSgoZmx1c2gpID0+IHNjaGVkdWxlcigpKGZsdXNoKSwgcnVuQ2hpbGQpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBzY2hlZHVsZXIoKTogKGNiOiAoKSA9PiB2b2lkKSA9PiB1bmtub3duIHtcbiAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnW2RldGFjaF0gc2V0SW1tZWRpYXRlRHJpdmVyIHJlcXVpcmVzIE5vZGUuanMg4oCUIGdsb2JhbCBgc2V0SW1tZWRpYXRlYCBpcyBub3QgZGVmaW5lZCAnICtcbiAgICAgICAgJ2luIHRoaXMgcnVudGltZS4gVXNlIGBtaWNyb3Rhc2tCYXRjaERyaXZlcmAgZm9yIGNyb3NzLXJ1bnRpbWUgdXNlLCBvciBgc2V0VGltZW91dERyaXZlcmAgJyArXG4gICAgICAgICdmb3IgYnJvd3Nlci9lZGdlIGVudmlyb25tZW50cy4nLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHNldEltbWVkaWF0ZTtcbn1cblxuZXhwb3J0IGNvbnN0IHNldEltbWVkaWF0ZURyaXZlcjogRGV0YWNoRHJpdmVyID0gY3JlYXRlU2V0SW1tZWRpYXRlRHJpdmVyKCk7XG4iXX0=
@@ -19,51 +19,18 @@
19
19
  * - Browser tab freezing / throttling can extend the delay
20
20
  * significantly. Don't rely on precise timing.
21
21
  */
22
- import { asImpl, createHandle } from '../handle.js';
23
- import { register, unregister } from '../registry.js';
24
22
  import { defaultRunChild } from '../runChild.js';
23
+ import { createBatchSchedule } from './batch.js';
25
24
  export function createSetTimeoutDriver(opts = {}) {
26
25
  const delayMs = opts.delayMs ?? 0;
27
26
  const runChild = opts.runChild ?? defaultRunChild;
28
- const queue = [];
29
- let scheduled = false;
30
- function flush() {
31
- scheduled = false;
32
- const items = queue.splice(0);
33
- for (const item of items) {
34
- executeOne(item, runChild).then(undefined, undefined);
35
- }
36
- }
37
27
  return {
38
28
  name: delayMs === 0 ? 'set-timeout' : `set-timeout-${delayMs}ms`,
39
29
  capabilities: { browserSafe: true, nodeSafe: true, edgeSafe: true },
40
- schedule(child, input, refId) {
41
- const handle = createHandle(refId);
42
- register(handle);
43
- queue.push({ child, input, handle });
44
- if (!scheduled) {
45
- scheduled = true;
46
- setTimeout(flush, delayMs);
47
- }
48
- return handle;
49
- },
30
+ schedule: createBatchSchedule((flush) => setTimeout(flush, delayMs), runChild),
50
31
  };
51
32
  }
52
- async function executeOne(item, runChild) {
53
- const impl = asImpl(item.handle);
54
- impl._markRunning();
55
- try {
56
- const result = await runChild(item.child, item.input);
57
- impl._markDone(result);
58
- }
59
- catch (err) {
60
- impl._markFailed(err instanceof Error ? err : new Error(String(err)));
61
- }
62
- finally {
63
- unregister(impl.id);
64
- }
65
- }
66
33
  /** Default singleton — zero-delay (next macrotask). For configurable
67
34
  * delays, use `createSetTimeoutDriver({ delayMs })`. */
68
35
  export const setTimeoutDriver = createSetTimeoutDriver();
69
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0VGltZW91dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZGV0YWNoL2RyaXZlcnMvc2V0VGltZW91dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFHSCxPQUFPLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNwRCxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RELE9BQU8sRUFBb0IsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFpQm5FLE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxPQUFnQyxFQUFFO0lBQ3ZFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksZUFBZSxDQUFDO0lBQ2xELE1BQU0sS0FBSyxHQUFlLEVBQUUsQ0FBQztJQUM3QixJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFFdEIsU0FBUyxLQUFLO1FBQ1osU0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsVUFBVSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3hELENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksRUFBRSxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGVBQWUsT0FBTyxJQUFJO1FBQ2hFLFlBQVksRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO1FBQ25FLFFBQVEsQ0FBQyxLQUFnQixFQUFFLEtBQWMsRUFBRSxLQUFhO1lBQ3RELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakIsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2YsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDakIsVUFBVSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM3QixDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsS0FBSyxVQUFVLFVBQVUsQ0FBQyxJQUFjLEVBQUUsUUFBcUI7SUFDN0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDcEIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7WUFBUyxDQUFDO1FBQ1QsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN0QixDQUFDO0FBQ0gsQ0FBQztBQUVEO3lEQUN5RDtBQUN6RCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBaUIsc0JBQXNCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZGV0YWNoL2RyaXZlcnMvc2V0VGltZW91dC50cyDigJQgRGVmZXIgZGV0YWNoZWQgd29yayB2aWEgYHNldFRpbWVvdXQoLi4uLCBkZWxheU1zKWAuXG4gKlxuICogUGF0dGVybjogIFByb2R1Y2VyLWNvbnN1bWVyIGJhdGNoIGZsdXNoOyBkZWZlcnJhbCBtZWNoYW5pc20gaXNcbiAqICAgICAgICAgICBgc2V0VGltZW91dGAgd2l0aCBhIGNvbmZpZ3VyYWJsZSBkZWxheSAoZGVmYXVsdCBgMGApLlxuICogUm9sZTogICAgIENyb3NzLXJ1bnRpbWUgXCJuZXh0IG1hY3JvdGFza1wiIGRyaXZlci4gV29ya3MgaW4gYnJvd3NlcnMsXG4gKiAgICAgICAgICAgTm9kZS5qcywgRGVubywgQ2xvdWRmbGFyZSBXb3JrZXJzLCBCdW4sIGV0Yy5cbiAqXG4gKiBXaGVuIHRvIHBpY2sgdGhpczpcbiAqICAgLSBDb25zdW1lciB3YW50cyBhIFNQRUNJRklDIGRlbGF5IChlLmcuIFwic2hpcCB0ZWxlbWV0cnkgaW4gNVxuICogICAgIHNlY29uZHMsIGJhdGNoZWRcIikg4oCUIHBhc3MgYGNyZWF0ZVNldFRpbWVvdXREcml2ZXIoeyBkZWxheU1zOiA1MDAwIH0pYFxuICogICAtIENyb3NzLXJ1bnRpbWUgZGV0YWNoIHdoZXJlIGBzZXRJbW1lZGlhdGVgIGlzbid0IGF2YWlsYWJsZVxuICogICAtIENvYWxlc2NpbmcgaGlnaC1mcmVxdWVuY3kgZXZlbnRzIGludG8gYSBsb3ctZnJlcXVlbmN5IGZsdXNoXG4gKlxuICogQ2F2ZWF0czpcbiAqICAgLSBOb3QgZm9yIGxvdy1sYXRlbmN5IGhvdCBwYXRocyDigJQgbWluaW11bSBkZWxheSBpcyB+NG1zIGluXG4gKiAgICAgYnJvd3NlcnMgcGVyIHRoZSBIVE1MNSBzcGVjLCB+MW1zIGluIE5vZGUuIFVzZVxuICogICAgIGBtaWNyb3Rhc2tCYXRjaERyaXZlcmAgZm9yIHN1Yi1tcyBzY2hlZHVsaW5nLlxuICogICAtIEJyb3dzZXIgdGFiIGZyZWV6aW5nIC8gdGhyb3R0bGluZyBjYW4gZXh0ZW5kIHRoZSBkZWxheVxuICogICAgIHNpZ25pZmljYW50bHkuIERvbid0IHJlbHkgb24gcHJlY2lzZSB0aW1pbmcuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBGbG93Q2hhcnQgfSBmcm9tICcuLi8uLi9idWlsZGVyL3R5cGVzLmpzJztcbmltcG9ydCB7IGFzSW1wbCwgY3JlYXRlSGFuZGxlIH0gZnJvbSAnLi4vaGFuZGxlLmpzJztcbmltcG9ydCB7IHJlZ2lzdGVyLCB1bnJlZ2lzdGVyIH0gZnJvbSAnLi4vcmVnaXN0cnkuanMnO1xuaW1wb3J0IHsgdHlwZSBDaGlsZFJ1bm5lciwgZGVmYXVsdFJ1bkNoaWxkIH0gZnJvbSAnLi4vcnVuQ2hpbGQuanMnO1xuaW1wb3J0IHR5cGUgeyBEZXRhY2hEcml2ZXIsIERldGFjaEhhbmRsZSB9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuaW50ZXJmYWNlIFdvcmtJdGVtIHtcbiAgcmVhZG9ubHkgY2hpbGQ6IEZsb3dDaGFydDtcbiAgcmVhZG9ubHkgaW5wdXQ6IHVua25vd247XG4gIHJlYWRvbmx5IGhhbmRsZTogRGV0YWNoSGFuZGxlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldFRpbWVvdXREcml2ZXJPcHRpb25zIHtcbiAgLyoqIE1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBmbHVzaGluZyB0aGUgYmF0Y2guIERlZmF1bHQgMFxuICAgKiAgKG5leHQgbWFjcm90YXNrKS4gKi9cbiAgcmVhZG9ubHkgZGVsYXlNcz86IG51bWJlcjtcbiAgLyoqIEN1c3RvbSBgcnVuQ2hpbGRgLiBEZWZhdWx0cyB0byBzcGF3bmluZyBhIGBGbG93Q2hhcnRFeGVjdXRvcmAuICovXG4gIHJlYWRvbmx5IHJ1bkNoaWxkPzogQ2hpbGRSdW5uZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZXRUaW1lb3V0RHJpdmVyKG9wdHM6IFNldFRpbWVvdXREcml2ZXJPcHRpb25zID0ge30pOiBEZXRhY2hEcml2ZXIge1xuICBjb25zdCBkZWxheU1zID0gb3B0cy5kZWxheU1zID8/IDA7XG4gIGNvbnN0IHJ1bkNoaWxkID0gb3B0cy5ydW5DaGlsZCA/PyBkZWZhdWx0UnVuQ2hpbGQ7XG4gIGNvbnN0IHF1ZXVlOiBXb3JrSXRlbVtdID0gW107XG4gIGxldCBzY2hlZHVsZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBmbHVzaCgpOiB2b2lkIHtcbiAgICBzY2hlZHVsZWQgPSBmYWxzZTtcbiAgICBjb25zdCBpdGVtcyA9IHF1ZXVlLnNwbGljZSgwKTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgIGV4ZWN1dGVPbmUoaXRlbSwgcnVuQ2hpbGQpLnRoZW4odW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogZGVsYXlNcyA9PT0gMCA/ICdzZXQtdGltZW91dCcgOiBgc2V0LXRpbWVvdXQtJHtkZWxheU1zfW1zYCxcbiAgICBjYXBhYmlsaXRpZXM6IHsgYnJvd3NlclNhZmU6IHRydWUsIG5vZGVTYWZlOiB0cnVlLCBlZGdlU2FmZTogdHJ1ZSB9LFxuICAgIHNjaGVkdWxlKGNoaWxkOiBGbG93Q2hhcnQsIGlucHV0OiB1bmtub3duLCByZWZJZDogc3RyaW5nKTogRGV0YWNoSGFuZGxlIHtcbiAgICAgIGNvbnN0IGhhbmRsZSA9IGNyZWF0ZUhhbmRsZShyZWZJZCk7XG4gICAgICByZWdpc3RlcihoYW5kbGUpO1xuICAgICAgcXVldWUucHVzaCh7IGNoaWxkLCBpbnB1dCwgaGFuZGxlIH0pO1xuICAgICAgaWYgKCFzY2hlZHVsZWQpIHtcbiAgICAgICAgc2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgc2V0VGltZW91dChmbHVzaCwgZGVsYXlNcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFuZGxlO1xuICAgIH0sXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVPbmUoaXRlbTogV29ya0l0ZW0sIHJ1bkNoaWxkOiBDaGlsZFJ1bm5lcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBpbXBsID0gYXNJbXBsKGl0ZW0uaGFuZGxlKTtcbiAgaW1wbC5fbWFya1J1bm5pbmcoKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW5DaGlsZChpdGVtLmNoaWxkLCBpdGVtLmlucHV0KTtcbiAgICBpbXBsLl9tYXJrRG9uZShyZXN1bHQpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpbXBsLl9tYXJrRmFpbGVkKGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyIDogbmV3IEVycm9yKFN0cmluZyhlcnIpKSk7XG4gIH0gZmluYWxseSB7XG4gICAgdW5yZWdpc3RlcihpbXBsLmlkKTtcbiAgfVxufVxuXG4vKiogRGVmYXVsdCBzaW5nbGV0b24g4oCUIHplcm8tZGVsYXkgKG5leHQgbWFjcm90YXNrKS4gRm9yIGNvbmZpZ3VyYWJsZVxuICogIGRlbGF5cywgdXNlIGBjcmVhdGVTZXRUaW1lb3V0RHJpdmVyKHsgZGVsYXlNcyB9KWAuICovXG5leHBvcnQgY29uc3Qgc2V0VGltZW91dERyaXZlcjogRGV0YWNoRHJpdmVyID0gY3JlYXRlU2V0VGltZW91dERyaXZlcigpO1xuIl19
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0VGltZW91dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZGV0YWNoL2RyaXZlcnMvc2V0VGltZW91dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxPQUFPLEVBQW9CLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQVVqRCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsT0FBZ0MsRUFBRTtJQUN2RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQztJQUNsQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLGVBQWUsQ0FBQztJQUNsRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsZUFBZSxPQUFPLElBQUk7UUFDaEUsWUFBWSxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7UUFDbkUsUUFBUSxFQUFFLG1CQUFtQixDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxFQUFFLFFBQVEsQ0FBQztLQUMvRSxDQUFDO0FBQ0osQ0FBQztBQUVEO3lEQUN5RDtBQUN6RCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBaUIsc0JBQXNCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZGV0YWNoL2RyaXZlcnMvc2V0VGltZW91dC50cyDigJQgRGVmZXIgZGV0YWNoZWQgd29yayB2aWEgYHNldFRpbWVvdXQoLi4uLCBkZWxheU1zKWAuXG4gKlxuICogUGF0dGVybjogIFByb2R1Y2VyLWNvbnN1bWVyIGJhdGNoIGZsdXNoOyBkZWZlcnJhbCBtZWNoYW5pc20gaXNcbiAqICAgICAgICAgICBgc2V0VGltZW91dGAgd2l0aCBhIGNvbmZpZ3VyYWJsZSBkZWxheSAoZGVmYXVsdCBgMGApLlxuICogUm9sZTogICAgIENyb3NzLXJ1bnRpbWUgXCJuZXh0IG1hY3JvdGFza1wiIGRyaXZlci4gV29ya3MgaW4gYnJvd3NlcnMsXG4gKiAgICAgICAgICAgTm9kZS5qcywgRGVubywgQ2xvdWRmbGFyZSBXb3JrZXJzLCBCdW4sIGV0Yy5cbiAqXG4gKiBXaGVuIHRvIHBpY2sgdGhpczpcbiAqICAgLSBDb25zdW1lciB3YW50cyBhIFNQRUNJRklDIGRlbGF5IChlLmcuIFwic2hpcCB0ZWxlbWV0cnkgaW4gNVxuICogICAgIHNlY29uZHMsIGJhdGNoZWRcIikg4oCUIHBhc3MgYGNyZWF0ZVNldFRpbWVvdXREcml2ZXIoeyBkZWxheU1zOiA1MDAwIH0pYFxuICogICAtIENyb3NzLXJ1bnRpbWUgZGV0YWNoIHdoZXJlIGBzZXRJbW1lZGlhdGVgIGlzbid0IGF2YWlsYWJsZVxuICogICAtIENvYWxlc2NpbmcgaGlnaC1mcmVxdWVuY3kgZXZlbnRzIGludG8gYSBsb3ctZnJlcXVlbmN5IGZsdXNoXG4gKlxuICogQ2F2ZWF0czpcbiAqICAgLSBOb3QgZm9yIGxvdy1sYXRlbmN5IGhvdCBwYXRocyDigJQgbWluaW11bSBkZWxheSBpcyB+NG1zIGluXG4gKiAgICAgYnJvd3NlcnMgcGVyIHRoZSBIVE1MNSBzcGVjLCB+MW1zIGluIE5vZGUuIFVzZVxuICogICAgIGBtaWNyb3Rhc2tCYXRjaERyaXZlcmAgZm9yIHN1Yi1tcyBzY2hlZHVsaW5nLlxuICogICAtIEJyb3dzZXIgdGFiIGZyZWV6aW5nIC8gdGhyb3R0bGluZyBjYW4gZXh0ZW5kIHRoZSBkZWxheVxuICogICAgIHNpZ25pZmljYW50bHkuIERvbid0IHJlbHkgb24gcHJlY2lzZSB0aW1pbmcuXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBDaGlsZFJ1bm5lciwgZGVmYXVsdFJ1bkNoaWxkIH0gZnJvbSAnLi4vcnVuQ2hpbGQuanMnO1xuaW1wb3J0IHR5cGUgeyBEZXRhY2hEcml2ZXIgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVCYXRjaFNjaGVkdWxlIH0gZnJvbSAnLi9iYXRjaC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2V0VGltZW91dERyaXZlck9wdGlvbnMge1xuICAvKiogTWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGZsdXNoaW5nIHRoZSBiYXRjaC4gRGVmYXVsdCAwXG4gICAqICAobmV4dCBtYWNyb3Rhc2spLiAqL1xuICByZWFkb25seSBkZWxheU1zPzogbnVtYmVyO1xuICAvKiogQ3VzdG9tIGBydW5DaGlsZGAuIERlZmF1bHRzIHRvIHNwYXduaW5nIGEgYEZsb3dDaGFydEV4ZWN1dG9yYC4gKi9cbiAgcmVhZG9ubHkgcnVuQ2hpbGQ/OiBDaGlsZFJ1bm5lcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNldFRpbWVvdXREcml2ZXIob3B0czogU2V0VGltZW91dERyaXZlck9wdGlvbnMgPSB7fSk6IERldGFjaERyaXZlciB7XG4gIGNvbnN0IGRlbGF5TXMgPSBvcHRzLmRlbGF5TXMgPz8gMDtcbiAgY29uc3QgcnVuQ2hpbGQgPSBvcHRzLnJ1bkNoaWxkID8/IGRlZmF1bHRSdW5DaGlsZDtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBkZWxheU1zID09PSAwID8gJ3NldC10aW1lb3V0JyA6IGBzZXQtdGltZW91dC0ke2RlbGF5TXN9bXNgLFxuICAgIGNhcGFiaWxpdGllczogeyBicm93c2VyU2FmZTogdHJ1ZSwgbm9kZVNhZmU6IHRydWUsIGVkZ2VTYWZlOiB0cnVlIH0sXG4gICAgc2NoZWR1bGU6IGNyZWF0ZUJhdGNoU2NoZWR1bGUoKGZsdXNoKSA9PiBzZXRUaW1lb3V0KGZsdXNoLCBkZWxheU1zKSwgcnVuQ2hpbGQpLFxuICB9O1xufVxuXG4vKiogRGVmYXVsdCBzaW5nbGV0b24g4oCUIHplcm8tZGVsYXkgKG5leHQgbWFjcm90YXNrKS4gRm9yIGNvbmZpZ3VyYWJsZVxuICogIGRlbGF5cywgdXNlIGBjcmVhdGVTZXRUaW1lb3V0RHJpdmVyKHsgZGVsYXlNcyB9KWAuICovXG5leHBvcnQgY29uc3Qgc2V0VGltZW91dERyaXZlcjogRGV0YWNoRHJpdmVyID0gY3JlYXRlU2V0VGltZW91dERyaXZlcigpO1xuIl19
@@ -1,8 +1,7 @@
1
1
  /**
2
2
  * detach/types.ts — Type definitions for the fire-and-forget primitive.
3
3
  *
4
- * Pattern: Strategy + Bridge (GoF). Same shape as cache strategies in
5
- * agentfootprint v2.6 — ONE interface, N concrete drivers,
4
+ * Pattern: One strategy interface, concrete scheduling drivers,
6
5
  * consumer picks via explicit import.
7
6
  * Role: Foundation. Every other detach file imports from here.
8
7
  * This is the lockable contract; downstream files implement it.
@@ -17,20 +16,19 @@
17
16
  *
18
17
  * 2. `DetachHandle` — the consumer-facing handle returned by
19
18
  * `detachAndJoinLater`. Exposes status as PROPERTIES (sync read)
20
- * and `wait()` (Promise — opt-in async join). Style 2 from the
21
- * panel review: properties for sync, single method for async.
19
+ * and `wait()` (Promise — opt-in async join).
22
20
  *
23
21
  * Naming policy (locked from naming review):
24
22
  * - Public API uses simple verbs / properties (product-engineer friendly)
25
23
  * - Internal class names CAN use CS terms (Scheduler, Continuation, etc.)
26
24
  * - Drivers are algorithm-named (semantic at the algorithm level)
27
25
  *
28
- * Locked design decisions (panel review captured in
29
- * `docs/inspiration/detach-primitive.md`):
30
- * - Sync hot path; async only at flush boundaries
31
- * - Errors → commitLog + typed event, NEVER thrown to parent
32
- * - Scope isolation between parent and detached child
33
- * - Lifecycle tied to executor disposal
26
+ * Current lifecycle contract:
27
+ * - Return a handle synchronously; the selected driver owns dispatch
28
+ * - Scheduling/child errors → failed handle, never thrown to parent
29
+ * - `runChild.ts · defaultRunChild` uses an isolated child executor
30
+ * - `registry.ts` tracks in-flight handles for `flushAllDetached`
31
+ * - No automatic commit-log event or executor-disposal integration
34
32
  * - Type-level rejection of `outputMapper` on detach options
35
33
  */
36
34
  import type { FlowChart } from '../builder/types.js';
@@ -72,7 +70,8 @@ export interface DetachWaitResult {
72
70
  * failed → terminal: error available
73
71
  *
74
72
  * `done` and `failed` are TERMINAL — once reached, status never
75
- * changes again.
73
+ * changes again. A scheduling refusal can go straight from `queued`
74
+ * to `failed`, without starting the child.
76
75
  */
77
76
  export interface DetachHandle {
78
77
  /** Stable id assigned at detach time. Used as the lookup key in
@@ -150,8 +149,9 @@ export interface DriverCapabilities {
150
149
  * never waits for the driver's deferred work to complete
151
150
  *
152
151
  * Drivers MAY:
153
- * - Implement `validate()` for one-time configuration checks at
154
- * registration / use time (e.g., assert `navigator.sendBeacon` exists)
152
+ * - Implement `validate()` for explicit caller-controlled preflight
153
+ * checks (e.g., assert `navigator.sendBeacon` exists). Scheduling
154
+ * must still contain failures when preflight was not requested.
155
155
  * - Build their internal pipeline as a footprintjs flowChart for
156
156
  * observability — driver implementation detail, not consumer-facing
157
157
  *
@@ -184,17 +184,14 @@ export interface DetachDriver {
184
184
  */
185
185
  schedule(child: FlowChart, input: unknown, refId: string): DetachHandle;
186
186
  /**
187
- * Optional one-time validation hook. Called at first use (or
188
- * registration time, depending on driver) — drivers throw if their
189
- * configuration is invalid (missing peer dep, unreachable endpoint,
190
- * wrong API key shape, etc.).
187
+ * Optional preflight hook, invoked explicitly by the caller, never
188
+ * automatically by the detach entry points. It may throw if the
189
+ * configuration is invalid. `schedule()` must independently report
190
+ * scheduling failures through its handle, even without preflight.
191
191
  *
192
192
  * Example: `sendBeaconDriver.validate()` checks
193
193
  * `typeof navigator?.sendBeacon === 'function'` and throws with a
194
194
  * helpful message if absent (e.g., in Node).
195
- *
196
- * Per the New Relic panel review: early-fail-with-useful-message
197
- * beats silent zero-emission.
198
195
  */
199
196
  validate?(): void;
200
197
  }