UNPKG

inngest

Version:

Official SDK for Inngest.com. Inngest is the reliability layer for modern applications. Inngest combines durable execution, events, and queues into a zero-infra platform with built-in observability.

1 lines 3.62 kB
{"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"}