@aifabrix/miso-client 1.5.0 → 1.7.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/README.md +46 -1
- package/dist/examples/event-emission-mode.example.d.ts +14 -0
- package/dist/examples/event-emission-mode.example.d.ts.map +1 -0
- package/dist/examples/event-emission-mode.example.js +121 -0
- package/dist/examples/event-emission-mode.example.js.map +1 -0
- package/dist/src/services/logger.service.d.ts +3 -1
- package/dist/src/services/logger.service.d.ts.map +1 -1
- package/dist/src/services/logger.service.js +22 -1
- package/dist/src/services/logger.service.js.map +1 -1
- package/dist/src/types/config.types.d.ts +11 -0
- package/dist/src/types/config.types.d.ts.map +1 -1
- package/dist/src/types/config.types.js.map +1 -1
- package/dist/src/utils/audit-log-queue.d.ts +39 -0
- package/dist/src/utils/audit-log-queue.d.ts.map +1 -0
- package/dist/src/utils/audit-log-queue.js +131 -0
- package/dist/src/utils/audit-log-queue.js.map +1 -0
- package/dist/src/utils/config-loader.d.ts.map +1 -1
- package/dist/src/utils/config-loader.js +4 -0
- package/dist/src/utils/config-loader.js.map +1 -1
- package/dist/src/utils/http-client-audit.d.ts +22 -0
- package/dist/src/utils/http-client-audit.d.ts.map +1 -0
- package/dist/src/utils/http-client-audit.js +179 -0
- package/dist/src/utils/http-client-audit.js.map +1 -0
- package/dist/src/utils/http-client-masking.d.ts +72 -0
- package/dist/src/utils/http-client-masking.d.ts.map +1 -0
- package/dist/src/utils/http-client-masking.js +196 -0
- package/dist/src/utils/http-client-masking.js.map +1 -0
- package/dist/src/utils/http-client-metadata.d.ts +40 -0
- package/dist/src/utils/http-client-metadata.d.ts.map +1 -0
- package/dist/src/utils/http-client-metadata.js +95 -0
- package/dist/src/utils/http-client-metadata.js.map +1 -0
- package/dist/src/utils/http-client.d.ts +1 -4
- package/dist/src/utils/http-client.d.ts.map +1 -1
- package/dist/src/utils/http-client.js +17 -94
- package/dist/src/utils/http-client.js.map +1 -1
- package/package.json +1 -1
|
@@ -3,14 +3,12 @@
|
|
|
3
3
|
* Public HTTP client with automatic audit and debug logging
|
|
4
4
|
* Wraps InternalHttpClient and adds ISO 27001 compliant logging
|
|
5
5
|
*/
|
|
6
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
-
};
|
|
9
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
7
|
exports.HttpClient = void 0;
|
|
11
8
|
const internal_http_client_1 = require("./internal-http-client");
|
|
12
9
|
const data_masker_1 = require("./data-masker");
|
|
13
|
-
const
|
|
10
|
+
const http_client_metadata_1 = require("./http-client-metadata");
|
|
11
|
+
const http_client_audit_1 = require("./http-client-audit");
|
|
14
12
|
class HttpClient {
|
|
15
13
|
constructor(config, logger) {
|
|
16
14
|
this.config = config;
|
|
@@ -66,6 +64,18 @@ class HttpClient {
|
|
|
66
64
|
* Excludes certain endpoints to prevent infinite loops
|
|
67
65
|
*/
|
|
68
66
|
shouldAuditRequest(url) {
|
|
67
|
+
// Check if audit is disabled
|
|
68
|
+
if (this.config.audit?.enabled === false) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
// Check skip endpoints
|
|
72
|
+
if (this.config.audit?.skipEndpoints) {
|
|
73
|
+
for (const endpoint of this.config.audit.skipEndpoints) {
|
|
74
|
+
if (url && url.includes(endpoint)) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
69
79
|
// Don't audit the logs endpoint itself
|
|
70
80
|
if (url && url.includes('/api/logs')) {
|
|
71
81
|
return false;
|
|
@@ -76,102 +86,15 @@ class HttpClient {
|
|
|
76
86
|
}
|
|
77
87
|
return true;
|
|
78
88
|
}
|
|
79
|
-
/**
|
|
80
|
-
* Extract user ID from JWT token
|
|
81
|
-
*/
|
|
82
|
-
extractUserIdFromToken(authHeader) {
|
|
83
|
-
if (!authHeader || !authHeader.startsWith('Bearer ')) {
|
|
84
|
-
return null;
|
|
85
|
-
}
|
|
86
|
-
const token = authHeader.substring(7);
|
|
87
|
-
try {
|
|
88
|
-
const decoded = jsonwebtoken_1.default.decode(token);
|
|
89
|
-
if (!decoded)
|
|
90
|
-
return null;
|
|
91
|
-
return (decoded.sub || decoded.userId || decoded.user_id || decoded.id);
|
|
92
|
-
}
|
|
93
|
-
catch {
|
|
94
|
-
return null;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
89
|
/**
|
|
98
90
|
* Log HTTP request audit event
|
|
99
91
|
* Masks all sensitive data before logging (ISO 27001 compliance)
|
|
92
|
+
* Optimized with size limits, fast paths, and configurable audit levels
|
|
100
93
|
*/
|
|
101
94
|
async logHttpRequestAudit(response, error) {
|
|
102
95
|
try {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
if (!config) {
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
const metadata = config.metadata;
|
|
109
|
-
if (!metadata) {
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
const duration = Date.now() - metadata.startTime;
|
|
113
|
-
const method = metadata.method || 'UNKNOWN';
|
|
114
|
-
const url = metadata.url || '';
|
|
115
|
-
const baseURL = metadata.baseURL || this.config.controllerUrl;
|
|
116
|
-
const fullUrl = `${baseURL}${url}`;
|
|
117
|
-
const statusCode = response?.status || error?.response?.status || 0;
|
|
118
|
-
const authHeader = config.headers?.authorization;
|
|
119
|
-
const userId = this.extractUserIdFromToken(authHeader);
|
|
120
|
-
// Extract request/response data for masking
|
|
121
|
-
const requestHeaders = config.headers || {};
|
|
122
|
-
const requestBody = config.data || error?.config?.data;
|
|
123
|
-
const responseBody = response?.data || error?.response?.data;
|
|
124
|
-
const responseHeaders = response?.headers || error?.response?.headers || {};
|
|
125
|
-
// ISO 27001 Compliance: Mask ALL sensitive data before logging
|
|
126
|
-
const maskedHeaders = data_masker_1.DataMasker.maskSensitiveData(requestHeaders);
|
|
127
|
-
const maskedRequestBody = data_masker_1.DataMasker.maskSensitiveData(requestBody);
|
|
128
|
-
const maskedResponseBody = data_masker_1.DataMasker.maskSensitiveData(responseBody);
|
|
129
|
-
const maskedResponseHeaders = data_masker_1.DataMasker.maskSensitiveData(responseHeaders);
|
|
130
|
-
// Calculate sizes
|
|
131
|
-
const requestSize = requestBody ? JSON.stringify(requestBody).length : 0;
|
|
132
|
-
const responseSize = responseBody ? JSON.stringify(responseBody).length : 0;
|
|
133
|
-
// Audit log - always log
|
|
134
|
-
await this.logger.audit(`http.request.${method}`, url, {
|
|
135
|
-
method,
|
|
136
|
-
url: fullUrl,
|
|
137
|
-
statusCode,
|
|
138
|
-
duration,
|
|
139
|
-
userId: userId || undefined,
|
|
140
|
-
requestSize: requestSize > 0 ? requestSize : undefined,
|
|
141
|
-
responseSize: responseSize > 0 ? responseSize : undefined,
|
|
142
|
-
error: error?.message || undefined
|
|
143
|
-
}, {
|
|
144
|
-
token: userId ? undefined : authHeader?.replace('Bearer ', '')
|
|
145
|
-
});
|
|
146
|
-
// Debug log - only if debug mode enabled
|
|
147
|
-
if (this.config.logLevel === 'debug') {
|
|
148
|
-
// Limit response body size for debug logs
|
|
149
|
-
let responseBodySnippet = maskedResponseBody;
|
|
150
|
-
if (responseBody && typeof responseBody === 'object') {
|
|
151
|
-
const responseStr = JSON.stringify(maskedResponseBody);
|
|
152
|
-
if (responseStr.length > 1000) {
|
|
153
|
-
responseBodySnippet = JSON.parse(responseStr.substring(0, 1000) + '...');
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
await this.logger.debug(`HTTP ${method} ${url}`, {
|
|
157
|
-
method,
|
|
158
|
-
url: fullUrl,
|
|
159
|
-
baseURL,
|
|
160
|
-
statusCode,
|
|
161
|
-
duration,
|
|
162
|
-
userId: userId || undefined,
|
|
163
|
-
timeout: config.timeout || 30000,
|
|
164
|
-
requestHeaders: maskedHeaders,
|
|
165
|
-
responseHeaders: maskedResponseHeaders,
|
|
166
|
-
requestBody: maskedRequestBody,
|
|
167
|
-
responseBody: responseBodySnippet,
|
|
168
|
-
requestSize: requestSize > 0 ? requestSize : undefined,
|
|
169
|
-
responseSize: responseSize > 0 ? responseSize : undefined,
|
|
170
|
-
error: error?.message || undefined
|
|
171
|
-
}, {
|
|
172
|
-
token: userId ? undefined : authHeader?.replace('Bearer ', '')
|
|
173
|
-
});
|
|
174
|
-
}
|
|
96
|
+
const metadata = (0, http_client_metadata_1.extractRequestMetadata)(response, error, this.config);
|
|
97
|
+
await (0, http_client_audit_1.logHttpRequestAudit)(metadata, error, this.config, this.logger);
|
|
175
98
|
}
|
|
176
99
|
catch {
|
|
177
100
|
// Silently swallow all logging errors - never break HTTP requests
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../../src/utils/http-client.ts"],"names":[],"mappings":";AAAA;;;GAGG
|
|
1
|
+
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../../src/utils/http-client.ts"],"names":[],"mappings":"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"}
|