@lucaapp/service-utils 1.9.2 → 1.11.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.
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from './lib/kafka';
2
2
  export * from './lib/serviceIdentity';
3
3
  export * from './lib/metrics';
4
+ export * from './lib/requestTracer';
4
5
  export * from './lib/wsEvent';
5
6
  export * from './lib/lifecycle';
6
7
  export * from './lib/logger';
package/dist/index.js CHANGED
@@ -17,6 +17,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./lib/kafka"), exports);
18
18
  __exportStar(require("./lib/serviceIdentity"), exports);
19
19
  __exportStar(require("./lib/metrics"), exports);
20
+ __exportStar(require("./lib/requestTracer"), exports);
20
21
  __exportStar(require("./lib/wsEvent"), exports);
21
22
  __exportStar(require("./lib/lifecycle"), exports);
22
23
  __exportStar(require("./lib/logger"), exports);
@@ -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);
@@ -0,0 +1 @@
1
+ export * from './requestTracer';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./requestTracer"), exports);
@@ -0,0 +1,12 @@
1
+ /// <reference types="node/http" />
2
+ /// <reference types="lib/logger/types" />
3
+ /// <reference types="pino-http" />
4
+ declare const getRequestTracerId: () => string;
5
+ declare const getRequestTracerMixin: () => {
6
+ reqId: {};
7
+ } | {
8
+ reqId?: undefined;
9
+ };
10
+ declare const getRequestIdHeader: () => object;
11
+ declare const requestTracerMiddleware: () => (req: import("http").IncomingMessage, res: import("http").ServerResponse<import("http").IncomingMessage>, next: (err?: any) => void) => void;
12
+ export { getRequestTracerId, getRequestTracerMixin, getRequestIdHeader, requestTracerMiddleware, };
@@ -0,0 +1,26 @@
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
+ exports.requestTracerMiddleware = exports.getRequestIdHeader = exports.getRequestTracerMixin = exports.getRequestTracerId = void 0;
7
+ const uuid_1 = require("uuid");
8
+ const cls_rtracer_1 = __importDefault(require("cls-rtracer"));
9
+ const REQUEST_ID_HEADER = 'x-request-id';
10
+ const getRequestTracerId = () => cls_rtracer_1.default.id() ? `${cls_rtracer_1.default.id()}` : (0, uuid_1.v4)();
11
+ exports.getRequestTracerId = getRequestTracerId;
12
+ const getRequestTracerMixin = () => {
13
+ const reqId = cls_rtracer_1.default.id();
14
+ return reqId ? { reqId } : {};
15
+ };
16
+ exports.getRequestTracerMixin = getRequestTracerMixin;
17
+ const getRequestIdHeader = () => {
18
+ const reqId = getRequestTracerId();
19
+ return reqId ? { [REQUEST_ID_HEADER]: reqId } : {};
20
+ };
21
+ exports.getRequestIdHeader = getRequestIdHeader;
22
+ const requestTracerMiddleware = () => cls_rtracer_1.default.expressMiddleware({
23
+ echoHeader: true,
24
+ useHeader: true,
25
+ });
26
+ exports.requestTracerMiddleware = requestTracerMiddleware;
@@ -31,6 +31,7 @@ const jose = __importStar(require("jose"));
31
31
  const url_1 = require("url");
32
32
  const boom_1 = require("@hapi/boom");
33
33
  const moment_1 = __importDefault(require("moment"));
34
+ const requestTracer_1 = require("../requestTracer");
34
35
  const axios_1 = __importDefault(require("axios"));
35
36
  const JWT_ALGORITHM = 'ES256';
36
37
  const JWT_HEADER_NAME = 'X-Identity';
@@ -86,6 +87,7 @@ class ServiceIdentity {
86
87
  const request = {
87
88
  headers: {
88
89
  [JWT_HEADER_NAME]: jwt,
90
+ ...(0, requestTracer_1.getRequestIdHeader)(),
89
91
  },
90
92
  baseURL: `http://${service}:8080/`,
91
93
  url,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lucaapp/service-utils",
3
- "version": "1.9.2",
3
+ "version": "1.11.0",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "files": [
@@ -38,6 +38,7 @@
38
38
  "@hapi/boom": "^10.0.0",
39
39
  "@types/express": "4.17.13",
40
40
  "axios": "^0.27.2",
41
+ "cls-rtracer": "^2.6.2",
41
42
  "jose": "4.9.2",
42
43
  "kafkajs": "2.1.0",
43
44
  "lodash": "^4.17.21",