kafka-ts 0.0.1-beta → 0.0.1-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.
Files changed (195) hide show
  1. package/.github/workflows/release.yml +17 -0
  2. package/.prettierrc +3 -2
  3. package/LICENSE +1 -1
  4. package/README.md +56 -35
  5. package/docker-compose.yml +108 -102
  6. package/examples/package-lock.json +28 -27
  7. package/examples/package.json +12 -12
  8. package/examples/src/client.ts +6 -6
  9. package/examples/src/consumer.ts +9 -8
  10. package/examples/src/create-topic.ts +22 -16
  11. package/examples/src/producer.ts +7 -7
  12. package/examples/src/replicator.ts +4 -4
  13. package/examples/src/utils/delay.ts +1 -0
  14. package/examples/src/utils/json.ts +1 -1
  15. package/examples/tsconfig.json +2 -2
  16. package/package.json +22 -15
  17. package/scripts/create-scram-user.sh +5 -0
  18. package/scripts/generate-certs.sh +1 -0
  19. package/scripts/kafka-local.properties +33 -0
  20. package/src/__snapshots__/request-handler.test.ts.snap +9 -718
  21. package/src/api/api-versions.ts +2 -2
  22. package/src/api/create-topics.ts +2 -2
  23. package/src/api/delete-topics.ts +2 -2
  24. package/src/api/fetch.ts +3 -3
  25. package/src/api/find-coordinator.ts +2 -2
  26. package/src/api/heartbeat.ts +2 -2
  27. package/src/api/index.ts +18 -18
  28. package/src/api/init-producer-id.ts +2 -2
  29. package/src/api/join-group.ts +3 -3
  30. package/src/api/leave-group.ts +2 -2
  31. package/src/api/list-offsets.ts +3 -3
  32. package/src/api/metadata.ts +3 -3
  33. package/src/api/offset-commit.ts +2 -2
  34. package/src/api/offset-fetch.ts +2 -2
  35. package/src/api/produce.ts +3 -3
  36. package/src/api/sasl-authenticate.ts +2 -2
  37. package/src/api/sasl-handshake.ts +2 -2
  38. package/src/api/sync-group.ts +2 -2
  39. package/src/auth/index.ts +2 -0
  40. package/src/auth/plain.ts +10 -0
  41. package/src/auth/scram.ts +52 -0
  42. package/src/broker.ts +12 -14
  43. package/src/client.ts +7 -7
  44. package/src/{request-handler.test.ts → cluster.test.ts} +73 -69
  45. package/src/cluster.ts +8 -8
  46. package/src/connection.ts +17 -15
  47. package/src/consumer/consumer-group.ts +14 -14
  48. package/src/consumer/consumer-metadata.ts +2 -2
  49. package/src/consumer/consumer.ts +84 -82
  50. package/src/consumer/fetch-manager.ts +179 -0
  51. package/src/consumer/fetcher.ts +57 -0
  52. package/src/consumer/offset-manager.ts +6 -6
  53. package/src/consumer/processor.ts +47 -0
  54. package/src/distributors/assignments-to-replicas.test.ts +7 -7
  55. package/src/distributors/assignments-to-replicas.ts +1 -1
  56. package/src/distributors/messages-to-topic-partition-leaders.test.ts +6 -6
  57. package/src/index.ts +6 -3
  58. package/src/metadata.ts +4 -4
  59. package/src/producer/producer.ts +8 -8
  60. package/src/types.ts +2 -0
  61. package/src/utils/api.ts +4 -4
  62. package/src/utils/crypto.ts +15 -0
  63. package/src/utils/debug.ts +2 -2
  64. package/src/utils/decoder.ts +4 -4
  65. package/src/utils/encoder.ts +6 -6
  66. package/src/utils/error.ts +3 -3
  67. package/src/utils/retrier.ts +1 -1
  68. package/src/utils/tracer.ts +7 -4
  69. package/tsconfig.json +16 -16
  70. package/dist/api/api-versions.d.ts +0 -9
  71. package/dist/api/api-versions.js +0 -24
  72. package/dist/api/create-topics.d.ts +0 -38
  73. package/dist/api/create-topics.js +0 -53
  74. package/dist/api/delete-topics.d.ts +0 -18
  75. package/dist/api/delete-topics.js +0 -33
  76. package/dist/api/fetch.d.ts +0 -77
  77. package/dist/api/fetch.js +0 -106
  78. package/dist/api/find-coordinator.d.ts +0 -21
  79. package/dist/api/find-coordinator.js +0 -39
  80. package/dist/api/heartbeat.d.ts +0 -11
  81. package/dist/api/heartbeat.js +0 -27
  82. package/dist/api/index.d.ts +0 -573
  83. package/dist/api/index.js +0 -164
  84. package/dist/api/init-producer-id.d.ts +0 -13
  85. package/dist/api/init-producer-id.js +0 -29
  86. package/dist/api/join-group.d.ts +0 -34
  87. package/dist/api/join-group.js +0 -51
  88. package/dist/api/leave-group.d.ts +0 -19
  89. package/dist/api/leave-group.js +0 -39
  90. package/dist/api/list-offsets.d.ts +0 -29
  91. package/dist/api/list-offsets.js +0 -48
  92. package/dist/api/metadata.d.ts +0 -40
  93. package/dist/api/metadata.js +0 -58
  94. package/dist/api/offset-commit.d.ts +0 -28
  95. package/dist/api/offset-commit.js +0 -48
  96. package/dist/api/offset-fetch.d.ts +0 -33
  97. package/dist/api/offset-fetch.js +0 -57
  98. package/dist/api/produce.d.ts +0 -53
  99. package/dist/api/produce.js +0 -129
  100. package/dist/api/sasl-authenticate.d.ts +0 -11
  101. package/dist/api/sasl-authenticate.js +0 -23
  102. package/dist/api/sasl-handshake.d.ts +0 -6
  103. package/dist/api/sasl-handshake.js +0 -19
  104. package/dist/api/sync-group.d.ts +0 -24
  105. package/dist/api/sync-group.js +0 -36
  106. package/dist/broker.d.ts +0 -29
  107. package/dist/broker.js +0 -60
  108. package/dist/client.d.ts +0 -23
  109. package/dist/client.js +0 -36
  110. package/dist/cluster.d.ts +0 -24
  111. package/dist/cluster.js +0 -72
  112. package/dist/connection.d.ts +0 -25
  113. package/dist/connection.js +0 -155
  114. package/dist/consumer/consumer-group.d.ts +0 -36
  115. package/dist/consumer/consumer-group.js +0 -182
  116. package/dist/consumer/consumer-metadata.d.ts +0 -7
  117. package/dist/consumer/consumer-metadata.js +0 -14
  118. package/dist/consumer/consumer.d.ts +0 -37
  119. package/dist/consumer/consumer.js +0 -178
  120. package/dist/consumer/metadata.d.ts +0 -24
  121. package/dist/consumer/metadata.js +0 -64
  122. package/dist/consumer/offset-manager.d.ts +0 -22
  123. package/dist/consumer/offset-manager.js +0 -56
  124. package/dist/distributors/assignments-to-replicas.d.ts +0 -17
  125. package/dist/distributors/assignments-to-replicas.js +0 -60
  126. package/dist/distributors/assignments-to-replicas.test.d.ts +0 -1
  127. package/dist/distributors/assignments-to-replicas.test.js +0 -40
  128. package/dist/distributors/messages-to-topic-partition-leaders.d.ts +0 -17
  129. package/dist/distributors/messages-to-topic-partition-leaders.js +0 -15
  130. package/dist/distributors/messages-to-topic-partition-leaders.test.d.ts +0 -1
  131. package/dist/distributors/messages-to-topic-partition-leaders.test.js +0 -30
  132. package/dist/examples/src/replicator.js +0 -34
  133. package/dist/examples/src/utils/json.js +0 -5
  134. package/dist/index.d.ts +0 -3
  135. package/dist/index.js +0 -19
  136. package/dist/metadata.d.ts +0 -24
  137. package/dist/metadata.js +0 -89
  138. package/dist/producer/producer.d.ts +0 -19
  139. package/dist/producer/producer.js +0 -111
  140. package/dist/request-handler.d.ts +0 -16
  141. package/dist/request-handler.js +0 -67
  142. package/dist/request-handler.test.d.ts +0 -1
  143. package/dist/request-handler.test.js +0 -340
  144. package/dist/src/api/api-versions.js +0 -18
  145. package/dist/src/api/create-topics.js +0 -46
  146. package/dist/src/api/delete-topics.js +0 -26
  147. package/dist/src/api/fetch.js +0 -95
  148. package/dist/src/api/find-coordinator.js +0 -34
  149. package/dist/src/api/heartbeat.js +0 -22
  150. package/dist/src/api/index.js +0 -38
  151. package/dist/src/api/init-producer-id.js +0 -24
  152. package/dist/src/api/join-group.js +0 -48
  153. package/dist/src/api/leave-group.js +0 -30
  154. package/dist/src/api/list-offsets.js +0 -39
  155. package/dist/src/api/metadata.js +0 -47
  156. package/dist/src/api/offset-commit.js +0 -39
  157. package/dist/src/api/offset-fetch.js +0 -44
  158. package/dist/src/api/produce.js +0 -119
  159. package/dist/src/api/sync-group.js +0 -31
  160. package/dist/src/broker.js +0 -35
  161. package/dist/src/connection.js +0 -21
  162. package/dist/src/consumer/consumer-group.js +0 -131
  163. package/dist/src/consumer/consumer.js +0 -103
  164. package/dist/src/consumer/metadata.js +0 -52
  165. package/dist/src/consumer/offset-manager.js +0 -23
  166. package/dist/src/index.js +0 -19
  167. package/dist/src/producer/producer.js +0 -84
  168. package/dist/src/request-handler.js +0 -57
  169. package/dist/src/request-handler.test.js +0 -321
  170. package/dist/src/types.js +0 -2
  171. package/dist/src/utils/api.js +0 -5
  172. package/dist/src/utils/decoder.js +0 -161
  173. package/dist/src/utils/encoder.js +0 -137
  174. package/dist/src/utils/error.js +0 -10
  175. package/dist/types.d.ts +0 -9
  176. package/dist/types.js +0 -2
  177. package/dist/utils/api.d.ts +0 -9
  178. package/dist/utils/api.js +0 -5
  179. package/dist/utils/debug.d.ts +0 -2
  180. package/dist/utils/debug.js +0 -11
  181. package/dist/utils/decoder.d.ts +0 -29
  182. package/dist/utils/decoder.js +0 -147
  183. package/dist/utils/delay.d.ts +0 -1
  184. package/dist/utils/delay.js +0 -5
  185. package/dist/utils/encoder.d.ts +0 -28
  186. package/dist/utils/encoder.js +0 -122
  187. package/dist/utils/error.d.ts +0 -11
  188. package/dist/utils/error.js +0 -27
  189. package/dist/utils/memo.d.ts +0 -1
  190. package/dist/utils/memo.js +0 -16
  191. package/dist/utils/retrier.d.ts +0 -10
  192. package/dist/utils/retrier.js +0 -22
  193. package/dist/utils/tracer.d.ts +0 -1
  194. package/dist/utils/tracer.js +0 -26
  195. package/examples/node_modules/.package-lock.json +0 -22
