@riocrypto/common-server 1.0.1894 → 1.0.1896
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/build/services/logger.d.ts +4 -1
- package/build/services/logger.js +87 -30
- package/package.json +1 -1
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { Logger } from "winston";
|
|
2
2
|
declare class LoggerService {
|
|
3
|
+
private static instance;
|
|
3
4
|
private logger;
|
|
4
|
-
constructor();
|
|
5
|
+
private constructor();
|
|
5
6
|
private maskValue;
|
|
6
7
|
private maskSensitiveData;
|
|
8
|
+
private requestMethodFilter;
|
|
7
9
|
getLogger(): Logger;
|
|
10
|
+
static getInstance(): LoggerService;
|
|
8
11
|
initLogger(): Promise<void>;
|
|
9
12
|
}
|
|
10
13
|
declare const loggerService: LoggerService;
|
package/build/services/logger.js
CHANGED
|
@@ -1,4 +1,27 @@
|
|
|
1
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
2
25
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
26
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
27
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -8,14 +31,25 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
31
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
32
|
});
|
|
10
33
|
};
|
|
34
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
35
|
+
var t = {};
|
|
36
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
37
|
+
t[p] = s[p];
|
|
38
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
39
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
40
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
41
|
+
t[p[i]] = s[p[i]];
|
|
42
|
+
}
|
|
43
|
+
return t;
|
|
44
|
+
};
|
|
11
45
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
const common_1 = require("@riocrypto/common");
|
|
13
46
|
const winston_1 = require("winston");
|
|
14
47
|
class LoggerService {
|
|
15
48
|
constructor() {
|
|
16
49
|
this.maskSensitiveData = (0, winston_1.format)((info) => {
|
|
50
|
+
var _a, _b, _c, _d, _e, _f;
|
|
17
51
|
// Mask sensitive headers
|
|
18
|
-
if (info.meta
|
|
52
|
+
if ((_b = (_a = info.meta) === null || _a === void 0 ? void 0 : _a.req) === null || _b === void 0 ? void 0 : _b.headers) {
|
|
19
53
|
const headers = info.meta.req.headers;
|
|
20
54
|
const headerKeysToMask = [
|
|
21
55
|
"x-api-key",
|
|
@@ -24,7 +58,7 @@ class LoggerService {
|
|
|
24
58
|
];
|
|
25
59
|
headerKeysToMask.forEach((key) => {
|
|
26
60
|
if (headers[key]) {
|
|
27
|
-
headers[key] = this.maskValue(headers[key]);
|
|
61
|
+
headers[key] = this.maskValue(headers[key]);
|
|
28
62
|
}
|
|
29
63
|
});
|
|
30
64
|
// Mask cookies specifically
|
|
@@ -33,20 +67,23 @@ class LoggerService {
|
|
|
33
67
|
.split("; ")
|
|
34
68
|
.map((cookie) => {
|
|
35
69
|
const [key, value] = cookie.split("=");
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
70
|
+
const sensitiveCookies = [
|
|
71
|
+
"accessToken",
|
|
72
|
+
"adminAccessToken",
|
|
73
|
+
"refreshToken",
|
|
74
|
+
"adminRefreshToken",
|
|
75
|
+
"phoneVerifiedJWT",
|
|
76
|
+
];
|
|
77
|
+
if (sensitiveCookies.includes(key)) {
|
|
78
|
+
return `${key}=${this.maskValue(value)}`;
|
|
42
79
|
}
|
|
43
|
-
return cookie;
|
|
80
|
+
return cookie;
|
|
44
81
|
})
|
|
45
82
|
.join("; ");
|
|
46
83
|
}
|
|
47
84
|
}
|
|
48
85
|
// Mask sensitive request body fields
|
|
49
|
-
if (info.meta
|
|
86
|
+
if ((_d = (_c = info.meta) === null || _c === void 0 ? void 0 : _c.req) === null || _d === void 0 ? void 0 : _d.body) {
|
|
50
87
|
const requestBodyFieldsToMask = [
|
|
51
88
|
"password",
|
|
52
89
|
"newPassword",
|
|
@@ -56,21 +93,33 @@ class LoggerService {
|
|
|
56
93
|
];
|
|
57
94
|
requestBodyFieldsToMask.forEach((field) => {
|
|
58
95
|
if (info.meta.req.body.hasOwnProperty(field)) {
|
|
59
|
-
info.meta.req.body[field] = this.maskValue(info.meta.req.body[field]);
|
|
96
|
+
info.meta.req.body[field] = this.maskValue(info.meta.req.body[field]);
|
|
60
97
|
}
|
|
61
98
|
});
|
|
62
99
|
}
|
|
63
100
|
// Mask sensitive response body fields
|
|
64
|
-
if (info.meta
|
|
65
|
-
const responseBodyFieldsToMask = ["secret", "
|
|
101
|
+
if ((_f = (_e = info.meta) === null || _e === void 0 ? void 0 : _e.res) === null || _f === void 0 ? void 0 : _f.body) {
|
|
102
|
+
const responseBodyFieldsToMask = ["secret", "sensitiveValue"];
|
|
66
103
|
responseBodyFieldsToMask.forEach((field) => {
|
|
67
104
|
if (info.meta.res.body.hasOwnProperty(field)) {
|
|
68
|
-
info.meta.res.body[field] = this.maskValue(info.meta.res.body[field]);
|
|
105
|
+
info.meta.res.body[field] = this.maskValue(info.meta.res.body[field]);
|
|
69
106
|
}
|
|
70
107
|
});
|
|
71
108
|
}
|
|
72
109
|
return info;
|
|
73
110
|
});
|
|
111
|
+
this.requestMethodFilter = (0, winston_1.format)((info) => {
|
|
112
|
+
var _a, _b;
|
|
113
|
+
const allowedMethods = ((_a = process.env.LOG_METHODS) === null || _a === void 0 ? void 0 : _a.split(",")) || [
|
|
114
|
+
"POST",
|
|
115
|
+
"PATCH",
|
|
116
|
+
"DELETE",
|
|
117
|
+
];
|
|
118
|
+
if (((_b = info.meta) === null || _b === void 0 ? void 0 : _b.req) && allowedMethods.includes(info.meta.req.method)) {
|
|
119
|
+
return info;
|
|
120
|
+
}
|
|
121
|
+
return false; // Filter out logs for other methods
|
|
122
|
+
});
|
|
74
123
|
this.logger = null;
|
|
75
124
|
}
|
|
76
125
|
maskValue(value) {
|
|
@@ -80,35 +129,43 @@ class LoggerService {
|
|
|
80
129
|
}
|
|
81
130
|
getLogger() {
|
|
82
131
|
if (!this.logger) {
|
|
83
|
-
|
|
132
|
+
throw new Error("Logger has not been initialized. Please call initLogger() first.");
|
|
84
133
|
}
|
|
85
134
|
return this.logger;
|
|
86
135
|
}
|
|
136
|
+
static getInstance() {
|
|
137
|
+
if (!LoggerService.instance) {
|
|
138
|
+
LoggerService.instance = new LoggerService();
|
|
139
|
+
}
|
|
140
|
+
return LoggerService.instance;
|
|
141
|
+
}
|
|
87
142
|
initLogger() {
|
|
88
143
|
return __awaiter(this, void 0, void 0, function* () {
|
|
89
|
-
|
|
90
|
-
const
|
|
144
|
+
try {
|
|
145
|
+
const logLevel = "info";
|
|
146
|
+
const HyperDX = yield Promise.resolve().then(() => __importStar(require("@hyperdx/node-opentelemetry")));
|
|
91
147
|
this.logger = (0, winston_1.createLogger)({
|
|
92
|
-
level:
|
|
93
|
-
format: winston_1.format.combine(winston_1.format.timestamp(), this.maskSensitiveData(),
|
|
148
|
+
level: logLevel,
|
|
149
|
+
format: winston_1.format.combine(winston_1.format.colorize(), winston_1.format.timestamp(), this.maskSensitiveData(), this.requestMethodFilter(), winston_1.format.printf((_a) => {
|
|
150
|
+
var { timestamp, level, message } = _a, meta = __rest(_a, ["timestamp", "level", "message"]);
|
|
151
|
+
return `${timestamp} [${level}]: ${message} ${JSON.stringify(meta)}`;
|
|
152
|
+
})),
|
|
94
153
|
transports: [
|
|
95
154
|
new winston_1.transports.Console(),
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
155
|
+
// @ts-ignore
|
|
156
|
+
HyperDX.getWinstonTransport("info", {
|
|
157
|
+
// Send logs info and above
|
|
158
|
+
detectResources: true,
|
|
99
159
|
}),
|
|
100
160
|
],
|
|
101
161
|
});
|
|
102
162
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
format: winston_1.format.combine(winston_1.format.timestamp(), this.maskSensitiveData(), winston_1.format.json(), winston_1.format.metadata(), winston_1.format.prettyPrint()),
|
|
107
|
-
transports: [new winston_1.transports.Console()],
|
|
108
|
-
});
|
|
163
|
+
catch (error) {
|
|
164
|
+
console.error("Failed to initialize logger:", error);
|
|
165
|
+
// Handle the error as needed
|
|
109
166
|
}
|
|
110
167
|
});
|
|
111
168
|
}
|
|
112
169
|
}
|
|
113
|
-
const loggerService =
|
|
170
|
+
const loggerService = LoggerService.getInstance();
|
|
114
171
|
exports.default = loggerService;
|