@nsshunt/stsappframework 3.1.230 → 3.1.232

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 (64) hide show
  1. package/dist/commonTypes.js +31 -0
  2. package/dist/commonTypes.js.map +1 -1
  3. package/dist/index.js +0 -3
  4. package/dist/index.js.map +1 -1
  5. package/dist/process/serverprocessbase.js +39 -23
  6. package/dist/process/serverprocessbase.js.map +1 -1
  7. package/dist/process/singleprocessbase.js.map +1 -1
  8. package/dist/vitesttesting/appConfig.js +3 -1
  9. package/dist/vitesttesting/appConfig.js.map +1 -1
  10. package/dist/vitesttesting/appSingleWSS.js +99 -48
  11. package/dist/vitesttesting/appSingleWSS.js.map +1 -1
  12. package/dist/vitesttesting/singleservertest.test.js +151 -59
  13. package/dist/vitesttesting/singleservertest.test.js.map +1 -1
  14. package/package.json +3 -3
  15. package/src/commonTypes.ts +3 -1
  16. package/src/index.ts +0 -3
  17. package/src/process/serverprocessbase.ts +46 -23
  18. package/src/process/singleprocessbase.ts +1 -2
  19. package/src/vitesttesting/appConfig.ts +3 -1
  20. package/src/vitesttesting/appSingleWSS.ts +120 -55
  21. package/src/vitesttesting/singleservertest.test.ts +185 -68
  22. package/src/vitesttesting/wsevents.ts +11 -0
  23. package/types/commonTypes.d.ts +1 -12
  24. package/types/commonTypes.d.ts.map +1 -1
  25. package/types/index.d.ts +0 -3
  26. package/types/index.d.ts.map +1 -1
  27. package/types/process/serverprocessbase.d.ts +1 -1
  28. package/types/process/serverprocessbase.d.ts.map +1 -1
  29. package/types/process/singleprocessbase.d.ts.map +1 -1
  30. package/types/vitesttesting/appConfig.d.ts.map +1 -1
  31. package/types/vitesttesting/appSingleWSS.d.ts +2 -3
  32. package/types/vitesttesting/appSingleWSS.d.ts.map +1 -1
  33. package/types/vitesttesting/wsevents.d.ts +11 -0
  34. package/types/vitesttesting/wsevents.d.ts.map +1 -1
  35. package/dist/kafka/kafkaconsumer.js +0 -128
  36. package/dist/kafka/kafkaconsumer.js.map +0 -1
  37. package/dist/kafka/kafkamanager.js +0 -173
  38. package/dist/kafka/kafkamanager.js.map +0 -1
  39. package/dist/kafka/kafkaproducer.js +0 -97
  40. package/dist/kafka/kafkaproducer.js.map +0 -1
  41. package/dist/kafkatesting/config.js +0 -10
  42. package/dist/kafkatesting/config.js.map +0 -1
  43. package/dist/kafkatesting/consume.js +0 -154
  44. package/dist/kafkatesting/consume.js.map +0 -1
  45. package/dist/kafkatesting/produce.js +0 -164
  46. package/dist/kafkatesting/produce.js.map +0 -1
  47. package/src/kafka/kafkaconsumer.ts +0 -136
  48. package/src/kafka/kafkamanager.ts +0 -210
  49. package/src/kafka/kafkaproducer.ts +0 -103
  50. package/src/kafkatesting/config.ts +0 -10
  51. package/src/kafkatesting/consume.ts +0 -185
  52. package/src/kafkatesting/produce.ts +0 -187
  53. package/types/kafka/kafkaconsumer.d.ts +0 -21
  54. package/types/kafka/kafkaconsumer.d.ts.map +0 -1
  55. package/types/kafka/kafkamanager.d.ts +0 -30
  56. package/types/kafka/kafkamanager.d.ts.map +0 -1
  57. package/types/kafka/kafkaproducer.d.ts +0 -24
  58. package/types/kafka/kafkaproducer.d.ts.map +0 -1
  59. package/types/kafkatesting/config.d.ts +0 -7
  60. package/types/kafkatesting/config.d.ts.map +0 -1
  61. package/types/kafkatesting/consume.d.ts +0 -2
  62. package/types/kafkatesting/consume.d.ts.map +0 -1
  63. package/types/kafkatesting/produce.d.ts +0 -2
  64. package/types/kafkatesting/produce.d.ts.map +0 -1
