@cargolift-cdi/lib-common 0.0.2

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 (68) hide show
  1. package/LICENSE +9 -0
  2. package/README.jwt-logger-context.md +44 -0
  3. package/README.md +232 -0
  4. package/dist/auth/api-client.decorator.d.ts +2 -0
  5. package/dist/auth/api-client.decorator.js +4 -0
  6. package/dist/auth/api-client.decorator.js.map +1 -0
  7. package/dist/auth/auth.guard.d.ts +13 -0
  8. package/dist/auth/auth.guard.js +95 -0
  9. package/dist/auth/auth.guard.js.map +1 -0
  10. package/dist/auth/auth.module.d.ts +2 -0
  11. package/dist/auth/auth.module.js +19 -0
  12. package/dist/auth/auth.module.js.map +1 -0
  13. package/dist/auth/jwt-verifier.service.d.ts +22 -0
  14. package/dist/auth/jwt-verifier.service.js +164 -0
  15. package/dist/auth/jwt-verifier.service.js.map +1 -0
  16. package/dist/auth/roles.decorator.d.ts +2 -0
  17. package/dist/auth/roles.decorator.js +4 -0
  18. package/dist/auth/roles.decorator.js.map +1 -0
  19. package/dist/auth/user.decorator.d.ts +1 -0
  20. package/dist/auth/user.decorator.js +6 -0
  21. package/dist/auth/user.decorator.js.map +1 -0
  22. package/dist/errors/application.error.d.ts +7 -0
  23. package/dist/errors/application.error.js +12 -0
  24. package/dist/errors/application.error.js.map +1 -0
  25. package/dist/errors/base.error.d.ts +22 -0
  26. package/dist/errors/base.error.js +37 -0
  27. package/dist/errors/base.error.js.map +1 -0
  28. package/dist/errors/business.error.d.ts +7 -0
  29. package/dist/errors/business.error.js +12 -0
  30. package/dist/errors/business.error.js.map +1 -0
  31. package/dist/errors/invalid-payload-business.error.d.ts +7 -0
  32. package/dist/errors/invalid-payload-business.error.js +10 -0
  33. package/dist/errors/invalid-payload-business.error.js.map +1 -0
  34. package/dist/errors/invalid-schema-validation.error.d.ts +9 -0
  35. package/dist/errors/invalid-schema-validation.error.js +8 -0
  36. package/dist/errors/invalid-schema-validation.error.js.map +1 -0
  37. package/dist/errors/not-found-business.error.d.ts +7 -0
  38. package/dist/errors/not-found-business.error.js +20 -0
  39. package/dist/errors/not-found-business.error.js.map +1 -0
  40. package/dist/filters/api-exceptions.filter.d.ts +8 -0
  41. package/dist/filters/api-exceptions.filter.js +113 -0
  42. package/dist/filters/api-exceptions.filter.js.map +1 -0
  43. package/dist/index.d.ts +16 -0
  44. package/dist/index.js +17 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/logger/app-logger.module.d.ts +13 -0
  47. package/dist/logger/app-logger.module.js +42 -0
  48. package/dist/logger/app-logger.module.js.map +1 -0
  49. package/dist/logger/app-logger.token.d.ts +1 -0
  50. package/dist/logger/app-logger.token.js +2 -0
  51. package/dist/logger/app-logger.token.js.map +1 -0
  52. package/dist/logger/logger.async-context.d.ts +10 -0
  53. package/dist/logger/logger.async-context.js +20 -0
  54. package/dist/logger/logger.async-context.js.map +1 -0
  55. package/dist/logger/logger.module.d.ts +2 -0
  56. package/dist/logger/logger.module.js +19 -0
  57. package/dist/logger/logger.module.js.map +1 -0
  58. package/dist/logger/logger.service.d.ts +27 -0
  59. package/dist/logger/logger.service.js +275 -0
  60. package/dist/logger/logger.service.js.map +1 -0
  61. package/dist/middleware/api-logger.middleware.d.ts +8 -0
  62. package/dist/middleware/api-logger.middleware.js +83 -0
  63. package/dist/middleware/api-logger.middleware.js.map +1 -0
  64. package/dist/tsconfig.tsbuildinfo +1 -0
  65. package/dist/util/payload.util.d.ts +4 -0
  66. package/dist/util/payload.util.js +34 -0
  67. package/dist/util/payload.util.js.map +1 -0
  68. package/package.json +38 -0
