vitest-pool-assemblyscript 0.10.1 → 0.11.0

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 (36) hide show
  1. package/README.md +3 -3
  2. package/dist/{compile-runner-BGHM_85g.mjs → compile-runner-BGYyiUEf.mjs} +3 -3
  3. package/dist/{compile-runner-BGHM_85g.mjs.map → compile-runner-BGYyiUEf.mjs.map} +1 -1
  4. package/dist/config/index-v3.d.mts +1 -1
  5. package/dist/config/index.d.mts +2 -2
  6. package/dist/config/index.mjs +2 -2
  7. package/dist/coverage-provider/index.mjs.map +1 -1
  8. package/dist/index-internal.d.mts +1 -1
  9. package/dist/index-v3.mjs +1 -1
  10. package/dist/index.d.mts +1 -1
  11. package/dist/index.mjs +2 -2
  12. package/dist/{load-user-imports-Bcx9NOt9.mjs → load-user-imports-iAQUMKAi.mjs} +2 -2
  13. package/dist/{load-user-imports-Bcx9NOt9.mjs.map → load-user-imports-iAQUMKAi.mjs.map} +1 -1
  14. package/dist/{pool-runner-init-CCvnKt5o.d.mts → pool-runner-init-CPQL6pVL.d.mts} +2 -2
  15. package/dist/pool-runner-init-CPQL6pVL.d.mts.map +1 -0
  16. package/dist/{pool-runner-init-DjRCbiX-.mjs → pool-runner-init-CSJt3dHv.mjs} +2 -2
  17. package/dist/{pool-runner-init-DjRCbiX-.mjs.map → pool-runner-init-CSJt3dHv.mjs.map} +1 -1
  18. package/dist/pool-thread/compile-worker-thread.d.mts +1 -1
  19. package/dist/pool-thread/compile-worker-thread.mjs +3 -3
  20. package/dist/pool-thread/test-worker-thread.d.mts +1 -1
  21. package/dist/pool-thread/test-worker-thread.mjs +3 -3
  22. package/dist/pool-thread/v3-tinypool-thread.d.mts +1 -1
  23. package/dist/pool-thread/v3-tinypool-thread.mjs +4 -4
  24. package/dist/{test-runner-BeP8ClnE.mjs → test-runner-BDcm8vg0.mjs} +3 -3
  25. package/dist/{test-runner-BeP8ClnE.mjs.map → test-runner-BDcm8vg0.mjs.map} +1 -1
  26. package/dist/{types-CoroKYxB.d.mts → types-CRbjiCC7.d.mts} +2 -2
  27. package/dist/{types-CoroKYxB.d.mts.map → types-CRbjiCC7.d.mts.map} +1 -1
  28. package/dist/{vitest-file-tasks-vvZzigcF.mjs → vitest-file-tasks-BBsZ_wS6.mjs} +4 -2
  29. package/dist/vitest-file-tasks-BBsZ_wS6.mjs.map +1 -0
  30. package/package.json +17 -10
  31. package/prebuilds/darwin-arm64/vitest-pool-assemblyscript.glibc.node +0 -0
  32. package/prebuilds/darwin-x64/vitest-pool-assemblyscript.glibc.node +0 -0
  33. package/prebuilds/win32-arm64/vitest-pool-assemblyscript.glibc.node +0 -0
  34. package/prebuilds/win32-x64/vitest-pool-assemblyscript.glibc.node +0 -0
  35. package/dist/pool-runner-init-CCvnKt5o.d.mts.map +0 -1
  36. package/dist/vitest-file-tasks-vvZzigcF.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"load-user-imports-Bcx9NOt9.mjs","names":[],"sources":["../src/wasm-executor/wasm-console.ts","../src/wasm-executor/collect-options.ts","../src/wasm-executor/wasm-imports.ts","../src/wasm-executor/index.ts","../src/pool-thread/rpc-reporter.ts","../src/pool-thread/load-user-imports.ts"],"sourcesContent":["import type { AssemblyScriptConsoleLogHandler } from '../types/types.js';\nimport { liftString } from '../util/assemblyscript/binding-helpers.js';\n\nexport function createWasmConsole(\n memory: WebAssembly.Memory,\n handleLog: AssemblyScriptConsoleLogHandler\n) {\n const getMessage = (msgPtr: number, memory: WebAssembly.Memory, prefix: string = ''): string => {\n return `${prefix}${msgPtr ? liftString(memory, msgPtr) : '<no message>'}`;\n };\n\n const timersByLabel: { [label: string]: number } = {};\n\n // provides the AssemblyScript \"brower-like console\" from AS std lib\n // see https://github.com/AssemblyScript/assemblyscript/blob/v0.28.9/std/assembly/index.d.ts#L2609\n return {\n 'console.assert': <T>(assertion: T, msgPtr: number): void => {\n if (!assertion) {\n const msg = getMessage(msgPtr, memory);\n handleLog(`Assertion failed${msg ? `: ${msg}` : ''}`);\n }\n },\n 'console.log': (msgPtr: number): void => {\n handleLog(getMessage(msgPtr, memory));\n },\n 'console.debug': (msgPtr: number): void => {\n handleLog(getMessage(msgPtr, memory, 'Debug: '));\n },\n 'console.info': (msgPtr: number): void => {\n handleLog(getMessage(msgPtr, memory, 'Info: '));\n },\n 'console.warn': (msgPtr: number): void => {\n handleLog(getMessage(msgPtr, memory, 'Warning: '), true);\n },\n 'console.error': (msgPtr: number): void => {\n handleLog(getMessage(msgPtr, memory, 'Error: '), true);\n },\n 'console.time': (labelPtr?: number): void => {\n const label = labelPtr ? liftString(memory, labelPtr) ?? 'default' : 'default';\n timersByLabel[label] = performance.now();\n },\n 'console.timeLog': (labelPtr?: number): void => {\n const label = labelPtr ? liftString(memory, labelPtr) ?? 'default' : 'default';\n const start = timersByLabel[label];\n let msg = '';\n if (start === undefined) {\n msg = `Warning: No such label '${label}' for console.timeLog()`;\n } else {\n msg = `${label}: ${(performance.now() - start).toFixed(3)}ms`;\n }\n handleLog(msg);\n },\n 'console.timeEnd': (labelPtr?: number): void => {\n const label = labelPtr ? liftString(memory, labelPtr) ?? 'default' : 'default';\n const start = timersByLabel[label];\n let msg = '';\n if (start === undefined) {\n msg = `Warning: No such label '${label}' for console.timeLog()`;\n } else {\n msg = `${label}: ${(performance.now() - start).toFixed(3)}ms`;\n }\n handleLog(msg);\n delete timersByLabel[label];\n },\n\n trace(msgPtr: number, n: number, a0: any, a1: any, a2: any, a3: any): void {\n const msg = liftString(memory, msgPtr);\n const args: any[] = [a0, a1, a2, a3];\n const nArgs: any[] = n && n > 0 ? args.slice(0, n) : args;\n\n console.trace(`WASM Trace:${msg ? ` ${msg}` : ''}`, ...nArgs);\n },\n };\n}\n","import { AssemblyScriptTestOptions } from '../types/types.js';\n\nconst TEST_OPTION_UNDEFINED: number = -1;\nconst TEST_OPTION_TRUE: number = 1;\n\nexport function mergeAssemblyScriptTestOptions(\n baseOptions: AssemblyScriptTestOptions,\n timeout: number,\n retry: number,\n skip: number,\n only: number,\n fails: number,\n): AssemblyScriptTestOptions {\n const options: AssemblyScriptTestOptions = { ...baseOptions };\n \n // numerical options\n if (timeout > TEST_OPTION_UNDEFINED) {\n options.timeout = timeout;\n }\n if (retry > TEST_OPTION_UNDEFINED) {\n options.retry = retry;\n }\n\n // boolean options\n if (skip > TEST_OPTION_UNDEFINED) {\n options.skip = skip === TEST_OPTION_TRUE ? true : false;\n }\n if (only > TEST_OPTION_UNDEFINED) {\n options.only = only === TEST_OPTION_TRUE ? true : false;\n }\n if (fails > TEST_OPTION_UNDEFINED) {\n options.fails = fails === TEST_OPTION_TRUE ? true : false;\n }\n\n return options;\n}\n","import type { File, Suite, Test } from '@vitest/runner/types';\n\nimport type {\n AssemblyScriptConsoleLogHandler,\n AssemblyScriptSuiteTaskMeta,\n AssemblyScriptTestError,\n AssemblyScriptTestTaskMeta,\n FailedAssertion,\n WasmImportsFactory,\n} from '../types/types.js';\nimport {\n AS_POOL_WASM_COVERAGE_MEM_IMPORT_NAME,\n AS_POOL_WASM_IMPORTS_MODULE_NAME,\n POOL_ERROR_NAMES,\n TEST_ERROR_NAMES\n} from '../types/constants.js';\nimport { debug } from '../util/debug.js';\nimport { abortWASMExecution, abortWASMExecutionOnSuccess, createPoolError, getExpectedMessageOrAny } from '../util/pool-errors.js';\nimport { liftString } from '../util/assemblyscript/binding-helpers.js';\nimport { decodeAbortInfo } from './wasm-memory.js';\nimport { createWasmConsole } from './wasm-console.js';\nimport { mergeAssemblyScriptTestOptions } from './collect-options.js';\nimport { createSuiteTask, createTestTask, failTestAssertionError, failTestRuntimeError } from '../util/vitest-tasks.js';\n\nfunction createUserWasmImports(\n createWasmImports: WasmImportsFactory | undefined,\n memory: WebAssembly.Memory,\n module: WebAssembly.Module,\n logPrefix: string\n) {\n let userEnvImports: WebAssembly.ModuleImports | undefined;\n let userCustomEnvImports: WebAssembly.Imports | undefined;\n\n if (createWasmImports) {\n try {\n const start = performance.now();\n const userImports: WebAssembly.Imports = createWasmImports({\n memory,\n module,\n utils: {\n liftString: (stringPtr: number) => liftString(memory, stringPtr)\n }\n });\n debug(`${logPrefix} Created user WASM imports for test execution in ${(performance.now() - start).toFixed(2)} ms`);\n\n userEnvImports = userImports?.env;\n userCustomEnvImports = { ...userImports };\n \n if (userEnvImports) {\n delete userCustomEnvImports.env;\n }\n } catch (error) {\n const msg = `Could not create user WasmImportsFactory.`\n + ` Ensure that your module has a default export matching () => WebAssembly.Imports`;\n throw createPoolError(\n POOL_ERROR_NAMES.WASMUserImportsError,\n msg,\n error,\n true\n );\n }\n }\n\n return { userEnvImports, userCustomEnvImports };\n}\n\n/**\n * Create import object for test discovery\n */\nexport function createDiscoveryImports(\n memory: WebAssembly.Memory,\n module: WebAssembly.Module,\n file: File,\n handleLog: AssemblyScriptConsoleLogHandler,\n logPrefix: string,\n coverageMemory?: WebAssembly.Memory,\n createWasmImports?: WasmImportsFactory,\n): WebAssembly.Imports {\n const suiteStack: Suite[] = [file];\n\n const {\n userEnvImports,\n userCustomEnvImports\n } = createUserWasmImports(createWasmImports, memory, module, logPrefix);\n \n return {\n env: {\n // users can choose to hide these with their own\n ...createWasmConsole(memory, handleLog),\n\n // user imports for \"env\"\n ...(userEnvImports ?? {}),\n\n memory,\n\n // handle runtime aborts, which are always unexpected during discovery\n abort(msgPtr: number, filePtr: number, line: number, column: number) {\n const { message, location } = decodeAbortInfo(memory, msgPtr, filePtr, line, column);\n const msgAtLoc = `${message}${location ? ` at ${location}` : ''}`;\n \n debug(`${logPrefix} - Unexpected abort during test discovery: ${msgAtLoc}`);\n\n const testError: AssemblyScriptTestError = {\n message,\n name: TEST_ERROR_NAMES.WASMRuntimeError,\n };\n\n throw abortWASMExecution(testError, new Error());\n },\n },\n\n [AS_POOL_WASM_IMPORTS_MODULE_NAME]: {\n\n ...(coverageMemory ? { [AS_POOL_WASM_COVERAGE_MEM_IMPORT_NAME]: coverageMemory } : {}),\n\n // stubs during discovery\n __assertion_pass() {},\n __assertion_fail() {},\n __expect_throw() {},\n __end_expect_throw() {},\n\n __begin_register_suite(\n namePtr: number,\n timeout: number,\n retry: number,\n skip: number,\n only: number,\n fails: number,\n ) {\n const parentSuite = suiteStack[suiteStack.length - 1]!;\n const defaultTestOptions = (parentSuite.meta as AssemblyScriptSuiteTaskMeta).defaultTestOptions;\n const suiteName = liftString(memory, namePtr) ?? 'unknown suite';\n const options = mergeAssemblyScriptTestOptions(defaultTestOptions, timeout, retry, skip, only, fails);\n const suite = createSuiteTask(suiteName, file, parentSuite, options);\n suiteStack.push(suite);\n\n debug(\n `${logPrefix} - Registering Suite \"${suite.name}\" | timeout: ${options.timeout} ms | retry: ${options.retry}`\n + ` | skip: ${options.skip} | only: ${options.only} | fails: ${options.fails} `\n + ` | parent: \"${suite.suite?.name}\" (parent idx: ${(suite.meta as AssemblyScriptSuiteTaskMeta).idxInParentTasks})`\n );\n },\n \n __end_register_suite(_namePtr: number) {\n const suite = suiteStack.pop();\n\n debug(\n `${logPrefix} - Registered Suite \"${suite?.name}\" | ${suite?.tasks.length} top-level tasks | mode: \"${suite?.mode}\"`\n + ` | parent: \"${suite?.suite?.name}\" (parent idx: ${(suite?.meta as AssemblyScriptSuiteTaskMeta)?.idxInParentTasks})`\n );\n },\n\n // called by test() to register test names and function indices\n __register_test(\n namePtr: number,\n fnIndex: number,\n timeout: number,\n retry: number,\n skip: number,\n only: number,\n fails: number,\n ) {\n const parentSuite = suiteStack[suiteStack.length - 1]!;\n const defaultTestOptions = (parentSuite.meta as AssemblyScriptSuiteTaskMeta).defaultTestOptions;\n const testName = liftString(memory, namePtr) ?? 'unknown test';\n const options = mergeAssemblyScriptTestOptions(defaultTestOptions, timeout, retry, skip, only, fails);\n const test = createTestTask(testName, fnIndex, file, parentSuite, options);\n \n debug(`${logPrefix} - Registered test \"${test.name}\" | mode (pre-interp): \"${test.mode}\"`\n + ` | fnIndex ${fnIndex} | timeout: ${options.timeout} ms | retry: ${options.retry} | skip: ${options.skip}`\n + ` | only: ${options.only} | fails: ${options.fails} | suite: \"${test.suite?.name}\"`\n + ` (parent idx: ${(test.meta as AssemblyScriptTestTaskMeta).idxInParentTasks})`\n );\n },\n },\n\n // user imports for any other environments they defined\n ...(userCustomEnvImports ?? {}),\n };\n}\n\n/**\n * Create import object for test execution\n *\n * Used during test execution to capture test results / assertions, and to handle\n * runtime aborts as expected cases for test execution by capturing the error on the test meta.\n */\nexport function createTestExecutionImports(\n memory: WebAssembly.Memory,\n module: WebAssembly.Module,\n test: Test,\n handleLog: AssemblyScriptConsoleLogHandler,\n logPrefix: string,\n coverageMemory?: WebAssembly.Memory,\n createWasmImports?: WasmImportsFactory,\n): { imports: WebAssembly.Imports; provideFunctionTable: (table: WebAssembly.Table) => void; } {\n // execution imports are created per-test, so these represent per-test state\n let lastFailedAssertion: FailedAssertion | undefined;\n let isExpectingError: boolean = false;\n let expectedErrorMsgStr: string | undefined;\n let wasmFunctionTable: WebAssembly.Table | undefined;\n\n const {\n userEnvImports,\n userCustomEnvImports\n } = createUserWasmImports(createWasmImports, memory, module, logPrefix);\n\n const imports = {\n env: {\n // users can choose to hide these with their own\n ...createWasmConsole(memory, handleLog),\n\n // user imports for \"env\"\n ...(userEnvImports ?? {}),\n\n memory,\n\n abort(msgPtr: number, filePtr: number, line: number, column: number) {\n const { message, location } = decodeAbortInfo(memory, msgPtr, filePtr, line, column);\n const msgAtLoc = `${message}${location ? ` at ${location}` : ''}`;\n \n debug(`${logPrefix} - Handling test execution abort: ${msgAtLoc}`);\n\n let failureMessage = message;\n\n // handle expected aborts for thrown errors\n if (isExpectingError) {\n // TODO: decide if .includes is correct here or not\n if (!expectedErrorMsgStr || message.includes(expectedErrorMsgStr)) {\n // either no specifically expected error (any error), or error message matches\n (test.meta as AssemblyScriptTestTaskMeta).assertionsPassedCount++;\n \n debug(`${logPrefix} - Thrown error matches expected - assertion passes`);\n\n // abort without failing the test\n throw abortWASMExecutionOnSuccess();\n } else {\n const expected = getExpectedMessageOrAny(expectedErrorMsgStr);\n\n // error message mismatch\n failureMessage = `expected function to throw error ${expected}, but received error \"${message}\"`;\n\n lastFailedAssertion = {\n message: failureMessage,\n actualTypeName: 'string',\n expectedTypeName: 'string',\n valuesProvided: true,\n actual: message,\n expected: expectedErrorMsgStr\n };\n\n const errStr = `Thrown error does not match expected | Expected: ${expected} | Actual: \"${message}\"`;\n debug(`${logPrefix} - Assertion failed: ${errStr}`);\n }\n }\n\n const testError = lastFailedAssertion\n ? failTestAssertionError(test, lastFailedAssertion)\n : failTestRuntimeError(test, '', failureMessage);\n\n throw abortWASMExecution(testError, new Error());\n },\n },\n\n [AS_POOL_WASM_IMPORTS_MODULE_NAME]: {\n \n ...(coverageMemory ? { [AS_POOL_WASM_COVERAGE_MEM_IMPORT_NAME]: coverageMemory } : {}),\n\n // stubs during execution\n __register_test() {},\n __begin_register_suite() {},\n __end_register_suite() {},\n\n __assertion_pass() {\n (test.meta as AssemblyScriptTestTaskMeta).assertionsPassedCount++;\n },\n\n __assertion_fail(msgPtr: number, actualTypeNamePtr: number, expectedTypeNamePtr: number, valuesProvided: boolean, actualPtr?: number, expectedPtr?: number) {\n const errorMsg = liftString(memory, msgPtr) ?? '';\n const actualTypeName = liftString(memory, actualTypeNamePtr) ?? '';\n const expectedTypeName = liftString(memory, expectedTypeNamePtr) ?? '';\n let valuesMsg = ' | No Values Provided';\n \n lastFailedAssertion = {\n actualTypeName,\n expectedTypeName,\n message: errorMsg,\n valuesProvided: Boolean(valuesProvided)\n };\n\n (test.meta as AssemblyScriptTestTaskMeta).assertionsFailed.push(lastFailedAssertion);\n \n if (valuesProvided && actualPtr && expectedPtr) {\n lastFailedAssertion.actual = liftString(memory, actualPtr);\n lastFailedAssertion.expected = liftString(memory, expectedPtr);\n valuesMsg = ` | Actual Type: ${actualTypeName} | Expected Type: ${expectedTypeName}`\n + ` | Actual Value: \\`${lastFailedAssertion.actual}\\` | Expected Value: \\`${lastFailedAssertion.expected}\\``;\n }\n \n debug(`${logPrefix} - Assertion failed: ${errorMsg}${valuesMsg}`);\n },\n\n __expect_throw(fnIndex: number, expectedErrorMsgPtr?: number) {\n isExpectingError = true;\n if (expectedErrorMsgPtr) {\n expectedErrorMsgStr = liftString(memory, expectedErrorMsgPtr);\n }\n\n debug(`${logPrefix} - Registered expected error throw: ${getExpectedMessageOrAny(expectedErrorMsgStr)}`);\n\n if (wasmFunctionTable && typeof wasmFunctionTable.get === 'function') {\n const fn = wasmFunctionTable.get(fnIndex);\n if (!fn) {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMExecutionHarnessError,\n `Could not access function (fnPtr ${fnIndex}) which is expected to throw in test \"${test.name}\"`,\n );\n }\n\n // successful:\n // - throws in WASM, calls abort handler\n // - abort handler confirms error matches expected, does NOT fail test, halts execution with WASMExecutionAbortError\n // - executor catches WASMExecutionAbortError as 'known' and proceeds to process & report passed test\n // failure (wrong error):\n // - throws in WASM, calls abort handler\n // - abort handler confirms error matches mismatch, failTest packages up an appropriate test error\n // - abort handler halts execution with WASMExecutionAbortError containing test error\n // - executor catches WASMExecutionAbortError as 'known' and proceeds to process & report test error\n // failure (no error):\n // - does NOT throw in WASM\n // - WASM continues executing and calls __end_expect_throw\n // - __end_expect_throw sees it is STILL expecting an error, failTest packages up an appropriate test error\n // - __end_expect_throw halts execution with WASMExecutionAbortError containing test error\n // - executor catches WASMExecutionAbortError as 'known' and proceeds to process & report test error\n debug(`${logPrefix} - Calling function (idx ${fnIndex})`);\n fn();\n } else {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMExecutionHarnessError,\n `Could not access WASM function table to call function expected to throw`,\n );\n }\n },\n\n __end_expect_throw() {\n if (isExpectingError) {\n const errStr = `Expected thrown error but got none | Expected: \"${expectedErrorMsgStr}\"`;\n debug(`${logPrefix} - Assertion failed: ${errStr}`);\n \n const failureMessage = `function did not throw, but was expected to throw error: ${getExpectedMessageOrAny(expectedErrorMsgStr)}`;\n const testError = failTestAssertionError(test, {\n message: failureMessage,\n actualTypeName: 'undefined',\n expectedTypeName: 'string',\n valuesProvided: true,\n actual: undefined,\n expected: expectedErrorMsgStr\n });\n\n // Must throw here to halt WASM execution on an assertion or runtime failure for this test.\n // This will be caught by the executor and reported as an appropriate test error\n throw abortWASMExecution(testError);\n }\n },\n },\n\n // user imports for any other environments they defined\n ...(userCustomEnvImports ?? {}),\n };\n\n return {\n imports,\n provideFunctionTable: (table: WebAssembly.Table) => {\n debug(`${logPrefix} - Got WASM function table | length: ${table.length}`);\n wasmFunctionTable = table;\n },\n };\n}\n","import { basename } from 'node:path';\nimport type { SerializedDiffOptions } from '@vitest/utils/diff';\nimport type { File, Test } from '@vitest/runner/types';\n\nimport type {\n AssemblyScriptConsoleLogHandler,\n AssemblyScriptPoolError,\n AssemblyScriptTestError,\n AssemblyScriptTestTaskMeta,\n CoverageData,\n ResolvedAssemblyScriptPoolOptions,\n ThreadImports,\n WASMCompilation,\n WASMExecutorPerfTimings,\n} from '../types/types.js';\nimport { AS_POOL_ERROR_FLAG, POOL_ERROR_NAMES } from '../types/constants.js';\nimport { debug, debugOverride } from '../util/debug.js';\nimport { createMemory } from './wasm-memory.js';\nimport { createDiscoveryImports, createTestExecutionImports } from './wasm-imports.js';\nimport { enhanceTestError } from './wasm-errors.js';\nimport { createPoolError, wrapPoolError } from '../util/pool-errors.js';\nimport { failTestRuntimeError, getTaskLogLabel } from '../util/vitest-tasks.js';\nimport { extractCallStack } from './source-maps.js';\n\nconst SIG_MISMATCH_ERROR_MSG = `WASM function signature type mismatch during test collection.`\n + ` This is most likely caused by passing a type-inferred, non-void callback to expect().`\n + ` To fix, either explicitly define the non-void return type on the callback`\n + ` e.g. \\`expect((): i32 => failingFunction()).toThrowError()\\``\n + ` or use braces to make it void e.g. \\`expect(() => { failingFunction(); }).toThrowError()\\`.`\n + ` Look for the failing expect() within the describe() block indicated in the stack trace.`;\n\nfunction verifyMemoryRequirements(\n compilation: WASMCompilation,\n poolOptions: ResolvedAssemblyScriptPoolOptions,\n) {\n if (poolOptions.testMemoryPagesInitial && poolOptions.testMemoryPagesInitial < compilation.requiredMemory.testMemory.initialPages) {\n throw createPoolError(\n POOL_ERROR_NAMES.PoolConfigError,\n `WASM binary requires initial test memory pages (${compilation.requiredMemory.testMemory.initialPages}) exceeding configured \"testMemoryPagesInitial\"`\n + ` (${poolOptions.testMemoryPagesInitial}). Increase value, or remove for auto sizing.`,\n );\n }\n \n if (poolOptions.testMemoryPagesMax && compilation.requiredMemory.testMemory.maximumPages\n && poolOptions.testMemoryPagesMax < compilation.requiredMemory.testMemory.maximumPages\n ) {\n throw createPoolError(\n POOL_ERROR_NAMES.PoolConfigError,\n `WASM binary requires maximum test memory pages (${compilation.requiredMemory.testMemory.maximumPages}) exceeding configured \"testMemoryPagesMax\"`\n + ` (${poolOptions.testMemoryPagesMax}). Increase value, or remove for auto sizing.`,\n );\n }\n \n if (poolOptions.coverageMemoryPagesInitial && poolOptions.coverageMemoryPagesInitial < compilation.requiredMemory.coverageMemory.initialPages) {\n throw createPoolError(\n POOL_ERROR_NAMES.PoolConfigError,\n `WASM binary requires initial coverage memory pages (${compilation.requiredMemory.coverageMemory.initialPages}) exceeding configured \"coverageMemoryPagesInitial\"`\n + ` (${poolOptions.coverageMemoryPagesInitial}). Increase value, or remove for auto sizing.`,\n );\n }\n\n if (poolOptions.coverageMemoryPagesMax && compilation.requiredMemory.coverageMemory.maximumPages\n && poolOptions.coverageMemoryPagesMax < compilation.requiredMemory.coverageMemory.maximumPages\n ) {\n throw createPoolError(\n POOL_ERROR_NAMES.PoolConfigError,\n `WASM binary requires maximum coverage memory pages (${compilation.requiredMemory.coverageMemory.maximumPages}) exceeding configured \"coverageMemoryPagesMax\"`\n + ` (${poolOptions.coverageMemoryPagesMax}). Increase value, or remove for auto sizing.`,\n );\n }\n}\n\nfunction createExecutorMemories(\n compilation: WASMCompilation,\n poolOptions: ResolvedAssemblyScriptPoolOptions,\n includeCoverageMemory: boolean,\n): { testMemory: WebAssembly.Memory; coverageMemory?: WebAssembly.Memory } {\n verifyMemoryRequirements(compilation, poolOptions);\n\n const testMemory = createMemory(\n poolOptions.testMemoryPagesInitial ?? compilation.requiredMemory.testMemory.initialPages,\n poolOptions.testMemoryPagesMax ?? compilation.requiredMemory.testMemory.maximumPages\n );\n const coverageMemory = includeCoverageMemory ?\n createMemory(\n poolOptions.coverageMemoryPagesInitial ?? compilation.requiredMemory.coverageMemory.initialPages,\n poolOptions.coverageMemoryPagesMax ?? compilation.requiredMemory.coverageMemory.maximumPages\n )\n : undefined;\n\n return { testMemory, coverageMemory };\n}\n\n/**\n * Discover tests via test() and suites via describe() registration calls\n */\nexport async function executeWASMDiscovery(\n compilation: WASMCompilation,\n poolOptions: ResolvedAssemblyScriptPoolOptions,\n isBinaryInstrumented: boolean,\n handleLog: AssemblyScriptConsoleLogHandler,\n file: File,\n moduleLabel: string,\n threadImports: ThreadImports,\n): Promise<void> {\n const base = basename(file.filepath);\n const logPrefix = `[${moduleLabel} Exec] ${getTaskLogLabel(base, file)}`;\n \n try {\n const { testMemory, coverageMemory } = createExecutorMemories(compilation, poolOptions, isBinaryInstrumented);\n\n const importObject = createDiscoveryImports(\n testMemory,\n compilation.compiledModule,\n file,\n handleLog,\n logPrefix,\n coverageMemory,\n threadImports.createUserWasmImports\n );\n\n // Instantiate WASM module\n const instance = new WebAssembly.Instance(compilation.compiledModule, importObject);\n const exports = instance.exports as Record<string, unknown>;\n\n // Call _start to run top-level test() and describe()\n if (typeof exports._start === 'function') {\n exports._start();\n } else {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMExecutionHarnessError,\n 'no _start() export found on compiled WASM binary'\n );\n }\n } catch (error: any) {\n if (error && error[AS_POOL_ERROR_FLAG]) {\n throw error;\n }\n\n // void type inference issue\n if (error instanceof WebAssembly.RuntimeError && error.message.includes('null function or function signature mismatch')) {\n throw createPoolError(POOL_ERROR_NAMES.PoolSyntaxError, SIG_MISMATCH_ERROR_MSG, error);\n }\n\n if (error instanceof Error) {\n let match: RegExpExecArray | null = null;\n let moduleName: string | undefined;\n let functionName: string | undefined;\n let errorMessage: string | undefined;\n \n if (match = /\"(.+)\": module is not an object or function/.exec(error.message)) {\n // module import error\n moduleName = match[1];\n errorMessage = `Expected module \"${moduleName}\" to be defined as an object`\n + ` or function within user WASM imports (returned by WasmImportsFactory).`;\n } else if (match = /\"(.+)\" (function=)?\"(.+)\": function import requires a callable/.exec(error.message)) {\n // function import error\n moduleName = match[1];\n functionName = match[3];\n errorMessage = `Expected function \"${functionName}\" to be defined in module \"${moduleName}\"`\n + ` within user WASM imports (returned by WasmImportsFactory).`;\n }\n\n if (errorMessage) {\n throw createPoolError(POOL_ERROR_NAMES.WASMUserImportsError, errorMessage, error);\n }\n }\n \n // any other error\n throw wrapPoolError(POOL_ERROR_NAMES.WASMExecutionHarnessError, error, true);\n }\n\n debug(`${logPrefix} - Discovered ${file.tasks.length} top-level tasks`);\n return;\n}\n\n/**\n * Execute a single test with crash isolation\n */\nexport async function executeWASMTest(\n test: Test,\n compilation: WASMCompilation,\n poolOptions: ResolvedAssemblyScriptPoolOptions,\n collectCoverage: boolean,\n handleLog: AssemblyScriptConsoleLogHandler,\n moduleLabel: string,\n threadImports: ThreadImports,\n projectRoot: string,\n diffOptions?: SerializedDiffOptions,\n): Promise<{ test: Test, testTimings: WASMExecutorPerfTimings }> {\n const testTimings: WASMExecutorPerfTimings = {\n fnInit: performance.now(),\n execStart: 0,\n execEnd: 0,\n fnfinal: 0\n };\n const base = basename(test.file.filepath);\n const fullModuleLabel = `${moduleLabel} Exec`;\n const taskLabel = getTaskLogLabel(base, test);\n const logPrefix = `[${fullModuleLabel}] ${taskLabel}`;\n\n function covDebug(...args: any[]): void {\n if (poolOptions.debugCoverageExtract) {\n debugOverride(...args);\n }\n };\n\n const { testMemory, coverageMemory } = createExecutorMemories(compilation, poolOptions, collectCoverage);\n\n // Create import object with pool-side functions for capturing test execution results\n const { imports, provideFunctionTable } = createTestExecutionImports(\n testMemory,\n compilation.compiledModule,\n test,\n handleLog,\n logPrefix,\n coverageMemory,\n threadImports.createUserWasmImports\n );\n\n // Instantiate fresh WASM instance for this test\n const instance = new WebAssembly.Instance(compilation.compiledModule, imports);\n const exports = instance.exports as Record<string, unknown>;\n\n // Func table accessable because we're using the AS compiler --exportTable flag\n const table = exports.table as WebAssembly.Table | undefined;\n \n // allow imports to access table\n if (table && typeof table.get === 'function') {\n provideFunctionTable(table);\n }\n\n // Call _start to run top-level code. Test registration is stubbed/noop duing execution,\n // but this call is still needed to initialize any user-defined globals / other top level code.\n if (typeof exports._start === 'function') {\n // Not explicitly handling with try-catch here because failures in _start should be\n // caught during discovery and source-mapped. If this somehow fails, the worker still catches it.\n exports._start();\n } else {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMExecutionHarnessError,\n 'no _start() export found on compiled WASM binary'\n );\n }\n\n let testFn: (() => void) | null | undefined;\n \n if (table && typeof table.get === 'function') {\n const idx = (test.meta as AssemblyScriptTestTaskMeta).fnIndex;\n testFn = table.get(idx) as (() => void) | null;\n\n if (!testFn) {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMExecutionHarnessError,\n `Test function at index ${idx} not found in function table`\n );\n }\n } else {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMExecutionHarnessError,\n 'Function table not found in WASM exports (missing --exportTable flag?)'\n );\n }\n\n // try-catch to ensure we capture known test errors to report\n // as AssemblyScriptTestErrors to vitest\n try {\n // Execute this test\n testTimings.execStart = performance.now();\n testFn();\n testTimings.execEnd = performance.now();\n\n // If we reach here, test passed, i.e. No abort occurred.\n // Proceed below to prepare the test result\n } catch (error: any) {\n testTimings.execEnd = performance.now();\n\n let testError: AssemblyScriptTestError;\n let stack: NodeJS.CallSite[];\n let allowStackJS: boolean;\n let applyStackToTestErrorCause: boolean;\n\n if (error && error[AS_POOL_ERROR_FLAG]) {\n const wrapper = error as AssemblyScriptPoolError;\n testError = wrapper.testError;\n stack = wrapper.originalErrorRawStack;\n allowStackJS = wrapper.originalErrorMayContainJS;\n applyStackToTestErrorCause = wrapper.applyStackToTestErrorCause;\n } else if (error instanceof Error) {\n testError = failTestRuntimeError(test, error.name, error.message);\n stack = extractCallStack(error);\n allowStackJS = true;\n applyStackToTestErrorCause = false;\n } else {\n testError = failTestRuntimeError(test, '', `Unexpected WASM test execution error: ${String(error)}`);\n stack = extractCallStack(new Error());\n allowStackJS = true;\n applyStackToTestErrorCause = false;\n }\n\n await enhanceTestError(\n testError,\n test,\n compilation.sourceMap,\n logPrefix,\n allowStackJS,\n projectRoot,\n applyStackToTestErrorCause,\n stack,\n diffOptions\n );\n }\n\n const meta = test.meta as AssemblyScriptTestTaskMeta;\n\n // Extract coverage hits from coverage memory\n if (collectCoverage && compilation.debugInfo) {\n if (!coverageMemory) {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMExecutionHarnessError,\n 'Coverage memory not created despite collectCoverage=true'\n );\n }\n\n const coverage: CoverageData = {\n hitCountsByFileAndPosition: {},\n };\n\n // Read counters from coverage memory\n const extractedHitCounters = new Uint32Array(coverageMemory.buffer, 0, compilation.debugInfo.instrumentedFunctionCount);\n covDebug(`${logPrefix} - Read coverage memory for ${compilation.debugInfo.instrumentedFunctionCount} instrumented functions`);\n\n // Iterate all instrumented functions and build coverage data with hit counts extracted from coverage memory\n let functionsHit = 0;\n for (const [filePath, debugFunctions] of Object.entries(compilation.debugInfo.functionsByFileAndPosition)) {\n if (!coverage.hitCountsByFileAndPosition[filePath]) {\n coverage.hitCountsByFileAndPosition[filePath] = {};\n covDebug(`${logPrefix} - Extracting hits for source file \"${filePath}\"`);\n }\n\n for (const [positionKey, funcInfos] of Object.entries(debugFunctions)) {\n // Sum hit counts across all functions at this position (multiple for generic monomorphizations)\n let positionHitCount = 0;\n for (const funcInfo of funcInfos) {\n if (funcInfo.coverageMemoryIndex === undefined) {\n debug(`${logPrefix} - WARNING: NO COVERAGE MEMORY INDEX`\n + ` - func \"${funcInfo.name}\" (${positionKey}) Skipping hit extraction`\n );\n continue;\n }\n\n const hitCount = extractedHitCounters[funcInfo.coverageMemoryIndex] ?? 0;\n covDebug(`${logPrefix} - func \"${funcInfo.name}\" (${positionKey}) `\n + `[idx: ${funcInfo.coverageMemoryIndex}]: ${hitCount} hits`\n );\n positionHitCount += hitCount;\n }\n\n coverage.hitCountsByFileAndPosition[filePath][positionKey] = positionHitCount;\n\n if (positionHitCount > 0) {\n functionsHit++;\n }\n }\n }\n\n meta.coverageData = coverage;\n debug(`${logPrefix} - Extracted coverage data | ${functionsHit} functions hit`);\n }\n\n testTimings.fnfinal = performance.now();\n\n return { test, testTimings };\n}\n","/**\n * RPC Reporting Helpers\n *\n * This module provides helper functions for reporting test lifecycle events\n * to Vitest via RPC. All helpers are designed to be composable and reusable.\n */\n\nimport type { MessagePort } from 'node:worker_threads';\nimport { createBirpc } from 'birpc';\nimport type { RunnerRPC, RuntimeRPC, UserConsoleLog } from 'vitest';\nimport type {\n File,\n Suite,\n Test,\n Task,\n TaskEventPack, \n TaskResultPack,\n CancelReason,\n} from '@vitest/runner/types';\n\nimport type {\n AssemblyScriptConsoleLog,\n AssemblyScriptCoveragePayload,\n AssemblyScriptSuiteTaskMeta,\n VitestVersion,\n WorkerRPC\n} from '../types/types.js';\nimport { debug } from '../util/debug.js';\nimport { COVERAGE_PAYLOAD_FORMATS } from '../types/constants.js';\nimport {\n createAfterSuiteRunMeta,\n getTaskLogLabel,\n isSuiteOwnFile\n} from '../util/vitest-tasks.js';\n\n// ============================================================================\n// RPC Client Factory\n// ============================================================================\n\n/** Create RPC client from MessagePort */\nexport function createRpcClient(port: MessagePort): WorkerRPC {\n return createBirpc<RuntimeRPC, RunnerRPC>(\n {\n onCancel: (_reason: CancelReason) => void { }\n },\n {\n post: (v) => port.postMessage(v),\n on: (fn) => port.on('message', fn),\n }\n );\n}\n\n// ============================================================================\n// File Task Reporting\n// ============================================================================\n\n/** Report file as queued (before compilation & discovery starts) */\nexport async function reportFileQueued(\n rpc: WorkerRPC,\n fileTask: File,\n logModule: string,\n logLabel: string,\n): Promise<void> {\n await rpc.onQueued(fileTask);\n debug(`[${logModule} RPC] ${logLabel} - Reported onQueued for file \"${fileTask.filepath}\"`\n + ` | mode: \"${fileTask.mode}\" | state: \"${fileTask.result ? fileTask.result.state : '--'}\"`\n );\n}\n\n/** Report file collection complete with full task tree */\nexport async function reportFileCollected(\n rpc: WorkerRPC,\n fileTask: File,\n logModule: string,\n logLabel: string,\n): Promise<void> {\n await rpc.onCollected([fileTask]);\n debug(`[${logModule} RPC] ${logLabel} - Reported onCollected for file \"${fileTask.filepath}\"`\n + ` | ${fileTask.tasks.length} tasks | mode: \"${fileTask.mode}\" | state: \"${fileTask.result?.state}\"`\n );\n}\n\n/** Report file-level error (compilation/discovery failure) as \"suite-failed-early\" */\nexport async function reportFileError(\n rpc: WorkerRPC,\n fileTask: File, \n logModule: string,\n logLabel: string,\n): Promise<void> {\n const taskPack: TaskResultPack = [fileTask.id, fileTask.result, {}];\n const eventPack: TaskEventPack = [fileTask.id, \"suite-failed-early\", undefined];\n await rpc.onTaskUpdate([taskPack], [eventPack]);\n\n debug(`[${logModule} RPC] ${logLabel} - Reported \"suite-failed-early\" task update for \"${fileTask.filepath}\"`);\n}\n\n// ============================================================================\n// Suite Lifecycle Reporting\n// ============================================================================\n\n/** Report suite-prepare event */\nexport async function reportSuitePrepare(\n rpc: WorkerRPC,\n suite: Suite,\n logModule: string,\n base: string,\n): Promise<void> {\n // Report suite event (without the custom task meta so reporters won't log it)\n const taskPack: TaskResultPack = [suite.id, suite.result, {}];\n const eventPack: TaskEventPack = [suite.id, 'suite-prepare', undefined];\n\n await rpc.onTaskUpdate([taskPack], [eventPack]);\n\n debug(`[${logModule} RPC] ${getTaskLogLabel(base, suite)} - Reported \"suite-prepare\" task update`\n + ` | state: \"${suite.result?.state}\"`\n );\n}\n\n/** Report suite-finished event */\nexport async function reportSuiteFinished(\n rpc: WorkerRPC,\n suite: Suite,\n logModule: string,\n base: string,\n vitestVersion: VitestVersion = 'v4',\n): Promise<void> {\n const suiteLabel = getTaskLogLabel(base, suite);\n const rpcLogPrefix = `[${logModule} RPC] ${suiteLabel}`;\n const meta = suite.meta as AssemblyScriptSuiteTaskMeta;\n const coverageKeys: number = Object.keys(meta.coverageData?.hitCountsByFileAndPosition ?? {}).length;\n let coveragePromise: Promise<void> = Promise.resolve();\n \n // Report coverage if this is a file task, and coverage is available\n if (isSuiteOwnFile(suite) && coverageKeys > 0) {\n const coverage: AssemblyScriptCoveragePayload = {\n __format: COVERAGE_PAYLOAD_FORMATS.AssemblyScript,\n coverageData: meta.coverageData!,\n suiteLogLabel: suiteLabel\n };\n \n const afterSuiteMeta = createAfterSuiteRunMeta(\n coverage,\n [suite.file.filepath],\n suite.file.projectName,\n vitestVersion\n );\n coveragePromise = rpc.onAfterSuiteRun(afterSuiteMeta);\n\n debug(`${rpcLogPrefix} - onAfterSuiteRun: Reported suite coverage (${coverageKeys} unique positions)`);\n } else if (coverageKeys === 0) {\n debug(`${rpcLogPrefix} - onAfterSuiteRun: No suite coverage to report`);\n }\n\n // Report suite event (without the custom task meta so reporters won't log it)\n const taskPack: TaskResultPack = [suite.id, suite.result, {}];\n const eventPack: TaskEventPack = [suite.id, \"suite-finished\", undefined];\n\n await Promise.all([\n coveragePromise,\n rpc.onTaskUpdate([taskPack], [eventPack])\n ]);\n\n debug(`${rpcLogPrefix} - Reported \"suite-finished\" task update | state: \"${suite.result?.state}\"`\n + ` | duration: ${suite.result?.duration?.toFixed(2) ?? '--'} ms`\n );\n}\n\n// ============================================================================\n// Test Lifecycle Reporting\n// ============================================================================\n\nasync function reportTestTaskUpdate(\n rpc: WorkerRPC,\n test: Test,\n logModule: string,\n base: string,\n updateEvent: 'test-prepare' | 'test-finished' | 'test-retried'\n): Promise<void> {\n // Report test event (without the custom task meta so reporters won't log it)\n const taskPack: TaskResultPack = [test.id, test.result, {}];\n const eventPack: TaskEventPack = [test.id, updateEvent, undefined];\n\n debug(`[${logModule} RPC] ${getTaskLogLabel(base, test)} - Reporting \"${updateEvent}\" task update...`\n + ` | state: \"${test.result?.state}\"`\n + `${updateEvent === 'test-prepare' ? '' : ` | duration: ${test.result?.duration?.toFixed(2) ?? '--'} ms`}`\n );\n await rpc.onTaskUpdate([taskPack], [eventPack]);\n debug(`[${logModule} RPC] ${getTaskLogLabel(base, test)} - Reported \"${updateEvent}\" task update`\n + ` | state: \"${test.result?.state}\"`\n + `${updateEvent === 'test-prepare' ? '' : ` | duration: ${test.result?.duration?.toFixed(2) ?? '--'} ms`}`\n );\n}\n\n/** Report test starting execution */\nexport async function reportTestPrepare(\n rpc: WorkerRPC,\n test: Test,\n logModule: string,\n base: string,\n): Promise<void> {\n return reportTestTaskUpdate(rpc, test, logModule, base, 'test-prepare');\n}\n\n/** Report test finished execution */\nexport async function reportTestFinished(\n rpc: WorkerRPC,\n test: Test,\n logModule: string,\n base: string,\n): Promise<void> {\n return reportTestTaskUpdate(rpc, test, logModule, base, 'test-finished');\n}\n\n/** Report test retried (sent when test failed and is going to be retried) */\nexport async function reportTestRetried(\n rpc: WorkerRPC,\n test: Test,\n logModule: string,\n base: string,\n): Promise<void> {\n return reportTestTaskUpdate(rpc, test, logModule, base, 'test-retried');\n}\n\n// ============================================================================\n// Other Reporting\n// ============================================================================\n\n/** Report user console log messages */\nexport async function reportUserConsoleLogs(\n rpc: WorkerRPC,\n logs: AssemblyScriptConsoleLog[],\n logModule: string,\n base: string,\n task: Task,\n): Promise<void> {\n if (logs.length === 0) {\n return;\n }\n\n const stdLogs = logs.filter(l => !l.isError);\n const errorLogs = logs.filter(l => l.isError);\n\n const stdContent: string = stdLogs.map(l => `${l.msg}`).join('\\n');\n const errorContent: string = errorLogs.filter(l => l.isError).map(l => `${l.msg}`).join('\\n');\n\n const stdLog: UserConsoleLog = {\n content: `${stdContent}\\n`,\n size: stdContent.length,\n browser: false,\n type: 'stdout',\n time: stdLogs.length > 0 ? stdLogs[0]!.time : Date.now(),\n taskId: task.id,\n origin: task.id\n };\n \n const errorLog: UserConsoleLog = {\n content: `${errorContent}\\n`,\n size: errorContent.length,\n browser: false,\n type: 'stderr',\n time: errorLogs.length > 0 ? errorLogs[0]!.time : Date.now(),\n taskId: task.id,\n origin: task.id\n };\n\n const reportPromises: Promise<void>[] = [];\n if (stdContent.length > 0) {\n reportPromises.push(rpc.onUserConsoleLog(stdLog));\n }\n if (errorContent.length > 0) {\n reportPromises.push(rpc.onUserConsoleLog(errorLog));\n }\n\n await Promise.all(reportPromises);\n\n debug(`[${logModule} RPC] ${getTaskLogLabel(base, task)} - Reported onUserConsoleLog | ${logs.length} messages`);\n}\n\n// ============================================================================\n// Final Flush\n// ============================================================================\n\n/** Flush any pending RPC updates */\nexport async function flushRpcUpdates(\n rpc: WorkerRPC,\n): Promise<void> {\n await rpc.onTaskUpdate([], []);\n}\n","import { resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport type { WasmImportsFactory } from '../types/types.js';\nimport { debug } from '../util/debug.js';\nimport { POOL_ERROR_NAMES } from '../types/constants.js';\nimport { createPoolError } from '../util/pool-errors.js';\n\nexport async function loadUserWasmImportsFactory(\n relativePath: string | undefined,\n projectRoot: string,\n logModule: string,\n): Promise<WasmImportsFactory | undefined> {\n if (!relativePath) {\n return undefined;\n }\n\n const path = resolve(projectRoot, relativePath);\n const safeUrl = pathToFileURL(path).href;\n\n try {\n const start = performance.now();\n const createWasmImports = (await import(safeUrl)).default;\n debug(`[${logModule}] Imported user WasmImportsFactory \"${safeUrl}\" | TIMING ${(performance.now() - start).toFixed(2)} ms`);\n\n if (typeof createWasmImports !== 'function') {\n const msg = `Could not load user WasmImportsFactory from \"${safeUrl}\".`\n + ` Ensure that your module has a default export matching () => WebAssembly.Imports`\n + ` \\nDefault export type is currently \"${typeof createWasmImports}\"`;\n \n throw createPoolError(POOL_ERROR_NAMES.WASMUserImportsError, msg);\n } else {\n return createWasmImports;\n }\n } catch (error) {\n const msg = `Could not load user WasmImportsFactory from \"${safeUrl}\".`\n + ` Ensure that your module path is relative to the project root`\n + ` (location of shallowest vitest config), and that it has a`\n + ` default export matching () => WebAssembly.Imports`;\n throw createPoolError(\n POOL_ERROR_NAMES.WASMUserImportsError,\n msg,\n error,\n true\n );\n }\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"load-user-imports-iAQUMKAi.mjs","names":[],"sources":["../src/wasm-executor/wasm-console.ts","../src/wasm-executor/collect-options.ts","../src/wasm-executor/wasm-imports.ts","../src/wasm-executor/index.ts","../src/pool-thread/rpc-reporter.ts","../src/pool-thread/load-user-imports.ts"],"sourcesContent":["import type { AssemblyScriptConsoleLogHandler } from '../types/types.js';\nimport { liftString } from '../util/assemblyscript/binding-helpers.js';\n\nexport function createWasmConsole(\n memory: WebAssembly.Memory,\n handleLog: AssemblyScriptConsoleLogHandler\n) {\n const getMessage = (msgPtr: number, memory: WebAssembly.Memory, prefix: string = ''): string => {\n return `${prefix}${msgPtr ? liftString(memory, msgPtr) : '<no message>'}`;\n };\n\n const timersByLabel: { [label: string]: number } = {};\n\n // provides the AssemblyScript \"brower-like console\" from AS std lib\n // see https://github.com/AssemblyScript/assemblyscript/blob/v0.28.9/std/assembly/index.d.ts#L2609\n return {\n 'console.assert': <T>(assertion: T, msgPtr: number): void => {\n if (!assertion) {\n const msg = getMessage(msgPtr, memory);\n handleLog(`Assertion failed${msg ? `: ${msg}` : ''}`);\n }\n },\n 'console.log': (msgPtr: number): void => {\n handleLog(getMessage(msgPtr, memory));\n },\n 'console.debug': (msgPtr: number): void => {\n handleLog(getMessage(msgPtr, memory, 'Debug: '));\n },\n 'console.info': (msgPtr: number): void => {\n handleLog(getMessage(msgPtr, memory, 'Info: '));\n },\n 'console.warn': (msgPtr: number): void => {\n handleLog(getMessage(msgPtr, memory, 'Warning: '), true);\n },\n 'console.error': (msgPtr: number): void => {\n handleLog(getMessage(msgPtr, memory, 'Error: '), true);\n },\n 'console.time': (labelPtr?: number): void => {\n const label = labelPtr ? liftString(memory, labelPtr) ?? 'default' : 'default';\n timersByLabel[label] = performance.now();\n },\n 'console.timeLog': (labelPtr?: number): void => {\n const label = labelPtr ? liftString(memory, labelPtr) ?? 'default' : 'default';\n const start = timersByLabel[label];\n let msg = '';\n if (start === undefined) {\n msg = `Warning: No such label '${label}' for console.timeLog()`;\n } else {\n msg = `${label}: ${(performance.now() - start).toFixed(3)}ms`;\n }\n handleLog(msg);\n },\n 'console.timeEnd': (labelPtr?: number): void => {\n const label = labelPtr ? liftString(memory, labelPtr) ?? 'default' : 'default';\n const start = timersByLabel[label];\n let msg = '';\n if (start === undefined) {\n msg = `Warning: No such label '${label}' for console.timeLog()`;\n } else {\n msg = `${label}: ${(performance.now() - start).toFixed(3)}ms`;\n }\n handleLog(msg);\n delete timersByLabel[label];\n },\n\n trace(msgPtr: number, n: number, a0: any, a1: any, a2: any, a3: any): void {\n const msg = liftString(memory, msgPtr);\n const args: any[] = [a0, a1, a2, a3];\n const nArgs: any[] = n && n > 0 ? args.slice(0, n) : args;\n\n console.trace(`WASM Trace:${msg ? ` ${msg}` : ''}`, ...nArgs);\n },\n };\n}\n","import { AssemblyScriptTestOptions } from '../types/types.js';\n\nconst TEST_OPTION_UNDEFINED: number = -1;\nconst TEST_OPTION_TRUE: number = 1;\n\nexport function mergeAssemblyScriptTestOptions(\n baseOptions: AssemblyScriptTestOptions,\n timeout: number,\n retry: number,\n skip: number,\n only: number,\n fails: number,\n): AssemblyScriptTestOptions {\n const options: AssemblyScriptTestOptions = { ...baseOptions };\n \n // numerical options\n if (timeout > TEST_OPTION_UNDEFINED) {\n options.timeout = timeout;\n }\n if (retry > TEST_OPTION_UNDEFINED) {\n options.retry = retry;\n }\n\n // boolean options\n if (skip > TEST_OPTION_UNDEFINED) {\n options.skip = skip === TEST_OPTION_TRUE ? true : false;\n }\n if (only > TEST_OPTION_UNDEFINED) {\n options.only = only === TEST_OPTION_TRUE ? true : false;\n }\n if (fails > TEST_OPTION_UNDEFINED) {\n options.fails = fails === TEST_OPTION_TRUE ? true : false;\n }\n\n return options;\n}\n","import type { File, Suite, Test } from '@vitest/runner/types';\n\nimport type {\n AssemblyScriptConsoleLogHandler,\n AssemblyScriptSuiteTaskMeta,\n AssemblyScriptTestError,\n AssemblyScriptTestTaskMeta,\n FailedAssertion,\n WasmImportsFactory,\n} from '../types/types.js';\nimport {\n AS_POOL_WASM_COVERAGE_MEM_IMPORT_NAME,\n AS_POOL_WASM_IMPORTS_MODULE_NAME,\n POOL_ERROR_NAMES,\n TEST_ERROR_NAMES\n} from '../types/constants.js';\nimport { debug } from '../util/debug.js';\nimport { abortWASMExecution, abortWASMExecutionOnSuccess, createPoolError, getExpectedMessageOrAny } from '../util/pool-errors.js';\nimport { liftString } from '../util/assemblyscript/binding-helpers.js';\nimport { decodeAbortInfo } from './wasm-memory.js';\nimport { createWasmConsole } from './wasm-console.js';\nimport { mergeAssemblyScriptTestOptions } from './collect-options.js';\nimport { createSuiteTask, createTestTask, failTestAssertionError, failTestRuntimeError } from '../util/vitest-tasks.js';\n\nfunction createUserWasmImports(\n createWasmImports: WasmImportsFactory | undefined,\n memory: WebAssembly.Memory,\n module: WebAssembly.Module,\n logPrefix: string\n) {\n let userEnvImports: WebAssembly.ModuleImports | undefined;\n let userCustomEnvImports: WebAssembly.Imports | undefined;\n\n if (createWasmImports) {\n try {\n const start = performance.now();\n const userImports: WebAssembly.Imports = createWasmImports({\n memory,\n module,\n utils: {\n liftString: (stringPtr: number) => liftString(memory, stringPtr)\n }\n });\n debug(`${logPrefix} Created user WASM imports for test execution in ${(performance.now() - start).toFixed(2)} ms`);\n\n userEnvImports = userImports?.env;\n userCustomEnvImports = { ...userImports };\n \n if (userEnvImports) {\n delete userCustomEnvImports.env;\n }\n } catch (error) {\n const msg = `Could not create user WasmImportsFactory.`\n + ` Ensure that your module has a default export matching () => WebAssembly.Imports`;\n throw createPoolError(\n POOL_ERROR_NAMES.WASMUserImportsError,\n msg,\n error,\n true\n );\n }\n }\n\n return { userEnvImports, userCustomEnvImports };\n}\n\n/**\n * Create import object for test discovery\n */\nexport function createDiscoveryImports(\n memory: WebAssembly.Memory,\n module: WebAssembly.Module,\n file: File,\n handleLog: AssemblyScriptConsoleLogHandler,\n logPrefix: string,\n coverageMemory?: WebAssembly.Memory,\n createWasmImports?: WasmImportsFactory,\n): WebAssembly.Imports {\n const suiteStack: Suite[] = [file];\n\n const {\n userEnvImports,\n userCustomEnvImports\n } = createUserWasmImports(createWasmImports, memory, module, logPrefix);\n \n return {\n env: {\n // users can choose to hide these with their own\n ...createWasmConsole(memory, handleLog),\n\n // user imports for \"env\"\n ...(userEnvImports ?? {}),\n\n memory,\n\n // handle runtime aborts, which are always unexpected during discovery\n abort(msgPtr: number, filePtr: number, line: number, column: number) {\n const { message, location } = decodeAbortInfo(memory, msgPtr, filePtr, line, column);\n const msgAtLoc = `${message}${location ? ` at ${location}` : ''}`;\n \n debug(`${logPrefix} - Unexpected abort during test discovery: ${msgAtLoc}`);\n\n const testError: AssemblyScriptTestError = {\n message,\n name: TEST_ERROR_NAMES.WASMRuntimeError,\n };\n\n throw abortWASMExecution(testError, new Error());\n },\n },\n\n [AS_POOL_WASM_IMPORTS_MODULE_NAME]: {\n\n ...(coverageMemory ? { [AS_POOL_WASM_COVERAGE_MEM_IMPORT_NAME]: coverageMemory } : {}),\n\n // stubs during discovery\n __assertion_pass() {},\n __assertion_fail() {},\n __expect_throw() {},\n __end_expect_throw() {},\n\n __begin_register_suite(\n namePtr: number,\n timeout: number,\n retry: number,\n skip: number,\n only: number,\n fails: number,\n ) {\n const parentSuite = suiteStack[suiteStack.length - 1]!;\n const defaultTestOptions = (parentSuite.meta as AssemblyScriptSuiteTaskMeta).defaultTestOptions;\n const suiteName = liftString(memory, namePtr) ?? 'unknown suite';\n const options = mergeAssemblyScriptTestOptions(defaultTestOptions, timeout, retry, skip, only, fails);\n const suite = createSuiteTask(suiteName, file, parentSuite, options);\n suiteStack.push(suite);\n\n debug(\n `${logPrefix} - Registering Suite \"${suite.name}\" | timeout: ${options.timeout} ms | retry: ${options.retry}`\n + ` | skip: ${options.skip} | only: ${options.only} | fails: ${options.fails} `\n + ` | parent: \"${suite.suite?.name}\" (parent idx: ${(suite.meta as AssemblyScriptSuiteTaskMeta).idxInParentTasks})`\n );\n },\n \n __end_register_suite(_namePtr: number) {\n const suite = suiteStack.pop();\n\n debug(\n `${logPrefix} - Registered Suite \"${suite?.name}\" | ${suite?.tasks.length} top-level tasks | mode: \"${suite?.mode}\"`\n + ` | parent: \"${suite?.suite?.name}\" (parent idx: ${(suite?.meta as AssemblyScriptSuiteTaskMeta)?.idxInParentTasks})`\n );\n },\n\n // called by test() to register test names and function indices\n __register_test(\n namePtr: number,\n fnIndex: number,\n timeout: number,\n retry: number,\n skip: number,\n only: number,\n fails: number,\n ) {\n const parentSuite = suiteStack[suiteStack.length - 1]!;\n const defaultTestOptions = (parentSuite.meta as AssemblyScriptSuiteTaskMeta).defaultTestOptions;\n const testName = liftString(memory, namePtr) ?? 'unknown test';\n const options = mergeAssemblyScriptTestOptions(defaultTestOptions, timeout, retry, skip, only, fails);\n const test = createTestTask(testName, fnIndex, file, parentSuite, options);\n \n debug(`${logPrefix} - Registered test \"${test.name}\" | mode (pre-interp): \"${test.mode}\"`\n + ` | fnIndex ${fnIndex} | timeout: ${options.timeout} ms | retry: ${options.retry} | skip: ${options.skip}`\n + ` | only: ${options.only} | fails: ${options.fails} | suite: \"${test.suite?.name}\"`\n + ` (parent idx: ${(test.meta as AssemblyScriptTestTaskMeta).idxInParentTasks})`\n );\n },\n },\n\n // user imports for any other environments they defined\n ...(userCustomEnvImports ?? {}),\n };\n}\n\n/**\n * Create import object for test execution\n *\n * Used during test execution to capture test results / assertions, and to handle\n * runtime aborts as expected cases for test execution by capturing the error on the test meta.\n */\nexport function createTestExecutionImports(\n memory: WebAssembly.Memory,\n module: WebAssembly.Module,\n test: Test,\n handleLog: AssemblyScriptConsoleLogHandler,\n logPrefix: string,\n coverageMemory?: WebAssembly.Memory,\n createWasmImports?: WasmImportsFactory,\n): { imports: WebAssembly.Imports; provideFunctionTable: (table: WebAssembly.Table) => void; } {\n // execution imports are created per-test, so these represent per-test state\n let lastFailedAssertion: FailedAssertion | undefined;\n let isExpectingError: boolean = false;\n let expectedErrorMsgStr: string | undefined;\n let wasmFunctionTable: WebAssembly.Table | undefined;\n\n const {\n userEnvImports,\n userCustomEnvImports\n } = createUserWasmImports(createWasmImports, memory, module, logPrefix);\n\n const imports = {\n env: {\n // users can choose to hide these with their own\n ...createWasmConsole(memory, handleLog),\n\n // user imports for \"env\"\n ...(userEnvImports ?? {}),\n\n memory,\n\n abort(msgPtr: number, filePtr: number, line: number, column: number) {\n const { message, location } = decodeAbortInfo(memory, msgPtr, filePtr, line, column);\n const msgAtLoc = `${message}${location ? ` at ${location}` : ''}`;\n \n debug(`${logPrefix} - Handling test execution abort: ${msgAtLoc}`);\n\n let failureMessage = message;\n\n // handle expected aborts for thrown errors\n if (isExpectingError) {\n // TODO: decide if .includes is correct here or not\n if (!expectedErrorMsgStr || message.includes(expectedErrorMsgStr)) {\n // either no specifically expected error (any error), or error message matches\n (test.meta as AssemblyScriptTestTaskMeta).assertionsPassedCount++;\n \n debug(`${logPrefix} - Thrown error matches expected - assertion passes`);\n\n // abort without failing the test\n throw abortWASMExecutionOnSuccess();\n } else {\n const expected = getExpectedMessageOrAny(expectedErrorMsgStr);\n\n // error message mismatch\n failureMessage = `expected function to throw error ${expected}, but received error \"${message}\"`;\n\n lastFailedAssertion = {\n message: failureMessage,\n actualTypeName: 'string',\n expectedTypeName: 'string',\n valuesProvided: true,\n actual: message,\n expected: expectedErrorMsgStr\n };\n\n const errStr = `Thrown error does not match expected | Expected: ${expected} | Actual: \"${message}\"`;\n debug(`${logPrefix} - Assertion failed: ${errStr}`);\n }\n }\n\n const testError = lastFailedAssertion\n ? failTestAssertionError(test, lastFailedAssertion)\n : failTestRuntimeError(test, '', failureMessage);\n\n throw abortWASMExecution(testError, new Error());\n },\n },\n\n [AS_POOL_WASM_IMPORTS_MODULE_NAME]: {\n \n ...(coverageMemory ? { [AS_POOL_WASM_COVERAGE_MEM_IMPORT_NAME]: coverageMemory } : {}),\n\n // stubs during execution\n __register_test() {},\n __begin_register_suite() {},\n __end_register_suite() {},\n\n __assertion_pass() {\n (test.meta as AssemblyScriptTestTaskMeta).assertionsPassedCount++;\n },\n\n __assertion_fail(msgPtr: number, actualTypeNamePtr: number, expectedTypeNamePtr: number, valuesProvided: boolean, actualPtr?: number, expectedPtr?: number) {\n const errorMsg = liftString(memory, msgPtr) ?? '';\n const actualTypeName = liftString(memory, actualTypeNamePtr) ?? '';\n const expectedTypeName = liftString(memory, expectedTypeNamePtr) ?? '';\n let valuesMsg = ' | No Values Provided';\n \n lastFailedAssertion = {\n actualTypeName,\n expectedTypeName,\n message: errorMsg,\n valuesProvided: Boolean(valuesProvided)\n };\n\n (test.meta as AssemblyScriptTestTaskMeta).assertionsFailed.push(lastFailedAssertion);\n \n if (valuesProvided && actualPtr && expectedPtr) {\n lastFailedAssertion.actual = liftString(memory, actualPtr);\n lastFailedAssertion.expected = liftString(memory, expectedPtr);\n valuesMsg = ` | Actual Type: ${actualTypeName} | Expected Type: ${expectedTypeName}`\n + ` | Actual Value: \\`${lastFailedAssertion.actual}\\` | Expected Value: \\`${lastFailedAssertion.expected}\\``;\n }\n \n debug(`${logPrefix} - Assertion failed: ${errorMsg}${valuesMsg}`);\n },\n\n __expect_throw(fnIndex: number, expectedErrorMsgPtr?: number) {\n isExpectingError = true;\n if (expectedErrorMsgPtr) {\n expectedErrorMsgStr = liftString(memory, expectedErrorMsgPtr);\n }\n\n debug(`${logPrefix} - Registered expected error throw: ${getExpectedMessageOrAny(expectedErrorMsgStr)}`);\n\n if (wasmFunctionTable && typeof wasmFunctionTable.get === 'function') {\n const fn = wasmFunctionTable.get(fnIndex);\n if (!fn) {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMExecutionHarnessError,\n `Could not access function (fnPtr ${fnIndex}) which is expected to throw in test \"${test.name}\"`,\n );\n }\n\n // successful:\n // - throws in WASM, calls abort handler\n // - abort handler confirms error matches expected, does NOT fail test, halts execution with WASMExecutionAbortError\n // - executor catches WASMExecutionAbortError as 'known' and proceeds to process & report passed test\n // failure (wrong error):\n // - throws in WASM, calls abort handler\n // - abort handler confirms error matches mismatch, failTest packages up an appropriate test error\n // - abort handler halts execution with WASMExecutionAbortError containing test error\n // - executor catches WASMExecutionAbortError as 'known' and proceeds to process & report test error\n // failure (no error):\n // - does NOT throw in WASM\n // - WASM continues executing and calls __end_expect_throw\n // - __end_expect_throw sees it is STILL expecting an error, failTest packages up an appropriate test error\n // - __end_expect_throw halts execution with WASMExecutionAbortError containing test error\n // - executor catches WASMExecutionAbortError as 'known' and proceeds to process & report test error\n debug(`${logPrefix} - Calling function (idx ${fnIndex})`);\n fn();\n } else {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMExecutionHarnessError,\n `Could not access WASM function table to call function expected to throw`,\n );\n }\n },\n\n __end_expect_throw() {\n if (isExpectingError) {\n const errStr = `Expected thrown error but got none | Expected: \"${expectedErrorMsgStr}\"`;\n debug(`${logPrefix} - Assertion failed: ${errStr}`);\n \n const failureMessage = `function did not throw, but was expected to throw error: ${getExpectedMessageOrAny(expectedErrorMsgStr)}`;\n const testError = failTestAssertionError(test, {\n message: failureMessage,\n actualTypeName: 'undefined',\n expectedTypeName: 'string',\n valuesProvided: true,\n actual: undefined,\n expected: expectedErrorMsgStr\n });\n\n // Must throw here to halt WASM execution on an assertion or runtime failure for this test.\n // This will be caught by the executor and reported as an appropriate test error\n throw abortWASMExecution(testError);\n }\n },\n },\n\n // user imports for any other environments they defined\n ...(userCustomEnvImports ?? {}),\n };\n\n return {\n imports,\n provideFunctionTable: (table: WebAssembly.Table) => {\n debug(`${logPrefix} - Got WASM function table | length: ${table.length}`);\n wasmFunctionTable = table;\n },\n };\n}\n","import { basename } from 'node:path';\nimport type { SerializedDiffOptions } from '@vitest/utils/diff';\nimport type { File, Test } from '@vitest/runner/types';\n\nimport type {\n AssemblyScriptConsoleLogHandler,\n AssemblyScriptPoolError,\n AssemblyScriptTestError,\n AssemblyScriptTestTaskMeta,\n CoverageData,\n ResolvedAssemblyScriptPoolOptions,\n ThreadImports,\n WASMCompilation,\n WASMExecutorPerfTimings,\n} from '../types/types.js';\nimport { AS_POOL_ERROR_FLAG, POOL_ERROR_NAMES } from '../types/constants.js';\nimport { debug, debugOverride } from '../util/debug.js';\nimport { createMemory } from './wasm-memory.js';\nimport { createDiscoveryImports, createTestExecutionImports } from './wasm-imports.js';\nimport { enhanceTestError } from './wasm-errors.js';\nimport { createPoolError, wrapPoolError } from '../util/pool-errors.js';\nimport { failTestRuntimeError, getTaskLogLabel } from '../util/vitest-tasks.js';\nimport { extractCallStack } from './source-maps.js';\n\nconst SIG_MISMATCH_ERROR_MSG = `WASM function signature type mismatch during test collection.`\n + ` This is most likely caused by passing a type-inferred, non-void callback to expect().`\n + ` To fix, either explicitly define the non-void return type on the callback`\n + ` e.g. \\`expect((): i32 => failingFunction()).toThrowError()\\``\n + ` or use braces to make it void e.g. \\`expect(() => { failingFunction(); }).toThrowError()\\`.`\n + ` Look for the failing expect() within the describe() block indicated in the stack trace.`;\n\nfunction verifyMemoryRequirements(\n compilation: WASMCompilation,\n poolOptions: ResolvedAssemblyScriptPoolOptions,\n) {\n if (poolOptions.testMemoryPagesInitial && poolOptions.testMemoryPagesInitial < compilation.requiredMemory.testMemory.initialPages) {\n throw createPoolError(\n POOL_ERROR_NAMES.PoolConfigError,\n `WASM binary requires initial test memory pages (${compilation.requiredMemory.testMemory.initialPages}) exceeding configured \"testMemoryPagesInitial\"`\n + ` (${poolOptions.testMemoryPagesInitial}). Increase value, or remove for auto sizing.`,\n );\n }\n \n if (poolOptions.testMemoryPagesMax && compilation.requiredMemory.testMemory.maximumPages\n && poolOptions.testMemoryPagesMax < compilation.requiredMemory.testMemory.maximumPages\n ) {\n throw createPoolError(\n POOL_ERROR_NAMES.PoolConfigError,\n `WASM binary requires maximum test memory pages (${compilation.requiredMemory.testMemory.maximumPages}) exceeding configured \"testMemoryPagesMax\"`\n + ` (${poolOptions.testMemoryPagesMax}). Increase value, or remove for auto sizing.`,\n );\n }\n \n if (poolOptions.coverageMemoryPagesInitial && poolOptions.coverageMemoryPagesInitial < compilation.requiredMemory.coverageMemory.initialPages) {\n throw createPoolError(\n POOL_ERROR_NAMES.PoolConfigError,\n `WASM binary requires initial coverage memory pages (${compilation.requiredMemory.coverageMemory.initialPages}) exceeding configured \"coverageMemoryPagesInitial\"`\n + ` (${poolOptions.coverageMemoryPagesInitial}). Increase value, or remove for auto sizing.`,\n );\n }\n\n if (poolOptions.coverageMemoryPagesMax && compilation.requiredMemory.coverageMemory.maximumPages\n && poolOptions.coverageMemoryPagesMax < compilation.requiredMemory.coverageMemory.maximumPages\n ) {\n throw createPoolError(\n POOL_ERROR_NAMES.PoolConfigError,\n `WASM binary requires maximum coverage memory pages (${compilation.requiredMemory.coverageMemory.maximumPages}) exceeding configured \"coverageMemoryPagesMax\"`\n + ` (${poolOptions.coverageMemoryPagesMax}). Increase value, or remove for auto sizing.`,\n );\n }\n}\n\nfunction createExecutorMemories(\n compilation: WASMCompilation,\n poolOptions: ResolvedAssemblyScriptPoolOptions,\n includeCoverageMemory: boolean,\n): { testMemory: WebAssembly.Memory; coverageMemory?: WebAssembly.Memory } {\n verifyMemoryRequirements(compilation, poolOptions);\n\n const testMemory = createMemory(\n poolOptions.testMemoryPagesInitial ?? compilation.requiredMemory.testMemory.initialPages,\n poolOptions.testMemoryPagesMax ?? compilation.requiredMemory.testMemory.maximumPages\n );\n const coverageMemory = includeCoverageMemory ?\n createMemory(\n poolOptions.coverageMemoryPagesInitial ?? compilation.requiredMemory.coverageMemory.initialPages,\n poolOptions.coverageMemoryPagesMax ?? compilation.requiredMemory.coverageMemory.maximumPages\n )\n : undefined;\n\n return { testMemory, coverageMemory };\n}\n\n/**\n * Discover tests via test() and suites via describe() registration calls\n */\nexport async function executeWASMDiscovery(\n compilation: WASMCompilation,\n poolOptions: ResolvedAssemblyScriptPoolOptions,\n isBinaryInstrumented: boolean,\n handleLog: AssemblyScriptConsoleLogHandler,\n file: File,\n moduleLabel: string,\n threadImports: ThreadImports,\n): Promise<void> {\n const base = basename(file.filepath);\n const logPrefix = `[${moduleLabel} Exec] ${getTaskLogLabel(base, file)}`;\n \n try {\n const { testMemory, coverageMemory } = createExecutorMemories(compilation, poolOptions, isBinaryInstrumented);\n\n const importObject = createDiscoveryImports(\n testMemory,\n compilation.compiledModule,\n file,\n handleLog,\n logPrefix,\n coverageMemory,\n threadImports.createUserWasmImports\n );\n\n // Instantiate WASM module\n const instance = new WebAssembly.Instance(compilation.compiledModule, importObject);\n const exports = instance.exports as Record<string, unknown>;\n\n // Call _start to run top-level test() and describe()\n if (typeof exports._start === 'function') {\n exports._start();\n } else {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMExecutionHarnessError,\n 'no _start() export found on compiled WASM binary'\n );\n }\n } catch (error: any) {\n if (error && error[AS_POOL_ERROR_FLAG]) {\n throw error;\n }\n\n // void type inference issue\n if (error instanceof WebAssembly.RuntimeError && error.message.includes('null function or function signature mismatch')) {\n throw createPoolError(POOL_ERROR_NAMES.PoolSyntaxError, SIG_MISMATCH_ERROR_MSG, error);\n }\n\n if (error instanceof Error) {\n let match: RegExpExecArray | null = null;\n let moduleName: string | undefined;\n let functionName: string | undefined;\n let errorMessage: string | undefined;\n \n if (match = /\"(.+)\": module is not an object or function/.exec(error.message)) {\n // module import error\n moduleName = match[1];\n errorMessage = `Expected module \"${moduleName}\" to be defined as an object`\n + ` or function within user WASM imports (returned by WasmImportsFactory).`;\n } else if (match = /\"(.+)\" (function=)?\"(.+)\": function import requires a callable/.exec(error.message)) {\n // function import error\n moduleName = match[1];\n functionName = match[3];\n errorMessage = `Expected function \"${functionName}\" to be defined in module \"${moduleName}\"`\n + ` within user WASM imports (returned by WasmImportsFactory).`;\n }\n\n if (errorMessage) {\n throw createPoolError(POOL_ERROR_NAMES.WASMUserImportsError, errorMessage, error);\n }\n }\n \n // any other error\n throw wrapPoolError(POOL_ERROR_NAMES.WASMExecutionHarnessError, error, true);\n }\n\n debug(`${logPrefix} - Discovered ${file.tasks.length} top-level tasks`);\n return;\n}\n\n/**\n * Execute a single test with crash isolation\n */\nexport async function executeWASMTest(\n test: Test,\n compilation: WASMCompilation,\n poolOptions: ResolvedAssemblyScriptPoolOptions,\n collectCoverage: boolean,\n handleLog: AssemblyScriptConsoleLogHandler,\n moduleLabel: string,\n threadImports: ThreadImports,\n projectRoot: string,\n diffOptions?: SerializedDiffOptions,\n): Promise<{ test: Test, testTimings: WASMExecutorPerfTimings }> {\n const testTimings: WASMExecutorPerfTimings = {\n fnInit: performance.now(),\n execStart: 0,\n execEnd: 0,\n fnfinal: 0\n };\n const base = basename(test.file.filepath);\n const fullModuleLabel = `${moduleLabel} Exec`;\n const taskLabel = getTaskLogLabel(base, test);\n const logPrefix = `[${fullModuleLabel}] ${taskLabel}`;\n\n function covDebug(...args: any[]): void {\n if (poolOptions.debugCoverageExtract) {\n debugOverride(...args);\n }\n };\n\n const { testMemory, coverageMemory } = createExecutorMemories(compilation, poolOptions, collectCoverage);\n\n // Create import object with pool-side functions for capturing test execution results\n const { imports, provideFunctionTable } = createTestExecutionImports(\n testMemory,\n compilation.compiledModule,\n test,\n handleLog,\n logPrefix,\n coverageMemory,\n threadImports.createUserWasmImports\n );\n\n // Instantiate fresh WASM instance for this test\n const instance = new WebAssembly.Instance(compilation.compiledModule, imports);\n const exports = instance.exports as Record<string, unknown>;\n\n // Func table accessable because we're using the AS compiler --exportTable flag\n const table = exports.table as WebAssembly.Table | undefined;\n \n // allow imports to access table\n if (table && typeof table.get === 'function') {\n provideFunctionTable(table);\n }\n\n // Call _start to run top-level code. Test registration is stubbed/noop duing execution,\n // but this call is still needed to initialize any user-defined globals / other top level code.\n if (typeof exports._start === 'function') {\n // Not explicitly handling with try-catch here because failures in _start should be\n // caught during discovery and source-mapped. If this somehow fails, the worker still catches it.\n exports._start();\n } else {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMExecutionHarnessError,\n 'no _start() export found on compiled WASM binary'\n );\n }\n\n let testFn: (() => void) | null | undefined;\n \n if (table && typeof table.get === 'function') {\n const idx = (test.meta as AssemblyScriptTestTaskMeta).fnIndex;\n testFn = table.get(idx) as (() => void) | null;\n\n if (!testFn) {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMExecutionHarnessError,\n `Test function at index ${idx} not found in function table`\n );\n }\n } else {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMExecutionHarnessError,\n 'Function table not found in WASM exports (missing --exportTable flag?)'\n );\n }\n\n // try-catch to ensure we capture known test errors to report\n // as AssemblyScriptTestErrors to vitest\n try {\n // Execute this test\n testTimings.execStart = performance.now();\n testFn();\n testTimings.execEnd = performance.now();\n\n // If we reach here, test passed, i.e. No abort occurred.\n // Proceed below to prepare the test result\n } catch (error: any) {\n testTimings.execEnd = performance.now();\n\n let testError: AssemblyScriptTestError;\n let stack: NodeJS.CallSite[];\n let allowStackJS: boolean;\n let applyStackToTestErrorCause: boolean;\n\n if (error && error[AS_POOL_ERROR_FLAG]) {\n const wrapper = error as AssemblyScriptPoolError;\n testError = wrapper.testError;\n stack = wrapper.originalErrorRawStack;\n allowStackJS = wrapper.originalErrorMayContainJS;\n applyStackToTestErrorCause = wrapper.applyStackToTestErrorCause;\n } else if (error instanceof Error) {\n testError = failTestRuntimeError(test, error.name, error.message);\n stack = extractCallStack(error);\n allowStackJS = true;\n applyStackToTestErrorCause = false;\n } else {\n testError = failTestRuntimeError(test, '', `Unexpected WASM test execution error: ${String(error)}`);\n stack = extractCallStack(new Error());\n allowStackJS = true;\n applyStackToTestErrorCause = false;\n }\n\n await enhanceTestError(\n testError,\n test,\n compilation.sourceMap,\n logPrefix,\n allowStackJS,\n projectRoot,\n applyStackToTestErrorCause,\n stack,\n diffOptions\n );\n }\n\n const meta = test.meta as AssemblyScriptTestTaskMeta;\n\n // Extract coverage hits from coverage memory\n if (collectCoverage && compilation.debugInfo) {\n if (!coverageMemory) {\n throw createPoolError(\n POOL_ERROR_NAMES.WASMExecutionHarnessError,\n 'Coverage memory not created despite collectCoverage=true'\n );\n }\n\n const coverage: CoverageData = {\n hitCountsByFileAndPosition: {},\n };\n\n // Read counters from coverage memory\n const extractedHitCounters = new Uint32Array(coverageMemory.buffer, 0, compilation.debugInfo.instrumentedFunctionCount);\n covDebug(`${logPrefix} - Read coverage memory for ${compilation.debugInfo.instrumentedFunctionCount} instrumented functions`);\n\n // Iterate all instrumented functions and build coverage data with hit counts extracted from coverage memory\n let functionsHit = 0;\n for (const [filePath, debugFunctions] of Object.entries(compilation.debugInfo.functionsByFileAndPosition)) {\n if (!coverage.hitCountsByFileAndPosition[filePath]) {\n coverage.hitCountsByFileAndPosition[filePath] = {};\n covDebug(`${logPrefix} - Extracting hits for source file \"${filePath}\"`);\n }\n\n for (const [positionKey, funcInfos] of Object.entries(debugFunctions)) {\n // Sum hit counts across all functions at this position (multiple for generic monomorphizations)\n let positionHitCount = 0;\n for (const funcInfo of funcInfos) {\n if (funcInfo.coverageMemoryIndex === undefined) {\n debug(`${logPrefix} - WARNING: NO COVERAGE MEMORY INDEX`\n + ` - func \"${funcInfo.name}\" (${positionKey}) Skipping hit extraction`\n );\n continue;\n }\n\n const hitCount = extractedHitCounters[funcInfo.coverageMemoryIndex] ?? 0;\n covDebug(`${logPrefix} - func \"${funcInfo.name}\" (${positionKey}) `\n + `[idx: ${funcInfo.coverageMemoryIndex}]: ${hitCount} hits`\n );\n positionHitCount += hitCount;\n }\n\n coverage.hitCountsByFileAndPosition[filePath][positionKey] = positionHitCount;\n\n if (positionHitCount > 0) {\n functionsHit++;\n }\n }\n }\n\n meta.coverageData = coverage;\n debug(`${logPrefix} - Extracted coverage data | ${functionsHit} functions hit`);\n }\n\n testTimings.fnfinal = performance.now();\n\n return { test, testTimings };\n}\n","/**\n * RPC Reporting Helpers\n *\n * This module provides helper functions for reporting test lifecycle events\n * to Vitest via RPC. All helpers are designed to be composable and reusable.\n */\n\nimport type { MessagePort } from 'node:worker_threads';\nimport { createBirpc } from 'birpc';\nimport type { RunnerRPC, RuntimeRPC, UserConsoleLog } from 'vitest';\nimport type {\n File,\n Suite,\n Test,\n Task,\n TaskEventPack, \n TaskResultPack,\n CancelReason,\n} from '@vitest/runner/types';\n\nimport type {\n AssemblyScriptConsoleLog,\n AssemblyScriptCoveragePayload,\n AssemblyScriptSuiteTaskMeta,\n VitestVersion,\n WorkerRPC\n} from '../types/types.js';\nimport { debug } from '../util/debug.js';\nimport { COVERAGE_PAYLOAD_FORMATS } from '../types/constants.js';\nimport {\n createAfterSuiteRunMeta,\n getTaskLogLabel,\n isSuiteOwnFile\n} from '../util/vitest-tasks.js';\n\n// ============================================================================\n// RPC Client Factory\n// ============================================================================\n\n/** Create RPC client from MessagePort */\nexport function createRpcClient(port: MessagePort): WorkerRPC {\n return createBirpc<RuntimeRPC, RunnerRPC>(\n {\n onCancel: (_reason: CancelReason) => void { }\n },\n {\n post: (v) => port.postMessage(v),\n on: (fn) => port.on('message', fn),\n }\n );\n}\n\n// ============================================================================\n// File Task Reporting\n// ============================================================================\n\n/** Report file as queued (before compilation & discovery starts) */\nexport async function reportFileQueued(\n rpc: WorkerRPC,\n fileTask: File,\n logModule: string,\n logLabel: string,\n): Promise<void> {\n await rpc.onQueued(fileTask);\n debug(`[${logModule} RPC] ${logLabel} - Reported onQueued for file \"${fileTask.filepath}\"`\n + ` | mode: \"${fileTask.mode}\" | state: \"${fileTask.result ? fileTask.result.state : '--'}\"`\n );\n}\n\n/** Report file collection complete with full task tree */\nexport async function reportFileCollected(\n rpc: WorkerRPC,\n fileTask: File,\n logModule: string,\n logLabel: string,\n): Promise<void> {\n await rpc.onCollected([fileTask]);\n debug(`[${logModule} RPC] ${logLabel} - Reported onCollected for file \"${fileTask.filepath}\"`\n + ` | ${fileTask.tasks.length} tasks | mode: \"${fileTask.mode}\" | state: \"${fileTask.result?.state}\"`\n );\n}\n\n/** Report file-level error (compilation/discovery failure) as \"suite-failed-early\" */\nexport async function reportFileError(\n rpc: WorkerRPC,\n fileTask: File, \n logModule: string,\n logLabel: string,\n): Promise<void> {\n const taskPack: TaskResultPack = [fileTask.id, fileTask.result, {}];\n const eventPack: TaskEventPack = [fileTask.id, \"suite-failed-early\", undefined];\n await rpc.onTaskUpdate([taskPack], [eventPack]);\n\n debug(`[${logModule} RPC] ${logLabel} - Reported \"suite-failed-early\" task update for \"${fileTask.filepath}\"`);\n}\n\n// ============================================================================\n// Suite Lifecycle Reporting\n// ============================================================================\n\n/** Report suite-prepare event */\nexport async function reportSuitePrepare(\n rpc: WorkerRPC,\n suite: Suite,\n logModule: string,\n base: string,\n): Promise<void> {\n // Report suite event (without the custom task meta so reporters won't log it)\n const taskPack: TaskResultPack = [suite.id, suite.result, {}];\n const eventPack: TaskEventPack = [suite.id, 'suite-prepare', undefined];\n\n await rpc.onTaskUpdate([taskPack], [eventPack]);\n\n debug(`[${logModule} RPC] ${getTaskLogLabel(base, suite)} - Reported \"suite-prepare\" task update`\n + ` | state: \"${suite.result?.state}\"`\n );\n}\n\n/** Report suite-finished event */\nexport async function reportSuiteFinished(\n rpc: WorkerRPC,\n suite: Suite,\n logModule: string,\n base: string,\n vitestVersion: VitestVersion = 'v4',\n): Promise<void> {\n const suiteLabel = getTaskLogLabel(base, suite);\n const rpcLogPrefix = `[${logModule} RPC] ${suiteLabel}`;\n const meta = suite.meta as AssemblyScriptSuiteTaskMeta;\n const coverageKeys: number = Object.keys(meta.coverageData?.hitCountsByFileAndPosition ?? {}).length;\n let coveragePromise: Promise<void> = Promise.resolve();\n \n // Report coverage if this is a file task, and coverage is available\n if (isSuiteOwnFile(suite) && coverageKeys > 0) {\n const coverage: AssemblyScriptCoveragePayload = {\n __format: COVERAGE_PAYLOAD_FORMATS.AssemblyScript,\n coverageData: meta.coverageData!,\n suiteLogLabel: suiteLabel\n };\n \n const afterSuiteMeta = createAfterSuiteRunMeta(\n coverage,\n [suite.file.filepath],\n suite.file.projectName,\n vitestVersion\n );\n coveragePromise = rpc.onAfterSuiteRun(afterSuiteMeta);\n\n debug(`${rpcLogPrefix} - onAfterSuiteRun: Reported suite coverage (${coverageKeys} unique positions)`);\n } else if (coverageKeys === 0) {\n debug(`${rpcLogPrefix} - onAfterSuiteRun: No suite coverage to report`);\n }\n\n // Report suite event (without the custom task meta so reporters won't log it)\n const taskPack: TaskResultPack = [suite.id, suite.result, {}];\n const eventPack: TaskEventPack = [suite.id, \"suite-finished\", undefined];\n\n await Promise.all([\n coveragePromise,\n rpc.onTaskUpdate([taskPack], [eventPack])\n ]);\n\n debug(`${rpcLogPrefix} - Reported \"suite-finished\" task update | state: \"${suite.result?.state}\"`\n + ` | duration: ${suite.result?.duration?.toFixed(2) ?? '--'} ms`\n );\n}\n\n// ============================================================================\n// Test Lifecycle Reporting\n// ============================================================================\n\nasync function reportTestTaskUpdate(\n rpc: WorkerRPC,\n test: Test,\n logModule: string,\n base: string,\n updateEvent: 'test-prepare' | 'test-finished' | 'test-retried'\n): Promise<void> {\n // Report test event (without the custom task meta so reporters won't log it)\n const taskPack: TaskResultPack = [test.id, test.result, {}];\n const eventPack: TaskEventPack = [test.id, updateEvent, undefined];\n\n debug(`[${logModule} RPC] ${getTaskLogLabel(base, test)} - Reporting \"${updateEvent}\" task update...`\n + ` | state: \"${test.result?.state}\"`\n + `${updateEvent === 'test-prepare' ? '' : ` | duration: ${test.result?.duration?.toFixed(2) ?? '--'} ms`}`\n );\n await rpc.onTaskUpdate([taskPack], [eventPack]);\n debug(`[${logModule} RPC] ${getTaskLogLabel(base, test)} - Reported \"${updateEvent}\" task update`\n + ` | state: \"${test.result?.state}\"`\n + `${updateEvent === 'test-prepare' ? '' : ` | duration: ${test.result?.duration?.toFixed(2) ?? '--'} ms`}`\n );\n}\n\n/** Report test starting execution */\nexport async function reportTestPrepare(\n rpc: WorkerRPC,\n test: Test,\n logModule: string,\n base: string,\n): Promise<void> {\n return reportTestTaskUpdate(rpc, test, logModule, base, 'test-prepare');\n}\n\n/** Report test finished execution */\nexport async function reportTestFinished(\n rpc: WorkerRPC,\n test: Test,\n logModule: string,\n base: string,\n): Promise<void> {\n return reportTestTaskUpdate(rpc, test, logModule, base, 'test-finished');\n}\n\n/** Report test retried (sent when test failed and is going to be retried) */\nexport async function reportTestRetried(\n rpc: WorkerRPC,\n test: Test,\n logModule: string,\n base: string,\n): Promise<void> {\n return reportTestTaskUpdate(rpc, test, logModule, base, 'test-retried');\n}\n\n// ============================================================================\n// Other Reporting\n// ============================================================================\n\n/** Report user console log messages */\nexport async function reportUserConsoleLogs(\n rpc: WorkerRPC,\n logs: AssemblyScriptConsoleLog[],\n logModule: string,\n base: string,\n task: Task,\n): Promise<void> {\n if (logs.length === 0) {\n return;\n }\n\n const stdLogs = logs.filter(l => !l.isError);\n const errorLogs = logs.filter(l => l.isError);\n\n const stdContent: string = stdLogs.map(l => `${l.msg}`).join('\\n');\n const errorContent: string = errorLogs.filter(l => l.isError).map(l => `${l.msg}`).join('\\n');\n\n const stdLog: UserConsoleLog = {\n content: `${stdContent}\\n`,\n size: stdContent.length,\n browser: false,\n type: 'stdout',\n time: stdLogs.length > 0 ? stdLogs[0]!.time : Date.now(),\n taskId: task.id,\n origin: task.id\n };\n \n const errorLog: UserConsoleLog = {\n content: `${errorContent}\\n`,\n size: errorContent.length,\n browser: false,\n type: 'stderr',\n time: errorLogs.length > 0 ? errorLogs[0]!.time : Date.now(),\n taskId: task.id,\n origin: task.id\n };\n\n const reportPromises: Promise<void>[] = [];\n if (stdContent.length > 0) {\n reportPromises.push(rpc.onUserConsoleLog(stdLog));\n }\n if (errorContent.length > 0) {\n reportPromises.push(rpc.onUserConsoleLog(errorLog));\n }\n\n await Promise.all(reportPromises);\n\n debug(`[${logModule} RPC] ${getTaskLogLabel(base, task)} - Reported onUserConsoleLog | ${logs.length} messages`);\n}\n\n// ============================================================================\n// Final Flush\n// ============================================================================\n\n/** Flush any pending RPC updates */\nexport async function flushRpcUpdates(\n rpc: WorkerRPC,\n): Promise<void> {\n await rpc.onTaskUpdate([], []);\n}\n","import { resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport type { WasmImportsFactory } from '../types/types.js';\nimport { debug } from '../util/debug.js';\nimport { POOL_ERROR_NAMES } from '../types/constants.js';\nimport { createPoolError } from '../util/pool-errors.js';\n\nexport async function loadUserWasmImportsFactory(\n relativePath: string | undefined,\n projectRoot: string,\n logModule: string,\n): Promise<WasmImportsFactory | undefined> {\n if (!relativePath) {\n return undefined;\n }\n\n const path = resolve(projectRoot, relativePath);\n const safeUrl = pathToFileURL(path).href;\n\n try {\n const start = performance.now();\n const createWasmImports = (await import(safeUrl)).default;\n debug(`[${logModule}] Imported user WasmImportsFactory \"${safeUrl}\" | TIMING ${(performance.now() - start).toFixed(2)} ms`);\n\n if (typeof createWasmImports !== 'function') {\n const msg = `Could not load user WasmImportsFactory from \"${safeUrl}\".`\n + ` Ensure that your module has a default export matching () => WebAssembly.Imports`\n + ` \\nDefault export type is currently \"${typeof createWasmImports}\"`;\n \n throw createPoolError(POOL_ERROR_NAMES.WASMUserImportsError, msg);\n } else {\n return createWasmImports;\n }\n } catch (error) {\n const msg = `Could not load user WasmImportsFactory from \"${safeUrl}\".`\n + ` Ensure that your module path is relative to the project root`\n + ` (location of shallowest vitest config), and that it has a`\n + ` default export matching () => WebAssembly.Imports`;\n throw createPoolError(\n POOL_ERROR_NAMES.WASMUserImportsError,\n msg,\n error,\n true\n );\n }\n};\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import { AssemblyScriptPoolOptions } from "./types-CoroKYxB.mjs";
1
+ import { AssemblyScriptPoolOptions } from "./types-CRbjiCC7.mjs";
2
2
  import { PoolRunnerInitializer } from "vitest/node";
3
3
 
4
4
  //#region src/pool/pool-runner-init.d.ts
5
5
  declare function createAssemblyScriptPool(userPoolOptions?: AssemblyScriptPoolOptions): PoolRunnerInitializer;
6
6
  //#endregion
7
7
  export { createAssemblyScriptPool };
8
- //# sourceMappingURL=pool-runner-init-CCvnKt5o.d.mts.map
8
+ //# sourceMappingURL=pool-runner-init-CPQL6pVL.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool-runner-init-CPQL6pVL.d.mts","names":[],"sources":["../src/pool/pool-runner-init.ts"],"mappings":";;;;iBAUgB,wBAAA,CAAyB,eAAA,GAAkB,yBAAA,GAA4B,qBAAA"}
@@ -1,5 +1,5 @@
1
1
  import { POOL_ERROR_NAMES } from "./constants-Bq5KNxXJ.mjs";
2
- import { createInitialFileTask, failTestWithTimeoutError, flagTestTerminated, getCompatConfig, resolvePoolOptions } from "./vitest-file-tasks-vvZzigcF.mjs";
2
+ import { createInitialFileTask, failTestWithTimeoutError, flagTestTerminated, getCompatConfig, resolvePoolOptions } from "./vitest-file-tasks-BBsZ_wS6.mjs";
3
3
  import { createPoolError, debug, isAbortError, setGlobalDebugMode, toForwardSlash } from "./pool-errors-Bn6YaguR.mjs";
4
4
  import { createWorkerRPCChannel } from "./worker-rpc-channel-CvCrc8aa.mjs";
5
5
  import { availableParallelism } from "node:os";
@@ -383,4 +383,4 @@ function createAssemblyScriptPool(userPoolOptions) {
383
383
 
384
384
  //#endregion
385
385
  export { createAssemblyScriptPool };
386
- //# sourceMappingURL=pool-runner-init-DjRCbiX-.mjs.map
386
+ //# sourceMappingURL=pool-runner-init-CSJt3dHv.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"pool-runner-init-DjRCbiX-.mjs","names":[],"sources":["../src/pool/pool-worker.ts","../src/pool/pool-runner-init.ts"],"sourcesContent":["import { availableParallelism } from 'node:os';\nimport { resolve } from 'node:path';\nimport { access } from 'node:fs/promises';\nimport type { MessagePort } from 'node:worker_threads';\nimport type { Test } from '@vitest/runner/types';\nimport type { PoolWorker, PoolOptions, WorkerRequest, PoolTask, WorkerResponse } from 'vitest/node';\nimport Tinypool from 'tinypool';\n\nimport type {\n AssemblyScriptPoolWorkerMessage,\n ResolvedAssemblyScriptPoolOptions,\n ResolvedHybridProviderOptions,\n RunCompileAndDiscoverTask,\n RunTestsTask,\n SerializedConfigCompat,\n TestExecutionEnd,\n TestExecutionStart,\n TestRunRecord,\n ThreadSpec,\n WorkerThreadInitData,\n} from '../types/types.js';\nimport { toForwardSlash } from '../util/path-utils.js';\nimport { createInitialFileTask } from '../util/vitest-file-tasks.js';\nimport { failTestWithTimeoutError, flagTestTerminated } from '../util/vitest-tasks.js';\nimport {\n AS_POOL_WORKER_MSG_FLAG,\n ASSEMBLYSCRIPT_POOL_NAME,\n POOL_ERROR_NAMES,\n VITEST_WORKER_RESPONSE_MSG_FLAG\n} from '../types/constants.js';\nimport { debug, setGlobalDebugMode } from '../util/debug.js';\nimport { createPoolError, isAbortError } from '../util/pool-errors.js';\nimport { createWorkerRPCChannel } from './worker-rpc-channel.js';\nimport { getCompatConfig } from '../util/resolve-config.js';\n\ntype GlobalThreadPools = { compilePool: Tinypool, runPool: Tinypool };\ntype EventCallback = (arg: any) => void;\n\nconst THREAD_RESOLVE_TIMEOUT_MS = 2000 as const;\nconst POOL_THREAD_IDLE_TIMEOUT_MS = 3_600_000 as const;\nconst IDLE_RUN_THREADS_FACTOR = 1 as const;\n// @ts-ignore - see note in getGlobalThreadPools\nconst IDLE_COMPILE_THREADS_FACTOR = 0.25 as const;\n\n// path assumes that we're running from dist/\nconst COMPILE_WORKER_PATH = resolve(import.meta.dirname, 'pool-thread/compile-worker-thread.mjs');\nconst TEST_WORKER_PATH = resolve(import.meta.dirname, 'pool-thread/test-worker-thread.mjs');\n\nvar GLOBAL_POOLS_PROMISE: Promise<GlobalThreadPools> | undefined;\nvar GLOBAL_POOL_ABORT_CONTROLLER: AbortController | undefined;\nvar GLOBAL_RUNNING_POOLWORKER_COUNT: number = 0;\n\nexport class AssemblyScriptPoolWorker implements PoolWorker {\n readonly logModule = 'PoolWorker' as const;\n readonly name: typeof ASSEMBLYSCRIPT_POOL_NAME = ASSEMBLYSCRIPT_POOL_NAME;\n readonly poolOptions: PoolOptions;\n readonly asPoolOptions: ResolvedAssemblyScriptPoolOptions;\n readonly asCoverageOptions: ResolvedHybridProviderOptions;\n\n // for the currently running thread preforming a test run (if any)\n private threadAbortController: AbortController | undefined;\n private threadControlPort: MessagePort | undefined;\n private threadRunPromise: Promise<void> | undefined;\n\n private threadSpecs: ThreadSpec[] = [];\n \n // cached data for possible timeout resume\n private currentTestRun: TestRunRecord | undefined;\n \n // for this particular PoolWorker instance (1 per `maxWorkers`)\n private currentWorkerId: number | undefined;\n private isWorkerRunning: boolean = false;\n private config: SerializedConfigCompat | undefined; // provided with \"start\" message\n\n // registry holding vitest callbacks so we can communicate on behalf of the worker thread\n private listenerRegistry: Map<string, Set<EventCallback>>;\n\n constructor(\n options: PoolOptions,\n resolvedUserPoolOptions: ResolvedAssemblyScriptPoolOptions,\n resolvedCoverageOptions: ResolvedHybridProviderOptions,\n ) {\n const start = performance.now();\n\n this.poolOptions = options;\n this.asPoolOptions = resolvedUserPoolOptions;\n this.asCoverageOptions = resolvedCoverageOptions;\n this.listenerRegistry = new Map<string, Set<EventCallback>>();\n\n setImmediate(async () => {\n const results = await Promise.allSettled([\n access(COMPILE_WORKER_PATH),\n access(TEST_WORKER_PATH)\n ]);\n\n const failedThreadAccess: string[] = [];\n if (results[0].status === 'rejected') failedThreadAccess.push(COMPILE_WORKER_PATH);\n if (results[1].status === 'rejected') failedThreadAccess.push(TEST_WORKER_PATH);\n\n if (failedThreadAccess.length) {\n throw new Error(`Cannot access worker thread file(s) at path(s): ${failedThreadAccess}`);\n }\n });\n \n setGlobalDebugMode(this.asPoolOptions.debug);\n\n debug(`[${this.logModule}] Created AssemblyScriptPoolWorker in ${(performance.now() - start).toFixed(2)} ms`\n + ` | method: \"${this.poolOptions.method}\" | project: \"${this.poolOptions.project.name}\"`\n + ` | asPoolOptions: ${JSON.stringify(this.asPoolOptions)}`\n );\n }\n\n private get isCollectTestsMode(): boolean {\n return this.poolOptions.method === 'collect';\n }\n\n async start(): Promise<void> {\n // do all work in send() message intercept handler so we have access to the config\n }\n\n async stop(): Promise<void> {\n debug(`[${this.logModuleWithId}] stop | running PoolWorker count: ${GLOBAL_RUNNING_POOLWORKER_COUNT}`);\n\n this.listenerRegistry.clear();\n GLOBAL_RUNNING_POOLWORKER_COUNT--;\n this.isWorkerRunning = false;\n\n debug(`[${this.logModuleWithId}] AssemblyScriptPoolWorker STOPPED | running PoolWorker count: ${GLOBAL_RUNNING_POOLWORKER_COUNT}`);\n this.currentWorkerId = undefined;\n }\n\n send(message: WorkerRequest): void {\n switch(message.type) {\n \n // this happens AFTER start() is called (start() is for PoolWorker, \"start\" is for thread)\n case 'start':\n this.currentWorkerId = message.workerId;\n this.config = getCompatConfig(message.context.config);\n debug(`[${this.logModuleWithId}] send: vitest sent \"start\" message | Captured workerId and config`);\n\n setImmediate(async () => {\n const start = performance.now();\n const { compilePool, runPool } = await this.getGlobalThreadPools(this.config?.maxWorkers);\n \n debug(`[${this.logModuleWithId}] start: fetched global thread pools in ${(performance.now() - start).toFixed(2)} ms`\n + ` | compilePool queueSize: ${compilePool.queueSize} | runPool queueSize: ${runPool.queueSize}`\n );\n \n this.isWorkerRunning = true;\n GLOBAL_RUNNING_POOLWORKER_COUNT++;\n debug(`[${this.logModuleWithId}] start | new running PoolWorker count: ${GLOBAL_RUNNING_POOLWORKER_COUNT}`);\n \n this.notifyVitest('started');\n debug(`[${this.logModuleWithId}] send: responded \"started\" to vitest`);\n });\n \n break;\n \n // this happens BEFORE stop() is called (stop() is for PoolWorker, \"stop\" is for thread)\n case 'stop':\n setImmediate(async () => {\n await this.stopThread();\n this.notifyVitest('stopped');\n });\n break;\n \n case 'cancel':\n debug(`[${this.logModuleWithId}] send: got \"cancel\" unexpectedly`, message);\n break;\n \n case 'collect':\n case 'run':\n this.currentWorkerId = message.context.workerId;\n this.threadSpecs = message.context.files.map((fileSpec): ThreadSpec => ({\n file: createInitialFileTask(\n toForwardSlash(fileSpec.filepath),\n this.config!.name ?? '',\n this.config!.root,\n this.config!.testTimeout,\n this.config!.retry\n )\n }));\n\n debug(`[${this.logModuleWithId}] send: vitest sent \"${message.type}\" message`\n + ` | files: \"${this.threadSpecs.map(s => s.file.filepath).join(',')}\"`\n );\n\n setImmediate(async () => {\n debug(`[${this.logModuleWithId}] send: dispatched \"${message.type}\" job to worker thread`\n + ` | files: \"${this.threadSpecs.map(s => s.file.filepath).join(',')}\"`\n );\n \n this.threadRunPromise = this.orchestrateFileRuns();\n\n try {\n await this.threadRunPromise;\n this.notifyVitest('testfileFinished');\n debug(`[${this.logModuleWithId}] send: responded \"testfileFinished\" to vitest`\n + ` | files: \"${this.threadSpecs.map(s => s.file.filepath).join(',')}\"`\n );\n\n this.threadSpecs = [];\n } catch (error) {\n // abort errors are expected, otherwise rethrow\n if (!isAbortError(error)) {\n throw error;\n }\n } finally {\n this.threadControlPort?.close();\n this.threadAbortController = undefined;\n this.threadControlPort = undefined;\n this.threadRunPromise = undefined;\n }\n });\n break;\n }\n }\n\n on(event: string, callback: EventCallback): void {\n this.addEventCallback(event, callback);\n debug(`[${this.logModuleWithId}] ON \"${event}\" - saved listener`);\n }\n\n off(event: string, callback: EventCallback): void {\n if (this.removeEventCallback(event, callback)) {\n debug(`[${this.logModuleWithId}] OFF \"${event}\" - removed callback from registry`);\n } else {\n debug(`[${this.logModuleWithId}] OFF \"${event}\" - callback not found in registry`);\n }\n }\n\n deserialize(data: unknown): unknown {\n return data;\n }\n\n canReuse(_task: PoolTask): boolean {\n return true;\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Thread Pool Management\n // ─────────────────────────────────────────────────────────────────────────────\n\n private async getGlobalThreadPools(workerCount?: number): Promise<GlobalThreadPools> {\n if (GLOBAL_POOLS_PROMISE) {\n return GLOBAL_POOLS_PROMISE;\n }\n\n GLOBAL_POOLS_PROMISE = new Promise<GlobalThreadPools>(async (resolve, _reject) => {\n const workers = workerCount ?? availableParallelism();\n\n // TODO - decide which is better when scaling\n // Empirical observations seem to show that minimum parallelization for compilation\n // tends to *dramatically* improve compilation times because of v8 warmpup on repeated calls to asc.main,\n // so much so that this time savings **almost always** outweighs the benefits of speading over many\n // available threads. The **almost** is the key word here- this needs to be tested on platforms with\n // higher available paralellism (> 8) to see if it holds true.\n const actualCompileThreadCount = workers > 1 ? 2 : 1;\n // const actualCompileThreadCount = Math.max(Math.ceil(workers * IDLE_COMPILE_THREADS_FACTOR), 1);\n\n debug(`[${this.logModuleWithId}] Creating global compile thread pool | ${actualCompileThreadCount} threads`);\n \n const start = performance.now();\n \n const compilePool = new Tinypool({\n filename: COMPILE_WORKER_PATH,\n minThreads: 1,\n maxThreads: actualCompileThreadCount,\n isolateWorkers: false,\n idleTimeout: POOL_THREAD_IDLE_TIMEOUT_MS,\n env: this.poolOptions.env as Record<string, string>,\n execArgv: this.poolOptions.execArgv,\n workerData: {\n asCoverageOptions: this.asCoverageOptions,\n } satisfies WorkerThreadInitData\n });\n\n const actualRunThreadCount = Math.max(Math.ceil(workers * IDLE_RUN_THREADS_FACTOR), 1);\n debug(`[${this.logModuleWithId}] Creating global run thread pool | ${actualRunThreadCount} threads`);\n\n const runPool = new Tinypool({\n filename: TEST_WORKER_PATH,\n minThreads: 1,\n maxThreads: actualRunThreadCount,\n isolateWorkers: false,\n idleTimeout: POOL_THREAD_IDLE_TIMEOUT_MS,\n env: this.poolOptions.env as Record<string, string>,\n execArgv: this.poolOptions.execArgv,\n workerData: {\n asCoverageOptions: this.asCoverageOptions,\n } satisfies WorkerThreadInitData\n });\n\n debug(`[${this.logModuleWithId}] Created global thread pools in ${(performance.now() - start).toFixed(2)} ms`);\n\n GLOBAL_POOL_ABORT_CONTROLLER = new AbortController();\n resolve({ compilePool, runPool });\n });\n \n return GLOBAL_POOLS_PROMISE;\n }\n\n // @ts-ignore\n // pools are never explicitly destroyed.\n // - vitest processes are short-lived\n // - when PoolWorkers are stopped, they cleanup actively-running thread tasks\n // - in practice stop happens after every run, even in watch mode\n // - keeping pools hot is desirable for watch mode re-runs, so we maintain our pools\n private async destroyGlobalPoolsIfNeeded(): Promise<void> {\n if (GLOBAL_RUNNING_POOLWORKER_COUNT === 0 && GLOBAL_POOLS_PROMISE) {\n const destroyStart = performance.now();\n debug(`[${this.logModuleWithId}] Destroying Tinypools...`);\n\n try {\n const { compilePool, runPool } = await GLOBAL_POOLS_PROMISE;\n await Promise.all([ compilePool.destroy(), runPool.destroy() ]);\n } catch {}\n\n GLOBAL_POOLS_PROMISE = undefined;\n GLOBAL_POOL_ABORT_CONTROLLER = undefined;\n\n debug(`[${this.logModuleWithId}] Destroyed tinypools in ${(performance.now() - destroyStart).toFixed(2)} ms`);\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Listener Registry Helpers\n // ─────────────────────────────────────────────────────────────────────────────\n\n private getEventCallbacks(event: string): Set<EventCallback> {\n let callbacks: Set<EventCallback> | undefined = this.listenerRegistry.get(event);\n if (!callbacks) {\n callbacks = new Set<EventCallback>();\n this.listenerRegistry.set(event, callbacks);\n }\n return callbacks;\n }\n\n private addEventCallback(event: string, callback: EventCallback): void {\n this.getEventCallbacks(event).add(callback);\n }\n \n private removeEventCallback(event: string, callback: EventCallback): boolean {\n const callbacks = this.getEventCallbacks(event);\n if (callbacks) {\n return callbacks.delete(callback);\n } else {\n return false;\n }\n }\n\n private notifyVitest(responseType: WorkerResponse['type']): void {\n const messageCallbacks = this.getEventCallbacks('message');\n for (const cb of messageCallbacks) {\n cb({ type: responseType, [VITEST_WORKER_RESPONSE_MSG_FLAG]: true } satisfies WorkerResponse)\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Worker Thread Control/Orchestration\n // ─────────────────────────────────────────────────────────────────────────────\n \n private async dispatchCompile(\n spec: ThreadSpec,\n compilePool: Tinypool,\n ): Promise<void> {\n const { workerPort, poolPort } = createWorkerRPCChannel(this.poolOptions.project, this.isCollectTestsMode);\n this.threadControlPort = poolPort;\n \n const compilePromise: Promise<ThreadSpec> = compilePool.run({\n dispatchStart: Date.now(),\n workerId: this.currentWorkerId!,\n port: workerPort,\n file: spec.file,\n config: this.config!,\n asPoolOptions: this.asPoolOptions,\n isCollectTestsMode: this.isCollectTestsMode,\n } satisfies RunCompileAndDiscoverTask, {\n name: 'runCompileAndDiscoverSpec',\n transferList: [workerPort],\n signal: GLOBAL_POOL_ABORT_CONTROLLER!.signal,\n });\n\n try {\n const { compilation, file } = await compilePromise;\n spec.file = file;\n spec.compilation = compilation;\n } finally {\n this.threadControlPort.close();\n this.threadControlPort = undefined;\n }\n }\n \n private async dispatchRunTests(\n spec: ThreadSpec,\n runPool: Tinypool,\n timedOutTest?: Test,\n ): Promise<void> {\n const { workerPort, poolPort } = createWorkerRPCChannel(this.poolOptions.project, this.isCollectTestsMode);\n \n this.threadAbortController = new AbortController();\n this.threadControlPort = poolPort;\n this.threadControlPort.on('message', this.getWorkerThreadMessageHandler());\n\n const runPromise: Promise<void> = !spec.compilation ? Promise.resolve() : runPool.run({\n dispatchStart: Date.now(),\n workerId: this.currentWorkerId!,\n port: workerPort,\n file: timedOutTest?.file ?? spec.file,\n compilation: spec.compilation,\n config: this.config!,\n asPoolOptions: this.asPoolOptions,\n isCollectTestsMode: this.isCollectTestsMode,\n timedOutTest,\n } satisfies RunTestsTask, {\n name: 'runFileSpec',\n transferList: [workerPort],\n signal: AbortSignal.any([this.threadAbortController.signal, GLOBAL_POOL_ABORT_CONTROLLER!.signal]),\n });\n\n try {\n return await runPromise;\n } finally {\n this.threadControlPort.close();\n this.threadControlPort = undefined;\n }\n }\n\n private async orchestrateFileRuns(timedOutTest?: Test): Promise<void> {\n const modeStr = this.isCollectTestsMode ? 'collectTests' : 'runTests';\n const isResume: boolean = !!timedOutTest;\n const desc = `${modeStr} ${isResume ? '(RESUME)' : '(INITIAL)'}`;\n\n debug(`[${this.logModuleWithId}] orchestrateFileRuns: dispatching ${desc} to worker thread`\n + ` | files: \"${this.threadSpecs.map(s => s.file.filepath).join(',')}\"`\n );\n\n const { compilePool, runPool } = await this.getGlobalThreadPools(this.config?.maxWorkers);\n\n // compile\n if (!isResume) {\n await Promise.all(\n this.threadSpecs.map(spec => this.dispatchCompile(spec, compilePool))\n );\n }\n\n // test\n if (!this.isCollectTestsMode) {\n await Promise.all(\n this.threadSpecs.map(spec => this.dispatchRunTests(spec, runPool, timedOutTest))\n );\n }\n\n debug(`[${this.logModuleWithId}] orchestrateFileRuns: ${desc} thread work complete`\n + ` | files: \"${this.threadSpecs.map(s => s.file.filepath).join(',')}\"`\n );\n }\n\n private async stopThread(): Promise<void> {\n this.clearTestTimeoutTimer(); // if any\n this.currentTestRun = undefined;\n \n const mod = this.logModuleWithId;\n const start = performance.now();\n\n debug('setting graceful resolve timeout');\n const abortTimeout = setTimeout(() => {\n debug(`[${mod}] stop: timed out waiting on pool worker run resolve ${(performance.now() - start).toFixed(2)} ms | Aborting thread`);\n this.threadAbortController?.abort();\n }, THREAD_RESOLVE_TIMEOUT_MS);\n \n try {\n debug(`[${mod}] stop: awaiting pool worker run resolve: ${!!this.threadRunPromise}`);\n await this.threadRunPromise;\n clearTimeout(abortTimeout);\n debug(`[${this.logModuleWithId}] stop: pool worker run resolved cleanly after ${(performance.now() - start).toFixed(2)} ms`);\n } catch {\n } finally {\n this.threadControlPort?.close();\n debug(`[${this.logModuleWithId}] stop: closed pool port`);\n }\n \n this.threadAbortController = undefined;\n this.threadControlPort = undefined;\n this.threadRunPromise = undefined;\n this.threadSpecs = [];\n }\n\n private getWorkerThreadMessageHandler(): EventCallback {\n return (message: any): void => {\n if (message[AS_POOL_WORKER_MSG_FLAG]) {\n const poolMessage = message as AssemblyScriptPoolWorkerMessage;\n\n switch (poolMessage.type) {\n case 'execution-start':\n this.handleTestExecutionStart(message);\n break;\n case 'execution-end':\n this.handleTestExecutionEnd(message);\n break;\n }\n\n return;\n }\n };\n }\n\n private handleTestExecutionStart(msg: TestExecutionStart): void {\n if (!this.isWorkerRunning) return;\n \n const { executionStart, test } = msg;\n const now = Date.now();\n const transitDuration = now - executionStart;\n const adjustedTimeout = Math.max(test.timeout - transitDuration, 0);\n\n this.currentTestRun = {\n test,\n executionStart,\n timeoutId: setTimeout(() => this.handleTimeout(), adjustedTimeout)\n };\n\n debug(`[${this.logModuleWithId}] START test timeout timer for \"${this.currentTestRun.test.name}\"`);\n }\n\n private handleTestExecutionEnd(_msg: TestExecutionEnd): void {\n this.clearTestTimeoutTimer();\n this.currentTestRun = undefined;\n }\n\n private clearTestTimeoutTimer(): void {\n if (this.currentTestRun) {\n const elapsed = Date.now() - this.currentTestRun.executionStart;\n debug(`[${this.logModuleWithId}] CLEAR test timeout timer (${elapsed.toFixed(2)} ms) for \"${this.currentTestRun?.test.name}\"`);\n clearTimeout(this.currentTestRun.timeoutId);\n }\n }\n\n private async handleTimeout(): Promise<void> {\n if (!this.isWorkerRunning) return;\n\n if (!this.threadSpecs.length || !this.currentTestRun || !this.currentTestRun.test) {\n const missingStr = \n + (this.threadSpecs.length ? '' : 'threadSpecs')\n + (this.currentTestRun ? '' : ' currentTestRecord')\n + (this.currentTestRun?.test ? '' : ' currentTestRecord.test')\n throw createPoolError(\n POOL_ERROR_NAMES.PoolError,\n `Cannot timeout/resume worker thread for workerId ${this.currentWorkerId} - missing data: ${missingStr}`\n );\n }\n\n const duration = Date.now() - this.currentTestRun.executionStart;\n failTestWithTimeoutError(this.currentTestRun.test, this.currentTestRun.executionStart, duration);\n\n // set termination time metadata for measuring resume latency\n flagTestTerminated(this.currentTestRun.test);\n\n debug(`[${this.logModuleWithId}] handleTimeout: TEST TIMEOUT \"${this.currentTestRun.test.name}\" after ${duration.toFixed(2)} ms`\n +` - Terminating worker thread job`\n );\n\n const termStart = performance.now();\n \n try {\n this.threadAbortController?.abort();\n await this.threadRunPromise;\n } catch (error) {\n // abort errors are expected, otherwise rethrow\n if (!isAbortError(error)) {\n throw error;\n }\n } finally {\n this.threadControlPort?.close();\n this.threadAbortController = undefined;\n this.threadControlPort = undefined;\n this.threadRunPromise = undefined;\n }\n\n debug(`[${this.logModuleWithId}] handleTimeout: Worker thread job aborted for timeout in ${(performance.now() - termStart).toFixed(2)} ms`);\n \n if (!this.isWorkerRunning) return;\n\n // supply timed-out test (includes entire file hierarchy & coverage)\n // to resume testing where we leftoff when aborting for timeout\n this.threadRunPromise = this.orchestrateFileRuns(this.currentTestRun.test);\n\n debug(`[${this.logModuleWithId}] handleTimeout: re-dispatched job to worker thread`\n + ` | files: \"${this.threadSpecs.map(s => s.file.filepath).join(',')}\"`\n );\n\n try {\n await this.threadRunPromise;\n this.notifyVitest('testfileFinished');\n debug(`[${this.logModuleWithId}] handleTimeout: file run completed - responded \"testfileFinished\" to vitest`\n + ` | files: \"${this.threadSpecs.map(s => s.file.filepath).join(',')}\"`\n );\n \n this.threadSpecs = [];\n } catch (error) {\n // abort errors are expected, otherwise rethrow\n if (!isAbortError(error)) {\n throw error;\n } else {\n debug(`[${this.logModuleWithId}] send: caught and ignored timeout awaiting timeout re-run`\n + ` | files: \"${this.threadSpecs.map(s => s.file.filepath).join(',')}\"`\n );\n }\n } finally {\n //@ts-ignore\n this.threadControlPort?.close();\n this.threadControlPort = undefined;\n this.threadAbortController = undefined;\n this.threadRunPromise = undefined;\n }\n }\n\n private get logModuleWithId(): string {\n return `${this.logModule}${this.currentWorkerId === undefined ? '' : ` ${this.currentWorkerId}`}`;\n }\n}\n","import type { PoolOptions, PoolRunnerInitializer } from 'vitest/node';\n\nimport type {\n AssemblyScriptPoolOptions,\n ResolvedHybridProviderOptions\n} from '../types/types.js';\nimport { ASSEMBLYSCRIPT_POOL_NAME } from '../types/constants.js';\nimport { resolvePoolOptions } from '../util/resolve-config.js';\nimport { AssemblyScriptPoolWorker } from './pool-worker.js';\n\nexport function createAssemblyScriptPool(userPoolOptions?: AssemblyScriptPoolOptions): PoolRunnerInitializer {\n const resolvedUserPoolOptions = resolvePoolOptions(userPoolOptions);\n\n return {\n name: ASSEMBLYSCRIPT_POOL_NAME,\n createPoolWorker: (opts: PoolOptions) => {\n const resolvedCoverageOptions = opts.project.config.coverage as unknown as ResolvedHybridProviderOptions;\n return new AssemblyScriptPoolWorker(opts, resolvedUserPoolOptions, resolvedCoverageOptions);\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"pool-runner-init-CSJt3dHv.mjs","names":[],"sources":["../src/pool/pool-worker.ts","../src/pool/pool-runner-init.ts"],"sourcesContent":["import { availableParallelism } from 'node:os';\nimport { resolve } from 'node:path';\nimport { access } from 'node:fs/promises';\nimport type { MessagePort } from 'node:worker_threads';\nimport type { Test } from '@vitest/runner/types';\nimport type { PoolWorker, PoolOptions, WorkerRequest, PoolTask, WorkerResponse } from 'vitest/node';\nimport Tinypool from 'tinypool';\n\nimport type {\n AssemblyScriptPoolWorkerMessage,\n ResolvedAssemblyScriptPoolOptions,\n ResolvedHybridProviderOptions,\n RunCompileAndDiscoverTask,\n RunTestsTask,\n SerializedConfigCompat,\n TestExecutionEnd,\n TestExecutionStart,\n TestRunRecord,\n ThreadSpec,\n WorkerThreadInitData,\n} from '../types/types.js';\nimport { toForwardSlash } from '../util/path-utils.js';\nimport { createInitialFileTask } from '../util/vitest-file-tasks.js';\nimport { failTestWithTimeoutError, flagTestTerminated } from '../util/vitest-tasks.js';\nimport {\n AS_POOL_WORKER_MSG_FLAG,\n ASSEMBLYSCRIPT_POOL_NAME,\n POOL_ERROR_NAMES,\n VITEST_WORKER_RESPONSE_MSG_FLAG\n} from '../types/constants.js';\nimport { debug, setGlobalDebugMode } from '../util/debug.js';\nimport { createPoolError, isAbortError } from '../util/pool-errors.js';\nimport { createWorkerRPCChannel } from './worker-rpc-channel.js';\nimport { getCompatConfig } from '../util/resolve-config.js';\n\ntype GlobalThreadPools = { compilePool: Tinypool, runPool: Tinypool };\ntype EventCallback = (arg: any) => void;\n\nconst THREAD_RESOLVE_TIMEOUT_MS = 2000 as const;\nconst POOL_THREAD_IDLE_TIMEOUT_MS = 3_600_000 as const;\nconst IDLE_RUN_THREADS_FACTOR = 1 as const;\n// @ts-ignore - see note in getGlobalThreadPools\nconst IDLE_COMPILE_THREADS_FACTOR = 0.25 as const;\n\n// path assumes that we're running from dist/\nconst COMPILE_WORKER_PATH = resolve(import.meta.dirname, 'pool-thread/compile-worker-thread.mjs');\nconst TEST_WORKER_PATH = resolve(import.meta.dirname, 'pool-thread/test-worker-thread.mjs');\n\nvar GLOBAL_POOLS_PROMISE: Promise<GlobalThreadPools> | undefined;\nvar GLOBAL_POOL_ABORT_CONTROLLER: AbortController | undefined;\nvar GLOBAL_RUNNING_POOLWORKER_COUNT: number = 0;\n\nexport class AssemblyScriptPoolWorker implements PoolWorker {\n readonly logModule = 'PoolWorker' as const;\n readonly name: typeof ASSEMBLYSCRIPT_POOL_NAME = ASSEMBLYSCRIPT_POOL_NAME;\n readonly poolOptions: PoolOptions;\n readonly asPoolOptions: ResolvedAssemblyScriptPoolOptions;\n readonly asCoverageOptions: ResolvedHybridProviderOptions;\n\n // for the currently running thread preforming a test run (if any)\n private threadAbortController: AbortController | undefined;\n private threadControlPort: MessagePort | undefined;\n private threadRunPromise: Promise<void> | undefined;\n\n private threadSpecs: ThreadSpec[] = [];\n \n // cached data for possible timeout resume\n private currentTestRun: TestRunRecord | undefined;\n \n // for this particular PoolWorker instance (1 per `maxWorkers`)\n private currentWorkerId: number | undefined;\n private isWorkerRunning: boolean = false;\n private config: SerializedConfigCompat | undefined; // provided with \"start\" message\n\n // registry holding vitest callbacks so we can communicate on behalf of the worker thread\n private listenerRegistry: Map<string, Set<EventCallback>>;\n\n constructor(\n options: PoolOptions,\n resolvedUserPoolOptions: ResolvedAssemblyScriptPoolOptions,\n resolvedCoverageOptions: ResolvedHybridProviderOptions,\n ) {\n const start = performance.now();\n\n this.poolOptions = options;\n this.asPoolOptions = resolvedUserPoolOptions;\n this.asCoverageOptions = resolvedCoverageOptions;\n this.listenerRegistry = new Map<string, Set<EventCallback>>();\n\n setImmediate(async () => {\n const results = await Promise.allSettled([\n access(COMPILE_WORKER_PATH),\n access(TEST_WORKER_PATH)\n ]);\n\n const failedThreadAccess: string[] = [];\n if (results[0].status === 'rejected') failedThreadAccess.push(COMPILE_WORKER_PATH);\n if (results[1].status === 'rejected') failedThreadAccess.push(TEST_WORKER_PATH);\n\n if (failedThreadAccess.length) {\n throw new Error(`Cannot access worker thread file(s) at path(s): ${failedThreadAccess}`);\n }\n });\n \n setGlobalDebugMode(this.asPoolOptions.debug);\n\n debug(`[${this.logModule}] Created AssemblyScriptPoolWorker in ${(performance.now() - start).toFixed(2)} ms`\n + ` | method: \"${this.poolOptions.method}\" | project: \"${this.poolOptions.project.name}\"`\n + ` | asPoolOptions: ${JSON.stringify(this.asPoolOptions)}`\n );\n }\n\n private get isCollectTestsMode(): boolean {\n return this.poolOptions.method === 'collect';\n }\n\n async start(): Promise<void> {\n // do all work in send() message intercept handler so we have access to the config\n }\n\n async stop(): Promise<void> {\n debug(`[${this.logModuleWithId}] stop | running PoolWorker count: ${GLOBAL_RUNNING_POOLWORKER_COUNT}`);\n\n this.listenerRegistry.clear();\n GLOBAL_RUNNING_POOLWORKER_COUNT--;\n this.isWorkerRunning = false;\n\n debug(`[${this.logModuleWithId}] AssemblyScriptPoolWorker STOPPED | running PoolWorker count: ${GLOBAL_RUNNING_POOLWORKER_COUNT}`);\n this.currentWorkerId = undefined;\n }\n\n send(message: WorkerRequest): void {\n switch(message.type) {\n \n // this happens AFTER start() is called (start() is for PoolWorker, \"start\" is for thread)\n case 'start':\n this.currentWorkerId = message.workerId;\n this.config = getCompatConfig(message.context.config);\n debug(`[${this.logModuleWithId}] send: vitest sent \"start\" message | Captured workerId and config`);\n\n setImmediate(async () => {\n const start = performance.now();\n const { compilePool, runPool } = await this.getGlobalThreadPools(this.config?.maxWorkers);\n \n debug(`[${this.logModuleWithId}] start: fetched global thread pools in ${(performance.now() - start).toFixed(2)} ms`\n + ` | compilePool queueSize: ${compilePool.queueSize} | runPool queueSize: ${runPool.queueSize}`\n );\n \n this.isWorkerRunning = true;\n GLOBAL_RUNNING_POOLWORKER_COUNT++;\n debug(`[${this.logModuleWithId}] start | new running PoolWorker count: ${GLOBAL_RUNNING_POOLWORKER_COUNT}`);\n \n this.notifyVitest('started');\n debug(`[${this.logModuleWithId}] send: responded \"started\" to vitest`);\n });\n \n break;\n \n // this happens BEFORE stop() is called (stop() is for PoolWorker, \"stop\" is for thread)\n case 'stop':\n setImmediate(async () => {\n await this.stopThread();\n this.notifyVitest('stopped');\n });\n break;\n \n case 'cancel':\n debug(`[${this.logModuleWithId}] send: got \"cancel\" unexpectedly`, message);\n break;\n \n case 'collect':\n case 'run':\n this.currentWorkerId = message.context.workerId;\n this.threadSpecs = message.context.files.map((fileSpec): ThreadSpec => ({\n file: createInitialFileTask(\n toForwardSlash(fileSpec.filepath),\n this.config!.name ?? '',\n this.config!.root,\n this.config!.testTimeout,\n this.config!.retry\n )\n }));\n\n debug(`[${this.logModuleWithId}] send: vitest sent \"${message.type}\" message`\n + ` | files: \"${this.threadSpecs.map(s => s.file.filepath).join(',')}\"`\n );\n\n setImmediate(async () => {\n debug(`[${this.logModuleWithId}] send: dispatched \"${message.type}\" job to worker thread`\n + ` | files: \"${this.threadSpecs.map(s => s.file.filepath).join(',')}\"`\n );\n \n this.threadRunPromise = this.orchestrateFileRuns();\n\n try {\n await this.threadRunPromise;\n this.notifyVitest('testfileFinished');\n debug(`[${this.logModuleWithId}] send: responded \"testfileFinished\" to vitest`\n + ` | files: \"${this.threadSpecs.map(s => s.file.filepath).join(',')}\"`\n );\n\n this.threadSpecs = [];\n } catch (error) {\n // abort errors are expected, otherwise rethrow\n if (!isAbortError(error)) {\n throw error;\n }\n } finally {\n this.threadControlPort?.close();\n this.threadAbortController = undefined;\n this.threadControlPort = undefined;\n this.threadRunPromise = undefined;\n }\n });\n break;\n }\n }\n\n on(event: string, callback: EventCallback): void {\n this.addEventCallback(event, callback);\n debug(`[${this.logModuleWithId}] ON \"${event}\" - saved listener`);\n }\n\n off(event: string, callback: EventCallback): void {\n if (this.removeEventCallback(event, callback)) {\n debug(`[${this.logModuleWithId}] OFF \"${event}\" - removed callback from registry`);\n } else {\n debug(`[${this.logModuleWithId}] OFF \"${event}\" - callback not found in registry`);\n }\n }\n\n deserialize(data: unknown): unknown {\n return data;\n }\n\n canReuse(_task: PoolTask): boolean {\n return true;\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Thread Pool Management\n // ─────────────────────────────────────────────────────────────────────────────\n\n private async getGlobalThreadPools(workerCount?: number): Promise<GlobalThreadPools> {\n if (GLOBAL_POOLS_PROMISE) {\n return GLOBAL_POOLS_PROMISE;\n }\n\n GLOBAL_POOLS_PROMISE = new Promise<GlobalThreadPools>(async (resolve, _reject) => {\n const workers = workerCount ?? availableParallelism();\n\n // TODO - decide which is better when scaling\n // Empirical observations seem to show that minimum parallelization for compilation\n // tends to *dramatically* improve compilation times because of v8 warmpup on repeated calls to asc.main,\n // so much so that this time savings **almost always** outweighs the benefits of speading over many\n // available threads. The **almost** is the key word here- this needs to be tested on platforms with\n // higher available paralellism (> 8) to see if it holds true.\n const actualCompileThreadCount = workers > 1 ? 2 : 1;\n // const actualCompileThreadCount = Math.max(Math.ceil(workers * IDLE_COMPILE_THREADS_FACTOR), 1);\n\n debug(`[${this.logModuleWithId}] Creating global compile thread pool | ${actualCompileThreadCount} threads`);\n \n const start = performance.now();\n \n const compilePool = new Tinypool({\n filename: COMPILE_WORKER_PATH,\n minThreads: 1,\n maxThreads: actualCompileThreadCount,\n isolateWorkers: false,\n idleTimeout: POOL_THREAD_IDLE_TIMEOUT_MS,\n env: this.poolOptions.env as Record<string, string>,\n execArgv: this.poolOptions.execArgv,\n workerData: {\n asCoverageOptions: this.asCoverageOptions,\n } satisfies WorkerThreadInitData\n });\n\n const actualRunThreadCount = Math.max(Math.ceil(workers * IDLE_RUN_THREADS_FACTOR), 1);\n debug(`[${this.logModuleWithId}] Creating global run thread pool | ${actualRunThreadCount} threads`);\n\n const runPool = new Tinypool({\n filename: TEST_WORKER_PATH,\n minThreads: 1,\n maxThreads: actualRunThreadCount,\n isolateWorkers: false,\n idleTimeout: POOL_THREAD_IDLE_TIMEOUT_MS,\n env: this.poolOptions.env as Record<string, string>,\n execArgv: this.poolOptions.execArgv,\n workerData: {\n asCoverageOptions: this.asCoverageOptions,\n } satisfies WorkerThreadInitData\n });\n\n debug(`[${this.logModuleWithId}] Created global thread pools in ${(performance.now() - start).toFixed(2)} ms`);\n\n GLOBAL_POOL_ABORT_CONTROLLER = new AbortController();\n resolve({ compilePool, runPool });\n });\n \n return GLOBAL_POOLS_PROMISE;\n }\n\n // @ts-ignore\n // pools are never explicitly destroyed.\n // - vitest processes are short-lived\n // - when PoolWorkers are stopped, they cleanup actively-running thread tasks\n // - in practice stop happens after every run, even in watch mode\n // - keeping pools hot is desirable for watch mode re-runs, so we maintain our pools\n private async destroyGlobalPoolsIfNeeded(): Promise<void> {\n if (GLOBAL_RUNNING_POOLWORKER_COUNT === 0 && GLOBAL_POOLS_PROMISE) {\n const destroyStart = performance.now();\n debug(`[${this.logModuleWithId}] Destroying Tinypools...`);\n\n try {\n const { compilePool, runPool } = await GLOBAL_POOLS_PROMISE;\n await Promise.all([ compilePool.destroy(), runPool.destroy() ]);\n } catch {}\n\n GLOBAL_POOLS_PROMISE = undefined;\n GLOBAL_POOL_ABORT_CONTROLLER = undefined;\n\n debug(`[${this.logModuleWithId}] Destroyed tinypools in ${(performance.now() - destroyStart).toFixed(2)} ms`);\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Listener Registry Helpers\n // ─────────────────────────────────────────────────────────────────────────────\n\n private getEventCallbacks(event: string): Set<EventCallback> {\n let callbacks: Set<EventCallback> | undefined = this.listenerRegistry.get(event);\n if (!callbacks) {\n callbacks = new Set<EventCallback>();\n this.listenerRegistry.set(event, callbacks);\n }\n return callbacks;\n }\n\n private addEventCallback(event: string, callback: EventCallback): void {\n this.getEventCallbacks(event).add(callback);\n }\n \n private removeEventCallback(event: string, callback: EventCallback): boolean {\n const callbacks = this.getEventCallbacks(event);\n if (callbacks) {\n return callbacks.delete(callback);\n } else {\n return false;\n }\n }\n\n private notifyVitest(responseType: WorkerResponse['type']): void {\n const messageCallbacks = this.getEventCallbacks('message');\n for (const cb of messageCallbacks) {\n cb({ type: responseType, [VITEST_WORKER_RESPONSE_MSG_FLAG]: true } satisfies WorkerResponse)\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Worker Thread Control/Orchestration\n // ─────────────────────────────────────────────────────────────────────────────\n \n private async dispatchCompile(\n spec: ThreadSpec,\n compilePool: Tinypool,\n ): Promise<void> {\n const { workerPort, poolPort } = createWorkerRPCChannel(this.poolOptions.project, this.isCollectTestsMode);\n this.threadControlPort = poolPort;\n \n const compilePromise: Promise<ThreadSpec> = compilePool.run({\n dispatchStart: Date.now(),\n workerId: this.currentWorkerId!,\n port: workerPort,\n file: spec.file,\n config: this.config!,\n asPoolOptions: this.asPoolOptions,\n isCollectTestsMode: this.isCollectTestsMode,\n } satisfies RunCompileAndDiscoverTask, {\n name: 'runCompileAndDiscoverSpec',\n transferList: [workerPort],\n signal: GLOBAL_POOL_ABORT_CONTROLLER!.signal,\n });\n\n try {\n const { compilation, file } = await compilePromise;\n spec.file = file;\n spec.compilation = compilation;\n } finally {\n this.threadControlPort.close();\n this.threadControlPort = undefined;\n }\n }\n \n private async dispatchRunTests(\n spec: ThreadSpec,\n runPool: Tinypool,\n timedOutTest?: Test,\n ): Promise<void> {\n const { workerPort, poolPort } = createWorkerRPCChannel(this.poolOptions.project, this.isCollectTestsMode);\n \n this.threadAbortController = new AbortController();\n this.threadControlPort = poolPort;\n this.threadControlPort.on('message', this.getWorkerThreadMessageHandler());\n\n const runPromise: Promise<void> = !spec.compilation ? Promise.resolve() : runPool.run({\n dispatchStart: Date.now(),\n workerId: this.currentWorkerId!,\n port: workerPort,\n file: timedOutTest?.file ?? spec.file,\n compilation: spec.compilation,\n config: this.config!,\n asPoolOptions: this.asPoolOptions,\n isCollectTestsMode: this.isCollectTestsMode,\n timedOutTest,\n } satisfies RunTestsTask, {\n name: 'runFileSpec',\n transferList: [workerPort],\n signal: AbortSignal.any([this.threadAbortController.signal, GLOBAL_POOL_ABORT_CONTROLLER!.signal]),\n });\n\n try {\n return await runPromise;\n } finally {\n this.threadControlPort.close();\n this.threadControlPort = undefined;\n }\n }\n\n private async orchestrateFileRuns(timedOutTest?: Test): Promise<void> {\n const modeStr = this.isCollectTestsMode ? 'collectTests' : 'runTests';\n const isResume: boolean = !!timedOutTest;\n const desc = `${modeStr} ${isResume ? '(RESUME)' : '(INITIAL)'}`;\n\n debug(`[${this.logModuleWithId}] orchestrateFileRuns: dispatching ${desc} to worker thread`\n + ` | files: \"${this.threadSpecs.map(s => s.file.filepath).join(',')}\"`\n );\n\n const { compilePool, runPool } = await this.getGlobalThreadPools(this.config?.maxWorkers);\n\n // compile\n if (!isResume) {\n await Promise.all(\n this.threadSpecs.map(spec => this.dispatchCompile(spec, compilePool))\n );\n }\n\n // test\n if (!this.isCollectTestsMode) {\n await Promise.all(\n this.threadSpecs.map(spec => this.dispatchRunTests(spec, runPool, timedOutTest))\n );\n }\n\n debug(`[${this.logModuleWithId}] orchestrateFileRuns: ${desc} thread work complete`\n + ` | files: \"${this.threadSpecs.map(s => s.file.filepath).join(',')}\"`\n );\n }\n\n private async stopThread(): Promise<void> {\n this.clearTestTimeoutTimer(); // if any\n this.currentTestRun = undefined;\n \n const mod = this.logModuleWithId;\n const start = performance.now();\n\n debug('setting graceful resolve timeout');\n const abortTimeout = setTimeout(() => {\n debug(`[${mod}] stop: timed out waiting on pool worker run resolve ${(performance.now() - start).toFixed(2)} ms | Aborting thread`);\n this.threadAbortController?.abort();\n }, THREAD_RESOLVE_TIMEOUT_MS);\n \n try {\n debug(`[${mod}] stop: awaiting pool worker run resolve: ${!!this.threadRunPromise}`);\n await this.threadRunPromise;\n clearTimeout(abortTimeout);\n debug(`[${this.logModuleWithId}] stop: pool worker run resolved cleanly after ${(performance.now() - start).toFixed(2)} ms`);\n } catch {\n } finally {\n this.threadControlPort?.close();\n debug(`[${this.logModuleWithId}] stop: closed pool port`);\n }\n \n this.threadAbortController = undefined;\n this.threadControlPort = undefined;\n this.threadRunPromise = undefined;\n this.threadSpecs = [];\n }\n\n private getWorkerThreadMessageHandler(): EventCallback {\n return (message: any): void => {\n if (message[AS_POOL_WORKER_MSG_FLAG]) {\n const poolMessage = message as AssemblyScriptPoolWorkerMessage;\n\n switch (poolMessage.type) {\n case 'execution-start':\n this.handleTestExecutionStart(message);\n break;\n case 'execution-end':\n this.handleTestExecutionEnd(message);\n break;\n }\n\n return;\n }\n };\n }\n\n private handleTestExecutionStart(msg: TestExecutionStart): void {\n if (!this.isWorkerRunning) return;\n \n const { executionStart, test } = msg;\n const now = Date.now();\n const transitDuration = now - executionStart;\n const adjustedTimeout = Math.max(test.timeout - transitDuration, 0);\n\n this.currentTestRun = {\n test,\n executionStart,\n timeoutId: setTimeout(() => this.handleTimeout(), adjustedTimeout)\n };\n\n debug(`[${this.logModuleWithId}] START test timeout timer for \"${this.currentTestRun.test.name}\"`);\n }\n\n private handleTestExecutionEnd(_msg: TestExecutionEnd): void {\n this.clearTestTimeoutTimer();\n this.currentTestRun = undefined;\n }\n\n private clearTestTimeoutTimer(): void {\n if (this.currentTestRun) {\n const elapsed = Date.now() - this.currentTestRun.executionStart;\n debug(`[${this.logModuleWithId}] CLEAR test timeout timer (${elapsed.toFixed(2)} ms) for \"${this.currentTestRun?.test.name}\"`);\n clearTimeout(this.currentTestRun.timeoutId);\n }\n }\n\n private async handleTimeout(): Promise<void> {\n if (!this.isWorkerRunning) return;\n\n if (!this.threadSpecs.length || !this.currentTestRun || !this.currentTestRun.test) {\n const missingStr = \n + (this.threadSpecs.length ? '' : 'threadSpecs')\n + (this.currentTestRun ? '' : ' currentTestRecord')\n + (this.currentTestRun?.test ? '' : ' currentTestRecord.test')\n throw createPoolError(\n POOL_ERROR_NAMES.PoolError,\n `Cannot timeout/resume worker thread for workerId ${this.currentWorkerId} - missing data: ${missingStr}`\n );\n }\n\n const duration = Date.now() - this.currentTestRun.executionStart;\n failTestWithTimeoutError(this.currentTestRun.test, this.currentTestRun.executionStart, duration);\n\n // set termination time metadata for measuring resume latency\n flagTestTerminated(this.currentTestRun.test);\n\n debug(`[${this.logModuleWithId}] handleTimeout: TEST TIMEOUT \"${this.currentTestRun.test.name}\" after ${duration.toFixed(2)} ms`\n +` - Terminating worker thread job`\n );\n\n const termStart = performance.now();\n \n try {\n this.threadAbortController?.abort();\n await this.threadRunPromise;\n } catch (error) {\n // abort errors are expected, otherwise rethrow\n if (!isAbortError(error)) {\n throw error;\n }\n } finally {\n this.threadControlPort?.close();\n this.threadAbortController = undefined;\n this.threadControlPort = undefined;\n this.threadRunPromise = undefined;\n }\n\n debug(`[${this.logModuleWithId}] handleTimeout: Worker thread job aborted for timeout in ${(performance.now() - termStart).toFixed(2)} ms`);\n \n if (!this.isWorkerRunning) return;\n\n // supply timed-out test (includes entire file hierarchy & coverage)\n // to resume testing where we leftoff when aborting for timeout\n this.threadRunPromise = this.orchestrateFileRuns(this.currentTestRun.test);\n\n debug(`[${this.logModuleWithId}] handleTimeout: re-dispatched job to worker thread`\n + ` | files: \"${this.threadSpecs.map(s => s.file.filepath).join(',')}\"`\n );\n\n try {\n await this.threadRunPromise;\n this.notifyVitest('testfileFinished');\n debug(`[${this.logModuleWithId}] handleTimeout: file run completed - responded \"testfileFinished\" to vitest`\n + ` | files: \"${this.threadSpecs.map(s => s.file.filepath).join(',')}\"`\n );\n \n this.threadSpecs = [];\n } catch (error) {\n // abort errors are expected, otherwise rethrow\n if (!isAbortError(error)) {\n throw error;\n } else {\n debug(`[${this.logModuleWithId}] send: caught and ignored timeout awaiting timeout re-run`\n + ` | files: \"${this.threadSpecs.map(s => s.file.filepath).join(',')}\"`\n );\n }\n } finally {\n //@ts-ignore\n this.threadControlPort?.close();\n this.threadControlPort = undefined;\n this.threadAbortController = undefined;\n this.threadRunPromise = undefined;\n }\n }\n\n private get logModuleWithId(): string {\n return `${this.logModule}${this.currentWorkerId === undefined ? '' : ` ${this.currentWorkerId}`}`;\n }\n}\n","import type { PoolOptions, PoolRunnerInitializer } from 'vitest/node';\n\nimport type {\n AssemblyScriptPoolOptions,\n ResolvedHybridProviderOptions\n} from '../types/types.js';\nimport { ASSEMBLYSCRIPT_POOL_NAME } from '../types/constants.js';\nimport { resolvePoolOptions } from '../util/resolve-config.js';\nimport { AssemblyScriptPoolWorker } from './pool-worker.js';\n\nexport function createAssemblyScriptPool(userPoolOptions?: AssemblyScriptPoolOptions): PoolRunnerInitializer {\n const resolvedUserPoolOptions = resolvePoolOptions(userPoolOptions);\n\n return {\n name: ASSEMBLYSCRIPT_POOL_NAME,\n createPoolWorker: (opts: PoolOptions) => {\n const resolvedCoverageOptions = opts.project.config.coverage as unknown as ResolvedHybridProviderOptions;\n return new AssemblyScriptPoolWorker(opts, resolvedUserPoolOptions, resolvedCoverageOptions);\n },\n };\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { RunCompileAndDiscoverTask, ThreadSpec } from "../types-CoroKYxB.mjs";
1
+ import { RunCompileAndDiscoverTask, ThreadSpec } from "../types-CRbjiCC7.mjs";
2
2
 
3
3
  //#region src/pool-thread/compile-worker-thread.d.ts
4
4
  declare function runCompileAndDiscoverSpec(data: RunCompileAndDiscoverTask): Promise<ThreadSpec>;
@@ -1,11 +1,11 @@
1
1
  import "../constants-Bq5KNxXJ.mjs";
2
- import { failFile } from "../vitest-file-tasks-vvZzigcF.mjs";
2
+ import { failFile } from "../vitest-file-tasks-BBsZ_wS6.mjs";
3
3
  import { buildEnhancedFileError, debug, setGlobalDebugMode } from "../pool-errors-Bn6YaguR.mjs";
4
4
  import "../wasm-memory-C8Nkl2Sz.mjs";
5
- import { createRpcClient, flushRpcUpdates, loadUserWasmImportsFactory, reportFileError, reportFileQueued } from "../load-user-imports-Bcx9NOt9.mjs";
5
+ import { createRpcClient, flushRpcUpdates, loadUserWasmImportsFactory, reportFileError, reportFileQueued } from "../load-user-imports-iAQUMKAi.mjs";
6
6
  import { isNodeVersionSupportedForCoverage } from "../feature-check-BJpc4LoO.mjs";
7
7
  import "../compiler-CXR5UJId.mjs";
8
- import { runCompileAndDiscover } from "../compile-runner-BGHM_85g.mjs";
8
+ import { runCompileAndDiscover } from "../compile-runner-BGYyiUEf.mjs";
9
9
  import { threadId, workerData } from "node:worker_threads";
10
10
 
11
11
  //#region src/pool-thread/compile-worker-thread.ts
@@ -1,4 +1,4 @@
1
- import { RunTestsTask } from "../types-CoroKYxB.mjs";
1
+ import { RunTestsTask } from "../types-CRbjiCC7.mjs";
2
2
 
3
3
  //#region src/pool-thread/test-worker-thread.d.ts
4
4
  declare function runFileSpec(data: RunTestsTask): Promise<void>;
@@ -1,10 +1,10 @@
1
1
  import "../constants-Bq5KNxXJ.mjs";
2
- import { failFile } from "../vitest-file-tasks-vvZzigcF.mjs";
2
+ import { failFile } from "../vitest-file-tasks-BBsZ_wS6.mjs";
3
3
  import { buildEnhancedFileError, debug, setGlobalDebugMode } from "../pool-errors-Bn6YaguR.mjs";
4
4
  import "../wasm-memory-C8Nkl2Sz.mjs";
5
- import { createRpcClient, flushRpcUpdates, loadUserWasmImportsFactory, reportFileError } from "../load-user-imports-Bcx9NOt9.mjs";
5
+ import { createRpcClient, flushRpcUpdates, loadUserWasmImportsFactory, reportFileError } from "../load-user-imports-iAQUMKAi.mjs";
6
6
  import { isNodeVersionSupportedForCoverage } from "../feature-check-BJpc4LoO.mjs";
7
- import { runSuite } from "../test-runner-BeP8ClnE.mjs";
7
+ import { runSuite } from "../test-runner-BDcm8vg0.mjs";
8
8
  import { basename } from "node:path";
9
9
  import { threadId } from "node:worker_threads";
10
10
 
@@ -1,4 +1,4 @@
1
- import { ProcessPoolRunFileTask } from "../types-CoroKYxB.mjs";
1
+ import { ProcessPoolRunFileTask } from "../types-CRbjiCC7.mjs";
2
2
 
3
3
  //#region src/pool-thread/v3-tinypool-thread.d.ts
4
4
  declare function runTestFile(taskData: ProcessPoolRunFileTask): Promise<void>;
@@ -1,12 +1,12 @@
1
1
  import "../constants-Bq5KNxXJ.mjs";
2
- import { failFile } from "../vitest-file-tasks-vvZzigcF.mjs";
2
+ import { failFile } from "../vitest-file-tasks-BBsZ_wS6.mjs";
3
3
  import { buildEnhancedFileError, debug, setGlobalDebugMode } from "../pool-errors-Bn6YaguR.mjs";
4
4
  import "../wasm-memory-C8Nkl2Sz.mjs";
5
- import { createRpcClient, flushRpcUpdates, loadUserWasmImportsFactory, reportFileError, reportFileQueued } from "../load-user-imports-Bcx9NOt9.mjs";
5
+ import { createRpcClient, flushRpcUpdates, loadUserWasmImportsFactory, reportFileError, reportFileQueued } from "../load-user-imports-iAQUMKAi.mjs";
6
6
  import { isNodeVersionSupportedForCoverage } from "../feature-check-BJpc4LoO.mjs";
7
7
  import "../compiler-CXR5UJId.mjs";
8
- import { runCompileAndDiscover } from "../compile-runner-BGHM_85g.mjs";
9
- import { runSuite } from "../test-runner-BeP8ClnE.mjs";
8
+ import { runCompileAndDiscover } from "../compile-runner-BGYyiUEf.mjs";
9
+ import { runSuite } from "../test-runner-BDcm8vg0.mjs";
10
10
  import { basename } from "node:path";
11
11
  import { workerId } from "tinypool";
12
12
  import { threadId, workerData } from "node:worker_threads";
@@ -1,6 +1,6 @@
1
- import { checkFailsAndInvertResult, failFile, finalizeSuiteResult, flagTestFinalized, getRunnableTasks, getTaskLogPrefix, isSuiteOwnFile, resetTestForRetry, setSuitePrepareResult, setTestResultForTestPrepare, shouldRetryTask, updateSuiteFinishedResult, updateTestResultAfterRun } from "./vitest-file-tasks-vvZzigcF.mjs";
1
+ import { checkFailsAndInvertResult, failFile, finalizeSuiteResult, flagTestFinalized, getRunnableTasks, getTaskLogPrefix, isSuiteOwnFile, resetTestForRetry, setSuitePrepareResult, setTestResultForTestPrepare, shouldRetryTask, updateSuiteFinishedResult, updateTestResultAfterRun } from "./vitest-file-tasks-BBsZ_wS6.mjs";
2
2
  import { buildEnhancedFileError, debug } from "./pool-errors-Bn6YaguR.mjs";
3
- import { executeWASMTest, flushRpcUpdates, reportFileError, reportSuiteFinished, reportSuitePrepare, reportTestFinished, reportTestPrepare, reportTestRetried, reportUserConsoleLogs } from "./load-user-imports-Bcx9NOt9.mjs";
3
+ import { executeWASMTest, flushRpcUpdates, reportFileError, reportSuiteFinished, reportSuitePrepare, reportTestFinished, reportTestPrepare, reportTestRetried, reportUserConsoleLogs } from "./load-user-imports-iAQUMKAi.mjs";
4
4
  import { mergeCoverageData } from "./coverage-merge-0WqdC-dq.mjs";
5
5
 
6
6
  //#region src/pool-thread/runner/test-runner.ts
@@ -144,4 +144,4 @@ async function runSuite(rpc, port, base, collectCoverage, compilation, suite, lo
144
144
 
145
145
  //#endregion
146
146
  export { runSuite };
147
- //# sourceMappingURL=test-runner-BeP8ClnE.mjs.map
147
+ //# sourceMappingURL=test-runner-BDcm8vg0.mjs.map