@@ -1,21 +1,22 @@
1
- import { randomBytes } from "crypto";
2
- import { readFileSync } from "fs";
3
- import { afterAll, beforeAll, describe, expect, it } from "vitest";
4
- import { API } from "./api";
5
- import { KEY_TYPE } from "./api/find-coordinator";
6
- import { createKafkaClient } from "./client";
7
- import { Cluster } from "./cluster";
8
- import { KafkaTSApiError } from "./utils/error";
1
+ import { randomBytes } from 'crypto';
2
+ import { readFileSync } from 'fs';
3
+ import { afterAll, beforeAll, describe, expect, it } from 'vitest';
4
+ import { API } from './api';
5
+ import { KEY_TYPE } from './api/find-coordinator';
6
+ import { saslPlain } from './auth';
7
+ import { createKafkaClient } from './client';
8
+ import { Cluster } from './cluster';
9
+ import { KafkaTSApiError } from './utils/error';
9
10
 
10
11
  export const kafka = createKafkaClient({
11
- clientId: "kafkats",
12
- bootstrapServers: [{ host: "localhost", port: 9092 }],
13
- sasl: { mechanism: "PLAIN", username: "admin", password: "admin" },
14
- ssl: { ca: readFileSync("./certs/ca.crt").toString() },
12
+ clientId: 'kafka-ts',
13
+ bootstrapServers: [{ host: 'localhost', port: 9092 }],
14
+ sasl: saslPlain({ username: 'admin', password: 'admin' }),
15
+ ssl: { ca: readFileSync('./certs/ca.crt').toString() },
15
16
  });
