* 等待 preload 中的 registerTool 完成,避免刚预加载时立即调用失败。
(webContents: WebContents, toolName: string)
| 255 | * 等待 preload 中的 registerTool 完成,避免刚预加载时立即调用失败。 |
| 256 | */ |
| 257 | private async waitForToolRegistration(webContents: WebContents, toolName: string): Promise<void> { |
| 258 | if (this.isToolRegistered(webContents, toolName)) return |
| 259 | |
| 260 | const waiterKey = this.getWaiterKey(webContents.id, toolName) |
| 261 | await new Promise<void>((resolve, reject) => { |
| 262 | let wrappedResolve: (() => void) | null = null |
| 263 | const timeout = setTimeout(() => { |
| 264 | if (wrappedResolve) { |
| 265 | this.removeWaiter(waiterKey, wrappedResolve) |
| 266 | } |
| 267 | reject(new Error(`等待工具 "${toolName}" 注册超时`)) |
| 268 | }, TOOL_REGISTER_TIMEOUT_MS) |
| 269 | |
| 270 | wrappedResolve = (): void => { |
| 271 | clearTimeout(timeout) |
| 272 | resolve() |
| 273 | } |
| 274 | |
| 275 | const waiters = this.waiters.get(waiterKey) || [] |
| 276 | waiters.push(wrappedResolve) |
| 277 | this.waiters.set(waiterKey, waiters) |
| 278 | }).catch(() => undefined) |
| 279 | } |
| 280 | |
| 281 | /** |
| 282 | * 解析并执行等待某个工具注册完成的所有回调。 |
no test coverage detected