@midscene/core 1.15.6 → 1.16.1

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 (94) hide show
  1. package/dist/es/agent/agent-options.mjs +36 -0
  2. package/dist/es/agent/agent-options.mjs.map +1 -0
  3. package/dist/es/agent/agent-report-manager.mjs +323 -0
  4. package/dist/es/agent/agent-report-manager.mjs.map +1 -0
  5. package/dist/es/agent/agent.mjs +112 -228
  6. package/dist/es/agent/agent.mjs.map +1 -1
  7. package/dist/es/agent/cache-config.mjs +21 -1
  8. package/dist/es/agent/cache-config.mjs.map +1 -1
  9. package/dist/es/agent/tasks.mjs +3 -1
  10. package/dist/es/agent/tasks.mjs.map +1 -1
  11. package/dist/es/agent/utils.mjs +1 -1
  12. package/dist/es/report-generator.mjs +73 -33
  13. package/dist/es/report-generator.mjs.map +1 -1
  14. package/dist/es/report-html-template.mjs +1 -1
  15. package/dist/es/test-runner/engine/document-runtime.mjs +30 -24
  16. package/dist/es/test-runner/engine/document-runtime.mjs.map +1 -1
  17. package/dist/es/test-runner/engine/project-runtime.mjs +17 -11
  18. package/dist/es/test-runner/engine/project-runtime.mjs.map +1 -1
  19. package/dist/es/test-runner/engine/resource-operations.mjs +33 -8
  20. package/dist/es/test-runner/engine/resource-operations.mjs.map +1 -1
  21. package/dist/es/test-runner/engine/run-collected-case.mjs +1 -0
  22. package/dist/es/test-runner/engine/run-collected-case.mjs.map +1 -1
  23. package/dist/es/test-runner/engine/run-workflow-document.mjs +3 -0
  24. package/dist/es/test-runner/engine/run-workflow-document.mjs.map +1 -1
  25. package/dist/es/test-runner/engine/setup-timeout.mjs +37 -0
  26. package/dist/es/test-runner/engine/setup-timeout.mjs.map +1 -0
  27. package/dist/es/utils.mjs +1 -1
  28. package/dist/es/yaml/execution-session.mjs +2 -1
  29. package/dist/es/yaml/execution-session.mjs.map +1 -1
  30. package/dist/es/yaml/legacy-yaml-report.mjs +1 -1
  31. package/dist/es/yaml/legacy-yaml-report.mjs.map +1 -1
  32. package/dist/es/yaml/player.mjs +17 -3
  33. package/dist/es/yaml/player.mjs.map +1 -1
  34. package/dist/lib/agent/agent-options.js +73 -0
  35. package/dist/lib/agent/agent-options.js.map +1 -0
  36. package/dist/lib/agent/agent-report-manager.js +357 -0
  37. package/dist/lib/agent/agent-report-manager.js.map +1 -0
  38. package/dist/lib/agent/agent.js +110 -226
  39. package/dist/lib/agent/agent.js.map +1 -1
  40. package/dist/lib/agent/cache-config.js +23 -0
  41. package/dist/lib/agent/cache-config.js.map +1 -1
  42. package/dist/lib/agent/tasks.js +3 -1
  43. package/dist/lib/agent/tasks.js.map +1 -1
  44. package/dist/lib/agent/utils.js +1 -1
  45. package/dist/lib/report-generator.js +73 -33
  46. package/dist/lib/report-generator.js.map +1 -1
  47. package/dist/lib/report-html-template.js +1 -1
  48. package/dist/lib/test-runner/engine/document-runtime.js +30 -24
  49. package/dist/lib/test-runner/engine/document-runtime.js.map +1 -1
  50. package/dist/lib/test-runner/engine/project-runtime.js +17 -11
  51. package/dist/lib/test-runner/engine/project-runtime.js.map +1 -1
  52. package/dist/lib/test-runner/engine/resource-operations.js +36 -8
  53. package/dist/lib/test-runner/engine/resource-operations.js.map +1 -1
  54. package/dist/lib/test-runner/engine/run-collected-case.js +1 -0
  55. package/dist/lib/test-runner/engine/run-collected-case.js.map +1 -1
  56. package/dist/lib/test-runner/engine/run-workflow-document.js +3 -0
  57. package/dist/lib/test-runner/engine/run-workflow-document.js.map +1 -1
  58. package/dist/lib/test-runner/engine/setup-timeout.js +71 -0
  59. package/dist/lib/test-runner/engine/setup-timeout.js.map +1 -0
  60. package/dist/lib/utils.js +1 -1
  61. package/dist/lib/yaml/execution-session.js +4 -0
  62. package/dist/lib/yaml/execution-session.js.map +1 -1
  63. package/dist/lib/yaml/legacy-yaml-report.js +1 -1
  64. package/dist/lib/yaml/legacy-yaml-report.js.map +1 -1
  65. package/dist/lib/yaml/player.js +16 -2
  66. package/dist/lib/yaml/player.js.map +1 -1
  67. package/dist/types/agent/agent-options.d.ts +4 -0
  68. package/dist/types/agent/agent-options.d.ts.map +1 -0
  69. package/dist/types/agent/agent-report-manager.d.ts +92 -0
  70. package/dist/types/agent/agent-report-manager.d.ts.map +1 -0
  71. package/dist/types/agent/agent.d.ts +31 -24
  72. package/dist/types/agent/agent.d.ts.map +1 -1
  73. package/dist/types/agent/cache-config.d.ts +10 -0
  74. package/dist/types/agent/cache-config.d.ts.map +1 -1
  75. package/dist/types/agent/tasks.d.ts +1 -0
  76. package/dist/types/agent/tasks.d.ts.map +1 -1
  77. package/dist/types/report-generator.d.ts +5 -1
  78. package/dist/types/report-generator.d.ts.map +1 -1
  79. package/dist/types/test-runner/engine/document-runtime.d.ts.map +1 -1
  80. package/dist/types/test-runner/engine/project-runtime.d.ts.map +1 -1
  81. package/dist/types/test-runner/engine/resource-operations.d.ts +5 -0
  82. package/dist/types/test-runner/engine/resource-operations.d.ts.map +1 -1
  83. package/dist/types/test-runner/engine/run-collected-case.d.ts.map +1 -1
  84. package/dist/types/test-runner/engine/run-workflow-document.d.ts.map +1 -1
  85. package/dist/types/test-runner/engine/setup-timeout.d.ts +3 -0
  86. package/dist/types/test-runner/engine/setup-timeout.d.ts.map +1 -0
  87. package/dist/types/test-runner/engine/types.d.ts +7 -0
  88. package/dist/types/test-runner/engine/types.d.ts.map +1 -1
  89. package/dist/types/test-runner/project.d.ts +22 -0
  90. package/dist/types/test-runner/project.d.ts.map +1 -1
  91. package/dist/types/yaml/execution-session.d.ts +2 -0
  92. package/dist/types/yaml/execution-session.d.ts.map +1 -1
  93. package/dist/types/yaml/player.d.ts.map +1 -1
  94. package/package.json +2 -2
