@relayflows/sdk 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/authored-flow-error.d.ts +9 -0
- package/dist/authored-flow-error.d.ts.map +1 -0
- package/dist/authored-flow-error.js +13 -0
- package/dist/authored-flow-error.js.map +1 -0
- package/dist/authored-flow-executor.d.ts +28 -0
- package/dist/authored-flow-executor.d.ts.map +1 -0
- package/dist/authored-flow-executor.js +203 -0
- package/dist/authored-flow-executor.js.map +1 -0
- package/dist/authored-flow-lifecycle.d.ts +61 -0
- package/dist/authored-flow-lifecycle.d.ts.map +1 -0
- package/dist/authored-flow-lifecycle.js +284 -0
- package/dist/authored-flow-lifecycle.js.map +1 -0
- package/dist/authored-flow-loader.d.ts +7 -0
- package/dist/authored-flow-loader.d.ts.map +1 -0
- package/dist/authored-flow-loader.js +39 -0
- package/dist/authored-flow-loader.js.map +1 -0
- package/dist/authored-flow-operation.d.ts +43 -0
- package/dist/authored-flow-operation.d.ts.map +1 -0
- package/dist/authored-flow-operation.js +176 -0
- package/dist/authored-flow-operation.js.map +1 -0
- package/dist/authored-flow.d.ts +12 -0
- package/dist/authored-flow.d.ts.map +1 -0
- package/dist/authored-flow.js +13 -0
- package/dist/authored-flow.js.map +1 -0
- package/dist/authored-promise-graph.d.ts +67 -0
- package/dist/authored-promise-graph.d.ts.map +1 -0
- package/dist/authored-promise-graph.js +206 -0
- package/dist/authored-promise-graph.js.map +1 -0
- package/dist/backlog-picker.d.ts +55 -0
- package/dist/backlog-picker.d.ts.map +1 -0
- package/dist/backlog-picker.js +117 -0
- package/dist/backlog-picker.js.map +1 -0
- package/dist/canonical.d.ts +18 -0
- package/dist/canonical.d.ts.map +1 -0
- package/dist/canonical.js +55 -0
- package/dist/canonical.js.map +1 -0
- package/dist/cli/check.d.ts +30 -0
- package/dist/cli/check.d.ts.map +1 -0
- package/dist/cli/check.js +324 -0
- package/dist/cli/check.js.map +1 -0
- package/dist/cli/direct-run.d.ts +3 -0
- package/dist/cli/direct-run.d.ts.map +1 -0
- package/dist/cli/direct-run.js +69 -0
- package/dist/cli/direct-run.js.map +1 -0
- package/dist/cli/hn-monitor.d.ts +107 -0
- package/dist/cli/hn-monitor.d.ts.map +1 -0
- package/dist/cli/hn-monitor.js +220 -0
- package/dist/cli/hn-monitor.js.map +1 -0
- package/dist/cli/interruptible-sleep.d.ts +13 -0
- package/dist/cli/interruptible-sleep.d.ts.map +1 -0
- package/dist/cli/interruptible-sleep.js +31 -0
- package/dist/cli/interruptible-sleep.js.map +1 -0
- package/dist/cli/run.d.ts +54 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +316 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/tick-runner.d.ts +151 -0
- package/dist/cli/tick-runner.d.ts.map +1 -0
- package/dist/cli/tick-runner.js +258 -0
- package/dist/cli/tick-runner.js.map +1 -0
- package/dist/cli-adapter.d.ts +29 -0
- package/dist/cli-adapter.d.ts.map +1 -0
- package/dist/cli-adapter.js +92 -0
- package/dist/cli-adapter.js.map +1 -0
- package/dist/cli-executable.d.ts +3 -0
- package/dist/cli-executable.d.ts.map +1 -0
- package/dist/cli-executable.js +10 -0
- package/dist/cli-executable.js.map +1 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +348 -0
- package/dist/cli.js.map +1 -0
- package/dist/compile.d.ts +42 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +515 -0
- package/dist/compile.js.map +1 -0
- package/dist/demo-hn-monitor.d.ts +2 -0
- package/dist/demo-hn-monitor.d.ts.map +1 -0
- package/dist/demo-hn-monitor.js +118 -0
- package/dist/demo-hn-monitor.js.map +1 -0
- package/dist/dir-watcher-poller.d.ts +73 -0
- package/dist/dir-watcher-poller.d.ts.map +1 -0
- package/dist/dir-watcher-poller.js +80 -0
- package/dist/dir-watcher-poller.js.map +1 -0
- package/dist/direct-input.d.ts +10 -0
- package/dist/direct-input.d.ts.map +1 -0
- package/dist/direct-input.js +61 -0
- package/dist/direct-input.js.map +1 -0
- package/dist/failure-kinds.d.ts +25 -0
- package/dist/failure-kinds.d.ts.map +1 -0
- package/dist/failure-kinds.js +64 -0
- package/dist/failure-kinds.js.map +1 -0
- package/dist/gate-contract.d.ts +24 -0
- package/dist/gate-contract.d.ts.map +1 -0
- package/dist/gate-contract.js +50 -0
- package/dist/gate-contract.js.map +1 -0
- package/dist/hn-poller.d.ts +50 -0
- package/dist/hn-poller.d.ts.map +1 -0
- package/dist/hn-poller.js +79 -0
- package/dist/hn-poller.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/journal-client.d.ts +122 -0
- package/dist/journal-client.d.ts.map +1 -0
- package/dist/journal-client.js +277 -0
- package/dist/journal-client.js.map +1 -0
- package/dist/json-schema-bound.d.ts +7 -0
- package/dist/json-schema-bound.d.ts.map +1 -0
- package/dist/json-schema-bound.js +353 -0
- package/dist/json-schema-bound.js.map +1 -0
- package/dist/json-schema.d.ts +5 -0
- package/dist/json-schema.d.ts.map +1 -0
- package/dist/json-schema.js +72 -0
- package/dist/json-schema.js.map +1 -0
- package/dist/json-value.d.ts +6 -0
- package/dist/json-value.d.ts.map +1 -0
- package/dist/json-value.js +94 -0
- package/dist/json-value.js.map +1 -0
- package/dist/model-name.d.ts +7 -0
- package/dist/model-name.d.ts.map +1 -0
- package/dist/model-name.js +21 -0
- package/dist/model-name.js.map +1 -0
- package/dist/output-schema.d.ts +8 -0
- package/dist/output-schema.d.ts.map +1 -0
- package/dist/output-schema.js +28 -0
- package/dist/output-schema.js.map +1 -0
- package/dist/preflight.d.ts +80 -0
- package/dist/preflight.d.ts.map +1 -0
- package/dist/preflight.js +361 -0
- package/dist/preflight.js.map +1 -0
- package/dist/protocol.d.ts +359 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +15 -0
- package/dist/protocol.js.map +1 -0
- package/dist/spec.d.ts +294 -0
- package/dist/spec.d.ts.map +1 -0
- package/dist/spec.js +13 -0
- package/dist/spec.js.map +1 -0
- package/dist/step-dependencies.d.ts +2 -0
- package/dist/step-dependencies.d.ts.map +1 -0
- package/dist/step-dependencies.js +88 -0
- package/dist/step-dependencies.js.map +1 -0
- package/dist/step-fields.d.ts +17 -0
- package/dist/step-fields.d.ts.map +1 -0
- package/dist/step-fields.js +32 -0
- package/dist/step-fields.js.map +1 -0
- package/dist/tick-source.d.ts +205 -0
- package/dist/tick-source.d.ts.map +1 -0
- package/dist/tick-source.js +234 -0
- package/dist/tick-source.js.map +1 -0
- package/dist/unknown-keys.d.ts +7 -0
- package/dist/unknown-keys.d.ts.map +1 -0
- package/dist/unknown-keys.js +47 -0
- package/dist/unknown-keys.js.map +1 -0
- package/dist/validate.d.ts +7 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +458 -0
- package/dist/validate.js.map +1 -0
- package/dist/work-package-consumer.d.ts +33 -0
- package/dist/work-package-consumer.d.ts.map +1 -0
- package/dist/work-package-consumer.js +44 -0
- package/dist/work-package-consumer.js.map +1 -0
- package/dist/work-package-validator.d.ts +15 -0
- package/dist/work-package-validator.d.ts.map +1 -0
- package/dist/work-package-validator.js +72 -0
- package/dist/work-package-validator.js.map +1 -0
- package/dist/worker-cli.d.ts +16 -0
- package/dist/worker-cli.d.ts.map +1 -0
- package/dist/worker-cli.js +77 -0
- package/dist/worker-cli.js.map +1 -0
- package/dist/worker.d.ts +57 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +129 -0
- package/dist/worker.js.map +1 -0
- package/dist/wrapper-runtime.d.ts +10 -0
- package/dist/wrapper-runtime.d.ts.map +1 -0
- package/dist/wrapper-runtime.js +83 -0
- package/dist/wrapper-runtime.js.map +1 -0
- package/dist/wrapper-session.d.ts +16 -0
- package/dist/wrapper-session.d.ts.map +1 -0
- package/dist/wrapper-session.js +244 -0
- package/dist/wrapper-session.js.map +1 -0
- package/package.json +50 -0
- package/src/authored-flow-error.ts +31 -0
- package/src/authored-flow-executor.ts +365 -0
- package/src/authored-flow-lifecycle.ts +344 -0
- package/src/authored-flow-loader.ts +44 -0
- package/src/authored-flow-operation.ts +252 -0
- package/src/authored-flow.ts +21 -0
- package/src/authored-promise-graph.ts +196 -0
- package/src/backlog-picker.ts +153 -0
- package/src/canonical.ts +57 -0
- package/src/cli/check.ts +391 -0
- package/src/cli/direct-run.ts +86 -0
- package/src/cli/hn-monitor.ts +286 -0
- package/src/cli/interruptible-sleep.ts +27 -0
- package/src/cli/run.ts +439 -0
- package/src/cli/tick-runner.ts +378 -0
- package/src/cli-adapter.ts +115 -0
- package/src/cli-executable.ts +12 -0
- package/src/cli.ts +364 -0
- package/src/compile.ts +573 -0
- package/src/demo-hn-monitor.ts +132 -0
- package/src/dir-watcher-poller.ts +122 -0
- package/src/direct-input.ts +69 -0
- package/src/failure-kinds.ts +77 -0
- package/src/gate-contract.ts +72 -0
- package/src/hn-poller.ts +104 -0
- package/src/index.ts +195 -0
- package/src/journal-client.ts +379 -0
- package/src/json-schema-bound.ts +357 -0
- package/src/json-schema.ts +65 -0
- package/src/json-value.ts +110 -0
- package/src/model-name.ts +20 -0
- package/src/output-schema.ts +33 -0
- package/src/preflight.ts +482 -0
- package/src/protocol.ts +364 -0
- package/src/spec.ts +343 -0
- package/src/step-dependencies.ts +100 -0
- package/src/step-fields.ts +36 -0
- package/src/tick-source.ts +334 -0
- package/src/unknown-keys.ts +52 -0
- package/src/validate.ts +503 -0
- package/src/work-package-consumer.ts +73 -0
- package/src/work-package-validator.ts +90 -0
- package/src/worker-cli.ts +110 -0
- package/src/worker.ts +150 -0
- package/src/wrapper-runtime.ts +93 -0
- package/src/wrapper-session.ts +287 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type FlowHandle } from './authored-flow.js';
|
|
2
|
+
export declare class AuthoredFlowLoadError extends Error {
|
|
3
|
+
constructor(message: string);
|
|
4
|
+
}
|
|
5
|
+
/** Import and validate a direct-run module without executing its authored body. */
|
|
6
|
+
export declare function loadAuthoredFlow(path: string): Promise<FlowHandle>;
|
|
7
|
+
//# sourceMappingURL=authored-flow-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-flow-loader.d.ts","sourceRoot":"","sources":["../src/authored-flow-loader.ts"],"names":[],"mappings":"AAGA,OAAO,EAA6B,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhF,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED,mFAAmF;AACnF,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA0BxE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { accessSync, constants } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { pathToFileURL } from 'node:url';
|
|
4
|
+
import { getAuthoredFlowDefinition } from './authored-flow.js';
|
|
5
|
+
export class AuthoredFlowLoadError extends Error {
|
|
6
|
+
constructor(message) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = 'AuthoredFlowLoadError';
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/** Import and validate a direct-run module without executing its authored body. */
|
|
12
|
+
export async function loadAuthoredFlow(path) {
|
|
13
|
+
const absolutePath = resolve(path);
|
|
14
|
+
try {
|
|
15
|
+
accessSync(absolutePath, constants.R_OK);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
throw new AuthoredFlowLoadError(`Flow "${path}" is not readable.`);
|
|
19
|
+
}
|
|
20
|
+
let authoredModule;
|
|
21
|
+
try {
|
|
22
|
+
authoredModule = await import(pathToFileURL(absolutePath).href);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
throw new AuthoredFlowLoadError(`Flow "${path}" could not be imported: ${errorMessage(error)}`);
|
|
26
|
+
}
|
|
27
|
+
const handle = authoredModule['default'];
|
|
28
|
+
try {
|
|
29
|
+
getAuthoredFlowDefinition(handle);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
throw new AuthoredFlowLoadError(`Flow "${path}" must default-export flow(...): ${errorMessage(error)}`);
|
|
33
|
+
}
|
|
34
|
+
return handle;
|
|
35
|
+
}
|
|
36
|
+
function errorMessage(error) {
|
|
37
|
+
return error instanceof Error ? error.message : 'unknown authored-flow error';
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=authored-flow-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-flow-loader.js","sourceRoot":"","sources":["../src/authored-flow-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,yBAAyB,EAAmB,MAAM,oBAAoB,CAAC;AAEhF,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY;IACjD,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC;QACH,UAAU,CAAC,YAAY,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,qBAAqB,CAAC,SAAS,IAAI,oBAAoB,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,cAAuC,CAAC;IAC5C,IAAI,CAAC;QACH,cAAc,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,IAAI,CAA4B,CAAC;IAC7F,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,qBAAqB,CAC7B,SAAS,IAAI,4BAA4B,YAAY,CAAC,KAAK,CAAC,EAAE,CAC/D,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAe,CAAC;IACvD,IAAI,CAAC;QACH,yBAAyB,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,qBAAqB,CAC7B,SAAS,IAAI,oCAAoC,YAAY,CAAC,KAAK,CAAC,EAAE,CACvE,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC;AAChF,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Step } from '@relayflows/surface';
|
|
2
|
+
import { AuthoredFlowLifecycle, type AuthoredOperationInvocation } from './authored-flow-lifecycle.js';
|
|
3
|
+
type OperationState = 'created' | 'running' | 'fulfilled' | 'rejected';
|
|
4
|
+
/** A root authored operation whose outcome cannot be hidden by promise handlers. */
|
|
5
|
+
export declare class AuthoredFlowOperation<T> {
|
|
6
|
+
readonly id: string;
|
|
7
|
+
readonly verb: string;
|
|
8
|
+
private readonly assertCanStart;
|
|
9
|
+
private readonly start;
|
|
10
|
+
private readonly scope;
|
|
11
|
+
readonly step: Step<T>;
|
|
12
|
+
private state;
|
|
13
|
+
private thenInvoked;
|
|
14
|
+
private rootFailureRecorded;
|
|
15
|
+
private rootFailure;
|
|
16
|
+
private callbackFailureRecorded;
|
|
17
|
+
private callbackFailure;
|
|
18
|
+
private readonly promise;
|
|
19
|
+
private readonly resolve;
|
|
20
|
+
private readonly reject;
|
|
21
|
+
constructor(id: string, verb: string, assertCanStart: () => void, start: () => Promise<T>, scope: AuthoredFlowLifecycle);
|
|
22
|
+
get lifecycle(): OperationState;
|
|
23
|
+
get wasManuallyChained(): boolean;
|
|
24
|
+
get wasAwaited(): boolean;
|
|
25
|
+
get failure(): {
|
|
26
|
+
readonly recorded: boolean;
|
|
27
|
+
readonly value: unknown;
|
|
28
|
+
};
|
|
29
|
+
get derivedFailure(): {
|
|
30
|
+
readonly recorded: boolean;
|
|
31
|
+
readonly value: unknown;
|
|
32
|
+
};
|
|
33
|
+
cancel(error: unknown): void;
|
|
34
|
+
waitForSettlement(): Promise<void>;
|
|
35
|
+
invokeResolver<TResult>(invocation: AuthoredOperationInvocation, callback: () => TResult): TResult;
|
|
36
|
+
private begin;
|
|
37
|
+
private recordRootFailure;
|
|
38
|
+
private recordCallbackFailure;
|
|
39
|
+
}
|
|
40
|
+
export declare function verifyAuthoredOperations(flowName: string, operations: readonly AuthoredFlowOperation<unknown>[], lifecycle: AuthoredFlowLifecycle): Promise<void>;
|
|
41
|
+
export declare function stopAuthoredOperations(operations: readonly AuthoredFlowOperation<unknown>[], reason: unknown): Promise<void>;
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=authored-flow-operation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-flow-operation.d.ts","sourceRoot":"","sources":["../src/authored-flow-operation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EACL,qBAAqB,EACrB,KAAK,2BAA2B,EACjC,MAAM,8BAA8B,CAAC;AAEtC,KAAK,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC;AAGvE,oFAAoF;AACpF,qBAAa,qBAAqB,CAAC,CAAC;IAahC,QAAQ,CAAC,EAAE,EAAE,MAAM;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAhBxB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,uBAAuB,CAAS;IACxC,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;IAC9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;gBAGzC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACJ,cAAc,EAAE,MAAM,IAAI,EAC1B,KAAK,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACvB,KAAK,EAAE,qBAAqB;IAyC/C,IAAI,SAAS,IAAI,cAAc,CAE9B;IAED,IAAI,kBAAkB,IAAI,OAAO,CAEhC;IAED,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,IAAI,OAAO,IAAI;QAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAErE;IAED,IAAI,cAAc,IAAI;QAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAE5E;IAED,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAOtB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxC,cAAc,CAAC,OAAO,EACpB,UAAU,EAAE,2BAA2B,EACvC,QAAQ,EAAE,MAAM,OAAO,GACtB,OAAO;YAII,KAAK;IAenB,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,qBAAqB;CAK9B;AAED,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,SAAS,qBAAqB,CAAC,OAAO,CAAC,EAAE,EACrD,SAAS,EAAE,qBAAqB,GAC/B,OAAO,CAAC,IAAI,CAAC,CA6Cf;AAED,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,SAAS,qBAAqB,CAAC,OAAO,CAAC,EAAE,EACrD,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,IAAI,CAAC,CAGf"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { executionAsyncId } from 'node:async_hooks';
|
|
2
|
+
import { AuthoredFlowExecutionError } from './authored-flow-error.js';
|
|
3
|
+
const nativePromiseThen = Promise.prototype.then;
|
|
4
|
+
/** A root authored operation whose outcome cannot be hidden by promise handlers. */
|
|
5
|
+
export class AuthoredFlowOperation {
|
|
6
|
+
id;
|
|
7
|
+
verb;
|
|
8
|
+
assertCanStart;
|
|
9
|
+
start;
|
|
10
|
+
scope;
|
|
11
|
+
step;
|
|
12
|
+
state = 'created';
|
|
13
|
+
thenInvoked = false;
|
|
14
|
+
rootFailureRecorded = false;
|
|
15
|
+
rootFailure;
|
|
16
|
+
callbackFailureRecorded = false;
|
|
17
|
+
callbackFailure;
|
|
18
|
+
promise;
|
|
19
|
+
resolve;
|
|
20
|
+
reject;
|
|
21
|
+
constructor(id, verb, assertCanStart, start, scope) {
|
|
22
|
+
this.id = id;
|
|
23
|
+
this.verb = verb;
|
|
24
|
+
this.assertCanStart = assertCanStart;
|
|
25
|
+
this.start = start;
|
|
26
|
+
this.scope = scope;
|
|
27
|
+
let resolve;
|
|
28
|
+
let reject;
|
|
29
|
+
this.promise = new Promise((promiseResolve, promiseReject) => {
|
|
30
|
+
resolve = promiseResolve;
|
|
31
|
+
reject = promiseReject;
|
|
32
|
+
});
|
|
33
|
+
this.resolve = resolve;
|
|
34
|
+
this.reject = reject;
|
|
35
|
+
observeRejection(this.promise, (error) => this.recordRootFailure(error));
|
|
36
|
+
const operation = this;
|
|
37
|
+
this.step = Object.freeze({
|
|
38
|
+
gate() {
|
|
39
|
+
throw new AuthoredFlowExecutionError('unsupported_gate', 'postfix gates are not lowered by the initial authored executor');
|
|
40
|
+
},
|
|
41
|
+
then(onfulfilled, onrejected) {
|
|
42
|
+
operation.thenInvoked = true;
|
|
43
|
+
const invocation = operation.scope.registerInvocation(operation, executionAsyncId());
|
|
44
|
+
void operation.begin();
|
|
45
|
+
const derived = nativeThen(operation.promise, wrapResolver(operation, invocation, onfulfilled), wrapResolver(operation, invocation, onrejected));
|
|
46
|
+
return trackDerivedPromise(derived, (error) => operation.recordCallbackFailure(error));
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
this.scope.registerStep(this.step, this);
|
|
50
|
+
}
|
|
51
|
+
get lifecycle() {
|
|
52
|
+
return this.state;
|
|
53
|
+
}
|
|
54
|
+
get wasManuallyChained() {
|
|
55
|
+
return this.thenInvoked && !this.scope.hasBoundConsumer(this);
|
|
56
|
+
}
|
|
57
|
+
get wasAwaited() {
|
|
58
|
+
return this.scope.hasBoundConsumer(this);
|
|
59
|
+
}
|
|
60
|
+
get failure() {
|
|
61
|
+
return { recorded: this.rootFailureRecorded, value: this.rootFailure };
|
|
62
|
+
}
|
|
63
|
+
get derivedFailure() {
|
|
64
|
+
return { recorded: this.callbackFailureRecorded, value: this.callbackFailure };
|
|
65
|
+
}
|
|
66
|
+
cancel(error) {
|
|
67
|
+
if (this.state !== 'created')
|
|
68
|
+
return;
|
|
69
|
+
this.state = 'rejected';
|
|
70
|
+
this.recordRootFailure(error);
|
|
71
|
+
this.reject(error);
|
|
72
|
+
}
|
|
73
|
+
async waitForSettlement() {
|
|
74
|
+
await nativeThen(this.promise, () => undefined, () => undefined);
|
|
75
|
+
}
|
|
76
|
+
invokeResolver(invocation, callback) {
|
|
77
|
+
return this.scope.invokeResolver(invocation, callback);
|
|
78
|
+
}
|
|
79
|
+
async begin() {
|
|
80
|
+
if (this.state !== 'created')
|
|
81
|
+
return;
|
|
82
|
+
try {
|
|
83
|
+
this.assertCanStart();
|
|
84
|
+
this.state = 'running';
|
|
85
|
+
const value = await this.start();
|
|
86
|
+
this.state = 'fulfilled';
|
|
87
|
+
this.resolve(value);
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
this.state = 'rejected';
|
|
91
|
+
this.recordRootFailure(error);
|
|
92
|
+
this.reject(error);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
recordRootFailure(error) {
|
|
96
|
+
if (this.rootFailureRecorded)
|
|
97
|
+
return;
|
|
98
|
+
this.rootFailureRecorded = true;
|
|
99
|
+
this.rootFailure = error;
|
|
100
|
+
}
|
|
101
|
+
recordCallbackFailure(error) {
|
|
102
|
+
if (this.callbackFailureRecorded)
|
|
103
|
+
return;
|
|
104
|
+
this.callbackFailureRecorded = true;
|
|
105
|
+
this.callbackFailure = error;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
export async function verifyAuthoredOperations(flowName, operations, lifecycle) {
|
|
109
|
+
const canceled = new Set(operations.filter((operation) => operation.lifecycle === 'created'));
|
|
110
|
+
if (canceled.size > 0) {
|
|
111
|
+
const error = unawaitedError(flowName, [...canceled]);
|
|
112
|
+
for (const operation of operations)
|
|
113
|
+
operation.cancel(error);
|
|
114
|
+
}
|
|
115
|
+
// Read the in-flight set before the gate awaits anything: "was derived work
|
|
116
|
+
// still running when the body returned" is the question, and every await here
|
|
117
|
+
// would move the answer.
|
|
118
|
+
const inFlight = lifecycle.derivedWorkInFlight(operations);
|
|
119
|
+
await Promise.all(operations.map((operation) => operation.waitForSettlement()));
|
|
120
|
+
await lifecycle.observeCallbackFailures(operations);
|
|
121
|
+
const unawaited = operations.filter((operation) => !lifecycle.isHandled(operation)
|
|
122
|
+
|| operation.lifecycle === 'created'
|
|
123
|
+
|| operation.lifecycle === 'running');
|
|
124
|
+
const failed = operations.find((operation) => operation.failure.recorded && !canceled.has(operation));
|
|
125
|
+
if (failed !== undefined) {
|
|
126
|
+
throw failed.failure.value;
|
|
127
|
+
}
|
|
128
|
+
const callbackFailed = operations.find((operation) => operation.derivedFailure.recorded || lifecycle.callbackFailure(operation).recorded);
|
|
129
|
+
if (callbackFailed !== undefined) {
|
|
130
|
+
const failure = callbackFailed.derivedFailure.recorded
|
|
131
|
+
? callbackFailed.derivedFailure.value
|
|
132
|
+
: lifecycle.callbackFailure(callbackFailed).value;
|
|
133
|
+
throw new AuthoredFlowExecutionError('operation_callback_failed', `flow "${flowName}" derived handler for ${formatOperation(callbackFailed)} rejected: ${describeError(failure)}`);
|
|
134
|
+
}
|
|
135
|
+
if (unawaited.length > 0) {
|
|
136
|
+
throw unawaitedError(flowName, unawaited);
|
|
137
|
+
}
|
|
138
|
+
if (inFlight.length > 0) {
|
|
139
|
+
throw new AuthoredFlowExecutionError('unsettled_derived_work', `flow "${flowName}" completed while work derived from ${inFlight.map(formatOperation).join(', ')} was still in flight`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
export async function stopAuthoredOperations(operations, reason) {
|
|
143
|
+
for (const operation of operations)
|
|
144
|
+
operation.cancel(reason);
|
|
145
|
+
await Promise.all(operations.map((operation) => operation.waitForSettlement()));
|
|
146
|
+
}
|
|
147
|
+
function unawaitedError(flowName, operations) {
|
|
148
|
+
return new AuthoredFlowExecutionError('unawaited_step', `flow "${flowName}" returned with unawaited steps: ${operations.map(formatOperation).join(', ')}`);
|
|
149
|
+
}
|
|
150
|
+
function formatOperation(operation) {
|
|
151
|
+
return `${operation.id} (f.${operation.verb})`;
|
|
152
|
+
}
|
|
153
|
+
function describeError(error) {
|
|
154
|
+
return error instanceof Error ? error.message : String(error);
|
|
155
|
+
}
|
|
156
|
+
function observeRejection(promise, record) {
|
|
157
|
+
void nativeThen(promise, undefined, (error) => record(error));
|
|
158
|
+
}
|
|
159
|
+
function nativeThen(promise, onfulfilled, onrejected) {
|
|
160
|
+
return nativePromiseThen.call(promise, onfulfilled, onrejected);
|
|
161
|
+
}
|
|
162
|
+
function wrapResolver(operation, invocation, callback) {
|
|
163
|
+
if (callback === undefined || callback === null)
|
|
164
|
+
return undefined;
|
|
165
|
+
return (value) => operation.invokeResolver(invocation, () => callback(value));
|
|
166
|
+
}
|
|
167
|
+
function trackDerivedPromise(promise, record) {
|
|
168
|
+
observeRejection(promise, record);
|
|
169
|
+
Object.defineProperty(promise, 'then', {
|
|
170
|
+
value(onfulfilled, onrejected) {
|
|
171
|
+
return trackDerivedPromise(nativeThen(promise, onfulfilled, onrejected), record);
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
return promise;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=authored-flow-operation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-flow-operation.js","sourceRoot":"","sources":["../src/authored-flow-operation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type AuthoredFlowDefinition, type FlowHandle } from '@relayflows/surface/runtime';
|
|
2
|
+
/**
|
|
3
|
+
* Recover the immutable program retained by an authored flow handle.
|
|
4
|
+
*
|
|
5
|
+
* Importing the module evaluates author code only far enough to define the
|
|
6
|
+
* flow. The SDK does not yet expose a public executor because authored-body
|
|
7
|
+
* progress has no durable root journal. Internal lowering tests recover the
|
|
8
|
+
* definition here without making that seam a supported runner.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getAuthoredFlowDefinition<Input = unknown>(handle: FlowHandle): AuthoredFlowDefinition<Input>;
|
|
11
|
+
export type { AuthoredFlowDefinition, FlowHandle };
|
|
12
|
+
//# sourceMappingURL=authored-flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-flow.d.ts","sourceRoot":"","sources":["../src/authored-flow.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,UAAU,EAChB,MAAM,6BAA6B,CAAC;AAErC;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,GAAG,OAAO,EACvD,MAAM,EAAE,UAAU,GACjB,sBAAsB,CAAC,KAAK,CAAC,CAE/B;AAED,YAAY,EAAE,sBAAsB,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { getFlowDefinition, } from '@relayflows/surface/runtime';
|
|
2
|
+
/**
|
|
3
|
+
* Recover the immutable program retained by an authored flow handle.
|
|
4
|
+
*
|
|
5
|
+
* Importing the module evaluates author code only far enough to define the
|
|
6
|
+
* flow. The SDK does not yet expose a public executor because authored-body
|
|
7
|
+
* progress has no durable root journal. Internal lowering tests recover the
|
|
8
|
+
* definition here without making that seam a supported runner.
|
|
9
|
+
*/
|
|
10
|
+
export function getAuthoredFlowDefinition(handle) {
|
|
11
|
+
return getFlowDefinition(handle);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=authored-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-flow.js","sourceRoot":"","sources":["../src/authored-flow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,GAGlB,MAAM,6BAA6B,CAAC;AAErC;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAAkB;IAElB,OAAO,iBAAiB,CAAQ,MAAM,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The promise graph an authored flow body actually creates.
|
|
3
|
+
*
|
|
4
|
+
* Three properties matter and each one is a repair of a measured defect:
|
|
5
|
+
*
|
|
6
|
+
* 1. **Scoped.** Only promises created while the owning lifecycle is the active
|
|
7
|
+
* `AsyncLocalStorage` store are recorded. A previous revision recorded every
|
|
8
|
+
* promise created anywhere in the process for the life of the flow; a probe
|
|
9
|
+
* measured 20 002 unrelated promises retained.
|
|
10
|
+
* 2. **Eagerly attributed.** A promise is attributed to a root the moment it is
|
|
11
|
+
* created, or the moment its parent becomes attributed — never by walking the
|
|
12
|
+
* graph per candidate at completion time. The walk made the completion gate
|
|
13
|
+
* quadratic: a 27 ms body with 30 000 ordinary awaits spent 95.8 s in the gate.
|
|
14
|
+
* 3. **Complete, not sampled.** `pending` is the set of tracked promises that have
|
|
15
|
+
* not settled. Derived work in flight is a fact the gate can read, so the gate
|
|
16
|
+
* never has to guess whether a failure "has landed yet".
|
|
17
|
+
*
|
|
18
|
+
* Attribution flows forward along the same `trigger` edge the previous revision
|
|
19
|
+
* walked backward, so it admits exactly the same set — it just knows the answer
|
|
20
|
+
* before it is asked. Children created before their parent becomes a root are
|
|
21
|
+
* parked in `unattributedChildren` and flooded when the root is registered; a
|
|
22
|
+
* promise cannot settle before its ancestors, and a root is always registered
|
|
23
|
+
* before it settles, so no parked child is ever missed.
|
|
24
|
+
*/
|
|
25
|
+
export declare class AuthoredPromiseGraph {
|
|
26
|
+
private readonly inScope;
|
|
27
|
+
private readonly onPromiseResolve;
|
|
28
|
+
private readonly hook;
|
|
29
|
+
private readonly triggers;
|
|
30
|
+
private readonly creationContexts;
|
|
31
|
+
private readonly resolutionCauses;
|
|
32
|
+
private readonly promiseIds;
|
|
33
|
+
private readonly handles;
|
|
34
|
+
private readonly unattributedChildren;
|
|
35
|
+
private readonly attributedRoots;
|
|
36
|
+
private readonly roots;
|
|
37
|
+
private readonly pending;
|
|
38
|
+
private dependencyCache;
|
|
39
|
+
constructor(inScope: () => boolean, onPromiseResolve: (asyncId: number) => void);
|
|
40
|
+
enable(): void;
|
|
41
|
+
disable(): void;
|
|
42
|
+
idOf(value: object): number | undefined;
|
|
43
|
+
/** Mark a promise whose descendants belong to an authored operation. */
|
|
44
|
+
registerRoot(asyncId: number): void;
|
|
45
|
+
/** Promises derived from `roots` that have not settled. */
|
|
46
|
+
inFlightFrom(roots: ReadonlySet<number>): number[];
|
|
47
|
+
/** Settled promises derived from `roots`, with their handles. */
|
|
48
|
+
settledFrom(roots: ReadonlySet<number>): Promise<unknown>[];
|
|
49
|
+
dependsOn(descendant: number, ancestor: number): boolean;
|
|
50
|
+
clear(): void;
|
|
51
|
+
private attribute;
|
|
52
|
+
private park;
|
|
53
|
+
/**
|
|
54
|
+
* Everything the promise identified by `start` could have waited for.
|
|
55
|
+
*
|
|
56
|
+
* Three edges, and the third is the repair. `trigger` and `resolutionCause`
|
|
57
|
+
* alone do not connect an async function's resumption context to the context
|
|
58
|
+
* it was suspended from, so a walk from `done()` reached only the *last*
|
|
59
|
+
* await's lineage: `const steps = [f.run(a), f.run(b)]; for (const s of steps)
|
|
60
|
+
* await s;` reported run-1 unawaited even though every step was awaited. The
|
|
61
|
+
* init-time `executionAsyncId()` — the context a promise was created in — is
|
|
62
|
+
* that missing edge, and it is a fact the runtime reports, not a widened
|
|
63
|
+
* approximation.
|
|
64
|
+
*/
|
|
65
|
+
private dependenciesOf;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=authored-promise-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-promise-graph.d.ts","sourceRoot":"","sources":["../src/authored-promise-graph.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,oBAAoB;IAc7B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAdnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IACtD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;IAC9D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;IAC9D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiC;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAC/D,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA+B;IACpE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA6B;IAC7D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,eAAe,CAA8E;gBAGlF,OAAO,EAAE,MAAM,OAAO,EACtB,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI;IA4C9D,MAAM,IAAI,IAAI;IAId,OAAO,IAAI,IAAI;IAIf,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIvC,wEAAwE;IACxE,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IASnC,2DAA2D;IAC3D,YAAY,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE;IASlD,iEAAiE;IACjE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE;IAU3D,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIxD,KAAK,IAAI,IAAI;IAYb,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,IAAI;IAMZ;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,cAAc;CAoBvB"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { createHook, executionAsyncId } from 'node:async_hooks';
|
|
2
|
+
/**
|
|
3
|
+
* The promise graph an authored flow body actually creates.
|
|
4
|
+
*
|
|
5
|
+
* Three properties matter and each one is a repair of a measured defect:
|
|
6
|
+
*
|
|
7
|
+
* 1. **Scoped.** Only promises created while the owning lifecycle is the active
|
|
8
|
+
* `AsyncLocalStorage` store are recorded. A previous revision recorded every
|
|
9
|
+
* promise created anywhere in the process for the life of the flow; a probe
|
|
10
|
+
* measured 20 002 unrelated promises retained.
|
|
11
|
+
* 2. **Eagerly attributed.** A promise is attributed to a root the moment it is
|
|
12
|
+
* created, or the moment its parent becomes attributed — never by walking the
|
|
13
|
+
* graph per candidate at completion time. The walk made the completion gate
|
|
14
|
+
* quadratic: a 27 ms body with 30 000 ordinary awaits spent 95.8 s in the gate.
|
|
15
|
+
* 3. **Complete, not sampled.** `pending` is the set of tracked promises that have
|
|
16
|
+
* not settled. Derived work in flight is a fact the gate can read, so the gate
|
|
17
|
+
* never has to guess whether a failure "has landed yet".
|
|
18
|
+
*
|
|
19
|
+
* Attribution flows forward along the same `trigger` edge the previous revision
|
|
20
|
+
* walked backward, so it admits exactly the same set — it just knows the answer
|
|
21
|
+
* before it is asked. Children created before their parent becomes a root are
|
|
22
|
+
* parked in `unattributedChildren` and flooded when the root is registered; a
|
|
23
|
+
* promise cannot settle before its ancestors, and a root is always registered
|
|
24
|
+
* before it settles, so no parked child is ever missed.
|
|
25
|
+
*/
|
|
26
|
+
export class AuthoredPromiseGraph {
|
|
27
|
+
inScope;
|
|
28
|
+
onPromiseResolve;
|
|
29
|
+
hook;
|
|
30
|
+
triggers = new Map();
|
|
31
|
+
creationContexts = new Map();
|
|
32
|
+
resolutionCauses = new Map();
|
|
33
|
+
promiseIds = new WeakMap();
|
|
34
|
+
handles = new Map();
|
|
35
|
+
unattributedChildren = new Map();
|
|
36
|
+
attributedRoots = new Map();
|
|
37
|
+
roots = new Set();
|
|
38
|
+
pending = new Set();
|
|
39
|
+
dependencyCache;
|
|
40
|
+
constructor(inScope, onPromiseResolve) {
|
|
41
|
+
this.inScope = inScope;
|
|
42
|
+
this.onPromiseResolve = onPromiseResolve;
|
|
43
|
+
this.hook = createHook({
|
|
44
|
+
init: (asyncId, type, triggerAsyncId, resource) => {
|
|
45
|
+
if (type !== 'PROMISE' || typeof resource !== 'object' || resource === null)
|
|
46
|
+
return;
|
|
47
|
+
if (!this.inScope())
|
|
48
|
+
return;
|
|
49
|
+
this.triggers.set(asyncId, triggerAsyncId);
|
|
50
|
+
this.creationContexts.set(asyncId, executionAsyncId());
|
|
51
|
+
this.promiseIds.set(resource, asyncId);
|
|
52
|
+
this.handles.set(asyncId, resource);
|
|
53
|
+
this.pending.add(asyncId);
|
|
54
|
+
const root = this.roots.has(triggerAsyncId)
|
|
55
|
+
? triggerAsyncId
|
|
56
|
+
: this.attributedRoots.get(triggerAsyncId);
|
|
57
|
+
if (root !== undefined)
|
|
58
|
+
this.attribute(asyncId, root);
|
|
59
|
+
else if (this.triggers.has(triggerAsyncId))
|
|
60
|
+
this.park(triggerAsyncId, asyncId);
|
|
61
|
+
},
|
|
62
|
+
promiseResolve: (asyncId) => {
|
|
63
|
+
this.onPromiseResolve(asyncId);
|
|
64
|
+
if (!this.triggers.has(asyncId))
|
|
65
|
+
return;
|
|
66
|
+
const cause = executionAsyncId();
|
|
67
|
+
if (cause !== asyncId)
|
|
68
|
+
this.resolutionCauses.set(asyncId, cause);
|
|
69
|
+
this.pending.delete(asyncId);
|
|
70
|
+
if (this.attributedRoots.has(asyncId) || this.roots.has(asyncId))
|
|
71
|
+
return;
|
|
72
|
+
// A combinator's aggregate is resolved from inside the reaction of one of
|
|
73
|
+
// its members, so it is not downstream of any member by `trigger` and can
|
|
74
|
+
// only inherit attribution here, from the context that resolved it. Without
|
|
75
|
+
// this, only `Promise.all` was covered — because it is the one combinator
|
|
76
|
+
// registered explicitly — and `Promise.allSettled`, `Promise.any` and
|
|
77
|
+
// `Promise.race` each carried a deferred derived failure to terminal
|
|
78
|
+
// success. Measured; see ops/probes/pr134-repair-0903/combinators.mjs.
|
|
79
|
+
const adopted = this.attributedRoots.get(cause);
|
|
80
|
+
if (adopted !== undefined) {
|
|
81
|
+
this.attribute(asyncId, adopted);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
// A settled, unattributed promise can never become attributed: attribution
|
|
85
|
+
// only reaches a promise while its root is still pending. Release it.
|
|
86
|
+
this.handles.delete(asyncId);
|
|
87
|
+
this.unattributedChildren.delete(asyncId);
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
enable() {
|
|
92
|
+
this.hook.enable();
|
|
93
|
+
}
|
|
94
|
+
disable() {
|
|
95
|
+
this.hook.disable();
|
|
96
|
+
}
|
|
97
|
+
idOf(value) {
|
|
98
|
+
return this.promiseIds.get(value);
|
|
99
|
+
}
|
|
100
|
+
/** Mark a promise whose descendants belong to an authored operation. */
|
|
101
|
+
registerRoot(asyncId) {
|
|
102
|
+
if (asyncId <= 0 || this.roots.has(asyncId))
|
|
103
|
+
return;
|
|
104
|
+
this.roots.add(asyncId);
|
|
105
|
+
const parked = this.unattributedChildren.get(asyncId);
|
|
106
|
+
if (parked === undefined)
|
|
107
|
+
return;
|
|
108
|
+
this.unattributedChildren.delete(asyncId);
|
|
109
|
+
for (const child of parked)
|
|
110
|
+
this.attribute(child, asyncId);
|
|
111
|
+
}
|
|
112
|
+
/** Promises derived from `roots` that have not settled. */
|
|
113
|
+
inFlightFrom(roots) {
|
|
114
|
+
const found = [];
|
|
115
|
+
for (const asyncId of this.pending) {
|
|
116
|
+
const root = this.attributedRoots.get(asyncId);
|
|
117
|
+
if (root !== undefined && roots.has(root))
|
|
118
|
+
found.push(asyncId);
|
|
119
|
+
}
|
|
120
|
+
return found;
|
|
121
|
+
}
|
|
122
|
+
/** Settled promises derived from `roots`, with their handles. */
|
|
123
|
+
settledFrom(roots) {
|
|
124
|
+
const found = [];
|
|
125
|
+
for (const [asyncId, root] of this.attributedRoots) {
|
|
126
|
+
if (!roots.has(root) || this.pending.has(asyncId))
|
|
127
|
+
continue;
|
|
128
|
+
const handle = this.handles.get(asyncId);
|
|
129
|
+
if (handle !== undefined)
|
|
130
|
+
found.push(handle);
|
|
131
|
+
}
|
|
132
|
+
return found;
|
|
133
|
+
}
|
|
134
|
+
dependsOn(descendant, ancestor) {
|
|
135
|
+
return this.dependenciesOf(descendant).has(ancestor);
|
|
136
|
+
}
|
|
137
|
+
clear() {
|
|
138
|
+
this.triggers.clear();
|
|
139
|
+
this.creationContexts.clear();
|
|
140
|
+
this.resolutionCauses.clear();
|
|
141
|
+
this.handles.clear();
|
|
142
|
+
this.unattributedChildren.clear();
|
|
143
|
+
this.attributedRoots.clear();
|
|
144
|
+
this.roots.clear();
|
|
145
|
+
this.pending.clear();
|
|
146
|
+
this.dependencyCache = undefined;
|
|
147
|
+
}
|
|
148
|
+
attribute(start, root) {
|
|
149
|
+
const stack = [start];
|
|
150
|
+
while (stack.length > 0) {
|
|
151
|
+
const current = stack.pop();
|
|
152
|
+
if (this.attributedRoots.has(current) || this.roots.has(current))
|
|
153
|
+
continue;
|
|
154
|
+
this.attributedRoots.set(current, root);
|
|
155
|
+
const parked = this.unattributedChildren.get(current);
|
|
156
|
+
if (parked === undefined)
|
|
157
|
+
continue;
|
|
158
|
+
this.unattributedChildren.delete(current);
|
|
159
|
+
for (const child of parked)
|
|
160
|
+
stack.push(child);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
park(parent, child) {
|
|
164
|
+
const parked = this.unattributedChildren.get(parent);
|
|
165
|
+
if (parked === undefined)
|
|
166
|
+
this.unattributedChildren.set(parent, [child]);
|
|
167
|
+
else
|
|
168
|
+
parked.push(child);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Everything the promise identified by `start` could have waited for.
|
|
172
|
+
*
|
|
173
|
+
* Three edges, and the third is the repair. `trigger` and `resolutionCause`
|
|
174
|
+
* alone do not connect an async function's resumption context to the context
|
|
175
|
+
* it was suspended from, so a walk from `done()` reached only the *last*
|
|
176
|
+
* await's lineage: `const steps = [f.run(a), f.run(b)]; for (const s of steps)
|
|
177
|
+
* await s;` reported run-1 unawaited even though every step was awaited. The
|
|
178
|
+
* init-time `executionAsyncId()` — the context a promise was created in — is
|
|
179
|
+
* that missing edge, and it is a fact the runtime reports, not a widened
|
|
180
|
+
* approximation.
|
|
181
|
+
*/
|
|
182
|
+
dependenciesOf(start) {
|
|
183
|
+
const cached = this.dependencyCache;
|
|
184
|
+
if (cached !== undefined && cached.start === start)
|
|
185
|
+
return cached.found;
|
|
186
|
+
const found = new Set();
|
|
187
|
+
const stack = [start];
|
|
188
|
+
while (stack.length > 0) {
|
|
189
|
+
const current = stack.pop();
|
|
190
|
+
if (found.has(current))
|
|
191
|
+
continue;
|
|
192
|
+
found.add(current);
|
|
193
|
+
for (const edge of [
|
|
194
|
+
this.triggers.get(current),
|
|
195
|
+
this.resolutionCauses.get(current),
|
|
196
|
+
this.creationContexts.get(current),
|
|
197
|
+
]) {
|
|
198
|
+
if (edge !== undefined && edge !== current)
|
|
199
|
+
stack.push(edge);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
this.dependencyCache = { start, found };
|
|
203
|
+
return found;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=authored-promise-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-promise-graph.js","sourceRoot":"","sources":["../src/authored-promise-graph.ts"],"names":[],"mappings":"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"}
|