@zmdb/transport-kafka 1.0.0-beta.1

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.
@@ -0,0 +1,18 @@
1
+ import { type TransportErrorSink, type TransportStrategy } from '@zmdb/app/messaging';
2
+ import type { Kafka } from 'kafkajs';
3
+ export interface KafkaStrategyOptions {
4
+ readonly client: Kafka;
5
+ readonly groupId: string;
6
+ readonly topics: readonly string[];
7
+ readonly deadLetterTopic: string;
8
+ readonly partitionsConsumedConcurrently: number;
9
+ readonly onError: TransportErrorSink;
10
+ readonly name?: string;
11
+ readonly fromBeginning?: boolean;
12
+ readonly sessionTimeoutMs?: number;
13
+ readonly heartbeatIntervalMs?: number;
14
+ readonly errorRetryMs?: number;
15
+ }
16
+ /** An event transport with ordered manual commits and partition-local retries. */
17
+ export declare function createKafkaStrategy(options: KafkaStrategyOptions): TransportStrategy;
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAA8B,KAAK,EAA0B,MAAM,SAAS,CAAC;AAEzF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,8BAA8B,EAAE,MAAM,CAAC;IAChD,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACrC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAgBD,kFAAkF;AAClF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,iBAAiB,CAuRpF"}
package/dist/index.js ADDED
@@ -0,0 +1,293 @@
1
+ import { decodeDelivery, encodeDelivery, reportTransportError, TransportUnsupportedError, withinGrace, } from '@zmdb/app/messaging';
2
+ function topicName(value) {
3
+ if (!/^[a-zA-Z0-9._-]{1,249}$/.test(value) || value === '.' || value === '..') {
4
+ throw new RangeError('@zmdb/transport-kafka: invalid Kafka topic');
5
+ }
6
+ return value;
7
+ }
8
+ function boundedInteger(value, description, minimum = 1) {
9
+ if (!Number.isInteger(value) || value < minimum || value > 2147483647) {
10
+ throw new RangeError(`@zmdb/transport-kafka: ${description} is outside its integer bound`);
11
+ }
12
+ return value;
13
+ }
14
+ /** An event transport with ordered manual commits and partition-local retries. */
15
+ export function createKafkaStrategy(options) {
16
+ const { client, groupId, onError } = options;
17
+ const topics = options.topics.map(topicName);
18
+ const deadLetterTopic = topicName(options.deadLetterTopic);
19
+ const concurrency = boundedInteger(options.partitionsConsumedConcurrently, 'partition concurrency');
20
+ const sessionTimeout = boundedInteger(options.sessionTimeoutMs ?? 30000, 'session timeout');
21
+ const heartbeatInterval = boundedInteger(options.heartbeatIntervalMs ?? 3000, 'heartbeat interval');
22
+ const errorRetryMs = boundedInteger(options.errorRetryMs ?? 1000, 'error retry delay');
23
+ const name = options.name ?? 'kafka';
24
+ const fromBeginning = options.fromBeginning ?? false;
25
+ if (!groupId ||
26
+ !name ||
27
+ !topics.length ||
28
+ new Set(topics).size !== topics.length ||
29
+ topics.includes(deadLetterTopic)) {
30
+ throw new RangeError('@zmdb/transport-kafka: explicit unique input topics, a separate dead-letter topic and a group are required');
31
+ }
32
+ if (heartbeatInterval >= sessionTimeout) {
33
+ throw new RangeError('@zmdb/transport-kafka: heartbeat interval must be smaller than session timeout');
34
+ }
35
+ let phase = 'idle';
36
+ let consumer;
37
+ let producer;
38
+ let startup;
39
+ let closing;
40
+ let disconnected;
41
+ let generation = 0;
42
+ const cancelled = new AbortController();
43
+ const tasks = new Set();
44
+ const attempts = new Map();
45
+ const retries = new Map();
46
+ const removeListeners = [];
47
+ const closedError = () => new Error('@zmdb/transport-kafka: strategy is closed');
48
+ const report = (error) => reportTransportError(onError, error);
49
+ function track(action) {
50
+ tasks.add(action);
51
+ void action.finally(() => tasks.delete(action)).catch(() => undefined);
52
+ return action;
53
+ }
54
+ async function abortable(action) {
55
+ cancelled.signal.throwIfAborted();
56
+ const interrupted = Promise.withResolvers();
57
+ const abort = () => interrupted.reject(cancelled.signal.reason);
58
+ cancelled.signal.addEventListener('abort', abort, { once: true });
59
+ try {
60
+ return await Promise.race([action, interrupted.promise]);
61
+ }
62
+ finally {
63
+ cancelled.signal.removeEventListener('abort', abort);
64
+ }
65
+ }
66
+ function cancelRetries(resume) {
67
+ for (const pending of retries.values()) {
68
+ clearTimeout(pending.timer);
69
+ if (resume) {
70
+ try {
71
+ pending.resume();
72
+ }
73
+ catch (error) {
74
+ report(error);
75
+ }
76
+ }
77
+ }
78
+ retries.clear();
79
+ }
80
+ function invalidate() {
81
+ generation += 1;
82
+ attempts.clear();
83
+ cancelRetries(phase === 'listening');
84
+ }
85
+ function disconnect() {
86
+ disconnected ??= (async () => {
87
+ for (const remove of removeListeners)
88
+ remove();
89
+ const results = await Promise.allSettled([consumer?.disconnect(), producer?.disconnect()]);
90
+ const failed = results.find(result => result.status === 'rejected');
91
+ if (failed?.status === 'rejected')
92
+ throw failed.reason;
93
+ })();
94
+ return disconnected;
95
+ }
96
+ function owned(batch, owner) {
97
+ return (phase !== 'closed' && !cancelled.signal.aborted && generation === owner && batch.isRunning() && !batch.isStale());
98
+ }
99
+ function retry(batch, offset, owner, delay) {
100
+ const activeConsumer = consumer;
101
+ if (phase !== 'listening' || !owned(batch, owner) || !activeConsumer)
102
+ return;
103
+ const { topic, partition } = batch.batch;
104
+ const key = `${topic}\0${String(partition)}`;
105
+ activeConsumer.seek({ topic, partition, offset });
106
+ const resume = batch.pause();
107
+ const previous = retries.get(key);
108
+ if (previous)
109
+ clearTimeout(previous.timer);
110
+ const timer = setTimeout(() => {
111
+ retries.delete(key);
112
+ if (phase !== 'listening' || generation !== owner || !batch.isRunning())
113
+ return;
114
+ try {
115
+ resume();
116
+ }
117
+ catch (error) {
118
+ report(error);
119
+ }
120
+ }, delay);
121
+ retries.set(key, { timer, resume });
122
+ }
123
+ async function processRecord(batch, message, dispatch, owner) {
124
+ const activeConsumer = consumer;
125
+ const activeProducer = producer;
126
+ if (!activeConsumer || !activeProducer || !owned(batch, owner))
127
+ return false;
128
+ const { topic, partition } = batch.batch;
129
+ const key = `${topic}\0${String(partition)}`;
130
+ const previous = attempts.get(key);
131
+ const attempt = previous?.offset === message.offset ? previous.count + 1 : 1;
132
+ attempts.set(key, { offset: message.offset, count: attempt });
133
+ const heartbeatFailure = Promise.withResolvers();
134
+ const heartbeat = setInterval(() => {
135
+ void batch.heartbeat().catch(error => heartbeatFailure.reject(error));
136
+ }, heartbeatInterval);
137
+ try {
138
+ await abortable(Promise.race([batch.heartbeat(), heartbeatFailure.promise]));
139
+ if (!owned(batch, owner))
140
+ return false;
141
+ const delivery = decodeDelivery(topic, message.value?.toString('utf8') ?? '', attempt);
142
+ const outcome = await abortable(Promise.race([dispatch(delivery), heartbeatFailure.promise]));
143
+ if (!owned(batch, owner))
144
+ return false;
145
+ if (outcome.settlement.kind === 'retry') {
146
+ retry(batch, message.offset, owner, boundedInteger(outcome.settlement.afterMs, 'retry delay', 0));
147
+ return false;
148
+ }
149
+ if (outcome.settlement.kind === 'dead') {
150
+ await abortable(activeProducer.send({
151
+ topic: deadLetterTopic,
152
+ acks: -1,
153
+ messages: [
154
+ {
155
+ key: message.key,
156
+ value: message.value,
157
+ headers: {
158
+ ...message.headers,
159
+ 'zmdb-source-topic': topic,
160
+ 'zmdb-source-partition': String(partition),
161
+ 'zmdb-source-offset': message.offset,
162
+ 'zmdb-delivery-attempt': String(attempt),
163
+ 'zmdb-dead-reason': outcome.settlement.reason,
164
+ },
165
+ },
166
+ ],
167
+ }));
168
+ }
169
+ if (!owned(batch, owner))
170
+ return false;
171
+ await abortable(batch.heartbeat());
172
+ if (!owned(batch, owner))
173
+ return false;
174
+ await abortable(activeConsumer.commitOffsets([{ topic, partition, offset: (BigInt(message.offset) + 1n).toString() }]));
175
+ if (!owned(batch, owner))
176
+ return false;
177
+ batch.resolveOffset(message.offset);
178
+ attempts.delete(key);
179
+ return true;
180
+ }
181
+ catch (error) {
182
+ if (!cancelled.signal.aborted) {
183
+ report(error);
184
+ retry(batch, message.offset, owner, errorRetryMs);
185
+ }
186
+ return false;
187
+ }
188
+ finally {
189
+ clearInterval(heartbeat);
190
+ }
191
+ }
192
+ const strategy = {
193
+ name,
194
+ capabilities: { redelivery: true, deadLetter: true, requestResponse: false },
195
+ async listen(dispatch) {
196
+ if (phase === 'closing' || phase === 'closed')
197
+ throw closedError();
198
+ if (phase !== 'idle')
199
+ throw new Error('@zmdb/transport-kafka: strategy is already listening');
200
+ phase = 'starting';
201
+ startup = (async () => {
202
+ try {
203
+ producer = client.producer({ allowAutoTopicCreation: false });
204
+ consumer = client.consumer({ groupId, allowAutoTopicCreation: false, sessionTimeout, heartbeatInterval });
205
+ removeListeners.push(consumer.on(consumer.events.REBALANCING, invalidate), consumer.on(consumer.events.GROUP_JOIN, invalidate), consumer.on(consumer.events.CRASH, event => {
206
+ invalidate();
207
+ report(event.payload.error);
208
+ }));
209
+ await abortable(producer.connect());
210
+ if (phase !== 'starting')
211
+ throw closedError();
212
+ await abortable(consumer.connect());
213
+ if (phase !== 'starting')
214
+ throw closedError();
215
+ await abortable(consumer.subscribe({ topics, fromBeginning }));
216
+ if (phase !== 'starting')
217
+ throw closedError();
218
+ phase = 'listening';
219
+ await abortable(consumer.run({
220
+ autoCommit: false,
221
+ eachBatchAutoResolve: false,
222
+ partitionsConsumedConcurrently: concurrency,
223
+ eachBatch: batch => track((async () => {
224
+ const owner = generation;
225
+ for (const message of batch.batch.messages) {
226
+ if (phase !== 'listening' || !owned(batch, owner))
227
+ break;
228
+ if (!(await processRecord(batch, message, dispatch, owner)))
229
+ break;
230
+ }
231
+ })()),
232
+ }));
233
+ if (phase !== 'listening')
234
+ throw closedError();
235
+ }
236
+ catch (error) {
237
+ phase = 'closed';
238
+ invalidate();
239
+ await disconnect().catch(report);
240
+ throw error;
241
+ }
242
+ })();
243
+ await startup;
244
+ },
245
+ async send() {
246
+ throw new TransportUnsupportedError(name);
247
+ },
248
+ async emit(pattern, payload, carrier) {
249
+ if (phase === 'closing' || phase === 'closed')
250
+ throw closedError();
251
+ if (phase !== 'listening' || !producer)
252
+ throw new Error('@zmdb/transport-kafka: strategy is not listening');
253
+ const topic = topicName(pattern);
254
+ const value = encodeDelivery(payload, carrier);
255
+ await track(abortable(producer.send({ topic, acks: -1, messages: [{ value }] })).then(() => undefined));
256
+ },
257
+ async close(graceMs) {
258
+ boundedInteger(graceMs, 'close grace', 0);
259
+ if (phase === 'closed')
260
+ return;
261
+ if (closing)
262
+ return closing;
263
+ phase = 'closing';
264
+ cancelRetries(false);
265
+ closing = (async () => {
266
+ const graceful = (async () => {
267
+ await startup?.catch(() => undefined);
268
+ if (disconnected)
269
+ return;
270
+ consumer?.pause(topics.map(topic => ({ topic })));
271
+ await Promise.all(tasks);
272
+ await consumer?.stop();
273
+ await disconnect();
274
+ })();
275
+ let timedOut = false;
276
+ try {
277
+ timedOut = !(await withinGrace(graceful, graceMs));
278
+ }
279
+ finally {
280
+ phase = 'closed';
281
+ cancelled.abort(closedError());
282
+ invalidate();
283
+ void disconnect().catch(report);
284
+ }
285
+ if (timedOut)
286
+ throw new Error(`@zmdb/transport-kafka: strategy did not drain within ${String(graceMs)}ms`);
287
+ })();
288
+ await closing;
289
+ },
290
+ };
291
+ return strategy;
292
+ }
293
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@zmdb/transport-kafka",
3
+ "version": "1.0.0-beta.1",
4
+ "description": "Kafka event transport with ordered manual offsets, partition retries and bounded application lifecycle.",
5
+ "keywords": [
6
+ "kafka",
7
+ "messaging",
8
+ "transport",
9
+ "typescript",
10
+ "zmdb"
11
+ ],
12
+ "homepage": "https://github.com/ambasta/zmdb#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/ambasta/zmdb/issues"
15
+ },
16
+ "license": "GPL-3.0-or-later",
17
+ "author": "zmdb contributors",
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/ambasta/zmdb.git",
21
+ "directory": "packages/transport-kafka"
22
+ },
23
+ "type": "module",
24
+ "sideEffects": false,
25
+ "exports": {
26
+ ".": {
27
+ "types": "./dist/index.d.ts",
28
+ "import": "./dist/index.js"
29
+ }
30
+ },
31
+ "publishConfig": {
32
+ "access": "public",
33
+ "tag": "beta"
34
+ },
35
+ "scripts": {
36
+ "build": "node ../../scripts/build-package.mjs",
37
+ "test": "vitest run"
38
+ },
39
+ "peerDependencies": {
40
+ "@zmdb/app": "1.0.0-beta.1",
41
+ "kafkajs": ">=2.2.4 <3.0.0"
42
+ },
43
+ "engines": {
44
+ "node": ">=26"
45
+ },
46
+ "main": "./dist/index.js",
47
+ "types": "./dist/index.d.ts"
48
+ }