{"version":3,"file":"statusReporter.cjs","names":["accessor: ConnectionAccessor","logger: Logger","WorkerStatusData","ensureUnsharedArrayBuffer","ConnectMessage","GatewayMessageType"],"sources":["../../../../../src/components/connect/strategies/core/statusReporter.ts"],"sourcesContent":["/**\n * Periodic worker status reporter for the active WebSocket connection.\n *\n * Sends WORKER_STATUS messages at a gateway-configured interval so the\n * gateway can observe in-flight requests and shutdown state. The interval\n * is opt-in: the gateway sends \"0s\" or \"\" to disable it.\n */\n\nimport type { Logger } from \"../../../../middleware/logger.ts\";\nimport {\n  ConnectMessage,\n  GatewayMessageType,\n  WorkerStatusData,\n} from \"../../../../proto/src/components/connect/protobuf/connect.ts\";\nimport { ensureUnsharedArrayBuffer } from \"../../buffer.ts\";\nimport type { ConnectionAccessor } from \"./types.ts\";\n\nexport class StatusReporter {\n  private interval: ReturnType<typeof setInterval> | undefined;\n  private intervalMs = 0;\n\n  constructor(\n    private readonly accessor: ConnectionAccessor,\n    private readonly logger: Logger,\n  ) {}\n\n  /**\n   * Update the status reporting interval. Restarts the timer if the interval\n   * changed or if it wasn't running yet. A value of 0 disables reporting.\n   */\n  updateInterval(ms: number): void {\n    if (ms === this.intervalMs && (this.interval || ms === 0)) return;\n    this.intervalMs = ms;\n    this.stop();\n    if (ms > 0) {\n      this.start();\n    }\n  }\n\n  /** Stop the status reporting timer. */\n  stop(): void {\n    clearInterval(this.interval);\n    this.interval = undefined;\n  }\n\n  private start(): void {\n    if (this.interval) return;\n    this.interval = setInterval(() => this.tick(), this.intervalMs);\n  }\n\n  private tick(): void {\n    const conn = this.accessor.activeConnection;\n    if (!conn || conn.ws.readyState !== WebSocket.OPEN) return;\n\n    const inFlightRequestIds = Object.keys(\n      this.accessor.inProgressRequests.requestLeases,\n    );\n\n    const statusPayload = WorkerStatusData.encode(\n      WorkerStatusData.create({\n        inFlightRequestIds,\n        shutdownRequested: this.accessor.shutdownRequested,\n      }),\n    ).finish();\n\n    conn.ws.send(\n      ensureUnsharedArrayBuffer(\n        ConnectMessage.encode(\n          ConnectMessage.create({\n            kind: GatewayMessageType.WORKER_STATUS,\n            payload: statusPayload,\n          }),\n        ).finish(),\n      ),\n    );\n\n    this.logger.debug(\n      {\n        connectionId: conn.id,\n        inFlightRequestCount: inFlightRequestIds.length,\n        shutdownRequested: this.accessor.shutdownRequested,\n      },\n      \"Worker status sent\",\n    );\n  }\n}\n"],"mappings":";;;;AAiBA,IAAa,iBAAb,MAA4B;CAC1B,AAAQ;CACR,AAAQ,aAAa;CAErB,YACE,AAAiBA,UACjB,AAAiBC,QACjB;EAFiB;EACA;;;;;;CAOnB,eAAe,IAAkB;AAC/B,MAAI,OAAO,KAAK,eAAe,KAAK,YAAY,OAAO,GAAI;AAC3D,OAAK,aAAa;AAClB,OAAK,MAAM;AACX,MAAI,KAAK,EACP,MAAK,OAAO;;;CAKhB,OAAa;AACX,gBAAc,KAAK,SAAS;AAC5B,OAAK,WAAW;;CAGlB,AAAQ,QAAc;AACpB,MAAI,KAAK,SAAU;AACnB,OAAK,WAAW,kBAAkB,KAAK,MAAM,EAAE,KAAK,WAAW;;CAGjE,AAAQ,OAAa;EACnB,MAAM,OAAO,KAAK,SAAS;AAC3B,MAAI,CAAC,QAAQ,KAAK,GAAG,eAAe,UAAU,KAAM;EAEpD,MAAM,qBAAqB,OAAO,KAChC,KAAK,SAAS,mBAAmB,cAClC;EAED,MAAM,gBAAgBC,iCAAiB,OACrCA,iCAAiB,OAAO;GACtB;GACA,mBAAmB,KAAK,SAAS;GAClC,CAAC,CACH,CAAC,QAAQ;AAEV,OAAK,GAAG,KACNC,yCACEC,+BAAe,OACbA,+BAAe,OAAO;GACpB,MAAMC,mCAAmB;GACzB,SAAS;GACV,CAAC,CACH,CAAC,QAAQ,CACX,CACF;AAED,OAAK,OAAO,MACV;GACE,cAAc,KAAK;GACnB,sBAAsB,mBAAmB;GACzC,mBAAmB,KAAK,SAAS;GAClC,EACD,qBACD"}