()
| 65 | } |
| 66 | |
| 67 | private async schedule(): Promise<void> { |
| 68 | if (this.queue.length === 0 || this.activeTasks.length >= this.maxWorkers) { |
| 69 | return |
| 70 | } |
| 71 | |
| 72 | const { task, resolver, method } = this.queue.shift()! |
| 73 | |
| 74 | try { |
| 75 | let isMemoryLimitReached = false |
| 76 | const runner = this.getPoolRunner(task, method) |
| 77 | |
| 78 | const poolId = runner.poolId ?? this.getWorkerId() |
| 79 | runner.poolId = poolId |
| 80 | |
| 81 | const activeTask = { task, resolver, method, cancelTask } |
| 82 | this.activeTasks.push(activeTask) |
| 83 | |
| 84 | // active tasks receive cancel signal and shut down gracefully |
| 85 | async function cancelTask(options?: { force: boolean }) { |
| 86 | if (options?.force) { |
| 87 | await runner.stop({ force: true }) |
| 88 | } |
| 89 | |
| 90 | await runner.waitForTerminated() |
| 91 | resolver.reject(new Error('Cancelled')) |
| 92 | } |
| 93 | |
| 94 | const onFinished = (message: WorkerResponse) => { |
| 95 | if (message?.__vitest_worker_response__ && message.type === 'testfileFinished') { |
| 96 | if (task.memoryLimit && message.usedMemory) { |
| 97 | isMemoryLimitReached = message.usedMemory >= task.memoryLimit |
| 98 | } |
| 99 | if (message.error) { |
| 100 | this.options.state.catchError(message.error, 'Test Run Error') |
| 101 | } |
| 102 | |
| 103 | runner.off('message', onFinished) |
| 104 | runner.off('error', onTaskError) |
| 105 | resolver.resolve() |
| 106 | } |
| 107 | } |
| 108 | |
| 109 | function onTaskError(error: unknown) { |
| 110 | runner.off('message', onFinished) |
| 111 | runner.off('error', onTaskError) |
| 112 | resolver.reject(new Error(`[vitest-pool]: Worker ${task.worker} emitted error.`, { cause: error })) |
| 113 | } |
| 114 | |
| 115 | runner.on('message', onFinished) |
| 116 | runner.on('error', onTaskError) |
| 117 | |
| 118 | if (!runner.isStarted) { |
| 119 | const id = setTimeout( |
| 120 | () => resolver.reject(new Error(`[vitest-pool]: Timeout starting ${task.worker} runner.`)), |
| 121 | WORKER_START_TIMEOUT, |
| 122 | ) |
| 123 | |
| 124 | await runner.start({ workerId: task.context.workerId }) |
no test coverage detected