kafka-crab-js 4.1.1 → 4.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +5 -5
  2. package/dist/{base-kafka-stream-readable-D9sZX4xL.d.ts → base-kafka-stream-readable-CtlWvan5.d.cts} +1 -2
  3. package/dist/{base-kafka-stream-readable-D9sZX4xL.d.cts → base-kafka-stream-readable-CtlWvan5.d.ts} +1 -2
  4. package/dist/{channels-CtCeIPbt.d.ts → channels-CCvEbkFg.d.ts} +15 -16
  5. package/dist/{channels-DpT3Ilp7.d.cts → channels-D4ZtiwQz.d.cts} +15 -16
  6. package/dist/diagnostics/channels.cjs.map +1 -1
  7. package/dist/diagnostics/channels.d.cts +1 -1
  8. package/dist/diagnostics/channels.d.ts +1 -1
  9. package/dist/diagnostics/channels.js.map +1 -1
  10. package/dist/diagnostics/index.d.cts +2 -2
  11. package/dist/diagnostics/index.d.ts +2 -2
  12. package/dist/diagnostics/instrumentation.cjs.map +1 -1
  13. package/dist/diagnostics/instrumentation.d.cts +1 -1
  14. package/dist/diagnostics/instrumentation.d.ts +1 -1
  15. package/dist/diagnostics/instrumentation.js.map +1 -1
  16. package/dist/index.d.cts +4 -3
  17. package/dist/index.d.ts +4 -3
  18. package/dist/{instrumentation-CGxc_url.d.ts → instrumentation-Cd62Qkxq.d.cts} +1 -2
  19. package/dist/{instrumentation-CGxc_url.d.cts → instrumentation-Cd62Qkxq.d.ts} +1 -2
  20. package/dist/kafka-client.cjs.map +1 -1
  21. package/dist/kafka-client.d.cts +0 -1
  22. package/dist/kafka-client.d.ts +0 -1
  23. package/dist/kafka-client.js.map +1 -1
  24. package/dist/streams/base-kafka-stream-readable.cjs +2 -1
  25. package/dist/streams/base-kafka-stream-readable.cjs.map +1 -1
  26. package/dist/streams/base-kafka-stream-readable.d.cts +1 -1
  27. package/dist/streams/base-kafka-stream-readable.d.ts +1 -1
  28. package/dist/streams/base-kafka-stream-readable.js +2 -1
  29. package/dist/streams/base-kafka-stream-readable.js.map +1 -1
  30. package/dist/streams/kafka-batch-stream-readable.cjs.map +1 -1
  31. package/dist/streams/kafka-batch-stream-readable.d.cts +1 -2
  32. package/dist/streams/kafka-batch-stream-readable.d.ts +1 -2
  33. package/dist/streams/kafka-batch-stream-readable.js.map +1 -1
  34. package/dist/streams/kafka-stream-readable.cjs.map +1 -1
  35. package/dist/streams/kafka-stream-readable.d.cts +1 -2
  36. package/dist/streams/kafka-stream-readable.d.ts +1 -2
  37. package/dist/streams/kafka-stream-readable.js.map +1 -1
  38. package/js-binding.cjs +199 -85
  39. package/js-binding.js +200 -86
  40. package/package.json +7 -7
package/README.md CHANGED
@@ -4,13 +4,13 @@ Kafka Crab JS is a native Kafka client for Node.js and TypeScript. It uses Rust,
4
4
  JavaScript heap pressure, expose Kafka's mature native client behavior, and push high-throughput consumer workloads
5
5
  through a small TypeScript-friendly API.
6
6
 
