@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.
Files changed (135) hide show
  1. package/package.json +9 -4
  2. package/packages/run/run.entry-point.d.ts +2 -1
  3. package/packages/run/run.entry-point.d.ts.map +1 -1
  4. package/readme.md +7 -1
  5. package/run/command-line-runner.d.ts.map +1 -1
  6. package/run/command-line-runner.js +10 -5
  7. package/run/command-line-runner.js.map +1 -1
  8. package/run/duration-history.d.ts +10 -1
  9. package/run/duration-history.d.ts.map +1 -1
  10. package/run/duration-history.js +2 -2
  11. package/run/duration-history.js.map +1 -1
  12. package/run/node-child-process-starters.js +1 -1
  13. package/run/node-child-process-starters.js.map +1 -1
  14. package/run/resource-lifecycle-boundaries.js +73 -0
  15. package/run/resource-lifecycle-boundaries.js.map +1 -0
  16. package/run/resource-lifecycle-projection.js +48 -0
  17. package/run/resource-lifecycle-projection.js.map +1 -0
  18. package/run/resource-lifecycle-session-acquirer.js +177 -0
  19. package/run/resource-lifecycle-session-acquirer.js.map +1 -0
  20. package/run/resource-lifecycle-startup-budget.js +81 -0
  21. package/run/resource-lifecycle-startup-budget.js.map +1 -0
  22. package/run/resource-lifecycle-state.d.ts +2 -0
  23. package/run/resource-lifecycle-state.d.ts.map +1 -1
  24. package/run/resource-lifecycle-state.js.map +1 -1
  25. package/run/resource-lifecycle-timing.js +85 -0
  26. package/run/resource-lifecycle-timing.js.map +1 -0
  27. package/run/resource-lifecycle.js +130 -235
  28. package/run/resource-lifecycle.js.map +1 -1
  29. package/run/run-collected-planning.js +23 -6
  30. package/run/run-collected-planning.js.map +1 -1
  31. package/run/run-collected-resolution.js +3 -2
  32. package/run/run-collected-resolution.js.map +1 -1
  33. package/run/run-collection-error-result.js +2 -2
  34. package/run/run-collection-error-result.js.map +1 -1
  35. package/run/run-config-schema.d.ts +7 -0
  36. package/run/run-config-schema.d.ts.map +1 -1
  37. package/run/run-config-schema.js +4 -0
  38. package/run/run-config-schema.js.map +1 -1
  39. package/run/run-config.d.ts.map +1 -1
  40. package/run/run-config.js +4 -4
  41. package/run/run-config.js.map +1 -1
  42. package/run/run-empty-shard.js +2 -2
  43. package/run/run-empty-shard.js.map +1 -1
  44. package/run/run-facts.js +4 -0
  45. package/run/run-facts.js.map +1 -1
  46. package/run/run-if-main-facts.js +2 -1
  47. package/run/run-if-main-facts.js.map +1 -1
  48. package/run/run-in-process-execution.js +3 -3
  49. package/run/run-in-process-execution.js.map +1 -1
  50. package/run/run-input-resolution.js +6 -0
  51. package/run/run-input-resolution.js.map +1 -1
  52. package/run/run-isolated-process.js +39 -24
  53. package/run/run-isolated-process.js.map +1 -1
  54. package/run/run-local-execution.js +12 -3
  55. package/run/run-local-execution.js.map +1 -1
  56. package/run/run-local-resolution.js +4 -2
  57. package/run/run-local-resolution.js.map +1 -1
  58. package/run/run-orchestrator-dependencies.d.ts +2 -0
  59. package/run/run-orchestrator-dependencies.d.ts.map +1 -1
  60. package/run/run-orchestrator-dependencies.js.map +1 -1
  61. package/run/run-support.js +14 -6
  62. package/run/run-support.js.map +1 -1
  63. package/run/run-timing-collection.d.ts +43 -0
  64. package/run/run-timing-collection.d.ts.map +1 -0
  65. package/run/run-timing-collection.js +173 -8
  66. package/run/run-timing-collection.js.map +1 -1
  67. package/run/run-types.d.ts +13 -3
  68. package/run/run-types.d.ts.map +1 -1
  69. package/run/run-types.js.map +1 -1
  70. package/run/run-validation.js +2 -0
  71. package/run/run-validation.js.map +1 -1
  72. package/run/run.js +31 -20
  73. package/run/run.js.map +1 -1
  74. package/run/supervised-child-process.d.ts +1 -0
  75. package/run/supervised-child-process.d.ts.map +1 -1
  76. package/run/supervised-child-process.js +5 -0
  77. package/run/supervised-child-process.js.map +1 -1
  78. package/run/supervised-child.js +3 -2
  79. package/run/supervised-child.js.map +1 -1
  80. package/run/supervised-protocol.js +14 -0
  81. package/run/supervised-protocol.js.map +1 -1
  82. package/run/supervised-run-collection.js +123 -0
  83. package/run/supervised-run-collection.js.map +1 -0
  84. package/run/supervised-run-runtime.js +8 -13
  85. package/run/supervised-run-runtime.js.map +1 -1
  86. package/run/supervised-run.js +74 -106
  87. package/run/supervised-run.js.map +1 -1
  88. package/run/work-unit-resource-constraints.js +6 -6
  89. package/run/work-unit-resource-constraints.js.map +1 -1
  90. package/run/worker-pool-collection.js +46 -20
  91. package/run/worker-pool-collection.js.map +1 -1
  92. package/run/worker-pool-command.js +68 -0
  93. package/run/worker-pool-command.js.map +1 -0
  94. package/run/worker-pool-execution.js +48 -73
  95. package/run/worker-pool-execution.js.map +1 -1
  96. package/run/worker-pool-hedge-dispatch.js +2 -1
  97. package/run/worker-pool-hedge-dispatch.js.map +1 -1
  98. package/run/worker-pool-host-process-starter.js +13 -0
  99. package/run/worker-pool-host-process-starter.js.map +1 -0
  100. package/run/worker-pool-host-process.js +53 -79
  101. package/run/worker-pool-host-process.js.map +1 -1
  102. package/run/worker-pool-host-protocol.js.map +1 -1
  103. package/run/worker-pool-host-signal.js +21 -0
  104. package/run/worker-pool-host-signal.js.map +1 -0
  105. package/run/worker-pool-host-task.js +55 -0
  106. package/run/worker-pool-host-task.js.map +1 -0
  107. package/run/worker-pool-lanes.js +45 -22
  108. package/run/worker-pool-lanes.js.map +1 -1
  109. package/run/worker-pool-lifecycle-lanes.js +4 -56
  110. package/run/worker-pool-lifecycle-lanes.js.map +1 -1
  111. package/run/worker-pool-placement-planning.js +9 -4
  112. package/run/worker-pool-placement-planning.js.map +1 -1
  113. package/run/worker-pool-protocol.js +2 -0
  114. package/run/worker-pool-protocol.js.map +1 -0
  115. package/run/worker-pool-resource-lifecycle-execution.js +155 -0
  116. package/run/worker-pool-resource-lifecycle-execution.js.map +1 -0
  117. package/run/worker-pool-routing.js +6 -3
  118. package/run/worker-pool-routing.js.map +1 -1
  119. package/run/worker-pool-run.js +74 -19
  120. package/run/worker-pool-run.js.map +1 -1
  121. package/run/worker-pool-runtime.js +77 -17
  122. package/run/worker-pool-runtime.js.map +1 -1
  123. package/run/worker-pool-task-events.js +3 -0
  124. package/run/worker-pool-task-events.js.map +1 -1
  125. package/run/worker-pool-task-validation.js +11 -0
  126. package/run/worker-pool-task-validation.js.map +1 -0
  127. package/run/worker-pool-work-dispatcher.js +27 -21
  128. package/run/worker-pool-work-dispatcher.js.map +1 -1
  129. package/run/worker-pool-worker-resources.js +99 -0
  130. package/run/worker-pool-worker-resources.js.map +1 -0
  131. package/run/worker-pool-worker-timing.js +63 -0
  132. package/run/worker-pool-worker-timing.js.map +1 -0
  133. package/run/worker-pool-worker.js +93 -32
  134. package/run/worker-pool-worker.js.map +1 -1
  135. 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":"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"}
