@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 +1 -0
- package/dist/index.js +1 -0
- package/dist/lib/kafka/kafkaClient.d.ts +2 -0
- package/dist/lib/kafka/kafkaClient.js +15 -0
- package/dist/lib/requestTracer/index.d.ts +1 -0
- package/dist/lib/requestTracer/index.js +17 -0
- package/dist/lib/requestTracer/requestTracer.d.ts +12 -0
- package/dist/lib/requestTracer/requestTracer.js +26 -0
- package/dist/lib/serviceIdentity/serviceIdentity.js +2 -0
- package/package.json +2 -1
package/dist/index.d.ts
CHANGED
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.
|
|
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",
|