@@ -0,0 +1,275 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Injectable, Scope } from "@nestjs/common";
11
+ import pino from "pino";
12
+ import { v4 as uuidv4 } from "uuid";
13
+ import { getLoggerContext, updateLoggerContext } from "./logger.async-context.js";
14
+ let LoggerContextService = class LoggerContextService {
15
+ constructor() {
16
+ const transportOptions = {
17
+ target: "pino-pretty",
18
+ options: {
19
+ colorize: true,
20
+ translateTime: "SYS:dd/mm/yyyy HH:MM:ss",
21
+ ignore: process.env.LOG_DEBUG_IGNORE || "pid,hostname,trace,correlation_id,application,message",
22
+ messageFormat: "{message}",
23
+ },
24
+ };
25
+ this.pinoLogger = pino({
26
+ level: process.env.LOG_LEVEL || "info",
27
+ transport: process.env.NODE_ENV === "development" ? transportOptions : undefined,
28
+ });
29
+ }
30
+ setDefaultContext(req, rabbitMQMessage, context) {
31
+ this.setContext(context, req, rabbitMQMessage);
32
+ }
33
+ setContextRequest(req, context) {
34
+ this.setContext(context, req);
35
+ }
36
+ setContextRabbitMQ(rabbitMQMessage, context) {
37
+ this.setContext(context, undefined, rabbitMQMessage);
38
+ }
39
+ setContext(context, req, rabbitMQMessage) {
40
+ const xTrace = req?.headers?.["x-trace"] || rabbitMQMessage?.properties?.headers?.["x-trace"];
41
+ const xCorrelation = req?.correlation_id ||
42
+ req?.headers?.["x-correlation-id"] ||
43
+ rabbitMQMessage?.properties?.headers?.["x-correlation-id"];
44
+ const xSource = req?.headers?.["x-source"] || rabbitMQMessage?.properties?.headers?.["x-source"];
45
+ const xTimestampStart = req?.headers?.["x-timestamp-start"] ||
46
+ rabbitMQMessage?.properties?.headers?.["x-timestamp-start"];
47
+ const current = getLoggerContext();
48
+ const base = { ...current, ...(context || {}) };
49
+ base.correlation_id = base.correlation_id || context?.correlation_id || xCorrelation || uuidv4();
50
+ base.timestamp_start = base.timestamp_start || context?.timestamp_start || xTimestampStart || Date.now();
51
+ base.source = base.source || xSource;
52
+ if (!base.application) {
53
+ base.application = {
54
+ name: process.env.npm_package_name,
55
+ function: context?.application?.function ||
56
+ req?.originalUrl ||
57
+ req?.url ||
58
+ rabbitMQMessage?.fields?.routingKey ||
59
+ rabbitMQMessage?.properties?.headers?.pattern ||
60
+ "unknown",
61
+ action: context?.application?.action ||
62
+ req?.method ||
63
+ rabbitMQMessage?.properties?.headers?.action ||
64
+ rabbitMQMessage?.fields?.routingKey ||
65
+ undefined,
66
+ method: req?.method || undefined,
67
+ };
68
+ }
69
+ let incomingTrace = Array.isArray(base.trace) ? [...base.trace] : [];
70
+ if (xTrace) {
71
+ try {
72
+ const traceObj = typeof xTrace === "string" ? JSON.parse(xTrace) : xTrace;
73
+ if (Array.isArray(traceObj)) {
74
+ for (const item of traceObj) {
75
+ if (item && typeof item === "object")
76
+ incomingTrace.push(item);
77
+ }
78
+ }
79
+ else if (traceObj && typeof traceObj === "object") {
80
+ incomingTrace.push(traceObj);
81
+ }
82
+ }
83
+ catch {
84
+ }
85
+ }
86
+ if (incomingTrace.length > 10)
87
+ incomingTrace = incomingTrace.slice(-10);
88
+ incomingTrace.push({
89
+ application: base.application.name,
90
+ function: base.application.function,
91
+ timestamp: new Date().toISOString(),
92
+ });
93
+ base.trace = incomingTrace;
94
+ const maxDepth = parseInt(process.env.TRACE_MAX_DEPTH || "5", 5);
95
+ if (base.trace.length > maxDepth) {
96
+ base.trace = base.trace
97
+ .slice(0, maxDepth / 2)
98
+ .concat({
99
+ application: "...",
100
+ function: "...",
101
+ timestamp: "...",
102
+ })
103
+ .concat(base.trace.slice(base.trace.length - maxDepth / 2));
104
+ }
105
+ base.warns = base.warns || [];
106
+ updateLoggerContext(base);
107
+ if (req) {
108
+ req.correlation_id = base.correlation_id;
109
+ req.logContext = { ...base };
110
+ req.source = base.source;
111
+ }
112
+ }
113
+ setLogInbound(inbound) {
114
+ let ctx = getLoggerContext();
115
+ const existing = ctx.inbound || {};
116
+ ctx.inbound = {
117
+ ...existing,
118
+ ...inbound,
119
+ };
120
+ updateLoggerContext(ctx);
121
+ }
122
+ addTrace(application, functionName) {
123
+ let ctx = getLoggerContext();
124
+ ctx.trace.push({
125
+ application,
126
+ function: functionName,
127
+ timestamp: new Date().toISOString(),
128
+ });
129
+ updateLoggerContext(ctx);
130
+ }
131
+ addWarn(message, logType = "application", extraContext) {
132
+ let ctx = getLoggerContext();
133
+ if (!ctx.warns)
134
+ ctx.warns = [];
135
+ ctx.warns.push(this.buildWarnEntry(message, logType, extraContext));
136
+ updateLoggerContext(ctx);
137
+ }
138
+ getContext() {
139
+ return getLoggerContext();
140
+ }
141
+ updateSource(partial) {
142
+ if (!partial || Object.keys(partial).length === 0)
143
+ return this.getContext();
144
+ const current = getLoggerContext();
145
+ const merged = {
146
+ ...current,
147
+ source: {
148
+ ...(current?.source || {}),
149
+ ...(partial || {}),
150
+ },
151
+ };
152
+ updateLoggerContext(merged);
153
+ return merged;
154
+ }
155
+ isContextSet() {
156
+ const ctx = getLoggerContext();
157
+ return !!(ctx?.application && ctx.correlation_id);
158
+ }
159
+ buildLog(message, logType, extraContext = {}) {
160
+ const ctx = getLoggerContext();
161
+ return {
162
+ message,
163
+ logType,
164
+ ...ctx,
165
+ ...extraContext,
166
+ };
167
+ }
168
+ info(message, extraContext) {
169
+ this.pinoLogger.info(this.buildLog(message, "application", extraContext));
170
+ }
171
+ debug(message, extraContext) {
172
+ this.pinoLogger.debug(this.buildLog(message, "application", extraContext));
173
+ }
174
+ log(message, extraContext) {
175
+ this.info(message, extraContext);
176
+ }
177
+ error(message, errorContext, extraContext) {
178
+ let error = {};
179
+ if (errorContext) {
180
+ if (errorContext instanceof Error) {
181
+ error = {
182
+ name: errorContext.name,
183
+ message: errorContext.message,
184
+ stack: errorContext.stack,
185
+ ...Object.getOwnPropertyNames(errorContext).reduce((acc, key) => {
186
+ acc[key] = errorContext[key];
187
+ return acc;
188
+ }, {})
189
+ };
190
+ }
191
+ else {
192
+ error = errorContext;
193
+ }
194
+ }
195
+ this.pinoLogger.error(this.buildLog(message, "application", {
196
+ ...extraContext,
197
+ error
198
+ }));
199
+ }
200
+ warn(message, extraContext) {
201
+ this.addWarn(message, "application");
202
+ this.pinoLogger.warn(this.buildLog(message, "application", extraContext));
203
+ }
204
+ businessError(message, extraContext) {
205
+ this.pinoLogger.error(this.buildLog(message, "business", extraContext));
206
+ }
207
+ businessWarn(message, extraContext) {
208
+ this.addWarn(message, "business");
209
+ this.pinoLogger.warn(this.buildLog(message, "business", extraContext));
210
+ }
211
+ buildRabbitContext(msg, staticBindings = {}) {
212
+ const headers = msg?.properties?.headers || {};
213
+ const correlation = headers["x-correlation-id"] || msg.properties?.correlation_id;
214
+ const timestamp_start = headers["x-timestamp-start"] || Date.now();
215
+ const traceHeader = headers["x-trace"];
216
+ const source = headers["x-source"] || msg.properties?.source || undefined;
217
+ let trace = [];
218
+ if (traceHeader) {
219
+ try {
220
+ const parsed = typeof traceHeader === "string" ? JSON.parse(traceHeader) : traceHeader;
221
+ if (Array.isArray(parsed))
222
+ trace = parsed.filter(Boolean);
223
+ }
224
+ catch {
225
+ }
226
+ }
227
+ const functionName = staticBindings.queue || headers?.pattern || msg.fields?.routingKey || "rabbitmq-message";
228
+ trace.push({
229
+ application: process.env.npm_package_name || "unknow",
230
+ function: functionName,
231
+ timestamp: new Date().toISOString(),
232
+ });
233
+ const maxDepth = Number.parseInt(process.env.TRACE_MAX_DEPTH || "5", 10) || 5;
234
+ if (trace.length > maxDepth) {
235
+ trace = trace
236
+ .slice(0, maxDepth / 2)
237
+ .concat({
238
+ application: "...",
239
+ function: "...",
240
+ timestamp: "...",
241
+ })
242
+ .concat(trace.slice(trace.length - maxDepth / 2));
243
+ }
244
+ return {
245
+ correlation_id: correlation || "undefined",
246
+ timestamp_start,
247
+ source,
248
+ trace,
249
+ ...staticBindings,
250
+ application: {
251
+ name: staticBindings?.application?.name || process.env.npm_package_name || "unknow",
252
+ function: staticBindings?.application?.function || functionName,
253
+ action: staticBindings?.application?.action || msg.fields?.routingKey || undefined,
254
+ },
255
+ };
256
+ }
257
+ buildWarnEntry(message, logType = "application", extraContext) {
258
+ let serializedContext = "";
259
+ if (extraContext && Object.keys(extraContext).length > 0) {
260
+ try {
261
+ serializedContext = ` => ${JSON.stringify(extraContext)}`;
262
+ }
263
+ catch {
264
+ serializedContext = " => [context_not_serializable]";
265
+ }
266
+ }
267
+ return `${new Date().toISOString()} [${logType}] ${message}${serializedContext}`;
268
+ }
269
+ };
270
+ LoggerContextService = __decorate([
271
+ Injectable({ scope: Scope.DEFAULT }),
272
+ __metadata("design:paramtypes", [])
273
+ ], LoggerContextService);
274
+ export { LoggerContextService };
275
+ //# sourceMappingURL=logger.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.service.js","sourceRoot":"","sources":["../../src/logger/logger.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { NestMiddleware } from '@nestjs/common';
2
+ import { ModuleRef } from '@nestjs/core';
3
+ export declare class APILoggerMiddleware implements NestMiddleware {
4
+ private readonly moduleRef;
5
+ constructor(moduleRef: ModuleRef);
6
+ use(req: any, res: any, next: Function): Promise<void>;
7
+ private safeBody;
8
+ }
@@ -0,0 +1,83 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Injectable } from '@nestjs/common';
11
+ import { ModuleRef, ContextIdFactory } from '@nestjs/core';
12
+ import { LoggerContextService } from '../logger/logger.service.js';
13
+ import { runWithLoggerContext } from '../logger/logger.async-context.js';
14
+ let APILoggerMiddleware = class APILoggerMiddleware {
15
+ constructor(moduleRef) {
16
+ this.moduleRef = moduleRef;
17
+ }
18
+ async use(req, res, next) {
19
+ req.timestamp_start = req.headers['x-request-start'] || (new Date()).toISOString();
20
+ const contextId = ContextIdFactory.getByRequest(req);
21
+ const logger = await this.moduleRef.resolve(LoggerContextService, contextId, { strict: false });
22
+ const startHr = typeof process.hrtime.bigint === 'function' ? process.hrtime.bigint() : null;
23
+ const url = req?.originalUrl || req?.url;
24
+ runWithLoggerContext({}, () => {
25
+ try {
26
+ if (!logger.isContextSet()) {
27
+ logger.setContextRequest(req);
28
+ }
29
+ logger.debug(`HTTP ${req?.method} ${url} [${res?.statusCode}] - Request received`, {
30
+ application: {
31
+ ...logger.getContext().application || {},
32
+ action: 'request',
33
+ },
34
+ source: {
35
+ ip: req?.ip || req?.headers?.['x-forwarded-for'] || req?.connection?.remoteAddress || 'unknown',
36
+ user_agent: req?.headers?.['user-agent'] || 'unknown',
37
+ },
38
+ data: {
39
+ request: { method: req?.method, path: url },
40
+ payload: this.safeBody(req?.body),
41
+ },
42
+ });
43
+ res?.on?.('finish', () => {
44
+ const endHr = typeof process.hrtime.bigint === 'function' ? process.hrtime.bigint() : null;
45
+ const durationMs = startHr && endHr ? Number((endHr - startHr) / BigInt(1_000_000)) : undefined;
46
+ logger.debug(`HTTP ${req?.method} ${url} [${res?.statusCode}] - Response sent`, {
47
+ application: {
48
+ ...logger.getContext().application || {},
49
+ action: 'response',
50
+ },
51
+ data: {
52
+ response: { statusCode: res?.statusCode, durationMs },
53
+ },
54
+ });
55
+ });
56
+ }
57
+ catch {
58
+ }
59
+ finally {
60
+ next();
61
+ }
62
+ });
63
+ }
64
+ safeBody(body) {
65
+ if (!body || typeof body !== 'object')
66
+ return body;
67
+ const redact = new Set(['password', 'senha', 'token', 'access_token', 'authorization']);
68
+ if (Array.isArray(body)) {
69
+ return body.slice(0, 20).map((item) => (typeof item === 'object' ? this.safeBody(item) : item));
70
+ }
71
+ const out = {};
72
+ for (const [k, v] of Object.entries(body)) {
73
+ out[k] = redact.has(k.toLowerCase()) ? '***' : (typeof v === 'object' && v !== null ? this.safeBody(v) : v);
74
+ }
75
+ return out;
76
+ }
77
+ };
78
+ APILoggerMiddleware = __decorate([
79
+ Injectable(),
80
+ __metadata("design:paramtypes", [ModuleRef])
81
+ ], APILoggerMiddleware);
82
+ export { APILoggerMiddleware };
83
+ //# sourceMappingURL=api-logger.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-logger.middleware.js","sourceRoot":"","sources":["../../src/middleware/api-logger.middleware.ts"],"names":[],"mappings":"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"}