16
17
 
17
- describe.sequential("Request handler", () => {
18
- const groupId = randomBytes(16).toString("hex");
18
+ describe.sequential('Request handler', () => {
19
+ const groupId = randomBytes(16).toString('hex');
19
20
 
20
21
  let cluster: Cluster;
21
22
 
@@ -27,9 +28,9 @@ describe.sequential("Request handler", () => {
27
28
  allowTopicAutoCreation: false,
28
29
  includeTopicAuthorizedOperations: false,
29
30
  });
30
- if (metadataResult.topics.some((topic) => topic.name === "kafkats-test-topic")) {
31
+ if (metadataResult.topics.some((topic) => topic.name === 'kafka-ts-test-topic')) {
31
32
  await cluster.sendRequest(API.DELETE_TOPICS, {
32
- topics: [{ name: "kafkats-test-topic", topicId: null }],
33
+ topics: [{ name: 'kafka-ts-test-topic', topicId: null }],
33
34
  timeoutMs: 10000,
34
35
  });
35
36
  }
@@ -39,18 +40,18 @@ describe.sequential("Request handler", () => {
39
40
  await cluster.disconnect();
40
41
  });
41
42
 
42
- it("should request api versions", async () => {
43
+ it('should request api versions', async () => {
43
44
  const result = await cluster.sendRequest(API.API_VERSIONS, {});
44
45
  expect(result).toMatchSnapshot();
45
46
  });
46
47
 
47
- let topicId: string = "d6718d178e1b47c886441ad2d19faea5";
48
+ let topicId: string = 'd6718d178e1b47c886441ad2d19faea5';
48
49
 
49
- it("should create topics", async () => {
50
+ it('should create topics', async () => {
50
51
  const result = await cluster.sendRequest(API.CREATE_TOPICS, {
51
52
  topics: [
52
53
  {
53
- name: "kafkats-test-topic",
54
+ name: 'kafka-ts-test-topic',
54
55
  numPartitions: 1,
55
56
  replicationFactor: 1,
56
57
  assignments: [],
@@ -62,22 +63,23 @@ describe.sequential("Request handler", () => {
62
63
  });
63
64
  topicId = result.topics[0].topicId;
64
65
  result.topics.forEach((topic) => {
65
- topic.topicId = "Any<UUID>";
66
+ topic.topicId = 'Any<UUID>';
66
67
  });
67
68
  expect(result).toMatchSnapshot();
68
69
 
69
70
  await new Promise((resolve) => setTimeout(resolve, 1000));
70
71
  });
71
72
 
72
- it("should request metadata for all topics", async () => {
73
+ it('should request metadata for all topics', async () => {
73
74
  const result = await cluster.sendRequest(API.METADATA, {
74
75
  topics: null,
75
76
  allowTopicAutoCreation: false,
76
77
  includeTopicAuthorizedOperations: false,
77
78
  });
78
79
  result.controllerId = 0;
80
+ result.topics = result.topics.filter((topic) => topic.name !== '__consumer_offsets');
79
81
  result.topics.forEach((topic) => {
80
- topic.topicId = "Any<UUID>";
82
+ topic.topicId = 'Any<UUID>';
81
83
  topic.partitions.forEach((partition) => {
82
84
  partition.leaderId = 0;
83
85
  partition.isrNodes = [0];
@@ -89,16 +91,16 @@ describe.sequential("Request handler", () => {
89
91
 
90
92
  let leaderId = 0;
91
93
 
92
- it("should request metadata for a topic", async () => {
94
+ it('should request metadata for a topic', async () => {
93
95
  const result = await cluster.sendRequest(API.METADATA, {
94
- topics: [{ id: topicId, name: "kafkats-test-topic" }],
96
+ topics: [{ id: topicId, name: 'kafka-ts-test-topic' }],
95
97
  allowTopicAutoCreation: false,
96
98
  includeTopicAuthorizedOperations: false,
97
99
  });
98
100
  leaderId = result.topics[0].partitions[0].leaderId;
99
101
  result.controllerId = 0;
100
102
  result.topics.forEach((topic) => {
101
- topic.topicId = "Any<UUID>";
103
+ topic.topicId = 'Any<UUID>';
102
104
  topic.partitions.forEach((partition) => {
103
105
  partition.leaderId = 0;
104
106
  partition.isrNodes = [0];
@@ -108,18 +110,20 @@ describe.sequential("Request handler", () => {
108
110
  expect(result).toMatchSnapshot();
109
111
  });
110
112
 
111
- it("should init producer id", async () => {
113
+ let producerId = 9n;
114
+
115
+ it('should init producer id', async () => {
112
116
  const result = await cluster.sendRequest(API.INIT_PRODUCER_ID, {
113
117
  transactionalId: null,
114
118
  transactionTimeoutMs: 0,
115
- producerId: 0n,
119
+ producerId,
116
120
  producerEpoch: 0,
117
121
  });
118
122
  result.producerId = 0n;
119
123
  expect(result).toMatchSnapshot();
120
124
  });
121
125
 
122
- it("should produce messages", async () => {
126
+ it('should produce messages', async () => {
123
127
  const now = Date.now();
124
128
  const result = await cluster.sendRequestToNode(leaderId)(API.PRODUCE, {
125
129
  transactionalId: null,
@@ -127,7 +131,7 @@ describe.sequential("Request handler", () => {
127
131
  acks: 1,
128
132
  topicData: [
129
133
  {
130
- name: "kafkats-test-topic",
134
+ name: 'kafka-ts-test-topic',
131
135
  partitionData: [
132
136
  {
133
137
  index: 0,
@@ -139,18 +143,18 @@ describe.sequential("Request handler", () => {
139
143
  lastOffsetDelta: 0,
140
144
  maxTimestamp: BigInt(now),
141
145
  producerEpoch: 0,
142
- producerId: 9n,
146
+ producerId,
143
147
  records: [
144
148
  {
145
149
  attributes: 0,
146
150
  offsetDelta: 0,
147
151
  timestampDelta: 0n,
148
- key: "key",
149
- value: "value",
152
+ key: 'key',
153
+ value: 'value',
150
154
  headers: [
151
155
  {
152
- key: "header-key",
153
- value: "header-value",
156
+ key: 'header-key',
157
+ value: 'header-value',
154
158
  },
155
159
  ],
156
160
  },
@@ -163,7 +167,7 @@ describe.sequential("Request handler", () => {
163
167
  expect(result).toMatchSnapshot();
164
168
  });
165
169
 
166
- it("should fetch messages", async () => {
170
+ it('should fetch messages', async () => {
167
171
  const result = await cluster.sendRequestToNode(leaderId)(API.FETCH, {
168
172
  maxWaitMs: 100,
169
173
  minBytes: 1,
@@ -187,10 +191,10 @@ describe.sequential("Request handler", () => {
187
191
  },
188
192
  ],
189
193
  forgottenTopicsData: [],
190
- rackId: "",
194
+ rackId: '',
191
195
  });
192
196
  result.responses.forEach((response) => {
193
- response.topicId = "Any<UUID>";
197
+ response.topicId = 'Any<UUID>';
194
198
  response.partitions.forEach((partition) => {
195
199
  partition.records.forEach((record) => {
196
200
  expect(record.baseTimestamp).toBeGreaterThan(1721926744730n);
@@ -208,10 +212,10 @@ describe.sequential("Request handler", () => {
208
212
 
209
213
  let coordinatorId = -1;
210
214
 
211
- it("should find coordinator", async () => {
215
+ it('should find coordinator', async () => {
212
216
  const result = await cluster.sendRequest(API.FIND_COORDINATOR, { keyType: KEY_TYPE.GROUP, keys: [groupId] });
213
217
  result.coordinators.forEach((coordinator) => {
214
- coordinator.key = "Any<String>";
218
+ coordinator.key = 'Any<String>';
215
219
  });
216
220
  coordinatorId = result.coordinators[0].nodeId;
217
221
  result.coordinators.forEach((coordinator) => {
@@ -221,9 +225,9 @@ describe.sequential("Request handler", () => {
221
225
  expect(result).toMatchSnapshot();
222
226
  });
223
227
 
224
- let memberId = "";
228
+ let memberId = '';
225
229
 
226
- it("should fail join group request with new memberId", async () => {
230
+ it('should fail join group request with new memberId', async () => {
227
231
  try {
228
232
  const result = await cluster.sendRequestToNode(coordinatorId)(API.JOIN_GROUP, {
229
233
  groupId,
@@ -231,67 +235,67 @@ describe.sequential("Request handler", () => {
231
235
  rebalanceTimeoutMs: 60000,
232
236
  memberId,
233
237
  groupInstanceId: null,
234
- protocolType: "consumer",
238
+ protocolType: 'consumer',
235
239
  protocols: [
236
240
  {
237
- name: "RoundRobinAssigner",
238
- metadata: { version: 0, topics: ["kafkats-test-topic"] },
241
+ name: 'RoundRobinAssigner',
242
+ metadata: { version: 0, topics: ['kafka-ts-test-topic'] },
239
243
  },
240
244
  ],
241
245
  reason: null,
242
246
  });
243
- expect(false, "Should throw an error").toBe(true);
247
+ expect(false, 'Should throw an error').toBe(true);
244
248
  } catch (error) {
245
249
  const { response } = error as KafkaTSApiError;
246
250
  memberId = response.memberId;
247
- response.memberId = "Any<UUID>";
251
+ response.memberId = 'Any<UUID>';
248
252
  expect(response).toMatchSnapshot();
249
253
  }
250
254
  });
251
255
 
252
- it("should join group", async () => {
256
+ it('should join group', async () => {
253
257
  const result = await cluster.sendRequestToNode(coordinatorId)(API.JOIN_GROUP, {
254
258
  groupId,
255
259
  sessionTimeoutMs: 30000,
256
260
  rebalanceTimeoutMs: 60000,
257
261
  memberId,
258
262
  groupInstanceId: null,
259
- protocolType: "consumer",
263
+ protocolType: 'consumer',
260
264
  protocols: [
261
265
  {
262
- name: "RoundRobinAssigner",
263
- metadata: { version: 0, topics: ["kafkats-test-topic"] },
266
+ name: 'RoundRobinAssigner',
267
+ metadata: { version: 0, topics: ['kafka-ts-test-topic'] },
264
268
  },
265
269
  ],
266
270
  reason: null,
267
271
  });
268
- result.memberId = "Any<UUID>";
269
- result.leader = "Any<UUID>";
272
+ result.memberId = 'Any<UUID>';
273
+ result.leader = 'Any<UUID>';
270
274
  result.members.forEach((member) => {
271
- member.memberId = "Any<UUID>";
275
+ member.memberId = 'Any<UUID>';
272
276
  });
273
277
  expect(result).toMatchSnapshot();
274
278
  });
275
279
 
276
- it("should sync group", async () => {
280
+ it('should sync group', async () => {
277
281
  const result = await cluster.sendRequestToNode(coordinatorId)(API.SYNC_GROUP, {
278
282
  groupId,
279
283
  generationId: 1,
280
284
  memberId,
281
285
  groupInstanceId: null,
282
- protocolType: "consumer",
283
- protocolName: "RoundRobinAssigner",
286
+ protocolType: 'consumer',
287
+ protocolName: 'RoundRobinAssigner',
284
288
  assignments: [
285
289
  {
286
290
  memberId,
287
- assignment: { "kafka-test-topic": [0] },
291
+ assignment: { 'kafka-test-topic': [0] },
288
292
  },
289
293
  ],
290
294
  });
291
295
  expect(result).toMatchSnapshot();
292
296
  });
293
297
 
294
- it("should commit offsets", async () => {
298
+ it('should commit offsets', async () => {
295
299
  const result = await cluster.sendRequestToNode(coordinatorId)(API.OFFSET_COMMIT, {
296
300
  groupId,
297
301
  generationIdOrMemberEpoch: 1,
@@ -299,7 +303,7 @@ describe.sequential("Request handler", () => {
299
303
  groupInstanceId: null,
300
304
  topics: [
301
305
  {
302
- name: "kafkats-test-topic",
306
+ name: 'kafka-ts-test-topic',
303
307
  partitions: [
304
308
  { partitionIndex: 0, committedOffset: 1n, committedLeaderEpoch: 0, committedMetadata: null },
305
309
  ],
@@ -309,7 +313,7 @@ describe.sequential("Request handler", () => {
309
313
  expect(result).toMatchSnapshot();
310
314
  });
311
315
 
312
- it("should fetch offsets", async () => {
316
+ it('should fetch offsets', async () => {
313
317
  const result = await cluster.sendRequestToNode(coordinatorId)(API.OFFSET_FETCH, {
314
318
  groups: [
315
319
  {
@@ -318,7 +322,7 @@ describe.sequential("Request handler", () => {
318
322
  memberEpoch: 0,
319
323
  topics: [
320
324
  {
321
- name: "kafkats-test-topic",
325
+ name: 'kafka-ts-test-topic',
322
326
  partitionIndexes: [0],
323
327
  },
324
328
  ],
@@ -327,12 +331,12 @@ describe.sequential("Request handler", () => {
327
331
  requireStable: false,
328
332
  });
329
333
  result.groups.forEach((group) => {
330
- group.groupId = "Any<String>";
334
+ group.groupId = 'Any<String>';
331
335
  });
332
336
  expect(result).toMatchSnapshot();
333
337
  });
334
338
 
335
- it("should heartbeat", async () => {
339
+ it('should heartbeat', async () => {
336
340
  const result = await cluster.sendRequestToNode(coordinatorId)(API.HEARTBEAT, {
337
341
  groupId,
338
342
  generationId: 1,
@@ -342,24 +346,24 @@ describe.sequential("Request handler", () => {
342
346
  expect(result).toMatchSnapshot();
343
347
  });
344
348
 
345
- it("should leave group", async () => {
349
+ it('should leave group', async () => {
346
350
  const result = await cluster.sendRequestToNode(coordinatorId)(API.LEAVE_GROUP, {
347
351
  groupId,
348
352
  members: [{ memberId, groupInstanceId: null, reason: null }],
349
353
  });
350
354
  result.members.forEach((member) => {
351
- member.memberId = "Any<UUID>";
355
+ member.memberId = 'Any<UUID>';
352
356
  });
353
357
  expect(result).toMatchSnapshot();
354
358
  });
355
359
 
356
- it("should delete topics", async () => {
360
+ it('should delete topics', async () => {
357
361
  const result = await cluster.sendRequest(API.DELETE_TOPICS, {
358
- topics: [{ name: "kafkats-test-topic", topicId: null }],
362
+ topics: [{ name: 'kafka-ts-test-topic', topicId: null }],
359
363
  timeoutMs: 10000,
360
364
  });
361
365
  result.responses.forEach((response) => {
362
- response.topicId = "Any<UUID>";
366
+ response.topicId = 'Any<UUID>';
363
367
  });
364
368
  expect(result).toMatchSnapshot();
365
369
  });
package/src/cluster.ts CHANGED
@@ -1,14 +1,14 @@
1
- import { TcpSocketConnectOpts } from "net";
2
- import { TLSSocketOptions } from "tls";
3
- import { API } from "./api";
4
- import { Broker, SASLOptions } from "./broker";
5
- import { SendRequest } from "./connection";
6
- import { ConnectionError, KafkaTSError } from "./utils/error";
1
+ import { TcpSocketConnectOpts } from 'net';
2
+ import { TLSSocketOptions } from 'tls';
3
+ import { API } from './api';
4
+ import { Broker, SASLProvider } from './broker';
5
+ import { SendRequest } from './connection';
6
+ import { ConnectionError, KafkaTSError } from './utils/error';
7
7
 
8
8
  type ClusterOptions = {
9
9
  clientId: string | null;
10
10
  bootstrapServers: TcpSocketConnectOpts[];
11
- sasl: SASLOptions | null;
11
+ sasl: SASLProvider | null;
12
12
  ssl: TLSSocketOptions | null;
13
13
  };
14
14
 
@@ -82,6 +82,6 @@ export class Cluster {
82
82
  console.warn(`Failed to connect to seed broker ${options.host}:${options.port}`, error);
83
83
  }
84
84
  }
85
- throw new KafkaTSError("No seed brokers found");
85
+ throw new KafkaTSError('No seed brokers found');
86
86
  }
87
87
  }
package/src/connection.ts CHANGED
@@ -1,12 +1,14 @@
1
- import assert from "assert";
2
- import net, { isIP, Socket, TcpSocketConnectOpts } from "net";
3
- import tls, { TLSSocketOptions } from "tls";
4
- import { getApiName } from "./api";
5
- import { Api } from "./utils/api";
6
- import { Decoder } from "./utils/decoder";
7
- import { Encoder } from "./utils/encoder";
8
- import { ConnectionError } from "./utils/error";
9
- import { trace } from "./utils/tracer";
1
+ import assert from 'assert';
2
+ import net, { isIP, Socket, TcpSocketConnectOpts } from 'net';
3
+ import tls, { TLSSocketOptions } from 'tls';
4
+ import { getApiName } from './api';
5
+ import { Api } from './utils/api';
6
+ import { Decoder } from './utils/decoder';
7
+ import { Encoder } from './utils/encoder';
8
+ import { ConnectionError } from './utils/error';
9
+ import { createTracer } from './utils/tracer';
10
+
11
+ const trace = createTracer('Connection');
10
12
 
11
13
  export type ConnectionOptions = {
12
14
  clientId: string | null;
@@ -44,14 +46,14 @@ export class Connection {
44
46
  resolve,
45
47
  )
46
48
  : net.connect(connection, resolve);
47
- this.socket.once("error", reject);
49
+ this.socket.once('error', reject);
48
50
  });
49
- this.socket.removeAllListeners("error");
51
+ this.socket.removeAllListeners('error');
50
52
 
51
- this.socket.on("data", (data) => this.handleData(data));
52
- this.socket.once("close", async () => {
53
+ this.socket.on('data', (data) => this.handleData(data));
54
+ this.socket.once('close', async () => {
53
55
  Object.values(this.queue).forEach(({ reject }) => {
54
- reject(new ConnectionError("Socket closed unexpectedly"));
56
+ reject(new ConnectionError('Socket closed unexpectedly'));
55
57
  });
56
58
  this.queue = {};
57
59
  });
@@ -100,7 +102,7 @@ export class Connection {
100
102
 
101
103
  private write(buffer: Buffer) {
102
104
  return new Promise<void>((resolve, reject) => {
103
- const { stack } = new Error("Write error");
105
+ const { stack } = new Error('Write error');
104
106
  this.socket.write(buffer, (error) => {
105
107
  if (error) {
106
108
  const err = new ConnectionError(error.message);
@@ -1,10 +1,10 @@
1
- import { API, API_ERROR } from "../api";
2
- import { KEY_TYPE } from "../api/find-coordinator";
3
- import { Assignment, MemberAssignment } from "../api/sync-group";
4
- import { Cluster } from "../cluster";
5
- import { KafkaTSApiError, KafkaTSError } from "../utils/error";
6
- import { ConsumerMetadata } from "./consumer-metadata";
7
- import { OffsetManager } from "./offset-manager";
1
+ import { API, API_ERROR } from '../api';
2
+ import { KEY_TYPE } from '../api/find-coordinator';
3
+ import { Assignment, MemberAssignment } from '../api/sync-group';
4
+ import { Cluster } from '../cluster';
5
+ import { KafkaTSApiError, KafkaTSError } from '../utils/error';
6
+ import { ConsumerMetadata } from './consumer-metadata';
7
+ import { OffsetManager } from './offset-manager';
8
8
 
9
9
  type ConsumerGroupOptions = {
10
10
  cluster: Cluster;
@@ -19,9 +19,9 @@ type ConsumerGroupOptions = {
19
19
 
20
20
  export class ConsumerGroup {
21
21
  private coordinatorId = -1;
22
- private memberId = "";
22
+ private memberId = '';
23
23
  private generationId = -1;
24
- private leaderId = "";
24
+ private leaderId = '';
25
25
  private memberIds: string[] = [];
26
26
  private heartbeatInterval: NodeJS.Timeout | null = null;
27
27
  private heartbeatError: KafkaTSError | null = null;
@@ -76,8 +76,8 @@ export class ConsumerGroup {
76
76
  memberId: this.memberId,
77
77
  sessionTimeoutMs,
78
78
  rebalanceTimeoutMs,
79
- protocolType: "consumer",
80
- protocols: [{ name: "RoundRobinAssigner", metadata: { version: 0, topics } }],
79
+ protocolType: 'consumer',
80
+ protocols: [{ name: 'RoundRobinAssigner', metadata: { version: 0, topics } }],
81
81
  reason: null,
82
82
  });
83
83
  this.memberId = response.memberId;
@@ -118,11 +118,11 @@ export class ConsumerGroup {
118
118
  groupInstanceId,
119
119
  memberId: this.memberId,
120
120
  generationId: this.generationId,
121
- protocolType: "consumer",
122
- protocolName: "RoundRobinAssigner",
121
+ protocolType: 'consumer',
122
+ protocolName: 'RoundRobinAssigner',
123
123
  assignments,
124
124
  });
125
- metadata.setAssignment(JSON.parse(response.assignments || "{}") as Assignment);
125
+ metadata.setAssignment(JSON.parse(response.assignments || '{}') as Assignment);
126
126
  }
127
127
 
128
128
  private async offsetFetch() {
@@ -1,5 +1,5 @@
1
- import { Assignment } from "../api/sync-group";
2
- import { Metadata } from "../metadata";
1
+ import { Assignment } from '../api/sync-group';
2
+ import { Metadata } from '../metadata';
3
3
 
4
4
  export class ConsumerMetadata extends Metadata {
5
5
  private assignment: Assignment = {};