@@ -1,154 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- /* eslint @typescript-eslint/no-unused-vars: 0 */ // --> OFF
7
- const config_1 = require("./config");
8
- const kafkamanager_1 = require("./../kafka/kafkamanager");
9
- const winston_1 = __importDefault(require("winston"));
10
- async function Sleep(milliseconds = 1000) {
11
- return new Promise(resolve => setTimeout(resolve, milliseconds));
12
- }
13
- winston_1.default.format.combine(winston_1.default.format.colorize(), winston_1.default.format.simple());
14
- const logger = winston_1.default.createLogger({
15
- level: 'silly',
16
- format: winston_1.default.format.combine(winston_1.default.format.colorize(), winston_1.default.format.simple()),
17
- transports: [
18
- new winston_1.default.transports.Console()
19
- ]
20
- });
21
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
- const LogErrorMessage = (message) => {
23
- logger.error(message);
24
- };
25
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
26
- const LogInfoMessage = (message) => {
27
- logger.info(message);
28
- };
29
- const km = new kafkamanager_1.KafkaManager({
30
- clientId: config_1.CLIENT_ID + process.env.CLIENT_ID,
31
- brokers: config_1.BROKERS,
32
- adminTimeout: config_1.TIMEOUT,
33
- connectionTimeout: config_1.TIMEOUT,
34
- requestTimeout: config_1.TIMEOUT,
35
- logLevel: 'NOTHING',
36
- useSSL: false,
37
- logger
38
- });
39
- const runme = async () => {
40
- const fromBeginning = false;
41
- const consumer = km.CreateConsumer(config_1.GROUP_ID + process.env.GROUP_ID);
42
- await consumer.Connect((error) => {
43
- LogErrorMessage(`Connect(): Error: [${error}]`);
44
- });
45
- await consumer.Subscribe([config_1.TOPIC], fromBeginning, (error) => {
46
- LogErrorMessage(`Subscribe(): Error: [${error}]`);
47
- });
48
- await consumer.StartConsumingMessages(true, (topic, partition, message, heartbeat, pause) => {
49
- const { key, value, headers } = message;
50
- LogInfoMessage({
51
- key,
52
- partition,
53
- value,
54
- headers
55
- });
56
- }, (error) => {
57
- LogErrorMessage(`StartConsumingMessages(): Error: [${error}]`);
58
- });
59
- /*
60
- await consumer.StartConsumingMessages(true, (topic: string, key: string, partition: number, value: string, headers: JSONObject | undefined) => {
61
- LogInfoMessage({
62
- key,
63
- partition,
64
- value,
65
- headers
66
- });
67
- }, (error) => {
68
- LogErrorMessage(`StartConsumingMessages(): Error: [${error}]`);
69
- });
70
- */
71
- await consumer.Stop((error) => {
72
- LogErrorMessage(`Stop(): Error: [${error}]`);
73
- });
74
- await consumer.Subscribe(['zzz'], fromBeginning, (error) => {
75
- LogErrorMessage(`Subscribe(): Error: [${error}]`);
76
- });
77
- await consumer.StartConsumingMessages(true, (topic, partition, message, heartbeat, pause) => {
78
- const { key, value, headers } = message;
79
- LogInfoMessage({
80
- key,
81
- partition,
82
- value,
83
- headers
84
- });
85
- }, (error) => {
86
- LogErrorMessage(`StartConsumingMessages(): Error: [${error}]`);
87
- });
88
- await consumer.Stop((error) => {
89
- LogErrorMessage(`Stop(): Error: [${error}]`);
90
- });
91
- await consumer.Subscribe(['yyy'], fromBeginning, (error) => {
92
- LogErrorMessage(`Subscribe(): Error: [${error}]`);
93
- });
94
- await consumer.StartConsumingMessages(true, (topic, partition, message, heartbeat, pause) => {
95
- const { key, value, headers } = message;
96
- /*
97
- this.#LogInfoMessage({
98
- key,
99
- partition,
100
- value,
101
- headers
102
- });
103
- */
104
- LogInfoMessage(`key: [${key}] value: [${value}] partition: [${partition}] headers: [${headers}]`);
105
- }, (error) => {
106
- LogErrorMessage(`StartConsumingMessages(): Error: [${error}]`);
107
- });
108
- //await km.Subscribe(['zzz'], cb);
109
- process.on("SIGINT", async () => {
110
- LogInfoMessage('=========SIGTERM START =======================');
111
- await consumer.Disconnect((error) => {
112
- LogErrorMessage(`Disconnect(): Error: [${error}]`);
113
- });
114
- LogInfoMessage('=========SIGTERM END =======================');
115
- process.exit();
116
- });
117
- let iteration = 0;
118
- for (;;) {
119
- LogInfoMessage('sleep: ' + iteration++);
120
- await Sleep(1000);
121
- }
122
- };
123
- /*
124
- const errorTypes = ['unhandledRejection', 'uncaughtException']
125
- const signalTraps = ['SIGTERM', 'SIGINT', 'SIGUSR2']
126
-
127
- errorTypes.forEach(type => {
128
- process.on(type, async () => {
129
- try {
130
- this.#LogInfoMessage(`process.on ${type}`)
131
- this.#LogInfoMessage('=========consumer.disconnect() START =======================')
132
- await consumer.disconnect()
133
- this.#LogInfoMessage('=========consumer.disconnect() END =======================')
134
- process.exit(0)
135
- } catch (_) {
136
- process.exit(1)
137
- }
138
- })
139
- })
140
-
141
- signalTraps.forEach(type => {
142
- process.once(type, async () => {
143
- try {
144
- this.#LogInfoMessage('=========consumer.disconnect() START [2] =======================')
145
- await consumer.disconnect()
146
- this.#LogInfoMessage('=========consumer.disconnect() END [2] =======================')
147
- } finally {
148
- process.kill(process.pid, type)
149
- }
150
- })
151
- })
152
- */
153
- runme().catch(e => LogErrorMessage(`[example/producer] ${e.message}`));
154
- //# sourceMappingURL=consume.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"consume.js","sourceRoot":"","sources":["../../src/kafkatesting/consume.ts"],"names":[],"mappings":"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"}
@@ -1,164 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- /*
7
-
8
- kafka example server #01 - Docker Compose File
9
- ----------------------------------------------
10
- Note: In this example, the log retention is set to 24 hours (rather than default to 1 week)
11
- https://www.conduktor.io/kafka/kafka-topic-configuration-log-retention/
12
-
13
- version: '2'
14
- services:
15
- zookeeper:
16
- image: wurstmeister/zookeeper
17
- ports:
18
- - "2181:2181"
19
- restart: unless-stopped
20
-
21
- kafka:
22
- image: wurstmeister/kafka
23
- ports:
24
- - "9092:9092"
25
- environment:
26
- DOCKER_API_VERSION: 1.22
27
- KAFKA_ADVERTISED_HOST_NAME: 192.168.14.92
28
- KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
29
- KAFKA_CREATE_TOPICS: "topic-name2:3:1"
30
- KAFKA_LOG_RETENTION_MS: 86400000
31
- KAFKA_LOG_RETENTION_BYTES: -1
32
- volumes:
33
- - /var/run/docker.sock:/var/run/docker.sock
34
- restart: unless-stopped
35
-
36
-
37
- kafka example server #02 - Docker Compose File
38
- ----------------------------------------------
39
- version: "3.9" # optional since v1.27.0
40
-
41
- networks:
42
- app-tier:
43
- driver: bridge
44
-
45
- services:
46
- kafka:
47
- image: 'bitnami/kafka:latest'
48
- ports:
49
- - '9092:9092'
50
- networks:
51
- - app-tier
52
- environment:
53
- - ALLOW_PLAINTEXT_LISTENER=yes
54
- - KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
55
- - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.14.92:9092
56
-
57
- */
58
- const config_1 = require("./config");
59
- const kafkamanager_1 = require("./../kafka/kafkamanager");
60
- const chalk_1 = __importDefault(require("chalk"));
61
- const winston_1 = __importDefault(require("winston"));
62
- winston_1.default.format.combine(winston_1.default.format.colorize(), winston_1.default.format.simple());
63
- const logger = winston_1.default.createLogger({
64
- level: 'silly',
65
- format: winston_1.default.format.combine(winston_1.default.format.colorize(), winston_1.default.format.simple()),
66
- transports: [
67
- new winston_1.default.transports.Console()
68
- ]
69
- });
70
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
71
- const LogErrorMessage = (message) => {
72
- logger.error(message);
73
- };
74
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
75
- const LogInfoMessage = (message) => {
76
- logger.info(message);
77
- };
78
- async function Sleep(milliseconds = 1000) {
79
- return new Promise(resolve => setTimeout(resolve, milliseconds));
80
- }
81
- const km = new kafkamanager_1.KafkaManager({
82
- clientId: config_1.CLIENT_ID + process.env.CLIENT_ID,
83
- brokers: config_1.BROKERS,
84
- adminTimeout: config_1.TIMEOUT,
85
- connectionTimeout: config_1.TIMEOUT,
86
- requestTimeout: config_1.TIMEOUT,
87
- logLevel: 'NOTHING',
88
- useSSL: false,
89
- logger
90
- });
91
- const runme = async () => {
92
- await km.CreateTopic(config_1.TOPIC, config_1.PARTITIONS, (error) => LogInfoMessage(`CreateTopic: Error: [${error}]`));
93
- await km.CreateTopic('zzz', 1, (error) => LogInfoMessage(`CreateTopic: Error: [${error}]`));
94
- await km.CreateTopic('yyy', 1, (error) => LogInfoMessage(`CreateTopic: Error: [${error}]`));
95
- const producer = km.CreateProducer();
96
- await producer.Connect((error) => LogInfoMessage(`Connect: Error: [${error}]`));
97
- const count = 100000;
98
- const sleepTime = 1000;
99
- process.on("SIGINT", async () => {
100
- LogInfoMessage('=========SIGTERM START =======================');
101
- await producer.Disconnect((error) => LogInfoMessage(`Disconnect: Error: [${error}]`));
102
- LogInfoMessage('=========SIGTERM END =======================');
103
- process.exit();
104
- });
105
- for (let i = 0; i < count; i++) {
106
- if (i % 100 === 0)
107
- LogInfoMessage(i);
108
- const retVal = await producer.SendMessages(config_1.TOPIC, [
109
- { key: 'key1', value: chalk_1.default.green(`hello world - ${i}`) },
110
- { key: 'key2', value: 'hey hey! -2' },
111
- { key: 'key3', value: 'hey hey! -3' },
112
- { key: 'key4', value: 'hey hey! -4' },
113
- { key: 'key5', value: 'hey hey! -5' }
114
- ], (error) => {
115
- LogErrorMessage(error);
116
- });
117
- await producer.SendMessages('zzz', [
118
- { key: 'key-zzz', value: chalk_1.default.yellow(`hello world - ${i}`) }
119
- ], (error) => {
120
- LogErrorMessage(error);
121
- });
122
- await producer.SendMessages('yyy', [
123
- { key: 'key-yyy', value: chalk_1.default.cyan(`hello world - ${i}`) }
124
- ], (error) => {
125
- LogErrorMessage(error);
126
- });
127
- if (i % 100 === 0) {
128
- LogInfoMessage(retVal);
129
- LogInfoMessage(` ------------=================> ${i}`);
130
- }
131
- if (sleepTime >= 0) {
132
- await Sleep(sleepTime);
133
- }
134
- }
135
- await producer.Disconnect((error) => LogInfoMessage(`Disconnect: Error: [${error}]`));
136
- };
137
- /*
138
- const errorTypes = ['unhandledRejection', 'uncaughtException']
139
- const signalTraps = ['SIGTERM', 'SIGINT', 'SIGUSR2']
140
-
141
- errorTypes.forEach(type => {
142
- process.on(type, async () => {
143
- try {
144
- LogInfoMessage(`process.on ${type}`)
145
- await producer.disconnect()
146
- process.exit(0)
147
- } catch (_) {
148
- process.exit(1)
149
- }
150
- })
151
- })
152
-
153
- signalTraps.forEach(type => {
154
- process.once(type, async () => {
155
- try {
156
- await producer.disconnect()
157
- } finally {
158
- process.kill(process.pid, type)
159
- }
160
- })
161
- })
162
- */
163
- runme().catch(e => LogErrorMessage(`[example/producer] ${e.message}`));
164
- //# sourceMappingURL=produce.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"produce.js","sourceRoot":"","sources":["../../src/kafkatesting/produce.ts"],"names":[],"mappings":"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"}
@@ -1,136 +0,0 @@
1
- /* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF
2
- import { Kafka, Consumer, IHeaders, KafkaMessage } from 'kafkajs'
3
- import { IKafkaConsumer, ConsumeMessageCB, ConsumeMessageErrorCB } from './../commonTypes'
4
-
5
- import chalk from 'chalk';
6
- import { ISTSLogger } from '@nsshunt/stsutils';
7
-
8
- export interface IKafkaConsumerOptions {
9
- kafka: Kafka
10
- id: string
11
- groupId: string
12
- logger: ISTSLogger
13
- }
14
-
15
- export class KafkaConsumer implements IKafkaConsumer {
16
- #id: string
17
- #groupId: string
18
- #consumer: Consumer;
19
- #kafka: Kafka;
20
- #connected: boolean = false;
21
- #options: IKafkaConsumerOptions;
22
-
23
- constructor(options: IKafkaConsumerOptions) {
24
- this.#options = options;
25
- this.#id = this.#options.id;
26
- this.#groupId = this.#options.groupId;
27
- this.#kafka = this.#options.kafka;
28
- this.#consumer = this.#kafka.consumer({
29
- groupId: this.#groupId,
30
- retry: {
31
- restartOnFailure: async (error: Error): Promise<boolean> => {
32
- this.#LogErrorMessage(chalk.magenta(`${process.pid}:KafkaConsumer:constructor:restartOnFailure(): Error: [${error}]`))
33
- return true;
34
- }
35
- }
36
- })
37
- }
38
-
39
- #LogErrorMessage(message: any) {
40
- this.#options.logger.error(message);
41
- }
42
-
43
- get consumer() {
44
- return this.#consumer;
45
- }
46
-
47
- get id(): string {
48
- return this.#id;
49
- }
50
-
51
- #RaiseError = (msg: string, errorCb: (error: any) => void) => {
52
- const errorMessage = `${process.pid}:KafkaConsumer:${msg}`;
53
- this.#LogErrorMessage(chalk.red(errorMessage));
54
- errorCb(errorMessage);
55
- }
56
-
57
- async Connect(errorCb: (error: any) => void): Promise<void> {
58
- if (!this.#connected) {
59
- try {
60
- await this.#consumer.connect()
61
- this.#connected = true;
62
- } catch (error) {
63
- this.#RaiseError(`Connect(): Error: [${error}]`, errorCb);
64
- }
65
- }
66
- }
67
-
68
- async Disconnect(errorCb: (error: any) => void): Promise<void> {
69
- if (this.#connected) {
70
- try {
71
- await this.#consumer.disconnect()
72
- this.#connected = false;
73
- } catch (error) {
74
- this.#RaiseError(`Disconnect(): Error: [${error}]`, errorCb);
75
- }
76
- }
77
- }
78
-
79
- Subscribe = async(topics: string[], fromBeginning: boolean, errorCb: (error: any) => void): Promise<void> => {
80
- if (this.#connected) {
81
- try {
82
- await this.#consumer.subscribe({ topics, fromBeginning })
83
- } catch (error) {
84
- this.#RaiseError(`Subscribe(): Error: [${error}]`, errorCb);
85
- }
86
- } else {
87
- await this.Connect((error) => {
88
- this.#RaiseError(`Subscribe(): Could not consumer.connect, Error: [${error}]`, errorCb);
89
- });
90
- }
91
- }
92
-
93
- Stop = async(errorCb: (error: any) => void): Promise<void> => {
94
- if (this.#connected) {
95
- try {
96
- await this.#consumer.stop();
97
- } catch (error) {
98
- this.#RaiseError(`Stop(): Error: [${error}]`, errorCb);
99
- }
100
- }
101
- }
102
-
103
- StartConsumingMessages = async (autoCommit: boolean, cb: ConsumeMessageCB, errorCb: ConsumeMessageErrorCB): Promise<void> => {
104
- if (this.#connected) {
105
- await this.#consumer.run({
106
- autoCommit,
107
- eachMessage: async ({ topic, partition, message, heartbeat, pause }) => {
108
- try {
109
- cb(topic, partition, message, heartbeat, pause);
110
- /*
111
- if (message.key) {
112
- if (message.value) {
113
- cb(topic.toString(), message.key.toString(), partition, message.value.toString(), message.headers)
114
- } else {
115
- cb(topic.toString(), message.key.toString(), partition, "", message.headers)
116
- }
117
- } else {
118
- if (message.value) {
119
- cb(topic.toString(), "", partition, message.value?.toString(), message.headers)
120
- } else {
121
- cb(topic.toString(), "", partition, "", message.headers)
122
- }
123
- }
124
- */
125
- } catch (error) {
126
- this.#RaiseError(`StartConsumingMessages:eachMessage(): Error: [${error}]`, errorCb);
127
- }
128
- }
129
- })
130
- } else {
131
- await this.Connect((error) => {
132
- this.#RaiseError(`StartConsumingMessages(): Could not consumer.connect, Error: [${error}]`, errorCb);
133
- });
134
- }
135
- }
136
- }
@@ -1,210 +0,0 @@
1
- /* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF
2
- /*
3
-
4
- kafka example server #01 - Docker Compose File
5
- ----------------------------------------------
6
- Note: In this example, the log retention is set to 24 hours (rather than default to 1 week)
7
- https://www.conduktor.io/kafka/kafka-topic-configuration-log-retention/
8
-
9
- version: '2'
10
- services:
11
- zookeeper:
12
- image: wurstmeister/zookeeper
13
- ports:
14
- - "2181:2181"
15
- restart: unless-stopped
16
-
17
- kafka:
18
- image: wurstmeister/kafka
19
- ports:
20
- - "9092:9092"
21
- environment:
22
- DOCKER_API_VERSION: 1.22
23
- KAFKA_ADVERTISED_HOST_NAME: 192.168.14.92
24
- KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
25
- KAFKA_CREATE_TOPICS: "topic-name2:3:1"
26
- KAFKA_LOG_RETENTION_MS: 86400000
27
- KAFKA_LOG_RETENTION_BYTES: -1
28
- volumes:
29
- - /var/run/docker.sock:/var/run/docker.sock
30
- restart: unless-stopped
31
-
32
-
33
- kafka example server #02 - Docker Compose File
34
- ----------------------------------------------
35
- version: "3.9" # optional since v1.27.0
36
-
37
- networks:
38
- app-tier:
39
- driver: bridge
40
-
41
- services:
42
- kafka:
43
- image: 'bitnami/kafka:latest'
44
- ports:
45
- - '9092:9092'
46
- networks:
47
- - app-tier
48
- environment:
49
- - ALLOW_PLAINTEXT_LISTENER=yes
50
- - KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
51
- - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.14.92:9092
52
-
53
- */
54
- import { ISTSLogger, STSOptionsBase } from '@nsshunt/stsutils'
55
-
56
- import { Kafka, KafkaConfig, logLevel } from 'kafkajs'
57
-
58
- import { v4 as uuidv4 } from 'uuid';
59
- import fs from 'node:fs'
60
-
61
- import { KafkaConsumer } from './kafkaconsumer'
62
- import { KafkaProducer } from './kafkaproducer'
63
-
64
- import net from 'net'
65
- import tls from 'tls'
66
-
67
- import chalk from 'chalk';
68
-
69
- const KEEP_ALIVE_DELAY = 60000 //@@ in ms
70
-
71
- // https://kafka.js.org/docs/configuration
72
- export interface IKafkaManagerConfig {
73
- clientId: string // A logical identifier of an application. Can be used by brokers to apply quotas or trace requests to a specific application. Example: booking-events-processor.
74
- brokers: string[] // List of Kafka brokers
75
- adminTimeout: number // Time in milliseconds to wait for a successful admin operation. The default value is: 5000.
76
- connectionTimeout: number // Time in milliseconds to wait for a successful connection. The default value is: 1000.
77
- requestTimeout: number // Time in milliseconds to wait for a successful request. The default value is: 30000.
78
- logLevel: string // There are 5 log levels available: NOTHING, ERROR, WARN, INFO, and DEBUG. INFO is configured by default.
79
- keepAlive?: number // When specified, the number of ms for socket keep alive processing.
80
- useSSL: boolean // Use SSL
81
- ssl?: { // Must be specified if useSSL is true
82
- rejectUnauthorized: boolean
83
- cafile: string
84
- keyfile: string
85
- certfileFile: string
86
- }
87
- logger: ISTSLogger
88
- }
89
-
90
- // https://kafka.js.org/docs/configuration
91
- // https://github.com/tulios/kafkajs/blob/master/src/network/socketFactory.js
92
- declare interface ICustomSocketFactory {
93
- host: any,
94
- port: any,
95
- ssl: any,
96
- onConnect: any
97
- }
98
-
99
- export class KafkaManager extends STSOptionsBase {
100
- #kafka: Kafka
101
-
102
- constructor(options: IKafkaManagerConfig) {
103
- super(options);
104
-
105
- const kc: KafkaConfig = {
106
- clientId: options.clientId,
107
- brokers: options.brokers, //brokers: ['localhost:9092', 'kafka2:9092'],
108
- connectionTimeout: options.connectionTimeout,
109
- requestTimeout: options.requestTimeout
110
- }
111
- // NOTHING, ERROR, WARN, INFO, and DEBUG. INFO is configured by default.
112
- switch (options.logLevel) {
113
- case 'NOTHING' :
114
- kc.logLevel = logLevel.NOTHING;
115
- break;
116
- case 'ERROR' :
117
- kc.logLevel = logLevel.ERROR;
118
- break;
119
- case 'WARN' :
120
- kc.logLevel = logLevel.WARN;
121
- break;
122
- case 'INFO' :
123
- kc.logLevel = logLevel.INFO;
124
- break;
125
- case 'DEBUG' :
126
- kc.logLevel = logLevel.DEBUG;
127
- break;
128
- default :
129
- kc.logLevel = logLevel.NOTHING;
130
- }
131
- if (options.useSSL && options.ssl) {
132
- kc.ssl = {
133
- ca: [fs.readFileSync(options.ssl.cafile as string, { encoding: 'utf8'})],
134
- key: fs.readFileSync(options.ssl.keyfile, { encoding: 'utf8'}),
135
- cert: fs.readFileSync(options.ssl.certfileFile, { encoding: 'utf8'}),
136
- }
137
- }
138
- if (options.keepAlive) {
139
- //const myCustomSocketFactory = ({ host, port, ssl, onConnect }) => {
140
- const myCustomSocketFactory = (config: ICustomSocketFactory) => {
141
- const socket = config.ssl
142
- ? tls.connect(
143
- Object.assign({ host: config.host, port: config.port }, !net.isIP(config.host) ? { servername: config.host } : {}, config.ssl),
144
- config.onConnect
145
- )
146
- : net.connect({ host: config.host, port: config.port }, config.onConnect)
147
-
148
- socket.setKeepAlive(true, options.keepAlive)
149
- return socket
150
- }
151
- kc.socketFactory = myCustomSocketFactory;
152
- }
153
-
154
- this.#kafka = new Kafka(kc);
155
- }
156
-
157
- #LogErrorMessage(message: any) {
158
- this.options?.logger.error(message);
159
- }
160
-
161
- #RaiseError = (msg: string, errorCb: (error: any) => void) => {
162
- this.#LogErrorMessage(chalk.red(msg));
163
- errorCb(msg);
164
- }
165
-
166
- get kafka() {
167
- return this.#kafka;
168
- }
169
-
170
- CreateProducer(): KafkaProducer {
171
- return new KafkaProducer({
172
- kafka: this.#kafka,
173
- id: uuidv4(),
174
- logger: this.options?.logger});
175
- }
176
-
177
- CreateConsumer(groupId: string) {
178
- return new KafkaConsumer({
179
- kafka: this.#kafka,
180
- id: uuidv4(),
181
- groupId,
182
- logger: this.options?.logger});
183
- }
184
-
185
- CreateTopic = async (topic: string, partitions: number, errorCb: (error: any) => void): Promise<boolean> => {
186
- try {
187
- const admin = this.#kafka.admin()
188
- await admin.connect()
189
- const result = await admin.createTopics({
190
- validateOnly: false,
191
- waitForLeaders: true,
192
- timeout: this.options?.timeout,
193
- topics: [
194
- {
195
- topic: topic,
196
- numPartitions: partitions, // default: -1 (uses broker `num.partitions` configuration)
197
- //replicationFactor: <Number>, // default: -1 (uses broker `default.replication.factor` configuration)
198
- //replicaAssignment: <Array>, // Example: [{ partition: 0, replicas: [0,1,2] }] - default: []
199
- //configEntries: <Array> // Example: [{ name: 'cleanup.policy', value: 'compact' }] - default: []
200
- }
201
- ]
202
- })
203
- await admin.disconnect()
204
- return result;
205
- } catch (error) {
206
- this.#RaiseError(`KafkaManager:CreateTopic(): Error: [${error}]`, errorCb);
207
- return false;
208
- }
209
- }
210
- }