@lucaapp/service-utils 1.10.0 → 1.12.0

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.
@@ -10,6 +10,7 @@ declare class KafkaClient {
10
10
  private readonly topicSecrets;
11
11
  private readonly admin;
12
12
  private readonly producer;
13
+ private readonly consumers;
13
14
  readonly serviceIdentity: ServiceIdentity;
14
15
  constructor(parentLogger: Logger, kafkaConfig: KafkaConfiguration, topicSecrets: Partial<Record<KafkaTopic, string>>, serviceIdentity: ServiceIdentity);
15
16
  connect: () => Promise<void>;
@@ -23,5 +24,6 @@ declare class KafkaClient {
23
24
  private ensureTopics;
24
25
  consume: <T extends KafkaTopic>(kafkaTopic: T, handler: EventPayloadHandler<T>, fromBeginning?: boolean) => Promise<Consumer>;
25
26
  produce: <T extends KafkaTopic>(kafkaTopic: T, key: string, value: KafkaEvent<T>) => Promise<void>;
27
+ shutdown: () => Promise<void>;
26
28
  }
27
29
  export { KafkaClient };
@@ -159,6 +159,7 @@ class KafkaClient {
159
159
  const groupId = `${this.environment.valueOf()}_${this.serviceIdentity.identityName}`;
160
160
  try {
161
161
  const consumer = this.kafkaClient.consumer({ groupId });
162
+ this.consumers.push(consumer);
162
163
  await consumer.connect();
163
164
  await consumer.subscribe({ topic, fromBeginning });
164
165
  await consumer.run({
@@ -218,6 +219,19 @@ class KafkaClient {
218
219
  throw (0, utils_1.logAndGetError)(this.logger, `Could not produce message for topic=${topic}`, error);
219
220
  }
220
221
  };
222
+ this.shutdown = async () => {
223
+ try {
224
+ for (const consumer of this.consumers) {
225
+ await consumer.disconnect();
226
+ }
227
+ await this.producer.disconnect();
228
+ await this.admin.disconnect();
229
+ this.logger.info('Disconnected kafka consumers and producer');
230
+ }
231
+ catch (error) {
232
+ this.logger.error(error, 'Unable to properly disconnect kafka');
233
+ }
234
+ };
221
235
  this.environment = kafkaConfig.environment;
222
236
  this.logger = parentLogger.child({
223
237
  kafkaClientId: kafkaConfig.clientId,
@@ -243,6 +257,7 @@ class KafkaClient {
243
257
  });
244
258
  this.admin = this.kafkaClient.admin();
245
259
  this.producer = this.kafkaClient.producer();
260
+ this.consumers = [];
246
261
  }
247
262
  catch (error) {
248
263
  throw (0, utils_1.logAndGetError)(this.logger, 'Unable to connect to Kafka', error);
@@ -7,22 +7,22 @@ exports.LoggerFactory = void 0;
7
7
  const pino_1 = __importDefault(require("pino"));
8
8
  const pino_http_1 = __importDefault(require("pino-http"));
9
9
  const pick_1 = __importDefault(require("lodash/pick"));
10
- const uuid_1 = require("uuid");
10
+ const requestTracer_1 = require("../requestTracer");
11
11
  class LoggerFactory {
12
12
  static getLogger(logLevel) {
13
- return (0, pino_1.default)({ level: logLevel });
13
+ return (0, pino_1.default)({ level: logLevel, mixin: requestTracer_1.getRequestTracerMixin });
14
14
  }
15
15
  static getHttpLogger(options) {
16
16
  const { requestSerializer, responseSerializer, errorSerializer, defaultHttpLogLevel, customMessage, } = new HttpLoggerHelpers(options);
17
17
  const logger = this.getLogger(options.logLevel);
18
18
  return (0, pino_http_1.default)({
19
- logger: logger,
19
+ logger,
20
20
  serializers: {
21
21
  req: requestSerializer,
22
22
  res: responseSerializer,
23
23
  err: errorSerializer,
24
24
  },
25
- customLogLevel: (response, error) => {
25
+ customLogLevel: (_, response, error) => {
26
26
  if (response.statusCode >= 400 && response.statusCode < 500)
27
27
  return 'warn';
28
28
  if (response.statusCode >= 500 || error)
@@ -30,8 +30,9 @@ class LoggerFactory {
30
30
  return defaultHttpLogLevel;
31
31
  },
32
32
  customSuccessMessage: customMessage,
33
- customErrorMessage: (_, response) => customMessage(response),
34
- genReqId: () => (0, uuid_1.v4)(),
33
+ customErrorMessage: customMessage,
34
+ mixin: requestTracer_1.getRequestTracerMixin,
35
+ genReqId: requestTracer_1.getRequestTracerId,
35
36
  });
36
37
  }
37
38
  }
@@ -51,6 +52,7 @@ class HttpLoggerHelpers {
51
52
  'x-forwarded-host',
52
53
  'x-forwarded-port',
53
54
  'x-scheme',
55
+ 'x-request-id',
54
56
  'user-agent',
55
57
  'content-type',
56
58
  'accept',
@@ -69,6 +71,7 @@ class HttpLoggerHelpers {
69
71
  ]);
70
72
  return response;
71
73
  };
74
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
72
75
  this.errorSerializer = (error) => {
73
76
  if (error?.parameters)
74
77
  error.parameters = undefined;
@@ -78,12 +81,13 @@ class HttpLoggerHelpers {
78
81
  error.original.parameters = undefined;
79
82
  return error;
80
83
  };
81
- this.customMessage = (response) => {
82
- const { req: { method, originalUrl }, statusCode, } = response;
84
+ this.customMessage = (request, response) => {
85
+ const { method, originalUrl } = request;
86
+ const { statusCode } = response;
83
87
  return `${statusCode} ${method} ${originalUrl}`;
84
88
  };
85
- this.debug = !!debug;
86
- this.e2e = !!e2e;
89
+ this.debug = debug;
90
+ this.e2e = e2e;
87
91
  this.defaultHttpLogLevel = defaultHttpLogLevel || 'info';
88
92
  }
89
93
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lucaapp/service-utils",
3
- "version": "1.10.0",
3
+ "version": "1.12.0",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "files": [
@@ -43,7 +43,7 @@
43
43
  "kafkajs": "2.1.0",
44
44
  "lodash": "^4.17.21",
45
45
  "moment": "^2.29.4",
46
- "pino-http": "6.6.0",
46
+ "pino-http": "8.2.1",
47
47
  "prom-client": "14.1.0",
48
48
  "uuid": "^9.0.0"
49
49
  }