@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.
- package/AGENTS.md +12 -14
- package/README.md +6 -8
- package/dist/client/component-contract/continuation-validation.d.ts +5 -0
- package/dist/client/component-contract/continuation-validation.d.ts.map +1 -1
- package/dist/client/component-contract/continuation-validation.js +7 -0
- package/dist/client/component-contract/continuation-validation.js.map +1 -1
- package/dist/client/component-contract/contract-validation.d.ts.map +1 -1
- package/dist/client/component-contract/contract-validation.js +4 -1
- package/dist/client/component-contract/contract-validation.js.map +1 -1
- package/dist/client/component-contracts.d.ts +5 -0
- package/dist/client/component-contracts.d.ts.map +1 -1
- package/dist/client/component-contracts.js.map +1 -1
- package/dist/client/framework/component-contract-validation.d.ts +1 -1
- package/dist/client/framework/component-contract-validation.d.ts.map +1 -1
- package/dist/client/framework/component-contract-validation.js +1 -1
- package/dist/client/framework/component-contract-validation.js.map +1 -1
- package/dist/client/framework/operation-protocol.d.ts +9 -0
- package/dist/client/framework/operation-protocol.d.ts.map +1 -1
- package/dist/client/framework/operation-protocol.js.map +1 -1
- package/dist/client/framework/server-task-helpers.d.ts +1 -0
- package/dist/client/framework/server-task-helpers.d.ts.map +1 -1
- package/dist/client/framework/server-task-helpers.js +1 -0
- package/dist/client/framework/server-task-helpers.js.map +1 -1
- package/dist/client/framework/task-frames.d.ts +2 -1
- package/dist/client/framework/task-frames.d.ts.map +1 -1
- package/dist/client/framework/task-frames.js +1 -0
- package/dist/client/framework/task-frames.js.map +1 -1
- package/dist/client/runtime/tasks.d.ts +1 -0
- package/dist/client/runtime/tasks.d.ts.map +1 -1
- package/dist/client/runtime/tasks.js +1 -0
- package/dist/client/runtime/tasks.js.map +1 -1
- package/dist/client/tasks/contracts.d.ts +2 -0
- package/dist/client/tasks/contracts.d.ts.map +1 -1
- package/dist/client/tasks/contracts.js.map +1 -1
- package/dist/client/tasks/frame-continuation.d.ts +1 -1
- package/dist/client/tasks/frame-continuation.d.ts.map +1 -1
- package/dist/client/tasks/frame-continuation.js +21 -10
- package/dist/client/tasks/frame-continuation.js.map +1 -1
- package/dist/client/tasks/frame-runtime.d.ts +2 -2
- package/dist/client/tasks/frame-runtime.d.ts.map +1 -1
- package/dist/client/tasks/frame-runtime.js +14 -6
- package/dist/client/tasks/frame-runtime.js.map +1 -1
- package/dist/client/tasks/progress-bindings.d.ts +20 -0
- package/dist/client/tasks/progress-bindings.d.ts.map +1 -0
- package/dist/client/tasks/progress-bindings.js +51 -0
- package/dist/client/tasks/progress-bindings.js.map +1 -0
- package/dist/client/tasks/progress-receiver.d.ts +24 -0
- package/dist/client/tasks/progress-receiver.d.ts.map +1 -0
- package/dist/client/tasks/progress-receiver.js +71 -0
- package/dist/client/tasks/progress-receiver.js.map +1 -0
- package/dist/client/tasks/resources.d.ts.map +1 -1
- package/dist/client/tasks/resources.js +6 -3
- package/dist/client/tasks/resources.js.map +1 -1
- package/dist/client/tasks/scheduled-reactions.d.ts.map +1 -1
- package/dist/client/tasks/scheduled-reactions.js +9 -2
- package/dist/client/tasks/scheduled-reactions.js.map +1 -1
- package/dist/component-contract/continuation-validation.d.ts +5 -0
- package/dist/component-contract/continuation-validation.d.ts.map +1 -1
- package/dist/component-contract/continuation-validation.js +7 -0
- package/dist/component-contract/continuation-validation.js.map +1 -1
- package/dist/component-contract/contract-validation.d.ts.map +1 -1
- package/dist/component-contract/contract-validation.js +4 -1
- package/dist/component-contract/contract-validation.js.map +1 -1
- package/dist/component-contracts.d.ts +5 -0
- package/dist/component-contracts.d.ts.map +1 -1
- package/dist/component-contracts.js.map +1 -1
- package/dist/framework/component-contract-validation.d.ts +1 -1
- package/dist/framework/component-contract-validation.d.ts.map +1 -1
- package/dist/framework/component-contract-validation.js +1 -1
- package/dist/framework/component-contract-validation.js.map +1 -1
- package/dist/framework/operation-protocol.d.ts +9 -0
- package/dist/framework/operation-protocol.d.ts.map +1 -1
- package/dist/framework/operation-protocol.js.map +1 -1
- package/dist/framework/server-task-helpers.d.ts +1 -0
- package/dist/framework/server-task-helpers.d.ts.map +1 -1
- package/dist/framework/server-task-helpers.js +1 -0
- package/dist/framework/server-task-helpers.js.map +1 -1
- package/dist/framework/task-frames.d.ts +2 -1
- package/dist/framework/task-frames.d.ts.map +1 -1
- package/dist/framework/task-frames.js +1 -0
- package/dist/framework/task-frames.js.map +1 -1
- package/dist/runtime/tasks.d.ts +1 -0
- package/dist/runtime/tasks.d.ts.map +1 -1
- package/dist/runtime/tasks.js +1 -0
- package/dist/runtime/tasks.js.map +1 -1
- package/dist/server/component-contract/continuation-validation.d.ts +5 -0
- package/dist/server/component-contract/continuation-validation.d.ts.map +1 -1
- package/dist/server/component-contract/continuation-validation.js +7 -0
- package/dist/server/component-contract/continuation-validation.js.map +1 -1
- package/dist/server/component-contract/contract-validation.d.ts.map +1 -1
- package/dist/server/component-contract/contract-validation.js +4 -1
- package/dist/server/component-contract/contract-validation.js.map +1 -1
- package/dist/server/component-contracts.d.ts +5 -0
- package/dist/server/component-contracts.d.ts.map +1 -1
- package/dist/server/component-contracts.js.map +1 -1
- package/dist/server/framework/component-contract-validation.d.ts +1 -1
- package/dist/server/framework/component-contract-validation.d.ts.map +1 -1
- package/dist/server/framework/component-contract-validation.js +1 -1
- package/dist/server/framework/component-contract-validation.js.map +1 -1
- package/dist/server/framework/operation-protocol.d.ts +9 -0
- package/dist/server/framework/operation-protocol.d.ts.map +1 -1
- package/dist/server/framework/operation-protocol.js.map +1 -1
- package/dist/server/framework/server-task-helpers.d.ts +1 -0
- package/dist/server/framework/server-task-helpers.d.ts.map +1 -1
- package/dist/server/framework/server-task-helpers.js +1 -0
- package/dist/server/framework/server-task-helpers.js.map +1 -1
- package/dist/server/framework/task-frames.d.ts +2 -1
- package/dist/server/framework/task-frames.d.ts.map +1 -1
- package/dist/server/framework/task-frames.js +1 -0
- package/dist/server/framework/task-frames.js.map +1 -1
- package/dist/server/runtime/tasks.d.ts +1 -0
- package/dist/server/runtime/tasks.d.ts.map +1 -1
- package/dist/server/runtime/tasks.js +1 -0
- package/dist/server/runtime/tasks.js.map +1 -1
- package/dist/server/tasks/contracts.d.ts +2 -0
- package/dist/server/tasks/contracts.d.ts.map +1 -1
- package/dist/server/tasks/contracts.js.map +1 -1
- package/dist/server/tasks/frame-continuation.d.ts +1 -1
- package/dist/server/tasks/frame-continuation.d.ts.map +1 -1
- package/dist/server/tasks/frame-continuation.js +21 -10
- package/dist/server/tasks/frame-continuation.js.map +1 -1
- package/dist/server/tasks/frame-runtime.d.ts +2 -2
- package/dist/server/tasks/frame-runtime.d.ts.map +1 -1
- package/dist/server/tasks/frame-runtime.js +14 -6
- package/dist/server/tasks/frame-runtime.js.map +1 -1
- package/dist/server/tasks/progress-bindings.d.ts +20 -0
- package/dist/server/tasks/progress-bindings.d.ts.map +1 -0
- package/dist/server/tasks/progress-bindings.js +51 -0
- package/dist/server/tasks/progress-bindings.js.map +1 -0
- package/dist/server/tasks/progress-receiver.d.ts +24 -0
- package/dist/server/tasks/progress-receiver.d.ts.map +1 -0
- package/dist/server/tasks/progress-receiver.js +71 -0
- package/dist/server/tasks/progress-receiver.js.map +1 -0
- package/dist/server/tasks/resources.d.ts.map +1 -1
- package/dist/server/tasks/resources.js +6 -3
- package/dist/server/tasks/resources.js.map +1 -1
- package/dist/server/tasks/scheduled-reactions.d.ts.map +1 -1
- package/dist/server/tasks/scheduled-reactions.js +9 -2
- package/dist/server/tasks/scheduled-reactions.js.map +1 -1
- package/dist/tasks/contracts.d.ts +2 -0
- package/dist/tasks/contracts.d.ts.map +1 -1
- package/dist/tasks/contracts.js.map +1 -1
- package/dist/tasks/frame-continuation.d.ts +1 -1
- package/dist/tasks/frame-continuation.d.ts.map +1 -1
- package/dist/tasks/frame-continuation.js +21 -10
- package/dist/tasks/frame-continuation.js.map +1 -1
- package/dist/tasks/frame-runtime.d.ts +2 -2
- package/dist/tasks/frame-runtime.d.ts.map +1 -1
- package/dist/tasks/frame-runtime.js +14 -6
- package/dist/tasks/frame-runtime.js.map +1 -1
- package/dist/tasks/progress-bindings.d.ts +20 -0
- package/dist/tasks/progress-bindings.d.ts.map +1 -0
- package/dist/tasks/progress-bindings.js +51 -0
- package/dist/tasks/progress-bindings.js.map +1 -0
- package/dist/tasks/progress-receiver.d.ts +24 -0
- package/dist/tasks/progress-receiver.d.ts.map +1 -0
- package/dist/tasks/progress-receiver.js +71 -0
- package/dist/tasks/progress-receiver.js.map +1 -0
- package/dist/tasks/resources.d.ts.map +1 -1
- package/dist/tasks/resources.js +6 -3
- package/dist/tasks/resources.js.map +1 -1
- package/dist/tasks/scheduled-reactions.d.ts.map +1 -1
- package/dist/tasks/scheduled-reactions.js +9 -2
- package/dist/tasks/scheduled-reactions.js.map +1 -1
- package/package.json +1 -1
- package/dist/client/component/error-boundary.js.map +0 -1
- package/dist/server/component/error-boundary.js.map +0 -1
|
@@ -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":"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
|
|
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
|
-
|
|
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":"AAAA,OAAO,EACN,KAAK,EACL,wBAAwB,EACxB,MAAM,EACN,yBAAyB,EACzB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAAE,2BAA2B,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAW5D,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,UAAU,GAAG,IAAI,OAAO,EAAqC,CAAC;AAEpE,oEAAoE;AACpE,MAAM,UAAU,cAAc,CAAC,MAAmB,EAAE,KAA2B;IAC9E,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAC/B,CAAC;AACD,MAAM,mBAAmB,GAAG,IAAI,OAAO,EAAmC,CAAC;AAC3E,MAAM,aAAa,GAAG,IAAI,OAAO,EAAkC,CAAC;AACpE,MAAM,uBAAuB,GAAG,IAAI,OAAO,EAA0C,CAAC;AAEtF,uFAAuF;AACvF,MAAM,UAAU,iBAAiB,CAAC,MAAmB,EAAE,QAAoB;IAC1E,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO;IAC3B,IAAI,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,GAAG,EAAE,CAAC;QACZ,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACvB,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,oBAAoB,CAAC,MAAmB;IACvD,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7B,KAAK,CAAC,GAAG,EAAE;QACV,KAAK,MAAM,QAAQ,IAAI,MAAM;YAAE,QAAQ,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,oBAAoB,CAAC,MAAmB;IACvD,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7B,uBAAuB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CACnC,MAAmB,EACnB,MAAc,EACd,IAA4B,EAC5B,IAAmB,EACnB,MAA0C,EAC1C,IAAmC;IAEnC,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IACrC,MAAM,KAAK,GAAG,OAAO,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,yBAAyB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,wBAAwB,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAC3E,IAAI,OAAO,EAAE,CAAC;QACb,IAAI,SAAS,GAAG,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,SAAS,EAAE,CAAC;YAChB,SAAS,GAAG,EAAE,CAAC;YACf,uBAAuB,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC/C,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,2BAA2B,CAC1C,MAAmB;IAEnB,MAAM,SAAS,GAAG,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtD,uBAAuB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACvC,OAAO,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAc,EAAE,IAA4B;IACvE,IAAI,KAAK,GAAY,MAAM,CAAC;IAC5B,KAAK,MAAM,OAAO,IAAI,IAAI;QAAE,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAe,EAAE,OAAO,CAAC,CAAC;IAC1E,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,yBAAyB,CACjC,KAAc,EACd,IAAmB,EACnB,MAAc,EACd,IAAwB;IAExB,IAAI,IAAI,KAAK,KAAK,IAAI,KAAK,YAAY,GAAG,EAAE,CAAC;QAC5C,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QAC9C,IAAI,MAAM,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,IAAI,KAAK,KAAK,IAAI,KAAK,YAAY,GAAG,EAAE,CAAC;QAC5C,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QAC9C,IAAI,MAAM,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,kBAAkB,CAC1B,IAA4B,EAC5B,IAAmB,EACnB,MAAc,EACd,IAAwB;IAExB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACpB,IAAI,MAAM,KAAK,KAAK;YACnB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/F,IAAI,MAAM,KAAK,QAAQ;YACtB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;IACnD,CAAC;IACD,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9F,IAAI,MAAM,KAAK,QAAQ;QACtB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AACnD,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,mBAAmB,CAAC,MAAmB,EAAE,OAAoB;IAC5E,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,MAAM,GAAG,GAAG,GAAS,EAAE;QACtB,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,GAAG,KAAK,CAAC;QACf,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3B,uBAAuB,CACtB,MAAM,EACN,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;oBACvC,uBAAuB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBACxC,CAAC,CAAC,CACF,CAAC;YACH,CAAC;QACF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,uBAAuB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACxC,CAAC;IACF,CAAC,CAAC;IACF,IAAI,MAAM,CAAC,OAAO;QAAE,GAAG,EAAE,CAAC;;QACrB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAmB,EAAE,OAAsB;IAC3E,IAAI,OAAO,GAAG,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;QACpB,mBAAmB,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;QACzB,OAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzB,IAAI,CAAC,OAAQ,CAAC,IAAI;YAAE,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,wBAAwB,CACvC,MAA+B;IAE/B,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,MAAM,OAAO,GAAG,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAChD,IAAI,CAAC,OAAO,EAAE,IAAI;QAAE,OAAO,SAAS,CAAC;IACrC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AACxD,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,eAAe,CAC9B,MAAmB,EACnB,QAAW,EACX,QAA2F;IAE3F,mBAAmB,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACzF,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,gBAAgB,CAC/B,MAAmB,EACnB,QAA8C,EAC9C,OAAyB;IAEzB,MAAM,QAAQ,GAAG,UAMhB,CAAC;IACF,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACzD,MAAM,GAAG,QAAQ,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,EAAE;QAClD,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,eAAe,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACzF,CAAC,EAAE,OAAO,CAAC,CAAC;IACZ,IAAI,MAAM,CAAC,OAAO;QAAE,MAAM,EAAE,CAAC;;QACxB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAC3B,QAAW,EACX,QAGY,EACZ,MAAe;IAEf,IAAI,OAAO,QAAQ,KAAK,UAAU;QAAE,OAAO,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACtE,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACzB,IAAI,OAAO,QAAQ,KAAK,UAAU;YAAE,OAAO,QAAQ,EAAE,CAAC;QACtD,OAAO;IACR,CAAC;IACD,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,UAAU,CAAC;QAAE,OAAO;IAC1F,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACnF,IAAI,QAAQ;QAAE,OAAO,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,MAAyE,CAAC;IAC1F,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;QACpE,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;IACzC,CAAC;IACD,IAAI,OAAO,CAAC,OAAO;QAAE,OAAO,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,oBAAoB,CAC5B,QAAgB,EAChB,GAAgB,EAChB,GAAG,IAAe;IAElB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAY,CAAC;IACrD,IAAI,OAAO,MAAM,KAAK,UAAU;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAyB,CAAC;AAC/F,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAmB,EAAE,KAAc;IACnE,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,QAAQ,EAAE,CAAC;QACd,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAC/F,OAAO;IACR,CAAC;IACD,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,8BAA8B,EAAE,KAAK,CAAC,CAAC;AACnF,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,WAAW,CAC1B,MAAmB,EACnB,OAAgC,EAChC,KAAc,EACd,GAAG,IAAU;IAEb,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,UAAU,CACzB,CAAC,GAAG,MAAY,EAAE,EAAE;QACnB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IACnF,CAAC,EACD,KAAK,EACL,GAAG,IAAI,CACP,CAAC;IACF,IAAI,MAAM,CAAC,OAAO;QAAE,KAAK,EAAE,CAAC;;QACvB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,YAAY,CAC3B,MAAmB,EACnB,OAAgC,EAChC,KAAc,EACd,GAAG,IAAU;IAEb,MAAM,QAAQ,GAAG,WAAW,CAC3B,CAAC,GAAG,MAAY,EAAE,EAAE;QACnB,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IACpF,CAAC,EACD,KAAK,EACL,GAAG,IAAI,CACP,CAAC;IACF,IAAI,MAAM,CAAC,OAAO;QAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;;QACvC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACrF,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,kBAAkB,CAAC,MAAmB,EAAE,OAA+B;IACtF,MAAM,QAAQ,GAAG,UAGhB,CAAC;IACF,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC1D,KAAK,GAAG,QAAQ,CAAC,qBAAqB,CAAC,CAAC,IAAI,EAAE,EAAE;QAC/C,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,eAAe,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,OAAO;QAAE,MAAM,EAAE,CAAC;;QACxB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,OAAO,KAAK,CAAC;AACd,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,YAAY,CAC3B,MAAmB,EACnB,QAAW;IAEX,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACzD,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,SAAS,eAAe,CAAC,MAAmB,EAAE,KAAa,EAAE,QAAoB;IAChF,IAAI,CAAC;QACJ,QAAQ,EAAE,CAAC;IACZ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,QAAQ;YAAE,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;;YAC3F,uBAAuB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC;AACF,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,SAAS,CACxB,MAAmB,EACnB,OAA8D,EAC9D,KAAc,EACd,IAA8B;IAE9B,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAChC,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;QACvC,CAAC,CAAC,2BAA2B,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC/C,CAAC,CAAC,SAAS,CAAC;IACb,OAAO,CAAC,MAAM,GAAG,QAAQ,EAAE,MAAM,IAAI,MAAM,CAAC;IAC5C,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACvC,IAAI,QAAQ,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YACvC,KAAK,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAChF,CAAC;;YAAM,QAAQ,EAAE,OAAO,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;QACpB,MAAM,KAAK,CAAC;IACb,CAAC;AACF,CAAC;AAED,SAAS,gBAAgB,KAAU,CAAC;AAEpC;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAI,MAAmB,EAAE,KAAyB;IAC1E,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/E,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACzC,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,aAAuC,CAAC;QAC5C,MAAM,KAAK,GAAG,GAAG,EAAE;YAClB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,aAAa,EAAE,EAAE,CAAC;YAClB,aAAa,GAAG,SAAS,CAAC;YAC1B,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC5E,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,CAAC,MAAe,EAAE,MAAe,EAAE,EAAE;YACnD,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC3C,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE;gBAC5B,IAAI,MAAM;oBAAE,MAAM,CAAC,MAAM,CAAC,CAAC;qBACtB,IAAI,MAAM,CAAC,OAAO;oBAAE,MAAM,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;;oBAChE,OAAO,CAAC,MAAW,CAAC,CAAC;YAC3B,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC;QACF,MAAM,YAAY,GAAG,CAAC,MAAe,EAAE,MAAe,EAAE,EAAE;YACzD,IAAI,OAAO;gBAAE,OAAO;YACpB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACrC,IAAI,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;gBACzB,aAAa,GAAG,yBAAyB,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE;oBAC3D,aAAa,GAAG,SAAS,CAAC;oBAC1B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACxB,CAAC,CAAC,CAAC;gBACH,OAAO;YACR,CAAC;YACD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACxB,CAAC,CAAC;QACF,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAC1B,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,EACvC,CAAC,KAAc,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAC7C,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC","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,
|
|
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"]}
|
|
@@ -17,6 +17,8 @@ export interface TaskContext {
|
|
|
17
17
|
export interface TaskContextPolicy extends TaskContext {
|
|
18
18
|
client(): TaskContextPolicy;
|
|
19
19
|
server(): TaskContextPolicy;
|
|
20
|
+
/** Declares a missable snapshot receiver for browser-initiated server work. */
|
|
21
|
+
progress(): TaskContextPolicy;
|
|
20
22
|
parallel(): TaskContextPolicy;
|
|
21
23
|
latest(): TaskContextPolicy;
|
|
22
24
|
queue(): TaskContextPolicy;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/tasks/contracts.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,MAAM,MAAM,cAAc,GACvB,gBAAgB,GAChB,UAAU,GACV,aAAa,GACb,SAAS,GACT,WAAW,CAAC;AAEf,6CAA6C;AAC7C,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,UAAU,CAAC,IAAI,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACnC,OAAO,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACnD,GAAG,CAAC,CAAC,SAAS,UAAU,GAAG,eAAe,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;CAC5D;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACrD,MAAM,IAAI,iBAAiB,CAAC;IAC5B,MAAM,IAAI,iBAAiB,CAAC;IAC5B,QAAQ,IAAI,iBAAiB,CAAC;IAC9B,MAAM,IAAI,iBAAiB,CAAC;IAC5B,KAAK,IAAI,iBAAiB,CAAC;IAC3B,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,iBAAiB,CAAC;IACpC,SAAS,IAAI,iBAAiB,CAAC;IAC/B,MAAM,IAAI,iBAAiB,CAAC;IAC5B,QAAQ,IAAI,iBAAiB,CAAC;IAC9B,QAAQ,IAAI,iBAAiB,CAAC;IAC9B,WAAW,IAAI,iBAAiB,CAAC;IACjC,QAAQ,IAAI,iBAAiB,CAAC;CAC9B;AAED,2EAA2E;AAC3E,MAAM,WAAW,SAAU,SAAQ,eAAe;IACjD,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC7B;AAED,4DAA4D;AAC5D,MAAM,WAAW,UAAU,CAAC,MAAM;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC/B;AAED,4EAA4E;AAC5E,MAAM,WAAW,cAAc,CAAC,MAAM,CAAE,SAAQ,WAAW,CAAC,MAAM,CAAC;IAClE,IAAI,CAAC,QAAQ,GAAG,MAAM,EAAE,QAAQ,GAAG,KAAK,EACvC,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,EAC1E,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,GACzE,cAAc,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;IACvC,KAAK,CAAC,OAAO,GAAG,KAAK,EACpB,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,GACvE,cAAc,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;IACpC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACjE,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChD;AAED,wCAAwC;AACxC,MAAM,WAAW,YAAY,CAAC,IAAI,SAAS,OAAO,EAAE,EAAE,MAAM;IAC3D,CAAC,GAAG,IAAI,EAAE,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;CACxC;AAED,2FAA2F;AAE3F,MAAM,MAAM,eAAe,CAAC,MAAM,GAAG,OAAO,IAAI,YAAY,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;AAE5E,uDAAuD;AACvD,MAAM,WAAW,iBAAiB,CAAC,IAAI,SAAS,OAAO,EAAE,EAAE,MAAM,CAChE,SAAQ,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EACjC,UAAU,CAAC,MAAM,CAAC;CAAG;AAEvB,oGAAoG;AACpG,MAAM,WAAW,kBAAkB,CAAC,IAAI,SAAS,OAAO,EAAE;IACzD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACrD,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;IACxD,QAAQ,CAAC,WAAW,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;IACvD,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;IACrD;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,SAAS,OAAO,EAAE,CAAC;IACpE,QAAQ,CAAC,SAAS,CAAC,EAAE,UAAU,GAAG,aAAa,CAAC;IAChD,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;CAC3B;AAED,8EAA8E;AAC9E,MAAM,WAAW,oBAAoB,CAAC,IAAI,SAAS,OAAO,EAAE,EAAE,MAAM,CAAE,SAAQ,UAAU;IACvF,CAAC,GAAG,IAAI,EAAE,IAAI,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC/B"}
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/tasks/contracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/tasks/contracts.ts"],"names":[],"mappings":"","sourcesContent":["/** Describes why a task generation began. */\nexport type TaskActivation =\n\t| 'initialization'\n\t| 'reactive'\n\t| 'interaction'\n\t| 'invoked'\n\t| 'lifecycle';\n\n/** Capabilities scoped to one task frame. */\nexport interface TaskContext {\n\treadonly signal: AbortSignal;\n\treadonly generation: number;\n\treadonly activation: TaskActivation;\n\tpeek<T>(read: () => T): T;\n\toptimistic(work: () => void): void;\n\tcleanup(cleanup: () => void | Promise<void>): void;\n\town<T extends Disposable | AsyncDisposable>(resource: T): T;\n}\n\n/**\n * Declarative task policy accepted only as the default value of a final\n * {@link TaskContext} parameter in compiler-authored source.\n */\nexport interface TaskContextPolicy extends TaskContext {\n\tclient(): TaskContextPolicy;\n\tserver(): TaskContextPolicy;\n\tparallel(): TaskContextPolicy;\n\tlatest(): TaskContextPolicy;\n\tqueue(): TaskContextPolicy;\n\tkey<T>(value: T): TaskContextPolicy;\n\timmediate(): TaskContextPolicy;\n\tnormal(): TaskContextPolicy;\n\tdeferred(): TaskContextPolicy;\n\tblocking(): TaskContextPolicy;\n\tnonblocking(): TaskContextPolicy;\n\tdetached(): TaskContextPolicy;\n}\n\n/** Durable cancellation and concurrency ownership for task generations. */\nexport interface TaskOwner extends AsyncDisposable {\n\treadonly signal: AbortSignal;\n}\n\n/** Owner-bound observable state for one task definition. */\nexport interface TaskStatus<Result> {\n\treadonly pending: boolean;\n\treadonly pendingCount: number;\n\treadonly generation: number;\n\treadonly result: Result | undefined;\n\treadonly error: unknown;\n\tcancel(reason?: unknown): void;\n}\n\n/** A thenable whose result settles only after its attached task subtree. */\nexport interface TaskInvocation<Result> extends PromiseLike<Result> {\n\tthen<TResult1 = Result, TResult2 = never>(\n\t\tonFulfilled?: ((value: Result) => TResult1 | PromiseLike<TResult1>) | null,\n\t\tonRejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n\t): TaskInvocation<TResult1 | TResult2>;\n\tcatch<TResult = never>(\n\t\tonRejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null\n\t): TaskInvocation<Result | TResult>;\n\tfinally(onFinally?: (() => void) | null): TaskInvocation<Result>;\n\treadonly [Symbol.toStringTag]: 'TaskInvocation';\n}\n\n/** Callable runtime task definition. */\nexport interface TaskFunction<Args extends unknown[], Result> {\n\t(...args: Args): TaskInvocation<Result>;\n}\n\n/** Existential task function retained where authored argument tuples are not inspected. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Runtime task registries preserve arbitrary authored argument tuples through callable identity.\nexport type AnyTaskFunction<Result = unknown> = TaskFunction<any[], Result>;\n\n/** Owner-bound task callable with aggregate status. */\nexport interface BoundTaskFunction<Args extends unknown[], Result>\n\textends TaskFunction<Args, Result>,\n\t\tTaskStatus<Result> {}\n\n/** Runtime policy required when an integration defines a task outside compiled component source. */\nexport interface RuntimeTaskOptions<Args extends unknown[]> {\n\treadonly label?: string;\n\treadonly placement?: 'current' | 'client' | 'server';\n\treadonly priority?: 'immediate' | 'normal' | 'deferred';\n\treadonly concurrency?: 'parallel' | 'latest' | 'queue';\n\treadonly concurrencyKey?: (...args: Args) => unknown;\n\t/**\n\t * Compiler-generated resolver for defaulted task parameters. It evaluates\n\t * omitted defaults once per generation without subscribing the task to\n\t * reactive reads performed while resolving them.\n\t */\n\treadonly captureArguments?: (args: unknown[]) => readonly unknown[];\n\treadonly readiness?: 'blocking' | 'nonblocking';\n\treadonly detached?: boolean;\n\treadonly owner?: TaskOwner;\n}\n\n/** Reserved callback that must run or be explicitly released exactly once. */\nexport interface ReservedTaskCallback<Args extends unknown[], Result> extends Disposable {\n\t(...args: Args): Result;\n\tcancel(reason?: unknown): void;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/tasks/contracts.ts"],"names":[],"mappings":"","sourcesContent":["/** Describes why a task generation began. */\nexport type TaskActivation =\n\t| 'initialization'\n\t| 'reactive'\n\t| 'interaction'\n\t| 'invoked'\n\t| 'lifecycle';\n\n/** Capabilities scoped to one task frame. */\nexport interface TaskContext {\n\treadonly signal: AbortSignal;\n\treadonly generation: number;\n\treadonly activation: TaskActivation;\n\tpeek<T>(read: () => T): T;\n\toptimistic(work: () => void): void;\n\tcleanup(cleanup: () => void | Promise<void>): void;\n\town<T extends Disposable | AsyncDisposable>(resource: T): T;\n}\n\n/**\n * Declarative task policy accepted only as the default value of a final\n * {@link TaskContext} parameter in compiler-authored source.\n */\nexport interface TaskContextPolicy extends TaskContext {\n\tclient(): TaskContextPolicy;\n\tserver(): TaskContextPolicy;\n\t/** Declares a missable snapshot receiver for browser-initiated server work. */\n\tprogress(): TaskContextPolicy;\n\tparallel(): TaskContextPolicy;\n\tlatest(): TaskContextPolicy;\n\tqueue(): TaskContextPolicy;\n\tkey<T>(value: T): TaskContextPolicy;\n\timmediate(): TaskContextPolicy;\n\tnormal(): TaskContextPolicy;\n\tdeferred(): TaskContextPolicy;\n\tblocking(): TaskContextPolicy;\n\tnonblocking(): TaskContextPolicy;\n\tdetached(): TaskContextPolicy;\n}\n\n/** Durable cancellation and concurrency ownership for task generations. */\nexport interface TaskOwner extends AsyncDisposable {\n\treadonly signal: AbortSignal;\n}\n\n/** Owner-bound observable state for one task definition. */\nexport interface TaskStatus<Result> {\n\treadonly pending: boolean;\n\treadonly pendingCount: number;\n\treadonly generation: number;\n\treadonly result: Result | undefined;\n\treadonly error: unknown;\n\tcancel(reason?: unknown): void;\n}\n\n/** A thenable whose result settles only after its attached task subtree. */\nexport interface TaskInvocation<Result> extends PromiseLike<Result> {\n\tthen<TResult1 = Result, TResult2 = never>(\n\t\tonFulfilled?: ((value: Result) => TResult1 | PromiseLike<TResult1>) | null,\n\t\tonRejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n\t): TaskInvocation<TResult1 | TResult2>;\n\tcatch<TResult = never>(\n\t\tonRejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null\n\t): TaskInvocation<Result | TResult>;\n\tfinally(onFinally?: (() => void) | null): TaskInvocation<Result>;\n\treadonly [Symbol.toStringTag]: 'TaskInvocation';\n}\n\n/** Callable runtime task definition. */\nexport interface TaskFunction<Args extends unknown[], Result> {\n\t(...args: Args): TaskInvocation<Result>;\n}\n\n/** Existential task function retained where authored argument tuples are not inspected. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Runtime task registries preserve arbitrary authored argument tuples through callable identity.\nexport type AnyTaskFunction<Result = unknown> = TaskFunction<any[], Result>;\n\n/** Owner-bound task callable with aggregate status. */\nexport interface BoundTaskFunction<Args extends unknown[], Result>\n\textends TaskFunction<Args, Result>,\n\t\tTaskStatus<Result> {}\n\n/** Runtime policy required when an integration defines a task outside compiled component source. */\nexport interface RuntimeTaskOptions<Args extends unknown[]> {\n\treadonly label?: string;\n\treadonly placement?: 'current' | 'client' | 'server';\n\treadonly priority?: 'immediate' | 'normal' | 'deferred';\n\treadonly concurrency?: 'parallel' | 'latest' | 'queue';\n\treadonly concurrencyKey?: (...args: Args) => unknown;\n\t/**\n\t * Compiler-generated resolver for defaulted task parameters. It evaluates\n\t * omitted defaults once per generation without subscribing the task to\n\t * reactive reads performed while resolving them.\n\t */\n\treadonly captureArguments?: (args: unknown[]) => readonly unknown[];\n\treadonly readiness?: 'blocking' | 'nonblocking';\n\treadonly detached?: boolean;\n\treadonly owner?: TaskOwner;\n}\n\n/** Reserved callback that must run or be explicitly released exactly once. */\nexport interface ReservedTaskCallback<Args extends unknown[], Result> extends Disposable {\n\t(...args: Args): Result;\n\tcancel(reason?: unknown): void;\n}\n"]}
|
|
@@ -4,5 +4,5 @@ export declare function registerTaskFrameSignal(signal: AbortSignal, frame: Task
|
|
|
4
4
|
/** Releases continuation restoration state when its frame settles. */
|
|
5
5
|
export declare function releaseTaskFrameSignal(signal: AbortSignal): void;
|
|
6
6
|
/** Queues one serialized continuation resumption for the frame owning a task signal. */
|
|
7
|
-
export declare function resumeTaskFrameContinuation(signal: AbortSignal, resume: () => void, enter: (frame: TaskFrameRecord) => () => void): void;
|
|
7
|
+
export declare function resumeTaskFrameContinuation(signal: AbortSignal, resume: () => void, enter: (frame: TaskFrameRecord | undefined) => () => void): void;
|
|
8
8
|
//# sourceMappingURL=frame-continuation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame-continuation.d.ts","sourceRoot":"","sources":["../../src/tasks/frame-continuation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAU5D,uFAAuF;AACvF,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,CAEzF;AAED,sEAAsE;AACtE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAEhE;AAED,wFAAwF;AACxF,wBAAgB,2BAA2B,CAC1C,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM,IAAI,EAClB,KAAK,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"frame-continuation.d.ts","sourceRoot":"","sources":["../../src/tasks/frame-continuation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAU5D,uFAAuF;AACvF,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,CAEzF;AAED,sEAAsE;AACtE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAEhE;AAED,wFAAwF;AACxF,wBAAgB,2BAA2B,CAC1C,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM,IAAI,EAClB,KAAK,EAAE,CAAC,KAAK,EAAE,eAAe,GAAG,SAAS,KAAK,MAAM,IAAI,GACvD,IAAI,CAYN"}
|
|
@@ -31,15 +31,26 @@ function runNextTaskResumption() {
|
|
|
31
31
|
resumptionScheduled = false;
|
|
32
32
|
return;
|
|
33
33
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
leave();
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
34
|
+
let leave;
|
|
35
|
+
try {
|
|
36
|
+
// Cancellation may settle a frame while an earlier resumption owns the queue.
|
|
37
|
+
// Deliver the pending promise settlement without reviving that frame.
|
|
38
|
+
leave = next.enter(next.frame.settled ? undefined : next.frame);
|
|
39
|
+
next.resume();
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
// Promise resolution queues the authored continuation before the restoration job.
|
|
43
|
+
queueMicrotask(() => {
|
|
44
|
+
try {
|
|
45
|
+
leave?.();
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
if (pendingResumptions.length)
|
|
49
|
+
queueMicrotask(runNextTaskResumption);
|
|
50
|
+
else
|
|
51
|
+
resumptionScheduled = false;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
44
55
|
}
|
|
45
56
|
//# sourceMappingURL=frame-continuation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame-continuation.js","sourceRoot":"","sources":["../../src/tasks/frame-continuation.ts"],"names":[],"mappings":"AAEA,MAAM,cAAc,GAAG,IAAI,OAAO,EAAgC,CAAC;AACnE,MAAM,kBAAkB,GAInB,EAAE,CAAC;AACR,IAAI,mBAAmB,GAAG,KAAK,CAAC;AAEhC,uFAAuF;AACvF,MAAM,UAAU,uBAAuB,CAAC,MAAmB,EAAE,KAAsB;IAClF,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,sBAAsB,CAAC,MAAmB;IACzD,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,2BAA2B,CAC1C,MAAmB,EACnB,MAAkB,EAClB,
|
|
1
|
+
{"version":3,"file":"frame-continuation.js","sourceRoot":"","sources":["../../src/tasks/frame-continuation.ts"],"names":[],"mappings":"AAEA,MAAM,cAAc,GAAG,IAAI,OAAO,EAAgC,CAAC;AACnE,MAAM,kBAAkB,GAInB,EAAE,CAAC;AACR,IAAI,mBAAmB,GAAG,KAAK,CAAC;AAEhC,uFAAuF;AACvF,MAAM,UAAU,uBAAuB,CAAC,MAAmB,EAAE,KAAsB;IAClF,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,sBAAsB,CAAC,MAAmB;IACzD,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,2BAA2B,CAC1C,MAAmB,EACnB,MAAkB,EAClB,KAAyD;IAEzD,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC7B,MAAM,EAAE,CAAC;QACT,OAAO;IACR,CAAC;IACD,kBAAkB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAClD,IAAI,mBAAmB;QAAE,OAAO;IAChC,mBAAmB,GAAG,IAAI,CAAC;IAC3B,8FAA8F;IAC9F,8FAA8F;IAC9F,qBAAqB,EAAE,CAAC;AACzB,CAAC;AAED,+FAA+F;AAC/F,SAAS,qBAAqB;IAC7B,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,EAAE,CAAC;IACxC,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,mBAAmB,GAAG,KAAK,CAAC;QAC5B,OAAO;IACR,CAAC;IACD,IAAI,KAA+B,CAAC;IACpC,IAAI,CAAC;QACJ,8EAA8E;QAC9E,sEAAsE;QACtE,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,EAAE,CAAC;IACf,CAAC;YAAS,CAAC;QACV,kFAAkF;QAClF,cAAc,CAAC,GAAG,EAAE;YACnB,IAAI,CAAC;gBACJ,KAAK,EAAE,EAAE,CAAC;YACX,CAAC;oBAAS,CAAC;gBACV,IAAI,kBAAkB,CAAC,MAAM;oBAAE,cAAc,CAAC,qBAAqB,CAAC,CAAC;;oBAChE,mBAAmB,GAAG,KAAK,CAAC;YAClC,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC;AACF,CAAC","sourcesContent":["import type { TaskFrameRecord } from './frame-contracts.js';\n\nconst framesBySignal = new WeakMap<AbortSignal, TaskFrameRecord>();\nconst pendingResumptions: Array<{\n\treadonly frame: TaskFrameRecord;\n\treadonly resume: () => void;\n\treadonly enter: (frame: TaskFrameRecord | undefined) => () => void;\n}> = [];\nlet resumptionScheduled = false;\n\n/** Associates a frame signal with the frame restored after compiler-lowered awaits. */\nexport function registerTaskFrameSignal(signal: AbortSignal, frame: TaskFrameRecord): void {\n\tframesBySignal.set(signal, frame);\n}\n\n/** Releases continuation restoration state when its frame settles. */\nexport function releaseTaskFrameSignal(signal: AbortSignal): void {\n\tframesBySignal.delete(signal);\n}\n\n/** Queues one serialized continuation resumption for the frame owning a task signal. */\nexport function resumeTaskFrameContinuation(\n\tsignal: AbortSignal,\n\tresume: () => void,\n\tenter: (frame: TaskFrameRecord | undefined) => () => void\n): void {\n\tconst frame = framesBySignal.get(signal);\n\tif (!frame || frame.settled) {\n\t\tresume();\n\t\treturn;\n\t}\n\tpendingResumptions.push({ frame, resume, enter });\n\tif (resumptionScheduled) return;\n\tresumptionScheduled = true;\n\t// The promise-resolution job is already an asynchronous boundary. Enter the uncontended first\n\t// continuation there and retain the queue only for resolutions that overlap its authored job.\n\trunNextTaskResumption();\n}\n\n/** Serializes restoration so concurrent promise resolutions cannot exchange task ownership. */\nfunction runNextTaskResumption(): void {\n\tconst next = pendingResumptions.shift();\n\tif (!next) {\n\t\tresumptionScheduled = false;\n\t\treturn;\n\t}\n\tlet leave: (() => void) | undefined;\n\ttry {\n\t\t// Cancellation may settle a frame while an earlier resumption owns the queue.\n\t\t// Deliver the pending promise settlement without reviving that frame.\n\t\tleave = next.enter(next.frame.settled ? undefined : next.frame);\n\t\tnext.resume();\n\t} finally {\n\t\t// Promise resolution queues the authored continuation before the restoration job.\n\t\tqueueMicrotask(() => {\n\t\t\ttry {\n\t\t\t\tleave?.();\n\t\t\t} finally {\n\t\t\t\tif (pendingResumptions.length) queueMicrotask(runNextTaskResumption);\n\t\t\t\telse resumptionScheduled = false;\n\t\t\t}\n\t\t});\n\t}\n}\n"]}
|
|
@@ -18,8 +18,8 @@ export declare function withDeferredTaskFrame<T>(materialize: () => TaskFrameRec
|
|
|
18
18
|
export declare function currentTaskOwnerRecord(): TaskOwnerRecord | undefined;
|
|
19
19
|
/** Establishes a durable host owner during component state-machine construction or adapter setup. */
|
|
20
20
|
export declare function withTaskOwnerRecord<T>(owner: TaskOwnerRecord, work: () => T): T;
|
|
21
|
-
/** Runs a synchronous segment with
|
|
22
|
-
export declare function withTaskFrameRecord<T>(frame: TaskFrameRecord, work: () => T): T;
|
|
21
|
+
/** Runs a synchronous segment with the supplied frame, or clears ambient frame ownership. */
|
|
22
|
+
export declare function withTaskFrameRecord<T>(frame: TaskFrameRecord | undefined, work: () => T): T;
|
|
23
23
|
/**
|
|
24
24
|
* Runs work in a frame, then waits for dynamically attached descendants and
|
|
25
25
|
* executes cleanup in last-in-first-out order.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame-runtime.d.ts","sourceRoot":"","sources":["../../src/tasks/frame-runtime.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAO7D,OAAO,EAA0B,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAajF,OAAO,EAGN,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACX,wBAAwB,EACxB,0BAA0B,EAC1B,eAAe,EACf,eAAe,EACf,MAAM,sBAAsB,CAAC;AAQ9B,kEAAkE;AAClE,wBAAgB,qBAAqB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,eAAe,CAErE;AAED,4EAA4E;AAC5E,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAGhG;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,eAAe,CAGjE;AAED,8EAA8E;AAC9E,wBAAgB,sBAAsB,IAAI,eAAe,GAAG,SAAS,CAEpE;AAED,kGAAkG;AAClG,wBAAgB,4BAA4B,IAAI,eAAe,GAAG,SAAS,CAE1E;AAED,mGAAmG;AACnG,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,eAAe,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAQ7F;AAED,wEAAwE;AACxE,wBAAgB,sBAAsB,IAAI,eAAe,GAAG,SAAS,CAEpE;AAED,qGAAqG;AACrG,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAQ/E;AAED,
|
|
1
|
+
{"version":3,"file":"frame-runtime.d.ts","sourceRoot":"","sources":["../../src/tasks/frame-runtime.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAO7D,OAAO,EAA0B,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAajF,OAAO,EAGN,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACX,wBAAwB,EACxB,0BAA0B,EAC1B,eAAe,EACf,eAAe,EACf,MAAM,sBAAsB,CAAC;AAQ9B,kEAAkE;AAClE,wBAAgB,qBAAqB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,eAAe,CAErE;AAED,4EAA4E;AAC5E,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAGhG;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,eAAe,CAGjE;AAED,8EAA8E;AAC9E,wBAAgB,sBAAsB,IAAI,eAAe,GAAG,SAAS,CAEpE;AAED,kGAAkG;AAClG,wBAAgB,4BAA4B,IAAI,eAAe,GAAG,SAAS,CAE1E;AAED,mGAAmG;AACnG,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,eAAe,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAQ7F;AAED,wEAAwE;AACxE,wBAAgB,sBAAsB,IAAI,eAAe,GAAG,SAAS,CAEpE;AAED,qGAAqG;AACrG,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAQ/E;AAED,6FAA6F;AAC7F,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAa3F;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EACjC,OAAO,EAAE,wBAAwB,EACjC,IAAI,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GAChD,OAAO,CAAC,CAAC,CAAC,CAsLZ;AAED,2FAA2F;AAC3F,wBAAgB,yBAAyB,CACxC,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,GAC7B;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAEzC;AAED,4EAA4E;AAC5E,wBAAgB,yBAAyB,CACxC,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,GAC9B,IAAI,CAMN;AAED,iFAAiF;AACjF,wBAAgB,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI,CAG/D;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,MAAM,GAAG,MAAM,CAGxF;AAED,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,IAAI,GAAG,IAAI,CAW7E;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAgB/B,kFAAkF;AAClF,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
|
|
@@ -63,18 +63,22 @@ export function withTaskOwnerRecord(owner, work) {
|
|
|
63
63
|
currentOwner = previous;
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
|
-
/** Runs a synchronous segment with
|
|
66
|
+
/** Runs a synchronous segment with the supplied frame, or clears ambient frame ownership. */
|
|
67
67
|
export function withTaskFrameRecord(frame, work) {
|
|
68
|
-
if (frame
|
|
68
|
+
if (frame?.settled)
|
|
69
69
|
throw new Error('Cannot resume a settled task frame');
|
|
70
70
|
ensureScheduledWorkContextCapture();
|
|
71
71
|
const previous = currentFrame;
|
|
72
|
+
const previousMaterializer = deferredFrameMaterializer;
|
|
72
73
|
currentFrame = frame;
|
|
74
|
+
if (!frame)
|
|
75
|
+
deferredFrameMaterializer = undefined;
|
|
73
76
|
try {
|
|
74
77
|
return work();
|
|
75
78
|
}
|
|
76
79
|
finally {
|
|
77
80
|
currentFrame = previous;
|
|
81
|
+
deferredFrameMaterializer = previousMaterializer;
|
|
78
82
|
}
|
|
79
83
|
}
|
|
80
84
|
/**
|
|
@@ -88,8 +92,10 @@ export function executeTaskFrame(options, work) {
|
|
|
88
92
|
(!structuralParent.producerOpen || structuralParent.settled))
|
|
89
93
|
return Promise.reject(new Error('Cannot attach work after the parent task producer has closed'));
|
|
90
94
|
const owner = options.owner ?? structuralParent?.owner ?? createTaskOwnerRecord('implicit task invocation');
|
|
91
|
-
if (owner.disposed)
|
|
92
|
-
|
|
95
|
+
if (owner.disposed) {
|
|
96
|
+
options.controller?.abort('task-owner-disposed');
|
|
97
|
+
return Promise.reject(new TaskCancellation(options.controller?.signal.reason ?? 'task-owner-disposed'));
|
|
98
|
+
}
|
|
93
99
|
const controller = options.controller ?? new AbortController();
|
|
94
100
|
// The owner cancels its active frame controllers directly during disposal. Subscribing every
|
|
95
101
|
// frame to its durable signal would retain settled controllers until the owner itself is released.
|
|
@@ -288,12 +294,14 @@ export function taskMutation(signal, mutation) {
|
|
|
288
294
|
/** Restores the owning task frame around one compiler-lowered async continuation. */
|
|
289
295
|
export function resumeTaskFrame(signal, resume) {
|
|
290
296
|
resumeTaskFrameContinuation(signal, resume, (frame) => {
|
|
291
|
-
if (frame.settled)
|
|
292
|
-
throw new Error('Cannot resume a settled task frame');
|
|
293
297
|
const previous = currentFrame;
|
|
298
|
+
const previousMaterializer = deferredFrameMaterializer;
|
|
294
299
|
currentFrame = frame;
|
|
300
|
+
if (!frame)
|
|
301
|
+
deferredFrameMaterializer = undefined;
|
|
295
302
|
return () => {
|
|
296
303
|
currentFrame = previous;
|
|
304
|
+
deferredFrameMaterializer = previousMaterializer;
|
|
297
305
|
};
|
|
298
306
|
});
|
|
299
307
|
}
|