@@ -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;AAuBrD,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"}
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 { workIdentityKey } from "../engine/identity.js";
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
- const resourceScopes = new Set([
8
- 'per-case',
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 caseResourceBoundaries(testCase) {
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
- deleteAcquisition(boundaryKey) {
109
- acquisitions.delete(boundaryKey);
110
- },
111
- deleteRecord(boundaryKey) {
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 boundaryFor(resource, testCase) {
156
- return resourceBoundary(resource.name, resource.scope, testCase);
157
- }
158
- function assertCompatibleResource(stores, boundary, resource) {
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 startResource(resource, boundary, testCase, signal) {
177
- const dependencyContext = await acquireDependencyContext(resource, testCase, signal);
178
- const ownerHandle = await callableResourceDefinition(resource).acquire({
179
- dependencies: dependencyContext,
28
+ const disposeHandle = async function disposeResourceHandle() {
29
+ await dispose(record.ownerHandle, {
30
+ dependencies: record.dependencyContext,
180
31
  signal
181
32
  });
182
- const record = {
183
- boundary,
184
- dependencyContext,
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
- async function acquire(resource, testCase, signal) {
204
- const boundary = boundaryFor(resource, testCase);
205
- const existingRecord = stores.existingRecord(boundary.key);
206
- assertCompatibleResource(stores, boundary, resource);
207
- if (existingRecord !== undefined) {
208
- return existingRecord;
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
- if (dispose !== null) {
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 caseResourceBoundaries(testCase)) {
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(stores, steps, signal, messages) {
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 createManagedLifecycle(testCases) {
285
- const stores = createManagedStores(testCases);
137
+ function createManagedLifecycleState(options) {
138
+ const stores = createManagedStores(options);
139
+ const context = { options, stores };
286
140
  return {
287
- async acquireComposedResources(steps, signal, messages) {
288
- return await acquireManagedComposedResources(stores, steps, signal, messages);
289
- },
290
- async runCase(testCase, run) {
291
- try {
292
- return await runWithLifecycleCase(testCase, run);
293
- }
294
- finally {
295
- await disposeCompletedBoundaries(stores, testCase);
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
- export function createResourceLifecycleRuntimePolicy(testCases) {
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