@exactjs/core 0.6.1 → 0.6.3

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 (167) hide show
  1. package/AGENTS.md +12 -14
  2. package/README.md +6 -8
  3. package/dist/client/component-contract/continuation-validation.d.ts +5 -0
  4. package/dist/client/component-contract/continuation-validation.d.ts.map +1 -1
  5. package/dist/client/component-contract/continuation-validation.js +7 -0
  6. package/dist/client/component-contract/continuation-validation.js.map +1 -1
  7. package/dist/client/component-contract/contract-validation.d.ts.map +1 -1
  8. package/dist/client/component-contract/contract-validation.js +4 -1
  9. package/dist/client/component-contract/contract-validation.js.map +1 -1
  10. package/dist/client/component-contracts.d.ts +5 -0
  11. package/dist/client/component-contracts.d.ts.map +1 -1
  12. package/dist/client/component-contracts.js.map +1 -1
  13. package/dist/client/framework/component-contract-validation.d.ts +1 -1
  14. package/dist/client/framework/component-contract-validation.d.ts.map +1 -1
  15. package/dist/client/framework/component-contract-validation.js +1 -1
  16. package/dist/client/framework/component-contract-validation.js.map +1 -1
  17. package/dist/client/framework/operation-protocol.d.ts +9 -0
  18. package/dist/client/framework/operation-protocol.d.ts.map +1 -1
  19. package/dist/client/framework/operation-protocol.js.map +1 -1
  20. package/dist/client/framework/server-task-helpers.d.ts +1 -0
  21. package/dist/client/framework/server-task-helpers.d.ts.map +1 -1
  22. package/dist/client/framework/server-task-helpers.js +1 -0
  23. package/dist/client/framework/server-task-helpers.js.map +1 -1
  24. package/dist/client/framework/task-frames.d.ts +2 -1
  25. package/dist/client/framework/task-frames.d.ts.map +1 -1
  26. package/dist/client/framework/task-frames.js +1 -0
  27. package/dist/client/framework/task-frames.js.map +1 -1
  28. package/dist/client/runtime/tasks.d.ts +1 -0
  29. package/dist/client/runtime/tasks.d.ts.map +1 -1
  30. package/dist/client/runtime/tasks.js +1 -0
  31. package/dist/client/runtime/tasks.js.map +1 -1
  32. package/dist/client/tasks/contracts.d.ts +2 -0
  33. package/dist/client/tasks/contracts.d.ts.map +1 -1
  34. package/dist/client/tasks/contracts.js.map +1 -1
  35. package/dist/client/tasks/frame-continuation.d.ts +1 -1
  36. package/dist/client/tasks/frame-continuation.d.ts.map +1 -1
  37. package/dist/client/tasks/frame-continuation.js +21 -10
  38. package/dist/client/tasks/frame-continuation.js.map +1 -1
  39. package/dist/client/tasks/frame-runtime.d.ts +2 -2
  40. package/dist/client/tasks/frame-runtime.d.ts.map +1 -1
  41. package/dist/client/tasks/frame-runtime.js +14 -6
  42. package/dist/client/tasks/frame-runtime.js.map +1 -1
  43. package/dist/client/tasks/progress-bindings.d.ts +20 -0
  44. package/dist/client/tasks/progress-bindings.d.ts.map +1 -0
  45. package/dist/client/tasks/progress-bindings.js +51 -0
  46. package/dist/client/tasks/progress-bindings.js.map +1 -0
  47. package/dist/client/tasks/progress-receiver.d.ts +24 -0
  48. package/dist/client/tasks/progress-receiver.d.ts.map +1 -0
  49. package/dist/client/tasks/progress-receiver.js +71 -0
  50. package/dist/client/tasks/progress-receiver.js.map +1 -0
  51. package/dist/client/tasks/resources.d.ts.map +1 -1
  52. package/dist/client/tasks/resources.js +6 -3
  53. package/dist/client/tasks/resources.js.map +1 -1
  54. package/dist/client/tasks/scheduled-reactions.d.ts.map +1 -1
  55. package/dist/client/tasks/scheduled-reactions.js +9 -2
  56. package/dist/client/tasks/scheduled-reactions.js.map +1 -1
  57. package/dist/component-contract/continuation-validation.d.ts +5 -0
  58. package/dist/component-contract/continuation-validation.d.ts.map +1 -1
  59. package/dist/component-contract/continuation-validation.js +7 -0
  60. package/dist/component-contract/continuation-validation.js.map +1 -1
  61. package/dist/component-contract/contract-validation.d.ts.map +1 -1
  62. package/dist/component-contract/contract-validation.js +4 -1
  63. package/dist/component-contract/contract-validation.js.map +1 -1
  64. package/dist/component-contracts.d.ts +5 -0
  65. package/dist/component-contracts.d.ts.map +1 -1
  66. package/dist/component-contracts.js.map +1 -1
  67. package/dist/framework/component-contract-validation.d.ts +1 -1
  68. package/dist/framework/component-contract-validation.d.ts.map +1 -1
  69. package/dist/framework/component-contract-validation.js +1 -1
  70. package/dist/framework/component-contract-validation.js.map +1 -1
  71. package/dist/framework/operation-protocol.d.ts +9 -0
  72. package/dist/framework/operation-protocol.d.ts.map +1 -1
  73. package/dist/framework/operation-protocol.js.map +1 -1
  74. package/dist/framework/server-task-helpers.d.ts +1 -0
  75. package/dist/framework/server-task-helpers.d.ts.map +1 -1
  76. package/dist/framework/server-task-helpers.js +1 -0
  77. package/dist/framework/server-task-helpers.js.map +1 -1
  78. package/dist/framework/task-frames.d.ts +2 -1
  79. package/dist/framework/task-frames.d.ts.map +1 -1
  80. package/dist/framework/task-frames.js +1 -0
  81. package/dist/framework/task-frames.js.map +1 -1
  82. package/dist/runtime/tasks.d.ts +1 -0
  83. package/dist/runtime/tasks.d.ts.map +1 -1
  84. package/dist/runtime/tasks.js +1 -0
  85. package/dist/runtime/tasks.js.map +1 -1
  86. package/dist/server/component-contract/continuation-validation.d.ts +5 -0
  87. package/dist/server/component-contract/continuation-validation.d.ts.map +1 -1
  88. package/dist/server/component-contract/continuation-validation.js +7 -0
  89. package/dist/server/component-contract/continuation-validation.js.map +1 -1
  90. package/dist/server/component-contract/contract-validation.d.ts.map +1 -1
  91. package/dist/server/component-contract/contract-validation.js +4 -1
  92. package/dist/server/component-contract/contract-validation.js.map +1 -1
  93. package/dist/server/component-contracts.d.ts +5 -0
  94. package/dist/server/component-contracts.d.ts.map +1 -1
  95. package/dist/server/component-contracts.js.map +1 -1
  96. package/dist/server/framework/component-contract-validation.d.ts +1 -1
  97. package/dist/server/framework/component-contract-validation.d.ts.map +1 -1
  98. package/dist/server/framework/component-contract-validation.js +1 -1
  99. package/dist/server/framework/component-contract-validation.js.map +1 -1
  100. package/dist/server/framework/operation-protocol.d.ts +9 -0
  101. package/dist/server/framework/operation-protocol.d.ts.map +1 -1
  102. package/dist/server/framework/operation-protocol.js.map +1 -1
  103. package/dist/server/framework/server-task-helpers.d.ts +1 -0
  104. package/dist/server/framework/server-task-helpers.d.ts.map +1 -1
  105. package/dist/server/framework/server-task-helpers.js +1 -0
  106. package/dist/server/framework/server-task-helpers.js.map +1 -1
  107. package/dist/server/framework/task-frames.d.ts +2 -1
  108. package/dist/server/framework/task-frames.d.ts.map +1 -1
  109. package/dist/server/framework/task-frames.js +1 -0
  110. package/dist/server/framework/task-frames.js.map +1 -1
  111. package/dist/server/runtime/tasks.d.ts +1 -0
  112. package/dist/server/runtime/tasks.d.ts.map +1 -1
  113. package/dist/server/runtime/tasks.js +1 -0
  114. package/dist/server/runtime/tasks.js.map +1 -1
  115. package/dist/server/tasks/contracts.d.ts +2 -0
  116. package/dist/server/tasks/contracts.d.ts.map +1 -1
  117. package/dist/server/tasks/contracts.js.map +1 -1
  118. package/dist/server/tasks/frame-continuation.d.ts +1 -1
  119. package/dist/server/tasks/frame-continuation.d.ts.map +1 -1
  120. package/dist/server/tasks/frame-continuation.js +21 -10
  121. package/dist/server/tasks/frame-continuation.js.map +1 -1
  122. package/dist/server/tasks/frame-runtime.d.ts +2 -2
  123. package/dist/server/tasks/frame-runtime.d.ts.map +1 -1
  124. package/dist/server/tasks/frame-runtime.js +14 -6
  125. package/dist/server/tasks/frame-runtime.js.map +1 -1
  126. package/dist/server/tasks/progress-bindings.d.ts +20 -0
  127. package/dist/server/tasks/progress-bindings.d.ts.map +1 -0
  128. package/dist/server/tasks/progress-bindings.js +51 -0
  129. package/dist/server/tasks/progress-bindings.js.map +1 -0
  130. package/dist/server/tasks/progress-receiver.d.ts +24 -0
  131. package/dist/server/tasks/progress-receiver.d.ts.map +1 -0
  132. package/dist/server/tasks/progress-receiver.js +71 -0
  133. package/dist/server/tasks/progress-receiver.js.map +1 -0
  134. package/dist/server/tasks/resources.d.ts.map +1 -1
  135. package/dist/server/tasks/resources.js +6 -3
  136. package/dist/server/tasks/resources.js.map +1 -1
  137. package/dist/server/tasks/scheduled-reactions.d.ts.map +1 -1
  138. package/dist/server/tasks/scheduled-reactions.js +9 -2
  139. package/dist/server/tasks/scheduled-reactions.js.map +1 -1
  140. package/dist/tasks/contracts.d.ts +2 -0
  141. package/dist/tasks/contracts.d.ts.map +1 -1
  142. package/dist/tasks/contracts.js.map +1 -1
  143. package/dist/tasks/frame-continuation.d.ts +1 -1
  144. package/dist/tasks/frame-continuation.d.ts.map +1 -1
  145. package/dist/tasks/frame-continuation.js +21 -10
  146. package/dist/tasks/frame-continuation.js.map +1 -1
  147. package/dist/tasks/frame-runtime.d.ts +2 -2
  148. package/dist/tasks/frame-runtime.d.ts.map +1 -1
  149. package/dist/tasks/frame-runtime.js +14 -6
  150. package/dist/tasks/frame-runtime.js.map +1 -1
  151. package/dist/tasks/progress-bindings.d.ts +20 -0
  152. package/dist/tasks/progress-bindings.d.ts.map +1 -0
  153. package/dist/tasks/progress-bindings.js +51 -0
  154. package/dist/tasks/progress-bindings.js.map +1 -0
  155. package/dist/tasks/progress-receiver.d.ts +24 -0
  156. package/dist/tasks/progress-receiver.d.ts.map +1 -0
  157. package/dist/tasks/progress-receiver.js +71 -0
  158. package/dist/tasks/progress-receiver.js.map +1 -0
  159. package/dist/tasks/resources.d.ts.map +1 -1
  160. package/dist/tasks/resources.js +6 -3
  161. package/dist/tasks/resources.js.map +1 -1
  162. package/dist/tasks/scheduled-reactions.d.ts.map +1 -1
  163. package/dist/tasks/scheduled-reactions.js +9 -2
  164. package/dist/tasks/scheduled-reactions.js.map +1 -1
  165. package/package.json +1 -1
  166. package/dist/client/component/error-boundary.js.map +0 -1
  167. package/dist/server/component/error-boundary.js.map +0 -1
