* 发送消息到 Worker 并等待响应
(type: string, payload: any, options: number | WorkerRequestOptions = {})
| 192 | * 发送消息到 Worker 并等待响应 |
| 193 | */ |
| 194 | function sendToWorker<T>(type: string, payload: any, options: number | WorkerRequestOptions = {}): Promise<T> { |
| 195 | return new Promise((resolve, reject) => { |
| 196 | if (!worker) { |
| 197 | try { |
| 198 | initWorker() |
| 199 | } catch (error) { |
| 200 | reject(new Error('Worker not initialized')) |
| 201 | return |
| 202 | } |
| 203 | } |
| 204 | |
| 205 | const timeoutMs = typeof options === 'number' ? options : (options.timeoutMs ?? 60000) |
| 206 | const restartOnTimeout = |
| 207 | typeof options === 'number' |
| 208 | ? isRestartableReadOnlyRequestType(type) |
| 209 | : (options.restartOnTimeout ?? isRestartableReadOnlyRequestType(type)) |
| 210 | const requestWorker = worker! |
| 211 | const id = `req_${++requestIdCounter}` |
| 212 | |
| 213 | const timeout = setTimeout(() => { |
| 214 | if (pendingRequests.has(id)) { |
| 215 | pendingRequests.delete(id) |
| 216 | reject(new Error(`Worker request timeout: ${type}`)) |
| 217 | if (restartOnTimeout) { |
| 218 | terminateWorkerAfterQueryTimeout(type, requestWorker) |
| 219 | } |
| 220 | } |
| 221 | }, timeoutMs) |
| 222 | |
| 223 | pendingRequests.set(id, { resolve, reject, timeout, restartOnTimeout }) |
| 224 | |
| 225 | requestWorker.postMessage({ id, type, payload }) |
| 226 | }) |
| 227 | } |
| 228 | |
| 229 | /** |
| 230 | * 发送消息到 Worker 并等待响应(带进度回调) |
no test coverage detected