{"version":3,"file":"index.cjs","names":["DEFAULT_SHUTDOWN_SIGNALS","getProcessEnv","envKeys","ConnectionState","internalLoggerSymbol","prepareConnectionConfig","createStrategy"],"sources":["../../../src/components/connect/index.ts"],"sourcesContent":["import { envKeys } from \"../../helpers/consts.ts\";\nimport { getProcessEnv } from \"../../helpers/env.ts\";\nimport { type Inngest, internalLoggerSymbol } from \"../Inngest.ts\";\nimport { prepareConnectionConfig } from \"./config.ts\";\nimport { type ConnectionStrategy, createStrategy } from \"./strategies/index.ts\";\nimport {\n  type ConnectApp,\n  type ConnectDebugState,\n  type ConnectHandlerOptions,\n  ConnectionState,\n  DEFAULT_SHUTDOWN_SIGNALS,\n  type InFlightRequest,\n  type WorkerConnection,\n} from \"./types.ts\";\n\n/**\n * WebSocket worker connection that implements the WorkerConnection interface.\n *\n * This class acts as a facade that delegates to a connection strategy.\n * The strategy determines how the WebSocket connection, heartbeater, and\n * lease extender are managed (same thread vs worker thread).\n */\nclass WebSocketWorkerConnection implements WorkerConnection {\n  private inngest: Inngest.Any;\n  private options: ConnectHandlerOptions;\n  private strategy: ConnectionStrategy | undefined;\n\n  constructor(options: ConnectHandlerOptions) {\n    if (\n      !Array.isArray(options.apps) ||\n      options.apps.length === 0 ||\n      !options.apps[0]\n    ) {\n      throw new Error(\"No apps provided\");\n    }\n\n    this.inngest = options.apps[0].client as Inngest.Any;\n    for (const app of options.apps) {\n      const client = app.client as Inngest.Any;\n\n      if (client.env !== this.inngest.env) {\n        throw new Error(\n          `All apps must be configured to the same environment. ${client.id} is configured to ${client.env} but ${this.inngest.id} is configured to ${this.inngest.env}`,\n        );\n      }\n    }\n\n    this.options = this.applyDefaults(options);\n  }\n\n  private applyDefaults(opts: ConnectHandlerOptions): ConnectHandlerOptions {\n    const options = { ...opts };\n    if (!Array.isArray(options.handleShutdownSignals)) {\n      options.handleShutdownSignals = DEFAULT_SHUTDOWN_SIGNALS;\n    }\n\n    const env = getProcessEnv();\n\n    if (options.maxWorkerConcurrency === undefined) {\n      const envValue = env[envKeys.InngestConnectMaxWorkerConcurrency];\n      if (envValue) {\n        const parsed = Number.parseInt(envValue, 10);\n        if (!Number.isNaN(parsed) && parsed > 0) {\n          options.maxWorkerConcurrency = parsed;\n        }\n      }\n    }\n\n    // Check for worker thread env var (opt-out: false/0 disables isolation)\n    if (options.isolateExecution === undefined) {\n      const envValue = env[envKeys.InngestConnectIsolateExecution];\n      if (envValue === \"0\" || envValue === \"false\") {\n        options.isolateExecution = false;\n      }\n    }\n\n    if (options.gatewayUrl === undefined) {\n      const envValue = env[envKeys.InngestConnectGatewayUrl];\n      if (envValue) {\n        options.gatewayUrl = envValue;\n      }\n    }\n\n    return options;\n  }\n\n  get state(): ConnectionState {\n    return this.strategy?.state ?? ConnectionState.CONNECTING;\n  }\n\n  get connectionId(): string {\n    if (!this.strategy?.connectionId) {\n      throw new Error(\"Connection not prepared\");\n    }\n    return this.strategy.connectionId;\n  }\n\n  get closed(): Promise<void> {\n    if (!this.strategy) {\n      throw new Error(\"No connection established\");\n    }\n    return this.strategy.closed;\n  }\n\n  getDebugState(): ConnectDebugState {\n    if (!this.strategy) {\n      return {\n        state: ConnectionState.CONNECTING,\n        activeConnectionId: undefined,\n        drainingConnectionId: undefined,\n        lastHeartbeatSentAt: undefined,\n        lastHeartbeatReceivedAt: undefined,\n        lastMessageReceivedAt: undefined,\n        shutdownRequested: false,\n        inFlightRequestCount: 0,\n        inFlightRequests: [],\n      };\n    }\n    return this.strategy.getDebugState();\n  }\n\n  async close(): Promise<void> {\n    if (!this.strategy) {\n      return;\n    }\n    return this.strategy.close();\n  }\n\n  /**\n   * Establish a persistent connection to the gateway.\n   */\n  async connect(attempt = 0): Promise<void> {\n    this.inngest[internalLoggerSymbol].debug(\n      { attempt },\n      \"Establishing connection\",\n    );\n\n    const {\n      hashedSigningKey,\n      hashedFallbackKey,\n      envName,\n      connectionData,\n      requestHandlers,\n    } = prepareConnectionConfig(this.options.apps, this.inngest);\n\n    // Create and initialize the strategy\n    this.strategy = await createStrategy(\n      {\n        hashedSigningKey,\n        hashedFallbackKey,\n        internalLogger: this.inngest[internalLoggerSymbol],\n        envName,\n        connectionData,\n        requestHandlers,\n        options: this.options,\n        apiBaseUrl: this.inngest.apiBaseUrl,\n        mode: this.inngest[\"mode\"],\n      },\n      this.options,\n    );\n\n    // Delegate to the strategy\n    await this.strategy.connect(attempt);\n  }\n}\n\n// Export types for convenience\nexport {\n  DEFAULT_SHUTDOWN_SIGNALS,\n  type ConnectApp,\n  type ConnectDebugState,\n  type ConnectHandlerOptions,\n  ConnectionState,\n  type InFlightRequest,\n  type WorkerConnection,\n};\n\nexport const connect = async (\n  options: ConnectHandlerOptions,\n): Promise<WorkerConnection> => {\n  if (options.apps.length === 0) {\n    throw new Error(\"No apps provided\");\n  }\n\n  const conn = new WebSocketWorkerConnection(options);\n\n  await conn.connect();\n\n  return conn;\n};\n"],"mappings":";;;;;;;;;;;;;;;AAsBA,IAAM,4BAAN,MAA4D;CAC1D,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YAAY,SAAgC;AAC1C,MACE,CAAC,MAAM,QAAQ,QAAQ,KAAK,IAC5B,QAAQ,KAAK,WAAW,KACxB,CAAC,QAAQ,KAAK,GAEd,OAAM,IAAI,MAAM,mBAAmB;AAGrC,OAAK,UAAU,QAAQ,KAAK,GAAG;AAC/B,OAAK,MAAM,OAAO,QAAQ,MAAM;GAC9B,MAAM,SAAS,IAAI;AAEnB,OAAI,OAAO,QAAQ,KAAK,QAAQ,IAC9B,OAAM,IAAI,MACR,wDAAwD,OAAO,GAAG,oBAAoB,OAAO,IAAI,OAAO,KAAK,QAAQ,GAAG,oBAAoB,KAAK,QAAQ,MAC1J;;AAIL,OAAK,UAAU,KAAK,cAAc,QAAQ;;CAG5C,AAAQ,cAAc,MAAoD;EACxE,MAAM,UAAU,EAAE,GAAG,MAAM;AAC3B,MAAI,CAAC,MAAM,QAAQ,QAAQ,sBAAsB,CAC/C,SAAQ,wBAAwBA;EAGlC,MAAM,MAAMC,2BAAe;AAE3B,MAAI,QAAQ,yBAAyB,QAAW;GAC9C,MAAM,WAAW,IAAIC,uBAAQ;AAC7B,OAAI,UAAU;IACZ,MAAM,SAAS,OAAO,SAAS,UAAU,GAAG;AAC5C,QAAI,CAAC,OAAO,MAAM,OAAO,IAAI,SAAS,EACpC,SAAQ,uBAAuB;;;AAMrC,MAAI,QAAQ,qBAAqB,QAAW;GAC1C,MAAM,WAAW,IAAIA,uBAAQ;AAC7B,OAAI,aAAa,OAAO,aAAa,QACnC,SAAQ,mBAAmB;;AAI/B,MAAI,QAAQ,eAAe,QAAW;GACpC,MAAM,WAAW,IAAIA,uBAAQ;AAC7B,OAAI,SACF,SAAQ,aAAa;;AAIzB,SAAO;;CAGT,IAAI,QAAyB;AAC3B,SAAO,KAAK,UAAU,SAASC,8BAAgB;;CAGjD,IAAI,eAAuB;AACzB,MAAI,CAAC,KAAK,UAAU,aAClB,OAAM,IAAI,MAAM,0BAA0B;AAE5C,SAAO,KAAK,SAAS;;CAGvB,IAAI,SAAwB;AAC1B,MAAI,CAAC,KAAK,SACR,OAAM,IAAI,MAAM,4BAA4B;AAE9C,SAAO,KAAK,SAAS;;CAGvB,gBAAmC;AACjC,MAAI,CAAC,KAAK,SACR,QAAO;GACL,OAAOA,8BAAgB;GACvB,oBAAoB;GACpB,sBAAsB;GACtB,qBAAqB;GACrB,yBAAyB;GACzB,uBAAuB;GACvB,mBAAmB;GACnB,sBAAsB;GACtB,kBAAkB,EAAE;GACrB;AAEH,SAAO,KAAK,SAAS,eAAe;;CAGtC,MAAM,QAAuB;AAC3B,MAAI,CAAC,KAAK,SACR;AAEF,SAAO,KAAK,SAAS,OAAO;;;;;CAM9B,MAAM,QAAQ,UAAU,GAAkB;AACxC,OAAK,QAAQC,sCAAsB,MACjC,EAAE,SAAS,EACX,0BACD;EAED,MAAM,EACJ,kBACA,mBACA,SACA,gBACA,oBACEC,uCAAwB,KAAK,QAAQ,MAAM,KAAK,QAAQ;AAG5D,OAAK,WAAW,MAAMC,6BACpB;GACE;GACA;GACA,gBAAgB,KAAK,QAAQF;GAC7B;GACA;GACA;GACA,SAAS,KAAK;GACd,YAAY,KAAK,QAAQ;GACzB,MAAM,KAAK,QAAQ;GACpB,EACD,KAAK,QACN;AAGD,QAAM,KAAK,SAAS,QAAQ,QAAQ;;;AAexC,MAAa,UAAU,OACrB,YAC8B;AAC9B,KAAI,QAAQ,KAAK,WAAW,EAC1B,OAAM,IAAI,MAAM,mBAAmB;CAGrC,MAAM,OAAO,IAAI,0BAA0B,QAAQ;AAEnD,OAAM,KAAK,SAAS;AAEpB,QAAO"}