@relayflows/sdk 2.0.51 → 2.0.53
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-budget.d.ts +1 -1
- package/dist/authored-budget.d.ts.map +1 -1
- package/dist/authored-budget.js +3 -3
- package/dist/authored-budget.js.map +1 -1
- package/dist/authored-flow-error.d.ts +3 -1
- package/dist/authored-flow-error.d.ts.map +1 -1
- package/dist/authored-flow-error.js.map +1 -1
- package/dist/authored-flow-executor.d.ts +2 -0
- package/dist/authored-flow-executor.d.ts.map +1 -1
- package/dist/authored-flow-executor.js +93 -12
- package/dist/authored-flow-executor.js.map +1 -1
- package/dist/authored-flow-lifecycle.d.ts +28 -3
- package/dist/authored-flow-lifecycle.d.ts.map +1 -1
- package/dist/authored-flow-lifecycle.js +206 -10
- package/dist/authored-flow-lifecycle.js.map +1 -1
- package/dist/authored-node-entry.js +16 -0
- package/dist/authored-node-entry.js.map +1 -1
- package/dist/authored-node-runner.d.ts.map +1 -1
- package/dist/authored-node-runner.js +26 -3
- package/dist/authored-node-runner.js.map +1 -1
- package/dist/authored-parallel-body.d.ts +10 -0
- package/dist/authored-parallel-body.d.ts.map +1 -0
- package/dist/authored-parallel-body.js +68 -0
- package/dist/authored-parallel-body.js.map +1 -0
- package/dist/authored-parallel-eligibility.d.ts +22 -0
- package/dist/authored-parallel-eligibility.d.ts.map +1 -0
- package/dist/authored-parallel-eligibility.js +335 -0
- package/dist/authored-parallel-eligibility.js.map +1 -0
- package/dist/authored-promise-graph.d.ts +16 -0
- package/dist/authored-promise-graph.d.ts.map +1 -1
- package/dist/authored-promise-graph.js +36 -0
- package/dist/authored-promise-graph.js.map +1 -1
- package/dist/authored-root-readback.d.ts +1 -2
- package/dist/authored-root-readback.d.ts.map +1 -1
- package/dist/authored-root-readback.js +1 -1
- package/dist/authored-root-readback.js.map +1 -1
- package/dist/authored-root.d.ts +6 -1
- package/dist/authored-root.d.ts.map +1 -1
- package/dist/authored-root.js +78 -8
- package/dist/authored-root.js.map +1 -1
- package/dist/authored-step-graph.d.ts +19 -4
- package/dist/authored-step-graph.d.ts.map +1 -1
- package/dist/authored-step-graph.js +49 -6
- package/dist/authored-step-graph.js.map +1 -1
- package/dist/authored-step-index.d.ts +2 -1
- package/dist/authored-step-index.d.ts.map +1 -1
- package/dist/authored-step-index.js +2 -1
- package/dist/authored-step-index.js.map +1 -1
- package/dist/authored-verdict.d.ts +4 -0
- package/dist/authored-verdict.d.ts.map +1 -1
- package/dist/authored-verdict.js +7 -1
- package/dist/authored-verdict.js.map +1 -1
- package/dist/authored-worker-step.d.ts +2 -1
- package/dist/authored-worker-step.d.ts.map +1 -1
- package/dist/authored-worker-step.js +12 -5
- package/dist/authored-worker-step.js.map +1 -1
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +4 -2
- package/dist/cli/run.js.map +1 -1
- package/dist/failure-kinds.d.ts +1 -1
- package/dist/failure-kinds.d.ts.map +1 -1
- package/dist/failure-kinds.js +2 -0
- package/dist/failure-kinds.js.map +1 -1
- package/dist/journal-client.d.ts +3 -1
- package/dist/journal-client.d.ts.map +1 -1
- package/dist/journal-client.js +18 -1
- package/dist/journal-client.js.map +1 -1
- package/package.json +3 -2
- package/src/authored-budget.ts +4 -3
- package/src/authored-flow-error.ts +2 -0
- package/src/authored-flow-executor.ts +85 -11
- package/src/authored-flow-lifecycle.ts +215 -9
- package/src/authored-node-entry.ts +17 -0
- package/src/authored-node-runner.ts +24 -3
- package/src/authored-parallel-body.ts +67 -0
- package/src/authored-parallel-eligibility.ts +296 -0
- package/src/authored-promise-graph.ts +35 -0
- package/src/authored-root-readback.ts +1 -2
- package/src/authored-root.ts +80 -9
- package/src/authored-step-graph.ts +50 -5
- package/src/authored-step-index.ts +2 -1
- package/src/authored-verdict.ts +7 -1
- package/src/authored-worker-step.ts +12 -3
- package/src/cli/run.ts +4 -2
- package/src/failure-kinds.ts +2 -0
- package/src/journal-client.ts +19 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execute a certified body with its branch-call promises marked at the call
|
|
3
|
+
* site. A combinator member is not evidence that it is a safe branch: it may
|
|
4
|
+
* be a hand-built join that resolves from whichever child finishes first.
|
|
5
|
+
*
|
|
6
|
+
* The closed grammar has no module captures, so re-evaluating this function
|
|
7
|
+
* preserves its meaning. Unknown source is refused before the first effect.
|
|
8
|
+
*/
|
|
9
|
+
export declare function instrumentParallelBody<T extends Function>(body: T, certifyBranch: (promise: Promise<unknown>) => void): T;
|
|
10
|
+
//# sourceMappingURL=authored-parallel-body.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-parallel-body.d.ts","sourceRoot":"","sources":["../src/authored-parallel-body.ts"],"names":[],"mappings":"AAKA;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,QAAQ,EACvD,IAAI,EAAE,CAAC,EACP,aAAa,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,GACjD,CAAC,CAkDH"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { AuthoredFlowExecutionError } from './authored-flow-error.js';
|
|
3
|
+
import { authoredFunctionSource } from './authored-flow-lifecycle.js';
|
|
4
|
+
import { parallelBodySyntaxEligible, unwrapParallelExpression } from './authored-parallel-eligibility.js';
|
|
5
|
+
/**
|
|
6
|
+
* Execute a certified body with its branch-call promises marked at the call
|
|
7
|
+
* site. A combinator member is not evidence that it is a safe branch: it may
|
|
8
|
+
* be a hand-built join that resolves from whichever child finishes first.
|
|
9
|
+
*
|
|
10
|
+
* The closed grammar has no module captures, so re-evaluating this function
|
|
11
|
+
* preserves its meaning. Unknown source is refused before the first effect.
|
|
12
|
+
*/
|
|
13
|
+
export function instrumentParallelBody(body, certifyBranch) {
|
|
14
|
+
const source = authoredFunctionSource(body);
|
|
15
|
+
if (!parallelBodySyntaxEligible(body)) {
|
|
16
|
+
throw new AuthoredFlowExecutionError('step_failed', 'parallel f.run body lost its source certificate');
|
|
17
|
+
}
|
|
18
|
+
const prefix = 'const body = ';
|
|
19
|
+
const file = ts.createSourceFile('parallel-body.js', `${prefix}${source};`, ts.ScriptTarget.ES2022, true, ts.ScriptKind.JS);
|
|
20
|
+
const declaration = file.statements[0];
|
|
21
|
+
if (!declaration || !ts.isVariableStatement(declaration))
|
|
22
|
+
throw new Error('certified body parse failed');
|
|
23
|
+
const arrow = declaration.declarationList.declarations[0]?.initializer;
|
|
24
|
+
if (!arrow || !ts.isArrowFunction(arrow) || !ts.isBlock(arrow.body))
|
|
25
|
+
throw new Error('certified body changed');
|
|
26
|
+
const branches = new Set();
|
|
27
|
+
for (const statement of arrow.body.statements) {
|
|
28
|
+
if (!ts.isVariableStatement(statement))
|
|
29
|
+
continue;
|
|
30
|
+
for (const item of statement.declarationList.declarations) {
|
|
31
|
+
if (ts.isIdentifier(item.name) && item.initializer && ts.isArrowFunction(item.initializer)) {
|
|
32
|
+
branches.add(item.name.text);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const calls = [];
|
|
37
|
+
const visit = (node) => {
|
|
38
|
+
if (ts.isCallExpression(node) && ts.isPropertyAccessExpression(node.expression)
|
|
39
|
+
&& ts.isIdentifier(node.expression.expression) && node.expression.expression.text === 'Promise'
|
|
40
|
+
&& node.expression.name.text === 'all' && node.arguments.length === 1) {
|
|
41
|
+
const members = node.arguments[0];
|
|
42
|
+
if (members && ts.isArrayLiteralExpression(members)) {
|
|
43
|
+
for (const outer of members.elements) {
|
|
44
|
+
if (!ts.isExpression(outer))
|
|
45
|
+
continue;
|
|
46
|
+
const member = unwrapParallelExpression(outer);
|
|
47
|
+
if (!ts.isCallExpression(member) || member.arguments.length !== 0)
|
|
48
|
+
continue;
|
|
49
|
+
const named = ts.isIdentifier(member.expression) && branches.has(member.expression.text);
|
|
50
|
+
const inline = ts.isParenthesizedExpression(member.expression)
|
|
51
|
+
&& ts.isArrowFunction(member.expression.expression);
|
|
52
|
+
if (named || inline)
|
|
53
|
+
calls.push({ start: outer.getStart(file) - prefix.length,
|
|
54
|
+
end: outer.getEnd() - prefix.length });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
ts.forEachChild(node, visit);
|
|
59
|
+
};
|
|
60
|
+
visit(arrow);
|
|
61
|
+
let instrumented = source;
|
|
62
|
+
for (const { start, end } of calls.sort((left, right) => right.start - left.start)) {
|
|
63
|
+
instrumented = `${instrumented.slice(0, start)}__certifyParallelBranch(${instrumented.slice(start, end)})${instrumented.slice(end)}`;
|
|
64
|
+
}
|
|
65
|
+
const factory = new Function('__certifyParallelBranch', `return (${instrumented});`);
|
|
66
|
+
return factory((promise) => { certifyBranch(promise); return promise; });
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=authored-parallel-body.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-parallel-body.js","sourceRoot":"","sources":["../src/authored-parallel-body.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
/** Keep admission and call-site instrumentation in agreement on parentheses. */
|
|
3
|
+
export declare function unwrapParallelExpression(node: ts.Expression): ts.Expression;
|
|
4
|
+
/** A closed grammar for deterministic Promise.all branches. Unknown bodies stay serial. */
|
|
5
|
+
export declare function parallelRunEligible(body: Function, moduleSource: string): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Match the body Node actually loaded against the same type-stripped source its
|
|
8
|
+
* TypeScript loader serves. First certify the original bytes: transforming
|
|
9
|
+
* away a declaration must never make an unsafe module appear closed.
|
|
10
|
+
*/
|
|
11
|
+
export declare function parallelLoadedBodyEligible(body: Function, moduleSource: string, sourceUrl: string, mode: 'strip' | 'transform'): Promise<boolean>;
|
|
12
|
+
/**
|
|
13
|
+
* The compiled Bun CLI owns the root lease, but the pinned source is executed
|
|
14
|
+
* by its embedded Node child. Bun reformats function toString output, so its
|
|
15
|
+
* in-memory body cannot be compared byte-for-byte with the source. Certify
|
|
16
|
+
* the closed source module instead; the Node child loads those hash-pinned
|
|
17
|
+
* bytes and checks exact body/source identity and grammar before any child starts.
|
|
18
|
+
*/
|
|
19
|
+
export declare function parallelPinnedSourceEligible(moduleSource: string): boolean;
|
|
20
|
+
/** Independently re-check the closed body grammar at execution time. */
|
|
21
|
+
export declare function parallelBodySyntaxEligible(body: Function): boolean;
|
|
22
|
+
//# sourceMappingURL=authored-parallel-eligibility.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-parallel-eligibility.d.ts","sourceRoot":"","sources":["../src/authored-parallel-eligibility.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAK5B,gFAAgF;AAChF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,CAE3E;AAED,2FAA2F;AAC3F,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAMjF;AAED;;;;GAIG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EACvD,IAAI,EAAE,OAAO,GAAG,WAAW,GAC1B,OAAO,CAAC,OAAO,CAAC,CAwBlB;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAG1E;AAED,wEAAwE;AACxE,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAElE"}
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { authoredFunctionSource } from './authored-flow-lifecycle.js';
|
|
3
|
+
const reservedCertifier = '__certifyParallelBranch';
|
|
4
|
+
/** Keep admission and call-site instrumentation in agreement on parentheses. */
|
|
5
|
+
export function unwrapParallelExpression(node) {
|
|
6
|
+
return ts.isParenthesizedExpression(node) ? unwrapParallelExpression(node.expression) : node;
|
|
7
|
+
}
|
|
8
|
+
/** A closed grammar for deterministic Promise.all branches. Unknown bodies stay serial. */
|
|
9
|
+
export function parallelRunEligible(body, moduleSource) {
|
|
10
|
+
// Promise.all is intercepted only when `Promise` resolves to the intrinsic.
|
|
11
|
+
// Function.toString cannot see a module-level lexical binding, so inspect
|
|
12
|
+
// the complete source before using the body's narrower grammar.
|
|
13
|
+
const bodySource = authoredFunctionSource(body);
|
|
14
|
+
return certifiedModuleBody(moduleSource, bodySource) !== undefined && parallelBodySyntaxEligible(body);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Match the body Node actually loaded against the same type-stripped source its
|
|
18
|
+
* TypeScript loader serves. First certify the original bytes: transforming
|
|
19
|
+
* away a declaration must never make an unsafe module appear closed.
|
|
20
|
+
*/
|
|
21
|
+
export async function parallelLoadedBodyEligible(body, moduleSource, sourceUrl, mode) {
|
|
22
|
+
if (!parallelPinnedSourceEligible(moduleSource))
|
|
23
|
+
return false;
|
|
24
|
+
const { stripTypeScriptTypes } = await import('node:module');
|
|
25
|
+
if (typeof stripTypeScriptTypes !== 'function')
|
|
26
|
+
return false;
|
|
27
|
+
// The pinned loader suppresses this one Node warning on its own thread.
|
|
28
|
+
// Recomputing the text here happens on the main thread; suppress only this
|
|
29
|
+
// call's warning and restore the original writer before yielding again.
|
|
30
|
+
const emitWarning = process.emitWarning;
|
|
31
|
+
let transformed;
|
|
32
|
+
try {
|
|
33
|
+
process.emitWarning = ((warning, ...rest) => {
|
|
34
|
+
if (rest[0] === 'ExperimentalWarning' && String(warning).startsWith('stripTypeScriptTypes'))
|
|
35
|
+
return;
|
|
36
|
+
emitWarning.call(process, warning, ...rest);
|
|
37
|
+
});
|
|
38
|
+
transformed = stripTypeScriptTypes(moduleSource, { mode, sourceUrl });
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// A loader mode unavailable in this Node version cannot certify a body.
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
process.emitWarning = emitWarning;
|
|
46
|
+
}
|
|
47
|
+
return parallelRunEligible(body, transformed);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The compiled Bun CLI owns the root lease, but the pinned source is executed
|
|
51
|
+
* by its embedded Node child. Bun reformats function toString output, so its
|
|
52
|
+
* in-memory body cannot be compared byte-for-byte with the source. Certify
|
|
53
|
+
* the closed source module instead; the Node child loads those hash-pinned
|
|
54
|
+
* bytes and checks exact body/source identity and grammar before any child starts.
|
|
55
|
+
*/
|
|
56
|
+
export function parallelPinnedSourceEligible(moduleSource) {
|
|
57
|
+
const bodySource = certifiedModuleBody(moduleSource);
|
|
58
|
+
return bodySource !== undefined && parallelBodySourceSyntaxEligible(bodySource);
|
|
59
|
+
}
|
|
60
|
+
/** Independently re-check the closed body grammar at execution time. */
|
|
61
|
+
export function parallelBodySyntaxEligible(body) {
|
|
62
|
+
return parallelBodySourceSyntaxEligible(authoredFunctionSource(body));
|
|
63
|
+
}
|
|
64
|
+
function parallelBodySourceSyntaxEligible(bodySource) {
|
|
65
|
+
const file = ts.createSourceFile('authored-body.js', `const body = ${bodySource};`, ts.ScriptTarget.ES2022, true, ts.ScriptKind.JS);
|
|
66
|
+
if (file.statements.length !== 1)
|
|
67
|
+
return false;
|
|
68
|
+
const declaration = file.statements[0];
|
|
69
|
+
if (!declaration || !ts.isVariableStatement(declaration))
|
|
70
|
+
return false;
|
|
71
|
+
const expression = declaration.declarationList.declarations[0]?.initializer;
|
|
72
|
+
// Function expressions can obtain the context through `arguments[0]`.
|
|
73
|
+
if (expression === undefined || !ts.isArrowFunction(expression) || !ts.isBlock(expression.body)
|
|
74
|
+
|| expression.modifiers?.some(modifier => modifier.kind === ts.SyntaxKind.AsyncKeyword) !== true)
|
|
75
|
+
return false;
|
|
76
|
+
const parameter = expression.parameters[0]?.name;
|
|
77
|
+
if (parameter === undefined || !ts.isIdentifier(parameter) || expression.parameters.length !== 1)
|
|
78
|
+
return false;
|
|
79
|
+
const context = parameter.text;
|
|
80
|
+
if (['Promise', 'globalThis', 'global'].includes(context))
|
|
81
|
+
return false;
|
|
82
|
+
// The instrumented body is re-evaluated with a private callback parameter.
|
|
83
|
+
// A lexical binding or reference with that spelling could capture it.
|
|
84
|
+
let namesCertifier = false;
|
|
85
|
+
const checkCertifierName = (node) => {
|
|
86
|
+
if (ts.isIdentifier(node) && node.text === reservedCertifier)
|
|
87
|
+
namesCertifier = true;
|
|
88
|
+
ts.forEachChild(node, checkCertifierName);
|
|
89
|
+
};
|
|
90
|
+
checkCertifierName(expression);
|
|
91
|
+
if (namesCertifier)
|
|
92
|
+
return false;
|
|
93
|
+
const branches = new Map();
|
|
94
|
+
const rootValues = new Set();
|
|
95
|
+
let groups = 0;
|
|
96
|
+
let runs = 0;
|
|
97
|
+
const unwrap = unwrapParallelExpression;
|
|
98
|
+
const method = (node, owner, name) => {
|
|
99
|
+
const value = unwrap(node);
|
|
100
|
+
return ts.isCallExpression(value) && ts.isPropertyAccessExpression(value.expression)
|
|
101
|
+
&& ts.isIdentifier(value.expression.expression) && value.expression.expression.text === owner
|
|
102
|
+
&& value.expression.name.text === name;
|
|
103
|
+
};
|
|
104
|
+
const pure = (node, values) => {
|
|
105
|
+
const value = unwrap(node);
|
|
106
|
+
if (ts.isStringLiteral(value) || ts.isNumericLiteral(value) || ts.isNoSubstitutionTemplateLiteral(value)
|
|
107
|
+
|| value.kind === ts.SyntaxKind.TrueKeyword || value.kind === ts.SyntaxKind.FalseKeyword
|
|
108
|
+
|| value.kind === ts.SyntaxKind.NullKeyword)
|
|
109
|
+
return true;
|
|
110
|
+
if (ts.isIdentifier(value))
|
|
111
|
+
return values.has(value.text);
|
|
112
|
+
if (ts.isTemplateExpression(value))
|
|
113
|
+
return value.templateSpans.every(span => pure(span.expression, values));
|
|
114
|
+
if (ts.isPrefixUnaryExpression(value))
|
|
115
|
+
return [ts.SyntaxKind.PlusToken, ts.SyntaxKind.MinusToken,
|
|
116
|
+
ts.SyntaxKind.ExclamationToken].includes(value.operator) && pure(value.operand, values);
|
|
117
|
+
if (ts.isBinaryExpression(value))
|
|
118
|
+
return [ts.SyntaxKind.PlusToken, ts.SyntaxKind.MinusToken,
|
|
119
|
+
ts.SyntaxKind.AsteriskToken, ts.SyntaxKind.SlashToken, ts.SyntaxKind.EqualsEqualsEqualsToken,
|
|
120
|
+
ts.SyntaxKind.ExclamationEqualsEqualsToken, ts.SyntaxKind.LessThanToken,
|
|
121
|
+
ts.SyntaxKind.GreaterThanToken].includes(value.operatorToken.kind)
|
|
122
|
+
&& pure(value.left, values) && pure(value.right, values);
|
|
123
|
+
if (ts.isConditionalExpression(value))
|
|
124
|
+
return pure(value.condition, values)
|
|
125
|
+
&& pure(value.whenTrue, values) && pure(value.whenFalse, values);
|
|
126
|
+
if (ts.isElementAccessExpression(value))
|
|
127
|
+
return value.argumentExpression !== undefined
|
|
128
|
+
&& pure(value.expression, values) && pure(value.argumentExpression, values);
|
|
129
|
+
if (ts.isPropertyAccessExpression(value))
|
|
130
|
+
return pure(value.expression, values);
|
|
131
|
+
if (ts.isArrayLiteralExpression(value))
|
|
132
|
+
return value.elements.every(element => ts.isExpression(element) && pure(element, values));
|
|
133
|
+
if (ts.isObjectLiteralExpression(value))
|
|
134
|
+
return value.properties.every(property => ts.isPropertyAssignment(property) && (ts.isIdentifier(property.name) || ts.isStringLiteral(property.name))
|
|
135
|
+
&& pure(property.initializer, values));
|
|
136
|
+
return false;
|
|
137
|
+
};
|
|
138
|
+
const run = (node, values) => {
|
|
139
|
+
const value = unwrap(node);
|
|
140
|
+
if (!method(value, context, 'run') || value.arguments.length < 1 || value.arguments.length > 2
|
|
141
|
+
|| !value.arguments.every(argument => pure(argument, values)))
|
|
142
|
+
return false;
|
|
143
|
+
runs++;
|
|
144
|
+
return true;
|
|
145
|
+
};
|
|
146
|
+
const group = (node, values, depth) => {
|
|
147
|
+
const value = unwrap(node);
|
|
148
|
+
if (!method(value, 'Promise', 'all') || value.arguments.length !== 1 || depth > 4)
|
|
149
|
+
return false;
|
|
150
|
+
groups++;
|
|
151
|
+
const members = value.arguments[0];
|
|
152
|
+
if (ts.isArrayLiteralExpression(members)) {
|
|
153
|
+
if (members.elements.length < 2)
|
|
154
|
+
return false;
|
|
155
|
+
return members.elements.every(member => {
|
|
156
|
+
if (!ts.isExpression(member))
|
|
157
|
+
return false;
|
|
158
|
+
if (run(member, values))
|
|
159
|
+
return true;
|
|
160
|
+
const call = unwrap(member);
|
|
161
|
+
if (depth === 0 && ts.isCallExpression(call) && ts.isIdentifier(call.expression)
|
|
162
|
+
&& call.arguments.length === 0 && branches.has(call.expression.text)) {
|
|
163
|
+
return branch(branches.get(call.expression.text), depth + 1);
|
|
164
|
+
}
|
|
165
|
+
if (depth === 0 && ts.isCallExpression(call) && call.arguments.length === 0
|
|
166
|
+
&& ts.isParenthesizedExpression(call.expression) && ts.isArrowFunction(call.expression.expression)) {
|
|
167
|
+
return branch(call.expression.expression, depth + 1);
|
|
168
|
+
}
|
|
169
|
+
return false;
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
return false;
|
|
173
|
+
};
|
|
174
|
+
const awaitStep = (node, values, depth) => {
|
|
175
|
+
const value = unwrap(node);
|
|
176
|
+
if (!ts.isAwaitExpression(value))
|
|
177
|
+
return false;
|
|
178
|
+
return run(value.expression, values) || group(value.expression, values, depth);
|
|
179
|
+
};
|
|
180
|
+
const statements = (block, values, depth) => {
|
|
181
|
+
for (const statement of block.statements) {
|
|
182
|
+
if (ts.isExpressionStatement(statement)) {
|
|
183
|
+
if (awaitStep(statement.expression, values, depth))
|
|
184
|
+
continue;
|
|
185
|
+
const value = unwrap(statement.expression);
|
|
186
|
+
if (depth === 0 && method(value, context, 'done') && value.arguments.length >= 1
|
|
187
|
+
&& value.arguments.every(argument => pure(argument, values))
|
|
188
|
+
&& statement === block.statements[block.statements.length - 1])
|
|
189
|
+
continue;
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
if (ts.isReturnStatement(statement) && depth > 0 && statement.expression !== undefined
|
|
193
|
+
&& awaitStep(statement.expression, values, depth))
|
|
194
|
+
continue;
|
|
195
|
+
if (!ts.isVariableStatement(statement) || (statement.declarationList.flags & ts.NodeFlags.Const) === 0)
|
|
196
|
+
return false;
|
|
197
|
+
for (const item of statement.declarationList.declarations) {
|
|
198
|
+
if (!ts.isIdentifier(item.name) || item.initializer === undefined)
|
|
199
|
+
return false;
|
|
200
|
+
if (['Promise', 'globalThis', 'global'].includes(item.name.text))
|
|
201
|
+
return false;
|
|
202
|
+
if (depth === 0 && ts.isArrowFunction(item.initializer)) {
|
|
203
|
+
if (branches.has(item.name.text) || item.initializer.parameters.length !== 0
|
|
204
|
+
|| item.initializer.modifiers?.some(modifier => modifier.kind === ts.SyntaxKind.AsyncKeyword) !== true)
|
|
205
|
+
return false;
|
|
206
|
+
branches.set(item.name.text, item.initializer);
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
if (!awaitStep(item.initializer, values, depth))
|
|
210
|
+
return false;
|
|
211
|
+
values.add(item.name.text);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return true;
|
|
215
|
+
};
|
|
216
|
+
const branch = (arrow, depth) => {
|
|
217
|
+
if (arrow.parameters.length !== 0)
|
|
218
|
+
return false;
|
|
219
|
+
const before = runs;
|
|
220
|
+
const valid = ts.isBlock(arrow.body) ? statements(arrow.body, new Set(rootValues), depth)
|
|
221
|
+
: awaitStep(arrow.body, rootValues, depth);
|
|
222
|
+
// An empty async branch creates a join with no causal step predecessor.
|
|
223
|
+
return valid && runs > before;
|
|
224
|
+
};
|
|
225
|
+
if (!statements(expression.body, rootValues, 0))
|
|
226
|
+
return false;
|
|
227
|
+
return groups > 0 && runs > 0;
|
|
228
|
+
}
|
|
229
|
+
/** Reject any source that can change what a free `Promise` identifier means. */
|
|
230
|
+
function certifiedModuleBody(source, bodySource) {
|
|
231
|
+
const file = ts.createSourceFile('authored-module.ts', source, ts.ScriptTarget.ES2022, true, ts.ScriptKind.TS);
|
|
232
|
+
if ((file.parseDiagnostics?.length ?? 0) > 0) {
|
|
233
|
+
return undefined;
|
|
234
|
+
}
|
|
235
|
+
// Top-level code can alter the constructor or its methods without binding
|
|
236
|
+
// the name. Leave these modules on the established serial scheduler too.
|
|
237
|
+
const touchesPromiseOutsideDefinition = (node) => {
|
|
238
|
+
if (ts.isIdentifier(node) && ['Promise', 'globalThis', 'global'].includes(node.text))
|
|
239
|
+
return true;
|
|
240
|
+
return ts.forEachChild(node, touchesPromiseOutsideDefinition) === true;
|
|
241
|
+
};
|
|
242
|
+
let definesDefaultBody = false;
|
|
243
|
+
let importsSurfaceFlow = false;
|
|
244
|
+
let certifiedBody;
|
|
245
|
+
for (const statement of file.statements) {
|
|
246
|
+
if (ts.isImportDeclaration(statement)) {
|
|
247
|
+
// Imports can execute code before the body starts. Only the direct,
|
|
248
|
+
// immutable Surface binding can certify the exported body's identity.
|
|
249
|
+
if (statement.moduleSpecifier.getText(file) !== "'@relayflows/surface'"
|
|
250
|
+
&& statement.moduleSpecifier.getText(file) !== '"@relayflows/surface"')
|
|
251
|
+
return undefined;
|
|
252
|
+
const bindings = statement.importClause?.namedBindings;
|
|
253
|
+
if (statement.importClause?.name !== undefined || bindings === undefined
|
|
254
|
+
|| !ts.isNamedImports(bindings) || bindings.elements.length !== 1
|
|
255
|
+
|| bindings.elements[0]?.name.text !== 'flow'
|
|
256
|
+
|| bindings.elements[0]?.propertyName !== undefined || importsSurfaceFlow)
|
|
257
|
+
return undefined;
|
|
258
|
+
importsSurfaceFlow = true;
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
if (ts.isExportAssignment(statement)) {
|
|
262
|
+
// Only the final body argument is allowed to mention Promise.all. Do
|
|
263
|
+
// not let an expression around flow() mutate Promise while we skip it.
|
|
264
|
+
const call = statement.expression;
|
|
265
|
+
if (statement.isExportEquals || !ts.isCallExpression(call)
|
|
266
|
+
|| !ts.isIdentifier(call.expression) || call.expression.text !== 'flow')
|
|
267
|
+
return undefined;
|
|
268
|
+
const args = call.arguments;
|
|
269
|
+
if (args.length !== 2 || !ts.isStringLiteral(args[0]))
|
|
270
|
+
return undefined;
|
|
271
|
+
if (!ts.isArrowFunction(args[args.length - 1]))
|
|
272
|
+
return undefined;
|
|
273
|
+
certifiedBody = args[args.length - 1].getText(file);
|
|
274
|
+
if (bodySource !== undefined && certifiedBody !== bodySource)
|
|
275
|
+
return undefined;
|
|
276
|
+
if (args.slice(0, -1).some(touchesPromiseOutsideDefinition))
|
|
277
|
+
return undefined;
|
|
278
|
+
if (definesDefaultBody)
|
|
279
|
+
return undefined;
|
|
280
|
+
definesDefaultBody = true;
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
// The certified body cannot use module captures. Other top-level code is
|
|
284
|
+
// unnecessary for it and may schedule a later mutation through an alias.
|
|
285
|
+
return undefined;
|
|
286
|
+
}
|
|
287
|
+
const forbidden = new Set(['Promise', 'globalThis']);
|
|
288
|
+
const bindsForbidden = (name) => ts.isIdentifier(name)
|
|
289
|
+
? forbidden.has(name.text)
|
|
290
|
+
: name.elements.some(element => ts.isBindingElement(element) && bindsForbidden(element.name));
|
|
291
|
+
const isGlobalPromise = (node) => {
|
|
292
|
+
if (ts.isIdentifier(node))
|
|
293
|
+
return forbidden.has(node.text);
|
|
294
|
+
if (ts.isPropertyAccessExpression(node))
|
|
295
|
+
return ts.isIdentifier(node.expression)
|
|
296
|
+
&& node.expression.text === 'globalThis' && node.name.text === 'Promise';
|
|
297
|
+
return ts.isElementAccessExpression(node) && ts.isIdentifier(node.expression)
|
|
298
|
+
&& node.expression.text === 'globalThis' && ts.isStringLiteral(node.argumentExpression)
|
|
299
|
+
&& node.argumentExpression.text === 'Promise';
|
|
300
|
+
};
|
|
301
|
+
let unsafe = false;
|
|
302
|
+
const visit = (node) => {
|
|
303
|
+
if (unsafe)
|
|
304
|
+
return;
|
|
305
|
+
if ((ts.isVariableDeclaration(node) || ts.isParameter(node) || ts.isBindingElement(node))
|
|
306
|
+
&& bindsForbidden(node.name))
|
|
307
|
+
unsafe = true;
|
|
308
|
+
if ((ts.isFunctionDeclaration(node) || ts.isFunctionExpression(node)
|
|
309
|
+
|| ts.isClassDeclaration(node) || ts.isClassExpression(node)
|
|
310
|
+
|| ts.isEnumDeclaration(node) || ts.isImportEqualsDeclaration(node)
|
|
311
|
+
|| ts.isTypeAliasDeclaration(node) || ts.isInterfaceDeclaration(node))
|
|
312
|
+
&& node.name !== undefined && forbidden.has(node.name.text))
|
|
313
|
+
unsafe = true;
|
|
314
|
+
if (ts.isImportClause(node) && node.name !== undefined && forbidden.has(node.name.text))
|
|
315
|
+
unsafe = true;
|
|
316
|
+
if (ts.isNamespaceImport(node) && forbidden.has(node.name.text))
|
|
317
|
+
unsafe = true;
|
|
318
|
+
if (ts.isImportSpecifier(node) && forbidden.has(node.name.text))
|
|
319
|
+
unsafe = true;
|
|
320
|
+
if (ts.isBinaryExpression(node)
|
|
321
|
+
&& node.operatorToken.kind >= ts.SyntaxKind.FirstAssignment
|
|
322
|
+
&& node.operatorToken.kind <= ts.SyntaxKind.LastAssignment
|
|
323
|
+
&& isGlobalPromise(node.left))
|
|
324
|
+
unsafe = true;
|
|
325
|
+
if ((ts.isPrefixUnaryExpression(node) || ts.isPostfixUnaryExpression(node))
|
|
326
|
+
&& isGlobalPromise(node.operand))
|
|
327
|
+
unsafe = true;
|
|
328
|
+
ts.forEachChild(node, visit);
|
|
329
|
+
};
|
|
330
|
+
visit(file);
|
|
331
|
+
// The body may come from another module, where a free Promise name can be
|
|
332
|
+
// shadowed without appearing in this source. In that case use serial IDs.
|
|
333
|
+
return importsSurfaceFlow && definesDefaultBody && !unsafe ? certifiedBody : undefined;
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=authored-parallel-eligibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-parallel-eligibility.js","sourceRoot":"","sources":["../src/authored-parallel-eligibility.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,12 +29,15 @@ export declare class AuthoredPromiseGraph {
|
|
|
29
29
|
private readonly triggers;
|
|
30
30
|
private readonly creationContexts;
|
|
31
31
|
private readonly resolutionCauses;
|
|
32
|
+
/** Promises attributed only when another promise's reaction resolved them. */
|
|
33
|
+
private readonly adoptedFromResolvingContext;
|
|
32
34
|
private readonly promiseIds;
|
|
33
35
|
private readonly handles;
|
|
34
36
|
private readonly unattributedChildren;
|
|
35
37
|
private readonly attributedRoots;
|
|
36
38
|
private readonly roots;
|
|
37
39
|
private readonly pending;
|
|
40
|
+
private readonly combinatorCaptures;
|
|
38
41
|
private dependencyCache;
|
|
39
42
|
/** Bumped by every graph change, so derived answers can be cached between changes. */
|
|
40
43
|
private changes;
|
|
@@ -42,6 +45,12 @@ export declare class AuthoredPromiseGraph {
|
|
|
42
45
|
enable(): void;
|
|
43
46
|
disable(): void;
|
|
44
47
|
idOf(value: object): number | undefined;
|
|
48
|
+
isPending(asyncId: number): boolean;
|
|
49
|
+
/** The intrinsic creates per-member reaction promises as well as its aggregate. */
|
|
50
|
+
captureCombinator<T>(call: () => T): {
|
|
51
|
+
readonly value: T;
|
|
52
|
+
readonly created: ReadonlySet<number>;
|
|
53
|
+
};
|
|
45
54
|
/** Mark a promise whose descendants belong to an authored operation. */
|
|
46
55
|
registerRoot(asyncId: number): void;
|
|
47
56
|
/** The roots that still have derived promises in flight. One pass over `pending`. */
|
|
@@ -53,6 +62,13 @@ export declare class AuthoredPromiseGraph {
|
|
|
53
62
|
}>;
|
|
54
63
|
/** The three recorded edges out of one promise, for walks that stop early. */
|
|
55
64
|
causesOf(asyncId: number): number[];
|
|
65
|
+
/**
|
|
66
|
+
* A promise created directly in one async context but settled in another
|
|
67
|
+
* can be a join. Its resolution edge names only the settling member, so a
|
|
68
|
+
* frontier may use it only when a combinator registered all members.
|
|
69
|
+
*/
|
|
70
|
+
hasUnobservedJoinShape(asyncId: number): boolean;
|
|
71
|
+
wasAdoptedFromResolvingContext(asyncId: number): boolean;
|
|
56
72
|
dependsOn(descendant: number, ancestor: number): boolean;
|
|
57
73
|
/** A counter that changes whenever the graph does; equal values mean equal answers. */
|
|
58
74
|
get version(): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authored-promise-graph.d.ts","sourceRoot":"","sources":["../src/authored-promise-graph.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,oBAAoB;
|
|
1
|
+
{"version":3,"file":"authored-promise-graph.d.ts","sourceRoot":"","sources":["../src/authored-promise-graph.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,oBAAoB;IAmB7B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAnBnC,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,8EAA8E;IAC9E,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAqB;IACjE,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,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,OAAO,CAAC,eAAe,CAAwG;IAC/H,sFAAsF;IACtF,OAAO,CAAC,OAAO,CAAK;gBAGD,OAAO,EAAE,MAAM,OAAO,EACtB,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI;IAgD9D,MAAM,IAAI,IAAI;IAId,OAAO,IAAI,IAAI;IAIf,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIvC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAInC,mFAAmF;IACnF,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG;QAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;KAAE;IAOjG,wEAAwE;IACxE,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAUnC,qFAAqF;IACrF,aAAa,IAAI,GAAG,CAAC,MAAM,CAAC;IAS5B,mFAAmF;IACnF,gBAAgB,IAAI,KAAK,CAAC;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC;IAUvF,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAYnC;;;;OAIG;IACH,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOhD,8BAA8B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIxD,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIxD,uFAAuF;IACvF,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED;;;;OAIG;IACH,iBAAiB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAI1G,KAAK,IAAI,IAAI;IAcb,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,IAAI;IAMZ;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,cAAc;CAcvB"}
|
|
@@ -31,12 +31,15 @@ export class AuthoredPromiseGraph {
|
|
|
31
31
|
triggers = new Map();
|
|
32
32
|
creationContexts = new Map();
|
|
33
33
|
resolutionCauses = new Map();
|
|
34
|
+
/** Promises attributed only when another promise's reaction resolved them. */
|
|
35
|
+
adoptedFromResolvingContext = new Set();
|
|
34
36
|
promiseIds = new WeakMap();
|
|
35
37
|
handles = new Map();
|
|
36
38
|
unattributedChildren = new Map();
|
|
37
39
|
attributedRoots = new Map();
|
|
38
40
|
roots = new Set();
|
|
39
41
|
pending = new Set();
|
|
42
|
+
combinatorCaptures = [];
|
|
40
43
|
dependencyCache;
|
|
41
44
|
/** Bumped by every graph change, so derived answers can be cached between changes. */
|
|
42
45
|
changes = 0;
|
|
@@ -53,6 +56,8 @@ export class AuthoredPromiseGraph {
|
|
|
53
56
|
this.triggers.set(asyncId, triggerAsyncId);
|
|
54
57
|
this.creationContexts.set(asyncId, executionAsyncId());
|
|
55
58
|
this.promiseIds.set(resource, asyncId);
|
|
59
|
+
for (const capture of this.combinatorCaptures)
|
|
60
|
+
capture.add(asyncId);
|
|
56
61
|
this.handles.set(asyncId, resource);
|
|
57
62
|
this.pending.add(asyncId);
|
|
58
63
|
const root = this.roots.has(triggerAsyncId)
|
|
@@ -83,6 +88,7 @@ export class AuthoredPromiseGraph {
|
|
|
83
88
|
// success. Measured; see ops/probes/pr134-repair-0903/combinators.mjs.
|
|
84
89
|
const adopted = this.attributedRoots.get(cause);
|
|
85
90
|
if (adopted !== undefined) {
|
|
91
|
+
this.adoptedFromResolvingContext.add(asyncId);
|
|
86
92
|
this.attribute(asyncId, adopted);
|
|
87
93
|
return;
|
|
88
94
|
}
|
|
@@ -102,6 +108,20 @@ export class AuthoredPromiseGraph {
|
|
|
102
108
|
idOf(value) {
|
|
103
109
|
return this.promiseIds.get(value);
|
|
104
110
|
}
|
|
111
|
+
isPending(asyncId) {
|
|
112
|
+
return this.pending.has(asyncId);
|
|
113
|
+
}
|
|
114
|
+
/** The intrinsic creates per-member reaction promises as well as its aggregate. */
|
|
115
|
+
captureCombinator(call) {
|
|
116
|
+
const created = new Set();
|
|
117
|
+
this.combinatorCaptures.push(created);
|
|
118
|
+
try {
|
|
119
|
+
return { value: call(), created };
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
this.combinatorCaptures.pop();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
105
125
|
/** Mark a promise whose descendants belong to an authored operation. */
|
|
106
126
|
registerRoot(asyncId) {
|
|
107
127
|
if (asyncId <= 0 || this.roots.has(asyncId))
|
|
@@ -150,6 +170,20 @@ export class AuthoredPromiseGraph {
|
|
|
150
170
|
}
|
|
151
171
|
return causes;
|
|
152
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* A promise created directly in one async context but settled in another
|
|
175
|
+
* can be a join. Its resolution edge names only the settling member, so a
|
|
176
|
+
* frontier may use it only when a combinator registered all members.
|
|
177
|
+
*/
|
|
178
|
+
hasUnobservedJoinShape(asyncId) {
|
|
179
|
+
const trigger = this.triggers.get(asyncId);
|
|
180
|
+
const resolution = this.resolutionCauses.get(asyncId);
|
|
181
|
+
return trigger !== undefined && trigger === this.creationContexts.get(asyncId)
|
|
182
|
+
&& resolution !== undefined && resolution !== trigger;
|
|
183
|
+
}
|
|
184
|
+
wasAdoptedFromResolvingContext(asyncId) {
|
|
185
|
+
return this.adoptedFromResolvingContext.has(asyncId);
|
|
186
|
+
}
|
|
153
187
|
dependsOn(descendant, ancestor) {
|
|
154
188
|
return this.dependenciesOf(descendant).has(ancestor);
|
|
155
189
|
}
|
|
@@ -169,11 +203,13 @@ export class AuthoredPromiseGraph {
|
|
|
169
203
|
this.triggers.clear();
|
|
170
204
|
this.creationContexts.clear();
|
|
171
205
|
this.resolutionCauses.clear();
|
|
206
|
+
this.adoptedFromResolvingContext.clear();
|
|
172
207
|
this.handles.clear();
|
|
173
208
|
this.unattributedChildren.clear();
|
|
174
209
|
this.attributedRoots.clear();
|
|
175
210
|
this.roots.clear();
|
|
176
211
|
this.pending.clear();
|
|
212
|
+
this.combinatorCaptures.length = 0;
|
|
177
213
|
this.dependencyCache = undefined;
|
|
178
214
|
}
|
|
179
215
|
attribute(start, root) {
|