api-logger-mongodb 1.0.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/LICENSE +21 -0
- package/README.md +353 -0
- package/dist/core/logger.d.ts +58 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +218 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/express.d.ts +8 -0
- package/dist/middleware/express.d.ts.map +1 -0
- package/dist/middleware/express.js +55 -0
- package/dist/middleware/express.js.map +1 -0
- package/dist/middleware/nestjs.d.ts +28 -0
- package/dist/middleware/nestjs.d.ts.map +1 -0
- package/dist/middleware/nestjs.js +77 -0
- package/dist/middleware/nestjs.js.map +1 -0
- package/dist/types/index.d.ts +75 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/filter.d.ts +23 -0
- package/dist/utils/filter.d.ts.map +1 -0
- package/dist/utils/filter.js +143 -0
- package/dist/utils/filter.js.map +1 -0
- package/dist/utils/mask.d.ts +16 -0
- package/dist/utils/mask.d.ts.map +1 -0
- package/dist/utils/mask.js +110 -0
- package/dist/utils/mask.js.map +1 -0
- package/dist/utils/standalone.d.ts +45 -0
- package/dist/utils/standalone.d.ts.map +1 -0
- package/dist/utils/standalone.js +115 -0
- package/dist/utils/standalone.js.map +1 -0
- package/dist/utils/validate.d.ts +6 -0
- package/dist/utils/validate.d.ts.map +1 -0
- package/dist/utils/validate.js +21 -0
- package/dist/utils/validate.js.map +1 -0
- package/package.json +73 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
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
|
+
exports.DEFAULT_MASK_FIELDS = exports.validateLoggerOptions = exports.createAxiosLogger = exports.StandaloneApiLogger = exports.ApiLoggerModule = exports.ApiLoggerNestMiddleware = exports.createApiLoggerModule = exports.createApiLoggerMiddleware = exports.ApiLogger = exports.apiLoggerExpress = void 0;
|
|
18
|
+
var express_1 = require("./middleware/express");
|
|
19
|
+
Object.defineProperty(exports, "apiLoggerExpress", { enumerable: true, get: function () { return express_1.apiLoggerExpress; } });
|
|
20
|
+
var logger_1 = require("./core/logger");
|
|
21
|
+
Object.defineProperty(exports, "ApiLogger", { enumerable: true, get: function () { return logger_1.ApiLogger; } });
|
|
22
|
+
__exportStar(require("./types"), exports);
|
|
23
|
+
var nestjs_1 = require("./middleware/nestjs");
|
|
24
|
+
Object.defineProperty(exports, "createApiLoggerMiddleware", { enumerable: true, get: function () { return nestjs_1.createApiLoggerMiddleware; } });
|
|
25
|
+
Object.defineProperty(exports, "createApiLoggerModule", { enumerable: true, get: function () { return nestjs_1.createApiLoggerModule; } });
|
|
26
|
+
Object.defineProperty(exports, "ApiLoggerNestMiddleware", { enumerable: true, get: function () { return nestjs_1.ApiLoggerNestMiddleware; } });
|
|
27
|
+
Object.defineProperty(exports, "ApiLoggerModule", { enumerable: true, get: function () { return nestjs_1.ApiLoggerModule; } });
|
|
28
|
+
var standalone_1 = require("./utils/standalone");
|
|
29
|
+
Object.defineProperty(exports, "StandaloneApiLogger", { enumerable: true, get: function () { return standalone_1.StandaloneApiLogger; } });
|
|
30
|
+
Object.defineProperty(exports, "createAxiosLogger", { enumerable: true, get: function () { return standalone_1.createAxiosLogger; } });
|
|
31
|
+
var validate_1 = require("./utils/validate");
|
|
32
|
+
Object.defineProperty(exports, "validateLoggerOptions", { enumerable: true, get: function () { return validate_1.validateLoggerOptions; } });
|
|
33
|
+
var mask_1 = require("./utils/mask");
|
|
34
|
+
Object.defineProperty(exports, "DEFAULT_MASK_FIELDS", { enumerable: true, get: function () { return mask_1.DEFAULT_MASK_FIELDS; } });
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,gDAAwD;AAA/C,2GAAA,gBAAgB,OAAA;AACzB,wCAA0C;AAAjC,mGAAA,SAAS,OAAA;AAClB,0CAAwB;AACxB,8CAK6B;AAJ3B,mHAAA,yBAAyB,OAAA;AACzB,+GAAA,qBAAqB,OAAA;AACrB,iHAAA,uBAAuB,OAAA;AACvB,yGAAA,eAAe,OAAA;AAEjB,iDAA4E;AAAnE,iHAAA,mBAAmB,OAAA;AAAE,+GAAA,iBAAiB,OAAA;AAC/C,6CAAyD;AAAhD,iHAAA,qBAAqB,OAAA;AAC9B,qCAAmD;AAA1C,2GAAA,mBAAmB,OAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Request, Response, NextFunction } from 'express';
|
|
2
|
+
import { ApiLoggerOptions } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Express middleware factory for API logging
|
|
5
|
+
*/
|
|
6
|
+
export declare function apiLoggerExpress(options: ApiLoggerOptions): (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
7
|
+
export default apiLoggerExpress;
|
|
8
|
+
//# sourceMappingURL=express.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../../src/middleware/express.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,IAoBjC,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,mBA2BvE;AAED,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.apiLoggerExpress = apiLoggerExpress;
|
|
4
|
+
const logger_1 = require("../core/logger");
|
|
5
|
+
/**
|
|
6
|
+
* Express middleware factory for API logging
|
|
7
|
+
*/
|
|
8
|
+
function apiLoggerExpress(options) {
|
|
9
|
+
const logger = new logger_1.ApiLogger(options);
|
|
10
|
+
let initialized = false;
|
|
11
|
+
let initPromise = null;
|
|
12
|
+
async function ensureInit() {
|
|
13
|
+
if (initialized)
|
|
14
|
+
return;
|
|
15
|
+
if (initPromise) {
|
|
16
|
+
await initPromise;
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
initPromise = logger.init();
|
|
20
|
+
try {
|
|
21
|
+
await initPromise;
|
|
22
|
+
initialized = true;
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
initPromise = null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return async function (req, res, next) {
|
|
29
|
+
try {
|
|
30
|
+
await ensureInit();
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
console.error('API Logger middleware init failed:', err);
|
|
34
|
+
return next();
|
|
35
|
+
}
|
|
36
|
+
const startTime = Date.now();
|
|
37
|
+
// Capture response body
|
|
38
|
+
let oldSend = res.send;
|
|
39
|
+
let responseBody;
|
|
40
|
+
res.body = undefined;
|
|
41
|
+
res.send = function (body) {
|
|
42
|
+
responseBody = body;
|
|
43
|
+
res.body = body;
|
|
44
|
+
return oldSend.call(this, body);
|
|
45
|
+
};
|
|
46
|
+
// After response is finished, log the request/response
|
|
47
|
+
res.on('finish', async () => {
|
|
48
|
+
res.body = responseBody;
|
|
49
|
+
await logger.log(req, res, startTime);
|
|
50
|
+
});
|
|
51
|
+
next();
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
exports.default = apiLoggerExpress;
|
|
55
|
+
//# sourceMappingURL=express.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express.js","sourceRoot":"","sources":["../../src/middleware/express.ts"],"names":[],"mappings":";;AAOA,4CA+CC;AArDD,2CAA2C;AAG3C;;GAEG;AACH,SAAgB,gBAAgB,CAAC,OAAyB;IACxD,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,WAAW,GAAyB,IAAI,CAAC;IAE7C,KAAK,UAAU,UAAU;QACvB,IAAI,WAAW;YAAE,OAAO;QACxB,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,WAAW,CAAC;YAClB,OAAO;QACT,CAAC;QACD,WAAW,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,WAAW,CAAC;YAClB,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;gBAAS,CAAC;YACT,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,WAAW,GAAY,EAAE,GAAa,EAAE,IAAkB;QACpE,IAAI,CAAC;YACH,MAAM,UAAU,EAAE,CAAC;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC;YACzD,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,wBAAwB;QACxB,IAAI,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC;QACvB,IAAI,YAAiB,CAAC;QACrB,GAAW,CAAC,IAAI,GAAG,SAAS,CAAC;QAC9B,GAAG,CAAC,IAAI,GAAG,UAAU,IAAU;YAC7B,YAAY,GAAG,IAAI,CAAC;YACnB,GAAW,CAAC,IAAI,GAAG,IAAI,CAAC;YACzB,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC,CAAC;QAEF,uDAAuD;QACvD,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YACzB,GAAW,CAAC,IAAI,GAAG,YAAY,CAAC;YACjC,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC;AAED,kBAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Request, Response, NextFunction } from 'express';
|
|
2
|
+
import { ApiLoggerOptions } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Factory function to create NestJS middleware
|
|
5
|
+
* This avoids direct NestJS dependencies in the package
|
|
6
|
+
*/
|
|
7
|
+
export declare function createApiLoggerMiddleware(options: ApiLoggerOptions): (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* Factory function to create NestJS module
|
|
10
|
+
*/
|
|
11
|
+
export declare function createApiLoggerModule(options: ApiLoggerOptions): {
|
|
12
|
+
module: {
|
|
13
|
+
new (): {};
|
|
14
|
+
};
|
|
15
|
+
providers: {
|
|
16
|
+
provide: string;
|
|
17
|
+
useValue: ApiLoggerOptions;
|
|
18
|
+
}[];
|
|
19
|
+
exports: string[];
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Legacy exports for backward compatibility
|
|
23
|
+
*/
|
|
24
|
+
export declare const ApiLoggerNestMiddleware: typeof createApiLoggerMiddleware;
|
|
25
|
+
export declare const ApiLoggerModule: {
|
|
26
|
+
forRoot: typeof createApiLoggerModule;
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=nestjs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nestjs.d.ts","sourceRoot":"","sources":["../../src/middleware/nestjs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,gBAAgB,IAoBnD,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,mBA0B9D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,gBAAgB;;;;;;;;;EAW9D;AAED;;GAEG;AACH,eAAO,MAAM,uBAAuB,kCAA4B,CAAC;AACjE,eAAO,MAAM,eAAe;;CAAqC,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ApiLoggerModule = exports.ApiLoggerNestMiddleware = void 0;
|
|
4
|
+
exports.createApiLoggerMiddleware = createApiLoggerMiddleware;
|
|
5
|
+
exports.createApiLoggerModule = createApiLoggerModule;
|
|
6
|
+
const logger_1 = require("../core/logger");
|
|
7
|
+
/**
|
|
8
|
+
* Factory function to create NestJS middleware
|
|
9
|
+
* This avoids direct NestJS dependencies in the package
|
|
10
|
+
*/
|
|
11
|
+
function createApiLoggerMiddleware(options) {
|
|
12
|
+
const logger = new logger_1.ApiLogger(options);
|
|
13
|
+
let initialized = false;
|
|
14
|
+
let initPromise = null;
|
|
15
|
+
const ensureInit = async () => {
|
|
16
|
+
if (initialized)
|
|
17
|
+
return;
|
|
18
|
+
if (initPromise) {
|
|
19
|
+
await initPromise;
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
initPromise = logger.init();
|
|
23
|
+
try {
|
|
24
|
+
await initPromise;
|
|
25
|
+
initialized = true;
|
|
26
|
+
}
|
|
27
|
+
finally {
|
|
28
|
+
initPromise = null;
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
return async (req, res, next) => {
|
|
32
|
+
try {
|
|
33
|
+
await ensureInit();
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
console.error('API Logger middleware init failed:', err);
|
|
37
|
+
return next();
|
|
38
|
+
}
|
|
39
|
+
const startTime = Date.now();
|
|
40
|
+
// Patch res.send to capture response body
|
|
41
|
+
const oldSend = res.send;
|
|
42
|
+
let responseBody;
|
|
43
|
+
res.body = undefined;
|
|
44
|
+
res.send = function (body) {
|
|
45
|
+
responseBody = body;
|
|
46
|
+
res.body = body;
|
|
47
|
+
return oldSend.call(this, body);
|
|
48
|
+
};
|
|
49
|
+
res.on('finish', async () => {
|
|
50
|
+
res.body = responseBody;
|
|
51
|
+
await logger.log(req, res, startTime);
|
|
52
|
+
});
|
|
53
|
+
next();
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Factory function to create NestJS module
|
|
58
|
+
*/
|
|
59
|
+
function createApiLoggerModule(options) {
|
|
60
|
+
return {
|
|
61
|
+
module: class ApiLoggerModule {
|
|
62
|
+
},
|
|
63
|
+
providers: [
|
|
64
|
+
{
|
|
65
|
+
provide: 'API_LOGGER_OPTIONS',
|
|
66
|
+
useValue: options,
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
exports: ['API_LOGGER_OPTIONS'],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Legacy exports for backward compatibility
|
|
74
|
+
*/
|
|
75
|
+
exports.ApiLoggerNestMiddleware = createApiLoggerMiddleware;
|
|
76
|
+
exports.ApiLoggerModule = { forRoot: createApiLoggerModule };
|
|
77
|
+
//# sourceMappingURL=nestjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nestjs.js","sourceRoot":"","sources":["../../src/middleware/nestjs.ts"],"names":[],"mappings":";;;AAQA,8DA8CC;AAKD,sDAWC;AArED,2CAA2C;AAG3C;;;GAGG;AACH,SAAgB,yBAAyB,CAAC,OAAyB;IACjE,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,WAAW,GAAyB,IAAI,CAAC;IAE7C,MAAM,UAAU,GAAG,KAAK,IAAmB,EAAE;QAC3C,IAAI,WAAW;YAAE,OAAO;QACxB,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,WAAW,CAAC;YAClB,OAAO;QACT,CAAC;QACD,WAAW,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,WAAW,CAAC;YAClB,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;gBAAS,CAAC;YACT,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QAC/D,IAAI,CAAC;YACH,MAAM,UAAU,EAAE,CAAC;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC;YACzD,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,0CAA0C;QAC1C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC;QACzB,IAAI,YAAiB,CAAC;QACrB,GAAW,CAAC,IAAI,GAAG,SAAS,CAAC;QAC9B,GAAG,CAAC,IAAI,GAAG,UAAU,IAAU;YAC7B,YAAY,GAAG,IAAI,CAAC;YACnB,GAAW,CAAC,IAAI,GAAG,IAAI,CAAC;YACzB,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC,CAAC;QAEF,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YACzB,GAAW,CAAC,IAAI,GAAG,YAAY,CAAC;YACjC,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CAAC,OAAyB;IAC7D,OAAO;QACL,MAAM,EAAE,MAAM,eAAe;SAAG;QAChC,SAAS,EAAE;YACT;gBACE,OAAO,EAAE,oBAAoB;gBAC7B,QAAQ,EAAE,OAAO;aAClB;SACF;QACD,OAAO,EAAE,CAAC,oBAAoB,CAAC;KAChC,CAAC;AACJ,CAAC;AAED;;GAEG;AACU,QAAA,uBAAuB,GAAG,yBAAyB,CAAC;AACpD,QAAA,eAAe,GAAG,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Request, Response } from 'express';
|
|
2
|
+
export interface ApiLogEntry {
|
|
3
|
+
url: string;
|
|
4
|
+
method: string;
|
|
5
|
+
request: {
|
|
6
|
+
headers: Record<string, string>;
|
|
7
|
+
body: any;
|
|
8
|
+
query: Record<string, any>;
|
|
9
|
+
params: Record<string, any>;
|
|
10
|
+
};
|
|
11
|
+
response: {
|
|
12
|
+
statusCode: number;
|
|
13
|
+
body?: any;
|
|
14
|
+
};
|
|
15
|
+
user?: {
|
|
16
|
+
id?: string;
|
|
17
|
+
email?: string;
|
|
18
|
+
[key: string]: any;
|
|
19
|
+
};
|
|
20
|
+
createdAt: Date;
|
|
21
|
+
durationMs: number;
|
|
22
|
+
ip?: string | undefined;
|
|
23
|
+
userAgent?: string | undefined;
|
|
24
|
+
}
|
|
25
|
+
export interface ApiLoggerOptions {
|
|
26
|
+
/** MongoDB connection URI */
|
|
27
|
+
mongoUri: string;
|
|
28
|
+
/** Database name */
|
|
29
|
+
databaseName?: string;
|
|
30
|
+
/** Collection name for storing logs */
|
|
31
|
+
collectionName?: string;
|
|
32
|
+
/** Fields to mask in request/response bodies */
|
|
33
|
+
maskFields?: string[];
|
|
34
|
+
/** Whether to log response bodies */
|
|
35
|
+
logResponseBody?: boolean;
|
|
36
|
+
/** Whether to log request bodies */
|
|
37
|
+
logRequestBody?: boolean;
|
|
38
|
+
/** Whether to log headers */
|
|
39
|
+
logHeaders?: boolean;
|
|
40
|
+
/** Whether to log query parameters */
|
|
41
|
+
logQuery?: boolean;
|
|
42
|
+
/** Whether to log URL parameters */
|
|
43
|
+
logParams?: boolean;
|
|
44
|
+
/** Function to extract user info from request */
|
|
45
|
+
getUserInfo?: (req: Request) => any;
|
|
46
|
+
/** Routes to include (regex patterns) */
|
|
47
|
+
includeRoutes?: RegExp[];
|
|
48
|
+
/** Routes to exclude (regex patterns) */
|
|
49
|
+
excludeRoutes?: RegExp[];
|
|
50
|
+
/** HTTP methods to log */
|
|
51
|
+
includeMethods?: string[];
|
|
52
|
+
/** HTTP methods to exclude */
|
|
53
|
+
excludeMethods?: string[];
|
|
54
|
+
/** Minimum status code to log (default: 0 - log all) */
|
|
55
|
+
minStatusCode?: number;
|
|
56
|
+
/** Maximum status code to log (default: 999 - log all) */
|
|
57
|
+
maxStatusCode?: number;
|
|
58
|
+
/** Whether to log errors only (status >= 400) */
|
|
59
|
+
logErrorsOnly?: boolean;
|
|
60
|
+
/** Custom function to determine if request should be logged */
|
|
61
|
+
shouldLog?: (req: Request, res: Response) => boolean;
|
|
62
|
+
/** Custom function to transform log entry before saving */
|
|
63
|
+
transformLog?: (entry: ApiLogEntry) => ApiLogEntry;
|
|
64
|
+
/** For standalone logging: custom function to decide if entry should be logged */
|
|
65
|
+
shouldLogEntry?: (entry: ApiLogEntry) => boolean;
|
|
66
|
+
}
|
|
67
|
+
export interface ApiLoggerInstance {
|
|
68
|
+
/** Initialize the logger and connect to MongoDB */
|
|
69
|
+
init(): Promise<void>;
|
|
70
|
+
/** Log an API request/response */
|
|
71
|
+
log(req: Request, res: Response, startTime: number): Promise<void>;
|
|
72
|
+
/** Close MongoDB connection */
|
|
73
|
+
close(): Promise<void>;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE5C,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,IAAI,EAAE,GAAG,CAAC;QACV,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAC7B,CAAC;IACF,QAAQ,EAAE;QACR,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,GAAG,CAAC;KACZ,CAAC;IACF,IAAI,CAAC,EAAE;QACL,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,CAAC;IACF,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uCAAuC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,qCAAqC;IACrC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oCAAoC;IACpC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6BAA6B;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oCAAoC;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iDAAiD;IACjD,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,GAAG,CAAC;IACpC,yCAAyC;IACzC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,yCAAyC;IACzC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,0BAA0B;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,8BAA8B;IAC9B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iDAAiD;IACjD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC;IACrD,2DAA2D;IAC3D,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,WAAW,CAAC;IACnD,kFAAkF;IAClF,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC;CAClD;AAED,MAAM,WAAW,iBAAiB;IAChC,mDAAmD;IACnD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,kCAAkC;IAClC,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,+BAA+B;IAC/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Request, Response } from 'express';
|
|
2
|
+
import { ApiLogEntry, ApiLoggerOptions } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Check if a request should be logged based on configuration
|
|
5
|
+
*/
|
|
6
|
+
export declare function shouldLogRequest(req: Request, res: Response, options: ApiLoggerOptions): boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Check if a prebuilt log entry should be logged (for standalone path).
|
|
9
|
+
*/
|
|
10
|
+
export declare function shouldLogEntry(entry: ApiLogEntry, options: ApiLoggerOptions): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Extract user information from request
|
|
13
|
+
*/
|
|
14
|
+
export declare function extractUserInfo(req: Request, getUserInfo?: (req: Request) => any): any;
|
|
15
|
+
/**
|
|
16
|
+
* Get client IP address
|
|
17
|
+
*/
|
|
18
|
+
export declare function getClientIP(req: Request): string | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* Get user agent
|
|
21
|
+
*/
|
|
22
|
+
export declare function getUserAgent(req: Request): string | undefined;
|
|
23
|
+
//# sourceMappingURL=filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../src/utils/filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEzD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAmDT;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CA8BrF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,GAAG,GAAG,GAAG,CAkCtF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAY5D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAE7D"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.shouldLogRequest = shouldLogRequest;
|
|
4
|
+
exports.shouldLogEntry = shouldLogEntry;
|
|
5
|
+
exports.extractUserInfo = extractUserInfo;
|
|
6
|
+
exports.getClientIP = getClientIP;
|
|
7
|
+
exports.getUserAgent = getUserAgent;
|
|
8
|
+
/**
|
|
9
|
+
* Check if a request should be logged based on configuration
|
|
10
|
+
*/
|
|
11
|
+
function shouldLogRequest(req, res, options) {
|
|
12
|
+
// Check custom shouldLog function first
|
|
13
|
+
if (options.shouldLog && !options.shouldLog(req, res)) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
// Check if logging errors only
|
|
17
|
+
if (options.logErrorsOnly && res.statusCode < 400) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
// Check status code range
|
|
21
|
+
if (options.minStatusCode !== undefined && res.statusCode < options.minStatusCode) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
if (options.maxStatusCode !== undefined && res.statusCode > options.maxStatusCode) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
// Check HTTP methods
|
|
28
|
+
if (options.includeMethods && options.includeMethods.length > 0) {
|
|
29
|
+
if (!options.includeMethods.includes(req.method.toUpperCase())) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (options.excludeMethods && options.excludeMethods.length > 0) {
|
|
34
|
+
if (options.excludeMethods.includes(req.method.toUpperCase())) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Check routes
|
|
39
|
+
const url = req.originalUrl || req.url;
|
|
40
|
+
if (options.includeRoutes && options.includeRoutes.length > 0) {
|
|
41
|
+
const shouldInclude = options.includeRoutes.some(pattern => pattern.test(url));
|
|
42
|
+
if (!shouldInclude) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (options.excludeRoutes && options.excludeRoutes.length > 0) {
|
|
47
|
+
const shouldExclude = options.excludeRoutes.some(pattern => pattern.test(url));
|
|
48
|
+
if (shouldExclude) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Check if a prebuilt log entry should be logged (for standalone path).
|
|
56
|
+
*/
|
|
57
|
+
function shouldLogEntry(entry, options) {
|
|
58
|
+
if (options.shouldLogEntry && !options.shouldLogEntry(entry)) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
if (options.logErrorsOnly && entry.response.statusCode < 400) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
if (options.minStatusCode !== undefined && entry.response.statusCode < options.minStatusCode) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
if (options.maxStatusCode !== undefined && entry.response.statusCode > options.maxStatusCode) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
const method = entry.method.toUpperCase();
|
|
71
|
+
if (options.includeMethods && options.includeMethods.length > 0 && !options.includeMethods.includes(method)) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
if (options.excludeMethods && options.excludeMethods.length > 0 && options.excludeMethods.includes(method)) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
const url = entry.url;
|
|
78
|
+
if (options.includeRoutes && options.includeRoutes.length > 0) {
|
|
79
|
+
const shouldInclude = options.includeRoutes.some(pattern => pattern.test(url));
|
|
80
|
+
if (!shouldInclude)
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
if (options.excludeRoutes && options.excludeRoutes.length > 0) {
|
|
84
|
+
const shouldExclude = options.excludeRoutes.some(pattern => pattern.test(url));
|
|
85
|
+
if (shouldExclude)
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Extract user information from request
|
|
92
|
+
*/
|
|
93
|
+
function extractUserInfo(req, getUserInfo) {
|
|
94
|
+
if (getUserInfo) {
|
|
95
|
+
return getUserInfo(req);
|
|
96
|
+
}
|
|
97
|
+
// Default user extraction logic
|
|
98
|
+
const user = {};
|
|
99
|
+
// Try to get user from common authentication patterns
|
|
100
|
+
if (req.user) {
|
|
101
|
+
const reqUser = req.user;
|
|
102
|
+
user.id = reqUser.id || reqUser._id || reqUser.userId;
|
|
103
|
+
user.email = reqUser.email || reqUser.username;
|
|
104
|
+
// Copy other user properties
|
|
105
|
+
Object.keys(reqUser).forEach(key => {
|
|
106
|
+
if (key !== 'id' && key !== '_id' && key !== 'userId' && key !== 'email' && key !== 'username') {
|
|
107
|
+
user[key] = reqUser[key];
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
// Try to get user from JWT token payload
|
|
112
|
+
if (req.payload) {
|
|
113
|
+
const payload = req.payload;
|
|
114
|
+
if (!user.id && (payload.id || payload.sub)) {
|
|
115
|
+
user.id = payload.id || payload.sub;
|
|
116
|
+
}
|
|
117
|
+
if (!user.email && payload.email) {
|
|
118
|
+
user.email = payload.email;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return Object.keys(user).length > 0 ? user : undefined;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get client IP address
|
|
125
|
+
*/
|
|
126
|
+
function getClientIP(req) {
|
|
127
|
+
const forwarded = req.headers['x-forwarded-for'];
|
|
128
|
+
const forwardedStr = Array.isArray(forwarded) ? forwarded[0] : forwarded;
|
|
129
|
+
const firstForwarded = typeof forwardedStr === 'string' ? (forwardedStr.split(',')[0] ?? '').trim() : forwardedStr;
|
|
130
|
+
const ip = firstForwarded ||
|
|
131
|
+
req.headers['x-real-ip'] ||
|
|
132
|
+
req.connection?.remoteAddress ||
|
|
133
|
+
(req.socket && req.socket.remoteAddress) ||
|
|
134
|
+
undefined;
|
|
135
|
+
return ip || undefined;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get user agent
|
|
139
|
+
*/
|
|
140
|
+
function getUserAgent(req) {
|
|
141
|
+
return req.headers['user-agent'];
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/utils/filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for masking sensitive data
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Mask sensitive data in request/response objects
|
|
6
|
+
*/
|
|
7
|
+
export declare function maskRequestData(req: any, maskFields: string[]): any;
|
|
8
|
+
/**
|
|
9
|
+
* Mask sensitive data in response body
|
|
10
|
+
*/
|
|
11
|
+
export declare function maskResponseData(res: any, maskFields: string[]): any;
|
|
12
|
+
/**
|
|
13
|
+
* Default sensitive fields to mask
|
|
14
|
+
*/
|
|
15
|
+
export declare const DEFAULT_MASK_FIELDS: string[];
|
|
16
|
+
//# sourceMappingURL=mask.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mask.d.ts","sourceRoot":"","sources":["../../src/utils/mask.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0DH;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,GAAG,CAwBnE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,GAAG,CAMpE;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,UAqB/B,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Utility functions for masking sensitive data
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DEFAULT_MASK_FIELDS = void 0;
|
|
7
|
+
exports.maskRequestData = maskRequestData;
|
|
8
|
+
exports.maskResponseData = maskResponseData;
|
|
9
|
+
/**
|
|
10
|
+
* Deep clone an object
|
|
11
|
+
*/
|
|
12
|
+
function deepClone(obj) {
|
|
13
|
+
if (obj === null || typeof obj !== 'object') {
|
|
14
|
+
return obj;
|
|
15
|
+
}
|
|
16
|
+
if (obj instanceof Date) {
|
|
17
|
+
return new Date(obj.getTime());
|
|
18
|
+
}
|
|
19
|
+
if (Array.isArray(obj)) {
|
|
20
|
+
return obj.map(item => deepClone(item));
|
|
21
|
+
}
|
|
22
|
+
const cloned = {};
|
|
23
|
+
for (const key in obj) {
|
|
24
|
+
if (obj.hasOwnProperty(key)) {
|
|
25
|
+
cloned[key] = deepClone(obj[key]);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return cloned;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Recursively mask sensitive fields in an object
|
|
32
|
+
*/
|
|
33
|
+
function maskSensitiveData(obj, maskFields) {
|
|
34
|
+
if (!obj || typeof obj !== 'object') {
|
|
35
|
+
return obj;
|
|
36
|
+
}
|
|
37
|
+
const masked = deepClone(obj);
|
|
38
|
+
if (Array.isArray(masked)) {
|
|
39
|
+
return masked.map(item => maskSensitiveData(item, maskFields));
|
|
40
|
+
}
|
|
41
|
+
for (const field of maskFields) {
|
|
42
|
+
if (masked.hasOwnProperty(field)) {
|
|
43
|
+
masked[field] = '***MASKED***';
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Recursively mask nested objects
|
|
47
|
+
for (const key in masked) {
|
|
48
|
+
if (masked.hasOwnProperty(key) && typeof masked[key] === 'object' && masked[key] !== null) {
|
|
49
|
+
masked[key] = maskSensitiveData(masked[key], maskFields);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return masked;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Mask sensitive data in request/response objects
|
|
56
|
+
*/
|
|
57
|
+
function maskRequestData(req, maskFields) {
|
|
58
|
+
if (!maskFields || maskFields.length === 0) {
|
|
59
|
+
return req;
|
|
60
|
+
}
|
|
61
|
+
const masked = {};
|
|
62
|
+
if (req.body) {
|
|
63
|
+
masked.body = maskSensitiveData(req.body, maskFields);
|
|
64
|
+
}
|
|
65
|
+
if (req.query) {
|
|
66
|
+
masked.query = maskSensitiveData(req.query, maskFields);
|
|
67
|
+
}
|
|
68
|
+
if (req.params) {
|
|
69
|
+
masked.params = maskSensitiveData(req.params, maskFields);
|
|
70
|
+
}
|
|
71
|
+
if (req.headers) {
|
|
72
|
+
masked.headers = maskSensitiveData(req.headers, maskFields);
|
|
73
|
+
}
|
|
74
|
+
return masked;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Mask sensitive data in response body
|
|
78
|
+
*/
|
|
79
|
+
function maskResponseData(res, maskFields) {
|
|
80
|
+
if (!maskFields || maskFields.length === 0 || !res) {
|
|
81
|
+
return res;
|
|
82
|
+
}
|
|
83
|
+
return maskSensitiveData(res, maskFields);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Default sensitive fields to mask
|
|
87
|
+
*/
|
|
88
|
+
exports.DEFAULT_MASK_FIELDS = [
|
|
89
|
+
'password',
|
|
90
|
+
'token',
|
|
91
|
+
'authorization',
|
|
92
|
+
'apiKey',
|
|
93
|
+
'secret',
|
|
94
|
+
'key',
|
|
95
|
+
'credential',
|
|
96
|
+
'auth',
|
|
97
|
+
'session',
|
|
98
|
+
'cookie',
|
|
99
|
+
'jwt',
|
|
100
|
+
'access_token',
|
|
101
|
+
'refresh_token',
|
|
102
|
+
'private_key',
|
|
103
|
+
'public_key',
|
|
104
|
+
'ssn',
|
|
105
|
+
'credit_card',
|
|
106
|
+
'card_number',
|
|
107
|
+
'cvv',
|
|
108
|
+
'pin'
|
|
109
|
+
];
|
|
110
|
+
//# sourceMappingURL=mask.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mask.js","sourceRoot":"","sources":["../../src/utils/mask.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AA6DH,0CAwBC;AAKD,4CAMC;AA9FD;;GAEG;AACH,SAAS,SAAS,CAAC,GAAQ;IACzB,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,GAAG,YAAY,IAAI,EAAE,CAAC;QACxB,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,MAAM,GAAQ,EAAE,CAAC;IACvB,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,GAAQ,EAAE,UAAoB;IACvD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAE9B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,IAAI,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,GAAG,cAAc,CAAC;QACjC,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YAC1F,MAAM,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,GAAQ,EAAE,UAAoB;IAC5D,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,MAAM,GAAQ,EAAE,CAAC;IAEvB,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QACd,MAAM,CAAC,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,MAAM,CAAC,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAChB,MAAM,CAAC,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,GAAQ,EAAE,UAAoB;IAC7D,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACnD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO,iBAAiB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACU,QAAA,mBAAmB,GAAG;IACjC,UAAU;IACV,OAAO;IACP,eAAe;IACf,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,YAAY;IACZ,MAAM;IACN,SAAS;IACT,QAAQ;IACR,KAAK;IACL,cAAc;IACd,eAAe;IACf,aAAa;IACb,YAAY;IACZ,KAAK;IACL,aAAa;IACb,aAAa;IACb,KAAK;IACL,KAAK;CACN,CAAC"}
|