@overkill-dev/run 0.0.17 → 0.0.19

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 (83) hide show
  1. package/engine/case-execution.d.ts +22 -0
  2. package/engine/case-execution.d.ts.map +1 -0
  3. package/engine/case-execution.js +10 -1
  4. package/engine/case-execution.js.map +1 -1
  5. package/engine/execution-result.js +4 -0
  6. package/engine/execution-result.js.map +1 -1
  7. package/engine/execution-supervision.d.ts +2 -0
  8. package/engine/execution-supervision.d.ts.map +1 -1
  9. package/engine/execution-supervision.js +28 -21
  10. package/engine/execution-supervision.js.map +1 -1
  11. package/engine/execution.d.ts +4 -1
  12. package/engine/execution.d.ts.map +1 -1
  13. package/engine/execution.js +9 -1
  14. package/engine/execution.js.map +1 -1
  15. package/engine/resource-usage-growth.js +12 -0
  16. package/engine/resource-usage-growth.js.map +1 -0
  17. package/engine/run-result.d.ts +3 -1
  18. package/engine/run-result.d.ts.map +1 -1
  19. package/engine/run-result.js.map +1 -1
  20. package/package.json +6 -3
  21. package/packages/run/run.entry-point.d.ts +2 -2
  22. package/packages/run/run.entry-point.d.ts.map +1 -1
  23. package/packages/run/run.entry-point.js +1 -1
  24. package/packages/run/run.entry-point.js.map +1 -1
  25. package/readme.md +39 -2
  26. package/run/capability-policy.d.ts +47 -0
  27. package/run/capability-policy.d.ts.map +1 -0
  28. package/run/capability-policy.js +395 -0
  29. package/run/capability-policy.js.map +1 -0
  30. package/run/collected-run-plan.js +100 -0
  31. package/run/collected-run-plan.js.map +1 -0
  32. package/run/command-line-runner.d.ts.map +1 -1
  33. package/run/command-line-runner.js +6 -3
  34. package/run/command-line-runner.js.map +1 -1
  35. package/run/node-host-readers.js +13 -0
  36. package/run/node-host-readers.js.map +1 -0
  37. package/run/node-process-capability-restrictions.js +92 -0
  38. package/run/node-process-capability-restrictions.js.map +1 -0
  39. package/run/run-config-schema.d.ts +5 -0
  40. package/run/run-config-schema.d.ts.map +1 -1
  41. package/run/run-config-schema.js +1 -0
  42. package/run/run-config-schema.js.map +1 -1
  43. package/run/run-config.d.ts.map +1 -1
  44. package/run/run-config.js +8 -2
  45. package/run/run-config.js.map +1 -1
  46. package/run/run-engine-selection.js +92 -0
  47. package/run/run-engine-selection.js.map +1 -0
  48. package/run/run-facts.js +103 -0
  49. package/run/run-facts.js.map +1 -0
  50. package/run/run-local-test-plan.js +25 -0
  51. package/run/run-local-test-plan.js.map +1 -0
  52. package/run/run-orchestrator.entry-point.d.ts +2 -0
  53. package/run/run-orchestrator.entry-point.d.ts.map +1 -0
  54. package/run/run-orchestrator.entry-point.js +31 -0
  55. package/run/run-orchestrator.entry-point.js.map +1 -0
  56. package/run/run-orchestrator.js +27 -33
  57. package/run/run-orchestrator.js.map +1 -1
  58. package/run/run-process-engine.js +40 -0
  59. package/run/run-process-engine.js.map +1 -0
  60. package/run/run-support.js +133 -0
  61. package/run/run-support.js.map +1 -0
  62. package/run/run-test-plan.js +20 -0
  63. package/run/run-test-plan.js.map +1 -0
  64. package/run/run-types.d.ts +60 -4
  65. package/run/run-types.d.ts.map +1 -1
  66. package/run/run-types.js.map +1 -1
  67. package/run/run-validation.js +122 -0
  68. package/run/run-validation.js.map +1 -0
  69. package/run/run.js +191 -329
  70. package/run/run.js.map +1 -1
  71. package/run/supervised-child-process.js +127 -0
  72. package/run/supervised-child-process.js.map +1 -0
  73. package/run/supervised-run-resource-policy.js +64 -0
  74. package/run/supervised-run-resource-policy.js.map +1 -0
  75. package/run/supervised-run-runtime.js +257 -0
  76. package/run/supervised-run-runtime.js.map +1 -0
  77. package/run/supervised-run-state.js +109 -0
  78. package/run/supervised-run-state.js.map +1 -0
  79. package/run/supervised-run.js +209 -299
  80. package/run/supervised-run.js.map +1 -1
  81. package/sbom.cdx.json +4 -4
  82. package/run/run-orchestrator.d.ts +0 -3
  83. package/run/run-orchestrator.d.ts.map +0 -1
