@overkill-dev/run 0.0.56 → 0.0.57
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/package.json +9 -4
- package/packages/run/run.entry-point.d.ts +2 -1
- package/packages/run/run.entry-point.d.ts.map +1 -1
- package/readme.md +7 -1
- package/run/command-line-runner.d.ts.map +1 -1
- package/run/command-line-runner.js +10 -5
- package/run/command-line-runner.js.map +1 -1
- package/run/duration-history.d.ts +10 -1
- package/run/duration-history.d.ts.map +1 -1
- package/run/duration-history.js +2 -2
- package/run/duration-history.js.map +1 -1
- package/run/node-child-process-starters.js +1 -1
- package/run/node-child-process-starters.js.map +1 -1
- package/run/resource-lifecycle-boundaries.js +73 -0
- package/run/resource-lifecycle-boundaries.js.map +1 -0
- package/run/resource-lifecycle-projection.js +48 -0
- package/run/resource-lifecycle-projection.js.map +1 -0
- package/run/resource-lifecycle-session-acquirer.js +177 -0
- package/run/resource-lifecycle-session-acquirer.js.map +1 -0
- package/run/resource-lifecycle-startup-budget.js +81 -0
- package/run/resource-lifecycle-startup-budget.js.map +1 -0
- package/run/resource-lifecycle-state.d.ts +2 -0
- package/run/resource-lifecycle-state.d.ts.map +1 -1
- package/run/resource-lifecycle-state.js.map +1 -1
- package/run/resource-lifecycle-timing.js +85 -0
- package/run/resource-lifecycle-timing.js.map +1 -0
- package/run/resource-lifecycle.js +130 -235
- package/run/resource-lifecycle.js.map +1 -1
- package/run/run-collected-planning.js +23 -6
- package/run/run-collected-planning.js.map +1 -1
- package/run/run-collected-resolution.js +3 -2
- package/run/run-collected-resolution.js.map +1 -1
- package/run/run-collection-error-result.js +2 -2
- package/run/run-collection-error-result.js.map +1 -1
- package/run/run-config-schema.d.ts +7 -0
- package/run/run-config-schema.d.ts.map +1 -1
- package/run/run-config-schema.js +4 -0
- package/run/run-config-schema.js.map +1 -1
- package/run/run-config.d.ts.map +1 -1
- package/run/run-config.js +4 -4
- package/run/run-config.js.map +1 -1
- package/run/run-empty-shard.js +2 -2
- package/run/run-empty-shard.js.map +1 -1
- package/run/run-facts.js +4 -0
- package/run/run-facts.js.map +1 -1
- package/run/run-if-main-facts.js +2 -1
- package/run/run-if-main-facts.js.map +1 -1
- package/run/run-in-process-execution.js +3 -3
- package/run/run-in-process-execution.js.map +1 -1
- package/run/run-input-resolution.js +6 -0
- package/run/run-input-resolution.js.map +1 -1
- package/run/run-isolated-process.js +39 -24
- package/run/run-isolated-process.js.map +1 -1
- package/run/run-local-execution.js +12 -3
- package/run/run-local-execution.js.map +1 -1
- package/run/run-local-resolution.js +4 -2
- package/run/run-local-resolution.js.map +1 -1
- package/run/run-orchestrator-dependencies.d.ts +2 -0
- package/run/run-orchestrator-dependencies.d.ts.map +1 -1
- package/run/run-orchestrator-dependencies.js.map +1 -1
- package/run/run-support.js +14 -6
- package/run/run-support.js.map +1 -1
- package/run/run-timing-collection.d.ts +43 -0
- package/run/run-timing-collection.d.ts.map +1 -0
- package/run/run-timing-collection.js +173 -8
- package/run/run-timing-collection.js.map +1 -1
- package/run/run-types.d.ts +13 -3
- package/run/run-types.d.ts.map +1 -1
- package/run/run-types.js.map +1 -1
- package/run/run-validation.js +2 -0
- package/run/run-validation.js.map +1 -1
- package/run/run.js +31 -20
- package/run/run.js.map +1 -1
- package/run/supervised-child-process.d.ts +1 -0
- package/run/supervised-child-process.d.ts.map +1 -1
- package/run/supervised-child-process.js +5 -0
- package/run/supervised-child-process.js.map +1 -1
- package/run/supervised-child.js +3 -2
- package/run/supervised-child.js.map +1 -1
- package/run/supervised-protocol.js +14 -0
- package/run/supervised-protocol.js.map +1 -1
- package/run/supervised-run-collection.js +123 -0
- package/run/supervised-run-collection.js.map +1 -0
- package/run/supervised-run-runtime.js +8 -13
- package/run/supervised-run-runtime.js.map +1 -1
- package/run/supervised-run.js +74 -106
- package/run/supervised-run.js.map +1 -1
- package/run/work-unit-resource-constraints.js +6 -6
- package/run/work-unit-resource-constraints.js.map +1 -1
- package/run/worker-pool-collection.js +46 -20
- package/run/worker-pool-collection.js.map +1 -1
- package/run/worker-pool-command.js +68 -0
- package/run/worker-pool-command.js.map +1 -0
- package/run/worker-pool-execution.js +48 -73
- package/run/worker-pool-execution.js.map +1 -1
- package/run/worker-pool-hedge-dispatch.js +2 -1
- package/run/worker-pool-hedge-dispatch.js.map +1 -1
- package/run/worker-pool-host-process-starter.js +13 -0
- package/run/worker-pool-host-process-starter.js.map +1 -0
- package/run/worker-pool-host-process.js +53 -79
- package/run/worker-pool-host-process.js.map +1 -1
- package/run/worker-pool-host-protocol.js.map +1 -1
- package/run/worker-pool-host-signal.js +21 -0
- package/run/worker-pool-host-signal.js.map +1 -0
- package/run/worker-pool-host-task.js +55 -0
- package/run/worker-pool-host-task.js.map +1 -0
- package/run/worker-pool-lanes.js +45 -22
- package/run/worker-pool-lanes.js.map +1 -1
- package/run/worker-pool-lifecycle-lanes.js +4 -56
- package/run/worker-pool-lifecycle-lanes.js.map +1 -1
- package/run/worker-pool-placement-planning.js +9 -4
- package/run/worker-pool-placement-planning.js.map +1 -1
- package/run/worker-pool-protocol.js +2 -0
- package/run/worker-pool-protocol.js.map +1 -0
- package/run/worker-pool-resource-lifecycle-execution.js +155 -0
- package/run/worker-pool-resource-lifecycle-execution.js.map +1 -0
- package/run/worker-pool-routing.js +6 -3
- package/run/worker-pool-routing.js.map +1 -1
- package/run/worker-pool-run.js +74 -19
- package/run/worker-pool-run.js.map +1 -1
- package/run/worker-pool-runtime.js +77 -17
- package/run/worker-pool-runtime.js.map +1 -1
- package/run/worker-pool-task-events.js +3 -0
- package/run/worker-pool-task-events.js.map +1 -1
- package/run/worker-pool-task-validation.js +11 -0
- package/run/worker-pool-task-validation.js.map +1 -0
- package/run/worker-pool-work-dispatcher.js +27 -21
- package/run/worker-pool-work-dispatcher.js.map +1 -1
- package/run/worker-pool-worker-resources.js +99 -0
- package/run/worker-pool-worker-resources.js.map +1 -0
- package/run/worker-pool-worker-timing.js +63 -0
- package/run/worker-pool-worker-timing.js.map +1 -0
- package/run/worker-pool-worker.js +93 -32
- package/run/worker-pool-worker.js.map +1 -1
- package/sbom.cdx.json +9 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-lifecycle-session-acquirer.js","sourceRoot":"","sources":["../../../../source/run/resource-lifecycle-session-acquirer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { clearTimeout as clearNodeTimeout, setTimeout as setNodeTimeout } from 'node:timers';
|
|
2
|
+
import { callableResourceDefinition } from "../resources/resource-graph.js";
|
|
3
|
+
const resourceStartupTimeoutBrand = Symbol('ResourceStartupTimeout');
|
|
4
|
+
function resourceStartupTimeoutError(message) {
|
|
5
|
+
const error = new Error(message);
|
|
6
|
+
Object.defineProperty(error, resourceStartupTimeoutBrand, { value: true });
|
|
7
|
+
return error;
|
|
8
|
+
}
|
|
9
|
+
export function isResourceStartupTimeoutError(error) {
|
|
10
|
+
return typeof error === 'object' &&
|
|
11
|
+
error !== null &&
|
|
12
|
+
Reflect.get(error, resourceStartupTimeoutBrand) === true;
|
|
13
|
+
}
|
|
14
|
+
function isStartupBudgetRequirement(requirement) {
|
|
15
|
+
if (requirement === null || typeof requirement !== 'object') {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
const kind = Reflect.get(requirement, 'kind');
|
|
19
|
+
const minimumMilliseconds = Reflect.get(requirement, 'minimumMilliseconds');
|
|
20
|
+
return kind === 'startup-budget-milliseconds' &&
|
|
21
|
+
typeof minimumMilliseconds === 'number' &&
|
|
22
|
+
Number.isFinite(minimumMilliseconds) &&
|
|
23
|
+
minimumMilliseconds >= 0;
|
|
24
|
+
}
|
|
25
|
+
function startupBudgetMilliseconds(resource) {
|
|
26
|
+
const budgets = resource.requirements.flatMap(function toBudget(requirement) {
|
|
27
|
+
return isStartupBudgetRequirement(requirement) ? [requirement.minimumMilliseconds] : [];
|
|
28
|
+
});
|
|
29
|
+
return budgets.length === 0 ? null : Math.max(...budgets);
|
|
30
|
+
}
|
|
31
|
+
function createStartupBudgetTimer(resource, budgetMilliseconds, controller) {
|
|
32
|
+
let rejectTimeout = function rejectBeforeTimeoutReady(error) {
|
|
33
|
+
throw error;
|
|
34
|
+
};
|
|
35
|
+
const timeout = new Promise(function createStartupTimeout(_resolve, reject) {
|
|
36
|
+
rejectTimeout = reject;
|
|
37
|
+
});
|
|
38
|
+
const timer = setNodeTimeout(function abortForStartupBudget() {
|
|
39
|
+
const error = resourceStartupTimeoutError(`Resource "${resource.name}" exceeded startup budget of ${budgetMilliseconds} ms.`);
|
|
40
|
+
controller.abort(error);
|
|
41
|
+
rejectTimeout(error);
|
|
42
|
+
}, budgetMilliseconds);
|
|
43
|
+
return {
|
|
44
|
+
cancel() {
|
|
45
|
+
clearNodeTimeout(timer);
|
|
46
|
+
},
|
|
47
|
+
timeout
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function linkParentSignal(parentSignal, controller) {
|
|
51
|
+
const abortForParentSignal = function abortForParentSignal() {
|
|
52
|
+
controller.abort(parentSignal.reason);
|
|
53
|
+
};
|
|
54
|
+
parentSignal.addEventListener('abort', abortForParentSignal, { once: true });
|
|
55
|
+
return function unlinkParentSignal() {
|
|
56
|
+
parentSignal.removeEventListener('abort', abortForParentSignal);
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export async function acquireResourceWithStartupBudget(resource, context) {
|
|
60
|
+
const budgetMilliseconds = startupBudgetMilliseconds(resource);
|
|
61
|
+
if (budgetMilliseconds === null) {
|
|
62
|
+
return await callableResourceDefinition(resource).acquire(context);
|
|
63
|
+
}
|
|
64
|
+
const controller = new AbortController();
|
|
65
|
+
const timer = createStartupBudgetTimer(resource, budgetMilliseconds, controller);
|
|
66
|
+
const unlinkParentSignal = linkParentSignal(context.signal, controller);
|
|
67
|
+
try {
|
|
68
|
+
return await Promise.race([
|
|
69
|
+
callableResourceDefinition(resource).acquire({
|
|
70
|
+
dependencies: context.dependencies,
|
|
71
|
+
signal: controller.signal
|
|
72
|
+
}),
|
|
73
|
+
timer.timeout
|
|
74
|
+
]);
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
timer.cancel();
|
|
78
|
+
unlinkParentSignal();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=resource-lifecycle-startup-budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-lifecycle-startup-budget.js","sourceRoot":"","sources":["../../../../source/run/resource-lifecycle-startup-budget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,aAAa,CAAC;AAM7F,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAY5E,MAAM,2BAA2B,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC;AAErE,SAAS,2BAA2B,CAAC,OAAe;IAChD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAEjC,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,2BAA2B,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3E,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,KAAc;IACxD,OAAO,OAAO,KAAK,KAAK,QAAQ;QAC5B,KAAK,KAAK,IAAI;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,2BAA2B,CAAC,KAAK,IAAI,CAAC;AACjE,CAAC;AAED,SAAS,0BAA0B,CAAC,WAAoB;IACpD,IAAI,WAAW,KAAK,IAAI,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC1D,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,IAAI,GAAY,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACvD,MAAM,mBAAmB,GAAY,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;IAErF,OAAO,IAAI,KAAK,6BAA6B;QACzC,OAAO,mBAAmB,KAAK,QAAQ;QACvC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACpC,mBAAmB,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,yBAAyB,CAAC,QAA+B;IAC9D,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,QAAQ,CAAC,WAAW;QACvE,OAAO,0BAA0B,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAE,WAAW,CAAC,mBAAmB,CAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9F,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,wBAAwB,CAC7B,QAA+B,EAC/B,kBAA0B,EAC1B,UAA2B;IAE3B,IAAI,aAAa,GAAG,SAAS,wBAAwB,CAAC,KAAY;QAC9D,MAAM,KAAK,CAAC;IAChB,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,OAAO,CAAQ,SAAS,oBAAoB,CAAC,QAAQ,EAAE,MAAM;QAC7E,aAAa,GAAG,MAAM,CAAC;IAC3B,CAAC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,cAAc,CAAC,SAAS,qBAAqB;QACvD,MAAM,KAAK,GAAG,2BAA2B,CACrC,aAAa,QAAQ,CAAC,IAAI,gCAAgC,kBAAkB,MAAM,CACrF,CAAC;QAEF,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACxB,aAAa,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAEvB,OAAO;QACH,MAAM;YACF,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO;KACV,CAAC;AACN,CAAC;AAED,SAAS,gBAAgB,CAAC,YAAyB,EAAE,UAA2B;IAC5E,MAAM,oBAAoB,GAAG,SAAS,oBAAoB;QACtD,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC,CAAC;IAEF,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7E,OAAO,SAAS,kBAAkB;QAC9B,YAAY,CAAC,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;IACpE,CAAC,CAAC;AACN,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gCAAgC,CAClD,QAA+B,EAC/B,OAA6C;IAE7C,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IAE/D,IAAI,kBAAkB,KAAK,IAAI,EAAE,CAAC;QAC9B,OAAO,MAAM,0BAA0B,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,wBAAwB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,UAAU,CAAC,CAAC;IACjF,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAExE,IAAI,CAAC;QACD,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;YACtB,0BAA0B,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;gBACzC,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,MAAM,EAAE,UAAU,CAAC,MAAM;aAC5B,CAAC;YACF,KAAK,CAAC,OAAO;SAChB,CAAC,CAAC;IACP,CAAC;YAAS,CAAC;QACP,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,kBAAkB,EAAE,CAAC;IACzB,CAAC;AACL,CAAC"}
|
|
@@ -4,6 +4,8 @@ import type { ComposedResourceSession, LifecycleMessages, ResourceWrapperStep }
|
|
|
4
4
|
export type ManagedRunnerError = RunnerError;
|
|
5
5
|
export type ManagedLifecycleState = {
|
|
6
6
|
readonly acquireComposedResources: (steps: readonly ResourceWrapperStep[], signal: AbortSignal, messages: LifecycleMessages) => Promise<ComposedResourceSession>;
|
|
7
|
+
readonly acquireResourceScopes: (steps: readonly ResourceWrapperStep[], testCase: TestPlanCase, signal: AbortSignal, scopes: ReadonlySet<string>) => Promise<void>;
|
|
8
|
+
readonly disposeAll: (signal: AbortSignal) => Promise<readonly ManagedRunnerError[]>;
|
|
7
9
|
readonly runCase: <Value>(testCase: TestPlanCase, run: () => Promise<Value>) => Promise<Value>;
|
|
8
10
|
readonly takeCaseErrors: (testCase: TestPlanCase) => readonly ManagedRunnerError[];
|
|
9
11
|
readonly takePendingRunErrors: () => readonly ManagedRunnerError[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-lifecycle-state.d.ts","sourceRoot":"","sources":["../../../../source/run/resource-lifecycle-state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EACR,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,EACtB,MAAM,qCAAqC,CAAC;AAE7C,MAAM,MAAM,kBAAkB,GAAG,WAAW,CAAC;AAE7C,MAAM,MAAM,qBAAqB,GAAG;IAChC,QAAQ,CAAC,wBAAwB,EAAE,CAC/B,KAAK,EAAE,SAAS,mBAAmB,EAAE,EACrC,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,iBAAiB,KAC1B,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/F,QAAQ,CAAC,cAAc,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,SAAS,kBAAkB,EAAE,CAAC;IACnF,QAAQ,CAAC,oBAAoB,EAAE,MAAM,SAAS,kBAAkB,EAAE,CAAC;IACnE,QAAQ,CAAC,aAAa,EAAE,MAAM,SAAS,kBAAkB,EAAE,CAAC;CAC/D,CAAC;AAKF,wBAAgB,sBAAsB,IAAI,qBAAqB,GAAG,IAAI,CAErE;AAED,wBAAsB,uBAAuB,CAAC,KAAK,EAC/C,SAAS,EAAE,qBAAqB,EAChC,GAAG,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,GAC1B,OAAO,CAAC,KAAK,CAAC,CAEhB;AAED,wBAAgB,oBAAoB,IAAI,YAAY,GAAG,IAAI,CAE1D;AAED,wBAAsB,oBAAoB,CAAC,KAAK,EAC5C,QAAQ,EAAE,YAAY,EACtB,GAAG,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,GAC1B,OAAO,CAAC,KAAK,CAAC,CAEhB"}
|
|
1
|
+
{"version":3,"file":"resource-lifecycle-state.d.ts","sourceRoot":"","sources":["../../../../source/run/resource-lifecycle-state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EACR,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,EACtB,MAAM,qCAAqC,CAAC;AAE7C,MAAM,MAAM,kBAAkB,GAAG,WAAW,CAAC;AAE7C,MAAM,MAAM,qBAAqB,GAAG;IAChC,QAAQ,CAAC,wBAAwB,EAAE,CAC/B,KAAK,EAAE,SAAS,mBAAmB,EAAE,EACrC,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,iBAAiB,KAC1B,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACtC,QAAQ,CAAC,qBAAqB,EAAE,CAC5B,KAAK,EAAE,SAAS,mBAAmB,EAAE,EACrC,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,KAC1B,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,QAAQ,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,SAAS,kBAAkB,EAAE,CAAC,CAAC;IACrF,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/F,QAAQ,CAAC,cAAc,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,SAAS,kBAAkB,EAAE,CAAC;IACnF,QAAQ,CAAC,oBAAoB,EAAE,MAAM,SAAS,kBAAkB,EAAE,CAAC;IACnE,QAAQ,CAAC,aAAa,EAAE,MAAM,SAAS,kBAAkB,EAAE,CAAC;CAC/D,CAAC;AAKF,wBAAgB,sBAAsB,IAAI,qBAAqB,GAAG,IAAI,CAErE;AAED,wBAAsB,uBAAuB,CAAC,KAAK,EAC/C,SAAS,EAAE,qBAAqB,EAChC,GAAG,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,GAC1B,OAAO,CAAC,KAAK,CAAC,CAEhB;AAED,wBAAgB,oBAAoB,IAAI,YAAY,GAAG,IAAI,CAE1D;AAED,wBAAsB,oBAAoB,CAAC,KAAK,EAC5C,QAAQ,EAAE,YAAY,EACtB,GAAG,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,GAC1B,OAAO,CAAC,KAAK,CAAC,CAEhB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-lifecycle-state.js","sourceRoot":"","sources":["../../../../source/run/resource-lifecycle-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"resource-lifecycle-state.js","sourceRoot":"","sources":["../../../../source/run/resource-lifecycle-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AA8BrD,MAAM,eAAe,GAAG,IAAI,iBAAiB,EAAyB,CAAC;AACvE,MAAM,WAAW,GAAG,IAAI,iBAAiB,EAAgB,CAAC;AAE1D,MAAM,UAAU,sBAAsB;IAClC,OAAO,eAAe,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CACzC,SAAgC,EAChC,GAAyB;IAEzB,OAAO,MAAM,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,oBAAoB;IAChC,OAAO,WAAW,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC;AAC1C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACtC,QAAsB,EACtB,GAAyB;IAEzB,OAAO,MAAM,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { isResourceStartupTimeoutError } from "./resource-lifecycle-startup-budget.js";
|
|
2
|
+
function timingKind(phase) {
|
|
3
|
+
return phase === 'acquire' ? 'resource.acquire' : 'resource.dispose';
|
|
4
|
+
}
|
|
5
|
+
function failedTimingStatus(error, operation) {
|
|
6
|
+
if (isResourceStartupTimeoutError(error)) {
|
|
7
|
+
return 'timeout';
|
|
8
|
+
}
|
|
9
|
+
return operation.signal.aborted ? 'cancelled' : 'failure';
|
|
10
|
+
}
|
|
11
|
+
function nonNegativeMicroseconds(value) {
|
|
12
|
+
return Math.max(0, Math.trunc(value));
|
|
13
|
+
}
|
|
14
|
+
function writeResourceTiming(options, completed) {
|
|
15
|
+
const metadata = {
|
|
16
|
+
label: null,
|
|
17
|
+
processId: options.processId,
|
|
18
|
+
resource: completed.operation.resource,
|
|
19
|
+
workerId: options.workerId
|
|
20
|
+
};
|
|
21
|
+
if (options.target.kind === 'parent') {
|
|
22
|
+
options.target.record({
|
|
23
|
+
completedAtMicroseconds: completed.completedAtMicroseconds,
|
|
24
|
+
kind: timingKind(completed.operation.phase),
|
|
25
|
+
metadata,
|
|
26
|
+
startedAtMicroseconds: completed.startedAtMicroseconds,
|
|
27
|
+
status: completed.status
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
options.target.emit({
|
|
32
|
+
durationMicroseconds: nonNegativeMicroseconds(completed.completedAtMicroseconds - completed.startedAtMicroseconds),
|
|
33
|
+
kind: timingKind(completed.operation.phase),
|
|
34
|
+
...metadata,
|
|
35
|
+
startOffsetMicroseconds: null,
|
|
36
|
+
status: completed.status
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function recordResourceTiming(options, completed) {
|
|
41
|
+
try {
|
|
42
|
+
writeResourceTiming(options, completed);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function currentTime(clock) {
|
|
48
|
+
try {
|
|
49
|
+
return clock.currentMonotonicMicroseconds;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function finishResourceTiming(options, operation, startedAtMicroseconds, status) {
|
|
56
|
+
const completedAtMicroseconds = currentTime(options.clock);
|
|
57
|
+
if (startedAtMicroseconds !== null && completedAtMicroseconds !== null) {
|
|
58
|
+
recordResourceTiming(options, {
|
|
59
|
+
completedAtMicroseconds,
|
|
60
|
+
operation,
|
|
61
|
+
startedAtMicroseconds,
|
|
62
|
+
status
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function measureResourceLifecycle(options, operation, work) {
|
|
67
|
+
const startedAtMicroseconds = currentTime(options.clock);
|
|
68
|
+
try {
|
|
69
|
+
const value = await work();
|
|
70
|
+
finishResourceTiming(options, operation, startedAtMicroseconds, 'success');
|
|
71
|
+
return value;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
finishResourceTiming(options, operation, startedAtMicroseconds, failedTimingStatus(error, operation));
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export function createResourceLifecycleTiming(options) {
|
|
79
|
+
return {
|
|
80
|
+
async measure(operation, work) {
|
|
81
|
+
return await measureResourceLifecycle(options, operation, work);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=resource-lifecycle-timing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-lifecycle-timing.js","sourceRoot":"","sources":["../../../../source/run/resource-lifecycle-timing.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,74 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { assertResourceDependencyScopes, callableResourceDefinition, createResourceGraph, resourceEntries } from "../resources/resource-graph.js";
|
|
1
|
+
import { assertResourceDependencyScopes, callableResourceDefinition, createResourceGraph } from "../resources/resource-graph.js";
|
|
3
2
|
import { combinedResourceEntries, composedResourceSession, directResourceEntries, resourceMapFromEntries, stepRuntimeGraphs } from "./resource-lifecycle-composition.js";
|
|
4
3
|
import { currentLifecycleCase, runWithLifecycleCase, runWithManagedLifecycle } from "./resource-lifecycle-state.js";
|
|
5
4
|
import { resourceWrapperErrorFromUnknown, resourceWrapperLifecycleError } from "./resource-lifecycle-error.js";
|
|
6
5
|
import { managedResourceSession } from "./resource-lifecycle-managed-session.js";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
'per-file',
|
|
10
|
-
'per-run',
|
|
11
|
-
'per-suite',
|
|
12
|
-
'shared-per-worker'
|
|
13
|
-
]);
|
|
14
|
-
function isResourceScope(scope) {
|
|
15
|
-
return resourceScopes.has(scope);
|
|
16
|
-
}
|
|
17
|
-
function isProjectionScalar(value) {
|
|
18
|
-
return value === null ||
|
|
19
|
-
typeof value === 'string' ||
|
|
20
|
-
typeof value === 'boolean' ||
|
|
21
|
-
typeof value === 'number' && Number.isFinite(value);
|
|
22
|
-
}
|
|
23
|
-
function isProjectionObject(value) {
|
|
24
|
-
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
25
|
-
}
|
|
26
|
-
function isProjectionPayload(value) {
|
|
27
|
-
if (isProjectionScalar(value)) {
|
|
28
|
-
return true;
|
|
29
|
-
}
|
|
30
|
-
if (Array.isArray(value)) {
|
|
31
|
-
return value.every(isProjectionPayload);
|
|
32
|
-
}
|
|
33
|
-
return isProjectionObject(value) &&
|
|
34
|
-
Object.values(value).every(isProjectionPayload);
|
|
35
|
-
}
|
|
36
|
-
function resourceHasProjection(resource) {
|
|
37
|
-
return typeof resource.serializeHandle === 'function' &&
|
|
38
|
-
typeof resource.deserializeHandle === 'function';
|
|
39
|
-
}
|
|
40
|
-
function projectedHandle(resource, ownerHandle, dependencyContext) {
|
|
41
|
-
if (!resourceHasProjection(resource)) {
|
|
42
|
-
return ownerHandle;
|
|
43
|
-
}
|
|
44
|
-
const context = { dependencies: dependencyContext };
|
|
45
|
-
const payload = resource.serializeHandle(ownerHandle, context);
|
|
46
|
-
if (!isProjectionPayload(payload)) {
|
|
47
|
-
throw resourceWrapperLifecycleError(`Resource "${resource.name}" returned a non-JSON projection payload.`, payload);
|
|
48
|
-
}
|
|
49
|
-
return resource.deserializeHandle(payload, context);
|
|
50
|
-
}
|
|
51
|
-
function suiteBoundary(testCase) {
|
|
52
|
-
return JSON.stringify(testCase.id.suite);
|
|
53
|
-
}
|
|
54
|
-
function resourceBoundaryForCase(resourceName, scope, testCase) {
|
|
55
|
-
return scope === 'shared-per-worker'
|
|
56
|
-
? { key: `worker:${resourceName}`, scope }
|
|
57
|
-
: { key: `case:${workIdentityKey(testCase.workId)}:${resourceName}`, scope };
|
|
58
|
-
}
|
|
59
|
-
function resourceBoundary(resourceName, scope, testCase) {
|
|
60
|
-
const file = testCase.id.file ?? '<no-file>';
|
|
61
|
-
if (scope === 'per-run') {
|
|
62
|
-
return { key: `run:${resourceName}`, scope };
|
|
63
|
-
}
|
|
64
|
-
if (scope === 'per-file') {
|
|
65
|
-
return { key: `file:${file}:${resourceName}`, scope };
|
|
66
|
-
}
|
|
67
|
-
if (scope === 'per-suite') {
|
|
68
|
-
return { key: `suite:${file}:${suiteBoundary(testCase)}:${resourceName}`, scope };
|
|
69
|
-
}
|
|
70
|
-
return resourceBoundaryForCase(resourceName, scope, testCase);
|
|
71
|
-
}
|
|
6
|
+
import { caseResourceBoundaryKeys, resourceLifecycleBoundaryUseCounts, resourceScopes } from "./resource-lifecycle-boundaries.js";
|
|
7
|
+
import { createManagedResourceAcquirer, createManagedStores, resourceProjectionRecordsFromStores } from "./resource-lifecycle-session-acquirer.js";
|
|
72
8
|
function currentRunningCase() {
|
|
73
9
|
const testCase = currentLifecycleCase();
|
|
74
10
|
if (testCase === null) {
|
|
@@ -76,172 +12,59 @@ function currentRunningCase() {
|
|
|
76
12
|
}
|
|
77
13
|
return testCase;
|
|
78
14
|
}
|
|
79
|
-
function
|
|
80
|
-
return Array.from(new Set(testCase.resourceAttachments.resourceGraph.flatMap(function toBoundary(resource) {
|
|
81
|
-
return isResourceScope(resource.scope)
|
|
82
|
-
? [resourceBoundary(resource.name, resource.scope, testCase).key]
|
|
83
|
-
: [];
|
|
84
|
-
})));
|
|
85
|
-
}
|
|
86
|
-
function initialBoundaryUseCounts(testCases) {
|
|
87
|
-
const counts = new Map();
|
|
88
|
-
for (const testCase of testCases) {
|
|
89
|
-
for (const boundary of caseResourceBoundaries(testCase)) {
|
|
90
|
-
counts.set(boundary, (counts.get(boundary) ?? 0) + 1);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
return counts;
|
|
94
|
-
}
|
|
95
|
-
function caseKey(testCase) {
|
|
96
|
-
return workIdentityKey(testCase.workId);
|
|
97
|
-
}
|
|
98
|
-
function mutableDependencyContext() {
|
|
99
|
-
return {};
|
|
100
|
-
}
|
|
101
|
-
function createManagedStores(testCases) {
|
|
102
|
-
const acquisitions = new Map();
|
|
103
|
-
const boundaryUseCounts = new Map(initialBoundaryUseCounts(testCases));
|
|
104
|
-
const errorsByCase = new Map();
|
|
105
|
-
const records = new Map();
|
|
106
|
-
const runErrors = [];
|
|
15
|
+
function defaultLifecycleOptions(testCases, timing) {
|
|
107
16
|
return {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
},
|
|
111
|
-
|
|
112
|
-
records.delete(boundaryKey);
|
|
113
|
-
},
|
|
114
|
-
async existingAcquisition(boundaryKey) {
|
|
115
|
-
return await (acquisitions.get(boundaryKey) ?? Promise.resolve(null));
|
|
116
|
-
},
|
|
117
|
-
existingRecord(boundaryKey) {
|
|
118
|
-
return records.get(boundaryKey);
|
|
119
|
-
},
|
|
120
|
-
recordCaseError(testCase, message, cause) {
|
|
121
|
-
const key = caseKey(testCase);
|
|
122
|
-
const errors = errorsByCase.get(key) ?? [];
|
|
123
|
-
errors.push(resourceWrapperLifecycleError(message, cause).runnerError(testCase.id, testCase.workId));
|
|
124
|
-
errorsByCase.set(key, errors);
|
|
125
|
-
},
|
|
126
|
-
remainingBoundaryUses(boundaryKey) {
|
|
127
|
-
const remaining = (boundaryUseCounts.get(boundaryKey) ?? 0) - 1;
|
|
128
|
-
boundaryUseCounts.set(boundaryKey, remaining);
|
|
129
|
-
return remaining;
|
|
130
|
-
},
|
|
131
|
-
rememberAcquisition(boundaryKey, acquisition) {
|
|
132
|
-
acquisitions.set(boundaryKey, acquisition);
|
|
133
|
-
},
|
|
134
|
-
rememberRecord(boundaryKey, record) {
|
|
135
|
-
records.set(boundaryKey, record);
|
|
136
|
-
},
|
|
137
|
-
takeCaseErrors(testCase) {
|
|
138
|
-
const key = caseKey(testCase);
|
|
139
|
-
const errors = errorsByCase.get(key) ?? [];
|
|
140
|
-
errorsByCase.delete(key);
|
|
141
|
-
return errors;
|
|
142
|
-
},
|
|
143
|
-
takePendingRunErrors() {
|
|
144
|
-
const errors = Array.from(runErrors);
|
|
145
|
-
runErrors.length = 0;
|
|
146
|
-
return errors;
|
|
147
|
-
},
|
|
148
|
-
takeRunErrors() {
|
|
149
|
-
const errors = Array.from(runErrors);
|
|
150
|
-
runErrors.length = 0;
|
|
151
|
-
return errors;
|
|
152
|
-
}
|
|
17
|
+
boundaryUseCounts: resourceLifecycleBoundaryUseCounts(testCases),
|
|
18
|
+
caseDisposalScopes: new Set(resourceScopes),
|
|
19
|
+
projectedResources: { resources: [] },
|
|
20
|
+
timing
|
|
153
21
|
};
|
|
154
22
|
}
|
|
155
|
-
function
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
const record = stores.existingRecord(boundary.key);
|
|
160
|
-
if (record !== undefined && record.descriptor !== resource) {
|
|
161
|
-
throw resourceWrapperLifecycleError(`Resource name "${resource.name}" is used by multiple descriptors in one lifecycle boundary.`, resource);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
function createManagedResourceAcquirer(stores) {
|
|
165
|
-
let acquireResource = async function acquireBeforeReady() {
|
|
166
|
-
throw resourceWrapperLifecycleError('Resource lifecycle is not ready.', null);
|
|
167
|
-
};
|
|
168
|
-
async function acquireDependencyContext(resource, testCase, signal) {
|
|
169
|
-
const context = mutableDependencyContext();
|
|
170
|
-
await Promise.all(resourceEntries(resource.dependencies).map(async function acquireDependency([key, dependency]) {
|
|
171
|
-
const record = await acquireResource(dependency, testCase, signal);
|
|
172
|
-
context[key] = record.exposedHandle;
|
|
173
|
-
}));
|
|
174
|
-
return Object.freeze(context);
|
|
23
|
+
async function disposeResourceRecord(record, signal, timing) {
|
|
24
|
+
const { dispose } = callableResourceDefinition(record.descriptor);
|
|
25
|
+
if (record.external || dispose === null) {
|
|
26
|
+
return;
|
|
175
27
|
}
|
|
176
|
-
async function
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
dependencies: dependencyContext,
|
|
28
|
+
const disposeHandle = async function disposeResourceHandle() {
|
|
29
|
+
await dispose(record.ownerHandle, {
|
|
30
|
+
dependencies: record.dependencyContext,
|
|
180
31
|
signal
|
|
181
32
|
});
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
descriptor: resource,
|
|
186
|
-
exposedHandle: projectedHandle(resource, ownerHandle, dependencyContext),
|
|
187
|
-
ownerHandle
|
|
188
|
-
};
|
|
189
|
-
stores.rememberRecord(boundary.key, record);
|
|
190
|
-
return record;
|
|
191
|
-
}
|
|
192
|
-
async function acquireNewResource(resource, boundary, testCase, signal) {
|
|
193
|
-
const acquisition = startResource(resource, boundary, testCase, signal);
|
|
194
|
-
stores.rememberAcquisition(boundary.key, acquisition);
|
|
195
|
-
try {
|
|
196
|
-
return await acquisition;
|
|
197
|
-
}
|
|
198
|
-
catch (error) {
|
|
199
|
-
stores.deleteAcquisition(boundary.key);
|
|
200
|
-
throw error;
|
|
201
|
-
}
|
|
33
|
+
};
|
|
34
|
+
if (timing === null) {
|
|
35
|
+
await disposeHandle();
|
|
202
36
|
}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
}
|
|
210
|
-
const existingAcquisition = await stores.existingAcquisition(boundary.key);
|
|
211
|
-
return existingAcquisition ?? await acquireNewResource(resource, boundary, testCase, signal);
|
|
37
|
+
else {
|
|
38
|
+
await timing.measure({
|
|
39
|
+
phase: 'dispose',
|
|
40
|
+
resource: { name: record.descriptor.name, scope: record.descriptor.scope },
|
|
41
|
+
signal
|
|
42
|
+
}, disposeHandle);
|
|
212
43
|
}
|
|
213
|
-
acquireResource = acquire;
|
|
214
|
-
return { acquire };
|
|
215
44
|
}
|
|
216
|
-
async function disposeBoundary(stores, boundaryKey, signal) {
|
|
45
|
+
async function disposeBoundary(stores, boundaryKey, signal, timing) {
|
|
217
46
|
const record = stores.existingRecord(boundaryKey);
|
|
218
47
|
if (record === undefined) {
|
|
219
48
|
return;
|
|
220
49
|
}
|
|
221
|
-
const { dispose } = callableResourceDefinition(record.descriptor);
|
|
222
50
|
stores.deleteRecord(boundaryKey);
|
|
223
51
|
stores.deleteAcquisition(boundaryKey);
|
|
224
|
-
|
|
225
|
-
await dispose(record.ownerHandle, {
|
|
226
|
-
dependencies: record.dependencyContext,
|
|
227
|
-
signal
|
|
228
|
-
});
|
|
229
|
-
}
|
|
52
|
+
await disposeResourceRecord(record, signal, timing);
|
|
230
53
|
}
|
|
231
54
|
function freshDisposalSignal() {
|
|
232
55
|
const controller = new AbortController();
|
|
233
56
|
return controller.signal;
|
|
234
57
|
}
|
|
235
|
-
async function disposeCompletedBoundary(stores, boundary) {
|
|
58
|
+
async function disposeCompletedBoundary(stores, boundary, timing) {
|
|
236
59
|
const remaining = stores.remainingBoundaryUses(boundary);
|
|
237
60
|
if (remaining <= 0) {
|
|
238
|
-
await disposeBoundary(stores, boundary, freshDisposalSignal());
|
|
61
|
+
await disposeBoundary(stores, boundary, freshDisposalSignal(), timing);
|
|
239
62
|
}
|
|
240
63
|
}
|
|
241
|
-
async function disposeCompletedBoundaries(stores, testCase) {
|
|
242
|
-
for (const boundary of
|
|
64
|
+
async function disposeCompletedBoundaries(stores, options, testCase) {
|
|
65
|
+
for (const boundary of caseResourceBoundaryKeys(testCase, options.caseDisposalScopes)) {
|
|
243
66
|
try {
|
|
244
|
-
await disposeCompletedBoundary(stores, boundary);
|
|
67
|
+
await disposeCompletedBoundary(stores, boundary, options.timing);
|
|
245
68
|
}
|
|
246
69
|
catch (error) {
|
|
247
70
|
stores.recordCaseError(testCase, 'Resource disposal failed.', error);
|
|
@@ -261,53 +84,92 @@ async function managedResourceHandles(acquirer, graph, testCase, signal) {
|
|
|
261
84
|
}
|
|
262
85
|
return handles;
|
|
263
86
|
}
|
|
264
|
-
async function acquireComposedResourcesWithLifecycle(stores, steps, signal) {
|
|
87
|
+
async function acquireComposedResourcesWithLifecycle(stores, options, steps, signal) {
|
|
265
88
|
const testCase = currentRunningCase();
|
|
266
89
|
const directResources = resourceMapFromEntries(directResourceEntries(steps));
|
|
267
90
|
const runtimes = stepRuntimeGraphs(steps);
|
|
268
91
|
const combinedResources = combinedResourceEntries(steps, testCase.workId);
|
|
269
92
|
const graph = createResourceGraph(combinedResources);
|
|
270
|
-
const acquirer = createManagedResourceAcquirer(stores);
|
|
93
|
+
const acquirer = createManagedResourceAcquirer(stores, options);
|
|
271
94
|
assertResourceDependencyScopes(combinedResources);
|
|
272
95
|
await acquireTopLevelResources(acquirer, graph, testCase, signal);
|
|
273
96
|
const handles = await managedResourceHandles(acquirer, graph, testCase, signal);
|
|
274
97
|
return composedResourceSession(directResources, runtimes, managedResourceSession(combinedResources, handles), testCase.workId);
|
|
275
98
|
}
|
|
276
|
-
async function acquireManagedComposedResources(
|
|
99
|
+
async function acquireManagedComposedResources(request) {
|
|
277
100
|
try {
|
|
278
|
-
return await acquireComposedResourcesWithLifecycle(stores, steps, signal);
|
|
101
|
+
return await acquireComposedResourcesWithLifecycle(request.stores, request.options, request.steps, request.signal);
|
|
279
102
|
}
|
|
280
103
|
catch (error) {
|
|
281
|
-
throw resourceWrapperErrorFromUnknown(messages.acquisitionFailure, error);
|
|
104
|
+
throw resourceWrapperErrorFromUnknown(request.messages.acquisitionFailure, error);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async function acquireManagedResourceScopes(request) {
|
|
108
|
+
const combinedResources = combinedResourceEntries(request.steps, request.testCase.workId);
|
|
109
|
+
const graph = createResourceGraph(combinedResources);
|
|
110
|
+
const acquirer = createManagedResourceAcquirer(request.stores, request.options);
|
|
111
|
+
assertResourceDependencyScopes(combinedResources);
|
|
112
|
+
for (const node of graph.order) {
|
|
113
|
+
if (request.scopes.has(node.descriptor.scope)) {
|
|
114
|
+
await acquirer.acquire(node.descriptor, request.testCase, request.signal);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async function disposeAllManagedResources(stores, signal, timing) {
|
|
119
|
+
const errors = [];
|
|
120
|
+
for (const record of stores.records().toReversed()) {
|
|
121
|
+
try {
|
|
122
|
+
await disposeBoundary(stores, record.boundary.key, signal, timing);
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
errors.push({
|
|
126
|
+
attributedTo: null,
|
|
127
|
+
attributedToWork: null,
|
|
128
|
+
cause: error,
|
|
129
|
+
diagnostics: [],
|
|
130
|
+
message: 'Resource disposal failed.',
|
|
131
|
+
subtype: 'runtime-policy'
|
|
132
|
+
});
|
|
133
|
+
}
|
|
282
134
|
}
|
|
135
|
+
return errors;
|
|
283
136
|
}
|
|
284
|
-
function
|
|
285
|
-
const stores = createManagedStores(
|
|
137
|
+
function createManagedLifecycleState(options) {
|
|
138
|
+
const stores = createManagedStores(options);
|
|
139
|
+
const context = { options, stores };
|
|
286
140
|
return {
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
141
|
+
stores,
|
|
142
|
+
lifecycle: {
|
|
143
|
+
async acquireComposedResources(steps, signal, messages) {
|
|
144
|
+
return await acquireManagedComposedResources({ ...context, messages, signal, steps });
|
|
145
|
+
},
|
|
146
|
+
async acquireResourceScopes(steps, testCase, signal, scopes) {
|
|
147
|
+
await acquireManagedResourceScopes({ ...context, scopes, signal, steps, testCase });
|
|
148
|
+
},
|
|
149
|
+
async disposeAll(signal) {
|
|
150
|
+
return await disposeAllManagedResources(stores, signal, options.timing);
|
|
151
|
+
},
|
|
152
|
+
async runCase(testCase, run) {
|
|
153
|
+
try {
|
|
154
|
+
return await runWithLifecycleCase(testCase, run);
|
|
155
|
+
}
|
|
156
|
+
finally {
|
|
157
|
+
await disposeCompletedBoundaries(stores, options, testCase);
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
takeCaseErrors(testCase) {
|
|
161
|
+
return stores.takeCaseErrors(testCase);
|
|
162
|
+
},
|
|
163
|
+
takePendingRunErrors() {
|
|
164
|
+
return stores.takePendingRunErrors();
|
|
165
|
+
},
|
|
166
|
+
takeRunErrors() {
|
|
167
|
+
return stores.takeRunErrors();
|
|
296
168
|
}
|
|
297
|
-
},
|
|
298
|
-
takeCaseErrors(testCase) {
|
|
299
|
-
return stores.takeCaseErrors(testCase);
|
|
300
|
-
},
|
|
301
|
-
takePendingRunErrors() {
|
|
302
|
-
return stores.takePendingRunErrors();
|
|
303
|
-
},
|
|
304
|
-
takeRunErrors() {
|
|
305
|
-
return stores.takeRunErrors();
|
|
306
169
|
}
|
|
307
170
|
};
|
|
308
171
|
}
|
|
309
|
-
|
|
310
|
-
const lifecycle = createManagedLifecycle(testCases);
|
|
172
|
+
function createRuntimePolicyFromLifecycle(lifecycle) {
|
|
311
173
|
return {
|
|
312
174
|
async runCase(testCase, run) {
|
|
313
175
|
return await runWithManagedLifecycle(lifecycle, async function runWithResourceLifecycle() {
|
|
@@ -328,4 +190,37 @@ export function createResourceLifecycleRuntimePolicy(testCases) {
|
|
|
328
190
|
}
|
|
329
191
|
};
|
|
330
192
|
}
|
|
193
|
+
export function createResourceLifecycleRuntimePolicy(testCases, timing) {
|
|
194
|
+
const { lifecycle } = createManagedLifecycleState(defaultLifecycleOptions(testCases, timing));
|
|
195
|
+
return createRuntimePolicyFromLifecycle(lifecycle);
|
|
196
|
+
}
|
|
197
|
+
export function createResourceLifecycleSession(options) {
|
|
198
|
+
const { lifecycle, stores } = createManagedLifecycleState(options);
|
|
199
|
+
return {
|
|
200
|
+
async disposeAll(signal) {
|
|
201
|
+
return await lifecycle.disposeAll(signal);
|
|
202
|
+
},
|
|
203
|
+
projectionRecords() {
|
|
204
|
+
return resourceProjectionRecordsFromStores(stores);
|
|
205
|
+
},
|
|
206
|
+
runtimePolicy: createRuntimePolicyFromLifecycle(lifecycle)
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
export async function acquireResourceLifecycleScopes(request) {
|
|
210
|
+
const { lifecycle, stores } = createManagedLifecycleState(request.options);
|
|
211
|
+
await runWithManagedLifecycle(lifecycle, async function acquireSelectedScopes() {
|
|
212
|
+
for (const testCase of request.testCases) {
|
|
213
|
+
await lifecycle.acquireResourceScopes(request.stepsForCase(testCase), testCase, request.signal, request.scopes);
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
return {
|
|
217
|
+
async disposeAll(disposalSignal) {
|
|
218
|
+
return await lifecycle.disposeAll(disposalSignal);
|
|
219
|
+
},
|
|
220
|
+
projectionRecords() {
|
|
221
|
+
return resourceProjectionRecordsFromStores(stores);
|
|
222
|
+
},
|
|
223
|
+
runtimePolicy: createRuntimePolicyFromLifecycle(lifecycle)
|
|
224
|
+
};
|
|
225
|
+
}
|
|
331
226
|
//# sourceMappingURL=resource-lifecycle.js.map
|