@@ -35,6 +35,7 @@ const external_execution_failure_js_namespaceObject = require("./execution-failu
35
35
  const external_resource_operations_js_namespaceObject = require("./resource-operations.js");
36
36
  const external_result_metadata_js_namespaceObject = require("./result-metadata.js");
37
37
  const external_scope_teardown_js_namespaceObject = require("./scope-teardown.js");
38
+ const external_setup_timeout_js_namespaceObject = require("./setup-timeout.js");
38
39
  function createDocumentRuntime(document, options) {
39
40
  const documentRunId = options.createDocumentRunId?.() ?? (0, utils_namespaceObject.uuid)();
40
41
  const plan = options.plan ?? (0, test_plan_js_namespaceObject.buildTestRunReportPlan)(document, {
@@ -200,36 +201,40 @@ function createDocumentRuntime(document, options) {
200
201
  if (!signal.aborted && options.documentSetup) {
201
202
  acceptingSetupTeardowns = true;
202
203
  try {
203
- context = await options.documentSetup.setup({
204
- project,
205
- projectContext: options.projectContext,
206
- document: {
207
- documentId: document.documentId,
208
- documentRunId,
209
- sourcePath: document.sourcePath,
210
- attemptIndex: options.documentAttemptIndex ?? 0
211
- },
212
- signal,
213
- onTeardown (teardown) {
214
- if (!acceptingSetupTeardowns || 'function' != typeof teardown) throw new external_errors_js_namespaceObject.WorkflowLifecycleError('Document setup onTeardown() requires a function registered during setup.', {
215
- documentId: document.documentId,
216
- documentRunId
217
- });
218
- nodeTeardownStack.push({
219
- registrationIndex: nodeTeardownStack.length,
220
- node: options.documentSetup.name,
221
- teardown,
222
- host: true
204
+ await (0, external_setup_timeout_js_namespaceObject.runSetupWithTimeout)(async ()=>{
205
+ try {
206
+ context = await options.documentSetup.setup({
207
+ project,
208
+ projectContext: options.projectContext,
209
+ document: {
210
+ documentId: document.documentId,
211
+ documentRunId,
212
+ sourcePath: document.sourcePath,
213
+ attemptIndex: options.documentAttemptIndex ?? 0
214
+ },
215
+ signal,
216
+ onTeardown (teardown) {
217
+ if (!acceptingSetupTeardowns || 'function' != typeof teardown) throw new external_errors_js_namespaceObject.WorkflowLifecycleError('Document setup onTeardown() requires a function registered during setup.', {
218
+ documentId: document.documentId,
219
+ documentRunId
220
+ });
221
+ nodeTeardownStack.push({
222
+ registrationIndex: nodeTeardownStack.length,
223
+ node: options.documentSetup.name,
224
+ teardown,
225
+ host: true
226
+ });
227
+ }
223
228
  });
229
+ } finally{
230
+ acceptingSetupTeardowns = false;
224
231
  }
225
- });
232
+ }, signal, resourceScope.abort, options.setupTimeoutMs);
226
233
  } catch (error) {
227
234
  hostErrors.push({
228
235
  phase: 'setup',
229
236
  error: (0, external_execution_failure_js_namespaceObject.asExecutionError)(error)
230
237
  });
231
- } finally{
232
- acceptingSetupTeardowns = false;
233
238
  }
234
239
  }
235
240
  try {
@@ -286,7 +291,8 @@ function createDocumentRuntime(document, options) {
286
291
  }
287
292
  };
288
293
  try {
289
- if (document.lifecycle.afterAll.length || nodeTeardownStack.length) await (0, external_resource_operations_js_namespaceObject.cleanupScopeResources)(signal, cleanup, {
294
+ if (document.lifecycle.afterAll.length || nodeTeardownStack.length || void 0 !== options.setupTimeoutMs && (0, external_resource_operations_js_namespaceObject.getPendingScopeOperations)(signal).length) await (0, external_resource_operations_js_namespaceObject.cleanupScopeResources)(signal, cleanup, {
295
+ totalTimeoutMs: options.teardownTimeoutMs?.(),
290
296
  beforeCleanup: async (cleanupSignal)=>{
291
297
  try {
292
298
  if (!hostErrors.some((error)=>'setup' === error.phase)) await runPhase('afterAll', afterAll, cleanupSignal);
@@ -1 +1 @@
1
- {"version":3,"file":"test-runner/engine/document-runtime.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../../src/test-runner/engine/document-runtime.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { getDebug } from '@midscene/shared/logger';\nimport { uuid as randomUUID } from '@midscene/shared/utils';\nimport {\n NodeScopeTeardownError,\n type WorkflowError,\n WorkflowLifecycleError,\n} from '../errors';\nimport type { CollectedWorkflowDocument } from '../parser/types';\nimport { buildTestRunReportPlan } from '../reporting/test-plan';\nimport { executeStep } from './execute-step';\nimport {\n WorkflowExecutionFailure,\n asExecutionError,\n} from './execution-failure';\nimport {\n ResourceCleanupDeferredError,\n cleanupScopeResources,\n createResourceScope,\n getPendingScopeOperations,\n getResourceCleanupSnapshot,\n recoverCancelledScopeResources,\n setResourceOperationIdentity,\n} from './resource-operations';\nimport { phaseResult } from './result-metadata';\nimport { reportPathsFromTeardown } from './scope-teardown';\nimport type {\n CreateDocumentRuntimeOptions,\n DocumentNodePhase,\n NodeDocumentContext,\n NodeScopeTeardown,\n StepRunResult,\n WorkflowDocumentRunResult,\n WorkflowDocumentRuntime,\n WorkflowHostError,\n} from './types';\n\nexport function createDocumentRuntime<TContext = undefined>(\n document: CollectedWorkflowDocument,\n options: CreateDocumentRuntimeOptions<TContext>,\n): WorkflowDocumentRuntime<TContext> {\n const documentRunId = options.createDocumentRunId?.() ?? randomUUID();\n const plan =\n options.plan ??\n buildTestRunReportPlan(document, {\n defaultTimeoutMs: options.defaultTimeoutMs,\n retry: { scope: 'case', count: options.project?.retry ?? 0 },\n });\n const startedAt = new Date();\n const beforeAll: StepRunResult[] = [];\n const afterAll: StepRunResult[] = [];\n const nodes = {\n beforeAll: document.lifecycle.beforeAll.map((step) =>\n options.resolveNode(step.node),\n ),\n afterAll: document.lifecycle.afterAll.map((step) =>\n options.resolveNode(step.node),\n ),\n };\n const project =\n options.project ??\n Object.freeze({\n projectId: document.projectId,\n name: document.projectId,\n retry: 0,\n });\n let context = options.projectContext as TContext;\n const resourceScope = createResourceScope(options.signal);\n const signal = resourceScope.signal;\n setResourceOperationIdentity(signal, { scopeId: documentRunId });\n const nodeTeardownStack: Array<{\n registrationIndex: number;\n node: string;\n teardown: NodeScopeTeardown;\n host?: boolean;\n }> = [];\n let acceptingNodeTeardowns = true;\n let started = false;\n let finishedResult: WorkflowDocumentRunResult | undefined;\n let finishPromise: Promise<WorkflowDocumentRunResult> | undefined;\n const reportPaths = new Set<string>();\n const reportSources: import('./types').WorkflowReportSource[] = [];\n const capturedSources = new Map<\n string,\n import('./types').WorkflowReportSource\n >();\n const executionErrors: unknown[] = [];\n const hostErrors: WorkflowHostError[] = [];\n let acceptingSetupTeardowns = false;\n\n const createResult = (\n teardownErrors: WorkflowError[] = [],\n ): WorkflowDocumentRunResult => {\n const endedAt = new Date();\n const cleanup = getResourceCleanupSnapshot(signal);\n const pendingOperations = getPendingScopeOperations(signal);\n const phaseResults = {\n beforeAll: phaseResult(document.lifecycle.beforeAll.length, beforeAll),\n afterAll: phaseResult(document.lifecycle.afterAll.length, afterAll),\n };\n return {\n plan,\n documentId: document.documentId,\n documentRunId,\n ...(options.documentAttemptIndex === undefined\n ? {}\n : { attemptIndex: options.documentAttemptIndex }),\n projectId: document.projectId,\n projectName: project.name,\n sourcePath: document.sourcePath,\n status:\n executionErrors.length > 0 ||\n hostErrors.length > 0 ||\n beforeAll.some((step) => step.status !== 'success') ||\n afterAll.some((step) => step.status !== 'success') ||\n cleanup.status === 'pending' ||\n cleanup.status === 'failed' ||\n pendingOperations.length > 0 ||\n teardownErrors.length > 0\n ? 'failed'\n : 'success',\n executionStatus: Object.values(phaseResults).some(\n (phase) => phase.status === 'failed',\n )\n ? 'failed'\n : Object.values(phaseResults).some(\n (phase) => phase.status === 'not-run',\n ) ||\n hostErrors.some(({ phase }) => phase === 'setup') ||\n (signal.aborted && !beforeAll.length && !afterAll.length)\n ? 'not-run'\n : 'success',\n phases: phaseResults,\n cleanup,\n ...(pendingOperations.length ? { pendingOperations } : {}),\n startedAt: startedAt.toISOString(),\n endedAt: endedAt.toISOString(),\n durationMs: Math.max(0, endedAt.getTime() - startedAt.getTime()),\n beforeAll: [...beforeAll],\n afterAll: [...afterAll],\n ...(executionErrors.length\n ? {\n executionErrors: executionErrors\n .filter(\n (error) => !hostErrors.some((host) => host.error === error),\n )\n .map(asExecutionError),\n }\n : {}),\n ...(hostErrors.length ? { hostErrors: [...hostErrors] } : {}),\n ...(teardownErrors.length > 0\n ? { teardownErrors: [...teardownErrors] }\n : {}),\n ...(reportPaths.size > 0 ? { reportPaths: [...reportPaths] } : {}),\n ...(capturedSources.size || reportSources.length\n ? { reportSources: [...capturedSources.values(), ...reportSources] }\n : {}),\n };\n };\n\n const runPhase = async (\n phase: DocumentNodePhase,\n results: StepRunResult[],\n executionSignal = signal,\n ): Promise<void> => {\n for (const [stepIndex, step] of document.lifecycle[phase].entries()) {\n const waitForPreviousOperationMs =\n stepIndex > 0\n ? await recoverCancelledScopeResources(executionSignal)\n : 0;\n const documentContext: NodeDocumentContext = {\n documentId: document.documentId,\n documentRunId,\n projectId: document.projectId,\n projectName: project.name,\n sourcePath: document.sourcePath,\n phase,\n stepIndex,\n };\n const stepInfo = {\n scope: 'document' as const,\n node: step.node,\n stepCount: document.lifecycle[phase].length,\n document: documentContext,\n };\n await options.onStepStart?.(stepInfo);\n const result = await executeStep(\n step,\n nodes[phase][stepIndex],\n { scope: 'document', document: documentContext },\n context,\n {\n signal: executionSignal,\n defaultTimeoutMs: options.defaultTimeoutMs,\n onTeardown(node, teardown) {\n if (!acceptingNodeTeardowns) {\n throw new WorkflowLifecycleError(\n 'Node teardown can only be registered while a workflow document is running.',\n { documentId: document.documentId, documentRunId, node },\n );\n }\n if (typeof teardown !== 'function') {\n throw new WorkflowLifecycleError(\n 'Node onTeardown() requires a teardown function.',\n { documentId: document.documentId, documentRunId, node },\n );\n }\n nodeTeardownStack.push({\n registrationIndex: nodeTeardownStack.length,\n node,\n teardown,\n });\n },\n },\n );\n if (waitForPreviousOperationMs > 0)\n result.waitForPreviousOperationMs = waitForPreviousOperationMs;\n results.push(result);\n for (const source of result.report?.sources ?? [])\n capturedSources.set(\n `${source.sourcePath}\\u0000${source.dumpPath ?? ''}`,\n source,\n );\n await options.onStepResult?.(stepInfo, result);\n if (result.status !== 'success' && !result.continuedAfterError) break;\n }\n };\n\n return {\n signal,\n get context() {\n return context;\n },\n get canRunCases() {\n return (\n started &&\n executionErrors.length === 0 &&\n hostErrors.length === 0 &&\n !signal.aborted &&\n !beforeAll.some((step) => step.status !== 'success')\n );\n },\n async start() {\n if (started) {\n throw new WorkflowLifecycleError(\n 'Workflow document runtime has already started.',\n { documentId: document.documentId, documentRunId },\n );\n }\n started = true;\n if (!signal.aborted && options.documentSetup) {\n acceptingSetupTeardowns = true;\n try {\n context = await options.documentSetup.setup({\n project,\n projectContext: options.projectContext,\n document: {\n documentId: document.documentId,\n documentRunId,\n sourcePath: document.sourcePath,\n attemptIndex: options.documentAttemptIndex ?? 0,\n },\n signal,\n onTeardown(teardown) {\n if (!acceptingSetupTeardowns || typeof teardown !== 'function')\n throw new WorkflowLifecycleError(\n 'Document setup onTeardown() requires a function registered during setup.',\n { documentId: document.documentId, documentRunId },\n );\n nodeTeardownStack.push({\n registrationIndex: nodeTeardownStack.length,\n node: options.documentSetup!.name,\n teardown,\n host: true,\n });\n },\n });\n } catch (error) {\n hostErrors.push({ phase: 'setup', error: asExecutionError(error) });\n } finally {\n acceptingSetupTeardowns = false;\n }\n }\n try {\n if (!signal.aborted && !hostErrors.length)\n await runPhase('beforeAll', beforeAll);\n } catch (error) {\n executionErrors.push(error);\n throw new WorkflowExecutionFailure(createResult(), [\n ...executionErrors,\n ]);\n }\n return createResult();\n },\n async finish() {\n if (finishPromise) return finishPromise;\n if (!started) {\n throw new WorkflowLifecycleError(\n 'Workflow document runtime must start before it can finish.',\n { documentId: document.documentId, documentRunId },\n );\n }\n finishPromise = (async () => {\n const teardownErrors: WorkflowError[] = [];\n const cleanupExecutionErrors: unknown[] = [];\n let deferredCleanup = false;\n const cleanup = async () => {\n const priorTeardownErrors = teardownErrors.length;\n acceptingNodeTeardowns = false;\n for (const {\n registrationIndex,\n node,\n teardown,\n host,\n } of nodeTeardownStack.reverse()) {\n try {\n const released = await teardown();\n reportSources.push(...(released?.reportSources ?? []));\n for (const path of reportPathsFromTeardown(released)) {\n reportPaths.add(path);\n }\n } catch (error) {\n if (host) {\n const failure = asExecutionError(error);\n hostErrors.push({\n phase: 'cleanup',\n error: failure,\n });\n executionErrors.push(failure);\n cleanupExecutionErrors.push(error);\n continue;\n }\n teardownErrors.push(\n new NodeScopeTeardownError(error, {\n scope: 'document',\n scopeId: documentRunId,\n node,\n registrationIndex,\n }),\n );\n }\n }\n {\n const errors = [\n ...cleanupExecutionErrors,\n ...teardownErrors.slice(priorTeardownErrors),\n ];\n if (errors.length)\n throw new AggregateError(errors, 'Document cleanup failed');\n }\n };\n try {\n if (document.lifecycle.afterAll.length || nodeTeardownStack.length)\n await cleanupScopeResources(signal, cleanup, {\n beforeCleanup: async (cleanupSignal) => {\n try {\n if (!hostErrors.some((error) => error.phase === 'setup'))\n await runPhase('afterAll', afterAll, cleanupSignal);\n } catch (error) {\n executionErrors.push(error);\n cleanupExecutionErrors.push(error);\n }\n },\n onDeferredError: (error) =>\n getDebug('runner:cleanup', { console: true })(\n `Deferred document cleanup failed: ${String(error)}`,\n ),\n });\n else acceptingNodeTeardowns = false;\n } catch (error) {\n deferredCleanup = error instanceof ResourceCleanupDeferredError;\n if (!deferredCleanup) acceptingNodeTeardowns = false;\n if (\n !deferredCleanup &&\n !teardownErrors.length &&\n !cleanupExecutionErrors.length\n )\n teardownErrors.push(\n new NodeScopeTeardownError(error, {\n scope: 'document',\n scopeId: documentRunId,\n node: 'resource-drain',\n registrationIndex: -1,\n }),\n );\n }\n finishedResult = createResult(teardownErrors);\n try {\n await options.onResult?.(finishedResult);\n } catch (error) {\n executionErrors.push(error);\n finishedResult = createResult(teardownErrors);\n }\n resourceScope.dispose();\n if (executionErrors.length)\n throw new WorkflowExecutionFailure(finishedResult, [\n ...executionErrors,\n ]);\n return finishedResult;\n })();\n return finishPromise;\n },\n };\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","createDocumentRuntime","document","options","documentRunId","randomUUID","plan","buildTestRunReportPlan","startedAt","Date","beforeAll","afterAll","nodes","step","project","context","resourceScope","createResourceScope","signal","setResourceOperationIdentity","nodeTeardownStack","acceptingNodeTeardowns","started","finishedResult","finishPromise","reportPaths","Set","reportSources","capturedSources","Map","executionErrors","hostErrors","acceptingSetupTeardowns","createResult","teardownErrors","endedAt","cleanup","getResourceCleanupSnapshot","pendingOperations","getPendingScopeOperations","phaseResults","phaseResult","undefined","phase","Math","error","host","asExecutionError","runPhase","results","executionSignal","stepIndex","waitForPreviousOperationMs","recoverCancelledScopeResources","documentContext","stepInfo","result","executeStep","node","teardown","WorkflowLifecycleError","source","WorkflowExecutionFailure","cleanupExecutionErrors","deferredCleanup","priorTeardownErrors","registrationIndex","released","path","reportPathsFromTeardown","failure","NodeScopeTeardownError","errors","AggregateError","cleanupScopeResources","cleanupSignal","getDebug","String","ResourceCleanupDeferredError"],"mappings":"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"}
1
+ {"version":3,"file":"test-runner/engine/document-runtime.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../../src/test-runner/engine/document-runtime.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { getDebug } from '@midscene/shared/logger';\nimport { uuid as randomUUID } from '@midscene/shared/utils';\nimport {\n NodeScopeTeardownError,\n type WorkflowError,\n WorkflowLifecycleError,\n} from '../errors';\nimport type { CollectedWorkflowDocument } from '../parser/types';\nimport { buildTestRunReportPlan } from '../reporting/test-plan';\nimport { executeStep } from './execute-step';\nimport {\n WorkflowExecutionFailure,\n asExecutionError,\n} from './execution-failure';\nimport {\n ResourceCleanupDeferredError,\n cleanupScopeResources,\n createResourceScope,\n getPendingScopeOperations,\n getResourceCleanupSnapshot,\n recoverCancelledScopeResources,\n setResourceOperationIdentity,\n} from './resource-operations';\nimport { phaseResult } from './result-metadata';\nimport { reportPathsFromTeardown } from './scope-teardown';\nimport { runSetupWithTimeout } from './setup-timeout';\nimport type {\n CreateDocumentRuntimeOptions,\n DocumentNodePhase,\n NodeDocumentContext,\n NodeScopeTeardown,\n StepRunResult,\n WorkflowDocumentRunResult,\n WorkflowDocumentRuntime,\n WorkflowHostError,\n} from './types';\n\nexport function createDocumentRuntime<TContext = undefined>(\n document: CollectedWorkflowDocument,\n options: CreateDocumentRuntimeOptions<TContext>,\n): WorkflowDocumentRuntime<TContext> {\n const documentRunId = options.createDocumentRunId?.() ?? randomUUID();\n const plan =\n options.plan ??\n buildTestRunReportPlan(document, {\n defaultTimeoutMs: options.defaultTimeoutMs,\n retry: { scope: 'case', count: options.project?.retry ?? 0 },\n });\n const startedAt = new Date();\n const beforeAll: StepRunResult[] = [];\n const afterAll: StepRunResult[] = [];\n const nodes = {\n beforeAll: document.lifecycle.beforeAll.map((step) =>\n options.resolveNode(step.node),\n ),\n afterAll: document.lifecycle.afterAll.map((step) =>\n options.resolveNode(step.node),\n ),\n };\n const project =\n options.project ??\n Object.freeze({\n projectId: document.projectId,\n name: document.projectId,\n retry: 0,\n });\n let context = options.projectContext as TContext;\n const resourceScope = createResourceScope(options.signal);\n const signal = resourceScope.signal;\n setResourceOperationIdentity(signal, { scopeId: documentRunId });\n const nodeTeardownStack: Array<{\n registrationIndex: number;\n node: string;\n teardown: NodeScopeTeardown;\n host?: boolean;\n }> = [];\n let acceptingNodeTeardowns = true;\n let started = false;\n let finishedResult: WorkflowDocumentRunResult | undefined;\n let finishPromise: Promise<WorkflowDocumentRunResult> | undefined;\n const reportPaths = new Set<string>();\n const reportSources: import('./types').WorkflowReportSource[] = [];\n const capturedSources = new Map<\n string,\n import('./types').WorkflowReportSource\n >();\n const executionErrors: unknown[] = [];\n const hostErrors: WorkflowHostError[] = [];\n let acceptingSetupTeardowns = false;\n\n const createResult = (\n teardownErrors: WorkflowError[] = [],\n ): WorkflowDocumentRunResult => {\n const endedAt = new Date();\n const cleanup = getResourceCleanupSnapshot(signal);\n const pendingOperations = getPendingScopeOperations(signal);\n const phaseResults = {\n beforeAll: phaseResult(document.lifecycle.beforeAll.length, beforeAll),\n afterAll: phaseResult(document.lifecycle.afterAll.length, afterAll),\n };\n return {\n plan,\n documentId: document.documentId,\n documentRunId,\n ...(options.documentAttemptIndex === undefined\n ? {}\n : { attemptIndex: options.documentAttemptIndex }),\n projectId: document.projectId,\n projectName: project.name,\n sourcePath: document.sourcePath,\n status:\n executionErrors.length > 0 ||\n hostErrors.length > 0 ||\n beforeAll.some((step) => step.status !== 'success') ||\n afterAll.some((step) => step.status !== 'success') ||\n cleanup.status === 'pending' ||\n cleanup.status === 'failed' ||\n pendingOperations.length > 0 ||\n teardownErrors.length > 0\n ? 'failed'\n : 'success',\n executionStatus: Object.values(phaseResults).some(\n (phase) => phase.status === 'failed',\n )\n ? 'failed'\n : Object.values(phaseResults).some(\n (phase) => phase.status === 'not-run',\n ) ||\n hostErrors.some(({ phase }) => phase === 'setup') ||\n (signal.aborted && !beforeAll.length && !afterAll.length)\n ? 'not-run'\n : 'success',\n phases: phaseResults,\n cleanup,\n ...(pendingOperations.length ? { pendingOperations } : {}),\n startedAt: startedAt.toISOString(),\n endedAt: endedAt.toISOString(),\n durationMs: Math.max(0, endedAt.getTime() - startedAt.getTime()),\n beforeAll: [...beforeAll],\n afterAll: [...afterAll],\n ...(executionErrors.length\n ? {\n executionErrors: executionErrors\n .filter(\n (error) => !hostErrors.some((host) => host.error === error),\n )\n .map(asExecutionError),\n }\n : {}),\n ...(hostErrors.length ? { hostErrors: [...hostErrors] } : {}),\n ...(teardownErrors.length > 0\n ? { teardownErrors: [...teardownErrors] }\n : {}),\n ...(reportPaths.size > 0 ? { reportPaths: [...reportPaths] } : {}),\n ...(capturedSources.size || reportSources.length\n ? { reportSources: [...capturedSources.values(), ...reportSources] }\n : {}),\n };\n };\n\n const runPhase = async (\n phase: DocumentNodePhase,\n results: StepRunResult[],\n executionSignal = signal,\n ): Promise<void> => {\n for (const [stepIndex, step] of document.lifecycle[phase].entries()) {\n const waitForPreviousOperationMs =\n stepIndex > 0\n ? await recoverCancelledScopeResources(executionSignal)\n : 0;\n const documentContext: NodeDocumentContext = {\n documentId: document.documentId,\n documentRunId,\n projectId: document.projectId,\n projectName: project.name,\n sourcePath: document.sourcePath,\n phase,\n stepIndex,\n };\n const stepInfo = {\n scope: 'document' as const,\n node: step.node,\n stepCount: document.lifecycle[phase].length,\n document: documentContext,\n };\n await options.onStepStart?.(stepInfo);\n const result = await executeStep(\n step,\n nodes[phase][stepIndex],\n { scope: 'document', document: documentContext },\n context,\n {\n signal: executionSignal,\n defaultTimeoutMs: options.defaultTimeoutMs,\n onTeardown(node, teardown) {\n if (!acceptingNodeTeardowns) {\n throw new WorkflowLifecycleError(\n 'Node teardown can only be registered while a workflow document is running.',\n { documentId: document.documentId, documentRunId, node },\n );\n }\n if (typeof teardown !== 'function') {\n throw new WorkflowLifecycleError(\n 'Node onTeardown() requires a teardown function.',\n { documentId: document.documentId, documentRunId, node },\n );\n }\n nodeTeardownStack.push({\n registrationIndex: nodeTeardownStack.length,\n node,\n teardown,\n });\n },\n },\n );\n if (waitForPreviousOperationMs > 0)\n result.waitForPreviousOperationMs = waitForPreviousOperationMs;\n results.push(result);\n for (const source of result.report?.sources ?? [])\n capturedSources.set(\n `${source.sourcePath}\\u0000${source.dumpPath ?? ''}`,\n source,\n );\n await options.onStepResult?.(stepInfo, result);\n if (result.status !== 'success' && !result.continuedAfterError) break;\n }\n };\n\n return {\n signal,\n get context() {\n return context;\n },\n get canRunCases() {\n return (\n started &&\n executionErrors.length === 0 &&\n hostErrors.length === 0 &&\n !signal.aborted &&\n !beforeAll.some((step) => step.status !== 'success')\n );\n },\n async start() {\n if (started) {\n throw new WorkflowLifecycleError(\n 'Workflow document runtime has already started.',\n { documentId: document.documentId, documentRunId },\n );\n }\n started = true;\n if (!signal.aborted && options.documentSetup) {\n acceptingSetupTeardowns = true;\n try {\n await runSetupWithTimeout(\n async () => {\n try {\n context = await options.documentSetup!.setup({\n project,\n projectContext: options.projectContext,\n document: {\n documentId: document.documentId,\n documentRunId,\n sourcePath: document.sourcePath,\n attemptIndex: options.documentAttemptIndex ?? 0,\n },\n signal,\n onTeardown(teardown) {\n if (\n !acceptingSetupTeardowns ||\n typeof teardown !== 'function'\n )\n throw new WorkflowLifecycleError(\n 'Document setup onTeardown() requires a function registered during setup.',\n { documentId: document.documentId, documentRunId },\n );\n nodeTeardownStack.push({\n registrationIndex: nodeTeardownStack.length,\n node: options.documentSetup!.name,\n teardown,\n host: true,\n });\n },\n });\n } finally {\n acceptingSetupTeardowns = false;\n }\n },\n signal,\n resourceScope.abort,\n options.setupTimeoutMs,\n );\n } catch (error) {\n hostErrors.push({ phase: 'setup', error: asExecutionError(error) });\n }\n }\n try {\n if (!signal.aborted && !hostErrors.length)\n await runPhase('beforeAll', beforeAll);\n } catch (error) {\n executionErrors.push(error);\n throw new WorkflowExecutionFailure(createResult(), [\n ...executionErrors,\n ]);\n }\n return createResult();\n },\n async finish() {\n if (finishPromise) return finishPromise;\n if (!started) {\n throw new WorkflowLifecycleError(\n 'Workflow document runtime must start before it can finish.',\n { documentId: document.documentId, documentRunId },\n );\n }\n finishPromise = (async () => {\n const teardownErrors: WorkflowError[] = [];\n const cleanupExecutionErrors: unknown[] = [];\n let deferredCleanup = false;\n const cleanup = async () => {\n const priorTeardownErrors = teardownErrors.length;\n acceptingNodeTeardowns = false;\n for (const {\n registrationIndex,\n node,\n teardown,\n host,\n } of nodeTeardownStack.reverse()) {\n try {\n const released = await teardown();\n reportSources.push(...(released?.reportSources ?? []));\n for (const path of reportPathsFromTeardown(released)) {\n reportPaths.add(path);\n }\n } catch (error) {\n if (host) {\n const failure = asExecutionError(error);\n hostErrors.push({\n phase: 'cleanup',\n error: failure,\n });\n executionErrors.push(failure);\n cleanupExecutionErrors.push(error);\n continue;\n }\n teardownErrors.push(\n new NodeScopeTeardownError(error, {\n scope: 'document',\n scopeId: documentRunId,\n node,\n registrationIndex,\n }),\n );\n }\n }\n {\n const errors = [\n ...cleanupExecutionErrors,\n ...teardownErrors.slice(priorTeardownErrors),\n ];\n if (errors.length)\n throw new AggregateError(errors, 'Document cleanup failed');\n }\n };\n try {\n if (\n document.lifecycle.afterAll.length ||\n nodeTeardownStack.length ||\n (options.setupTimeoutMs !== undefined &&\n getPendingScopeOperations(signal).length)\n )\n await cleanupScopeResources(signal, cleanup, {\n totalTimeoutMs: options.teardownTimeoutMs?.(),\n beforeCleanup: async (cleanupSignal) => {\n try {\n if (!hostErrors.some((error) => error.phase === 'setup'))\n await runPhase('afterAll', afterAll, cleanupSignal);\n } catch (error) {\n executionErrors.push(error);\n cleanupExecutionErrors.push(error);\n }\n },\n onDeferredError: (error) =>\n getDebug('runner:cleanup', { console: true })(\n `Deferred document cleanup failed: ${String(error)}`,\n ),\n });\n else acceptingNodeTeardowns = false;\n } catch (error) {\n deferredCleanup = error instanceof ResourceCleanupDeferredError;\n if (!deferredCleanup) acceptingNodeTeardowns = false;\n if (\n !deferredCleanup &&\n !teardownErrors.length &&\n !cleanupExecutionErrors.length\n )\n teardownErrors.push(\n new NodeScopeTeardownError(error, {\n scope: 'document',\n scopeId: documentRunId,\n node: 'resource-drain',\n registrationIndex: -1,\n }),\n );\n }\n finishedResult = createResult(teardownErrors);\n try {\n await options.onResult?.(finishedResult);\n } catch (error) {\n executionErrors.push(error);\n finishedResult = createResult(teardownErrors);\n }\n resourceScope.dispose();\n if (executionErrors.length)\n throw new WorkflowExecutionFailure(finishedResult, [\n ...executionErrors,\n ]);\n return finishedResult;\n })();\n return finishPromise;\n },\n };\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","createDocumentRuntime","document","options","documentRunId","randomUUID","plan","buildTestRunReportPlan","startedAt","Date","beforeAll","afterAll","nodes","step","project","context","resourceScope","createResourceScope","signal","setResourceOperationIdentity","nodeTeardownStack","acceptingNodeTeardowns","started","finishedResult","finishPromise","reportPaths","Set","reportSources","capturedSources","Map","executionErrors","hostErrors","acceptingSetupTeardowns","createResult","teardownErrors","endedAt","cleanup","getResourceCleanupSnapshot","pendingOperations","getPendingScopeOperations","phaseResults","phaseResult","undefined","phase","Math","error","host","asExecutionError","runPhase","results","executionSignal","stepIndex","waitForPreviousOperationMs","recoverCancelledScopeResources","documentContext","stepInfo","result","executeStep","node","teardown","WorkflowLifecycleError","source","runSetupWithTimeout","WorkflowExecutionFailure","cleanupExecutionErrors","deferredCleanup","priorTeardownErrors","registrationIndex","released","path","reportPathsFromTeardown","failure","NodeScopeTeardownError","errors","AggregateError","cleanupScopeResources","cleanupSignal","getDebug","String","ResourceCleanupDeferredError"],"mappings":"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"}
@@ -29,6 +29,7 @@ __webpack_require__.d(__webpack_exports__, {
29
29
  const logger_namespaceObject = require("@midscene/shared/logger");
30
30
  const external_errors_js_namespaceObject = require("../errors.js");
31
31
  const external_resource_operations_js_namespaceObject = require("./resource-operations.js");
32
+ const external_setup_timeout_js_namespaceObject = require("./setup-timeout.js");
32
33
  const createProjectRuntime = (options)=>{
33
34
  const startedAt = new Date();
34
35
  const controller = new AbortController();
@@ -105,20 +106,24 @@ const createProjectRuntime = (options)=>{
105
106
  return createResult('failed');
106
107
  }
107
108
  if (options.setup) try {
108
- context = await options.setup.setup({
109
- project: options.project,
110
- env: Object.freeze({
111
- ...process.env
112
- }),
113
- signal: controller.signal,
114
- onTeardown
115
- });
109
+ await (0, external_setup_timeout_js_namespaceObject.runSetupWithTimeout)(async ()=>{
110
+ try {
111
+ context = await options.setup.setup({
112
+ project: options.project,
113
+ env: Object.freeze({
114
+ ...process.env
115
+ }),
116
+ signal: controller.signal,
117
+ onTeardown
118
+ });
119
+ } finally{
120
+ acceptingTeardowns = false;
121
+ }
122
+ }, controller.signal, (reason)=>controller.abort(reason), options.setupTimeoutMs);
116
123
  } catch (error) {
117
124
  setupError = new external_errors_js_namespaceObject.ProjectSetupError(error, {
118
125
  projectName: options.project.name
119
126
  });
120
- } finally{
121
- acceptingTeardowns = false;
122
127
  }
123
128
  return createResult(setupError ? 'failed' : 'success');
124
129
  },
@@ -151,7 +156,8 @@ const createProjectRuntime = (options)=>{
151
156
  if (teardownErrors.length > priorErrors) throw new AggregateError(teardownErrors.slice(priorErrors), 'Project cleanup failed');
152
157
  };
153
158
  try {
154
- if (teardownStack.length) await (0, external_resource_operations_js_namespaceObject.cleanupScopeResources)(controller.signal, cleanup, {
159
+ if (teardownStack.length || void 0 !== options.setupTimeoutMs && (0, external_resource_operations_js_namespaceObject.getPendingScopeOperations)(controller.signal).length) await (0, external_resource_operations_js_namespaceObject.cleanupScopeResources)(controller.signal, cleanup, {
160
+ totalTimeoutMs: options.teardownTimeoutMs?.(),
155
161
  onDeferredError: (error)=>(0, logger_namespaceObject.getDebug)('runner:cleanup', {
156
162
  console: true
157
163
  })(`Deferred Project cleanup failed: ${String(error)}`)
@@ -1 +1 @@
1
- {"version":3,"file":"test-runner/engine/project-runtime.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../../src/test-runner/engine/project-runtime.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { getDebug } from '@midscene/shared/logger';\nimport {\n ProjectSetupError,\n ProjectTeardownError,\n WorkflowLifecycleError,\n} from '../errors';\nimport {\n ResourceCleanupDeferredError,\n cleanupScopeResources,\n getPendingScopeOperations,\n getResourceCleanupSnapshot,\n linkResourceSignal,\n setResourceOperationIdentity,\n} from './resource-operations';\nimport type {\n ProjectRuntime,\n ProjectRuntimeOptions,\n ProjectRuntimeResult,\n} from './types';\n\nexport const createProjectRuntime = <TProjectContext = unknown>(\n options: ProjectRuntimeOptions<TProjectContext>,\n): ProjectRuntime<TProjectContext> => {\n const startedAt = new Date();\n const controller = new AbortController();\n const parentSignal = options.signal;\n linkResourceSignal(controller.signal, parentSignal);\n setResourceOperationIdentity(controller.signal, {\n scopeId: options.project.projectId,\n });\n const abortFromParent = () => controller.abort(parentSignal?.reason);\n if (parentSignal?.aborted) abortFromParent();\n else parentSignal?.addEventListener('abort', abortFromParent, { once: true });\n\n const teardownStack: Array<{\n registrationIndex: number;\n teardown: Parameters<\n Parameters<NonNullable<typeof options.setup>['setup']>[0]['onTeardown']\n >[0];\n }> = [];\n let context: TProjectContext | undefined;\n let setupError: ProjectSetupError | undefined;\n let started = false;\n let acceptingTeardowns = options.setup !== undefined;\n let finishedResult: ProjectRuntimeResult<TProjectContext> | undefined;\n let finishPromise: Promise<ProjectRuntimeResult<TProjectContext>> | undefined;\n\n const createResult = (\n requestedStatus: 'success' | 'failed',\n teardownErrors: readonly ProjectTeardownError[] = [],\n ): ProjectRuntimeResult<TProjectContext> => {\n const endedAt = new Date();\n const cleanup = getResourceCleanupSnapshot(controller.signal);\n const pendingOperations = getPendingScopeOperations(controller.signal);\n return {\n projectName: options.project.name,\n status:\n requestedStatus === 'failed' ||\n setupError ||\n teardownErrors.length > 0 ||\n cleanup.status === 'pending' ||\n cleanup.status === 'failed' ||\n pendingOperations.length > 0\n ? 'failed'\n : 'success',\n ...(setupError ? { setupError } : {}),\n ...(teardownErrors.length > 0\n ? { teardownErrors: [...teardownErrors] }\n : {}),\n startedAt: startedAt.toISOString(),\n endedAt: endedAt.toISOString(),\n durationMs: Math.max(0, endedAt.getTime() - startedAt.getTime()),\n cleanup,\n ...(pendingOperations.length ? { pendingOperations } : {}),\n };\n };\n\n const onTeardown = (\n teardown: (typeof teardownStack)[number]['teardown'],\n ): void => {\n if (!acceptingTeardowns) {\n throw new WorkflowLifecycleError(\n 'onTeardown() can only be called while Project setup is running.',\n { projectName: options.project.name },\n );\n }\n if (typeof teardown !== 'function') {\n throw new WorkflowLifecycleError(\n 'Project onTeardown() requires a teardown function.',\n { projectName: options.project.name },\n );\n }\n teardownStack.push({\n registrationIndex: teardownStack.length,\n teardown,\n });\n };\n\n return {\n get context() {\n return context;\n },\n get signal() {\n return controller.signal;\n },\n get canRun() {\n return started && !setupError && !controller.signal.aborted;\n },\n async start() {\n if (started) {\n throw new WorkflowLifecycleError(\n 'Project runtime has already started.',\n {\n projectName: options.project.name,\n },\n );\n }\n started = true;\n if (controller.signal.aborted) {\n acceptingTeardowns = false;\n return createResult('failed');\n }\n if (options.setup) {\n try {\n context = await options.setup.setup({\n project: options.project,\n env: Object.freeze({ ...process.env }),\n signal: controller.signal,\n onTeardown,\n });\n } catch (error) {\n setupError = new ProjectSetupError(error, {\n projectName: options.project.name,\n });\n } finally {\n acceptingTeardowns = false;\n }\n }\n return createResult(setupError ? 'failed' : 'success');\n },\n async finish(requestedStatus = 'success') {\n if (finishPromise) return finishPromise;\n if (!started) {\n throw new WorkflowLifecycleError(\n 'Project runtime must start before it can finish.',\n { projectName: options.project.name },\n );\n }\n finishPromise = (async () => {\n const statusBeforeTeardown = createResult(requestedStatus).status;\n const teardownErrors: ProjectTeardownError[] = [];\n let deferredCleanup = false;\n const cleanup = async () => {\n const priorErrors = teardownErrors.length;\n for (const {\n registrationIndex,\n teardown,\n } of teardownStack.reverse()) {\n try {\n await teardown({\n project: options.project,\n context,\n status: statusBeforeTeardown,\n ...(setupError ? { setupError } : {}),\n });\n } catch (error) {\n teardownErrors.push(\n new ProjectTeardownError(error, {\n projectName: options.project.name,\n registrationIndex,\n }),\n );\n }\n }\n if (teardownErrors.length > priorErrors)\n throw new AggregateError(\n teardownErrors.slice(priorErrors),\n 'Project cleanup failed',\n );\n };\n try {\n if (teardownStack.length)\n await cleanupScopeResources(controller.signal, cleanup, {\n onDeferredError: (error) =>\n getDebug('runner:cleanup', { console: true })(\n `Deferred Project cleanup failed: ${String(error)}`,\n ),\n });\n } catch (error) {\n deferredCleanup = error instanceof ResourceCleanupDeferredError;\n if (!deferredCleanup && !teardownErrors.length)\n teardownErrors.push(\n new ProjectTeardownError(error, {\n projectName: options.project.name,\n registrationIndex: -1,\n }),\n );\n }\n parentSignal?.removeEventListener('abort', abortFromParent);\n finishedResult = createResult(requestedStatus, teardownErrors);\n return finishedResult;\n })();\n return finishPromise;\n },\n abort(reason) {\n controller.abort(reason);\n },\n };\n};\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","createProjectRuntime","options","startedAt","Date","controller","AbortController","parentSignal","linkResourceSignal","setResourceOperationIdentity","abortFromParent","teardownStack","context","setupError","started","acceptingTeardowns","undefined","finishedResult","finishPromise","createResult","requestedStatus","teardownErrors","endedAt","cleanup","getResourceCleanupSnapshot","pendingOperations","getPendingScopeOperations","Math","onTeardown","teardown","WorkflowLifecycleError","process","error","ProjectSetupError","statusBeforeTeardown","deferredCleanup","priorErrors","registrationIndex","ProjectTeardownError","AggregateError","cleanupScopeResources","getDebug","String","ResourceCleanupDeferredError","reason"],"mappings":"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"}
1
+ {"version":3,"file":"test-runner/engine/project-runtime.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../../src/test-runner/engine/project-runtime.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { getDebug } from '@midscene/shared/logger';\nimport {\n ProjectSetupError,\n ProjectTeardownError,\n WorkflowLifecycleError,\n} from '../errors';\nimport {\n ResourceCleanupDeferredError,\n cleanupScopeResources,\n getPendingScopeOperations,\n getResourceCleanupSnapshot,\n linkResourceSignal,\n setResourceOperationIdentity,\n} from './resource-operations';\nimport { runSetupWithTimeout } from './setup-timeout';\nimport type {\n ProjectRuntime,\n ProjectRuntimeOptions,\n ProjectRuntimeResult,\n} from './types';\n\nexport const createProjectRuntime = <TProjectContext = unknown>(\n options: ProjectRuntimeOptions<TProjectContext>,\n): ProjectRuntime<TProjectContext> => {\n const startedAt = new Date();\n const controller = new AbortController();\n const parentSignal = options.signal;\n linkResourceSignal(controller.signal, parentSignal);\n setResourceOperationIdentity(controller.signal, {\n scopeId: options.project.projectId,\n });\n const abortFromParent = () => controller.abort(parentSignal?.reason);\n if (parentSignal?.aborted) abortFromParent();\n else parentSignal?.addEventListener('abort', abortFromParent, { once: true });\n\n const teardownStack: Array<{\n registrationIndex: number;\n teardown: Parameters<\n Parameters<NonNullable<typeof options.setup>['setup']>[0]['onTeardown']\n >[0];\n }> = [];\n let context: TProjectContext | undefined;\n let setupError: ProjectSetupError | undefined;\n let started = false;\n let acceptingTeardowns = options.setup !== undefined;\n let finishedResult: ProjectRuntimeResult<TProjectContext> | undefined;\n let finishPromise: Promise<ProjectRuntimeResult<TProjectContext>> | undefined;\n\n const createResult = (\n requestedStatus: 'success' | 'failed',\n teardownErrors: readonly ProjectTeardownError[] = [],\n ): ProjectRuntimeResult<TProjectContext> => {\n const endedAt = new Date();\n const cleanup = getResourceCleanupSnapshot(controller.signal);\n const pendingOperations = getPendingScopeOperations(controller.signal);\n return {\n projectName: options.project.name,\n status:\n requestedStatus === 'failed' ||\n setupError ||\n teardownErrors.length > 0 ||\n cleanup.status === 'pending' ||\n cleanup.status === 'failed' ||\n pendingOperations.length > 0\n ? 'failed'\n : 'success',\n ...(setupError ? { setupError } : {}),\n ...(teardownErrors.length > 0\n ? { teardownErrors: [...teardownErrors] }\n : {}),\n startedAt: startedAt.toISOString(),\n endedAt: endedAt.toISOString(),\n durationMs: Math.max(0, endedAt.getTime() - startedAt.getTime()),\n cleanup,\n ...(pendingOperations.length ? { pendingOperations } : {}),\n };\n };\n\n const onTeardown = (\n teardown: (typeof teardownStack)[number]['teardown'],\n ): void => {\n if (!acceptingTeardowns) {\n throw new WorkflowLifecycleError(\n 'onTeardown() can only be called while Project setup is running.',\n { projectName: options.project.name },\n );\n }\n if (typeof teardown !== 'function') {\n throw new WorkflowLifecycleError(\n 'Project onTeardown() requires a teardown function.',\n { projectName: options.project.name },\n );\n }\n teardownStack.push({\n registrationIndex: teardownStack.length,\n teardown,\n });\n };\n\n return {\n get context() {\n return context;\n },\n get signal() {\n return controller.signal;\n },\n get canRun() {\n return started && !setupError && !controller.signal.aborted;\n },\n async start() {\n if (started) {\n throw new WorkflowLifecycleError(\n 'Project runtime has already started.',\n {\n projectName: options.project.name,\n },\n );\n }\n started = true;\n if (controller.signal.aborted) {\n acceptingTeardowns = false;\n return createResult('failed');\n }\n if (options.setup) {\n try {\n await runSetupWithTimeout(\n async () => {\n try {\n context = await options.setup!.setup({\n project: options.project,\n env: Object.freeze({ ...process.env }),\n signal: controller.signal,\n onTeardown,\n });\n } finally {\n acceptingTeardowns = false;\n }\n },\n controller.signal,\n (reason) => controller.abort(reason),\n options.setupTimeoutMs,\n );\n } catch (error) {\n setupError = new ProjectSetupError(error, {\n projectName: options.project.name,\n });\n }\n }\n return createResult(setupError ? 'failed' : 'success');\n },\n async finish(requestedStatus = 'success') {\n if (finishPromise) return finishPromise;\n if (!started) {\n throw new WorkflowLifecycleError(\n 'Project runtime must start before it can finish.',\n { projectName: options.project.name },\n );\n }\n finishPromise = (async () => {\n const statusBeforeTeardown = createResult(requestedStatus).status;\n const teardownErrors: ProjectTeardownError[] = [];\n let deferredCleanup = false;\n const cleanup = async () => {\n const priorErrors = teardownErrors.length;\n for (const {\n registrationIndex,\n teardown,\n } of teardownStack.reverse()) {\n try {\n await teardown({\n project: options.project,\n context,\n status: statusBeforeTeardown,\n ...(setupError ? { setupError } : {}),\n });\n } catch (error) {\n teardownErrors.push(\n new ProjectTeardownError(error, {\n projectName: options.project.name,\n registrationIndex,\n }),\n );\n }\n }\n if (teardownErrors.length > priorErrors)\n throw new AggregateError(\n teardownErrors.slice(priorErrors),\n 'Project cleanup failed',\n );\n };\n try {\n if (\n teardownStack.length ||\n (options.setupTimeoutMs !== undefined &&\n getPendingScopeOperations(controller.signal).length)\n )\n await cleanupScopeResources(controller.signal, cleanup, {\n totalTimeoutMs: options.teardownTimeoutMs?.(),\n onDeferredError: (error) =>\n getDebug('runner:cleanup', { console: true })(\n `Deferred Project cleanup failed: ${String(error)}`,\n ),\n });\n } catch (error) {\n deferredCleanup = error instanceof ResourceCleanupDeferredError;\n if (!deferredCleanup && !teardownErrors.length)\n teardownErrors.push(\n new ProjectTeardownError(error, {\n projectName: options.project.name,\n registrationIndex: -1,\n }),\n );\n }\n parentSignal?.removeEventListener('abort', abortFromParent);\n finishedResult = createResult(requestedStatus, teardownErrors);\n return finishedResult;\n })();\n return finishPromise;\n },\n abort(reason) {\n controller.abort(reason);\n },\n };\n};\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","createProjectRuntime","options","startedAt","Date","controller","AbortController","parentSignal","linkResourceSignal","setResourceOperationIdentity","abortFromParent","teardownStack","context","setupError","started","acceptingTeardowns","undefined","finishedResult","finishPromise","createResult","requestedStatus","teardownErrors","endedAt","cleanup","getResourceCleanupSnapshot","pendingOperations","getPendingScopeOperations","Math","onTeardown","teardown","WorkflowLifecycleError","runSetupWithTimeout","process","reason","error","ProjectSetupError","statusBeforeTeardown","deferredCleanup","priorErrors","registrationIndex","ProjectTeardownError","AggregateError","cleanupScopeResources","getDebug","String","ResourceCleanupDeferredError"],"mappings":"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"}
@@ -25,6 +25,7 @@ var __webpack_exports__ = {};
25
25
  __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
27
  getResourceCleanupSnapshot: ()=>getResourceCleanupSnapshot,
28
+ waitForScopeOperations: ()=>waitForScopeOperations,
28
29
  getPendingScopeOperations: ()=>getPendingScopeOperations,
29
30
  setResourceOperationIdentity: ()=>setResourceOperationIdentity,
30
31
  assertResourceAvailable: ()=>assertResourceAvailable,
@@ -154,6 +155,9 @@ function createResourceScope(parent) {
154
155
  });
155
156
  return {
156
157
  signal: controller.signal,
158
+ abort (reason) {
159
+ controller.abort(reason);
160
+ },
157
161
  dispose () {
158
162
  parent?.removeEventListener('abort', abort);
159
163
  scope.resources = void 0;
@@ -373,6 +377,15 @@ async function waitForResourceIdle(resource) {
373
377
  ...resource_operations_resources.get(resource).operations.keys()
374
378
  ]);
375
379
  }
380
+ async function waitForScopeOperations(signal) {
381
+ while(true){
382
+ const active = [
383
+ ...scopes.get(signal)?.operations.keys() ?? []
384
+ ];
385
+ if (!active.length) return;
386
+ await Promise.all(active.map(waitForResourceIdle));
387
+ }
388
+ }
376
389
  async function recoverCancelledScopeResources(signal, graceMs = RESOURCE_RECOVERY_GRACE_MS) {
377
390
  signal.throwIfAborted();
378
391
  const startedAt = Date.now();
@@ -458,14 +471,22 @@ async function runResourceCleanup(resources, cleanup, options, beforeCleanup) {
458
471
  if (ownerScope) ownerScope.cleanupOwner = owner;
459
472
  let defer;
460
473
  const deferred = new Promise((resolve)=>{
461
- defer = ()=>resolve({
474
+ defer = ()=>{
475
+ if (void 0 !== options.totalTimeoutMs) beforeCleanup?.abort(new external_errors_js_namespaceObject.WorkflowError(`Resource cleanup timed out after ${options.totalTimeoutMs}ms.`, {
476
+ code: 'TEARDOWN_TIMEOUT',
477
+ details: {
478
+ timeoutMs: options.totalTimeoutMs
479
+ }
480
+ }));
481
+ resolve({
462
482
  deferred: true
463
483
  });
484
+ };
464
485
  });
465
- let graceMs = options.graceMs ?? RESOURCE_CLEANUP_GRACE_MS;
486
+ let graceMs = options.totalTimeoutMs ?? options.graceMs ?? RESOURCE_CLEANUP_GRACE_MS;
466
487
  let timer;
467
488
  const drain = async ()=>{
468
- timer = setTimeout(defer, graceMs);
489
+ if (void 0 === options.totalTimeoutMs) timer = setTimeout(defer, graceMs);
469
490
  try {
470
491
  while(true){
471
492
  const pending = [
@@ -475,15 +496,18 @@ async function runResourceCleanup(resources, cleanup, options, beforeCleanup) {
475
496
  await Promise.all(pending.map(waitForResourceIdle));
476
497
  }
477
498
  } finally{
478
- clearTimeout(timer);
499
+ if (void 0 === options.totalTimeoutMs) clearTimeout(timer);
479
500
  }
480
501
  };
481
502
  const completion = (async ()=>{
503
+ if (void 0 !== options.totalTimeoutMs) timer = setTimeout(defer, Math.max(0, options.totalTimeoutMs));
482
504
  try {
483
505
  if (beforeCleanup) await beforeCleanup.run(beforeCleanup.signal);
484
506
  await drain();
485
- graceMs = options.graceMs ?? RESOURCE_TEARDOWN_GRACE_MS;
486
- timer = setTimeout(defer, graceMs);
507
+ if (void 0 === options.totalTimeoutMs) {
508
+ graceMs = options.graceMs ?? RESOURCE_TEARDOWN_GRACE_MS;
509
+ timer = setTimeout(defer, graceMs);
510
+ }
487
511
  return await cleanup();
488
512
  } finally{
489
513
  clearTimeout(timer);
@@ -537,7 +561,8 @@ function cleanupResources(resources, cleanup, options) {
537
561
  return runResourceCleanup(resources, cleanup, options);
538
562
  }
539
563
  async function cleanupScopeResources(signal, cleanup, options) {
540
- const cleanupSignal = new AbortController().signal;
564
+ const cleanupController = new AbortController();
565
+ const cleanupSignal = cleanupController.signal;
541
566
  linkResourceSignal(cleanupSignal, signal);
542
567
  const scope = scopes.get(signal);
543
568
  return runResourceCleanup([
@@ -549,6 +574,7 @@ async function cleanupScopeResources(signal, cleanup, options) {
549
574
  signal
550
575
  }, options.beforeCleanup ? {
551
576
  signal: cleanupSignal,
577
+ abort: (reason)=>cleanupController.abort(reason),
552
578
  run: options.beforeCleanup
553
579
  } : void 0);
554
580
  }
@@ -574,6 +600,7 @@ exports.retainResourceForScope = __webpack_exports__.retainResourceForScope;
574
600
  exports.setResourceOperationIdentity = __webpack_exports__.setResourceOperationIdentity;
575
601
  exports.trackResourceOperation = __webpack_exports__.trackResourceOperation;
576
602
  exports.waitForResourceIdle = __webpack_exports__.waitForResourceIdle;
603
+ exports.waitForScopeOperations = __webpack_exports__.waitForScopeOperations;
577
604
  for(var __rspack_i in __webpack_exports__)if (-1 === [
578
605
  "RESOURCE_CLEANUP_GRACE_MS",
579
606
  "RESOURCE_RECOVERY_GRACE_MS",
@@ -596,7 +623,8 @@ for(var __rspack_i in __webpack_exports__)if (-1 === [
596
623
  "retainResourceForScope",
597
624
  "setResourceOperationIdentity",
598
625
  "trackResourceOperation",
599
- "waitForResourceIdle"
626
+ "waitForResourceIdle",
627
+ "waitForScopeOperations"
600
628
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
601
629
  Object.defineProperty(exports, '__esModule', {
602
630
  value: true