@@ -0,0 +1,127 @@
1
+ import { fork } from 'node:child_process';
2
+ import { realpath } from 'node:fs/promises';
3
+ import { dirname } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ const childEntryPoint = fileURLToPath(new URL('./supervised-child.entry-point.ts', import.meta.url));
6
+ const childRuntimeRoot = dirname(childEntryPoint);
7
+ function sanitizedChildEnvironment(environmentVariables) {
8
+ const environment = Object.fromEntries(Object.entries(environmentVariables).filter(function hasEnvironmentValue(entry) {
9
+ return entry[1] !== undefined;
10
+ }));
11
+ delete environment.NODE_OPTIONS;
12
+ delete environment.NODE_V8_COVERAGE;
13
+ delete environment.NODE_CONFIG;
14
+ delete environment.NODE_CHANNEL_FD;
15
+ delete environment.NODE_UNIQUE_ID;
16
+ return environment;
17
+ }
18
+ async function readPermissionRoots(options) {
19
+ return Array.from(new Set([
20
+ await realpath(options.cwd),
21
+ await realpath(childRuntimeRoot)
22
+ ]));
23
+ }
24
+ async function supervisedChildExecArgv(options) {
25
+ if (options.capabilityRestrictions.mode === 'disabled') {
26
+ return [];
27
+ }
28
+ const permissionRoots = await readPermissionRoots(options);
29
+ return [
30
+ '--permission',
31
+ '--trace-env',
32
+ '--trace-env-js-stack',
33
+ ...permissionRoots.map(function allowRead(root) {
34
+ return `--allow-fs-read=${root}`;
35
+ })
36
+ ];
37
+ }
38
+ export async function startSupervisedChild(options, dependencies) {
39
+ return fork(childEntryPoint, [], {
40
+ cwd: options.cwd,
41
+ env: sanitizedChildEnvironment(dependencies.runtimeCapabilityPolicy.readEnvironment()),
42
+ execArgv: await supervisedChildExecArgv(options),
43
+ stdio: ['ignore', 'pipe', 'pipe', 'ipc']
44
+ });
45
+ }
46
+ function observeChildStdout(runtime) {
47
+ runtime.child.stdout?.on('data', function recordStdoutOutput(chunk) {
48
+ if (chunk.length === 0) {
49
+ return;
50
+ }
51
+ runtime.terminalFailure.write(true);
52
+ runtime.state.recordRuntimePolicyViolation('raw-stdout', 'Runtime policy violation: supervised child wrote to stdout.');
53
+ });
54
+ }
55
+ const ignoredTraceEnvMutationVariables = new Set([
56
+ 'NODE_CHANNEL_FD',
57
+ 'NODE_CHANNEL_SERIALIZATION_MODE',
58
+ 'NODE_V8_COVERAGE',
59
+ 'NODE_UNIQUE_ID'
60
+ ]);
61
+ function traceEnvMutationVariable(line) {
62
+ const match = /^\[--trace-env\] (?:delete|set) "(?<variable>[^"]+)"/u.exec(line);
63
+ return match?.groups?.variable ?? null;
64
+ }
65
+ function traceEnvMutation(line) {
66
+ const variable = traceEnvMutationVariable(line);
67
+ if (variable === null || ignoredTraceEnvMutationVariables.has(variable)) {
68
+ return null;
69
+ }
70
+ if (line.startsWith('[--trace-env] set ')) {
71
+ return {
72
+ capability: 'process-env',
73
+ message: `Runtime policy violation: process.env value was set: ${variable}.`
74
+ };
75
+ }
76
+ return line.startsWith('[--trace-env] delete ')
77
+ ? {
78
+ capability: 'process-env',
79
+ message: `Runtime policy violation: process.env value was deleted: ${variable}.`
80
+ }
81
+ : null;
82
+ }
83
+ function traceEnvStackLine(line) {
84
+ return line.trim() === '' || line === '----- JavaScript stack trace -----' || /^\d+:/u.test(line);
85
+ }
86
+ function recordTraceEnvMutation(mutation, runtime) {
87
+ runtime.terminalFailure.write(true);
88
+ runtime.state.recordRuntimePolicyViolation(mutation.capability, mutation.message);
89
+ }
90
+ function recordRawStderr(runtime) {
91
+ runtime.terminalFailure.write(true);
92
+ runtime.state.recordRuntimePolicyViolation('raw-stderr', 'Runtime policy violation: supervised child wrote to stderr.');
93
+ }
94
+ function ignoredStderrLine(line, readingTraceEnvStack) {
95
+ return line.startsWith('[--trace-env]') || readingTraceEnvStack && traceEnvStackLine(line);
96
+ }
97
+ function recordStderrLine(line, readingTraceEnvStack, runtime) {
98
+ const mutation = traceEnvMutation(line);
99
+ if (mutation !== null) {
100
+ recordTraceEnvMutation(mutation, runtime);
101
+ return true;
102
+ }
103
+ if (ignoredStderrLine(line, readingTraceEnvStack)) {
104
+ return true;
105
+ }
106
+ if (line.trim() !== '') {
107
+ recordRawStderr(runtime);
108
+ }
109
+ return false;
110
+ }
111
+ function observeChildStderr(runtime) {
112
+ let pending = '';
113
+ let readingTraceEnvStack = false;
114
+ runtime.child.stderr?.on('data', function recordStderrOutput(chunk) {
115
+ pending += chunk.toString('utf8');
116
+ const lines = pending.split('\n');
117
+ pending = lines.pop() ?? '';
118
+ for (const line of lines) {
119
+ readingTraceEnvStack = recordStderrLine(line, readingTraceEnvStack, runtime);
120
+ }
121
+ });
122
+ }
123
+ export function observeSupervisedChildOutput(runtime) {
124
+ observeChildStdout(runtime);
125
+ observeChildStderr(runtime);
126
+ }
127
+ //# sourceMappingURL=supervised-child-process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervised-child-process.js","sourceRoot":"","sources":["../../../../source/run/supervised-child-process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import { observedGrowthBytesPerSecond } from "../engine/resource-usage-growth.js";
2
+ const resourceBudgetMetrics = [
3
+ 'activeResourceCount',
4
+ 'javaScriptEngineHeapBytes',
5
+ 'residentSetBytes',
6
+ 'residentSetGrowthBytesPerSecond'
7
+ ];
8
+ const budgetValueReaders = {
9
+ activeResourceCount(sample) {
10
+ return sample.activeResourceCount;
11
+ },
12
+ javaScriptEngineHeapBytes(sample) {
13
+ return sample.javaScriptEngineHeapBytes;
14
+ },
15
+ residentSetBytes(sample) {
16
+ return sample.residentSetBytes;
17
+ },
18
+ residentSetGrowthBytesPerSecond: observedGrowthBytesPerSecond
19
+ };
20
+ function observedBudgetValue(metric, sample, previousSample) {
21
+ return budgetValueReaders[metric](sample, previousSample);
22
+ }
23
+ export function findResourceBudgetBreach(budgets, sample, previousSample) {
24
+ for (const metric of resourceBudgetMetrics) {
25
+ const budget = budgets[metric];
26
+ if (budget !== null) {
27
+ const observed = observedBudgetValue(metric, sample, previousSample);
28
+ if (observed > budget) {
29
+ return { budget, metric, observed, sample };
30
+ }
31
+ }
32
+ }
33
+ return null;
34
+ }
35
+ function activeCaseIds(state) {
36
+ return Array.from(state.activeCases.values(), function toCaseId(testCase) {
37
+ return testCase.id;
38
+ });
39
+ }
40
+ export function resourceExhaustionError(breach, state) {
41
+ const activeCases = activeCaseIds(state);
42
+ const [activeCase = null] = activeCases;
43
+ return {
44
+ attributedTo: activeCases.length === 1 ? activeCase : null,
45
+ cause: {
46
+ ...breach,
47
+ activeCases,
48
+ enforcement: activeCases.length === 0 ? 'post-test-diagnostic' : 'sampled'
49
+ },
50
+ message: `Resource budget exceeded: ${breach.metric} observed ${breach.observed}, budget ${breach.budget}.`,
51
+ subtype: 'resource-exhaustion'
52
+ };
53
+ }
54
+ export function crashError(state, reason) {
55
+ const activeCases = activeCaseIds(state);
56
+ const [activeCase = null] = activeCases;
57
+ return {
58
+ attributedTo: activeCases.length === 1 ? activeCase : null,
59
+ cause: { activeCases, reason },
60
+ message: reason,
61
+ subtype: 'crash'
62
+ };
63
+ }
64
+ //# sourceMappingURL=supervised-run-resource-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervised-run-resource-policy.js","sourceRoot":"","sources":["../../../../source/run/supervised-run-resource-policy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,oCAAoC,CAAC;AAsBlF,MAAM,qBAAqB,GAAoC;IAC3D,qBAAqB;IACrB,2BAA2B;IAC3B,kBAAkB;IAClB,iCAAiC;CACpC,CAAC;AAEF,MAAM,kBAAkB,GAA8D;IAClF,mBAAmB,CAAC,MAAM;QACtB,OAAO,MAAM,CAAC,mBAAmB,CAAC;IACtC,CAAC;IACD,yBAAyB,CAAC,MAAM;QAC5B,OAAO,MAAM,CAAC,yBAAyB,CAAC;IAC5C,CAAC;IACD,gBAAgB,CAAC,MAAM;QACnB,OAAO,MAAM,CAAC,gBAAgB,CAAC;IACnC,CAAC;IACD,+BAA+B,EAAE,4BAA4B;CAChE,CAAC;AAEF,SAAS,mBAAmB,CACxB,MAA4B,EAC5B,MAA6B,EAC7B,cAA4C;IAE5C,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,wBAAwB,CACpC,OAA2B,EAC3B,MAA6B,EAC7B,cAA4C;IAE5C,KAAK,MAAM,MAAM,IAAI,qBAAqB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAE/B,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAClB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;YAErE,IAAI,QAAQ,GAAG,MAAM,EAAE,CAAC;gBACpB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;YAChD,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,KAAyB;IAC5C,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,SAAS,QAAQ,CAAC,QAAQ;QACpE,OAAO,QAAQ,CAAC,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAA4B,EAAE,KAAyB;IAC3F,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,CAAE,UAAU,GAAG,IAAI,CAAE,GAAG,WAAW,CAAC;IAE1C,OAAO;QACH,YAAY,EAAE,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;QAC1D,KAAK,EAAE;YACH,GAAG,MAAM;YACT,WAAW;YACX,WAAW,EAAE,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,SAAS;SAC7E;QACD,OAAO,EAAE,6BAA6B,MAAM,CAAC,MAAM,aAAa,MAAM,CAAC,QAAQ,YAAY,MAAM,CAAC,MAAM,GAAG;QAC3G,OAAO,EAAE,qBAAqB;KACjC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAyB,EAAE,MAAc;IAChE,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,CAAE,UAAU,GAAG,IAAI,CAAE,GAAG,WAAW,CAAC;IAE1C,OAAO;QACH,YAAY,EAAE,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;QAC1D,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE;QAC9B,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,OAAO;KACnB,CAAC;AACN,CAAC"}
@@ -0,0 +1,257 @@
1
+ import { caseIdentityKey } from "../engine/identity.js";
2
+ import { collectedRunCaseIds, createRunResultFromCollectedPlan } from "./collected-run-plan.js";
3
+ import { observeSupervisedChildOutput } from "./supervised-child-process.js";
4
+ import { crashError, findResourceBudgetBreach, resourceExhaustionError } from "./supervised-run-resource-policy.js";
5
+ import { deduplicatedChildRuntimePolicyErrors } from "./supervised-run-state.js";
6
+ function runStartTimeFromMilliseconds(milliseconds) {
7
+ const startedAt = new Date(milliseconds);
8
+ return startedAt.toISOString();
9
+ }
10
+ export function createReporterEventQueue() {
11
+ const eventReports = [];
12
+ return {
13
+ add(eventReport) {
14
+ eventReports.push(eventReport);
15
+ },
16
+ async wait() {
17
+ await Promise.all(eventReports);
18
+ }
19
+ };
20
+ }
21
+ async function recordReporterEventErrors(event, state, context, dependencies) {
22
+ const errors = await dependencies.reporterDispatcher.reportEvent(context.reporters, event, context.outputRenderer);
23
+ if (errors.length > 0) {
24
+ state.recordRunnerErrors(errors);
25
+ }
26
+ }
27
+ function caseByKey(collectedPlan) {
28
+ return new Map(collectedRunCaseIds(collectedPlan).map(function toEntry(id) {
29
+ return [caseIdentityKey(id), { id }];
30
+ }));
31
+ }
32
+ export function applyEvent(event, state, cases) {
33
+ if (event.kind === 'test-start') {
34
+ const testCase = cases.get(caseIdentityKey(event.case));
35
+ if (testCase !== undefined) {
36
+ state.addActiveCase(caseIdentityKey(event.case), testCase);
37
+ }
38
+ }
39
+ else if (event.kind === 'test-end') {
40
+ const key = caseIdentityKey(event.case);
41
+ state.removeActiveCase(key);
42
+ state.recordPerTestResult(key, {
43
+ id: event.case,
44
+ outcome: event.outcome,
45
+ verdict: event.verdict
46
+ });
47
+ }
48
+ else if (event.kind === 'runner-error') {
49
+ state.recordRunnerError(event.error);
50
+ }
51
+ }
52
+ function createPartialRunResult(collectedPlan, state, dependencies, startedAtMs) {
53
+ return createRunResultFromCollectedPlan(collectedPlan, state.perTestResults(), state.runnerErrors(), {
54
+ resourceUsage: null,
55
+ startedAtMs,
56
+ wallClock: dependencies.wallClock
57
+ });
58
+ }
59
+ export function kill(child) {
60
+ if (child.pid !== undefined && child.exitCode === null && child.signalCode === null) {
61
+ child.kill('SIGKILL');
62
+ }
63
+ }
64
+ export function createReporterContext(resolvedRun) {
65
+ return {
66
+ outputRenderer: resolvedRun.config.outputRenderer,
67
+ reporters: resolvedRun.reporters
68
+ };
69
+ }
70
+ export function supervisedCollectedPlan(resolvedRun) {
71
+ if (resolvedRun.plan.kind !== 'supervised') {
72
+ throw new Error('Supervised execution requires a supervised collected plan.');
73
+ }
74
+ return resolvedRun.plan.collectedPlan;
75
+ }
76
+ export function createHardTimeout(runtime) {
77
+ let hardTimeout = null;
78
+ return {
79
+ clear() {
80
+ if (hardTimeout !== null) {
81
+ runtime.dependencies.wallClock.clearTimeout(hardTimeout);
82
+ hardTimeout = null;
83
+ }
84
+ },
85
+ start() {
86
+ if (hardTimeout !== null || runtime.state.activeCases.size === 0) {
87
+ return;
88
+ }
89
+ hardTimeout = runtime.dependencies.wallClock.setTimeout(function killHardTimedOutChild() {
90
+ runtime.terminalFailure.write(true);
91
+ runtime.state.recordRunnerError(crashError(runtime.state, 'Supervised child exceeded hard timeout.'));
92
+ runtime.state.recordTerminalActiveCases('crashed');
93
+ kill(runtime.child);
94
+ }, runtime.resolvedRun.facts.execution.timeoutPolicy.hardMilliseconds);
95
+ }
96
+ };
97
+ }
98
+ function supervisedEngine(resolvedRun) {
99
+ if (resolvedRun.engine.kind === 'instance') {
100
+ throw new Error('Instance engines cannot run in supervised children.');
101
+ }
102
+ return resolvedRun.engine;
103
+ }
104
+ function createRunCommand(resolvedRun) {
105
+ return {
106
+ capabilityRestrictions: resolvedRun.request.capabilityRestrictions,
107
+ collectionTimeoutMilliseconds: resolvedRun.facts.execution.timeoutPolicy.collectionMilliseconds,
108
+ cwd: resolvedRun.cwd,
109
+ engine: supervisedEngine(resolvedRun),
110
+ hardTimeoutMilliseconds: resolvedRun.facts.execution.timeoutPolicy.hardMilliseconds,
111
+ kind: 'run',
112
+ paths: resolvedRun.request.paths,
113
+ resourceBudgets: resolvedRun.facts.execution.resourceUsagePolicy.budgets,
114
+ resourceUsageSamplingIntervalMilliseconds: resolvedRun
115
+ .facts
116
+ .execution
117
+ .resourceUsagePolicy
118
+ .samplingIntervalMilliseconds,
119
+ scheduling: resolvedRun.facts.execution.scheduling,
120
+ timeoutMilliseconds: resolvedRun.facts.execution.timeoutPolicy.softMilliseconds
121
+ };
122
+ }
123
+ export function sendRunCommand(runtime) {
124
+ runtime.child.send(createRunCommand(runtime.resolvedRun));
125
+ }
126
+ export function sendAssignment(runtime) {
127
+ const collectedPlan = runtime.collectedPlan.read() ?? supervisedCollectedPlan(runtime.resolvedRun);
128
+ runtime.child.send({
129
+ assignedCases: collectedRunCaseIds(collectedPlan),
130
+ kind: 'assign'
131
+ });
132
+ }
133
+ function handleChildEvent(event, runtime) {
134
+ const collectedPlan = runtime.collectedPlan.read();
135
+ if (collectedPlan !== null) {
136
+ applyEvent(event, runtime.state, caseByKey(collectedPlan));
137
+ }
138
+ if (event.kind === 'test-start') {
139
+ runtime.timeout.start();
140
+ }
141
+ else if (event.kind === 'test-end' && runtime.state.activeCases.size === 0) {
142
+ runtime.timeout.clear();
143
+ }
144
+ runtime.reporterEvents.add(recordReporterEventErrors(event, runtime.state, runtime.reporterContext, runtime.dependencies));
145
+ }
146
+ function handleResourceBudgetBreach(breach, runtime) {
147
+ runtime.terminalFailure.write(true);
148
+ const error = resourceExhaustionError(breach, runtime.state);
149
+ runtime.state.recordRunnerError(error);
150
+ runtime.reporterEvents.add(recordReporterEventErrors({ error, kind: 'runner-error' }, runtime.state, runtime.reporterContext, runtime.dependencies));
151
+ runtime.state.recordTerminalActiveCases('resource-exhausted');
152
+ runtime.timeout.clear();
153
+ kill(runtime.child);
154
+ }
155
+ function handleChildSample(sample, runtime) {
156
+ if (runtime.terminalFailure.read()) {
157
+ return;
158
+ }
159
+ const breach = findResourceBudgetBreach(runtime.resolvedRun.facts.execution.resourceUsagePolicy.budgets, sample, runtime.previousSample.read());
160
+ runtime.previousSample.write(sample);
161
+ if (breach !== null) {
162
+ handleResourceBudgetBreach(breach, runtime);
163
+ }
164
+ }
165
+ function handleCompletedResult(result, runtime) {
166
+ const supervisorErrors = runtime.state.runnerErrors();
167
+ runtime.completedResult.write({
168
+ ...result,
169
+ runnerErrors: [
170
+ ...supervisorErrors,
171
+ ...deduplicatedChildRuntimePolicyErrors(result.runnerErrors, supervisorErrors)
172
+ ]
173
+ });
174
+ }
175
+ export function handleChildMessage(message, runtime) {
176
+ if (message.kind === 'collected') {
177
+ runtime.collectedPlan.write(message.collectedPlan);
178
+ runtime.state.recordRunnerErrors(message.runnerErrors);
179
+ }
180
+ else if (message.kind === 'event') {
181
+ handleChildEvent(message.event, runtime);
182
+ }
183
+ else if (message.kind === 'sample') {
184
+ handleChildSample(message.sample, runtime);
185
+ }
186
+ else {
187
+ handleCompletedResult(message.result, runtime);
188
+ }
189
+ }
190
+ export function handleCollectionSample(sample, runtime) {
191
+ if (runtime.terminalFailure.read()) {
192
+ return;
193
+ }
194
+ const breach = findResourceBudgetBreach(runtime.command.resourceBudgets, sample, runtime.previousSample.read());
195
+ runtime.previousSample.write(sample);
196
+ if (breach !== null) {
197
+ runtime.terminalFailure.write(true);
198
+ runtime.state.recordRunnerError(resourceExhaustionError(breach, runtime.state));
199
+ kill(runtime.child);
200
+ }
201
+ }
202
+ export async function observeChild(runtime) {
203
+ observeSupervisedChildOutput(runtime);
204
+ return new Promise(function waitForChild(resolve) {
205
+ runtime.child.on('message', function receiveMessage(message) {
206
+ handleChildMessage(message, runtime);
207
+ });
208
+ runtime.child.on('error', function recordChildError(error) {
209
+ if (!runtime.terminalFailure.read()) {
210
+ runtime.terminalFailure.write(true);
211
+ runtime.state.recordRunnerError(crashError(runtime.state, error.message));
212
+ runtime.state.recordTerminalActiveCases('crashed');
213
+ }
214
+ });
215
+ runtime.child.on('exit', function resolveExit() {
216
+ resolve();
217
+ });
218
+ });
219
+ }
220
+ export async function reportRunStart(runtime, collectedPlan, startedAtMs) {
221
+ await recordReporterEventErrors({
222
+ facts: runtime.resolvedRun.facts,
223
+ kind: 'run-start',
224
+ root: {
225
+ metadata: {},
226
+ name: collectedPlan.root.name
227
+ },
228
+ startedAt: runStartTimeFromMilliseconds(startedAtMs)
229
+ }, runtime.state, runtime.reporterContext, runtime.dependencies);
230
+ }
231
+ function selectRunResult(runtime, startedAtMs) {
232
+ const completedResult = runtime.completedResult.read();
233
+ if (completedResult === null) {
234
+ const collectedPlan = runtime.collectedPlan.read() ?? supervisedCollectedPlan(runtime.resolvedRun);
235
+ return createPartialRunResult(collectedPlan, runtime.state, runtime.dependencies, startedAtMs);
236
+ }
237
+ return completedResult;
238
+ }
239
+ async function reportFinalResult(result, runtime) {
240
+ const runEndErrors = await runtime.dependencies.reporterDispatcher.reportEvent(runtime.reporterContext.reporters, { kind: 'run-end', result }, runtime.reporterContext.outputRenderer);
241
+ const resultForFinalReporting = {
242
+ ...result,
243
+ runnerErrors: [...result.runnerErrors, ...runEndErrors]
244
+ };
245
+ const finalReporterErrors = await runtime.dependencies.reporterDispatcher.reportResult(runtime.reporterContext.reporters, resultForFinalReporting, runtime.reporterContext.outputRenderer);
246
+ const disposeErrors = await runtime.dependencies.reporterDispatcher.disposeReporters(runtime.reporterContext.reporters);
247
+ return {
248
+ ...resultForFinalReporting,
249
+ runnerErrors: [...resultForFinalReporting.runnerErrors, ...finalReporterErrors, ...disposeErrors]
250
+ };
251
+ }
252
+ export async function finishSupervisedRuntime(runtime, startedAtMs) {
253
+ runtime.timeout.clear();
254
+ await runtime.reporterEvents.wait();
255
+ return await reportFinalResult(selectRunResult(runtime, startedAtMs), runtime);
256
+ }
257
+ //# sourceMappingURL=supervised-run-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervised-run-runtime.js","sourceRoot":"","sources":["../../../../source/run/supervised-run-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ import { caseIdentityKey } from "../engine/identity.js";
2
+ function terminalResult(testCase, verdict) {
3
+ return {
4
+ id: testCase.id,
5
+ outcome: null,
6
+ verdict
7
+ };
8
+ }
9
+ function createRuntimePolicyError(activeCases, capability, message) {
10
+ const policyActiveCaseIds = Array.from(activeCases.values(), function toCaseId(testCase) {
11
+ return testCase.id;
12
+ });
13
+ const [activeCase = null] = policyActiveCaseIds;
14
+ return {
15
+ attributedTo: policyActiveCaseIds.length === 1 ? activeCase : null,
16
+ cause: {
17
+ activeCases: policyActiveCaseIds,
18
+ capability,
19
+ phase: policyActiveCaseIds.length === 0 ? 'out-of-test' : 'body',
20
+ strictness: 'observed'
21
+ },
22
+ message,
23
+ subtype: 'runtime-policy'
24
+ };
25
+ }
26
+ function processEnvironmentPolicyError(error) {
27
+ const { cause } = error;
28
+ return error.subtype === 'runtime-policy' &&
29
+ typeof cause === 'object' &&
30
+ cause !== null &&
31
+ Reflect.get(cause, 'capability') === 'process-env';
32
+ }
33
+ function processEnvironmentBoundary(error) {
34
+ if (error.attributedTo === null) {
35
+ return 'out-of-test';
36
+ }
37
+ return caseIdentityKey(error.attributedTo);
38
+ }
39
+ function processEnvironmentPolicyKey(error) {
40
+ if (!processEnvironmentPolicyError(error)) {
41
+ return null;
42
+ }
43
+ return `process-env:${processEnvironmentBoundary(error)}`;
44
+ }
45
+ function processEnvironmentPolicyKeys(errors) {
46
+ return new Set(errors.flatMap(function toPolicyKey(error) {
47
+ const key = processEnvironmentPolicyKey(error);
48
+ return key === null ? [] : [key];
49
+ }));
50
+ }
51
+ export function deduplicatedChildRuntimePolicyErrors(childErrors, supervisorErrors) {
52
+ const supervisorKeys = processEnvironmentPolicyKeys(supervisorErrors);
53
+ return childErrors.filter(function notDuplicatedBySupervisor(error) {
54
+ const key = processEnvironmentPolicyKey(error);
55
+ return key === null || !supervisorKeys.has(key);
56
+ });
57
+ }
58
+ export function createStoredRunValue(initialValue) {
59
+ let currentValue = initialValue;
60
+ return {
61
+ read() {
62
+ return currentValue;
63
+ },
64
+ write(value) {
65
+ currentValue = value;
66
+ }
67
+ };
68
+ }
69
+ export function createSupervisedRunState() {
70
+ const activeCases = new Map();
71
+ const perTest = new Map();
72
+ const runnerErrors = [];
73
+ const recordTerminalActiveCases = function recordTerminalActiveCases(verdict) {
74
+ for (const [key, testCase] of activeCases) {
75
+ perTest.set(key, terminalResult(testCase, verdict));
76
+ }
77
+ activeCases.clear();
78
+ };
79
+ return {
80
+ activeCases,
81
+ addActiveCase(key, testCase) {
82
+ activeCases.set(key, testCase);
83
+ },
84
+ perTestResults() {
85
+ return Array.from(perTest.values());
86
+ },
87
+ recordPerTestResult(key, result) {
88
+ perTest.set(key, result);
89
+ },
90
+ recordRunnerError(error) {
91
+ runnerErrors.push(error);
92
+ },
93
+ recordRunnerErrors(errors) {
94
+ runnerErrors.push(...errors);
95
+ },
96
+ recordRuntimePolicyViolation(capability, message) {
97
+ runnerErrors.push(createRuntimePolicyError(activeCases, capability, message));
98
+ recordTerminalActiveCases('runtime-policy');
99
+ },
100
+ recordTerminalActiveCases,
101
+ removeActiveCase(key) {
102
+ activeCases.delete(key);
103
+ },
104
+ runnerErrors() {
105
+ return runnerErrors;
106
+ }
107
+ };
108
+ }
109
+ //# sourceMappingURL=supervised-run-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervised-run-state.js","sourceRoot":"","sources":["../../../../source/run/supervised-run-state.ts"],"names":[],"mappings":"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"}