kafka-ts 0.0.2-beta → 0.0.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.
- package/.prettierrc +3 -2
- package/README.md +109 -39
- package/dist/api/api-versions.d.ts +9 -0
- package/dist/api/api-versions.js +24 -0
- package/dist/api/create-topics.d.ts +38 -0
- package/dist/api/create-topics.js +53 -0
- package/dist/api/delete-topics.d.ts +18 -0
- package/dist/api/delete-topics.js +33 -0
- package/dist/api/fetch.d.ts +84 -0
- package/dist/api/fetch.js +142 -0
- package/dist/api/find-coordinator.d.ts +21 -0
- package/dist/api/find-coordinator.js +39 -0
- package/dist/api/heartbeat.d.ts +11 -0
- package/dist/api/heartbeat.js +27 -0
- package/dist/api/index.d.ts +578 -0
- package/dist/api/index.js +165 -0
- package/dist/api/init-producer-id.d.ts +13 -0
- package/dist/api/init-producer-id.js +29 -0
- package/dist/api/join-group.d.ts +34 -0
- package/dist/api/join-group.js +51 -0
- package/dist/api/leave-group.d.ts +19 -0
- package/dist/api/leave-group.js +39 -0
- package/dist/api/list-offsets.d.ts +29 -0
- package/dist/api/list-offsets.js +48 -0
- package/dist/api/metadata.d.ts +40 -0
- package/dist/api/metadata.js +58 -0
- package/dist/api/offset-commit.d.ts +28 -0
- package/dist/api/offset-commit.js +48 -0
- package/dist/api/offset-fetch.d.ts +33 -0
- package/dist/api/offset-fetch.js +57 -0
- package/dist/api/produce.d.ts +54 -0
- package/dist/api/produce.js +126 -0
- package/dist/api/sasl-authenticate.d.ts +11 -0
- package/dist/api/sasl-authenticate.js +23 -0
- package/dist/api/sasl-handshake.d.ts +6 -0
- package/dist/api/sasl-handshake.js +19 -0
- package/dist/api/sync-group.d.ts +24 -0
- package/dist/api/sync-group.js +36 -0
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.js +8 -0
- package/dist/auth/plain.d.ts +5 -0
- package/dist/auth/plain.js +12 -0
- package/dist/auth/scram.d.ts +9 -0
- package/dist/auth/scram.js +40 -0
- package/dist/broker.d.ts +30 -0
- package/dist/broker.js +55 -0
- package/dist/client.d.ts +23 -0
- package/dist/client.js +36 -0
- package/dist/cluster.d.ts +27 -0
- package/dist/cluster.js +70 -0
- package/dist/cluster.test.d.ts +1 -0
- package/dist/cluster.test.js +345 -0
- package/dist/codecs/gzip.d.ts +2 -0
- package/dist/codecs/gzip.js +8 -0
- package/dist/codecs/index.d.ts +2 -0
- package/dist/codecs/index.js +17 -0
- package/dist/codecs/none.d.ts +2 -0
- package/dist/codecs/none.js +7 -0
- package/dist/codecs/types.d.ts +5 -0
- package/dist/codecs/types.js +2 -0
- package/dist/connection.d.ts +26 -0
- package/dist/connection.js +175 -0
- package/dist/consumer/consumer-group.d.ts +41 -0
- package/dist/consumer/consumer-group.js +217 -0
- package/dist/consumer/consumer-metadata.d.ts +7 -0
- package/dist/consumer/consumer-metadata.js +14 -0
- package/dist/consumer/consumer.d.ts +44 -0
- package/dist/consumer/consumer.js +225 -0
- package/dist/consumer/fetch-manager.d.ts +33 -0
- package/dist/consumer/fetch-manager.js +140 -0
- package/dist/consumer/fetcher.d.ts +25 -0
- package/dist/consumer/fetcher.js +64 -0
- package/dist/consumer/offset-manager.d.ts +22 -0
- package/dist/consumer/offset-manager.js +66 -0
- package/dist/consumer/processor.d.ts +19 -0
- package/dist/consumer/processor.js +59 -0
- package/dist/distributors/assignments-to-replicas.d.ts +16 -0
- package/dist/distributors/assignments-to-replicas.js +59 -0
- package/dist/distributors/assignments-to-replicas.test.d.ts +1 -0
- package/dist/distributors/assignments-to-replicas.test.js +40 -0
- package/dist/distributors/messages-to-topic-partition-leaders.d.ts +17 -0
- package/dist/distributors/messages-to-topic-partition-leaders.js +15 -0
- package/dist/distributors/messages-to-topic-partition-leaders.test.d.ts +1 -0
- package/dist/distributors/messages-to-topic-partition-leaders.test.js +30 -0
- package/dist/distributors/partitioner.d.ts +7 -0
- package/dist/distributors/partitioner.js +23 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +26 -0
- package/dist/metadata.d.ts +24 -0
- package/dist/metadata.js +106 -0
- package/dist/producer/producer.d.ts +24 -0
- package/dist/producer/producer.js +131 -0
- package/dist/types.d.ts +11 -0
- package/dist/types.js +2 -0
- package/dist/utils/api.d.ts +9 -0
- package/dist/utils/api.js +5 -0
- package/dist/utils/crypto.d.ts +8 -0
- package/dist/utils/crypto.js +18 -0
- package/dist/utils/decoder.d.ts +30 -0
- package/dist/utils/decoder.js +152 -0
- package/dist/utils/delay.d.ts +1 -0
- package/dist/utils/delay.js +5 -0
- package/dist/utils/encoder.d.ts +28 -0
- package/dist/utils/encoder.js +125 -0
- package/dist/utils/error.d.ts +11 -0
- package/dist/utils/error.js +27 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.js +32 -0
- package/dist/utils/memo.d.ts +1 -0
- package/dist/utils/memo.js +16 -0
- package/dist/utils/murmur2.d.ts +3 -0
- package/dist/utils/murmur2.js +40 -0
- package/dist/utils/retrier.d.ts +10 -0
- package/dist/utils/retrier.js +22 -0
- package/dist/utils/tracer.d.ts +5 -0
- package/dist/utils/tracer.js +39 -0
- package/package.json +30 -19
- package/src/__snapshots__/{request-handler.test.ts.snap → cluster.test.ts.snap} +329 -26
- package/src/api/api-versions.ts +2 -2
- package/src/api/create-topics.ts +2 -2
- package/src/api/delete-topics.ts +2 -2
- package/src/api/fetch.ts +86 -31
- package/src/api/find-coordinator.ts +2 -2
- package/src/api/heartbeat.ts +2 -2
- package/src/api/index.ts +21 -19
- package/src/api/init-producer-id.ts +2 -2
- package/src/api/join-group.ts +3 -3
- package/src/api/leave-group.ts +2 -2
- package/src/api/list-offsets.ts +3 -3
- package/src/api/metadata.ts +3 -3
- package/src/api/offset-commit.ts +2 -2
- package/src/api/offset-fetch.ts +2 -2
- package/src/api/produce.ts +17 -20
- package/src/api/sasl-authenticate.ts +2 -2
- package/src/api/sasl-handshake.ts +2 -2
- package/src/api/sync-group.ts +2 -2
- package/src/auth/index.ts +2 -0
- package/src/auth/plain.ts +10 -0
- package/src/auth/scram.ts +52 -0
- package/src/broker.ts +12 -14
- package/src/client.ts +7 -7
- package/src/cluster.test.ts +78 -74
- package/src/cluster.ts +43 -45
- package/src/codecs/gzip.ts +9 -0
- package/src/codecs/index.ts +16 -0
- package/src/codecs/none.ts +6 -0
- package/src/codecs/types.ts +4 -0
- package/src/connection.ts +49 -33
- package/src/consumer/consumer-group.ts +57 -35
- package/src/consumer/consumer-metadata.ts +2 -2
- package/src/consumer/consumer.ts +115 -92
- package/src/consumer/fetch-manager.ts +169 -0
- package/src/consumer/fetcher.ts +64 -0
- package/src/consumer/offset-manager.ts +24 -13
- package/src/consumer/processor.ts +53 -0
- package/src/distributors/assignments-to-replicas.test.ts +7 -7
- package/src/distributors/assignments-to-replicas.ts +2 -4
- package/src/distributors/messages-to-topic-partition-leaders.test.ts +6 -6
- package/src/distributors/partitioner.ts +27 -0
- package/src/index.ts +9 -3
- package/src/metadata.ts +8 -4
- package/src/producer/producer.ts +30 -20
- package/src/types.ts +5 -3
- package/src/utils/api.ts +5 -5
- package/src/utils/crypto.ts +15 -0
- package/src/utils/decoder.ts +14 -8
- package/src/utils/encoder.ts +34 -27
- package/src/utils/error.ts +3 -3
- package/src/utils/logger.ts +37 -0
- package/src/utils/murmur2.ts +44 -0
- package/src/utils/retrier.ts +1 -1
- package/src/utils/tracer.ts +41 -20
- package/tsconfig.json +16 -16
- package/.github/workflows/release.yml +0 -17
- package/certs/ca.crt +0 -29
- package/certs/ca.key +0 -52
- package/certs/ca.srl +0 -1
- package/certs/kafka.crt +0 -29
- package/certs/kafka.csr +0 -26
- package/certs/kafka.key +0 -52
- package/certs/kafka.keystore.jks +0 -0
- package/certs/kafka.truststore.jks +0 -0
- package/docker-compose.yml +0 -104
- package/examples/package-lock.json +0 -31
- package/examples/package.json +0 -14
- package/examples/src/client.ts +0 -9
- package/examples/src/consumer.ts +0 -17
- package/examples/src/create-topic.ts +0 -37
- package/examples/src/producer.ts +0 -24
- package/examples/src/replicator.ts +0 -25
- package/examples/src/utils/json.ts +0 -1
- package/examples/tsconfig.json +0 -7
- package/log4j.properties +0 -95
- package/scripts/generate-certs.sh +0 -24
- package/src/utils/debug.ts +0 -9
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Encoder = void 0;
|
|
4
|
+
class Encoder {
|
|
5
|
+
chunks = [];
|
|
6
|
+
getChunks() {
|
|
7
|
+
return this.chunks;
|
|
8
|
+
}
|
|
9
|
+
getByteLength() {
|
|
10
|
+
return this.chunks.reduce((acc, chunk) => acc + chunk.byteLength, 0);
|
|
11
|
+
}
|
|
12
|
+
write(...buffers) {
|
|
13
|
+
this.chunks.push(...buffers);
|
|
14
|
+
return this;
|
|
15
|
+
}
|
|
16
|
+
writeEncoder(encoder) {
|
|
17
|
+
return this.write(...encoder.getChunks());
|
|
18
|
+
}
|
|
19
|
+
writeInt8(value) {
|
|
20
|
+
const buffer = Buffer.allocUnsafe(1);
|
|
21
|
+
buffer.writeInt8(value);
|
|
22
|
+
return this.write(buffer);
|
|
23
|
+
}
|
|
24
|
+
writeInt16(value) {
|
|
25
|
+
const buffer = Buffer.allocUnsafe(2);
|
|
26
|
+
buffer.writeInt16BE(value);
|
|
27
|
+
return this.write(buffer);
|
|
28
|
+
}
|
|
29
|
+
writeInt32(value) {
|
|
30
|
+
const buffer = Buffer.allocUnsafe(4);
|
|
31
|
+
buffer.writeInt32BE(value);
|
|
32
|
+
return this.write(buffer);
|
|
33
|
+
}
|
|
34
|
+
writeUInt32(value) {
|
|
35
|
+
const buffer = Buffer.allocUnsafe(4);
|
|
36
|
+
buffer.writeUInt32BE(value);
|
|
37
|
+
return this.write(buffer);
|
|
38
|
+
}
|
|
39
|
+
writeInt64(value) {
|
|
40
|
+
const buffer = Buffer.allocUnsafe(8);
|
|
41
|
+
buffer.writeBigInt64BE(value);
|
|
42
|
+
return this.write(buffer);
|
|
43
|
+
}
|
|
44
|
+
writeUVarInt(value) {
|
|
45
|
+
const byteArray = [];
|
|
46
|
+
while ((value & 0xffffffff) !== 0) {
|
|
47
|
+
byteArray.push((value & 0x7f) | 0x80);
|
|
48
|
+
value >>>= 7;
|
|
49
|
+
}
|
|
50
|
+
byteArray.push(value & 0x7f);
|
|
51
|
+
return this.write(Buffer.from(byteArray));
|
|
52
|
+
}
|
|
53
|
+
writeVarInt(value) {
|
|
54
|
+
const encodedValue = (value << 1) ^ (value >> 31);
|
|
55
|
+
return this.writeUVarInt(encodedValue);
|
|
56
|
+
}
|
|
57
|
+
writeUVarLong(value) {
|
|
58
|
+
const byteArray = [];
|
|
59
|
+
while ((value & BigInt(0xffffffffffffffff)) !== BigInt(0)) {
|
|
60
|
+
byteArray.push(Number((value & BigInt(0x7f)) | BigInt(0x80)));
|
|
61
|
+
value = value >> BigInt(7);
|
|
62
|
+
}
|
|
63
|
+
byteArray.push(Number(value));
|
|
64
|
+
return this.write(Buffer.from(byteArray));
|
|
65
|
+
}
|
|
66
|
+
writeVarLong(value) {
|
|
67
|
+
const encodedValue = (value << BigInt(1)) ^ (value >> BigInt(63));
|
|
68
|
+
return this.writeUVarLong(encodedValue);
|
|
69
|
+
}
|
|
70
|
+
writeString(value) {
|
|
71
|
+
if (value === null) {
|
|
72
|
+
return this.writeInt16(-1);
|
|
73
|
+
}
|
|
74
|
+
const byteLength = Buffer.byteLength(value, 'utf-8');
|
|
75
|
+
const buffer = Buffer.allocUnsafe(byteLength);
|
|
76
|
+
buffer.write(value, 0, byteLength, 'utf-8');
|
|
77
|
+
return this.writeInt16(byteLength).write(buffer);
|
|
78
|
+
}
|
|
79
|
+
writeCompactString(value) {
|
|
80
|
+
if (value === null) {
|
|
81
|
+
return this.writeUVarInt(0);
|
|
82
|
+
}
|
|
83
|
+
const byteLength = Buffer.byteLength(value, 'utf-8');
|
|
84
|
+
const buffer = Buffer.allocUnsafe(byteLength);
|
|
85
|
+
buffer.write(value, 0, byteLength, 'utf-8');
|
|
86
|
+
return this.writeUVarInt(byteLength + 1).write(buffer);
|
|
87
|
+
}
|
|
88
|
+
writeVarIntBuffer(buffer) {
|
|
89
|
+
if (buffer === null) {
|
|
90
|
+
return this.writeVarInt(-1);
|
|
91
|
+
}
|
|
92
|
+
return this.writeVarInt(buffer.byteLength).write(buffer);
|
|
93
|
+
}
|
|
94
|
+
writeUUID(value) {
|
|
95
|
+
if (value === null) {
|
|
96
|
+
return this.write(Buffer.alloc(16));
|
|
97
|
+
}
|
|
98
|
+
return this.write(Buffer.from(value, 'hex'));
|
|
99
|
+
}
|
|
100
|
+
writeBoolean(value) {
|
|
101
|
+
return this.writeInt8(value ? 1 : 0);
|
|
102
|
+
}
|
|
103
|
+
writeArray(arr, callback) {
|
|
104
|
+
return this.writeInt32(arr.length).write(...arr.flatMap((item) => callback(new Encoder(), item).getChunks()));
|
|
105
|
+
}
|
|
106
|
+
writeCompactArray(arr, callback) {
|
|
107
|
+
if (arr === null) {
|
|
108
|
+
return this.writeUVarInt(0);
|
|
109
|
+
}
|
|
110
|
+
return this.writeUVarInt(arr.length + 1).write(...arr.flatMap((item) => callback(new Encoder(), item).getChunks()));
|
|
111
|
+
}
|
|
112
|
+
writeVarIntArray(arr, callback) {
|
|
113
|
+
return this.writeVarInt(arr.length).write(...arr.flatMap((item) => callback(new Encoder(), item).getChunks()));
|
|
114
|
+
}
|
|
115
|
+
writeBytes(value) {
|
|
116
|
+
return this.writeInt32(value.length).write(value);
|
|
117
|
+
}
|
|
118
|
+
writeCompactBytes(value) {
|
|
119
|
+
return this.writeUVarInt(value.length + 1).write(value);
|
|
120
|
+
}
|
|
121
|
+
value() {
|
|
122
|
+
return Buffer.concat(this.chunks);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
exports.Encoder = Encoder;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare class KafkaTSError extends Error {
|
|
2
|
+
constructor(message: string);
|
|
3
|
+
}
|
|
4
|
+
export declare class KafkaTSApiError<T = any> extends KafkaTSError {
|
|
5
|
+
errorCode: number;
|
|
6
|
+
errorMessage: string | null;
|
|
7
|
+
response: T;
|
|
8
|
+
constructor(errorCode: number, errorMessage: string | null, response: T);
|
|
9
|
+
}
|
|
10
|
+
export declare class ConnectionError extends KafkaTSError {
|
|
11
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConnectionError = exports.KafkaTSApiError = exports.KafkaTSError = void 0;
|
|
4
|
+
const api_1 = require("../api");
|
|
5
|
+
class KafkaTSError extends Error {
|
|
6
|
+
constructor(message) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = this.constructor.name;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
exports.KafkaTSError = KafkaTSError;
|
|
12
|
+
class KafkaTSApiError extends KafkaTSError {
|
|
13
|
+
errorCode;
|
|
14
|
+
errorMessage;
|
|
15
|
+
response;
|
|
16
|
+
constructor(errorCode, errorMessage, response) {
|
|
17
|
+
const [errorName] = Object.entries(api_1.API_ERROR).find(([, value]) => value === errorCode) ?? ['UNKNOWN'];
|
|
18
|
+
super(`${errorName}${errorMessage ? `: ${errorMessage}` : ''}`);
|
|
19
|
+
this.errorCode = errorCode;
|
|
20
|
+
this.errorMessage = errorMessage;
|
|
21
|
+
this.response = response;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.KafkaTSApiError = KafkaTSApiError;
|
|
25
|
+
class ConnectionError extends KafkaTSError {
|
|
26
|
+
}
|
|
27
|
+
exports.ConnectionError = ConnectionError;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface Logger {
|
|
2
|
+
debug: (message: string, metadata?: unknown) => void;
|
|
3
|
+
info: (message: string, metadata?: unknown) => void;
|
|
4
|
+
warn: (message: string, metadata?: unknown) => void;
|
|
5
|
+
error: (message: string, metadata?: unknown) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare const jsonSerializer: (_: unknown, v: unknown) => unknown;
|
|
8
|
+
export declare let log: Logger;
|
|
9
|
+
export declare const setLogger: (newLogger: Logger) => void;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setLogger = exports.log = exports.jsonSerializer = void 0;
|
|
4
|
+
const jsonSerializer = (_, v) => {
|
|
5
|
+
if (v instanceof Error) {
|
|
6
|
+
return { name: v.name, message: v.message, stack: v.stack, cause: v.cause };
|
|
7
|
+
}
|
|
8
|
+
if (typeof v === 'bigint') {
|
|
9
|
+
return v.toString();
|
|
10
|
+
}
|
|
11
|
+
return v;
|
|
12
|
+
};
|
|
13
|
+
exports.jsonSerializer = jsonSerializer;
|
|
14
|
+
class JsonLogger {
|
|
15
|
+
debug(message, metadata) {
|
|
16
|
+
console.debug(JSON.stringify({ message, metadata, level: 'debug' }, exports.jsonSerializer));
|
|
17
|
+
}
|
|
18
|
+
info(message, metadata) {
|
|
19
|
+
console.info(JSON.stringify({ message, metadata, level: 'info' }, exports.jsonSerializer));
|
|
20
|
+
}
|
|
21
|
+
warn(message, metadata) {
|
|
22
|
+
console.warn(JSON.stringify({ message, metadata, level: 'warning' }, exports.jsonSerializer));
|
|
23
|
+
}
|
|
24
|
+
error(message, metadata) {
|
|
25
|
+
console.error(JSON.stringify({ message, metadata, level: 'error' }, exports.jsonSerializer));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.log = new JsonLogger();
|
|
29
|
+
const setLogger = (newLogger) => {
|
|
30
|
+
exports.log = newLogger;
|
|
31
|
+
};
|
|
32
|
+
exports.setLogger = setLogger;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const memo: <T extends (...args: any[]) => any>(fn: T) => (...args: Parameters<T>) => ReturnType<T>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.memo = void 0;
|
|
4
|
+
const memo = (fn) => {
|
|
5
|
+
const cache = {};
|
|
6
|
+
return (...args) => {
|
|
7
|
+
const key = JSON.stringify(args);
|
|
8
|
+
if (cache[key]) {
|
|
9
|
+
return cache[key];
|
|
10
|
+
}
|
|
11
|
+
const result = fn(...args);
|
|
12
|
+
cache[key] = result;
|
|
13
|
+
return result;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
exports.memo = memo;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* https://github.com/apache/kafka/blob/0.10.2/clients/src/main/java/org/apache/kafka/common/utils/Utils.java#L364 */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.toPositive = exports.murmur2 = void 0;
|
|
5
|
+
const murmur2 = (data) => {
|
|
6
|
+
const length = data.length;
|
|
7
|
+
const seed = 0x9747b28c;
|
|
8
|
+
const m = 0x5bd1e995;
|
|
9
|
+
const r = 24;
|
|
10
|
+
let h = seed ^ length;
|
|
11
|
+
let length4 = Math.floor(length / 4);
|
|
12
|
+
for (let i = 0; i < length4; i++) {
|
|
13
|
+
const i4 = i * 4;
|
|
14
|
+
let k = (data[i4 + 0] & 0xff) +
|
|
15
|
+
((data[i4 + 1] & 0xff) << 8) +
|
|
16
|
+
((data[i4 + 2] & 0xff) << 16) +
|
|
17
|
+
((data[i4 + 3] & 0xff) << 24);
|
|
18
|
+
k *= m;
|
|
19
|
+
k ^= k >> r;
|
|
20
|
+
k *= m;
|
|
21
|
+
h *= m;
|
|
22
|
+
h ^= k;
|
|
23
|
+
}
|
|
24
|
+
switch (length % 4) {
|
|
25
|
+
case 3:
|
|
26
|
+
h = h ^ ((data[(length & ~3) + 2] & 0xff) << 16);
|
|
27
|
+
case 2:
|
|
28
|
+
h = h ^ ((data[(length & ~3) + 1] & 0xff) << 8);
|
|
29
|
+
case 1:
|
|
30
|
+
h = h ^ (data[length & ~3] & 0xff);
|
|
31
|
+
h *= m;
|
|
32
|
+
}
|
|
33
|
+
h ^= h >> 13;
|
|
34
|
+
h *= m;
|
|
35
|
+
h ^= h >> 15;
|
|
36
|
+
return h;
|
|
37
|
+
};
|
|
38
|
+
exports.murmur2 = murmur2;
|
|
39
|
+
const toPositive = (input) => input & 0x7fffffff;
|
|
40
|
+
exports.toPositive = toPositive;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type Retrier = (func: () => unknown) => Promise<void>;
|
|
2
|
+
export declare const createExponentialBackoffRetrier: (options: {
|
|
3
|
+
onFailure?: (error: unknown) => Promise<void>;
|
|
4
|
+
maxRetries?: number;
|
|
5
|
+
initialDelayMs?: number;
|
|
6
|
+
maxDelayMs?: number;
|
|
7
|
+
multiplier?: number;
|
|
8
|
+
retry?: number;
|
|
9
|
+
}) => Retrier;
|
|
10
|
+
export declare const defaultRetrier: Retrier;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.defaultRetrier = exports.createExponentialBackoffRetrier = void 0;
|
|
4
|
+
const delay_1 = require("./delay");
|
|
5
|
+
const createExponentialBackoffRetrier = (options) => async (func) => {
|
|
6
|
+
try {
|
|
7
|
+
await func();
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
const { retry = 0, maxRetries = 3, onFailure = (error) => {
|
|
11
|
+
throw error;
|
|
12
|
+
}, initialDelayMs = 100, maxDelayMs = 3000, multiplier = 2, } = options;
|
|
13
|
+
const isMaxRetriesExceeded = retry > maxRetries;
|
|
14
|
+
if (isMaxRetriesExceeded)
|
|
15
|
+
return onFailure(error);
|
|
16
|
+
const delayMs = Math.min(maxDelayMs, initialDelayMs * multiplier ** retry);
|
|
17
|
+
await (0, delay_1.delay)(delayMs);
|
|
18
|
+
return (0, exports.createExponentialBackoffRetrier)({ ...options, retry: retry + 1 })(func);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
exports.createExponentialBackoffRetrier = createExponentialBackoffRetrier;
|
|
22
|
+
exports.defaultRetrier = (0, exports.createExponentialBackoffRetrier)({});
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export interface Tracer {
|
|
2
|
+
startActiveSpan<T>(module: string, method: string, metadata: Record<string, unknown>, callback: () => T): T;
|
|
3
|
+
}
|
|
4
|
+
export declare const setTracer: <T>(newTracer: Tracer) => void;
|
|
5
|
+
export declare const createTracer: (module: string) => (fn?: (...args: any[]) => Record<string, unknown> | undefined) => (target: any, propertyKey: string, descriptor: PropertyDescriptor) => void;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createTracer = exports.setTracer = void 0;
|
|
4
|
+
const logger_1 = require("./logger");
|
|
5
|
+
class DebugTracer {
|
|
6
|
+
isEnabled = process.env.DEBUG?.includes('kafka-ts');
|
|
7
|
+
startActiveSpan(module, method, metadata, callback) {
|
|
8
|
+
if (!this.isEnabled) {
|
|
9
|
+
return callback();
|
|
10
|
+
}
|
|
11
|
+
const startTime = Date.now();
|
|
12
|
+
const onEnd = (result) => {
|
|
13
|
+
logger_1.log.debug(`[${module}.${method}] ${metadata?.message ?? ''} +${Date.now() - startTime}ms`, {
|
|
14
|
+
...metadata,
|
|
15
|
+
...(!!result && { result }),
|
|
16
|
+
});
|
|
17
|
+
return result;
|
|
18
|
+
};
|
|
19
|
+
const result = callback();
|
|
20
|
+
if (result instanceof Promise) {
|
|
21
|
+
return result.then(onEnd);
|
|
22
|
+
}
|
|
23
|
+
onEnd(result);
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
let tracer = new DebugTracer();
|
|
28
|
+
const setTracer = (newTracer) => {
|
|
29
|
+
tracer = newTracer;
|
|
30
|
+
};
|
|
31
|
+
exports.setTracer = setTracer;
|
|
32
|
+
const createTracer = (module) => (fn) => (target, propertyKey, descriptor) => {
|
|
33
|
+
const original = descriptor.value;
|
|
34
|
+
descriptor.value = function (...args) {
|
|
35
|
+
const metadata = fn?.(...args);
|
|
36
|
+
return tracer.startActiveSpan(module, propertyKey, { ...metadata }, () => original.apply(this, args));
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
exports.createTracer = createTracer;
|
package/package.json
CHANGED
|
@@ -1,21 +1,32 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
2
|
+
"name": "kafka-ts",
|
|
3
|
+
"version": "0.0.2",
|
|
4
|
+
"main": "dist/index.js",
|
|
5
|
+
"author": "Priit Käärd",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/priitkaard/kafka-ts.git"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"start": "docker-compose down && KAFKA_VERSION=3.7.1 docker-compose up -d && sleep 5 && bash ./scripts/create-scram-user.sh",
|
|
13
|
+
"version:beta": "npm version prerelease --preid=beta",
|
|
14
|
+
"version:patch": "npm version patch",
|
|
15
|
+
"format": "prettier --write .",
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"watch": "tsc -w",
|
|
18
|
+
"test": "vitest --testTimeout 60000 --bail 1"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@types/node": "^20.12.12",
|
|
22
|
+
"prettier": "^3.3.3",
|
|
23
|
+
"typescript": "^5.4.5",
|
|
24
|
+
"vitest": "^1.6.0"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"kafka",
|
|
28
|
+
"client",
|
|
29
|
+
"producer",
|
|
30
|
+
"consumer"
|
|
31
|
+
]
|
|
21
32
|
}
|