@@ -0,0 +1,24 @@
1
+ import type { TaskContext, TaskOwner } from './contracts.js';
2
+ /** One replaceable observation lane, owned by an originating invocation. */
3
+ export interface TaskProgressReceiver<Snapshot> {
4
+ /** Offers a captured snapshot, replacing any snapshot which has not started. */
5
+ report(snapshot: Snapshot): void;
6
+ /** Fences publication immediately; asynchronous cleanup does not delay the caller. */
7
+ close(reason?: unknown): void;
8
+ }
9
+ /**
10
+ * Serializes asynchronous progress activations while retaining only the latest pending value.
11
+ * Each activation is an ordinary task with independent staged publication and structural children.
12
+ * It belongs to the durable component owner, but never extends the originating invocation.
13
+ * Callers must capture/validate snapshots before offering them and route errors to diagnostics.
14
+ */
15
+ export declare function createTaskProgressReceiver<Snapshot>(options: {
16
+ readonly owner: TaskOwner;
17
+ readonly signal: AbortSignal;
18
+ readonly label: string;
19
+ readonly priority?: 'immediate' | 'normal' | 'deferred';
20
+ readonly readiness?: 'blocking' | 'nonblocking';
21
+ readonly receive: (snapshot: Snapshot, task: TaskContext) => void | Promise<void>;
22
+ readonly onError: (error: unknown) => void;
23
+ }): TaskProgressReceiver<Snapshot>;
24
+ //# sourceMappingURL=progress-receiver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-receiver.d.ts","sourceRoot":"","sources":["../../../src/tasks/progress-receiver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAK7D,4EAA4E;AAC5E,MAAM,WAAW,oBAAoB,CAAC,QAAQ;IAC7C,gFAAgF;IAChF,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IACjC,sFAAsF;IACtF,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,OAAO,EAAE;IAC7D,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;IACxD,QAAQ,CAAC,SAAS,CAAC,EAAE,UAAU,GAAG,aAAa,CAAC;IAChD,QAAQ,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClF,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC3C,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAoEjC"}
@@ -0,0 +1,71 @@
1
+ import { isTaskCancellation } from './cancellation.js';
2
+ import { bindTask, defineTask } from './runtime.js';
3
+ import { logFrameworkEvent } from '../component/log.js';
4
+ /**
5
+ * Serializes asynchronous progress activations while retaining only the latest pending value.
6
+ * Each activation is an ordinary task with independent staged publication and structural children.
7
+ * It belongs to the durable component owner, but never extends the originating invocation.
8
+ * Callers must capture/validate snapshots before offering them and route errors to diagnostics.
9
+ */
10
+ export function createTaskProgressReceiver(options) {
11
+ const task = bindTask(defineTask({
12
+ label: options.label,
13
+ placement: 'client',
14
+ readiness: options.readiness ?? 'nonblocking',
15
+ priority: options.priority,
16
+ detached: true,
17
+ owner: options.owner
18
+ }, options.receive), { owner: options.owner });
19
+ let closed = false;
20
+ let running = false;
21
+ let pending;
22
+ const close = (reason = 'progress-complete') => {
23
+ if (closed)
24
+ return;
25
+ closed = true;
26
+ pending = undefined;
27
+ options.signal.removeEventListener('abort', abort);
28
+ options.owner.signal.removeEventListener('abort', abort);
29
+ task.cancel(reason);
30
+ };
31
+ const abort = () => close(options.signal.reason ?? options.owner.signal.reason);
32
+ const drain = () => {
33
+ if (closed || running || !pending)
34
+ return;
35
+ const { snapshot } = pending;
36
+ pending = undefined;
37
+ running = true;
38
+ // Observe the invocation's rejection before work can settle. Cancellation is lifecycle,
39
+ // while failures still remain inspectable on the task and reach the supplied diagnostic.
40
+ void Promise.resolve(task(snapshot)).then(() => finish(), (error) => {
41
+ try {
42
+ if (!isTaskCancellation(error))
43
+ options.onError(error);
44
+ }
45
+ catch (diagnosticError) {
46
+ logFrameworkEvent('error', 'core', 'task', 'progress error diagnostic failed', diagnosticError);
47
+ }
48
+ finally {
49
+ finish();
50
+ }
51
+ });
52
+ };
53
+ const finish = () => {
54
+ running = false;
55
+ drain();
56
+ };
57
+ options.signal.addEventListener('abort', abort, { once: true });
58
+ options.owner.signal.addEventListener('abort', abort, { once: true });
59
+ if (options.signal.aborted || options.owner.signal.aborted)
60
+ abort();
61
+ return {
62
+ report(snapshot) {
63
+ if (closed)
64
+ return;
65
+ pending = { snapshot };
66
+ drain();
67
+ },
68
+ close
69
+ };
70
+ }
71
+ //# sourceMappingURL=progress-receiver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-receiver.js","sourceRoot":"","sources":["../../../src/tasks/progress-receiver.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TaskContext, TaskOwner } from './contracts.js';\nimport { isTaskCancellation } from './cancellation.js';\nimport { bindTask, defineTask } from './runtime.js';\nimport { logFrameworkEvent } from '../component/log.js';\n\n/** One replaceable observation lane, owned by an originating invocation. */\nexport interface TaskProgressReceiver<Snapshot> {\n\t/** Offers a captured snapshot, replacing any snapshot which has not started. */\n\treport(snapshot: Snapshot): void;\n\t/** Fences publication immediately; asynchronous cleanup does not delay the caller. */\n\tclose(reason?: unknown): void;\n}\n\n/**\n * Serializes asynchronous progress activations while retaining only the latest pending value.\n * Each activation is an ordinary task with independent staged publication and structural children.\n * It belongs to the durable component owner, but never extends the originating invocation.\n * Callers must capture/validate snapshots before offering them and route errors to diagnostics.\n */\nexport function createTaskProgressReceiver<Snapshot>(options: {\n\treadonly owner: TaskOwner;\n\treadonly signal: AbortSignal;\n\treadonly label: string;\n\treadonly priority?: 'immediate' | 'normal' | 'deferred';\n\treadonly readiness?: 'blocking' | 'nonblocking';\n\treadonly receive: (snapshot: Snapshot, task: TaskContext) => void | Promise<void>;\n\treadonly onError: (error: unknown) => void;\n}): TaskProgressReceiver<Snapshot> {\n\tconst task = bindTask(\n\t\tdefineTask<[Snapshot], void>(\n\t\t\t{\n\t\t\t\tlabel: options.label,\n\t\t\t\tplacement: 'client',\n\t\t\t\treadiness: options.readiness ?? 'nonblocking',\n\t\t\t\tpriority: options.priority,\n\t\t\t\tdetached: true,\n\t\t\t\towner: options.owner\n\t\t\t},\n\t\t\toptions.receive\n\t\t),\n\t\t{ owner: options.owner }\n\t);\n\tlet closed = false;\n\tlet running = false;\n\tlet pending: { snapshot: Snapshot } | undefined;\n\tconst close = (reason: unknown = 'progress-complete') => {\n\t\tif (closed) return;\n\t\tclosed = true;\n\t\tpending = undefined;\n\t\toptions.signal.removeEventListener('abort', abort);\n\t\toptions.owner.signal.removeEventListener('abort', abort);\n\t\ttask.cancel(reason);\n\t};\n\tconst abort = () => close(options.signal.reason ?? options.owner.signal.reason);\n\tconst drain = () => {\n\t\tif (closed || running || !pending) return;\n\t\tconst { snapshot } = pending;\n\t\tpending = undefined;\n\t\trunning = true;\n\t\t// Observe the invocation's rejection before work can settle. Cancellation is lifecycle,\n\t\t// while failures still remain inspectable on the task and reach the supplied diagnostic.\n\t\tvoid Promise.resolve(task(snapshot)).then(\n\t\t\t() => finish(),\n\t\t\t(error: unknown) => {\n\t\t\t\ttry {\n\t\t\t\t\tif (!isTaskCancellation(error)) options.onError(error);\n\t\t\t\t} catch (diagnosticError) {\n\t\t\t\t\tlogFrameworkEvent(\n\t\t\t\t\t\t'error',\n\t\t\t\t\t\t'core',\n\t\t\t\t\t\t'task',\n\t\t\t\t\t\t'progress error diagnostic failed',\n\t\t\t\t\t\tdiagnosticError\n\t\t\t\t\t);\n\t\t\t\t} finally {\n\t\t\t\t\tfinish();\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t};\n\tconst finish = () => {\n\t\trunning = false;\n\t\tdrain();\n\t};\n\toptions.signal.addEventListener('abort', abort, { once: true });\n\toptions.owner.signal.addEventListener('abort', abort, { once: true });\n\tif (options.signal.aborted || options.owner.signal.aborted) abort();\n\treturn {\n\t\treport(snapshot) {\n\t\t\tif (closed) return;\n\t\t\tpending = { snapshot };\n\t\t\tdrain();\n\t\t},\n\t\tclose\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../src/tasks/resources.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACX,oBAAoB,EACpB,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAUzE,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,oBAAoB,GAAG,IAAI,CAErF;AAKD,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CASjF;AAED,yFAAyF;AACzF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAO9D;AAED,sEAAsE;AACtE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAG9D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CACnC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,SAAS,WAAW,EAAE,EAC5B,IAAI,EAAE,KAAK,GAAG,KAAK,EACnB,MAAM,EAAE,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,EAC1C,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,OAAO,EAAE,CAAC,GACjC,OAAO,CAiBT;AAED,sFAAsF;AACtF,wBAAgB,2BAA2B,CAC1C,MAAM,EAAE,WAAW,GACjB,SAAS,uBAAuB,EAAE,GAAG,SAAS,CAIhD;AAgDD,mFAAmF;AACnF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAsBnF;AAeD,iGAAiG;AACjG,wBAAgB,wBAAwB,CACvC,MAAM,EAAE,WAAW,GAAG,SAAS,GAC7B,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAK3B;AAED,gFAAgF;AAChF,wBAAgB,eAAe,CAAC,CAAC,EAChC,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,CAAC,EACX,QAAQ,CAAC,EAAE,oBAAoB,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GACzF,CAAC,CAGH;AAED,uEAAuE;AACvE,wBAAgB,gBAAgB,CAC/B,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,EAC9C,OAAO,CAAC,EAAE,eAAe,GACvB,MAAM,CAiBR;AA4CD,mFAAmF;AACnF,wBAAgB,WAAW,CAAC,IAAI,SAAS,OAAO,EAAE,EACjD,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,IAAI,EAChC,KAAK,CAAC,EAAE,MAAM,EACd,GAAG,IAAI,EAAE,IAAI,GACX,UAAU,CAAC,OAAO,UAAU,CAAC,CAa/B;AAED,2FAA2F;AAC3F,wBAAgB,YAAY,CAAC,IAAI,SAAS,OAAO,EAAE,EAClD,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,IAAI,EAChC,KAAK,CAAC,EAAE,MAAM,EACd,GAAG,IAAI,EAAE,IAAI,GACX,UAAU,CAAC,OAAO,WAAW,CAAC,CAWhC;AAED,wFAAwF;AACxF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,CAc/F;AAED,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,CAAC,SAAS;IAAE,UAAU,IAAI,IAAI,CAAA;CAAE,EAC5D,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,CAAC,GACT,CAAC,CAGH;AAYD,6FAA6F;AAC7F,wBAAgB,SAAS,CAAC,CAAC,EAC1B,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,EAC9D,KAAK,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,CAAC,CAiBH;AAID;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAwCvF"}
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../src/tasks/resources.ts"],"names":[],"mappings":"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"}
@@ -302,8 +302,11 @@ function ignoreSettlement() { }
302
302
  * remains parked until the scope resumes, and cancellation can still reject during that wait.
