{"version":3,"sources":["../../src/ipc/job_proc_lazy_main.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Room, RoomEvent, dispose } from '@livekit/rtc-node';\nimport { ThrowsPromise } from '@livekit/throws-transformer/throws';\nimport { context as otelContext } from '@opentelemetry/api';\nimport { EventEmitter, once } from 'node:events';\nimport { pathToFileURL } from 'node:url';\nimport type { Logger } from 'pino';\nimport { type Agent, isAgent } from '../generator.js';\nimport {\n  JobContext,\n  JobProcess,\n  type RunningJobInfo,\n  runWithJobContext,\n  runWithJobContextAsync,\n} from '../job.js';\nimport {\n  finalizeSession,\n  flushJobLogs,\n  flushJobMetrics,\n  runShutdownCallbacks,\n  validateSessionEndTimeout,\n  waitForEntrypointShutdown,\n} from '../job_lifecycle.js';\nimport { initializeLogger, log } from '../log.js';\nimport { loggerOptions, setLoggerState } from '../log_core.js';\nimport type { SimulationContext } from '../simulation.js';\nimport { getMonitor, startMonitoring, stopMonitoring } from '../telemetry/loop_monitor.js';\nimport { Future, shortuuid } from '../utils.js';\nimport { defaultInitializeProcessFunc } from '../worker.js';\nimport type { InferenceExecutor } from './inference_executor.js';\nimport type { IPCMessage } from './message.js';\n\nconst ORPHANED_TIMEOUT = 15 * 1000;\nconst EXIT_REASON = {\n  roomDisconnected: 'room disconnected',\n  shutdownRequest: 'shutdown request',\n  jobCrashed: 'job crashed',\n} as const;\n\nconst safeSend = (msg: IPCMessage): boolean => {\n  try {\n    if (process.connected && process.send) {\n      process.send(msg);\n      return true;\n    }\n    return false;\n  } catch (error) {\n    // Channel closed is expected during graceful shutdown\n    // Log at debug level to avoid noise in production logs\n    if (error instanceof Error && error.message.includes('Channel closed')) {\n      log().debug({ msgCase: msg.case }, 'IPC channel closed, message not sent');\n    } else {\n      log().error({ error, msgCase: msg.case }, 'IPC send failed unexpectedly');\n    }\n    return false;\n  }\n};\n\ntype JobTask = {\n  ctx: JobContext;\n  task: Promise<void>;\n};\n\nclass PendingInference {\n  promise = new ThrowsPromise<{ requestId: string; data: unknown; error?: Error }, never>(\n    (resolve) => {\n      this.resolve = resolve; // this is how JavaScript lets you resolve promises externally\n    },\n  );\n  resolve(arg: { requestId: string; data: unknown; error?: Error }) {\n    arg; // useless call to counteract TypeScript E6133\n  }\n}\n\nclass InfClient implements InferenceExecutor {\n  #requests: { [id: string]: PendingInference } = {};\n  #logger = log();\n\n  constructor() {\n    process.on('message', (msg: IPCMessage) => {\n      switch (msg.case) {\n        case 'inferenceResponse':\n          const fut = this.#requests[msg.value.requestId];\n          delete this.#requests[msg.value.requestId];\n          if (!fut) {\n            this.#logger\n              .child({ 'lk.pii.response': msg.value })\n              .warn('received unexpected inference response');\n            return;\n          }\n          fut.resolve(msg.value);\n          break;\n      }\n    });\n  }\n\n  async doInference(method: string, data: unknown): Promise<unknown> {\n    const requestId = shortuuid('inference_job_');\n    if (!safeSend({ case: 'inferenceRequest', value: { requestId, method, data } })) {\n      this.#logger.debug(\n        { method, requestId },\n        'IPC channel closed during inference, aborting gracefully',\n      );\n      throw new Error(`Inference ${method} aborted: IPC channel closed (expected during shutdown)`);\n    }\n\n    this.#requests[requestId] = new PendingInference();\n    const resp = await this.#requests[requestId]!.promise;\n    if (resp.error) {\n      throw new Error(`inference of ${method} failed: ${resp.error.message}`);\n    }\n    return resp.data;\n  }\n}\n\nconst startJob = (\n  proc: JobProcess,\n  func: (ctx: JobContext) => Promise<void>,\n  info: RunningJobInfo,\n  closeEvent: EventEmitter,\n  logger: Logger,\n  joinFuture: Future,\n  sessionEndTimeout: number,\n  onSessionEnd?: (ctx: JobContext) => unknown,\n  onSimulationEnd?: (ctx: SimulationContext) => unknown,\n): JobTask => {\n  let connect = false;\n  let shutdown = false;\n\n  const room = new Room();\n  room.on(RoomEvent.Disconnected, () => {\n    if (!shutdown) {\n      closeEvent.emit('close', EXIT_REASON.roomDisconnected);\n    }\n  });\n\n  const onConnect = () => {\n    connect = true;\n  };\n  const onShutdown = (reason: string) => {\n    shutdown = true;\n    closeEvent.emit('close', reason);\n  };\n\n  const ctx = new JobContext(proc, info, room, onConnect, onShutdown, new InfClient());\n  ctx._simulationEndFnc = onSimulationEnd;\n\n  const task = (async () => {\n    const unconnectedTimeout = setTimeout(() => {\n      if (!(connect || shutdown)) {\n        logger.warn(\n          'room not connect after job_entry was called after 10 seconds, ',\n          'did you forget to call ctx.connect()?',\n        );\n      }\n    }, 10000);\n\n    try {\n      const closePromise = once(closeEvent, 'close').then((close) => {\n        logger.debug('shutting down');\n        shutdown = true;\n        safeSend({\n          case: 'exiting',\n          value: { reason: close[0] },\n        });\n      });\n\n      // Run the job function within the AsyncLocalStorage context\n      const entrypointPromise = runWithJobContextAsync(ctx, async () => {\n        const { tracer, traceTypes } = await import('../telemetry/index.js');\n        return tracer.startActiveSpan(\n          async (span) => {\n            span.setAttribute(traceTypes.ATTR_JOB_ID, info.job.id);\n            span.setAttribute(traceTypes.ATTR_AGENT_NAME, info.job.agentName);\n            span.setAttribute(traceTypes.ATTR_ROOM_NAME, info.job.room?.name ?? '');\n            getMonitor()?.setReportContext(otelContext.active(), (fn) =>\n              runWithJobContext(ctx, fn),\n            );\n            return func(ctx);\n          },\n          { name: 'job_entrypoint' },\n        );\n      });\n\n      void entrypointPromise.catch(() => {\n        closeEvent.emit('close', EXIT_REASON.jobCrashed);\n      });\n      await closePromise;\n      await waitForEntrypointShutdown(entrypointPromise, logger);\n    } finally {\n      clearTimeout(unconnectedTimeout);\n    }\n\n    try {\n      await runWithJobContextAsync(ctx, async () => {\n        try {\n          await finalizeSession(ctx, onSessionEnd, sessionEndTimeout, logger);\n        } finally {\n          safeSend({ case: 'shuttingDown', value: undefined });\n        }\n\n        try {\n          await room.disconnect();\n          logger.debug('disconnected from room');\n        } catch (error) {\n          logger.error({ error }, 'error while disconnecting room');\n        }\n\n        await runShutdownCallbacks(ctx.shutdownCallbacks, logger);\n      });\n    } finally {\n      try {\n        await flushJobLogs(logger);\n      } finally {\n        safeSend({ case: 'done', value: undefined });\n        joinFuture.resolve();\n      }\n    }\n  })();\n\n  return { ctx, task };\n};\n\n(async () => {\n  if (process.send) {\n    const join = new Future();\n\n    const moduleFile = process.argv[2];\n    const agent: Agent = await import(pathToFileURL(moduleFile!).pathname).then((module) => {\n      // Handle both ESM (module.default is the agent) and CJS (module.default.default is the agent)\n      const agent =\n        typeof module.default === 'function' || isAgent(module.default)\n          ? module.default\n          : module.default?.default;\n      if (agent === undefined || !isAgent(agent)) {\n        throw new Error(`Unable to load agent: Missing or invalid default export in ${moduleFile}`);\n      }\n      return agent;\n    });\n    if (!agent.prewarm) {\n      agent.prewarm = defaultInitializeProcessFunc;\n    }\n\n    // don't do anything on C-c\n    // this is handled in cli, triggering a termination of all child processes at once.\n    process.on('SIGINT', () => {\n      logger.debug('SIGINT received in job proc');\n    });\n\n    // don't do anything on SIGTERM\n    // Render uses SIGTERM in autoscale, this ensures the processes are properly drained if needed\n    process.on('SIGTERM', () => {\n      logger.debug('SIGTERM received in job proc');\n    });\n\n    const sessionEndTimeout = await once(process, 'message').then(([msg]: IPCMessage[]) => {\n      msg = msg!;\n      if (msg.case !== 'initializeRequest') {\n        throw new Error('first message must be InitializeRequest');\n      }\n      initializeLogger(msg.value.loggerOptions);\n      return validateSessionEndTimeout(msg.value.sessionEndTimeout ?? Number.NaN);\n    });\n    const proc = new JobProcess();\n    let logger = log().child({ pid: proc.pid });\n\n    process.on('unhandledRejection', (reason) => {\n      logger.debug({ error: reason }, 'Unhandled promise rejection in job process');\n    });\n\n    logger.debug('initializing job runner');\n    await agent.prewarm(proc);\n    logger.debug('job runner initialized');\n    const loopMonitor = startMonitoring({ name: 'job' });\n    safeSend({ case: 'initializeResponse', value: undefined });\n\n    let job: JobTask | undefined = undefined;\n    const closeEvent = new EventEmitter();\n\n    const orphanedTimeout = setTimeout(() => {\n      logger.warn('job process orphaned, shutting down.');\n      join.resolve();\n    }, ORPHANED_TIMEOUT);\n\n    const messageHandler = (msg: IPCMessage) => {\n      switch (msg.case) {\n        case 'pingRequest': {\n          orphanedTimeout.refresh();\n          safeSend({\n            case: 'pongResponse',\n            value: { lastTimestamp: msg.value.timestamp, timestamp: Date.now() },\n          });\n          break;\n        }\n        case 'startJobRequest': {\n          if (job) {\n            throw new Error('job task already running');\n          }\n\n          logger = logger.child({\n            jobID: msg.value.runningJob.job.id,\n            room_id: msg.value.runningJob.job.room?.sid,\n          });\n          setLoggerState(logger, loggerOptions()!);\n\n          job = startJob(\n            proc,\n            agent.entry,\n            msg.value.runningJob,\n            closeEvent,\n            logger,\n            join,\n            sessionEndTimeout,\n            agent.onSessionEnd,\n            agent.onSimulationEnd,\n          );\n          logger.debug('job started');\n          break;\n        }\n        case 'shutdownRequest': {\n          safeSend({ case: 'shutdownRequestAck', value: undefined });\n          if (!job) {\n            safeSend({ case: 'shuttingDown', value: undefined });\n            join.resolve();\n          }\n          closeEvent.emit('close', msg.value?.reason ?? EXIT_REASON.shutdownRequest);\n        }\n      }\n    };\n\n    process.on('message', messageHandler);\n\n    await join.await;\n    // stop the monitor first so a stall from the shutdown callbacks is recorded, then export:\n    // the periodic reader gets no further turn before process.exit() below\n    if (loopMonitor) stopMonitoring(loopMonitor);\n    await flushJobMetrics(logger);\n    clearTimeout(orphanedTimeout);\n    process.off('message', messageHandler);\n\n    // Dispose native FFI resources (Rust FfiServer, tokio runtimes, libwebrtc)\n    // before process.exit() to prevent libc++abi mutex crash during teardown.\n    // Without this, process.exit() can kill the process while native threads are\n    // still running, causing: \"mutex lock failed: Invalid argument\"\n    // See: https://github.com/livekit/node-sdks/issues/564\n    try {\n      await dispose();\n      logger.debug('native resources disposed');\n    } catch (error) {\n      logger.warn({ error }, 'failed to dispose native resources');\n    }\n\n    logger.debug('Job process shutdown');\n    process.exit(0);\n  }\n})();\n"],"mappings":"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","names":["otelContext","module","agent"]}