()
| 374 | } |
| 375 | |
| 376 | connect(): void { |
| 377 | this.socket = io(`${configuration.apiUrl}/cli`, { |
| 378 | transports: ['websocket'], |
| 379 | auth: { |
| 380 | token: this.token, |
| 381 | clientType: 'machine-scoped' as const, |
| 382 | machineId: this.machine.id |
| 383 | }, |
| 384 | path: '/socket.io/', |
| 385 | reconnection: true, |
| 386 | reconnectionDelay: 1000, |
| 387 | reconnectionDelayMax: 5000, |
| 388 | ...buildSocketIoExtraHeaderOptions() |
| 389 | }) |
| 390 | |
| 391 | this.socket.on('connect', () => { |
| 392 | logger.debug('[API MACHINE] Connected to bot') |
| 393 | this.rpcHandlerManager.onSocketConnect(this.socket) |
| 394 | this.updateRunnerState((state) => ({ |
| 395 | ...(state ?? {}), |
| 396 | status: 'running', |
| 397 | pid: process.pid, |
| 398 | httpPort: this.machine.runnerState?.httpPort, |
| 399 | startedAt: Date.now() |
| 400 | })).catch((error) => { |
| 401 | logger.debug('[API MACHINE] Failed to update runner state on connect', error) |
| 402 | }) |
| 403 | |
| 404 | const hubWorkspaceRoots = this.machine.metadata?.workspaceRoots |
| 405 | const desiredWorkspaceRoots = this.workspaceRoots |
| 406 | if (!workspaceRootsEqual(desiredWorkspaceRoots, hubWorkspaceRoots)) { |
| 407 | if (desiredWorkspaceRoots?.length) { |
| 408 | console.log(`[HAPI] Syncing workspace roots to hub: ${formatWorkspaceRoots(desiredWorkspaceRoots)} (current hub value: ${formatWorkspaceRoots(hubWorkspaceRoots)})`) |
| 409 | } else { |
| 410 | console.log(`[HAPI] Clearing workspace roots on hub (was: ${formatWorkspaceRoots(hubWorkspaceRoots)})`) |
| 411 | } |
| 412 | this.updateMachineMetadata((current) => { |
| 413 | const base = current ?? this.machine.metadata |
| 414 | if (!base) { |
| 415 | return { workspaceRoots: desiredWorkspaceRoots } as MachineMetadata |
| 416 | } |
| 417 | if (desiredWorkspaceRoots?.length) { |
| 418 | return { ...base, workspaceRoots: desiredWorkspaceRoots } |
| 419 | } |
| 420 | const { workspaceRoots: _workspaceRoots, ...rest } = base |
| 421 | return rest as MachineMetadata |
| 422 | }).then(() => { |
| 423 | console.log(`[HAPI] Workspace roots synced: ${formatWorkspaceRoots(this.machine.metadata?.workspaceRoots)}`) |
| 424 | }).catch((error) => { |
| 425 | console.error('[HAPI] Failed to sync workspace roots:', error instanceof Error ? error.message : error) |
| 426 | }) |
| 427 | } else if (desiredWorkspaceRoots?.length) { |
| 428 | console.log(`[HAPI] Workspace roots already up to date on hub: ${formatWorkspaceRoots(desiredWorkspaceRoots)}`) |
| 429 | } |
| 430 | |
| 431 | this.startKeepAlive() |
| 432 | }) |
| 433 |
no test coverage detected