303
303
  */
304
304
  export function taskAwait(signal, value) {
305
- if (signal.aborted)
305
+ if (signal.aborted) {
306
+ // The source expression has already executed and still owns a possible rejection.
307
+ void Promise.resolve(value).catch(ignoreSettlement);
306
308
  return Promise.reject(new TaskCancellation(signal.reason));
309
+ }
307
310
  return new Promise((resolve, reject) => {
308
311
  let settled = false;
309
312
  let releaseWaiter;
@@ -334,10 +337,10 @@ export function taskAwait(signal, value) {
334
337
  if (settled)
335
338
  return;
336
339
  const owner = taskOwners.get(signal);
337
- if (owner?.scope.paused) {
340
+ if (owner?.scope.active && owner.scope.paused) {
338
341
  releaseWaiter = scheduleEffectScopeResume(owner.scope, () => {
339
342
  releaseWaiter = undefined;
340
- finish(result, failed);
343
+ continueTask(result, failed);
341
344
  });
342
345
  return;
343
346
  }
@@ -1 +1 @@
1
- {"version":3,"file":"resources.js","sourceRoot":"","sources":["../../../src/tasks/resources.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tbatch,\n\tmutateReactiveCollection,\n\tunwrap,\n\tscheduleEffectScopeResume\n} from '@exactjs/reactive/framework/runtime';\n\nimport { createDisposableAbortSignal, isAbortSignal } from './signals.js';\nimport { isPromiseLike } from '../component/async-value.js';\n\nimport type {\n\tAnyComponentInstance,\n\tTaskCleanup,\n\tTaskIdleDeadline,\n\tTaskIdleOptions,\n\tTaskResourceDisposal\n} from '../component/contracts.js';\nimport type { ExactCollectionMutation } from '../component-contracts.js';\n\nimport { createErrorReport, handleComponentError } from '../component/errors.js';\nimport { TaskCancellation } from './cancellation.js';\nimport { resumeTaskFrame } from './frame-runtime.js';\n\nimport { logFrameworkEvent } from '../component/log.js';\n\nconst taskOwners = new WeakMap<AbortSignal, AnyComponentInstance>();\n\n/** Associates a task generation signal with its component owner. */\nexport function trackTaskOwner(signal: AbortSignal, owner: AnyComponentInstance): void {\n\ttaskOwners.set(signal, owner);\n}\nconst taskCleanupPromises = new WeakMap<AbortSignal, Set<Promise<void>>>();\nconst taskMutations = new WeakMap<AbortSignal, Array<() => void>>();\nconst taskCollectionMutations = new WeakMap<AbortSignal, ExactCollectionMutation[]>();\n\n/** Stages a compiler-generated mutation until its blocking task generation commits. */\nexport function stageTaskMutation(signal: AbortSignal, mutation: () => void): void {\n\tif (signal.aborted) return;\n\tlet staged = taskMutations.get(signal);\n\tif (!staged) {\n\t\tstaged = [];\n\t\ttaskMutations.set(signal, staged);\n\t\tsignal.addEventListener('abort', () => discardTaskMutations(signal), { once: true });\n\t}\n\tstaged.push(mutation);\n}\n\n/** Publishes staged mutations for a successful task generation as one reactive batch. */\nexport function publishTaskMutations(signal: AbortSignal): void {\n\tconst staged = taskMutations.get(signal);\n\tif (!staged) return;\n\ttaskMutations.delete(signal);\n\tbatch(() => {\n\t\tfor (const mutation of staged) mutation();\n\t});\n}\n\n/** Discards every unpublished mutation owned by a task generation. */\nexport function discardTaskMutations(signal: AbortSignal): void {\n\ttaskMutations.delete(signal);\n\ttaskCollectionMutations.delete(signal);\n}\n\n/**\n * Applies a server-task collection mutation and records the smallest ordered\n * response delta that can reproduce the successful change in the browser.\n */\nexport function mutateTaskCollection(\n\tsignal: AbortSignal,\n\ttarget: object,\n\tpath: readonly PropertyKey[],\n\tkind: 'map' | 'set',\n\tmethod: 'set' | 'add' | 'delete' | 'clear',\n\targs: unknown[] | (() => unknown[])\n): unknown {\n\tif (signal.aborted) return undefined;\n\tconst input = typeof args === 'function' ? args() : args;\n\tconst collection = readTaskCollection(target, path);\n\tconst raw = unwrap(collection);\n\tconst changed = collectionMutationChanges(raw, kind, method, input);\n\tconst result = mutateReactiveCollection(target, path, kind, method, input);\n\tif (changed) {\n\t\tlet mutations = taskCollectionMutations.get(signal);\n\t\tif (!mutations) {\n\t\t\tmutations = [];\n\t\t\ttaskCollectionMutations.set(signal, mutations);\n\t\t\tsignal.addEventListener('abort', () => discardTaskMutations(signal), { once: true });\n\t\t}\n\t\tmutations.push(collectionMutation(path, kind, method, input));\n\t}\n\treturn result;\n}\n\n/** Takes the ordered collection deltas produced by one successful task generation. */\nexport function takeTaskCollectionMutations(\n\tsignal: AbortSignal\n): readonly ExactCollectionMutation[] | undefined {\n\tconst mutations = taskCollectionMutations.get(signal);\n\ttaskCollectionMutations.delete(signal);\n\treturn mutations?.length ? mutations : undefined;\n}\n\nfunction readTaskCollection(target: object, path: readonly PropertyKey[]): unknown {\n\tlet value: unknown = target;\n\tfor (const segment of path) value = Reflect.get(value as object, segment);\n\treturn value;\n}\n\nfunction collectionMutationChanges(\n\tvalue: unknown,\n\tkind: 'map' | 'set',\n\tmethod: string,\n\targs: readonly unknown[]\n): boolean {\n\tif (kind === 'map' && value instanceof Map) {\n\t\tif (method === 'clear') return value.size > 0;\n\t\tif (method === 'delete') return value.has(unwrap(args[0]));\n\t\tconst key = unwrap(args[0]);\n\t\treturn !value.has(key) || !Object.is(value.get(key), unwrap(args[1]));\n\t}\n\tif (kind === 'set' && value instanceof Set) {\n\t\tif (method === 'clear') return value.size > 0;\n\t\tif (method === 'delete') return value.has(unwrap(args[0]));\n\t\treturn !value.has(unwrap(args[0]));\n\t}\n\treturn true;\n}\n\nfunction collectionMutation(\n\tpath: readonly PropertyKey[],\n\tkind: 'map' | 'set',\n\tmethod: string,\n\targs: readonly unknown[]\n): ExactCollectionMutation {\n\tconst location = path.map(String).join('.');\n\tif (kind === 'map') {\n\t\tif (method === 'set')\n\t\t\treturn { path: location, operation: 'map-set', key: unwrap(args[0]), value: unwrap(args[1]) };\n\t\tif (method === 'delete')\n\t\t\treturn { path: location, operation: 'map-delete', key: unwrap(args[0]) };\n\t\treturn { path: location, operation: 'map-clear' };\n\t}\n\tif (method === 'add') return { path: location, operation: 'set-add', value: unwrap(args[0]) };\n\tif (method === 'delete')\n\t\treturn { path: location, operation: 'set-delete', value: unwrap(args[0]) };\n\treturn { path: location, operation: 'set-clear' };\n}\n\n/** Registers once-only task cleanup and reports asynchronous disposal failures. */\nexport function registerTaskCleanup(signal: AbortSignal, cleanup: TaskCleanup): void {\n\tlet active = true;\n\tconst run = (): void => {\n\t\tif (!active) return;\n\t\tactive = false;\n\t\tsignal.removeEventListener('abort', run);\n\t\ttry {\n\t\t\tconst result = cleanup(signal.reason);\n\t\t\tif (isPromiseLike(result)) {\n\t\t\t\ttrackTaskCleanupPromise(\n\t\t\t\t\tsignal,\n\t\t\t\t\tPromise.resolve(result).catch((error) => {\n\t\t\t\t\t\treportTaskResourceError(signal, error);\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\treportTaskResourceError(signal, error);\n\t\t}\n\t};\n\tif (signal.aborted) run();\n\telse signal.addEventListener('abort', run, { once: true });\n}\n\nfunction trackTaskCleanupPromise(signal: AbortSignal, promise: Promise<void>): void {\n\tlet pending = taskCleanupPromises.get(signal);\n\tif (!pending) {\n\t\tpending = new Set();\n\t\ttaskCleanupPromises.set(signal, pending);\n\t}\n\tpending.add(promise);\n\tvoid promise.finally(() => {\n\t\tpending!.delete(promise);\n\t\tif (!pending!.size) taskCleanupPromises.delete(signal);\n\t});\n}\n\n/** Waits for registered task cleanup promises and preserves failures for aggregate reporting. */\nexport function drainTaskCleanupPromises(\n\tsignal: AbortSignal | undefined\n): Promise<void> | undefined {\n\tif (!signal) return undefined;\n\tconst pending = taskCleanupPromises.get(signal);\n\tif (!pending?.size) return undefined;\n\treturn Promise.all([...pending]).then(() => undefined);\n}\n\n/** Owns a disposable value while preserving the value and expression result. */\nexport function ownTaskResource<T>(\n\tsignal: AbortSignal,\n\tresource: T,\n\tdisposal?: TaskResourceDisposal | ((resource: T, reason?: unknown) => void | Promise<void>)\n): T {\n\tregisterTaskCleanup(signal, (reason) => disposeTaskResource(resource, disposal, reason));\n\treturn resource;\n}\n\n/** Compiler helper for idle callbacks owned by one task generation. */\nexport function taskIdleCallback(\n\tsignal: AbortSignal,\n\tcallback: (deadline: TaskIdleDeadline) => void,\n\toptions?: TaskIdleOptions\n): number {\n\tconst platform = globalThis as typeof globalThis & {\n\t\trequestIdleCallback(\n\t\t\tcallback: (deadline: TaskIdleDeadline) => void,\n\t\t\toptions?: TaskIdleOptions\n\t\t): number;\n\t\tcancelIdleCallback(handle: number): void;\n\t};\n\tlet handle = 0;\n\tconst cancel = () => platform.cancelIdleCallback(handle);\n\thandle = platform.requestIdleCallback((deadline) => {\n\t\tsignal.removeEventListener('abort', cancel);\n\t\tif (!signal.aborted) runTaskCallback(signal, 'idle-callback', () => callback(deadline));\n\t}, options);\n\tif (signal.aborted) cancel();\n\telse signal.addEventListener('abort', cancel, { once: true });\n\treturn handle;\n}\n\nfunction disposeTaskResource<T>(\n\tresource: T,\n\tdisposal:\n\t\t| TaskResourceDisposal\n\t\t| ((resource: T, reason?: unknown) => void | Promise<void>)\n\t\t| undefined,\n\treason: unknown\n): void | Promise<void> {\n\tif (typeof disposal === 'function') return disposal(resource, reason);\n\tif (disposal === 'call') {\n\t\tif (typeof resource === 'function') return resource();\n\t\treturn;\n\t}\n\tif (!resource || (typeof resource !== 'object' && typeof resource !== 'function')) return;\n\tif (disposal === 'cancel') return invokeResourceMethod(resource, 'cancel', reason);\n\tif (disposal) return invokeResourceMethod(resource, disposal);\n\tconst symbols = Symbol as SymbolConstructor & { asyncDispose?: symbol; dispose?: symbol };\n\tif (symbols.asyncDispose) {\n\t\tconst result = invokeResourceMethod(resource, symbols.asyncDispose);\n\t\tif (result !== undefined) return result;\n\t}\n\tif (symbols.dispose) return invokeResourceMethod(resource, symbols.dispose);\n}\n\nfunction invokeResourceMethod(\n\tresource: object,\n\tkey: PropertyKey,\n\t...args: unknown[]\n): void | Promise<void> | undefined {\n\tconst method = Reflect.get(resource, key) as unknown;\n\tif (typeof method === 'function') return method.apply(resource, args) as void | Promise<void>;\n}\n\nfunction reportTaskResourceError(signal: AbortSignal, error: unknown): void {\n\tconst instance = taskOwners.get(signal);\n\tif (instance) {\n\t\thandleComponentError(instance, createErrorReport(error, 'task', instance, 'resource-cleanup'));\n\t\treturn;\n\t}\n\tlogFrameworkEvent('error', 'core', 'task', 'task resource cleanup failed', error);\n}\n\n/** Compiler helpers for resources whose lifetime is owned by a task generation. */\nexport function taskTimeout<Args extends unknown[]>(\n\tsignal: AbortSignal,\n\thandler: (...args: Args) => void,\n\tdelay?: number,\n\t...args: Args\n): ReturnType<typeof setTimeout> {\n\tconst abort = () => clearTimeout(timeout);\n\tconst timeout = setTimeout(\n\t\t(...values: Args) => {\n\t\t\tsignal.removeEventListener('abort', abort);\n\t\t\tif (!signal.aborted) runTaskCallback(signal, 'timeout', () => handler(...values));\n\t\t},\n\t\tdelay,\n\t\t...args\n\t);\n\tif (signal.aborted) abort();\n\telse signal.addEventListener('abort', abort, { once: true });\n\treturn timeout;\n}\n\n/** Starts an interval whose timer is cleared automatically when the task signal aborts. */\nexport function taskInterval<Args extends unknown[]>(\n\tsignal: AbortSignal,\n\thandler: (...args: Args) => void,\n\tdelay?: number,\n\t...args: Args\n): ReturnType<typeof setInterval> {\n\tconst interval = setInterval(\n\t\t(...values: Args) => {\n\t\t\tif (!signal.aborted) runTaskCallback(signal, 'interval', () => handler(...values));\n\t\t},\n\t\tdelay,\n\t\t...args\n\t);\n\tif (signal.aborted) clearInterval(interval);\n\telse signal.addEventListener('abort', () => clearInterval(interval), { once: true });\n\treturn interval;\n}\n\n/** Requests an animation frame that is cancelled automatically with the owning task. */\nexport function taskAnimationFrame(signal: AbortSignal, handler: (time: number) => void): number {\n\tconst platform = globalThis as typeof globalThis & {\n\t\trequestAnimationFrame(callback: (time: number) => void): number;\n\t\tcancelAnimationFrame(id: number): void;\n\t};\n\tlet frame = 0;\n\tconst cancel = () => platform.cancelAnimationFrame(frame);\n\tframe = platform.requestAnimationFrame((time) => {\n\t\tsignal.removeEventListener('abort', cancel);\n\t\tif (!signal.aborted) runTaskCallback(signal, 'animation-frame', () => handler(time));\n\t});\n\tif (signal.aborted) cancel();\n\telse signal.addEventListener('abort', cancel, { once: true });\n\treturn frame;\n}\n\n/** Owns an observer instance and disconnects it when the task is cancelled. */\nexport function taskObserver<T extends { disconnect(): void }>(\n\tsignal: AbortSignal,\n\tobserver: T\n): T {\n\tregisterTaskCleanup(signal, () => observer.disconnect());\n\treturn observer;\n}\n\nfunction runTaskCallback(signal: AbortSignal, phase: string, callback: () => void): void {\n\ttry {\n\t\tcallback();\n\t} catch (error) {\n\t\tconst instance = taskOwners.get(signal);\n\t\tif (instance) handleComponentError(instance, createErrorReport(error, 'task', instance, phase));\n\t\telse reportTaskResourceError(signal, error);\n\t}\n}\n\n/** Runs fetch with the task signal combined with any caller-provided cancellation signal. */\nexport function taskFetch<T>(\n\tsignal: AbortSignal,\n\tfetcher: (input: unknown, init?: Record<string, unknown>) => T,\n\tinput: unknown,\n\tinit?: Record<string, unknown>\n): T {\n\tconst options = init ? { ...init } : {};\n\tconst existing = options.signal;\n\tconst combined = isAbortSignal(existing)\n\t\t? createDisposableAbortSignal(existing, signal)\n\t\t: undefined;\n\toptions.signal = combined?.signal ?? signal;\n\ttry {\n\t\tconst result = fetcher(input, options);\n\t\tif (combined && isPromiseLike(result)) {\n\t\t\tvoid Promise.resolve(result).finally(combined.dispose).catch(ignoreSettlement);\n\t\t} else combined?.dispose();\n\t\treturn result;\n\t} catch (error) {\n\t\tcombined?.dispose();\n\t\tthrow error;\n\t}\n}\n\nfunction ignoreSettlement(): void {}\n\n/**\n * Awaits a value while retaining task cancellation and Activity parking semantics.\n *\n * The source promise continues while its component scope is paused. Its authored continuation\n * remains parked until the scope resumes, and cancellation can still reject during that wait.\n */\nexport function taskAwait<T>(signal: AbortSignal, value: T | PromiseLike<T>): Promise<T> {\n\tif (signal.aborted) return Promise.reject(new TaskCancellation(signal.reason));\n\treturn new Promise<T>((resolve, reject) => {\n\t\tlet settled = false;\n\t\tlet releaseWaiter: (() => void) | undefined;\n\t\tconst abort = () => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\treleaseWaiter?.();\n\t\t\treleaseWaiter = undefined;\n\t\t\tresumeTaskFrame(signal, () => reject(new TaskCancellation(signal.reason)));\n\t\t};\n\t\tsignal.addEventListener('abort', abort, { once: true });\n\t\tconst finish = (result: unknown, failed: boolean) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tsignal.removeEventListener('abort', abort);\n\t\t\tresumeTaskFrame(signal, () => {\n\t\t\t\tif (failed) reject(result);\n\t\t\t\telse if (signal.aborted) reject(new TaskCancellation(signal.reason));\n\t\t\t\telse resolve(result as T);\n\t\t\t});\n\t\t};\n\t\tconst continueTask = (result: unknown, failed: boolean) => {\n\t\t\tif (settled) return;\n\t\t\tconst owner = taskOwners.get(signal);\n\t\t\tif (owner?.scope.paused) {\n\t\t\t\treleaseWaiter = scheduleEffectScopeResume(owner.scope, () => {\n\t\t\t\t\treleaseWaiter = undefined;\n\t\t\t\t\tfinish(result, failed);\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfinish(result, failed);\n\t\t};\n\t\tPromise.resolve(value).then(\n\t\t\t(result) => continueTask(result, false),\n\t\t\t(error: unknown) => continueTask(error, true)\n\t\t);\n\t});\n}\n"]}
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../../../src/tasks/resources.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tbatch,\n\tmutateReactiveCollection,\n\tunwrap,\n\tscheduleEffectScopeResume\n} from '@exactjs/reactive/framework/runtime';\n\nimport { createDisposableAbortSignal, isAbortSignal } from './signals.js';\nimport { isPromiseLike } from '../component/async-value.js';\n\nimport type {\n\tAnyComponentInstance,\n\tTaskCleanup,\n\tTaskIdleDeadline,\n\tTaskIdleOptions,\n\tTaskResourceDisposal\n} from '../component/contracts.js';\nimport type { ExactCollectionMutation } from '../component-contracts.js';\n\nimport { createErrorReport, handleComponentError } from '../component/errors.js';\nimport { TaskCancellation } from './cancellation.js';\nimport { resumeTaskFrame } from './frame-runtime.js';\n\nimport { logFrameworkEvent } from '../component/log.js';\n\nconst taskOwners = new WeakMap<AbortSignal, AnyComponentInstance>();\n\n/** Associates a task generation signal with its component owner. */\nexport function trackTaskOwner(signal: AbortSignal, owner: AnyComponentInstance): void {\n\ttaskOwners.set(signal, owner);\n}\nconst taskCleanupPromises = new WeakMap<AbortSignal, Set<Promise<void>>>();\nconst taskMutations = new WeakMap<AbortSignal, Array<() => void>>();\nconst taskCollectionMutations = new WeakMap<AbortSignal, ExactCollectionMutation[]>();\n\n/** Stages a compiler-generated mutation until its blocking task generation commits. */\nexport function stageTaskMutation(signal: AbortSignal, mutation: () => void): void {\n\tif (signal.aborted) return;\n\tlet staged = taskMutations.get(signal);\n\tif (!staged) {\n\t\tstaged = [];\n\t\ttaskMutations.set(signal, staged);\n\t\tsignal.addEventListener('abort', () => discardTaskMutations(signal), { once: true });\n\t}\n\tstaged.push(mutation);\n}\n\n/** Publishes staged mutations for a successful task generation as one reactive batch. */\nexport function publishTaskMutations(signal: AbortSignal): void {\n\tconst staged = taskMutations.get(signal);\n\tif (!staged) return;\n\ttaskMutations.delete(signal);\n\tbatch(() => {\n\t\tfor (const mutation of staged) mutation();\n\t});\n}\n\n/** Discards every unpublished mutation owned by a task generation. */\nexport function discardTaskMutations(signal: AbortSignal): void {\n\ttaskMutations.delete(signal);\n\ttaskCollectionMutations.delete(signal);\n}\n\n/**\n * Applies a server-task collection mutation and records the smallest ordered\n * response delta that can reproduce the successful change in the browser.\n */\nexport function mutateTaskCollection(\n\tsignal: AbortSignal,\n\ttarget: object,\n\tpath: readonly PropertyKey[],\n\tkind: 'map' | 'set',\n\tmethod: 'set' | 'add' | 'delete' | 'clear',\n\targs: unknown[] | (() => unknown[])\n): unknown {\n\tif (signal.aborted) return undefined;\n\tconst input = typeof args === 'function' ? args() : args;\n\tconst collection = readTaskCollection(target, path);\n\tconst raw = unwrap(collection);\n\tconst changed = collectionMutationChanges(raw, kind, method, input);\n\tconst result = mutateReactiveCollection(target, path, kind, method, input);\n\tif (changed) {\n\t\tlet mutations = taskCollectionMutations.get(signal);\n\t\tif (!mutations) {\n\t\t\tmutations = [];\n\t\t\ttaskCollectionMutations.set(signal, mutations);\n\t\t\tsignal.addEventListener('abort', () => discardTaskMutations(signal), { once: true });\n\t\t}\n\t\tmutations.push(collectionMutation(path, kind, method, input));\n\t}\n\treturn result;\n}\n\n/** Takes the ordered collection deltas produced by one successful task generation. */\nexport function takeTaskCollectionMutations(\n\tsignal: AbortSignal\n): readonly ExactCollectionMutation[] | undefined {\n\tconst mutations = taskCollectionMutations.get(signal);\n\ttaskCollectionMutations.delete(signal);\n\treturn mutations?.length ? mutations : undefined;\n}\n\nfunction readTaskCollection(target: object, path: readonly PropertyKey[]): unknown {\n\tlet value: unknown = target;\n\tfor (const segment of path) value = Reflect.get(value as object, segment);\n\treturn value;\n}\n\nfunction collectionMutationChanges(\n\tvalue: unknown,\n\tkind: 'map' | 'set',\n\tmethod: string,\n\targs: readonly unknown[]\n): boolean {\n\tif (kind === 'map' && value instanceof Map) {\n\t\tif (method === 'clear') return value.size > 0;\n\t\tif (method === 'delete') return value.has(unwrap(args[0]));\n\t\tconst key = unwrap(args[0]);\n\t\treturn !value.has(key) || !Object.is(value.get(key), unwrap(args[1]));\n\t}\n\tif (kind === 'set' && value instanceof Set) {\n\t\tif (method === 'clear') return value.size > 0;\n\t\tif (method === 'delete') return value.has(unwrap(args[0]));\n\t\treturn !value.has(unwrap(args[0]));\n\t}\n\treturn true;\n}\n\nfunction collectionMutation(\n\tpath: readonly PropertyKey[],\n\tkind: 'map' | 'set',\n\tmethod: string,\n\targs: readonly unknown[]\n): ExactCollectionMutation {\n\tconst location = path.map(String).join('.');\n\tif (kind === 'map') {\n\t\tif (method === 'set')\n\t\t\treturn { path: location, operation: 'map-set', key: unwrap(args[0]), value: unwrap(args[1]) };\n\t\tif (method === 'delete')\n\t\t\treturn { path: location, operation: 'map-delete', key: unwrap(args[0]) };\n\t\treturn { path: location, operation: 'map-clear' };\n\t}\n\tif (method === 'add') return { path: location, operation: 'set-add', value: unwrap(args[0]) };\n\tif (method === 'delete')\n\t\treturn { path: location, operation: 'set-delete', value: unwrap(args[0]) };\n\treturn { path: location, operation: 'set-clear' };\n}\n\n/** Registers once-only task cleanup and reports asynchronous disposal failures. */\nexport function registerTaskCleanup(signal: AbortSignal, cleanup: TaskCleanup): void {\n\tlet active = true;\n\tconst run = (): void => {\n\t\tif (!active) return;\n\t\tactive = false;\n\t\tsignal.removeEventListener('abort', run);\n\t\ttry {\n\t\t\tconst result = cleanup(signal.reason);\n\t\t\tif (isPromiseLike(result)) {\n\t\t\t\ttrackTaskCleanupPromise(\n\t\t\t\t\tsignal,\n\t\t\t\t\tPromise.resolve(result).catch((error) => {\n\t\t\t\t\t\treportTaskResourceError(signal, error);\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\treportTaskResourceError(signal, error);\n\t\t}\n\t};\n\tif (signal.aborted) run();\n\telse signal.addEventListener('abort', run, { once: true });\n}\n\nfunction trackTaskCleanupPromise(signal: AbortSignal, promise: Promise<void>): void {\n\tlet pending = taskCleanupPromises.get(signal);\n\tif (!pending) {\n\t\tpending = new Set();\n\t\ttaskCleanupPromises.set(signal, pending);\n\t}\n\tpending.add(promise);\n\tvoid promise.finally(() => {\n\t\tpending!.delete(promise);\n\t\tif (!pending!.size) taskCleanupPromises.delete(signal);\n\t});\n}\n\n/** Waits for registered task cleanup promises and preserves failures for aggregate reporting. */\nexport function drainTaskCleanupPromises(\n\tsignal: AbortSignal | undefined\n): Promise<void> | undefined {\n\tif (!signal) return undefined;\n\tconst pending = taskCleanupPromises.get(signal);\n\tif (!pending?.size) return undefined;\n\treturn Promise.all([...pending]).then(() => undefined);\n}\n\n/** Owns a disposable value while preserving the value and expression result. */\nexport function ownTaskResource<T>(\n\tsignal: AbortSignal,\n\tresource: T,\n\tdisposal?: TaskResourceDisposal | ((resource: T, reason?: unknown) => void | Promise<void>)\n): T {\n\tregisterTaskCleanup(signal, (reason) => disposeTaskResource(resource, disposal, reason));\n\treturn resource;\n}\n\n/** Compiler helper for idle callbacks owned by one task generation. */\nexport function taskIdleCallback(\n\tsignal: AbortSignal,\n\tcallback: (deadline: TaskIdleDeadline) => void,\n\toptions?: TaskIdleOptions\n): number {\n\tconst platform = globalThis as typeof globalThis & {\n\t\trequestIdleCallback(\n\t\t\tcallback: (deadline: TaskIdleDeadline) => void,\n\t\t\toptions?: TaskIdleOptions\n\t\t): number;\n\t\tcancelIdleCallback(handle: number): void;\n\t};\n\tlet handle = 0;\n\tconst cancel = () => platform.cancelIdleCallback(handle);\n\thandle = platform.requestIdleCallback((deadline) => {\n\t\tsignal.removeEventListener('abort', cancel);\n\t\tif (!signal.aborted) runTaskCallback(signal, 'idle-callback', () => callback(deadline));\n\t}, options);\n\tif (signal.aborted) cancel();\n\telse signal.addEventListener('abort', cancel, { once: true });\n\treturn handle;\n}\n\nfunction disposeTaskResource<T>(\n\tresource: T,\n\tdisposal:\n\t\t| TaskResourceDisposal\n\t\t| ((resource: T, reason?: unknown) => void | Promise<void>)\n\t\t| undefined,\n\treason: unknown\n): void | Promise<void> {\n\tif (typeof disposal === 'function') return disposal(resource, reason);\n\tif (disposal === 'call') {\n\t\tif (typeof resource === 'function') return resource();\n\t\treturn;\n\t}\n\tif (!resource || (typeof resource !== 'object' && typeof resource !== 'function')) return;\n\tif (disposal === 'cancel') return invokeResourceMethod(resource, 'cancel', reason);\n\tif (disposal) return invokeResourceMethod(resource, disposal);\n\tconst symbols = Symbol as SymbolConstructor & { asyncDispose?: symbol; dispose?: symbol };\n\tif (symbols.asyncDispose) {\n\t\tconst result = invokeResourceMethod(resource, symbols.asyncDispose);\n\t\tif (result !== undefined) return result;\n\t}\n\tif (symbols.dispose) return invokeResourceMethod(resource, symbols.dispose);\n}\n\nfunction invokeResourceMethod(\n\tresource: object,\n\tkey: PropertyKey,\n\t...args: unknown[]\n): void | Promise<void> | undefined {\n\tconst method = Reflect.get(resource, key) as unknown;\n\tif (typeof method === 'function') return method.apply(resource, args) as void | Promise<void>;\n}\n\nfunction reportTaskResourceError(signal: AbortSignal, error: unknown): void {\n\tconst instance = taskOwners.get(signal);\n\tif (instance) {\n\t\thandleComponentError(instance, createErrorReport(error, 'task', instance, 'resource-cleanup'));\n\t\treturn;\n\t}\n\tlogFrameworkEvent('error', 'core', 'task', 'task resource cleanup failed', error);\n}\n\n/** Compiler helpers for resources whose lifetime is owned by a task generation. */\nexport function taskTimeout<Args extends unknown[]>(\n\tsignal: AbortSignal,\n\thandler: (...args: Args) => void,\n\tdelay?: number,\n\t...args: Args\n): ReturnType<typeof setTimeout> {\n\tconst abort = () => clearTimeout(timeout);\n\tconst timeout = setTimeout(\n\t\t(...values: Args) => {\n\t\t\tsignal.removeEventListener('abort', abort);\n\t\t\tif (!signal.aborted) runTaskCallback(signal, 'timeout', () => handler(...values));\n\t\t},\n\t\tdelay,\n\t\t...args\n\t);\n\tif (signal.aborted) abort();\n\telse signal.addEventListener('abort', abort, { once: true });\n\treturn timeout;\n}\n\n/** Starts an interval whose timer is cleared automatically when the task signal aborts. */\nexport function taskInterval<Args extends unknown[]>(\n\tsignal: AbortSignal,\n\thandler: (...args: Args) => void,\n\tdelay?: number,\n\t...args: Args\n): ReturnType<typeof setInterval> {\n\tconst interval = setInterval(\n\t\t(...values: Args) => {\n\t\t\tif (!signal.aborted) runTaskCallback(signal, 'interval', () => handler(...values));\n\t\t},\n\t\tdelay,\n\t\t...args\n\t);\n\tif (signal.aborted) clearInterval(interval);\n\telse signal.addEventListener('abort', () => clearInterval(interval), { once: true });\n\treturn interval;\n}\n\n/** Requests an animation frame that is cancelled automatically with the owning task. */\nexport function taskAnimationFrame(signal: AbortSignal, handler: (time: number) => void): number {\n\tconst platform = globalThis as typeof globalThis & {\n\t\trequestAnimationFrame(callback: (time: number) => void): number;\n\t\tcancelAnimationFrame(id: number): void;\n\t};\n\tlet frame = 0;\n\tconst cancel = () => platform.cancelAnimationFrame(frame);\n\tframe = platform.requestAnimationFrame((time) => {\n\t\tsignal.removeEventListener('abort', cancel);\n\t\tif (!signal.aborted) runTaskCallback(signal, 'animation-frame', () => handler(time));\n\t});\n\tif (signal.aborted) cancel();\n\telse signal.addEventListener('abort', cancel, { once: true });\n\treturn frame;\n}\n\n/** Owns an observer instance and disconnects it when the task is cancelled. */\nexport function taskObserver<T extends { disconnect(): void }>(\n\tsignal: AbortSignal,\n\tobserver: T\n): T {\n\tregisterTaskCleanup(signal, () => observer.disconnect());\n\treturn observer;\n}\n\nfunction runTaskCallback(signal: AbortSignal, phase: string, callback: () => void): void {\n\ttry {\n\t\tcallback();\n\t} catch (error) {\n\t\tconst instance = taskOwners.get(signal);\n\t\tif (instance) handleComponentError(instance, createErrorReport(error, 'task', instance, phase));\n\t\telse reportTaskResourceError(signal, error);\n\t}\n}\n\n/** Runs fetch with the task signal combined with any caller-provided cancellation signal. */\nexport function taskFetch<T>(\n\tsignal: AbortSignal,\n\tfetcher: (input: unknown, init?: Record<string, unknown>) => T,\n\tinput: unknown,\n\tinit?: Record<string, unknown>\n): T {\n\tconst options = init ? { ...init } : {};\n\tconst existing = options.signal;\n\tconst combined = isAbortSignal(existing)\n\t\t? createDisposableAbortSignal(existing, signal)\n\t\t: undefined;\n\toptions.signal = combined?.signal ?? signal;\n\ttry {\n\t\tconst result = fetcher(input, options);\n\t\tif (combined && isPromiseLike(result)) {\n\t\t\tvoid Promise.resolve(result).finally(combined.dispose).catch(ignoreSettlement);\n\t\t} else combined?.dispose();\n\t\treturn result;\n\t} catch (error) {\n\t\tcombined?.dispose();\n\t\tthrow error;\n\t}\n}\n\nfunction ignoreSettlement(): void {}\n\n/**\n * Awaits a value while retaining task cancellation and Activity parking semantics.\n *\n * The source promise continues while its component scope is paused. Its authored continuation\n * remains parked until the scope resumes, and cancellation can still reject during that wait.\n */\nexport function taskAwait<T>(signal: AbortSignal, value: T | PromiseLike<T>): Promise<T> {\n\tif (signal.aborted) {\n\t\t// The source expression has already executed and still owns a possible rejection.\n\t\tvoid Promise.resolve(value).catch(ignoreSettlement);\n\t\treturn Promise.reject(new TaskCancellation(signal.reason));\n\t}\n\treturn new Promise<T>((resolve, reject) => {\n\t\tlet settled = false;\n\t\tlet releaseWaiter: (() => void) | undefined;\n\t\tconst abort = () => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\treleaseWaiter?.();\n\t\t\treleaseWaiter = undefined;\n\t\t\tresumeTaskFrame(signal, () => reject(new TaskCancellation(signal.reason)));\n\t\t};\n\t\tsignal.addEventListener('abort', abort, { once: true });\n\t\tconst finish = (result: unknown, failed: boolean) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tsignal.removeEventListener('abort', abort);\n\t\t\tresumeTaskFrame(signal, () => {\n\t\t\t\tif (failed) reject(result);\n\t\t\t\telse if (signal.aborted) reject(new TaskCancellation(signal.reason));\n\t\t\t\telse resolve(result as T);\n\t\t\t});\n\t\t};\n\t\tconst continueTask = (result: unknown, failed: boolean) => {\n\t\t\tif (settled) return;\n\t\t\tconst owner = taskOwners.get(signal);\n\t\t\tif (owner?.scope.active && owner.scope.paused) {\n\t\t\t\treleaseWaiter = scheduleEffectScopeResume(owner.scope, () => {\n\t\t\t\t\treleaseWaiter = undefined;\n\t\t\t\t\tcontinueTask(result, failed);\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfinish(result, failed);\n\t\t};\n\t\tPromise.resolve(value).then(\n\t\t\t(result) => continueTask(result, false),\n\t\t\t(error: unknown) => continueTask(error, true)\n\t\t);\n\t});\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"scheduled-reactions.d.ts","sourceRoot":"","sources":["../../../src/tasks/scheduled-reactions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAEhF,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAwBjF,sFAAsF;AACtF,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,eAAe,GAAG,oBAAoB,CAmC3F"}
1
+ {"version":3,"file":"scheduled-reactions.d.ts","sourceRoot":"","sources":["../../../src/tasks/scheduled-reactions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAEhF,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAwBjF,sFAAsF;AACtF,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,eAAe,GAAG,oBAAoB,CA2C3F"}
@@ -35,9 +35,16 @@ export function acquireScheduledReactionBatch(parent) {
35
35
  run(work) {
36
36
  if (released)
37
37
  return;
38
+ if (batch.signal.aborted) {
39
+ // Invalidation observes already committed state, and the live observer may have
40
+ // coalesced newer writes. Retire its cancelled task lease without discarding the
41
+ // observation or resuming the stale producer. Reaction scope disposal is owned
42
+ // by the scheduler; genuine observer failures still propagate normally.
43
+ release(new TaskCancellation(batch.signal.reason), true);
44
+ withTaskFrameRecord(undefined, work);
45
+ return;
46
+ }
38
47
  try {
39
- if (batch.signal.aborted)
40
- throw new TaskCancellation(batch.signal.reason);
41
48
  withTaskFrameRecord(batch.frame, work);
42
49
  }
43
50
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"scheduled-reactions.js","sourceRoot":"","sources":["../../../src/tasks/scheduled-reactions.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ScheduledWorkContext } from '@exactjs/reactive/framework/runtime';\nimport { TaskCancellation } from './cancellation.js';\nimport { taskFrameTokenBrand, type TaskFrameRecord } from './frame-contracts.js';\nimport { taskFrameInspectionAttached } from './frame-inspection-capability.js';\nimport {\n\tallocateTaskFrameId,\n\tattachTaskFrameSettlement,\n\tcurrentTaskFrameRecord,\n\texecuteTaskFrame,\n\twithTaskFrameRecord\n} from './frame-runtime.js';\nimport { settleTaskFrameChildren } from './frame-settlement.js';\n\ntype ScheduledReactionBatch = {\n\treadonly frame: TaskFrameRecord;\n\treadonly signal: AbortSignal;\n\treadonly resolve: () => void;\n\treadonly reject: (error: unknown) => void;\n\tpending: number;\n\tfailed: boolean;\n\tfailure?: unknown;\n\tclosed: boolean;\n};\n\nconst scheduledReactionBatches = new WeakMap<TaskFrameRecord, ScheduledReactionBatch>();\n\n/** Acquires one lease on the consequence frame shared by a task invalidation wave. */\nexport function acquireScheduledReactionBatch(parent: TaskFrameRecord): ScheduledWorkContext {\n\tlet batch = scheduledReactionBatches.get(parent);\n\tif (!batch || batch.closed) {\n\t\tbatch = createScheduledReactionBatch(parent);\n\t\tscheduledReactionBatches.set(parent, batch);\n\t}\n\tbatch.pending++;\n\tlet released = false;\n\tconst release = (error?: unknown, failed = false) => {\n\t\tif (released) return;\n\t\treleased = true;\n\t\tif (failed && !batch!.failed) {\n\t\t\tbatch!.failed = true;\n\t\t\tbatch!.failure = error;\n\t\t}\n\t\tif (--batch!.pending !== 0) return;\n\t\tbatch!.closed = true;\n\t\tif (scheduledReactionBatches.get(parent) === batch) scheduledReactionBatches.delete(parent);\n\t\tif (batch!.failed) batch!.reject(batch!.failure);\n\t\telse batch!.resolve();\n\t};\n\treturn {\n\t\trun(work) {\n\t\t\tif (released) return;\n\t\t\ttry {\n\t\t\t\tif (batch!.signal.aborted) throw new TaskCancellation(batch!.signal.reason);\n\t\t\t\twithTaskFrameRecord(batch!.frame, work);\n\t\t\t} catch (error) {\n\t\t\t\trelease(error, true);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\trelease();\n\t\t},\n\t\tcancel: release\n\t};\n}\n\nfunction createScheduledReactionBatch(parent: TaskFrameRecord): ScheduledReactionBatch {\n\treturn taskFrameInspectionAttached(parent)\n\t\t? createInspectedScheduledReactionBatch(parent)\n\t\t: createInlineScheduledReactionBatch(parent);\n}\n\n/** Attaches one completion lease without a complete public task frame. */\nfunction createInlineScheduledReactionBatch(parent: TaskFrameRecord): ScheduledReactionBatch {\n\tlet controller: AbortController | undefined;\n\tlet acceptCompletion!: () => void;\n\tlet rejectCompletion!: (error: unknown) => void;\n\tconst completion = new Promise<void>((accept, fail) => {\n\t\tacceptCompletion = accept;\n\t\trejectCompletion = fail;\n\t});\n\tconst frame: TaskFrameRecord = {\n\t\t[taskFrameTokenBrand]: true,\n\t\tid: allocateTaskFrameId(),\n\t\towner: parent.owner,\n\t\tparent,\n\t\tget controller() {\n\t\t\tif (!controller) {\n\t\t\t\tcontroller = new AbortController();\n\t\t\t\tlinkAbort(parent.controller.signal, controller);\n\t\t\t}\n\t\t\treturn controller;\n\t\t},\n\t\tkind: 'reactive',\n\t\tlabel: 'reactive consequences',\n\t\tactivation: parent.activation,\n\t\tgeneration: parent.generation,\n\t\tplacement: parent.placement,\n\t\tconcurrency: parent.concurrency,\n\t\tpriority: parent.priority,\n\t\treadiness: parent.readiness,\n\t\tstartedAt: monotonicTimestamp(),\n\t\tproducerOpen: true,\n\t\tsettled: false\n\t};\n\tattachTaskFrameSettlement(parent, completion);\n\treturn {\n\t\tframe,\n\t\tsignal: parent.controller.signal,\n\t\tresolve() {\n\t\t\tframe.producerOpen = false;\n\t\t\tvoid settleTaskFrameChildren(frame).then(\n\t\t\t\t() => finishInlineFrame(frame, acceptCompletion),\n\t\t\t\t(error) => finishInlineFrame(frame, () => rejectCompletion(error))\n\t\t\t);\n\t\t},\n\t\treject(error) {\n\t\t\tframe.producerOpen = false;\n\t\t\tcontroller?.abort(error);\n\t\t\tconst finish = () => finishInlineFrame(frame, () => rejectCompletion(error));\n\t\t\tvoid settleTaskFrameChildren(frame).then(finish, finish);\n\t\t},\n\t\tpending: 0,\n\t\tfailed: false,\n\t\tclosed: false\n\t};\n}\n\nfunction finishInlineFrame(frame: TaskFrameRecord, settle: () => void): void {\n\tframe.settled = true;\n\tsettle();\n}\n\n/** Retains the complete consequence projection while DevTools inspection is attached. */\nfunction createInspectedScheduledReactionBatch(parent: TaskFrameRecord): ScheduledReactionBatch {\n\tlet resolve!: () => void;\n\tlet reject!: (error: unknown) => void;\n\tconst completion = new Promise<void>((accept, fail) => {\n\t\tresolve = accept;\n\t\treject = fail;\n\t});\n\tlet frame!: TaskFrameRecord;\n\tconst execution = executeTaskFrame(\n\t\t{\n\t\t\tparent,\n\t\t\towner: parent.owner,\n\t\t\tactivation: parent.activation,\n\t\t\tkind: 'reactive',\n\t\t\tlabel: 'reactive consequences',\n\t\t\tpublicContext: false\n\t\t},\n\t\t() => {\n\t\t\tframe = currentTaskFrameRecord()!;\n\t\t\treturn completion;\n\t\t}\n\t);\n\tvoid execution.catch(() => undefined);\n\treturn {\n\t\tframe,\n\t\tsignal: frame.controller.signal,\n\t\tresolve,\n\t\treject,\n\t\tpending: 0,\n\t\tfailed: false,\n\t\tclosed: false\n\t};\n}\n\nfunction linkAbort(signal: AbortSignal, target: AbortController): void {\n\tif (signal.aborted) target.abort(signal.reason);\n\telse signal.addEventListener('abort', () => target.abort(signal.reason), { once: true });\n}\n\nfunction monotonicTimestamp(): number {\n\treturn globalThis.performance?.now() ?? Date.now();\n}\n"]}
1
+ {"version":3,"file":"scheduled-reactions.js","sourceRoot":"","sources":["../../../src/tasks/scheduled-reactions.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ScheduledWorkContext } from '@exactjs/reactive/framework/runtime';\nimport { TaskCancellation } from './cancellation.js';\nimport { taskFrameTokenBrand, type TaskFrameRecord } from './frame-contracts.js';\nimport { taskFrameInspectionAttached } from './frame-inspection-capability.js';\nimport {\n\tallocateTaskFrameId,\n\tattachTaskFrameSettlement,\n\tcurrentTaskFrameRecord,\n\texecuteTaskFrame,\n\twithTaskFrameRecord\n} from './frame-runtime.js';\nimport { settleTaskFrameChildren } from './frame-settlement.js';\n\ntype ScheduledReactionBatch = {\n\treadonly frame: TaskFrameRecord;\n\treadonly signal: AbortSignal;\n\treadonly resolve: () => void;\n\treadonly reject: (error: unknown) => void;\n\tpending: number;\n\tfailed: boolean;\n\tfailure?: unknown;\n\tclosed: boolean;\n};\n\nconst scheduledReactionBatches = new WeakMap<TaskFrameRecord, ScheduledReactionBatch>();\n\n/** Acquires one lease on the consequence frame shared by a task invalidation wave. */\nexport function acquireScheduledReactionBatch(parent: TaskFrameRecord): ScheduledWorkContext {\n\tlet batch = scheduledReactionBatches.get(parent);\n\tif (!batch || batch.closed) {\n\t\tbatch = createScheduledReactionBatch(parent);\n\t\tscheduledReactionBatches.set(parent, batch);\n\t}\n\tbatch.pending++;\n\tlet released = false;\n\tconst release = (error?: unknown, failed = false) => {\n\t\tif (released) return;\n\t\treleased = true;\n\t\tif (failed && !batch!.failed) {\n\t\t\tbatch!.failed = true;\n\t\t\tbatch!.failure = error;\n\t\t}\n\t\tif (--batch!.pending !== 0) return;\n\t\tbatch!.closed = true;\n\t\tif (scheduledReactionBatches.get(parent) === batch) scheduledReactionBatches.delete(parent);\n\t\tif (batch!.failed) batch!.reject(batch!.failure);\n\t\telse batch!.resolve();\n\t};\n\treturn {\n\t\trun(work) {\n\t\t\tif (released) return;\n\t\t\tif (batch!.signal.aborted) {\n\t\t\t\t// Invalidation observes already committed state, and the live observer may have\n\t\t\t\t// coalesced newer writes. Retire its cancelled task lease without discarding the\n\t\t\t\t// observation or resuming the stale producer. Reaction scope disposal is owned\n\t\t\t\t// by the scheduler; genuine observer failures still propagate normally.\n\t\t\t\trelease(new TaskCancellation(batch!.signal.reason), true);\n\t\t\t\twithTaskFrameRecord(undefined, work);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\twithTaskFrameRecord(batch!.frame, work);\n\t\t\t} catch (error) {\n\t\t\t\trelease(error, true);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\trelease();\n\t\t},\n\t\tcancel: release\n\t};\n}\n\nfunction createScheduledReactionBatch(parent: TaskFrameRecord): ScheduledReactionBatch {\n\treturn taskFrameInspectionAttached(parent)\n\t\t? createInspectedScheduledReactionBatch(parent)\n\t\t: createInlineScheduledReactionBatch(parent);\n}\n\n/** Attaches one completion lease without a complete public task frame. */\nfunction createInlineScheduledReactionBatch(parent: TaskFrameRecord): ScheduledReactionBatch {\n\tlet controller: AbortController | undefined;\n\tlet acceptCompletion!: () => void;\n\tlet rejectCompletion!: (error: unknown) => void;\n\tconst completion = new Promise<void>((accept, fail) => {\n\t\tacceptCompletion = accept;\n\t\trejectCompletion = fail;\n\t});\n\tconst frame: TaskFrameRecord = {\n\t\t[taskFrameTokenBrand]: true,\n\t\tid: allocateTaskFrameId(),\n\t\towner: parent.owner,\n\t\tparent,\n\t\tget controller() {\n\t\t\tif (!controller) {\n\t\t\t\tcontroller = new AbortController();\n\t\t\t\tlinkAbort(parent.controller.signal, controller);\n\t\t\t}\n\t\t\treturn controller;\n\t\t},\n\t\tkind: 'reactive',\n\t\tlabel: 'reactive consequences',\n\t\tactivation: parent.activation,\n\t\tgeneration: parent.generation,\n\t\tplacement: parent.placement,\n\t\tconcurrency: parent.concurrency,\n\t\tpriority: parent.priority,\n\t\treadiness: parent.readiness,\n\t\tstartedAt: monotonicTimestamp(),\n\t\tproducerOpen: true,\n\t\tsettled: false\n\t};\n\tattachTaskFrameSettlement(parent, completion);\n\treturn {\n\t\tframe,\n\t\tsignal: parent.controller.signal,\n\t\tresolve() {\n\t\t\tframe.producerOpen = false;\n\t\t\tvoid settleTaskFrameChildren(frame).then(\n\t\t\t\t() => finishInlineFrame(frame, acceptCompletion),\n\t\t\t\t(error) => finishInlineFrame(frame, () => rejectCompletion(error))\n\t\t\t);\n\t\t},\n\t\treject(error) {\n\t\t\tframe.producerOpen = false;\n\t\t\tcontroller?.abort(error);\n\t\t\tconst finish = () => finishInlineFrame(frame, () => rejectCompletion(error));\n\t\t\tvoid settleTaskFrameChildren(frame).then(finish, finish);\n\t\t},\n\t\tpending: 0,\n\t\tfailed: false,\n\t\tclosed: false\n\t};\n}\n\nfunction finishInlineFrame(frame: TaskFrameRecord, settle: () => void): void {\n\tframe.settled = true;\n\tsettle();\n}\n\n/** Retains the complete consequence projection while DevTools inspection is attached. */\nfunction createInspectedScheduledReactionBatch(parent: TaskFrameRecord): ScheduledReactionBatch {\n\tlet resolve!: () => void;\n\tlet reject!: (error: unknown) => void;\n\tconst completion = new Promise<void>((accept, fail) => {\n\t\tresolve = accept;\n\t\treject = fail;\n\t});\n\tlet frame!: TaskFrameRecord;\n\tconst execution = executeTaskFrame(\n\t\t{\n\t\t\tparent,\n\t\t\towner: parent.owner,\n\t\t\tactivation: parent.activation,\n\t\t\tkind: 'reactive',\n\t\t\tlabel: 'reactive consequences',\n\t\t\tpublicContext: false\n\t\t},\n\t\t() => {\n\t\t\tframe = currentTaskFrameRecord()!;\n\t\t\treturn completion;\n\t\t}\n\t);\n\tvoid execution.catch(() => undefined);\n\treturn {\n\t\tframe,\n\t\tsignal: frame.controller.signal,\n\t\tresolve,\n\t\treject,\n\t\tpending: 0,\n\t\tfailed: false,\n\t\tclosed: false\n\t};\n}\n\nfunction linkAbort(signal: AbortSignal, target: AbortController): void {\n\tif (signal.aborted) target.abort(signal.reason);\n\telse signal.addEventListener('abort', () => target.abort(signal.reason), { once: true });\n}\n\nfunction monotonicTimestamp(): number {\n\treturn globalThis.performance?.now() ?? Date.now();\n}\n"]}
@@ -8,4 +8,9 @@ export declare function isExactContinuationInvocation(value: unknown, options: {
8
8
  }): boolean;
9
9
  /** Reports whether a generated continuation state-path descriptor is valid. */
10
10
  export declare function isExactContinuationStatePath(value: unknown): value is ExactContinuationStatePathContract;
11
+ /** Validates readable attribution and opaque identity for a compiled progress receiver. */
12
+ export declare function isExactProgressReceiver(value: unknown): value is Readonly<{
13
+ id: string;
14
+ label: string;
15
+ }>;
11
16
  //# sourceMappingURL=continuation-validation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"continuation-validation.d.ts","sourceRoot":"","sources":["../../src/component-contract/continuation-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,kCAAkC,EAClC,kCAAkC,EAClC,MAAM,2BAA2B,CAAC;AAGnC,kFAAkF;AAClF,wBAAgB,6BAA6B,CAC5C,KAAK,EAAE,OAAO,GACZ,KAAK,IAAI,kCAAkC,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAYrE;AAED,6FAA6F;AAC7F,wBAAgB,6BAA6B,CAC5C,KAAK,EAAE,OAAO,GACZ,KAAK,IAAI,kCAAkC,CAAC,YAAY,CAAC,CAAC;AAC7D,wBAAgB,6BAA6B,CAC5C,KAAK,EAAE,OAAO,EACd,OAAO,EAAE;IAAE,iBAAiB,EAAE,IAAI,CAAA;CAAE,GAClC,OAAO,CAAC;AA4BX,+EAA+E;AAC/E,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,OAAO,GACZ,KAAK,IAAI,kCAAkC,CAc7C"}
1
+ {"version":3,"file":"continuation-validation.d.ts","sourceRoot":"","sources":["../../src/component-contract/continuation-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,kCAAkC,EAClC,kCAAkC,EAClC,MAAM,2BAA2B,CAAC;AAGnC,kFAAkF;AAClF,wBAAgB,6BAA6B,CAC5C,KAAK,EAAE,OAAO,GACZ,KAAK,IAAI,kCAAkC,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAYrE;AAED,6FAA6F;AAC7F,wBAAgB,6BAA6B,CAC5C,KAAK,EAAE,OAAO,GACZ,KAAK,IAAI,kCAAkC,CAAC,YAAY,CAAC,CAAC;AAC7D,wBAAgB,6BAA6B,CAC5C,KAAK,EAAE,OAAO,EACd,OAAO,EAAE;IAAE,iBAAiB,EAAE,IAAI,CAAA;CAAE,GAClC,OAAO,CAAC;AA4BX,+EAA+E;AAC/E,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,OAAO,GACZ,KAAK,IAAI,kCAAkC,CAc7C;AAED,2FAA2F;AAC3F,wBAAgB,uBAAuB,CACtC,KAAK,EAAE,OAAO,GACZ,KAAK,IAAI,QAAQ,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAOlD"}
@@ -43,4 +43,11 @@ export function isExactContinuationStatePath(value) {
43
43
  value.operation === 'map' ||
44
44
  value.operation === 'set'));
45
45
  }
46
+ /** Validates readable attribution and opaque identity for a compiled progress receiver. */
47
+ export function isExactProgressReceiver(value) {
48
+ return (isContractRecord(value) &&
49
+ hasOnlyContractKeys(value, ['id', 'label']) &&
50
+ isContractString(value.id) &&
51
+ isContractString(value.label));
52
+ }
46
53
  //# sourceMappingURL=continuation-validation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"continuation-validation.js","sourceRoot":"","sources":["../../src/component-contract/continuation-validation.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEnG,kFAAkF;AAClF,MAAM,UAAU,6BAA6B,CAC5C,KAAc;IAEd,OAAO,CACN,gBAAgB,CAAC,KAAK,CAAC;QACvB,mBAAmB,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS;YACzB,CAAC,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QAC5F,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1D,CAAC,KAAK,CAAC,MAAM,KAAK,OAAO;YACxB,KAAK,CAAC,MAAM,KAAK,OAAO;YACxB,KAAK,CAAC,MAAM,KAAK,SAAS;YAC1B,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,CAC7B,CAAC;AACH,CAAC;AAUD,MAAM,UAAU,6BAA6B,CAC5C,KAAc,EACd,UAA2C,EAAE;IAE7C,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QACxF,OAAO,KAAK,CAAC;IACd,MAAM,cAAc,GAAG,KAAK,CAAC,SAAS,CAAC;IACvC,OAAO,CACN,CAAC,CAAC,OAAO,CAAC,iBAAiB,IAAI,cAAc,KAAK,SAAS,CAAC;QAC3D,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC;YAC7B,cAAc,CAAC,KAAK,CACnB,CAAC,QAAQ,EAAE,EAAE,CACZ,gBAAgB,CAAC,QAAQ,CAAC;gBAC1B,mBAAmB,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAC1D,CAAC,QAAQ,CAAC,KAAK,KAAK,SAAS;oBAC5B,CAAC,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ;wBAClC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC;wBACpC,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;gBACvB,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAChE,QAAQ,CAAC,MAAM,KAAK,UAAU,CAC/B,CAAC,CAAC;QACL,CAAC,KAAK,CAAC,WAAW,KAAK,UAAU;YAChC,KAAK,CAAC,WAAW,KAAK,QAAQ;YAC9B,KAAK,CAAC,WAAW,KAAK,OAAO,CAAC,CAC/B,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,4BAA4B,CAC3C,KAAc;IAEd,OAAO,CACN,gBAAgB,CAAC,KAAK,CAAC;QACvB,mBAAmB,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;QACvE,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;QAC5B,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;QACjD,CAAC,KAAK,CAAC,UAAU,KAAK,OAAO;YAC5B,KAAK,CAAC,UAAU,KAAK,OAAO;YAC5B,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC;QAChC,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS;YAC7B,KAAK,CAAC,SAAS,KAAK,OAAO;YAC3B,KAAK,CAAC,SAAS,KAAK,KAAK;YACzB,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,CAC3B,CAAC;AACH,CAAC","sourcesContent":["import type {\n\tExactComponentContinuationContract,\n\tExactContinuationStatePathContract\n} from '../component-contracts.js';\nimport { hasOnlyContractKeys, isContractRecord, isContractString } from './metadata-validation.js';\n\n/** Reports whether a generated continuation dependency has a supported source. */\nexport function isExactContinuationDependency(\n\tvalue: unknown\n): value is ExactComponentContinuationContract['dependencies'][number] {\n\treturn (\n\t\tisContractRecord(value) &&\n\t\thasOnlyContractKeys(value, ['index', 'source', 'path']) &&\n\t\t(value.index === undefined ||\n\t\t\t(typeof value.index === 'number' && Number.isSafeInteger(value.index) && value.index >= 0)) &&\n\t\t(value.path === undefined || isContractString(value.path)) &&\n\t\t(value.source === 'state' ||\n\t\t\tvalue.source === 'props' ||\n\t\t\tvalue.source === 'derived' ||\n\t\t\tvalue.source === 'argument')\n\t);\n}\n\n/** Reports whether generated continuation invocation metadata has a valid protocol shape. */\nexport function isExactContinuationInvocation(\n\tvalue: unknown\n): value is ExactComponentContinuationContract['invocation'];\nexport function isExactContinuationInvocation(\n\tvalue: unknown,\n\toptions: { argumentsOptional: true }\n): boolean;\nexport function isExactContinuationInvocation(\n\tvalue: unknown,\n\toptions: { argumentsOptional?: boolean } = {}\n): boolean {\n\tif (!isContractRecord(value) || !hasOnlyContractKeys(value, ['arguments', 'concurrency']))\n\t\treturn false;\n\tconst argumentsValue = value.arguments;\n\treturn (\n\t\t((options.argumentsOptional && argumentsValue === undefined) ||\n\t\t\t(Array.isArray(argumentsValue) &&\n\t\t\t\targumentsValue.every(\n\t\t\t\t\t(argument) =>\n\t\t\t\t\t\tisContractRecord(argument) &&\n\t\t\t\t\t\thasOnlyContractKeys(argument, ['index', 'source', 'path']) &&\n\t\t\t\t\t\t(argument.index === undefined ||\n\t\t\t\t\t\t\t(typeof argument.index === 'number' &&\n\t\t\t\t\t\t\t\tNumber.isSafeInteger(argument.index) &&\n\t\t\t\t\t\t\t\targument.index >= 0)) &&\n\t\t\t\t\t\t(argument.path === undefined || isContractString(argument.path)) &&\n\t\t\t\t\t\targument.source === 'argument'\n\t\t\t\t))) &&\n\t\t(value.concurrency === 'parallel' ||\n\t\t\tvalue.concurrency === 'latest' ||\n\t\t\tvalue.concurrency === 'queue')\n\t);\n}\n\n/** Reports whether a generated continuation state-path descriptor is valid. */\nexport function isExactContinuationStatePath(\n\tvalue: unknown\n): value is ExactContinuationStatePathContract {\n\treturn (\n\t\tisContractRecord(value) &&\n\t\thasOnlyContractKeys(value, ['path', 'kind', 'confidence', 'operation']) &&\n\t\tisContractString(value.path) &&\n\t\t(value.kind === 'read' || value.kind === 'write') &&\n\t\t(value.confidence === 'exact' ||\n\t\t\tvalue.confidence === 'broad' ||\n\t\t\tvalue.confidence === 'unknown') &&\n\t\t(value.operation === undefined ||\n\t\t\tvalue.operation === 'value' ||\n\t\t\tvalue.operation === 'map' ||\n\t\t\tvalue.operation === 'set')\n\t);\n}\n"]}
1
+ {"version":3,"file":"continuation-validation.js","sourceRoot":"","sources":["../../src/component-contract/continuation-validation.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tExactComponentContinuationContract,\n\tExactContinuationStatePathContract\n} from '../component-contracts.js';\nimport { hasOnlyContractKeys, isContractRecord, isContractString } from './metadata-validation.js';\n\n/** Reports whether a generated continuation dependency has a supported source. */\nexport function isExactContinuationDependency(\n\tvalue: unknown\n): value is ExactComponentContinuationContract['dependencies'][number] {\n\treturn (\n\t\tisContractRecord(value) &&\n\t\thasOnlyContractKeys(value, ['index', 'source', 'path']) &&\n\t\t(value.index === undefined ||\n\t\t\t(typeof value.index === 'number' && Number.isSafeInteger(value.index) && value.index >= 0)) &&\n\t\t(value.path === undefined || isContractString(value.path)) &&\n\t\t(value.source === 'state' ||\n\t\t\tvalue.source === 'props' ||\n\t\t\tvalue.source === 'derived' ||\n\t\t\tvalue.source === 'argument')\n\t);\n}\n\n/** Reports whether generated continuation invocation metadata has a valid protocol shape. */\nexport function isExactContinuationInvocation(\n\tvalue: unknown\n): value is ExactComponentContinuationContract['invocation'];\nexport function isExactContinuationInvocation(\n\tvalue: unknown,\n\toptions: { argumentsOptional: true }\n): boolean;\nexport function isExactContinuationInvocation(\n\tvalue: unknown,\n\toptions: { argumentsOptional?: boolean } = {}\n): boolean {\n\tif (!isContractRecord(value) || !hasOnlyContractKeys(value, ['arguments', 'concurrency']))\n\t\treturn false;\n\tconst argumentsValue = value.arguments;\n\treturn (\n\t\t((options.argumentsOptional && argumentsValue === undefined) ||\n\t\t\t(Array.isArray(argumentsValue) &&\n\t\t\t\targumentsValue.every(\n\t\t\t\t\t(argument) =>\n\t\t\t\t\t\tisContractRecord(argument) &&\n\t\t\t\t\t\thasOnlyContractKeys(argument, ['index', 'source', 'path']) &&\n\t\t\t\t\t\t(argument.index === undefined ||\n\t\t\t\t\t\t\t(typeof argument.index === 'number' &&\n\t\t\t\t\t\t\t\tNumber.isSafeInteger(argument.index) &&\n\t\t\t\t\t\t\t\targument.index >= 0)) &&\n\t\t\t\t\t\t(argument.path === undefined || isContractString(argument.path)) &&\n\t\t\t\t\t\targument.source === 'argument'\n\t\t\t\t))) &&\n\t\t(value.concurrency === 'parallel' ||\n\t\t\tvalue.concurrency === 'latest' ||\n\t\t\tvalue.concurrency === 'queue')\n\t);\n}\n\n/** Reports whether a generated continuation state-path descriptor is valid. */\nexport function isExactContinuationStatePath(\n\tvalue: unknown\n): value is ExactContinuationStatePathContract {\n\treturn (\n\t\tisContractRecord(value) &&\n\t\thasOnlyContractKeys(value, ['path', 'kind', 'confidence', 'operation']) &&\n\t\tisContractString(value.path) &&\n\t\t(value.kind === 'read' || value.kind === 'write') &&\n\t\t(value.confidence === 'exact' ||\n\t\t\tvalue.confidence === 'broad' ||\n\t\t\tvalue.confidence === 'unknown') &&\n\t\t(value.operation === undefined ||\n\t\t\tvalue.operation === 'value' ||\n\t\t\tvalue.operation === 'map' ||\n\t\t\tvalue.operation === 'set')\n\t);\n}\n\n/** Validates readable attribution and opaque identity for a compiled progress receiver. */\nexport function isExactProgressReceiver(\n\tvalue: unknown\n): value is Readonly<{ id: string; label: string }> {\n\treturn (\n\t\tisContractRecord(value) &&\n\t\thasOnlyContractKeys(value, ['id', 'label']) &&\n\t\tisContractString(value.id) &&\n\t\tisContractString(value.label)\n\t);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"contract-validation.d.ts","sourceRoot":"","sources":["../../src/component-contract/contract-validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,sBAAsB,EAKtB,MAAM,2BAA2B,CAAC;AAsBnC,2FAA2F;AAC3F,wBAAgB,wBAAwB,CACvC,KAAK,EAAE,OAAO,EACd,WAAW,EAAE,MAAM,GACjB,KAAK,IAAI,sBAAsB,CA0CjC"}
1
+ {"version":3,"file":"contract-validation.d.ts","sourceRoot":"","sources":["../../src/component-contract/contract-validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,sBAAsB,EAKtB,MAAM,2BAA2B,CAAC;AAuBnC,2FAA2F;AAC3F,wBAAgB,wBAAwB,CACvC,KAAK,EAAE,OAAO,EACd,WAAW,EAAE,MAAM,GACjB,KAAK,IAAI,sBAAsB,CA0CjC"}
@@ -1,7 +1,7 @@
1
1
  import { componentContractVersion } from '../component/contract-versions.js';
2
2
  import { hasConsistentStatelessServerExecution, isExactServerExecutionMetadata } from './server-execution-validation.js';
3
3
  import { isExactComponentBoundaryContract } from './boundary-validation.js';
4
- import { isExactContinuationDependency, isExactContinuationInvocation, isExactContinuationStatePath } from './continuation-validation.js';
4
+ import { isExactProgressReceiver, isExactContinuationDependency, isExactContinuationInvocation, isExactContinuationStatePath } from './continuation-validation.js';
5
5
  import { hasOnlyContractKeys, isContractRecord, isContractString, isReactiveAllocation, isSafeContractStringList, isSafeContractPropertyKeyList } from './metadata-validation.js';
6
6
  import { allCompiledComponentABI } from '../component/compiled-abi.js';
7
7
  import { isExactValueSerializationSchema } from '../component-abi/value-serialization.js';
@@ -211,6 +211,7 @@ function isContinuation(value) {
211
211
  'componentId',
212
212
  'readiness',
213
213
  'concurrency',
214
+ 'progress',
214
215
  'dependencies',
215
216
  'stateReads',
216
217
  'stateWrites',
@@ -226,6 +227,8 @@ function isContinuation(value) {
226
227
  isContractString(value.componentId) &&
227
228
  (value.readiness === 'blocking' || value.readiness === 'nonblocking') &&
228
229
  (value.concurrency === undefined || isConcurrency(value.concurrency)) &&
230
+ (value.progress === undefined ||
231
+ (Array.isArray(value.progress) && value.progress.every(isExactProgressReceiver))) &&
229
232
  Array.isArray(value.dependencies) &&
230
233
  value.dependencies.every(isExactContinuationDependency) &&
231
234
  Array.isArray(value.stateReads) &&