7
- [![npm version](https://img.shields.io/npm/v/kafka-crab-js.svg)](https://www.npmjs.com/package/kafka-crab-js)
7
+ [![npm beta version](https://img.shields.io/badge/npm%20beta-v4.0.0--beta.3-blue.svg)](https://www.npmjs.com/package/kafka-crab-js)
8
8
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
9
9
 
10
10
  ## Version 4
11
11
 
12
- `kafka-crab-js` v4 is the current stable release line. It focuses on high-throughput consumers, lower JavaScript heap
13
- pressure, and a cleaner monorepo release model under [`flash-tecnologia/crab-js`](https://github.com/flash-tecnologia/crab-js).
12
+ `kafka-crab-js` v4 is the current beta line. It focuses on high-throughput consumers, lower JavaScript heap pressure,
13
+ and a cleaner monorepo release model under [`flash-tecnologia/crab-js`](https://github.com/flash-tecnologia/crab-js).
14
14
 
15
15
  The main v4 additions are:
16
16
 
@@ -24,8 +24,8 @@ The main v4 additions are:
24
24
  - Updated TypeScript exports where runtime enum-like values are now string literal types, avoiding missing runtime
25
25
  exports in ESM/CommonJS consumers.
26
26
 
27
- For production adoption, validate v4 with your broker settings, payload sizes, partition count, commit strategy, and
28
- shutdown path before replacing an existing Kafka client.
27
+ For production adoption, treat v4 as a beta release: validate it with your broker settings, payload sizes, partition
28
+ count, commit strategy, and shutdown path before replacing an existing Kafka client.
29
29
 
30
30
  ## Why Kafka Crab JS?
31
31
 
@@ -1,6 +1,5 @@
1
1
  import { CommitMode, KafkaConsumer, Message, OffsetModel, TopicPartitionConfig } from "../js-binding.js";
2
2
  import { Readable, ReadableOptions } from "node:stream";
3
-
4
3
  //#region js-src/streams/base-kafka-stream-readable.d.ts
5
4
  interface KafkaStreamReadableOptions extends ReadableOptions {
6
5
  kafkaConsumer: KafkaConsumer;
@@ -66,4 +65,4 @@ declare abstract class BaseKafkaStreamReadable extends Readable {
66
65
  }
67
66
  //#endregion
68
67
  export { KafkaStreamReadableOptions as n, BaseKafkaStreamReadable as t };
69
- //# sourceMappingURL=base-kafka-stream-readable-D9sZX4xL.d.ts.map
68
+ //# sourceMappingURL=base-kafka-stream-readable-CtlWvan5.d.cts.map
@@ -1,6 +1,5 @@
1
1
  import { CommitMode, KafkaConsumer, Message, OffsetModel, TopicPartitionConfig } from "../js-binding.js";
2
2
  import { Readable, ReadableOptions } from "node:stream";
3
-
4
3
  //#region js-src/streams/base-kafka-stream-readable.d.ts
5
4
  interface KafkaStreamReadableOptions extends ReadableOptions {
6
5
  kafkaConsumer: KafkaConsumer;
@@ -66,4 +65,4 @@ declare abstract class BaseKafkaStreamReadable extends Readable {
66
65
  }
67
66
  //#endregion
68
67
  export { KafkaStreamReadableOptions as n, BaseKafkaStreamReadable as t };
69
- //# sourceMappingURL=base-kafka-stream-readable-D9sZX4xL.d.cts.map
68
+ //# sourceMappingURL=base-kafka-stream-readable-CtlWvan5.d.ts.map
@@ -1,19 +1,18 @@
1
1
  import { Message, ProducerRecord, RecordMetadata } from "../js-binding.js";
2
2
  import { Channel } from "node:diagnostics_channel";
3
-
4
3
  //#region js-src/diagnostics/channels.d.ts
5
4
  declare const CHANNEL_NAMES: {
6
- readonly PRODUCER_SEND_START: "kafka-crab:producer:send:start";
7
- readonly PRODUCER_SEND_END: "kafka-crab:producer:send:end";
8
- readonly PRODUCER_SEND_ERROR: "kafka-crab:producer:send:error";
9
- readonly CONSUMER_RECEIVE_START: "kafka-crab:consumer:receive:start";
10
- readonly CONSUMER_RECEIVE_END: "kafka-crab:consumer:receive:end";
11
- readonly CONSUMER_PROCESS_START: "kafka-crab:consumer:process:start";
12
- readonly CONSUMER_PROCESS_END: "kafka-crab:consumer:process:end";
13
- readonly BATCH_RECEIVE_START: "kafka-crab:batch:receive:start";
14
- readonly BATCH_RECEIVE_END: "kafka-crab:batch:receive:end";
15
- readonly BATCH_PROCESS_START: "kafka-crab:batch:process:start";
16
- readonly BATCH_PROCESS_END: "kafka-crab:batch:process:end";
5
+ readonly PRODUCER_SEND_START: 'kafka-crab:producer:send:start';
6
+ readonly PRODUCER_SEND_END: 'kafka-crab:producer:send:end';
7
+ readonly PRODUCER_SEND_ERROR: 'kafka-crab:producer:send:error';
8
+ readonly CONSUMER_RECEIVE_START: 'kafka-crab:consumer:receive:start';
9
+ readonly CONSUMER_RECEIVE_END: 'kafka-crab:consumer:receive:end';
10
+ readonly CONSUMER_PROCESS_START: 'kafka-crab:consumer:process:start';
11
+ readonly CONSUMER_PROCESS_END: 'kafka-crab:consumer:process:end';
12
+ readonly BATCH_RECEIVE_START: 'kafka-crab:batch:receive:start';
13
+ readonly BATCH_RECEIVE_END: 'kafka-crab:batch:receive:end';
14
+ readonly BATCH_PROCESS_START: 'kafka-crab:batch:process:start';
15
+ readonly BATCH_PROCESS_END: 'kafka-crab:batch:process:end';
17
16
  };
18
17
  type ChannelName = (typeof CHANNEL_NAMES)[keyof typeof CHANNEL_NAMES];
19
18
  /**
@@ -100,9 +99,9 @@ interface TypedChannel<TEvent> {
100
99
  readonly name: string;
101
100
  readonly channel: Channel;
102
101
  hasSubscribers: boolean;
103
- publish(event: TEvent): void;
104
- subscribe(handler: (event: TEvent, name: string | symbol) => void): void;
105
- unsubscribe(handler: (event: TEvent, name: string | symbol) => void): void;
102
+ publish: (event: TEvent) => void;
103
+ subscribe: (handler: (event: TEvent, name: string | symbol) => void) => void;
104
+ unsubscribe: (handler: (event: TEvent, name: string | symbol) => void) => void;
106
105
  }
107
106
  declare const producerSendStartChannel: TypedChannel<ProducerSendStartEvent>;
108
107
  declare const producerSendEndChannel: TypedChannel<ProducerSendEndEvent>;
@@ -130,4 +129,4 @@ declare const channels: {
130
129
  };
131
130
  //#endregion
132
131
  export { consumerProcessStartChannel as C, producerSendErrorChannel as D, producerSendEndChannel as E, producerSendStartChannel as O, consumerProcessEndChannel as S, consumerReceiveStartChannel as T, batchProcessEndChannel as _, BatchReceiveStartEvent as a, batchReceiveStartChannel as b, ConsumerProcessEndEvent as c, ConsumerReceiveStartEvent as d, KafkaEvent as f, TypedChannel as g, ProducerSendStartEvent as h, BatchReceiveEndEvent as i, ConsumerProcessStartEvent as l, ProducerSendErrorEvent as m, BatchProcessEndEvent as n, CHANNEL_NAMES as o, ProducerSendEndEvent as p, BatchProcessStartEvent as r, ChannelName as s, BaseEvent as t, ConsumerReceiveEndEvent as u, batchProcessStartChannel as v, consumerReceiveEndChannel as w, channels as x, batchReceiveEndChannel as y };
133
- //# sourceMappingURL=channels-CtCeIPbt.d.ts.map
132
+ //# sourceMappingURL=channels-CCvEbkFg.d.ts.map
@@ -1,19 +1,18 @@
1
1
  import { Channel } from "node:diagnostics_channel";
2
2
  import { Message, ProducerRecord, RecordMetadata } from "../js-binding.js";
3
-
4
3
  //#region js-src/diagnostics/channels.d.ts
5
4
  declare const CHANNEL_NAMES: {
6
- readonly PRODUCER_SEND_START: "kafka-crab:producer:send:start";
7
- readonly PRODUCER_SEND_END: "kafka-crab:producer:send:end";
8
- readonly PRODUCER_SEND_ERROR: "kafka-crab:producer:send:error";
9
- readonly CONSUMER_RECEIVE_START: "kafka-crab:consumer:receive:start";
10
- readonly CONSUMER_RECEIVE_END: "kafka-crab:consumer:receive:end";
11
- readonly CONSUMER_PROCESS_START: "kafka-crab:consumer:process:start";
12
- readonly CONSUMER_PROCESS_END: "kafka-crab:consumer:process:end";
13
- readonly BATCH_RECEIVE_START: "kafka-crab:batch:receive:start";
14
- readonly BATCH_RECEIVE_END: "kafka-crab:batch:receive:end";
15
- readonly BATCH_PROCESS_START: "kafka-crab:batch:process:start";
16
- readonly BATCH_PROCESS_END: "kafka-crab:batch:process:end";
5
+ readonly PRODUCER_SEND_START: 'kafka-crab:producer:send:start';
6
+ readonly PRODUCER_SEND_END: 'kafka-crab:producer:send:end';
7
+ readonly PRODUCER_SEND_ERROR: 'kafka-crab:producer:send:error';
8
+ readonly CONSUMER_RECEIVE_START: 'kafka-crab:consumer:receive:start';
9
+ readonly CONSUMER_RECEIVE_END: 'kafka-crab:consumer:receive:end';
10
+ readonly CONSUMER_PROCESS_START: 'kafka-crab:consumer:process:start';
11
+ readonly CONSUMER_PROCESS_END: 'kafka-crab:consumer:process:end';
12
+ readonly BATCH_RECEIVE_START: 'kafka-crab:batch:receive:start';
13
+ readonly BATCH_RECEIVE_END: 'kafka-crab:batch:receive:end';
14
+ readonly BATCH_PROCESS_START: 'kafka-crab:batch:process:start';
15
+ readonly BATCH_PROCESS_END: 'kafka-crab:batch:process:end';
17
16
  };
18
17
  type ChannelName = (typeof CHANNEL_NAMES)[keyof typeof CHANNEL_NAMES];
19
18
  /**
@@ -100,9 +99,9 @@ interface TypedChannel<TEvent> {
100
99
  readonly name: string;
101
100
  readonly channel: Channel;
102
101
  hasSubscribers: boolean;
103
- publish(event: TEvent): void;
104
- subscribe(handler: (event: TEvent, name: string | symbol) => void): void;
105
- unsubscribe(handler: (event: TEvent, name: string | symbol) => void): void;
102
+ publish: (event: TEvent) => void;
103
+ subscribe: (handler: (event: TEvent, name: string | symbol) => void) => void;
104
+ unsubscribe: (handler: (event: TEvent, name: string | symbol) => void) => void;
106
105
  }
107
106
  declare const producerSendStartChannel: TypedChannel<ProducerSendStartEvent>;
108
107
  declare const producerSendEndChannel: TypedChannel<ProducerSendEndEvent>;
@@ -130,4 +129,4 @@ declare const channels: {
130
129
  };
131
130
  //#endregion
132
131
  export { consumerProcessStartChannel as C, producerSendErrorChannel as D, producerSendEndChannel as E, producerSendStartChannel as O, consumerProcessEndChannel as S, consumerReceiveStartChannel as T, batchProcessEndChannel as _, BatchReceiveStartEvent as a, batchReceiveStartChannel as b, ConsumerProcessEndEvent as c, ConsumerReceiveStartEvent as d, KafkaEvent as f, TypedChannel as g, ProducerSendStartEvent as h, BatchReceiveEndEvent as i, ConsumerProcessStartEvent as l, ProducerSendErrorEvent as m, BatchProcessEndEvent as n, CHANNEL_NAMES as o, ProducerSendEndEvent as p, BatchProcessStartEvent as r, ChannelName as s, BaseEvent as t, ConsumerReceiveEndEvent as u, batchProcessStartChannel as v, consumerReceiveEndChannel as w, channels as x, batchReceiveEndChannel as y };
133
- //# sourceMappingURL=channels-DpT3Ilp7.d.cts.map
132
+ //# sourceMappingURL=channels-D4ZtiwQz.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"channels.cjs","names":[],"sources":["../../js-src/diagnostics/channels.ts"],"sourcesContent":["/**\n * Kafka Diagnostic Channels\n *\n * This module provides Node.js diagnostic channels for Kafka operations.\n * External observability tools (like OpenTelemetry adapters) can subscribe\n * to these channels to receive events without coupling to any specific\n * tracing/metrics implementation.\n *\n * @see https://nodejs.org/api/diagnostics_channel.html\n */\nimport { type Channel, channel } from 'node:diagnostics_channel'\nimport type { Message, ProducerRecord, RecordMetadata } from '../../js-binding.js'\n\n// -----------------------------------------------------------------------------\n// Channel Names\n// -----------------------------------------------------------------------------\n\nexport const CHANNEL_NAMES = {\n // Producer channels\n PRODUCER_SEND_START: 'kafka-crab:producer:send:start',\n PRODUCER_SEND_END: 'kafka-crab:producer:send:end',\n PRODUCER_SEND_ERROR: 'kafka-crab:producer:send:error',\n\n // Consumer channels\n CONSUMER_RECEIVE_START: 'kafka-crab:consumer:receive:start',\n CONSUMER_RECEIVE_END: 'kafka-crab:consumer:receive:end',\n CONSUMER_PROCESS_START: 'kafka-crab:consumer:process:start',\n CONSUMER_PROCESS_END: 'kafka-crab:consumer:process:end',\n\n // Batch channels\n BATCH_RECEIVE_START: 'kafka-crab:batch:receive:start',\n BATCH_RECEIVE_END: 'kafka-crab:batch:receive:end',\n BATCH_PROCESS_START: 'kafka-crab:batch:process:start',\n BATCH_PROCESS_END: 'kafka-crab:batch:process:end',\n} as const\n\nexport type ChannelName = (typeof CHANNEL_NAMES)[keyof typeof CHANNEL_NAMES]\n\n// -----------------------------------------------------------------------------\n// Event Payload Types\n// -----------------------------------------------------------------------------\n\n/**\n * Base event interface with common fields\n */\nexport interface BaseEvent {\n /** Timestamp when the event occurred (ms since epoch) */\n timestamp: number\n /** Client ID if available */\n clientId?: string\n /** Server address if configured */\n serverAddress?: string\n /** Server port if configured */\n serverPort?: number\n /**\n * Context object for adapters to attach data (e.g., spans).\n * Subscribers can mutate this to pass data between start/end events.\n */\n context: Record<PropertyKey, unknown>\n}\n\n// Producer Events\nexport interface ProducerSendStartEvent extends BaseEvent {\n topic: string\n record: ProducerRecord\n messageCount: number\n}\n\nexport interface ProducerSendEndEvent extends BaseEvent {\n topic: string\n record: ProducerRecord\n metadata?: RecordMetadata[]\n durationMs: number\n error?: Error\n}\n\nexport interface ProducerSendErrorEvent extends BaseEvent {\n topic: string\n record: ProducerRecord\n durationMs: number\n error: Error\n}\n\n// Consumer Events\nexport interface ConsumerReceiveStartEvent extends BaseEvent {\n groupId?: string\n}\n\nexport interface ConsumerReceiveEndEvent extends BaseEvent {\n message: Message | null\n groupId?: string\n durationMs: number\n error?: Error\n}\n\nexport interface ConsumerProcessStartEvent extends BaseEvent {\n message: Message\n groupId?: string\n}\n\nexport interface ConsumerProcessEndEvent extends BaseEvent {\n message: Message\n groupId?: string\n durationMs: number\n error?: Error\n}\n\n// Batch Events\nexport interface BatchReceiveStartEvent extends BaseEvent {\n groupId?: string\n requestedSize: number\n timeoutMs: number\n}\n\nexport interface BatchReceiveEndEvent extends BaseEvent {\n messages: Message[]\n groupId?: string\n durationMs: number\n error?: Error\n}\n\nexport interface BatchProcessStartEvent extends BaseEvent {\n messages: Message[]\n groupId?: string\n}\n\nexport interface BatchProcessEndEvent extends BaseEvent {\n messages: Message[]\n groupId?: string\n durationMs: number\n error?: Error\n}\n\n// Union type for all events\nexport type KafkaEvent =\n | ProducerSendStartEvent\n | ProducerSendEndEvent\n | ConsumerReceiveStartEvent\n | ConsumerReceiveEndEvent\n | ConsumerProcessStartEvent\n | ConsumerProcessEndEvent\n | BatchReceiveStartEvent\n | BatchReceiveEndEvent\n | BatchProcessStartEvent\n | BatchProcessEndEvent\n\n// -----------------------------------------------------------------------------\n// Channel Instances (Typed)\n// -----------------------------------------------------------------------------\n\n/**\n * Typed channel wrapper for type-safe publish/subscribe\n */\nexport interface TypedChannel<TEvent> {\n readonly name: string\n readonly channel: Channel\n hasSubscribers: boolean\n publish(event: TEvent): void\n subscribe(handler: (event: TEvent, name: string | symbol) => void): void\n unsubscribe(handler: (event: TEvent, name: string | symbol) => void): void\n}\n\nfunction createTypedChannel<TEvent>(name: string): TypedChannel<TEvent> {\n const ch = channel(name)\n return {\n name,\n channel: ch,\n get hasSubscribers() {\n return ch.hasSubscribers\n },\n publish(event: TEvent) {\n ch.publish(event)\n },\n subscribe(handler: (event: TEvent, name: string | symbol) => void) {\n ch.subscribe(handler as (message: unknown, name: string | symbol) => void)\n },\n unsubscribe(handler: (event: TEvent, name: string | symbol) => void) {\n ch.unsubscribe(handler as (message: unknown, name: string | symbol) => void)\n },\n }\n}\n\n// Producer channels\nexport const producerSendStartChannel = createTypedChannel<ProducerSendStartEvent>(CHANNEL_NAMES.PRODUCER_SEND_START)\nexport const producerSendEndChannel = createTypedChannel<ProducerSendEndEvent>(CHANNEL_NAMES.PRODUCER_SEND_END)\nexport const producerSendErrorChannel = createTypedChannel<ProducerSendErrorEvent>(CHANNEL_NAMES.PRODUCER_SEND_ERROR)\n\n// Consumer channels\nexport const consumerReceiveStartChannel = createTypedChannel<ConsumerReceiveStartEvent>(\n CHANNEL_NAMES.CONSUMER_RECEIVE_START,\n)\nexport const consumerReceiveEndChannel = createTypedChannel<ConsumerReceiveEndEvent>(CHANNEL_NAMES.CONSUMER_RECEIVE_END)\nexport const consumerProcessStartChannel = createTypedChannel<ConsumerProcessStartEvent>(\n CHANNEL_NAMES.CONSUMER_PROCESS_START,\n)\nexport const consumerProcessEndChannel = createTypedChannel<ConsumerProcessEndEvent>(CHANNEL_NAMES.CONSUMER_PROCESS_END)\n\n// Batch channels\nexport const batchReceiveStartChannel = createTypedChannel<BatchReceiveStartEvent>(CHANNEL_NAMES.BATCH_RECEIVE_START)\nexport const batchReceiveEndChannel = createTypedChannel<BatchReceiveEndEvent>(CHANNEL_NAMES.BATCH_RECEIVE_END)\nexport const batchProcessStartChannel = createTypedChannel<BatchProcessStartEvent>(CHANNEL_NAMES.BATCH_PROCESS_START)\nexport const batchProcessEndChannel = createTypedChannel<BatchProcessEndEvent>(CHANNEL_NAMES.BATCH_PROCESS_END)\n\n// All channels exported as a single object for convenience\nexport const channels = {\n producerSendStart: producerSendStartChannel,\n producerSendEnd: producerSendEndChannel,\n producerSendError: producerSendErrorChannel,\n consumerReceiveStart: consumerReceiveStartChannel,\n consumerReceiveEnd: consumerReceiveEndChannel,\n consumerProcessStart: consumerProcessStartChannel,\n consumerProcessEnd: consumerProcessEndChannel,\n batchReceiveStart: batchReceiveStartChannel,\n batchReceiveEnd: batchReceiveEndChannel,\n batchProcessStart: batchProcessStartChannel,\n batchProcessEnd: batchProcessEndChannel,\n} as const\n"],"mappings":";;;;;;;;;;;;;AAiBA,MAAa,gBAAgB;CAE3B,qBAAqB;CACrB,mBAAmB;CACnB,qBAAqB;CAGrB,wBAAwB;CACxB,sBAAsB;CACtB,wBAAwB;CACxB,sBAAsB;CAGtB,qBAAqB;CACrB,mBAAmB;CACnB,qBAAqB;CACrB,mBAAmB;AACrB;AAgIA,SAAS,mBAA2B,MAAoC;CACtE,MAAM,MAAA,GAAA,yBAAA,SAAa,IAAI;CACvB,OAAO;EACL;EACA,SAAS;EACT,IAAI,iBAAiB;GACnB,OAAO,GAAG;EACZ;EACA,QAAQ,OAAe;GACrB,GAAG,QAAQ,KAAK;EAClB;EACA,UAAU,SAAyD;GACjE,GAAG,UAAU,OAA4D;EAC3E;EACA,YAAY,SAAyD;GACnE,GAAG,YAAY,OAA4D;EAC7E;CACF;AACF;AAGA,MAAa,2BAA2B,mBAA2C,cAAc,mBAAmB;AACpH,MAAa,yBAAyB,mBAAyC,cAAc,iBAAiB;AAC9G,MAAa,2BAA2B,mBAA2C,cAAc,mBAAmB;AAGpH,MAAa,8BAA8B,mBACzC,cAAc,sBAChB;AACA,MAAa,4BAA4B,mBAA4C,cAAc,oBAAoB;AACvH,MAAa,8BAA8B,mBACzC,cAAc,sBAChB;AACA,MAAa,4BAA4B,mBAA4C,cAAc,oBAAoB;AAGvH,MAAa,2BAA2B,mBAA2C,cAAc,mBAAmB;AACpH,MAAa,yBAAyB,mBAAyC,cAAc,iBAAiB;AAC9G,MAAa,2BAA2B,mBAA2C,cAAc,mBAAmB;AACpH,MAAa,yBAAyB,mBAAyC,cAAc,iBAAiB;AAG9G,MAAa,WAAW;CACtB,mBAAmB;CACnB,iBAAiB;CACjB,mBAAmB;CACnB,sBAAsB;CACtB,oBAAoB;CACpB,sBAAsB;CACtB,oBAAoB;CACpB,mBAAmB;CACnB,iBAAiB;CACjB,mBAAmB;CACnB,iBAAiB;AACnB"}
1
+ {"version":3,"file":"channels.cjs","names":[],"sources":["../../js-src/diagnostics/channels.ts"],"sourcesContent":["/**\n * Kafka Diagnostic Channels\n *\n * This module provides Node.js diagnostic channels for Kafka operations.\n * External observability tools (like OpenTelemetry adapters) can subscribe\n * to these channels to receive events without coupling to any specific\n * tracing/metrics implementation.\n *\n * @see https://nodejs.org/api/diagnostics_channel.html\n */\nimport { type Channel, channel } from 'node:diagnostics_channel'\nimport type { Message, ProducerRecord, RecordMetadata } from '../../js-binding.js'\n\n// -----------------------------------------------------------------------------\n// Channel Names\n// -----------------------------------------------------------------------------\n\nexport const CHANNEL_NAMES = {\n // Producer channels\n PRODUCER_SEND_START: 'kafka-crab:producer:send:start',\n PRODUCER_SEND_END: 'kafka-crab:producer:send:end',\n PRODUCER_SEND_ERROR: 'kafka-crab:producer:send:error',\n\n // Consumer channels\n CONSUMER_RECEIVE_START: 'kafka-crab:consumer:receive:start',\n CONSUMER_RECEIVE_END: 'kafka-crab:consumer:receive:end',\n CONSUMER_PROCESS_START: 'kafka-crab:consumer:process:start',\n CONSUMER_PROCESS_END: 'kafka-crab:consumer:process:end',\n\n // Batch channels\n BATCH_RECEIVE_START: 'kafka-crab:batch:receive:start',\n BATCH_RECEIVE_END: 'kafka-crab:batch:receive:end',\n BATCH_PROCESS_START: 'kafka-crab:batch:process:start',\n BATCH_PROCESS_END: 'kafka-crab:batch:process:end',\n} as const\n\nexport type ChannelName = (typeof CHANNEL_NAMES)[keyof typeof CHANNEL_NAMES]\n\n// -----------------------------------------------------------------------------\n// Event Payload Types\n// -----------------------------------------------------------------------------\n\n/**\n * Base event interface with common fields\n */\nexport interface BaseEvent {\n /** Timestamp when the event occurred (ms since epoch) */\n timestamp: number\n /** Client ID if available */\n clientId?: string\n /** Server address if configured */\n serverAddress?: string\n /** Server port if configured */\n serverPort?: number\n /**\n * Context object for adapters to attach data (e.g., spans).\n * Subscribers can mutate this to pass data between start/end events.\n */\n context: Record<PropertyKey, unknown>\n}\n\n// Producer Events\nexport interface ProducerSendStartEvent extends BaseEvent {\n topic: string\n record: ProducerRecord\n messageCount: number\n}\n\nexport interface ProducerSendEndEvent extends BaseEvent {\n topic: string\n record: ProducerRecord\n metadata?: RecordMetadata[]\n durationMs: number\n error?: Error\n}\n\nexport interface ProducerSendErrorEvent extends BaseEvent {\n topic: string\n record: ProducerRecord\n durationMs: number\n error: Error\n}\n\n// Consumer Events\nexport interface ConsumerReceiveStartEvent extends BaseEvent {\n groupId?: string\n}\n\nexport interface ConsumerReceiveEndEvent extends BaseEvent {\n message: Message | null\n groupId?: string\n durationMs: number\n error?: Error\n}\n\nexport interface ConsumerProcessStartEvent extends BaseEvent {\n message: Message\n groupId?: string\n}\n\nexport interface ConsumerProcessEndEvent extends BaseEvent {\n message: Message\n groupId?: string\n durationMs: number\n error?: Error\n}\n\n// Batch Events\nexport interface BatchReceiveStartEvent extends BaseEvent {\n groupId?: string\n requestedSize: number\n timeoutMs: number\n}\n\nexport interface BatchReceiveEndEvent extends BaseEvent {\n messages: Message[]\n groupId?: string\n durationMs: number\n error?: Error\n}\n\nexport interface BatchProcessStartEvent extends BaseEvent {\n messages: Message[]\n groupId?: string\n}\n\nexport interface BatchProcessEndEvent extends BaseEvent {\n messages: Message[]\n groupId?: string\n durationMs: number\n error?: Error\n}\n\n// Union type for all events\nexport type KafkaEvent =\n | ProducerSendStartEvent\n | ProducerSendEndEvent\n | ConsumerReceiveStartEvent\n | ConsumerReceiveEndEvent\n | ConsumerProcessStartEvent\n | ConsumerProcessEndEvent\n | BatchReceiveStartEvent\n | BatchReceiveEndEvent\n | BatchProcessStartEvent\n | BatchProcessEndEvent\n\n// -----------------------------------------------------------------------------\n// Channel Instances (Typed)\n// -----------------------------------------------------------------------------\n\n/**\n * Typed channel wrapper for type-safe publish/subscribe\n */\nexport interface TypedChannel<TEvent> {\n readonly name: string\n readonly channel: Channel\n hasSubscribers: boolean\n publish: (event: TEvent) => void\n subscribe: (handler: (event: TEvent, name: string | symbol) => void) => void\n unsubscribe: (handler: (event: TEvent, name: string | symbol) => void) => void\n}\n\nfunction createTypedChannel<TEvent>(name: string): TypedChannel<TEvent> {\n const ch = channel(name)\n return {\n name,\n channel: ch,\n get hasSubscribers() {\n return ch.hasSubscribers\n },\n publish(event: TEvent) {\n ch.publish(event)\n },\n subscribe(handler: (event: TEvent, name: string | symbol) => void) {\n ch.subscribe(handler as (message: unknown, name: string | symbol) => void)\n },\n unsubscribe(handler: (event: TEvent, name: string | symbol) => void) {\n ch.unsubscribe(handler as (message: unknown, name: string | symbol) => void)\n },\n }\n}\n\n// Producer channels\nexport const producerSendStartChannel = createTypedChannel<ProducerSendStartEvent>(CHANNEL_NAMES.PRODUCER_SEND_START)\nexport const producerSendEndChannel = createTypedChannel<ProducerSendEndEvent>(CHANNEL_NAMES.PRODUCER_SEND_END)\nexport const producerSendErrorChannel = createTypedChannel<ProducerSendErrorEvent>(CHANNEL_NAMES.PRODUCER_SEND_ERROR)\n\n// Consumer channels\nexport const consumerReceiveStartChannel = createTypedChannel<ConsumerReceiveStartEvent>(\n CHANNEL_NAMES.CONSUMER_RECEIVE_START,\n)\nexport const consumerReceiveEndChannel = createTypedChannel<ConsumerReceiveEndEvent>(CHANNEL_NAMES.CONSUMER_RECEIVE_END)\nexport const consumerProcessStartChannel = createTypedChannel<ConsumerProcessStartEvent>(\n CHANNEL_NAMES.CONSUMER_PROCESS_START,\n)\nexport const consumerProcessEndChannel = createTypedChannel<ConsumerProcessEndEvent>(CHANNEL_NAMES.CONSUMER_PROCESS_END)\n\n// Batch channels\nexport const batchReceiveStartChannel = createTypedChannel<BatchReceiveStartEvent>(CHANNEL_NAMES.BATCH_RECEIVE_START)\nexport const batchReceiveEndChannel = createTypedChannel<BatchReceiveEndEvent>(CHANNEL_NAMES.BATCH_RECEIVE_END)\nexport const batchProcessStartChannel = createTypedChannel<BatchProcessStartEvent>(CHANNEL_NAMES.BATCH_PROCESS_START)\nexport const batchProcessEndChannel = createTypedChannel<BatchProcessEndEvent>(CHANNEL_NAMES.BATCH_PROCESS_END)\n\n// All channels exported as a single object for convenience\nexport const channels = {\n producerSendStart: producerSendStartChannel,\n producerSendEnd: producerSendEndChannel,\n producerSendError: producerSendErrorChannel,\n consumerReceiveStart: consumerReceiveStartChannel,\n consumerReceiveEnd: consumerReceiveEndChannel,\n consumerProcessStart: consumerProcessStartChannel,\n consumerProcessEnd: consumerProcessEndChannel,\n batchReceiveStart: batchReceiveStartChannel,\n batchReceiveEnd: batchReceiveEndChannel,\n batchProcessStart: batchProcessStartChannel,\n batchProcessEnd: batchProcessEndChannel,\n} as const\n"],"mappings":";;;;;;;;;;;;;AAiBA,MAAa,gBAAgB;CAE3B,qBAAqB;CACrB,mBAAmB;CACnB,qBAAqB;CAGrB,wBAAwB;CACxB,sBAAsB;CACtB,wBAAwB;CACxB,sBAAsB;CAGtB,qBAAqB;CACrB,mBAAmB;CACnB,qBAAqB;CACrB,mBAAmB;AACrB;AAgIA,SAAS,mBAA2B,MAAoC;CACtE,MAAM,MAAA,GAAA,yBAAA,QAAA,CAAa,IAAI;CACvB,OAAO;EACL;EACA,SAAS;EACT,IAAI,iBAAiB;GACnB,OAAO,GAAG;EACZ;EACA,QAAQ,OAAe;GACrB,GAAG,QAAQ,KAAK;EAClB;EACA,UAAU,SAAyD;GACjE,GAAG,UAAU,OAA4D;EAC3E;EACA,YAAY,SAAyD;GACnE,GAAG,YAAY,OAA4D;EAC7E;CACF;AACF;AAGA,MAAa,2BAA2B,mBAA2C,cAAc,mBAAmB;AACpH,MAAa,yBAAyB,mBAAyC,cAAc,iBAAiB;AAC9G,MAAa,2BAA2B,mBAA2C,cAAc,mBAAmB;AAGpH,MAAa,8BAA8B,mBACzC,cAAc,sBAChB;AACA,MAAa,4BAA4B,mBAA4C,cAAc,oBAAoB;AACvH,MAAa,8BAA8B,mBACzC,cAAc,sBAChB;AACA,MAAa,4BAA4B,mBAA4C,cAAc,oBAAoB;AAGvH,MAAa,2BAA2B,mBAA2C,cAAc,mBAAmB;AACpH,MAAa,yBAAyB,mBAAyC,cAAc,iBAAiB;AAC9G,MAAa,2BAA2B,mBAA2C,cAAc,mBAAmB;AACpH,MAAa,yBAAyB,mBAAyC,cAAc,iBAAiB;AAG9G,MAAa,WAAW;CACtB,mBAAmB;CACnB,iBAAiB;CACjB,mBAAmB;CACnB,sBAAsB;CACtB,oBAAoB;CACpB,sBAAsB;CACtB,oBAAoB;CACpB,mBAAmB;CACnB,iBAAiB;CACjB,mBAAmB;CACnB,iBAAiB;AACnB"}
@@ -1,2 +1,2 @@
1
- import { C as consumerProcessStartChannel, D as producerSendErrorChannel, E as producerSendEndChannel, O as producerSendStartChannel, S as consumerProcessEndChannel, T as consumerReceiveStartChannel, _ as batchProcessEndChannel, a as BatchReceiveStartEvent, b as batchReceiveStartChannel, c as ConsumerProcessEndEvent, d as ConsumerReceiveStartEvent, f as KafkaEvent, g as TypedChannel, h as ProducerSendStartEvent, i as BatchReceiveEndEvent, l as ConsumerProcessStartEvent, m as ProducerSendErrorEvent, n as BatchProcessEndEvent, o as CHANNEL_NAMES, p as ProducerSendEndEvent, r as BatchProcessStartEvent, s as ChannelName, t as BaseEvent, u as ConsumerReceiveEndEvent, v as batchProcessStartChannel, w as consumerReceiveEndChannel, x as channels, y as batchReceiveEndChannel } from "../channels-DpT3Ilp7.cjs";
1
+ import { C as consumerProcessStartChannel, D as producerSendErrorChannel, E as producerSendEndChannel, O as producerSendStartChannel, S as consumerProcessEndChannel, T as consumerReceiveStartChannel, _ as batchProcessEndChannel, a as BatchReceiveStartEvent, b as batchReceiveStartChannel, c as ConsumerProcessEndEvent, d as ConsumerReceiveStartEvent, f as KafkaEvent, g as TypedChannel, h as ProducerSendStartEvent, i as BatchReceiveEndEvent, l as ConsumerProcessStartEvent, m as ProducerSendErrorEvent, n as BatchProcessEndEvent, o as CHANNEL_NAMES, p as ProducerSendEndEvent, r as BatchProcessStartEvent, s as ChannelName, t as BaseEvent, u as ConsumerReceiveEndEvent, v as batchProcessStartChannel, w as consumerReceiveEndChannel, x as channels, y as batchReceiveEndChannel } from "../channels-D4ZtiwQz.cjs";
2
2
  export { BaseEvent, BatchProcessEndEvent, BatchProcessStartEvent, BatchReceiveEndEvent, BatchReceiveStartEvent, CHANNEL_NAMES, ChannelName, ConsumerProcessEndEvent, ConsumerProcessStartEvent, ConsumerReceiveEndEvent, ConsumerReceiveStartEvent, KafkaEvent, ProducerSendEndEvent, ProducerSendErrorEvent, ProducerSendStartEvent, TypedChannel, batchProcessEndChannel, batchProcessStartChannel, batchReceiveEndChannel, batchReceiveStartChannel, channels, consumerProcessEndChannel, consumerProcessStartChannel, consumerReceiveEndChannel, consumerReceiveStartChannel, producerSendEndChannel, producerSendErrorChannel, producerSendStartChannel };
@@ -1,2 +1,2 @@
1
- import { C as consumerProcessStartChannel, D as producerSendErrorChannel, E as producerSendEndChannel, O as producerSendStartChannel, S as consumerProcessEndChannel, T as consumerReceiveStartChannel, _ as batchProcessEndChannel, a as BatchReceiveStartEvent, b as batchReceiveStartChannel, c as ConsumerProcessEndEvent, d as ConsumerReceiveStartEvent, f as KafkaEvent, g as TypedChannel, h as ProducerSendStartEvent, i as BatchReceiveEndEvent, l as ConsumerProcessStartEvent, m as ProducerSendErrorEvent, n as BatchProcessEndEvent, o as CHANNEL_NAMES, p as ProducerSendEndEvent, r as BatchProcessStartEvent, s as ChannelName, t as BaseEvent, u as ConsumerReceiveEndEvent, v as batchProcessStartChannel, w as consumerReceiveEndChannel, x as channels, y as batchReceiveEndChannel } from "../channels-CtCeIPbt.js";
1
+ import { C as consumerProcessStartChannel, D as producerSendErrorChannel, E as producerSendEndChannel, O as producerSendStartChannel, S as consumerProcessEndChannel, T as consumerReceiveStartChannel, _ as batchProcessEndChannel, a as BatchReceiveStartEvent, b as batchReceiveStartChannel, c as ConsumerProcessEndEvent, d as ConsumerReceiveStartEvent, f as KafkaEvent, g as TypedChannel, h as ProducerSendStartEvent, i as BatchReceiveEndEvent, l as ConsumerProcessStartEvent, m as ProducerSendErrorEvent, n as BatchProcessEndEvent, o as CHANNEL_NAMES, p as ProducerSendEndEvent, r as BatchProcessStartEvent, s as ChannelName, t as BaseEvent, u as ConsumerReceiveEndEvent, v as batchProcessStartChannel, w as consumerReceiveEndChannel, x as channels, y as batchReceiveEndChannel } from "../channels-CCvEbkFg.js";
2
2
  export { BaseEvent, BatchProcessEndEvent, BatchProcessStartEvent, BatchReceiveEndEvent, BatchReceiveStartEvent, CHANNEL_NAMES, ChannelName, ConsumerProcessEndEvent, ConsumerProcessStartEvent, ConsumerReceiveEndEvent, ConsumerReceiveStartEvent, KafkaEvent, ProducerSendEndEvent, ProducerSendErrorEvent, ProducerSendStartEvent, TypedChannel, batchProcessEndChannel, batchProcessStartChannel, batchReceiveEndChannel, batchReceiveStartChannel, channels, consumerProcessEndChannel, consumerProcessStartChannel, consumerReceiveEndChannel, consumerReceiveStartChannel, producerSendEndChannel, producerSendErrorChannel, producerSendStartChannel };
@@ -1 +1 @@
1
- {"version":3,"file":"channels.js","names":[],"sources":["../../js-src/diagnostics/channels.ts"],"sourcesContent":["/**\n * Kafka Diagnostic Channels\n *\n * This module provides Node.js diagnostic channels for Kafka operations.\n * External observability tools (like OpenTelemetry adapters) can subscribe\n * to these channels to receive events without coupling to any specific\n * tracing/metrics implementation.\n *\n * @see https://nodejs.org/api/diagnostics_channel.html\n */\nimport { type Channel, channel } from 'node:diagnostics_channel'\nimport type { Message, ProducerRecord, RecordMetadata } from '../../js-binding.js'\n\n// -----------------------------------------------------------------------------\n// Channel Names\n// -----------------------------------------------------------------------------\n\nexport const CHANNEL_NAMES = {\n // Producer channels\n PRODUCER_SEND_START: 'kafka-crab:producer:send:start',\n PRODUCER_SEND_END: 'kafka-crab:producer:send:end',\n PRODUCER_SEND_ERROR: 'kafka-crab:producer:send:error',\n\n // Consumer channels\n CONSUMER_RECEIVE_START: 'kafka-crab:consumer:receive:start',\n CONSUMER_RECEIVE_END: 'kafka-crab:consumer:receive:end',\n CONSUMER_PROCESS_START: 'kafka-crab:consumer:process:start',\n CONSUMER_PROCESS_END: 'kafka-crab:consumer:process:end',\n\n // Batch channels\n BATCH_RECEIVE_START: 'kafka-crab:batch:receive:start',\n BATCH_RECEIVE_END: 'kafka-crab:batch:receive:end',\n BATCH_PROCESS_START: 'kafka-crab:batch:process:start',\n BATCH_PROCESS_END: 'kafka-crab:batch:process:end',\n} as const\n\nexport type ChannelName = (typeof CHANNEL_NAMES)[keyof typeof CHANNEL_NAMES]\n\n// -----------------------------------------------------------------------------\n// Event Payload Types\n// -----------------------------------------------------------------------------\n\n/**\n * Base event interface with common fields\n */\nexport interface BaseEvent {\n /** Timestamp when the event occurred (ms since epoch) */\n timestamp: number\n /** Client ID if available */\n clientId?: string\n /** Server address if configured */\n serverAddress?: string\n /** Server port if configured */\n serverPort?: number\n /**\n * Context object for adapters to attach data (e.g., spans).\n * Subscribers can mutate this to pass data between start/end events.\n */\n context: Record<PropertyKey, unknown>\n}\n\n// Producer Events\nexport interface ProducerSendStartEvent extends BaseEvent {\n topic: string\n record: ProducerRecord\n messageCount: number\n}\n\nexport interface ProducerSendEndEvent extends BaseEvent {\n topic: string\n record: ProducerRecord\n metadata?: RecordMetadata[]\n durationMs: number\n error?: Error\n}\n\nexport interface ProducerSendErrorEvent extends BaseEvent {\n topic: string\n record: ProducerRecord\n durationMs: number\n error: Error\n}\n\n// Consumer Events\nexport interface ConsumerReceiveStartEvent extends BaseEvent {\n groupId?: string\n}\n\nexport interface ConsumerReceiveEndEvent extends BaseEvent {\n message: Message | null\n groupId?: string\n durationMs: number\n error?: Error\n}\n\nexport interface ConsumerProcessStartEvent extends BaseEvent {\n message: Message\n groupId?: string\n}\n\nexport interface ConsumerProcessEndEvent extends BaseEvent {\n message: Message\n groupId?: string\n durationMs: number\n error?: Error\n}\n\n// Batch Events\nexport interface BatchReceiveStartEvent extends BaseEvent {\n groupId?: string\n requestedSize: number\n timeoutMs: number\n}\n\nexport interface BatchReceiveEndEvent extends BaseEvent {\n messages: Message[]\n groupId?: string\n durationMs: number\n error?: Error\n}\n\nexport interface BatchProcessStartEvent extends BaseEvent {\n messages: Message[]\n groupId?: string\n}\n\nexport interface BatchProcessEndEvent extends BaseEvent {\n messages: Message[]\n groupId?: string\n durationMs: number\n error?: Error\n}\n\n// Union type for all events\nexport type KafkaEvent =\n | ProducerSendStartEvent\n | ProducerSendEndEvent\n | ConsumerReceiveStartEvent\n | ConsumerReceiveEndEvent\n | ConsumerProcessStartEvent\n | ConsumerProcessEndEvent\n | BatchReceiveStartEvent\n | BatchReceiveEndEvent\n | BatchProcessStartEvent\n | BatchProcessEndEvent\n\n// -----------------------------------------------------------------------------\n// Channel Instances (Typed)\n// -----------------------------------------------------------------------------\n\n/**\n * Typed channel wrapper for type-safe publish/subscribe\n */\nexport interface TypedChannel<TEvent> {\n readonly name: string\n readonly channel: Channel\n hasSubscribers: boolean\n publish(event: TEvent): void\n subscribe(handler: (event: TEvent, name: string | symbol) => void): void\n unsubscribe(handler: (event: TEvent, name: string | symbol) => void): void\n}\n\nfunction createTypedChannel<TEvent>(name: string): TypedChannel<TEvent> {\n const ch = channel(name)\n return {\n name,\n channel: ch,\n get hasSubscribers() {\n return ch.hasSubscribers\n },\n publish(event: TEvent) {\n ch.publish(event)\n },\n subscribe(handler: (event: TEvent, name: string | symbol) => void) {\n ch.subscribe(handler as (message: unknown, name: string | symbol) => void)\n },\n unsubscribe(handler: (event: TEvent, name: string | symbol) => void) {\n ch.unsubscribe(handler as (message: unknown, name: string | symbol) => void)\n },\n }\n}\n\n// Producer channels\nexport const producerSendStartChannel = createTypedChannel<ProducerSendStartEvent>(CHANNEL_NAMES.PRODUCER_SEND_START)\nexport const producerSendEndChannel = createTypedChannel<ProducerSendEndEvent>(CHANNEL_NAMES.PRODUCER_SEND_END)\nexport const producerSendErrorChannel = createTypedChannel<ProducerSendErrorEvent>(CHANNEL_NAMES.PRODUCER_SEND_ERROR)\n\n// Consumer channels\nexport const consumerReceiveStartChannel = createTypedChannel<ConsumerReceiveStartEvent>(\n CHANNEL_NAMES.CONSUMER_RECEIVE_START,\n)\nexport const consumerReceiveEndChannel = createTypedChannel<ConsumerReceiveEndEvent>(CHANNEL_NAMES.CONSUMER_RECEIVE_END)\nexport const consumerProcessStartChannel = createTypedChannel<ConsumerProcessStartEvent>(\n CHANNEL_NAMES.CONSUMER_PROCESS_START,\n)\nexport const consumerProcessEndChannel = createTypedChannel<ConsumerProcessEndEvent>(CHANNEL_NAMES.CONSUMER_PROCESS_END)\n\n// Batch channels\nexport const batchReceiveStartChannel = createTypedChannel<BatchReceiveStartEvent>(CHANNEL_NAMES.BATCH_RECEIVE_START)\nexport const batchReceiveEndChannel = createTypedChannel<BatchReceiveEndEvent>(CHANNEL_NAMES.BATCH_RECEIVE_END)\nexport const batchProcessStartChannel = createTypedChannel<BatchProcessStartEvent>(CHANNEL_NAMES.BATCH_PROCESS_START)\nexport const batchProcessEndChannel = createTypedChannel<BatchProcessEndEvent>(CHANNEL_NAMES.BATCH_PROCESS_END)\n\n// All channels exported as a single object for convenience\nexport const channels = {\n producerSendStart: producerSendStartChannel,\n producerSendEnd: producerSendEndChannel,\n producerSendError: producerSendErrorChannel,\n consumerReceiveStart: consumerReceiveStartChannel,\n consumerReceiveEnd: consumerReceiveEndChannel,\n consumerProcessStart: consumerProcessStartChannel,\n consumerProcessEnd: consumerProcessEndChannel,\n batchReceiveStart: batchReceiveStartChannel,\n batchReceiveEnd: batchReceiveEndChannel,\n batchProcessStart: batchProcessStartChannel,\n batchProcessEnd: batchProcessEndChannel,\n} as const\n"],"mappings":";;;;;;;;;;;;AAiBA,MAAa,gBAAgB;CAE3B,qBAAqB;CACrB,mBAAmB;CACnB,qBAAqB;CAGrB,wBAAwB;CACxB,sBAAsB;CACtB,wBAAwB;CACxB,sBAAsB;CAGtB,qBAAqB;CACrB,mBAAmB;CACnB,qBAAqB;CACrB,mBAAmB;AACrB;AAgIA,SAAS,mBAA2B,MAAoC;CACtE,MAAM,KAAK,QAAQ,IAAI;CACvB,OAAO;EACL;EACA,SAAS;EACT,IAAI,iBAAiB;GACnB,OAAO,GAAG;EACZ;EACA,QAAQ,OAAe;GACrB,GAAG,QAAQ,KAAK;EAClB;EACA,UAAU,SAAyD;GACjE,GAAG,UAAU,OAA4D;EAC3E;EACA,YAAY,SAAyD;GACnE,GAAG,YAAY,OAA4D;EAC7E;CACF;AACF;AAGA,MAAa,2BAA2B,mBAA2C,cAAc,mBAAmB;AACpH,MAAa,yBAAyB,mBAAyC,cAAc,iBAAiB;AAC9G,MAAa,2BAA2B,mBAA2C,cAAc,mBAAmB;AAGpH,MAAa,8BAA8B,mBACzC,cAAc,sBAChB;AACA,MAAa,4BAA4B,mBAA4C,cAAc,oBAAoB;AACvH,MAAa,8BAA8B,mBACzC,cAAc,sBAChB;AACA,MAAa,4BAA4B,mBAA4C,cAAc,oBAAoB;AAGvH,MAAa,2BAA2B,mBAA2C,cAAc,mBAAmB;AACpH,MAAa,yBAAyB,mBAAyC,cAAc,iBAAiB;AAC9G,MAAa,2BAA2B,mBAA2C,cAAc,mBAAmB;AACpH,MAAa,yBAAyB,mBAAyC,cAAc,iBAAiB;AAG9G,MAAa,WAAW;CACtB,mBAAmB;CACnB,iBAAiB;CACjB,mBAAmB;CACnB,sBAAsB;CACtB,oBAAoB;CACpB,sBAAsB;CACtB,oBAAoB;CACpB,mBAAmB;CACnB,iBAAiB;CACjB,mBAAmB;CACnB,iBAAiB;AACnB"}
1
+ {"version":3,"file":"channels.js","names":[],"sources":["../../js-src/diagnostics/channels.ts"],"sourcesContent":["/**\n * Kafka Diagnostic Channels\n *\n * This module provides Node.js diagnostic channels for Kafka operations.\n * External observability tools (like OpenTelemetry adapters) can subscribe\n * to these channels to receive events without coupling to any specific\n * tracing/metrics implementation.\n *\n * @see https://nodejs.org/api/diagnostics_channel.html\n */\nimport { type Channel, channel } from 'node:diagnostics_channel'\nimport type { Message, ProducerRecord, RecordMetadata } from '../../js-binding.js'\n\n// -----------------------------------------------------------------------------\n// Channel Names\n// -----------------------------------------------------------------------------\n\nexport const CHANNEL_NAMES = {\n // Producer channels\n PRODUCER_SEND_START: 'kafka-crab:producer:send:start',\n PRODUCER_SEND_END: 'kafka-crab:producer:send:end',\n PRODUCER_SEND_ERROR: 'kafka-crab:producer:send:error',\n\n // Consumer channels\n CONSUMER_RECEIVE_START: 'kafka-crab:consumer:receive:start',\n CONSUMER_RECEIVE_END: 'kafka-crab:consumer:receive:end',\n CONSUMER_PROCESS_START: 'kafka-crab:consumer:process:start',\n CONSUMER_PROCESS_END: 'kafka-crab:consumer:process:end',\n\n // Batch channels\n BATCH_RECEIVE_START: 'kafka-crab:batch:receive:start',\n BATCH_RECEIVE_END: 'kafka-crab:batch:receive:end',\n BATCH_PROCESS_START: 'kafka-crab:batch:process:start',\n BATCH_PROCESS_END: 'kafka-crab:batch:process:end',\n} as const\n\nexport type ChannelName = (typeof CHANNEL_NAMES)[keyof typeof CHANNEL_NAMES]\n\n// -----------------------------------------------------------------------------\n// Event Payload Types\n// -----------------------------------------------------------------------------\n\n/**\n * Base event interface with common fields\n */\nexport interface BaseEvent {\n /** Timestamp when the event occurred (ms since epoch) */\n timestamp: number\n /** Client ID if available */\n clientId?: string\n /** Server address if configured */\n serverAddress?: string\n /** Server port if configured */\n serverPort?: number\n /**\n * Context object for adapters to attach data (e.g., spans).\n * Subscribers can mutate this to pass data between start/end events.\n */\n context: Record<PropertyKey, unknown>\n}\n\n// Producer Events\nexport interface ProducerSendStartEvent extends BaseEvent {\n topic: string\n record: ProducerRecord\n messageCount: number\n}\n\nexport interface ProducerSendEndEvent extends BaseEvent {\n topic: string\n record: ProducerRecord\n metadata?: RecordMetadata[]\n durationMs: number\n error?: Error\n}\n\nexport interface ProducerSendErrorEvent extends BaseEvent {\n topic: string\n record: ProducerRecord\n durationMs: number\n error: Error\n}\n\n// Consumer Events\nexport interface ConsumerReceiveStartEvent extends BaseEvent {\n groupId?: string\n}\n\nexport interface ConsumerReceiveEndEvent extends BaseEvent {\n message: Message | null\n groupId?: string\n durationMs: number\n error?: Error\n}\n\nexport interface ConsumerProcessStartEvent extends BaseEvent {\n message: Message\n groupId?: string\n}\n\nexport interface ConsumerProcessEndEvent extends BaseEvent {\n message: Message\n groupId?: string\n durationMs: number\n error?: Error\n}\n\n// Batch Events\nexport interface BatchReceiveStartEvent extends BaseEvent {\n groupId?: string\n requestedSize: number\n timeoutMs: number\n}\n\nexport interface BatchReceiveEndEvent extends BaseEvent {\n messages: Message[]\n groupId?: string\n durationMs: number\n error?: Error\n}\n\nexport interface BatchProcessStartEvent extends BaseEvent {\n messages: Message[]\n groupId?: string\n}\n\nexport interface BatchProcessEndEvent extends BaseEvent {\n messages: Message[]\n groupId?: string\n durationMs: number\n error?: Error\n}\n\n// Union type for all events\nexport type KafkaEvent =\n | ProducerSendStartEvent\n | ProducerSendEndEvent\n | ConsumerReceiveStartEvent\n | ConsumerReceiveEndEvent\n | ConsumerProcessStartEvent\n | ConsumerProcessEndEvent\n | BatchReceiveStartEvent\n | BatchReceiveEndEvent\n | BatchProcessStartEvent\n | BatchProcessEndEvent\n\n// -----------------------------------------------------------------------------\n// Channel Instances (Typed)\n// -----------------------------------------------------------------------------\n\n/**\n * Typed channel wrapper for type-safe publish/subscribe\n */\nexport interface TypedChannel<TEvent> {\n readonly name: string\n readonly channel: Channel\n hasSubscribers: boolean\n publish: (event: TEvent) => void\n subscribe: (handler: (event: TEvent, name: string | symbol) => void) => void\n unsubscribe: (handler: (event: TEvent, name: string | symbol) => void) => void\n}\n\nfunction createTypedChannel<TEvent>(name: string): TypedChannel<TEvent> {\n const ch = channel(name)\n return {\n name,\n channel: ch,\n get hasSubscribers() {\n return ch.hasSubscribers\n },\n publish(event: TEvent) {\n ch.publish(event)\n },\n subscribe(handler: (event: TEvent, name: string | symbol) => void) {\n ch.subscribe(handler as (message: unknown, name: string | symbol) => void)\n },\n unsubscribe(handler: (event: TEvent, name: string | symbol) => void) {\n ch.unsubscribe(handler as (message: unknown, name: string | symbol) => void)\n },\n }\n}\n\n// Producer channels\nexport const producerSendStartChannel = createTypedChannel<ProducerSendStartEvent>(CHANNEL_NAMES.PRODUCER_SEND_START)\nexport const producerSendEndChannel = createTypedChannel<ProducerSendEndEvent>(CHANNEL_NAMES.PRODUCER_SEND_END)\nexport const producerSendErrorChannel = createTypedChannel<ProducerSendErrorEvent>(CHANNEL_NAMES.PRODUCER_SEND_ERROR)\n\n// Consumer channels\nexport const consumerReceiveStartChannel = createTypedChannel<ConsumerReceiveStartEvent>(\n CHANNEL_NAMES.CONSUMER_RECEIVE_START,\n)\nexport const consumerReceiveEndChannel = createTypedChannel<ConsumerReceiveEndEvent>(CHANNEL_NAMES.CONSUMER_RECEIVE_END)\nexport const consumerProcessStartChannel = createTypedChannel<ConsumerProcessStartEvent>(\n CHANNEL_NAMES.CONSUMER_PROCESS_START,\n)\nexport const consumerProcessEndChannel = createTypedChannel<ConsumerProcessEndEvent>(CHANNEL_NAMES.CONSUMER_PROCESS_END)\n\n// Batch channels\nexport const batchReceiveStartChannel = createTypedChannel<BatchReceiveStartEvent>(CHANNEL_NAMES.BATCH_RECEIVE_START)\nexport const batchReceiveEndChannel = createTypedChannel<BatchReceiveEndEvent>(CHANNEL_NAMES.BATCH_RECEIVE_END)\nexport const batchProcessStartChannel = createTypedChannel<BatchProcessStartEvent>(CHANNEL_NAMES.BATCH_PROCESS_START)\nexport const batchProcessEndChannel = createTypedChannel<BatchProcessEndEvent>(CHANNEL_NAMES.BATCH_PROCESS_END)\n\n// All channels exported as a single object for convenience\nexport const channels = {\n producerSendStart: producerSendStartChannel,\n producerSendEnd: producerSendEndChannel,\n producerSendError: producerSendErrorChannel,\n consumerReceiveStart: consumerReceiveStartChannel,\n consumerReceiveEnd: consumerReceiveEndChannel,\n consumerProcessStart: consumerProcessStartChannel,\n consumerProcessEnd: consumerProcessEndChannel,\n batchReceiveStart: batchReceiveStartChannel,\n batchReceiveEnd: batchReceiveEndChannel,\n batchProcessStart: batchProcessStartChannel,\n batchProcessEnd: batchProcessEndChannel,\n} as const\n"],"mappings":";;;;;;;;;;;;AAiBA,MAAa,gBAAgB;CAE3B,qBAAqB;CACrB,mBAAmB;CACnB,qBAAqB;CAGrB,wBAAwB;CACxB,sBAAsB;CACtB,wBAAwB;CACxB,sBAAsB;CAGtB,qBAAqB;CACrB,mBAAmB;CACnB,qBAAqB;CACrB,mBAAmB;AACrB;AAgIA,SAAS,mBAA2B,MAAoC;CACtE,MAAM,KAAK,QAAQ,IAAI;CACvB,OAAO;EACL;EACA,SAAS;EACT,IAAI,iBAAiB;GACnB,OAAO,GAAG;EACZ;EACA,QAAQ,OAAe;GACrB,GAAG,QAAQ,KAAK;EAClB;EACA,UAAU,SAAyD;GACjE,GAAG,UAAU,OAA4D;EAC3E;EACA,YAAY,SAAyD;GACnE,GAAG,YAAY,OAA4D;EAC7E;CACF;AACF;AAGA,MAAa,2BAA2B,mBAA2C,cAAc,mBAAmB;AACpH,MAAa,yBAAyB,mBAAyC,cAAc,iBAAiB;AAC9G,MAAa,2BAA2B,mBAA2C,cAAc,mBAAmB;AAGpH,MAAa,8BAA8B,mBACzC,cAAc,sBAChB;AACA,MAAa,4BAA4B,mBAA4C,cAAc,oBAAoB;AACvH,MAAa,8BAA8B,mBACzC,cAAc,sBAChB;AACA,MAAa,4BAA4B,mBAA4C,cAAc,oBAAoB;AAGvH,MAAa,2BAA2B,mBAA2C,cAAc,mBAAmB;AACpH,MAAa,yBAAyB,mBAAyC,cAAc,iBAAiB;AAC9G,MAAa,2BAA2B,mBAA2C,cAAc,mBAAmB;AACpH,MAAa,yBAAyB,mBAAyC,cAAc,iBAAiB;AAG9G,MAAa,WAAW;CACtB,mBAAmB;CACnB,iBAAiB;CACjB,mBAAmB;CACnB,sBAAsB;CACtB,oBAAoB;CACpB,sBAAsB;CACtB,oBAAoB;CACpB,mBAAmB;CACnB,iBAAiB;CACjB,mBAAmB;CACnB,iBAAiB;AACnB"}
@@ -1,3 +1,3 @@
1
- import { C as consumerProcessStartChannel, D as producerSendErrorChannel, E as producerSendEndChannel, O as producerSendStartChannel, S as consumerProcessEndChannel, T as consumerReceiveStartChannel, _ as batchProcessEndChannel, a as BatchReceiveStartEvent, b as batchReceiveStartChannel, c as ConsumerProcessEndEvent, d as ConsumerReceiveStartEvent, f as KafkaEvent, g as TypedChannel, h as ProducerSendStartEvent, i as BatchReceiveEndEvent, l as ConsumerProcessStartEvent, m as ProducerSendErrorEvent, n as BatchProcessEndEvent, o as CHANNEL_NAMES, p as ProducerSendEndEvent, r as BatchProcessStartEvent, s as ChannelName, t as BaseEvent, u as ConsumerReceiveEndEvent, v as batchProcessStartChannel, w as consumerReceiveEndChannel, x as channels, y as batchReceiveEndChannel } from "../channels-DpT3Ilp7.cjs";
2
- import { a as instrumentConsumerReceive, i as instrumentConsumerReadableStream, n as instrumentBatchReadableStream, o as instrumentProducerSend, r as instrumentBatchReceive, t as DiagnosticInstrumentationConfig } from "../instrumentation-CGxc_url.cjs";
1
+ import { C as consumerProcessStartChannel, D as producerSendErrorChannel, E as producerSendEndChannel, O as producerSendStartChannel, S as consumerProcessEndChannel, T as consumerReceiveStartChannel, _ as batchProcessEndChannel, a as BatchReceiveStartEvent, b as batchReceiveStartChannel, c as ConsumerProcessEndEvent, d as ConsumerReceiveStartEvent, f as KafkaEvent, g as TypedChannel, h as ProducerSendStartEvent, i as BatchReceiveEndEvent, l as ConsumerProcessStartEvent, m as ProducerSendErrorEvent, n as BatchProcessEndEvent, o as CHANNEL_NAMES, p as ProducerSendEndEvent, r as BatchProcessStartEvent, s as ChannelName, t as BaseEvent, u as ConsumerReceiveEndEvent, v as batchProcessStartChannel, w as consumerReceiveEndChannel, x as channels, y as batchReceiveEndChannel } from "../channels-D4ZtiwQz.cjs";
2
+ import { a as instrumentConsumerReceive, i as instrumentConsumerReadableStream, n as instrumentBatchReadableStream, o as instrumentProducerSend, r as instrumentBatchReceive, t as DiagnosticInstrumentationConfig } from "../instrumentation-Cd62Qkxq.cjs";
3
3
  export { type BaseEvent, type BatchProcessEndEvent, type BatchProcessStartEvent, type BatchReceiveEndEvent, type BatchReceiveStartEvent, CHANNEL_NAMES, type ChannelName, type ConsumerProcessEndEvent, type ConsumerProcessStartEvent, type ConsumerReceiveEndEvent, type ConsumerReceiveStartEvent, type DiagnosticInstrumentationConfig, type KafkaEvent, type ProducerSendEndEvent, type ProducerSendErrorEvent, type ProducerSendStartEvent, type TypedChannel, batchProcessEndChannel, batchProcessStartChannel, batchReceiveEndChannel, batchReceiveStartChannel, channels, consumerProcessEndChannel, consumerProcessStartChannel, consumerReceiveEndChannel, consumerReceiveStartChannel, instrumentBatchReadableStream, instrumentBatchReceive, instrumentConsumerReadableStream, instrumentConsumerReceive, instrumentProducerSend, producerSendEndChannel, producerSendErrorChannel, producerSendStartChannel };
@@ -1,3 +1,3 @@
1
- import { C as consumerProcessStartChannel, D as producerSendErrorChannel, E as producerSendEndChannel, O as producerSendStartChannel, S as consumerProcessEndChannel, T as consumerReceiveStartChannel, _ as batchProcessEndChannel, a as BatchReceiveStartEvent, b as batchReceiveStartChannel, c as ConsumerProcessEndEvent, d as ConsumerReceiveStartEvent, f as KafkaEvent, g as TypedChannel, h as ProducerSendStartEvent, i as BatchReceiveEndEvent, l as ConsumerProcessStartEvent, m as ProducerSendErrorEvent, n as BatchProcessEndEvent, o as CHANNEL_NAMES, p as ProducerSendEndEvent, r as BatchProcessStartEvent, s as ChannelName, t as BaseEvent, u as ConsumerReceiveEndEvent, v as batchProcessStartChannel, w as consumerReceiveEndChannel, x as channels, y as batchReceiveEndChannel } from "../channels-CtCeIPbt.js";
2
- import { a as instrumentConsumerReceive, i as instrumentConsumerReadableStream, n as instrumentBatchReadableStream, o as instrumentProducerSend, r as instrumentBatchReceive, t as DiagnosticInstrumentationConfig } from "../instrumentation-CGxc_url.js";
1
+ import { C as consumerProcessStartChannel, D as producerSendErrorChannel, E as producerSendEndChannel, O as producerSendStartChannel, S as consumerProcessEndChannel, T as consumerReceiveStartChannel, _ as batchProcessEndChannel, a as BatchReceiveStartEvent, b as batchReceiveStartChannel, c as ConsumerProcessEndEvent, d as ConsumerReceiveStartEvent, f as KafkaEvent, g as TypedChannel, h as ProducerSendStartEvent, i as BatchReceiveEndEvent, l as ConsumerProcessStartEvent, m as ProducerSendErrorEvent, n as BatchProcessEndEvent, o as CHANNEL_NAMES, p as ProducerSendEndEvent, r as BatchProcessStartEvent, s as ChannelName, t as BaseEvent, u as ConsumerReceiveEndEvent, v as batchProcessStartChannel, w as consumerReceiveEndChannel, x as channels, y as batchReceiveEndChannel } from "../channels-CCvEbkFg.js";
2
+ import { a as instrumentConsumerReceive, i as instrumentConsumerReadableStream, n as instrumentBatchReadableStream, o as instrumentProducerSend, r as instrumentBatchReceive, t as DiagnosticInstrumentationConfig } from "../instrumentation-Cd62Qkxq.js";
3
3
  export { type BaseEvent, type BatchProcessEndEvent, type BatchProcessStartEvent, type BatchReceiveEndEvent, type BatchReceiveStartEvent, CHANNEL_NAMES, type ChannelName, type ConsumerProcessEndEvent, type ConsumerProcessStartEvent, type ConsumerReceiveEndEvent, type ConsumerReceiveStartEvent, type DiagnosticInstrumentationConfig, type KafkaEvent, type ProducerSendEndEvent, type ProducerSendErrorEvent, type ProducerSendStartEvent, type TypedChannel, batchProcessEndChannel, batchProcessStartChannel, batchReceiveEndChannel, batchReceiveStartChannel, channels, consumerProcessEndChannel, consumerProcessStartChannel, consumerReceiveEndChannel, consumerReceiveStartChannel, instrumentBatchReadableStream, instrumentBatchReceive, instrumentConsumerReadableStream, instrumentConsumerReceive, instrumentProducerSend, producerSendEndChannel, producerSendErrorChannel, producerSendStartChannel };
@@ -1 +1 @@
1
- {"version":3,"file":"instrumentation.cjs","names":["producerSendStartChannel","producerSendEndChannel","producerSendErrorChannel","consumerReceiveStartChannel","consumerReceiveEndChannel","consumerProcessStartChannel","consumerProcessEndChannel","batchReceiveStartChannel","batchReceiveEndChannel","batchProcessStartChannel","batchProcessEndChannel"],"sources":["../../js-src/diagnostics/instrumentation.ts"],"sourcesContent":["/**\n * Diagnostic Channel-based Kafka Instrumentation\n *\n * This module provides instrumentation that publishes events to Node.js\n * diagnostic channels instead of directly calling OpenTelemetry APIs.\n * Observability tools can subscribe to these channels to receive events.\n */\nimport type { KafkaConsumer, KafkaProducer, Message, ProducerRecord, RecordMetadata } from '../../js-binding.js'\nimport {\n batchProcessEndChannel,\n type BatchProcessEndEvent,\n batchProcessStartChannel,\n type BatchProcessStartEvent,\n batchReceiveEndChannel,\n type BatchReceiveEndEvent,\n batchReceiveStartChannel,\n type BatchReceiveStartEvent,\n consumerProcessEndChannel,\n type ConsumerProcessEndEvent,\n consumerProcessStartChannel,\n type ConsumerProcessStartEvent,\n consumerReceiveEndChannel,\n type ConsumerReceiveEndEvent,\n consumerReceiveStartChannel,\n type ConsumerReceiveStartEvent,\n producerSendEndChannel,\n type ProducerSendEndEvent,\n producerSendErrorChannel,\n type ProducerSendErrorEvent,\n producerSendStartChannel,\n type ProducerSendStartEvent,\n} from './channels.js'\n\n/**\n * Configuration for diagnostic channel instrumentation\n */\nexport interface DiagnosticInstrumentationConfig {\n /** Client ID for attribution */\n clientId?: string\n /** Server address for attribution */\n serverAddress?: string\n /** Server port for attribution */\n serverPort?: number\n}\n\n/**\n * Instruments a producer send method to publish diagnostic events\n */\nexport function instrumentProducerSend(\n originalSend: (record: ProducerRecord) => Promise<RecordMetadata[]>,\n config: DiagnosticInstrumentationConfig = {},\n): (this: KafkaProducer, record: ProducerRecord) => Promise<RecordMetadata[]> {\n const { clientId, serverAddress, serverPort } = config\n\n return async function instrumentedSend(this: KafkaProducer, record: ProducerRecord) {\n // Fast path: if no subscribers, just call original\n if (\n !producerSendStartChannel.hasSubscribers &&\n !producerSendEndChannel.hasSubscribers &&\n !producerSendErrorChannel.hasSubscribers\n ) {\n return originalSend.call(this, record)\n }\n\n const timestamp = Date.now()\n const context: Record<PropertyKey, unknown> = {}\n\n const startEvent: ProducerSendStartEvent = {\n timestamp,\n topic: record.topic,\n record,\n messageCount: record.messages?.length ?? 0,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n\n // Publish start event - subscribers can inject trace headers here\n if (producerSendStartChannel.hasSubscribers) {\n producerSendStartChannel.publish(startEvent)\n }\n\n let sendError: Error | undefined\n let metadata: RecordMetadata[] | undefined\n\n try {\n metadata = await originalSend.call(this, record)\n return metadata\n } catch (error) {\n sendError = error instanceof Error ? error : new Error(String(error))\n throw error\n } finally {\n const durationMs = Date.now() - timestamp\n\n if (sendError && producerSendErrorChannel.hasSubscribers) {\n const errorEvent: ProducerSendErrorEvent = {\n timestamp: Date.now(),\n topic: record.topic,\n record,\n durationMs,\n error: sendError,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n producerSendErrorChannel.publish(errorEvent)\n }\n\n // Publish end event\n if (producerSendEndChannel.hasSubscribers) {\n const endEvent: ProducerSendEndEvent = {\n timestamp: Date.now(),\n topic: record.topic,\n record,\n metadata,\n durationMs,\n error: sendError,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n producerSendEndChannel.publish(endEvent)\n }\n }\n }\n}\n\n/**\n * Instruments a consumer receive method to publish diagnostic events\n */\nexport function instrumentConsumerReceive(\n originalReceive: () => Promise<Message | null>,\n groupId?: string,\n config: DiagnosticInstrumentationConfig = {},\n): (this: KafkaConsumer) => Promise<Message | null> {\n const { clientId, serverAddress, serverPort } = config\n\n return async function instrumentedReceive(this: KafkaConsumer) {\n // Fast path: if no subscribers at all, just call original\n const hasReceiveSubscribers = consumerReceiveStartChannel.hasSubscribers || consumerReceiveEndChannel.hasSubscribers\n const hasProcessSubscribers = consumerProcessStartChannel.hasSubscribers || consumerProcessEndChannel.hasSubscribers\n\n if (!hasReceiveSubscribers && !hasProcessSubscribers) {\n return originalReceive.call(this)\n }\n\n const timestamp = Date.now()\n const context: Record<PropertyKey, unknown> = {}\n\n // Publish receive start\n if (consumerReceiveStartChannel.hasSubscribers) {\n const startEvent: ConsumerReceiveStartEvent = {\n timestamp,\n groupId,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n consumerReceiveStartChannel.publish(startEvent)\n }\n\n let receiveError: Error | undefined\n let message: Message | null = null\n\n try {\n message = await originalReceive.call(this)\n return message\n } catch (error) {\n receiveError = error instanceof Error ? error : new Error(String(error))\n throw error\n } finally {\n // Publish receive end\n if (consumerReceiveEndChannel.hasSubscribers) {\n const endEvent: ConsumerReceiveEndEvent = {\n timestamp: Date.now(),\n message,\n groupId,\n durationMs: Date.now() - timestamp,\n error: receiveError,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n consumerReceiveEndChannel.publish(endEvent)\n }\n\n // If message exists and process channels have subscribers, set up process tracking\n if (message && hasProcessSubscribers) {\n const processingMessage = message\n const processContext: Record<PropertyKey, unknown> = {}\n const processStartTime = Date.now()\n\n // Publish process start\n if (consumerProcessStartChannel.hasSubscribers) {\n const processStartEvent: ConsumerProcessStartEvent = {\n timestamp: processStartTime,\n message,\n groupId,\n clientId,\n serverAddress,\n serverPort,\n context: processContext,\n }\n consumerProcessStartChannel.publish(processStartEvent)\n }\n\n // Attach endSpan helper to message for user to call when processing completes\n let ended = false\n const endProcessing = (processError?: Error) => {\n if (ended) {\n return\n }\n ended = true\n\n if (consumerProcessEndChannel.hasSubscribers) {\n const processEndEvent: ConsumerProcessEndEvent = {\n timestamp: Date.now(),\n message: processingMessage,\n groupId,\n durationMs: Date.now() - processStartTime,\n error: processError,\n clientId,\n serverAddress,\n serverPort,\n context: processContext,\n }\n consumerProcessEndChannel.publish(processEndEvent)\n }\n }\n\n // Add endSpan to message\n Object.defineProperty(message, 'endSpan', {\n value: endProcessing,\n writable: false,\n configurable: true,\n enumerable: false,\n })\n }\n }\n }\n}\n\n/**\n * Instruments a consumer batch receive method to publish diagnostic events\n */\nexport function instrumentBatchReceive(\n originalBatchReceive: (size: number, timeoutMs: number) => Promise<Message[]>,\n groupId?: string,\n config: DiagnosticInstrumentationConfig = {},\n): (this: KafkaConsumer, size: number, timeoutMs: number) => Promise<Message[]> {\n const { clientId, serverAddress, serverPort } = config\n\n return async function instrumentedBatchReceive(this: KafkaConsumer, size: number, timeoutMs: number) {\n // Fast path: if no subscribers, just call original\n const hasReceiveSubscribers = batchReceiveStartChannel.hasSubscribers || batchReceiveEndChannel.hasSubscribers\n const hasProcessSubscribers = batchProcessStartChannel.hasSubscribers || batchProcessEndChannel.hasSubscribers\n\n if (!hasReceiveSubscribers && !hasProcessSubscribers) {\n return originalBatchReceive.call(this, size, timeoutMs)\n }\n\n const timestamp = Date.now()\n const context: Record<PropertyKey, unknown> = {}\n\n // Publish batch receive start\n if (batchReceiveStartChannel.hasSubscribers) {\n const startEvent: BatchReceiveStartEvent = {\n timestamp,\n groupId,\n requestedSize: size,\n timeoutMs,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n batchReceiveStartChannel.publish(startEvent)\n }\n\n let batchError: Error | undefined\n let messages: Message[] = []\n\n try {\n messages = await originalBatchReceive.call(this, size, timeoutMs)\n return messages\n } catch (error) {\n batchError = error instanceof Error ? error : new Error(String(error))\n throw error\n } finally {\n // Publish batch receive end\n if (batchReceiveEndChannel.hasSubscribers) {\n const endEvent: BatchReceiveEndEvent = {\n timestamp: Date.now(),\n messages,\n groupId,\n durationMs: Date.now() - timestamp,\n error: batchError,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n batchReceiveEndChannel.publish(endEvent)\n }\n\n // If messages exist and process channels have subscribers, set up batch process tracking\n if (messages.length > 0 && hasProcessSubscribers) {\n const processContext: Record<PropertyKey, unknown> = {}\n const processStartTime = Date.now()\n let firstProcessError: Error | undefined\n let remainingMessages = messages.length\n\n // Publish batch process start\n if (batchProcessStartChannel.hasSubscribers) {\n // Surface headers from the first message for downstream context extraction\n if (messages[0]?.headers) {\n processContext.parentHeaders = messages[0].headers\n }\n\n const processStartEvent: BatchProcessStartEvent = {\n timestamp: processStartTime,\n messages,\n groupId,\n clientId,\n serverAddress,\n serverPort,\n context: processContext,\n }\n batchProcessStartChannel.publish(processStartEvent)\n }\n\n // Attach endSpan helper to batch array\n let ended = false\n const endBatchProcessing = (processError?: Error) => {\n if (ended) {\n return\n }\n ended = true\n\n if (!firstProcessError && processError) {\n firstProcessError = processError\n }\n\n if (batchProcessEndChannel.hasSubscribers) {\n const processEndEvent: BatchProcessEndEvent = {\n timestamp: Date.now(),\n messages,\n groupId,\n durationMs: Date.now() - processStartTime,\n error: processError ?? firstProcessError,\n clientId,\n serverAddress,\n serverPort,\n context: processContext,\n }\n batchProcessEndChannel.publish(processEndEvent)\n }\n }\n\n const makeMessageEnder = () => {\n let messageEnded = false\n return (processError?: Error) => {\n if (messageEnded || ended) {\n return\n }\n messageEnded = true\n if (!firstProcessError && processError) {\n firstProcessError = processError\n }\n remainingMessages -= 1\n if (remainingMessages <= 0) {\n endBatchProcessing(firstProcessError)\n }\n }\n }\n\n Object.defineProperty(messages, 'endSpan', {\n value: endBatchProcessing,\n writable: false,\n configurable: true,\n enumerable: false,\n })\n\n for (const message of messages) {\n Object.defineProperty(message, 'endSpan', {\n value: makeMessageEnder(),\n writable: false,\n configurable: true,\n enumerable: false,\n })\n }\n }\n }\n }\n}\n\n/**\n * Instruments a ReadableStream of single messages with consumer diagnostic events.\n */\nexport function instrumentConsumerReadableStream<StreamMessage extends Message>(\n originalStream: ReadableStream<StreamMessage>,\n groupId?: string,\n config: DiagnosticInstrumentationConfig = {},\n): ReadableStream<StreamMessage> {\n const reader = originalStream.getReader()\n let done = false\n\n const instrumentedReceive = instrumentConsumerReceive(\n async () => {\n if (done) {\n return null\n }\n\n const chunk = await reader.read()\n if (chunk.done) {\n done = true\n return null\n }\n\n return chunk.value ?? null\n },\n groupId,\n config,\n ).bind({} as KafkaConsumer) as () => Promise<StreamMessage | null>\n\n return new ReadableStream<StreamMessage>({\n async pull(controller) {\n const message = await instrumentedReceive()\n if (!message) {\n controller.close()\n return\n }\n\n controller.enqueue(message)\n },\n async cancel(reason) {\n done = true\n await reader.cancel(reason)\n },\n })\n}\n\n/**\n * Instruments a ReadableStream of message batches with batch diagnostic events.\n */\nexport function instrumentBatchReadableStream<StreamBatch extends Message[]>(\n originalStream: ReadableStream<StreamBatch>,\n groupId: string | undefined,\n size: number,\n timeoutMs: number,\n config: DiagnosticInstrumentationConfig = {},\n): ReadableStream<StreamBatch> {\n const reader = originalStream.getReader()\n let done = false\n\n const instrumentedBatchReceive = instrumentBatchReceive(\n async () => {\n if (done) {\n return []\n }\n\n const chunk = await reader.read()\n if (chunk.done) {\n done = true\n return []\n }\n\n return chunk.value ?? []\n },\n groupId,\n config,\n ).bind({} as KafkaConsumer) as (size: number, timeoutMs: number) => Promise<StreamBatch>\n\n return new ReadableStream<StreamBatch>({\n async pull(controller) {\n const messages = await instrumentedBatchReceive(size, timeoutMs)\n if (done) {\n controller.close()\n return\n }\n\n if (messages.length > 0) {\n controller.enqueue(messages)\n }\n },\n async cancel(reason) {\n done = true\n await reader.cancel(reason)\n },\n })\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"instrumentation.cjs","names":["producerSendStartChannel","producerSendEndChannel","producerSendErrorChannel","consumerReceiveStartChannel","consumerReceiveEndChannel","consumerProcessStartChannel","consumerProcessEndChannel","batchReceiveStartChannel","batchReceiveEndChannel","batchProcessStartChannel","batchProcessEndChannel"],"sources":["../../js-src/diagnostics/instrumentation.ts"],"sourcesContent":["/**\n * Diagnostic Channel-based Kafka Instrumentation\n *\n * This module provides instrumentation that publishes events to Node.js\n * diagnostic channels instead of directly calling OpenTelemetry APIs.\n * Observability tools can subscribe to these channels to receive events.\n */\nimport type { KafkaConsumer, KafkaProducer, Message, ProducerRecord, RecordMetadata } from '../../js-binding.js'\nimport {\n batchProcessEndChannel,\n type BatchProcessEndEvent,\n batchProcessStartChannel,\n type BatchProcessStartEvent,\n batchReceiveEndChannel,\n type BatchReceiveEndEvent,\n batchReceiveStartChannel,\n type BatchReceiveStartEvent,\n consumerProcessEndChannel,\n type ConsumerProcessEndEvent,\n consumerProcessStartChannel,\n type ConsumerProcessStartEvent,\n consumerReceiveEndChannel,\n type ConsumerReceiveEndEvent,\n consumerReceiveStartChannel,\n type ConsumerReceiveStartEvent,\n producerSendEndChannel,\n type ProducerSendEndEvent,\n producerSendErrorChannel,\n type ProducerSendErrorEvent,\n producerSendStartChannel,\n type ProducerSendStartEvent,\n} from './channels.js'\n\n/**\n * Configuration for diagnostic channel instrumentation\n */\nexport interface DiagnosticInstrumentationConfig {\n /** Client ID for attribution */\n clientId?: string\n /** Server address for attribution */\n serverAddress?: string\n /** Server port for attribution */\n serverPort?: number\n}\n\n/**\n * Instruments a producer send method to publish diagnostic events\n */\nexport function instrumentProducerSend(\n originalSend: (record: ProducerRecord) => Promise<RecordMetadata[]>,\n config: DiagnosticInstrumentationConfig = {},\n): (this: KafkaProducer, record: ProducerRecord) => Promise<RecordMetadata[]> {\n const { clientId, serverAddress, serverPort } = config\n\n return async function instrumentedSend(this: KafkaProducer, record: ProducerRecord) {\n // Fast path: if no subscribers, just call original\n if (\n !producerSendStartChannel.hasSubscribers &&\n !producerSendEndChannel.hasSubscribers &&\n !producerSendErrorChannel.hasSubscribers\n ) {\n return originalSend.call(this, record)\n }\n\n const timestamp = Date.now()\n const context: Record<PropertyKey, unknown> = {}\n\n const startEvent: ProducerSendStartEvent = {\n timestamp,\n topic: record.topic,\n record,\n messageCount: record.messages?.length ?? 0,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n\n // Publish start event - subscribers can inject trace headers here\n if (producerSendStartChannel.hasSubscribers) {\n producerSendStartChannel.publish(startEvent)\n }\n\n let sendError: Error | undefined\n let metadata: RecordMetadata[] | undefined\n\n try {\n metadata = await originalSend.call(this, record)\n return metadata\n } catch (error) {\n sendError = error instanceof Error ? error : new Error(String(error))\n throw error\n } finally {\n const durationMs = Date.now() - timestamp\n\n if (sendError && producerSendErrorChannel.hasSubscribers) {\n const errorEvent: ProducerSendErrorEvent = {\n timestamp: Date.now(),\n topic: record.topic,\n record,\n durationMs,\n error: sendError,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n producerSendErrorChannel.publish(errorEvent)\n }\n\n // Publish end event\n if (producerSendEndChannel.hasSubscribers) {\n const endEvent: ProducerSendEndEvent = {\n timestamp: Date.now(),\n topic: record.topic,\n record,\n metadata,\n durationMs,\n error: sendError,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n producerSendEndChannel.publish(endEvent)\n }\n }\n }\n}\n\n/**\n * Instruments a consumer receive method to publish diagnostic events\n */\nexport function instrumentConsumerReceive(\n originalReceive: () => Promise<Message | null>,\n groupId?: string,\n config: DiagnosticInstrumentationConfig = {},\n): (this: KafkaConsumer) => Promise<Message | null> {\n const { clientId, serverAddress, serverPort } = config\n\n return async function instrumentedReceive(this: KafkaConsumer) {\n // Fast path: if no subscribers at all, just call original\n const hasReceiveSubscribers = consumerReceiveStartChannel.hasSubscribers || consumerReceiveEndChannel.hasSubscribers\n const hasProcessSubscribers = consumerProcessStartChannel.hasSubscribers || consumerProcessEndChannel.hasSubscribers\n\n if (!hasReceiveSubscribers && !hasProcessSubscribers) {\n return originalReceive.call(this)\n }\n\n const timestamp = Date.now()\n const context: Record<PropertyKey, unknown> = {}\n\n // Publish receive start\n if (consumerReceiveStartChannel.hasSubscribers) {\n const startEvent: ConsumerReceiveStartEvent = {\n timestamp,\n groupId,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n consumerReceiveStartChannel.publish(startEvent)\n }\n\n let receiveError: Error | undefined\n let message: Message | null = null\n\n try {\n message = await originalReceive.call(this)\n return message\n } catch (error) {\n receiveError = error instanceof Error ? error : new Error(String(error))\n throw error\n } finally {\n // Publish receive end\n if (consumerReceiveEndChannel.hasSubscribers) {\n const endEvent: ConsumerReceiveEndEvent = {\n timestamp: Date.now(),\n message,\n groupId,\n durationMs: Date.now() - timestamp,\n error: receiveError,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n consumerReceiveEndChannel.publish(endEvent)\n }\n\n // If message exists and process channels have subscribers, set up process tracking\n if (message && hasProcessSubscribers) {\n const processingMessage = message\n const processContext: Record<PropertyKey, unknown> = {}\n const processStartTime = Date.now()\n\n // Publish process start\n if (consumerProcessStartChannel.hasSubscribers) {\n const processStartEvent: ConsumerProcessStartEvent = {\n timestamp: processStartTime,\n message,\n groupId,\n clientId,\n serverAddress,\n serverPort,\n context: processContext,\n }\n consumerProcessStartChannel.publish(processStartEvent)\n }\n\n // Attach endSpan helper to message for user to call when processing completes\n let ended = false\n const endProcessing = (processError?: Error) => {\n if (ended) {\n return\n }\n ended = true\n\n if (consumerProcessEndChannel.hasSubscribers) {\n const processEndEvent: ConsumerProcessEndEvent = {\n timestamp: Date.now(),\n message: processingMessage,\n groupId,\n durationMs: Date.now() - processStartTime,\n error: processError,\n clientId,\n serverAddress,\n serverPort,\n context: processContext,\n }\n consumerProcessEndChannel.publish(processEndEvent)\n }\n }\n\n // Add endSpan to message\n Object.defineProperty(message, 'endSpan', {\n value: endProcessing,\n writable: false,\n configurable: true,\n enumerable: false,\n })\n }\n }\n }\n}\n\n/**\n * Instruments a consumer batch receive method to publish diagnostic events\n */\nexport function instrumentBatchReceive(\n originalBatchReceive: (size: number, timeoutMs: number) => Promise<Message[]>,\n groupId?: string,\n config: DiagnosticInstrumentationConfig = {},\n): (this: KafkaConsumer, size: number, timeoutMs: number) => Promise<Message[]> {\n const { clientId, serverAddress, serverPort } = config\n\n return async function instrumentedBatchReceive(this: KafkaConsumer, size: number, timeoutMs: number) {\n // Fast path: if no subscribers, just call original\n const hasReceiveSubscribers = batchReceiveStartChannel.hasSubscribers || batchReceiveEndChannel.hasSubscribers\n const hasProcessSubscribers = batchProcessStartChannel.hasSubscribers || batchProcessEndChannel.hasSubscribers\n\n if (!hasReceiveSubscribers && !hasProcessSubscribers) {\n return originalBatchReceive.call(this, size, timeoutMs)\n }\n\n const timestamp = Date.now()\n const context: Record<PropertyKey, unknown> = {}\n\n // Publish batch receive start\n if (batchReceiveStartChannel.hasSubscribers) {\n const startEvent: BatchReceiveStartEvent = {\n timestamp,\n groupId,\n requestedSize: size,\n timeoutMs,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n batchReceiveStartChannel.publish(startEvent)\n }\n\n let batchError: Error | undefined\n let messages: Message[] = []\n\n try {\n messages = await originalBatchReceive.call(this, size, timeoutMs)\n return messages\n } catch (error) {\n batchError = error instanceof Error ? error : new Error(String(error))\n throw error\n } finally {\n // Publish batch receive end\n if (batchReceiveEndChannel.hasSubscribers) {\n const endEvent: BatchReceiveEndEvent = {\n timestamp: Date.now(),\n messages,\n groupId,\n durationMs: Date.now() - timestamp,\n error: batchError,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n batchReceiveEndChannel.publish(endEvent)\n }\n\n // If messages exist and process channels have subscribers, set up batch process tracking\n if (messages.length > 0 && hasProcessSubscribers) {\n const processContext: Record<PropertyKey, unknown> = {}\n const processStartTime = Date.now()\n let firstProcessError: Error | undefined\n let remainingMessages = messages.length\n\n // Publish batch process start\n if (batchProcessStartChannel.hasSubscribers) {\n // Surface headers from the first message for downstream context extraction\n if (messages[0]?.headers) {\n processContext.parentHeaders = messages[0].headers\n }\n\n const processStartEvent: BatchProcessStartEvent = {\n timestamp: processStartTime,\n messages,\n groupId,\n clientId,\n serverAddress,\n serverPort,\n context: processContext,\n }\n batchProcessStartChannel.publish(processStartEvent)\n }\n\n // Attach endSpan helper to batch array\n let ended = false\n const endBatchProcessing = (processError?: Error) => {\n if (ended) {\n return\n }\n ended = true\n\n if (!firstProcessError && processError) {\n firstProcessError = processError\n }\n\n if (batchProcessEndChannel.hasSubscribers) {\n const processEndEvent: BatchProcessEndEvent = {\n timestamp: Date.now(),\n messages,\n groupId,\n durationMs: Date.now() - processStartTime,\n error: processError ?? firstProcessError,\n clientId,\n serverAddress,\n serverPort,\n context: processContext,\n }\n batchProcessEndChannel.publish(processEndEvent)\n }\n }\n\n const makeMessageEnder = () => {\n let messageEnded = false\n return (processError?: Error) => {\n if (messageEnded || ended) {\n return\n }\n messageEnded = true\n if (!firstProcessError && processError) {\n firstProcessError = processError\n }\n remainingMessages -= 1\n if (remainingMessages <= 0) {\n endBatchProcessing(firstProcessError)\n }\n }\n }\n\n Object.defineProperty(messages, 'endSpan', {\n value: endBatchProcessing,\n writable: false,\n configurable: true,\n enumerable: false,\n })\n\n for (const message of messages) {\n Object.defineProperty(message, 'endSpan', {\n value: makeMessageEnder(),\n writable: false,\n configurable: true,\n enumerable: false,\n })\n }\n }\n }\n }\n}\n\n/**\n * Instruments a ReadableStream of single messages with consumer diagnostic events.\n */\nexport function instrumentConsumerReadableStream<StreamMessage extends Message>(\n originalStream: ReadableStream<StreamMessage>,\n groupId?: string,\n config: DiagnosticInstrumentationConfig = {},\n): ReadableStream<StreamMessage> {\n const reader = originalStream.getReader()\n let done = false\n\n const instrumentedReceive = instrumentConsumerReceive(\n async () => {\n if (done) {\n return null\n }\n\n const chunk = await reader.read()\n if (chunk.done) {\n done = true\n return null\n }\n\n return chunk.value ?? null\n },\n groupId,\n config,\n ).bind({} as KafkaConsumer) as () => Promise<StreamMessage | null>\n\n return new ReadableStream<StreamMessage>({\n async pull(controller) {\n const message = await instrumentedReceive()\n if (!message) {\n controller.close()\n return\n }\n\n controller.enqueue(message)\n },\n async cancel(reason) {\n done = true\n await reader.cancel(reason)\n },\n })\n}\n\n/**\n * Instruments a ReadableStream of message batches with batch diagnostic events.\n */\nexport function instrumentBatchReadableStream<StreamBatch extends Message[]>(\n originalStream: ReadableStream<StreamBatch>,\n groupId: string | undefined,\n size: number,\n timeoutMs: number,\n config: DiagnosticInstrumentationConfig = {},\n): ReadableStream<StreamBatch> {\n const reader = originalStream.getReader()\n let done = false\n\n const instrumentedBatchReceive = instrumentBatchReceive(\n async () => {\n if (done) {\n return []\n }\n\n const chunk = await reader.read()\n if (chunk.done) {\n done = true\n return []\n }\n\n return chunk.value ?? []\n },\n groupId,\n config,\n ).bind({} as KafkaConsumer) as (size: number, timeoutMs: number) => Promise<StreamBatch>\n\n return new ReadableStream<StreamBatch>({\n async pull(controller) {\n const messages = await instrumentedBatchReceive(size, timeoutMs)\n if (done) {\n controller.close()\n return\n }\n\n if (messages.length > 0) {\n controller.enqueue(messages)\n }\n },\n async cancel(reason) {\n done = true\n await reader.cancel(reason)\n },\n })\n}\n"],"mappings":";;;;;;AAgDA,SAAgB,uBACd,cACA,SAA0C,CAAC,GACiC;CAC5E,MAAM,EAAE,UAAU,eAAe,eAAe;CAEhD,OAAO,eAAe,iBAAsC,QAAwB;EAElF,IACE,CAACA,6BAAAA,yBAAyB,kBAC1B,CAACC,6BAAAA,uBAAuB,kBACxB,CAACC,6BAAAA,yBAAyB,gBAE1B,OAAO,aAAa,KAAK,MAAM,MAAM;EAGvC,MAAM,YAAY,KAAK,IAAI;EAC3B,MAAM,UAAwC,CAAC;EAE/C,MAAM,aAAqC;GACzC;GACA,OAAO,OAAO;GACd;GACA,cAAc,OAAO,UAAU,UAAU;GACzC;GACA;GACA;GACA;EACF;EAGA,IAAIF,6BAAAA,yBAAyB,gBAC3B,6BAAA,yBAAyB,QAAQ,UAAU;EAG7C,IAAI;EACJ,IAAI;EAEJ,IAAI;GACF,WAAW,MAAM,aAAa,KAAK,MAAM,MAAM;GAC/C,OAAO;EACT,SAAS,OAAO;GACd,YAAY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;GACpE,MAAM;EACR,UAAU;GACR,MAAM,aAAa,KAAK,IAAI,IAAI;GAEhC,IAAI,aAAaE,6BAAAA,yBAAyB,gBAAgB;IACxD,MAAM,aAAqC;KACzC,WAAW,KAAK,IAAI;KACpB,OAAO,OAAO;KACd;KACA;KACA,OAAO;KACP;KACA;KACA;KACA;IACF;IACA,6BAAA,yBAAyB,QAAQ,UAAU;GAC7C;GAGA,IAAID,6BAAAA,uBAAuB,gBAAgB;IACzC,MAAM,WAAiC;KACrC,WAAW,KAAK,IAAI;KACpB,OAAO,OAAO;KACd;KACA;KACA;KACA,OAAO;KACP;KACA;KACA;KACA;IACF;IACA,6BAAA,uBAAuB,QAAQ,QAAQ;GACzC;EACF;CACF;AACF;;;;AAKA,SAAgB,0BACd,iBACA,SACA,SAA0C,CAAC,GACO;CAClD,MAAM,EAAE,UAAU,eAAe,eAAe;CAEhD,OAAO,eAAe,sBAAyC;EAE7D,MAAM,wBAAwBE,6BAAAA,4BAA4B,kBAAkBC,6BAAAA,0BAA0B;EACtG,MAAM,wBAAwBC,6BAAAA,4BAA4B,kBAAkBC,6BAAAA,0BAA0B;EAEtG,IAAI,CAAC,yBAAyB,CAAC,uBAC7B,OAAO,gBAAgB,KAAK,IAAI;EAGlC,MAAM,YAAY,KAAK,IAAI;EAC3B,MAAM,UAAwC,CAAC;EAG/C,IAAIH,6BAAAA,4BAA4B,gBAAgB;GAC9C,MAAM,aAAwC;IAC5C;IACA;IACA;IACA;IACA;IACA;GACF;GACA,6BAAA,4BAA4B,QAAQ,UAAU;EAChD;EAEA,IAAI;EACJ,IAAI,UAA0B;EAE9B,IAAI;GACF,UAAU,MAAM,gBAAgB,KAAK,IAAI;GACzC,OAAO;EACT,SAAS,OAAO;GACd,eAAe,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;GACvE,MAAM;EACR,UAAU;GAER,IAAIC,6BAAAA,0BAA0B,gBAAgB;IAC5C,MAAM,WAAoC;KACxC,WAAW,KAAK,IAAI;KACpB;KACA;KACA,YAAY,KAAK,IAAI,IAAI;KACzB,OAAO;KACP;KACA;KACA;KACA;IACF;IACA,6BAAA,0BAA0B,QAAQ,QAAQ;GAC5C;GAGA,IAAI,WAAW,uBAAuB;IACpC,MAAM,oBAAoB;IAC1B,MAAM,iBAA+C,CAAC;IACtD,MAAM,mBAAmB,KAAK,IAAI;IAGlC,IAAIC,6BAAAA,4BAA4B,gBAAgB;KAC9C,MAAM,oBAA+C;MACnD,WAAW;MACX;MACA;MACA;MACA;MACA;MACA,SAAS;KACX;KACA,6BAAA,4BAA4B,QAAQ,iBAAiB;IACvD;IAGA,IAAI,QAAQ;IACZ,MAAM,iBAAiB,iBAAyB;KAC9C,IAAI,OACF;KAEF,QAAQ;KAER,IAAIC,6BAAAA,0BAA0B,gBAAgB;MAC5C,MAAM,kBAA2C;OAC/C,WAAW,KAAK,IAAI;OACpB,SAAS;OACT;OACA,YAAY,KAAK,IAAI,IAAI;OACzB,OAAO;OACP;OACA;OACA;OACA,SAAS;MACX;MACA,6BAAA,0BAA0B,QAAQ,eAAe;KACnD;IACF;IAGA,OAAO,eAAe,SAAS,WAAW;KACxC,OAAO;KACP,UAAU;KACV,cAAc;KACd,YAAY;IACd,CAAC;GACH;EACF;CACF;AACF;;;;AAKA,SAAgB,uBACd,sBACA,SACA,SAA0C,CAAC,GACmC;CAC9E,MAAM,EAAE,UAAU,eAAe,eAAe;CAEhD,OAAO,eAAe,yBAA8C,MAAc,WAAmB;EAEnG,MAAM,wBAAwBC,6BAAAA,yBAAyB,kBAAkBC,6BAAAA,uBAAuB;EAChG,MAAM,wBAAwBC,6BAAAA,yBAAyB,kBAAkBC,6BAAAA,uBAAuB;EAEhG,IAAI,CAAC,yBAAyB,CAAC,uBAC7B,OAAO,qBAAqB,KAAK,MAAM,MAAM,SAAS;EAGxD,MAAM,YAAY,KAAK,IAAI;EAC3B,MAAM,UAAwC,CAAC;EAG/C,IAAIH,6BAAAA,yBAAyB,gBAAgB;GAC3C,MAAM,aAAqC;IACzC;IACA;IACA,eAAe;IACf;IACA;IACA;IACA;IACA;GACF;GACA,6BAAA,yBAAyB,QAAQ,UAAU;EAC7C;EAEA,IAAI;EACJ,IAAI,WAAsB,CAAC;EAE3B,IAAI;GACF,WAAW,MAAM,qBAAqB,KAAK,MAAM,MAAM,SAAS;GAChE,OAAO;EACT,SAAS,OAAO;GACd,aAAa,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;GACrE,MAAM;EACR,UAAU;GAER,IAAIC,6BAAAA,uBAAuB,gBAAgB;IACzC,MAAM,WAAiC;KACrC,WAAW,KAAK,IAAI;KACpB;KACA;KACA,YAAY,KAAK,IAAI,IAAI;KACzB,OAAO;KACP;KACA;KACA;KACA;IACF;IACA,6BAAA,uBAAuB,QAAQ,QAAQ;GACzC;GAGA,IAAI,SAAS,SAAS,KAAK,uBAAuB;IAChD,MAAM,iBAA+C,CAAC;IACtD,MAAM,mBAAmB,KAAK,IAAI;IAClC,IAAI;IACJ,IAAI,oBAAoB,SAAS;IAGjC,IAAIC,6BAAAA,yBAAyB,gBAAgB;KAE3C,IAAI,SAAS,EAAE,EAAE,SACf,eAAe,gBAAgB,SAAS,EAAE,CAAC;KAG7C,MAAM,oBAA4C;MAChD,WAAW;MACX;MACA;MACA;MACA;MACA;MACA,SAAS;KACX;KACA,6BAAA,yBAAyB,QAAQ,iBAAiB;IACpD;IAGA,IAAI,QAAQ;IACZ,MAAM,sBAAsB,iBAAyB;KACnD,IAAI,OACF;KAEF,QAAQ;KAER,IAAI,CAAC,qBAAqB,cACxB,oBAAoB;KAGtB,IAAIC,6BAAAA,uBAAuB,gBAAgB;MACzC,MAAM,kBAAwC;OAC5C,WAAW,KAAK,IAAI;OACpB;OACA;OACA,YAAY,KAAK,IAAI,IAAI;OACzB,OAAO,gBAAgB;OACvB;OACA;OACA;OACA,SAAS;MACX;MACA,6BAAA,uBAAuB,QAAQ,eAAe;KAChD;IACF;IAEA,MAAM,yBAAyB;KAC7B,IAAI,eAAe;KACnB,QAAQ,iBAAyB;MAC/B,IAAI,gBAAgB,OAClB;MAEF,eAAe;MACf,IAAI,CAAC,qBAAqB,cACxB,oBAAoB;MAEtB,qBAAqB;MACrB,IAAI,qBAAqB,GACvB,mBAAmB,iBAAiB;KAExC;IACF;IAEA,OAAO,eAAe,UAAU,WAAW;KACzC,OAAO;KACP,UAAU;KACV,cAAc;KACd,YAAY;IACd,CAAC;IAED,KAAK,MAAM,WAAW,UACpB,OAAO,eAAe,SAAS,WAAW;KACxC,OAAO,iBAAiB;KACxB,UAAU;KACV,cAAc;KACd,YAAY;IACd,CAAC;GAEL;EACF;CACF;AACF;;;;AAKA,SAAgB,iCACd,gBACA,SACA,SAA0C,CAAC,GACZ;CAC/B,MAAM,SAAS,eAAe,UAAU;CACxC,IAAI,OAAO;CAEX,MAAM,sBAAsB,0BAC1B,YAAY;EACV,IAAI,MACF,OAAO;EAGT,MAAM,QAAQ,MAAM,OAAO,KAAK;EAChC,IAAI,MAAM,MAAM;GACd,OAAO;GACP,OAAO;EACT;EAEA,OAAO,MAAM,SAAS;CACxB,GACA,SACA,MACF,CAAC,CAAC,KAAK,CAAC,CAAkB;CAE1B,OAAO,IAAI,eAA8B;EACvC,MAAM,KAAK,YAAY;GACrB,MAAM,UAAU,MAAM,oBAAoB;GAC1C,IAAI,CAAC,SAAS;IACZ,WAAW,MAAM;IACjB;GACF;GAEA,WAAW,QAAQ,OAAO;EAC5B;EACA,MAAM,OAAO,QAAQ;GACnB,OAAO;GACP,MAAM,OAAO,OAAO,MAAM;EAC5B;CACF,CAAC;AACH;;;;AAKA,SAAgB,8BACd,gBACA,SACA,MACA,WACA,SAA0C,CAAC,GACd;CAC7B,MAAM,SAAS,eAAe,UAAU;CACxC,IAAI,OAAO;CAEX,MAAM,2BAA2B,uBAC/B,YAAY;EACV,IAAI,MACF,OAAO,CAAC;EAGV,MAAM,QAAQ,MAAM,OAAO,KAAK;EAChC,IAAI,MAAM,MAAM;GACd,OAAO;GACP,OAAO,CAAC;EACV;EAEA,OAAO,MAAM,SAAS,CAAC;CACzB,GACA,SACA,MACF,CAAC,CAAC,KAAK,CAAC,CAAkB;CAE1B,OAAO,IAAI,eAA4B;EACrC,MAAM,KAAK,YAAY;GACrB,MAAM,WAAW,MAAM,yBAAyB,MAAM,SAAS;GAC/D,IAAI,MAAM;IACR,WAAW,MAAM;IACjB;GACF;GAEA,IAAI,SAAS,SAAS,GACpB,WAAW,QAAQ,QAAQ;EAE/B;EACA,MAAM,OAAO,QAAQ;GACnB,OAAO;GACP,MAAM,OAAO,OAAO,MAAM;EAC5B;CACF,CAAC;AACH"}
@@ -1,2 +1,2 @@
1
- import { a as instrumentConsumerReceive, i as instrumentConsumerReadableStream, n as instrumentBatchReadableStream, o as instrumentProducerSend, r as instrumentBatchReceive, t as DiagnosticInstrumentationConfig } from "../instrumentation-CGxc_url.cjs";
1
+ import { a as instrumentConsumerReceive, i as instrumentConsumerReadableStream, n as instrumentBatchReadableStream, o as instrumentProducerSend, r as instrumentBatchReceive, t as DiagnosticInstrumentationConfig } from "../instrumentation-Cd62Qkxq.cjs";
2
2
  export { DiagnosticInstrumentationConfig, instrumentBatchReadableStream, instrumentBatchReceive, instrumentConsumerReadableStream, instrumentConsumerReceive, instrumentProducerSend };
@@ -1,2 +1,2 @@
1
- import { a as instrumentConsumerReceive, i as instrumentConsumerReadableStream, n as instrumentBatchReadableStream, o as instrumentProducerSend, r as instrumentBatchReceive, t as DiagnosticInstrumentationConfig } from "../instrumentation-CGxc_url.js";
1
+ import { a as instrumentConsumerReceive, i as instrumentConsumerReadableStream, n as instrumentBatchReadableStream, o as instrumentProducerSend, r as instrumentBatchReceive, t as DiagnosticInstrumentationConfig } from "../instrumentation-Cd62Qkxq.js";
2
2
  export { DiagnosticInstrumentationConfig, instrumentBatchReadableStream, instrumentBatchReceive, instrumentConsumerReadableStream, instrumentConsumerReceive, instrumentProducerSend };
@@ -1 +1 @@
1
- {"version":3,"file":"instrumentation.js","names":[],"sources":["../../js-src/diagnostics/instrumentation.ts"],"sourcesContent":["/**\n * Diagnostic Channel-based Kafka Instrumentation\n *\n * This module provides instrumentation that publishes events to Node.js\n * diagnostic channels instead of directly calling OpenTelemetry APIs.\n * Observability tools can subscribe to these channels to receive events.\n */\nimport type { KafkaConsumer, KafkaProducer, Message, ProducerRecord, RecordMetadata } from '../../js-binding.js'\nimport {\n batchProcessEndChannel,\n type BatchProcessEndEvent,\n batchProcessStartChannel,\n type BatchProcessStartEvent,\n batchReceiveEndChannel,\n type BatchReceiveEndEvent,\n batchReceiveStartChannel,\n type BatchReceiveStartEvent,\n consumerProcessEndChannel,\n type ConsumerProcessEndEvent,\n consumerProcessStartChannel,\n type ConsumerProcessStartEvent,\n consumerReceiveEndChannel,\n type ConsumerReceiveEndEvent,\n consumerReceiveStartChannel,\n type ConsumerReceiveStartEvent,\n producerSendEndChannel,\n type ProducerSendEndEvent,\n producerSendErrorChannel,\n type ProducerSendErrorEvent,\n producerSendStartChannel,\n type ProducerSendStartEvent,\n} from './channels.js'\n\n/**\n * Configuration for diagnostic channel instrumentation\n */\nexport interface DiagnosticInstrumentationConfig {\n /** Client ID for attribution */\n clientId?: string\n /** Server address for attribution */\n serverAddress?: string\n /** Server port for attribution */\n serverPort?: number\n}\n\n/**\n * Instruments a producer send method to publish diagnostic events\n */\nexport function instrumentProducerSend(\n originalSend: (record: ProducerRecord) => Promise<RecordMetadata[]>,\n config: DiagnosticInstrumentationConfig = {},\n): (this: KafkaProducer, record: ProducerRecord) => Promise<RecordMetadata[]> {\n const { clientId, serverAddress, serverPort } = config\n\n return async function instrumentedSend(this: KafkaProducer, record: ProducerRecord) {\n // Fast path: if no subscribers, just call original\n if (\n !producerSendStartChannel.hasSubscribers &&\n !producerSendEndChannel.hasSubscribers &&\n !producerSendErrorChannel.hasSubscribers\n ) {\n return originalSend.call(this, record)\n }\n\n const timestamp = Date.now()\n const context: Record<PropertyKey, unknown> = {}\n\n const startEvent: ProducerSendStartEvent = {\n timestamp,\n topic: record.topic,\n record,\n messageCount: record.messages?.length ?? 0,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n\n // Publish start event - subscribers can inject trace headers here\n if (producerSendStartChannel.hasSubscribers) {\n producerSendStartChannel.publish(startEvent)\n }\n\n let sendError: Error | undefined\n let metadata: RecordMetadata[] | undefined\n\n try {\n metadata = await originalSend.call(this, record)\n return metadata\n } catch (error) {\n sendError = error instanceof Error ? error : new Error(String(error))\n throw error\n } finally {\n const durationMs = Date.now() - timestamp\n\n if (sendError && producerSendErrorChannel.hasSubscribers) {\n const errorEvent: ProducerSendErrorEvent = {\n timestamp: Date.now(),\n topic: record.topic,\n record,\n durationMs,\n error: sendError,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n producerSendErrorChannel.publish(errorEvent)\n }\n\n // Publish end event\n if (producerSendEndChannel.hasSubscribers) {\n const endEvent: ProducerSendEndEvent = {\n timestamp: Date.now(),\n topic: record.topic,\n record,\n metadata,\n durationMs,\n error: sendError,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n producerSendEndChannel.publish(endEvent)\n }\n }\n }\n}\n\n/**\n * Instruments a consumer receive method to publish diagnostic events\n */\nexport function instrumentConsumerReceive(\n originalReceive: () => Promise<Message | null>,\n groupId?: string,\n config: DiagnosticInstrumentationConfig = {},\n): (this: KafkaConsumer) => Promise<Message | null> {\n const { clientId, serverAddress, serverPort } = config\n\n return async function instrumentedReceive(this: KafkaConsumer) {\n // Fast path: if no subscribers at all, just call original\n const hasReceiveSubscribers = consumerReceiveStartChannel.hasSubscribers || consumerReceiveEndChannel.hasSubscribers\n const hasProcessSubscribers = consumerProcessStartChannel.hasSubscribers || consumerProcessEndChannel.hasSubscribers\n\n if (!hasReceiveSubscribers && !hasProcessSubscribers) {\n return originalReceive.call(this)\n }\n\n const timestamp = Date.now()\n const context: Record<PropertyKey, unknown> = {}\n\n // Publish receive start\n if (consumerReceiveStartChannel.hasSubscribers) {\n const startEvent: ConsumerReceiveStartEvent = {\n timestamp,\n groupId,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n consumerReceiveStartChannel.publish(startEvent)\n }\n\n let receiveError: Error | undefined\n let message: Message | null = null\n\n try {\n message = await originalReceive.call(this)\n return message\n } catch (error) {\n receiveError = error instanceof Error ? error : new Error(String(error))\n throw error\n } finally {\n // Publish receive end\n if (consumerReceiveEndChannel.hasSubscribers) {\n const endEvent: ConsumerReceiveEndEvent = {\n timestamp: Date.now(),\n message,\n groupId,\n durationMs: Date.now() - timestamp,\n error: receiveError,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n consumerReceiveEndChannel.publish(endEvent)\n }\n\n // If message exists and process channels have subscribers, set up process tracking\n if (message && hasProcessSubscribers) {\n const processingMessage = message\n const processContext: Record<PropertyKey, unknown> = {}\n const processStartTime = Date.now()\n\n // Publish process start\n if (consumerProcessStartChannel.hasSubscribers) {\n const processStartEvent: ConsumerProcessStartEvent = {\n timestamp: processStartTime,\n message,\n groupId,\n clientId,\n serverAddress,\n serverPort,\n context: processContext,\n }\n consumerProcessStartChannel.publish(processStartEvent)\n }\n\n // Attach endSpan helper to message for user to call when processing completes\n let ended = false\n const endProcessing = (processError?: Error) => {\n if (ended) {\n return\n }\n ended = true\n\n if (consumerProcessEndChannel.hasSubscribers) {\n const processEndEvent: ConsumerProcessEndEvent = {\n timestamp: Date.now(),\n message: processingMessage,\n groupId,\n durationMs: Date.now() - processStartTime,\n error: processError,\n clientId,\n serverAddress,\n serverPort,\n context: processContext,\n }\n consumerProcessEndChannel.publish(processEndEvent)\n }\n }\n\n // Add endSpan to message\n Object.defineProperty(message, 'endSpan', {\n value: endProcessing,\n writable: false,\n configurable: true,\n enumerable: false,\n })\n }\n }\n }\n}\n\n/**\n * Instruments a consumer batch receive method to publish diagnostic events\n */\nexport function instrumentBatchReceive(\n originalBatchReceive: (size: number, timeoutMs: number) => Promise<Message[]>,\n groupId?: string,\n config: DiagnosticInstrumentationConfig = {},\n): (this: KafkaConsumer, size: number, timeoutMs: number) => Promise<Message[]> {\n const { clientId, serverAddress, serverPort } = config\n\n return async function instrumentedBatchReceive(this: KafkaConsumer, size: number, timeoutMs: number) {\n // Fast path: if no subscribers, just call original\n const hasReceiveSubscribers = batchReceiveStartChannel.hasSubscribers || batchReceiveEndChannel.hasSubscribers\n const hasProcessSubscribers = batchProcessStartChannel.hasSubscribers || batchProcessEndChannel.hasSubscribers\n\n if (!hasReceiveSubscribers && !hasProcessSubscribers) {\n return originalBatchReceive.call(this, size, timeoutMs)\n }\n\n const timestamp = Date.now()\n const context: Record<PropertyKey, unknown> = {}\n\n // Publish batch receive start\n if (batchReceiveStartChannel.hasSubscribers) {\n const startEvent: BatchReceiveStartEvent = {\n timestamp,\n groupId,\n requestedSize: size,\n timeoutMs,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n batchReceiveStartChannel.publish(startEvent)\n }\n\n let batchError: Error | undefined\n let messages: Message[] = []\n\n try {\n messages = await originalBatchReceive.call(this, size, timeoutMs)\n return messages\n } catch (error) {\n batchError = error instanceof Error ? error : new Error(String(error))\n throw error\n } finally {\n // Publish batch receive end\n if (batchReceiveEndChannel.hasSubscribers) {\n const endEvent: BatchReceiveEndEvent = {\n timestamp: Date.now(),\n messages,\n groupId,\n durationMs: Date.now() - timestamp,\n error: batchError,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n batchReceiveEndChannel.publish(endEvent)\n }\n\n // If messages exist and process channels have subscribers, set up batch process tracking\n if (messages.length > 0 && hasProcessSubscribers) {\n const processContext: Record<PropertyKey, unknown> = {}\n const processStartTime = Date.now()\n let firstProcessError: Error | undefined\n let remainingMessages = messages.length\n\n // Publish batch process start\n if (batchProcessStartChannel.hasSubscribers) {\n // Surface headers from the first message for downstream context extraction\n if (messages[0]?.headers) {\n processContext.parentHeaders = messages[0].headers\n }\n\n const processStartEvent: BatchProcessStartEvent = {\n timestamp: processStartTime,\n messages,\n groupId,\n clientId,\n serverAddress,\n serverPort,\n context: processContext,\n }\n batchProcessStartChannel.publish(processStartEvent)\n }\n\n // Attach endSpan helper to batch array\n let ended = false\n const endBatchProcessing = (processError?: Error) => {\n if (ended) {\n return\n }\n ended = true\n\n if (!firstProcessError && processError) {\n firstProcessError = processError\n }\n\n if (batchProcessEndChannel.hasSubscribers) {\n const processEndEvent: BatchProcessEndEvent = {\n timestamp: Date.now(),\n messages,\n groupId,\n durationMs: Date.now() - processStartTime,\n error: processError ?? firstProcessError,\n clientId,\n serverAddress,\n serverPort,\n context: processContext,\n }\n batchProcessEndChannel.publish(processEndEvent)\n }\n }\n\n const makeMessageEnder = () => {\n let messageEnded = false\n return (processError?: Error) => {\n if (messageEnded || ended) {\n return\n }\n messageEnded = true\n if (!firstProcessError && processError) {\n firstProcessError = processError\n }\n remainingMessages -= 1\n if (remainingMessages <= 0) {\n endBatchProcessing(firstProcessError)\n }\n }\n }\n\n Object.defineProperty(messages, 'endSpan', {\n value: endBatchProcessing,\n writable: false,\n configurable: true,\n enumerable: false,\n })\n\n for (const message of messages) {\n Object.defineProperty(message, 'endSpan', {\n value: makeMessageEnder(),\n writable: false,\n configurable: true,\n enumerable: false,\n })\n }\n }\n }\n }\n}\n\n/**\n * Instruments a ReadableStream of single messages with consumer diagnostic events.\n */\nexport function instrumentConsumerReadableStream<StreamMessage extends Message>(\n originalStream: ReadableStream<StreamMessage>,\n groupId?: string,\n config: DiagnosticInstrumentationConfig = {},\n): ReadableStream<StreamMessage> {\n const reader = originalStream.getReader()\n let done = false\n\n const instrumentedReceive = instrumentConsumerReceive(\n async () => {\n if (done) {\n return null\n }\n\n const chunk = await reader.read()\n if (chunk.done) {\n done = true\n return null\n }\n\n return chunk.value ?? null\n },\n groupId,\n config,\n ).bind({} as KafkaConsumer) as () => Promise<StreamMessage | null>\n\n return new ReadableStream<StreamMessage>({\n async pull(controller) {\n const message = await instrumentedReceive()\n if (!message) {\n controller.close()\n return\n }\n\n controller.enqueue(message)\n },\n async cancel(reason) {\n done = true\n await reader.cancel(reason)\n },\n })\n}\n\n/**\n * Instruments a ReadableStream of message batches with batch diagnostic events.\n */\nexport function instrumentBatchReadableStream<StreamBatch extends Message[]>(\n originalStream: ReadableStream<StreamBatch>,\n groupId: string | undefined,\n size: number,\n timeoutMs: number,\n config: DiagnosticInstrumentationConfig = {},\n): ReadableStream<StreamBatch> {\n const reader = originalStream.getReader()\n let done = false\n\n const instrumentedBatchReceive = instrumentBatchReceive(\n async () => {\n if (done) {\n return []\n }\n\n const chunk = await reader.read()\n if (chunk.done) {\n done = true\n return []\n }\n\n return chunk.value ?? []\n },\n groupId,\n config,\n ).bind({} as KafkaConsumer) as (size: number, timeoutMs: number) => Promise<StreamBatch>\n\n return new ReadableStream<StreamBatch>({\n async pull(controller) {\n const messages = await instrumentedBatchReceive(size, timeoutMs)\n if (done) {\n controller.close()\n return\n }\n\n if (messages.length > 0) {\n controller.enqueue(messages)\n }\n },\n async cancel(reason) {\n done = true\n await reader.cancel(reason)\n },\n })\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"instrumentation.js","names":[],"sources":["../../js-src/diagnostics/instrumentation.ts"],"sourcesContent":["/**\n * Diagnostic Channel-based Kafka Instrumentation\n *\n * This module provides instrumentation that publishes events to Node.js\n * diagnostic channels instead of directly calling OpenTelemetry APIs.\n * Observability tools can subscribe to these channels to receive events.\n */\nimport type { KafkaConsumer, KafkaProducer, Message, ProducerRecord, RecordMetadata } from '../../js-binding.js'\nimport {\n batchProcessEndChannel,\n type BatchProcessEndEvent,\n batchProcessStartChannel,\n type BatchProcessStartEvent,\n batchReceiveEndChannel,\n type BatchReceiveEndEvent,\n batchReceiveStartChannel,\n type BatchReceiveStartEvent,\n consumerProcessEndChannel,\n type ConsumerProcessEndEvent,\n consumerProcessStartChannel,\n type ConsumerProcessStartEvent,\n consumerReceiveEndChannel,\n type ConsumerReceiveEndEvent,\n consumerReceiveStartChannel,\n type ConsumerReceiveStartEvent,\n producerSendEndChannel,\n type ProducerSendEndEvent,\n producerSendErrorChannel,\n type ProducerSendErrorEvent,\n producerSendStartChannel,\n type ProducerSendStartEvent,\n} from './channels.js'\n\n/**\n * Configuration for diagnostic channel instrumentation\n */\nexport interface DiagnosticInstrumentationConfig {\n /** Client ID for attribution */\n clientId?: string\n /** Server address for attribution */\n serverAddress?: string\n /** Server port for attribution */\n serverPort?: number\n}\n\n/**\n * Instruments a producer send method to publish diagnostic events\n */\nexport function instrumentProducerSend(\n originalSend: (record: ProducerRecord) => Promise<RecordMetadata[]>,\n config: DiagnosticInstrumentationConfig = {},\n): (this: KafkaProducer, record: ProducerRecord) => Promise<RecordMetadata[]> {\n const { clientId, serverAddress, serverPort } = config\n\n return async function instrumentedSend(this: KafkaProducer, record: ProducerRecord) {\n // Fast path: if no subscribers, just call original\n if (\n !producerSendStartChannel.hasSubscribers &&\n !producerSendEndChannel.hasSubscribers &&\n !producerSendErrorChannel.hasSubscribers\n ) {\n return originalSend.call(this, record)\n }\n\n const timestamp = Date.now()\n const context: Record<PropertyKey, unknown> = {}\n\n const startEvent: ProducerSendStartEvent = {\n timestamp,\n topic: record.topic,\n record,\n messageCount: record.messages?.length ?? 0,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n\n // Publish start event - subscribers can inject trace headers here\n if (producerSendStartChannel.hasSubscribers) {\n producerSendStartChannel.publish(startEvent)\n }\n\n let sendError: Error | undefined\n let metadata: RecordMetadata[] | undefined\n\n try {\n metadata = await originalSend.call(this, record)\n return metadata\n } catch (error) {\n sendError = error instanceof Error ? error : new Error(String(error))\n throw error\n } finally {\n const durationMs = Date.now() - timestamp\n\n if (sendError && producerSendErrorChannel.hasSubscribers) {\n const errorEvent: ProducerSendErrorEvent = {\n timestamp: Date.now(),\n topic: record.topic,\n record,\n durationMs,\n error: sendError,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n producerSendErrorChannel.publish(errorEvent)\n }\n\n // Publish end event\n if (producerSendEndChannel.hasSubscribers) {\n const endEvent: ProducerSendEndEvent = {\n timestamp: Date.now(),\n topic: record.topic,\n record,\n metadata,\n durationMs,\n error: sendError,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n producerSendEndChannel.publish(endEvent)\n }\n }\n }\n}\n\n/**\n * Instruments a consumer receive method to publish diagnostic events\n */\nexport function instrumentConsumerReceive(\n originalReceive: () => Promise<Message | null>,\n groupId?: string,\n config: DiagnosticInstrumentationConfig = {},\n): (this: KafkaConsumer) => Promise<Message | null> {\n const { clientId, serverAddress, serverPort } = config\n\n return async function instrumentedReceive(this: KafkaConsumer) {\n // Fast path: if no subscribers at all, just call original\n const hasReceiveSubscribers = consumerReceiveStartChannel.hasSubscribers || consumerReceiveEndChannel.hasSubscribers\n const hasProcessSubscribers = consumerProcessStartChannel.hasSubscribers || consumerProcessEndChannel.hasSubscribers\n\n if (!hasReceiveSubscribers && !hasProcessSubscribers) {\n return originalReceive.call(this)\n }\n\n const timestamp = Date.now()\n const context: Record<PropertyKey, unknown> = {}\n\n // Publish receive start\n if (consumerReceiveStartChannel.hasSubscribers) {\n const startEvent: ConsumerReceiveStartEvent = {\n timestamp,\n groupId,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n consumerReceiveStartChannel.publish(startEvent)\n }\n\n let receiveError: Error | undefined\n let message: Message | null = null\n\n try {\n message = await originalReceive.call(this)\n return message\n } catch (error) {\n receiveError = error instanceof Error ? error : new Error(String(error))\n throw error\n } finally {\n // Publish receive end\n if (consumerReceiveEndChannel.hasSubscribers) {\n const endEvent: ConsumerReceiveEndEvent = {\n timestamp: Date.now(),\n message,\n groupId,\n durationMs: Date.now() - timestamp,\n error: receiveError,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n consumerReceiveEndChannel.publish(endEvent)\n }\n\n // If message exists and process channels have subscribers, set up process tracking\n if (message && hasProcessSubscribers) {\n const processingMessage = message\n const processContext: Record<PropertyKey, unknown> = {}\n const processStartTime = Date.now()\n\n // Publish process start\n if (consumerProcessStartChannel.hasSubscribers) {\n const processStartEvent: ConsumerProcessStartEvent = {\n timestamp: processStartTime,\n message,\n groupId,\n clientId,\n serverAddress,\n serverPort,\n context: processContext,\n }\n consumerProcessStartChannel.publish(processStartEvent)\n }\n\n // Attach endSpan helper to message for user to call when processing completes\n let ended = false\n const endProcessing = (processError?: Error) => {\n if (ended) {\n return\n }\n ended = true\n\n if (consumerProcessEndChannel.hasSubscribers) {\n const processEndEvent: ConsumerProcessEndEvent = {\n timestamp: Date.now(),\n message: processingMessage,\n groupId,\n durationMs: Date.now() - processStartTime,\n error: processError,\n clientId,\n serverAddress,\n serverPort,\n context: processContext,\n }\n consumerProcessEndChannel.publish(processEndEvent)\n }\n }\n\n // Add endSpan to message\n Object.defineProperty(message, 'endSpan', {\n value: endProcessing,\n writable: false,\n configurable: true,\n enumerable: false,\n })\n }\n }\n }\n}\n\n/**\n * Instruments a consumer batch receive method to publish diagnostic events\n */\nexport function instrumentBatchReceive(\n originalBatchReceive: (size: number, timeoutMs: number) => Promise<Message[]>,\n groupId?: string,\n config: DiagnosticInstrumentationConfig = {},\n): (this: KafkaConsumer, size: number, timeoutMs: number) => Promise<Message[]> {\n const { clientId, serverAddress, serverPort } = config\n\n return async function instrumentedBatchReceive(this: KafkaConsumer, size: number, timeoutMs: number) {\n // Fast path: if no subscribers, just call original\n const hasReceiveSubscribers = batchReceiveStartChannel.hasSubscribers || batchReceiveEndChannel.hasSubscribers\n const hasProcessSubscribers = batchProcessStartChannel.hasSubscribers || batchProcessEndChannel.hasSubscribers\n\n if (!hasReceiveSubscribers && !hasProcessSubscribers) {\n return originalBatchReceive.call(this, size, timeoutMs)\n }\n\n const timestamp = Date.now()\n const context: Record<PropertyKey, unknown> = {}\n\n // Publish batch receive start\n if (batchReceiveStartChannel.hasSubscribers) {\n const startEvent: BatchReceiveStartEvent = {\n timestamp,\n groupId,\n requestedSize: size,\n timeoutMs,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n batchReceiveStartChannel.publish(startEvent)\n }\n\n let batchError: Error | undefined\n let messages: Message[] = []\n\n try {\n messages = await originalBatchReceive.call(this, size, timeoutMs)\n return messages\n } catch (error) {\n batchError = error instanceof Error ? error : new Error(String(error))\n throw error\n } finally {\n // Publish batch receive end\n if (batchReceiveEndChannel.hasSubscribers) {\n const endEvent: BatchReceiveEndEvent = {\n timestamp: Date.now(),\n messages,\n groupId,\n durationMs: Date.now() - timestamp,\n error: batchError,\n clientId,\n serverAddress,\n serverPort,\n context,\n }\n batchReceiveEndChannel.publish(endEvent)\n }\n\n // If messages exist and process channels have subscribers, set up batch process tracking\n if (messages.length > 0 && hasProcessSubscribers) {\n const processContext: Record<PropertyKey, unknown> = {}\n const processStartTime = Date.now()\n let firstProcessError: Error | undefined\n let remainingMessages = messages.length\n\n // Publish batch process start\n if (batchProcessStartChannel.hasSubscribers) {\n // Surface headers from the first message for downstream context extraction\n if (messages[0]?.headers) {\n processContext.parentHeaders = messages[0].headers\n }\n\n const processStartEvent: BatchProcessStartEvent = {\n timestamp: processStartTime,\n messages,\n groupId,\n clientId,\n serverAddress,\n serverPort,\n context: processContext,\n }\n batchProcessStartChannel.publish(processStartEvent)\n }\n\n // Attach endSpan helper to batch array\n let ended = false\n const endBatchProcessing = (processError?: Error) => {\n if (ended) {\n return\n }\n ended = true\n\n if (!firstProcessError && processError) {\n firstProcessError = processError\n }\n\n if (batchProcessEndChannel.hasSubscribers) {\n const processEndEvent: BatchProcessEndEvent = {\n timestamp: Date.now(),\n messages,\n groupId,\n durationMs: Date.now() - processStartTime,\n error: processError ?? firstProcessError,\n clientId,\n serverAddress,\n serverPort,\n context: processContext,\n }\n batchProcessEndChannel.publish(processEndEvent)\n }\n }\n\n const makeMessageEnder = () => {\n let messageEnded = false\n return (processError?: Error) => {\n if (messageEnded || ended) {\n return\n }\n messageEnded = true\n if (!firstProcessError && processError) {\n firstProcessError = processError\n }\n remainingMessages -= 1\n if (remainingMessages <= 0) {\n endBatchProcessing(firstProcessError)\n }\n }\n }\n\n Object.defineProperty(messages, 'endSpan', {\n value: endBatchProcessing,\n writable: false,\n configurable: true,\n enumerable: false,\n })\n\n for (const message of messages) {\n Object.defineProperty(message, 'endSpan', {\n value: makeMessageEnder(),\n writable: false,\n configurable: true,\n enumerable: false,\n })\n }\n }\n }\n }\n}\n\n/**\n * Instruments a ReadableStream of single messages with consumer diagnostic events.\n */\nexport function instrumentConsumerReadableStream<StreamMessage extends Message>(\n originalStream: ReadableStream<StreamMessage>,\n groupId?: string,\n config: DiagnosticInstrumentationConfig = {},\n): ReadableStream<StreamMessage> {\n const reader = originalStream.getReader()\n let done = false\n\n const instrumentedReceive = instrumentConsumerReceive(\n async () => {\n if (done) {\n return null\n }\n\n const chunk = await reader.read()\n if (chunk.done) {\n done = true\n return null\n }\n\n return chunk.value ?? null\n },\n groupId,\n config,\n ).bind({} as KafkaConsumer) as () => Promise<StreamMessage | null>\n\n return new ReadableStream<StreamMessage>({\n async pull(controller) {\n const message = await instrumentedReceive()\n if (!message) {\n controller.close()\n return\n }\n\n controller.enqueue(message)\n },\n async cancel(reason) {\n done = true\n await reader.cancel(reason)\n },\n })\n}\n\n/**\n * Instruments a ReadableStream of message batches with batch diagnostic events.\n */\nexport function instrumentBatchReadableStream<StreamBatch extends Message[]>(\n originalStream: ReadableStream<StreamBatch>,\n groupId: string | undefined,\n size: number,\n timeoutMs: number,\n config: DiagnosticInstrumentationConfig = {},\n): ReadableStream<StreamBatch> {\n const reader = originalStream.getReader()\n let done = false\n\n const instrumentedBatchReceive = instrumentBatchReceive(\n async () => {\n if (done) {\n return []\n }\n\n const chunk = await reader.read()\n if (chunk.done) {\n done = true\n return []\n }\n\n return chunk.value ?? []\n },\n groupId,\n config,\n ).bind({} as KafkaConsumer) as (size: number, timeoutMs: number) => Promise<StreamBatch>\n\n return new ReadableStream<StreamBatch>({\n async pull(controller) {\n const messages = await instrumentedBatchReceive(size, timeoutMs)\n if (done) {\n controller.close()\n return\n }\n\n if (messages.length > 0) {\n controller.enqueue(messages)\n }\n },\n async cancel(reason) {\n done = true\n await reader.cancel(reason)\n },\n })\n}\n"],"mappings":"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"}
package/dist/index.d.cts CHANGED
@@ -1,6 +1,7 @@
1
- import { C as consumerProcessStartChannel, D as producerSendErrorChannel, E as producerSendEndChannel, O as producerSendStartChannel, S as consumerProcessEndChannel, T as consumerReceiveStartChannel, _ as batchProcessEndChannel, a as BatchReceiveStartEvent, b as batchReceiveStartChannel, c as ConsumerProcessEndEvent, d as ConsumerReceiveStartEvent, g as TypedChannel, h as ProducerSendStartEvent, i as BatchReceiveEndEvent, l as ConsumerProcessStartEvent, m as ProducerSendErrorEvent, n as BatchProcessEndEvent, o as CHANNEL_NAMES, p as ProducerSendEndEvent, r as BatchProcessStartEvent, s as ChannelName, t as BaseEvent, u as ConsumerReceiveEndEvent, v as batchProcessStartChannel, w as consumerReceiveEndChannel, x as channels, y as batchReceiveEndChannel } from "./channels-DpT3Ilp7.cjs";
2
- import { a as instrumentConsumerReceive, i as instrumentConsumerReadableStream, n as instrumentBatchReadableStream, o as instrumentProducerSend, r as instrumentBatchReceive, t as DiagnosticInstrumentationConfig } from "./instrumentation-CGxc_url.cjs";
3
- import { t as BaseKafkaStreamReadable } from "./base-kafka-stream-readable-D9sZX4xL.cjs";
1
+ import { C as consumerProcessStartChannel, D as producerSendErrorChannel, E as producerSendEndChannel, O as producerSendStartChannel, S as consumerProcessEndChannel, T as consumerReceiveStartChannel, _ as batchProcessEndChannel, a as BatchReceiveStartEvent, b as batchReceiveStartChannel, c as ConsumerProcessEndEvent, d as ConsumerReceiveStartEvent, g as TypedChannel, h as ProducerSendStartEvent, i as BatchReceiveEndEvent, l as ConsumerProcessStartEvent, m as ProducerSendErrorEvent, n as BatchProcessEndEvent, o as CHANNEL_NAMES, p as ProducerSendEndEvent, r as BatchProcessStartEvent, s as ChannelName, t as BaseEvent, u as ConsumerReceiveEndEvent, v as batchProcessStartChannel, w as consumerReceiveEndChannel, x as channels, y as batchReceiveEndChannel } from "./channels-D4ZtiwQz.cjs";
2
+ import { a as instrumentConsumerReceive, i as instrumentConsumerReadableStream, n as instrumentBatchReadableStream, o as instrumentProducerSend, r as instrumentBatchReceive, t as DiagnosticInstrumentationConfig } from "./instrumentation-Cd62Qkxq.cjs";
3
+ import "./diagnostics/index.cjs";
4
+ import { t as BaseKafkaStreamReadable } from "./base-kafka-stream-readable-CtlWvan5.cjs";
4
5
  import { KafkaBatchStreamReadable } from "./streams/kafka-batch-stream-readable.cjs";
5
6
  import { KafkaStreamReadable } from "./streams/kafka-stream-readable.cjs";
6
7
  import { KafkaClient, KafkaClientConfiguration, StreamConsumerConfiguration, WebStreamConsumer, WebStreamConsumerConfiguration } from "./kafka-client.cjs";
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- import { C as consumerProcessStartChannel, D as producerSendErrorChannel, E as producerSendEndChannel, O as producerSendStartChannel, S as consumerProcessEndChannel, T as consumerReceiveStartChannel, _ as batchProcessEndChannel, a as BatchReceiveStartEvent, b as batchReceiveStartChannel, c as ConsumerProcessEndEvent, d as ConsumerReceiveStartEvent, g as TypedChannel, h as ProducerSendStartEvent, i as BatchReceiveEndEvent, l as ConsumerProcessStartEvent, m as ProducerSendErrorEvent, n as BatchProcessEndEvent, o as CHANNEL_NAMES, p as ProducerSendEndEvent, r as BatchProcessStartEvent, s as ChannelName, t as BaseEvent, u as ConsumerReceiveEndEvent, v as batchProcessStartChannel, w as consumerReceiveEndChannel, x as channels, y as batchReceiveEndChannel } from "./channels-CtCeIPbt.js";
2
- import { a as instrumentConsumerReceive, i as instrumentConsumerReadableStream, n as instrumentBatchReadableStream, o as instrumentProducerSend, r as instrumentBatchReceive, t as DiagnosticInstrumentationConfig } from "./instrumentation-CGxc_url.js";
3
- import { t as BaseKafkaStreamReadable } from "./base-kafka-stream-readable-D9sZX4xL.js";
1
+ import { C as consumerProcessStartChannel, D as producerSendErrorChannel, E as producerSendEndChannel, O as producerSendStartChannel, S as consumerProcessEndChannel, T as consumerReceiveStartChannel, _ as batchProcessEndChannel, a as BatchReceiveStartEvent, b as batchReceiveStartChannel, c as ConsumerProcessEndEvent, d as ConsumerReceiveStartEvent, g as TypedChannel, h as ProducerSendStartEvent, i as BatchReceiveEndEvent, l as ConsumerProcessStartEvent, m as ProducerSendErrorEvent, n as BatchProcessEndEvent, o as CHANNEL_NAMES, p as ProducerSendEndEvent, r as BatchProcessStartEvent, s as ChannelName, t as BaseEvent, u as ConsumerReceiveEndEvent, v as batchProcessStartChannel, w as consumerReceiveEndChannel, x as channels, y as batchReceiveEndChannel } from "./channels-CCvEbkFg.js";
2
+ import { a as instrumentConsumerReceive, i as instrumentConsumerReadableStream, n as instrumentBatchReadableStream, o as instrumentProducerSend, r as instrumentBatchReceive, t as DiagnosticInstrumentationConfig } from "./instrumentation-Cd62Qkxq.js";
3
+ import "./diagnostics/index.js";
4
+ import { t as BaseKafkaStreamReadable } from "./base-kafka-stream-readable-CtlWvan5.js";
4
5
  import { KafkaBatchStreamReadable } from "./streams/kafka-batch-stream-readable.js";
5
6
  import { KafkaStreamReadable } from "./streams/kafka-stream-readable.js";
6
7
  import { KafkaClient, KafkaClientConfiguration, StreamConsumerConfiguration, WebStreamConsumer, WebStreamConsumerConfiguration } from "./kafka-client.js";
@@ -1,5 +1,4 @@
1
1
  import { KafkaConsumer, KafkaProducer, Message, ProducerRecord, RecordMetadata } from "../js-binding.js";
2
-
3
2
  //#region js-src/diagnostics/instrumentation.d.ts
4
3
  /**
5
4
  * Configuration for diagnostic channel instrumentation
@@ -34,4 +33,4 @@ declare function instrumentConsumerReadableStream<StreamMessage extends Message>
34
33
  declare function instrumentBatchReadableStream<StreamBatch extends Message[]>(originalStream: ReadableStream<StreamBatch>, groupId: string | undefined, size: number, timeoutMs: number, config?: DiagnosticInstrumentationConfig): ReadableStream<StreamBatch>;
35
34
  //#endregion
36
35
  export { instrumentConsumerReceive as a, instrumentConsumerReadableStream as i, instrumentBatchReadableStream as n, instrumentProducerSend as o, instrumentBatchReceive as r, DiagnosticInstrumentationConfig as t };
37
- //# sourceMappingURL=instrumentation-CGxc_url.d.ts.map
36
+ //# sourceMappingURL=instrumentation-Cd62Qkxq.d.cts.map
@@ -1,5 +1,4 @@
1
1
  import { KafkaConsumer, KafkaProducer, Message, ProducerRecord, RecordMetadata } from "../js-binding.js";
2
-
3
2
  //#region js-src/diagnostics/instrumentation.d.ts
4
3
  /**
5
4
  * Configuration for diagnostic channel instrumentation
@@ -34,4 +33,4 @@ declare function instrumentConsumerReadableStream<StreamMessage extends Message>
34
33
  declare function instrumentBatchReadableStream<StreamBatch extends Message[]>(originalStream: ReadableStream<StreamBatch>, groupId: string | undefined, size: number, timeoutMs: number, config?: DiagnosticInstrumentationConfig): ReadableStream<StreamBatch>;
35
34
  //#endregion
36
35
  export { instrumentConsumerReceive as a, instrumentConsumerReadableStream as i, instrumentBatchReadableStream as n, instrumentProducerSend as o, instrumentBatchReceive as r, DiagnosticInstrumentationConfig as t };
37
- //# sourceMappingURL=instrumentation-CGxc_url.d.cts.map
36
+ //# sourceMappingURL=instrumentation-Cd62Qkxq.d.ts.map