@aifabrix/miso-client 3.5.0 → 3.8.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/CHANGELOG.md +240 -0
- package/dist/api/auth-cache.api.d.ts.map +1 -1
- package/dist/api/auth-cache.api.js +27 -5
- package/dist/api/auth-cache.api.js.map +1 -1
- package/dist/api/auth-login.api.d.ts.map +1 -1
- package/dist/api/auth-login.api.js +49 -6
- package/dist/api/auth-login.api.js.map +1 -1
- package/dist/api/auth-token.api.d.ts.map +1 -1
- package/dist/api/auth-token.api.js +99 -7
- package/dist/api/auth-token.api.js.map +1 -1
- package/dist/api/auth-user.api.d.ts.map +1 -1
- package/dist/api/auth-user.api.js +22 -4
- package/dist/api/auth-user.api.js.map +1 -1
- package/dist/api/auth.api.d.ts +2 -9
- package/dist/api/auth.api.d.ts.map +1 -1
- package/dist/api/auth.api.js +1 -66
- package/dist/api/auth.api.js.map +1 -1
- package/dist/api/logs-create.api.d.ts.map +1 -1
- package/dist/api/logs-create.api.js +57 -4
- package/dist/api/logs-create.api.js.map +1 -1
- package/dist/api/logs-export.api.d.ts.map +1 -1
- package/dist/api/logs-export.api.js +7 -1
- package/dist/api/logs-export.api.js.map +1 -1
- package/dist/api/logs-list.api.d.ts.map +1 -1
- package/dist/api/logs-list.api.js +32 -6
- package/dist/api/logs-list.api.js.map +1 -1
- package/dist/api/logs-stats.api.d.ts.map +1 -1
- package/dist/api/logs-stats.api.js +22 -4
- package/dist/api/logs-stats.api.js.map +1 -1
- package/dist/api/permissions.api.d.ts +2 -1
- package/dist/api/permissions.api.d.ts.map +1 -1
- package/dist/api/permissions.api.js +16 -5
- package/dist/api/permissions.api.js.map +1 -1
- package/dist/api/roles.api.d.ts +2 -1
- package/dist/api/roles.api.d.ts.map +1 -1
- package/dist/api/roles.api.js +16 -5
- package/dist/api/roles.api.js.map +1 -1
- package/dist/api/types/logs.types.d.ts +44 -7
- package/dist/api/types/logs.types.d.ts.map +1 -1
- package/dist/express/client-token-endpoint.d.ts.map +1 -1
- package/dist/express/client-token-endpoint.js +42 -5
- package/dist/express/client-token-endpoint.js.map +1 -1
- package/dist/express/error-handler.d.ts.map +1 -1
- package/dist/express/error-handler.js +32 -8
- package/dist/express/error-handler.js.map +1 -1
- package/dist/express/index.d.ts +1 -0
- package/dist/express/index.d.ts.map +1 -1
- package/dist/express/index.js +4 -1
- package/dist/express/index.js.map +1 -1
- package/dist/express/logger-context.middleware.d.ts +46 -0
- package/dist/express/logger-context.middleware.d.ts.map +1 -0
- package/dist/express/logger-context.middleware.js +99 -0
- package/dist/express/logger-context.middleware.js.map +1 -0
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -5
- package/dist/index.js.map +1 -1
- package/dist/services/auth.service.d.ts.map +1 -1
- package/dist/services/auth.service.js +97 -8
- package/dist/services/auth.service.js.map +1 -1
- package/dist/services/browser-permission.service.d.ts +5 -0
- package/dist/services/browser-permission.service.d.ts.map +1 -1
- package/dist/services/browser-permission.service.js +39 -2
- package/dist/services/browser-permission.service.js.map +1 -1
- package/dist/services/browser-role.service.d.ts +5 -0
- package/dist/services/browser-role.service.d.ts.map +1 -1
- package/dist/services/browser-role.service.js +45 -2
- package/dist/services/browser-role.service.js.map +1 -1
- package/dist/services/logger/index.d.ts +10 -0
- package/dist/services/logger/index.d.ts.map +1 -0
- package/dist/services/logger/index.js +22 -0
- package/dist/services/logger/index.js.map +1 -0
- package/dist/services/logger/logger-chain.d.ts +90 -0
- package/dist/services/logger/logger-chain.d.ts.map +1 -0
- package/dist/services/logger/logger-chain.js +169 -0
- package/dist/services/logger/logger-chain.js.map +1 -0
- package/dist/services/logger/logger-context-storage.d.ts +73 -0
- package/dist/services/logger/logger-context-storage.d.ts.map +1 -0
- package/dist/services/logger/logger-context-storage.js +86 -0
- package/dist/services/logger/logger-context-storage.js.map +1 -0
- package/dist/services/logger/logger-context.d.ts +85 -0
- package/dist/services/logger/logger-context.d.ts.map +1 -0
- package/dist/services/logger/logger-context.js +192 -0
- package/dist/services/logger/logger-context.js.map +1 -0
- package/dist/services/{logger.service.d.ts → logger/logger.service.d.ts} +59 -72
- package/dist/services/logger/logger.service.d.ts.map +1 -0
- package/dist/services/logger/logger.service.js +403 -0
- package/dist/services/logger/logger.service.js.map +1 -0
- package/dist/services/logger/unified-logger.factory.d.ts +87 -0
- package/dist/services/logger/unified-logger.factory.d.ts.map +1 -0
- package/dist/services/logger/unified-logger.factory.js +120 -0
- package/dist/services/logger/unified-logger.factory.js.map +1 -0
- package/dist/services/logger/unified-logger.service.d.ts +89 -0
- package/dist/services/logger/unified-logger.service.d.ts.map +1 -0
- package/dist/services/logger/unified-logger.service.js +178 -0
- package/dist/services/logger/unified-logger.service.js.map +1 -0
- package/dist/services/permission.service.d.ts +5 -0
- package/dist/services/permission.service.d.ts.map +1 -1
- package/dist/services/permission.service.js +42 -2
- package/dist/services/permission.service.js.map +1 -1
- package/dist/services/role.service.d.ts +5 -0
- package/dist/services/role.service.d.ts.map +1 -1
- package/dist/services/role.service.js +42 -2
- package/dist/services/role.service.js.map +1 -1
- package/dist/types/filter.types.d.ts +6 -6
- package/dist/types/filter.types.d.ts.map +1 -1
- package/dist/types/filter.types.js +14 -5
- package/dist/types/filter.types.js.map +1 -1
- package/dist/utils/console-logger.d.ts +21 -0
- package/dist/utils/console-logger.d.ts.map +1 -0
- package/dist/utils/console-logger.js +58 -0
- package/dist/utils/console-logger.js.map +1 -0
- package/dist/utils/controller-url-resolver.d.ts.map +1 -1
- package/dist/utils/controller-url-resolver.js +5 -0
- package/dist/utils/controller-url-resolver.js.map +1 -1
- package/dist/utils/data-client-auth.d.ts.map +1 -1
- package/dist/utils/data-client-auth.js +34 -2
- package/dist/utils/data-client-auth.js.map +1 -1
- package/dist/utils/data-client-auto-init.d.ts.map +1 -1
- package/dist/utils/data-client-auto-init.js +59 -3
- package/dist/utils/data-client-auto-init.js.map +1 -1
- package/dist/utils/data-client-request.d.ts.map +1 -1
- package/dist/utils/data-client-request.js +78 -2
- package/dist/utils/data-client-request.js.map +1 -1
- package/dist/utils/data-client.d.ts.map +1 -1
- package/dist/utils/data-client.js +10 -7
- package/dist/utils/data-client.js.map +1 -1
- package/dist/utils/environment-token.d.ts.map +1 -1
- package/dist/utils/environment-token.js +37 -57
- package/dist/utils/environment-token.js.map +1 -1
- package/dist/utils/error-extractor.d.ts +52 -0
- package/dist/utils/error-extractor.d.ts.map +1 -0
- package/dist/utils/error-extractor.js +136 -0
- package/dist/utils/error-extractor.js.map +1 -0
- package/dist/utils/filter.utils.d.ts +115 -3
- package/dist/utils/filter.utils.d.ts.map +1 -1
- package/dist/utils/filter.utils.js +298 -27
- package/dist/utils/filter.utils.js.map +1 -1
- package/dist/utils/http-client-audit.d.ts +1 -1
- package/dist/utils/http-client-audit.d.ts.map +1 -1
- package/dist/utils/http-client.d.ts +1 -1
- package/dist/utils/http-client.d.ts.map +1 -1
- package/dist/utils/internal-http-client.d.ts +4 -0
- package/dist/utils/internal-http-client.d.ts.map +1 -1
- package/dist/utils/internal-http-client.js +190 -11
- package/dist/utils/internal-http-client.js.map +1 -1
- package/dist/utils/response-validator.d.ts.map +1 -1
- package/dist/utils/response-validator.js +2 -4
- package/dist/utils/response-validator.js.map +1 -1
- package/dist/utils/token-utils.d.ts.map +1 -1
- package/dist/utils/token-utils.js +75 -4
- package/dist/utils/token-utils.js.map +1 -1
- package/package.json +2 -1
- package/dist/services/logger.service.d.ts.map +0 -1
- package/dist/services/logger.service.js +0 -488
- package/dist/services/logger.service.js.map +0 -1
|
@@ -1,488 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Logger service for application logging and audit events
|
|
4
|
-
*/
|
|
5
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
-
};
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.LoggerChain = exports.LoggerService = void 0;
|
|
10
|
-
const events_1 = require("events");
|
|
11
|
-
const data_masker_1 = require("../utils/data-masker");
|
|
12
|
-
const audit_log_queue_1 = require("../utils/audit-log-queue");
|
|
13
|
-
const request_context_1 = require("../utils/request-context");
|
|
14
|
-
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
15
|
-
class LoggerService extends events_1.EventEmitter {
|
|
16
|
-
constructor(httpClient, redis) {
|
|
17
|
-
super(); // Initialize EventEmitter
|
|
18
|
-
this.maskSensitiveData = true; // Default: mask sensitive data
|
|
19
|
-
this.correlationCounter = 0;
|
|
20
|
-
this.auditLogQueue = null;
|
|
21
|
-
// Circuit breaker for HTTP logging - skip attempts after repeated failures
|
|
22
|
-
this.httpLoggingFailures = 0;
|
|
23
|
-
this.httpLoggingDisabledUntil = null;
|
|
24
|
-
this.config = httpClient.config;
|
|
25
|
-
this.redis = redis;
|
|
26
|
-
this.httpClient = httpClient;
|
|
27
|
-
// Initialize audit log queue if batch logging is enabled
|
|
28
|
-
const auditConfig = this.config.audit || {};
|
|
29
|
-
if (auditConfig.batchSize !== undefined ||
|
|
30
|
-
auditConfig.batchInterval !== undefined) {
|
|
31
|
-
this.auditLogQueue = new audit_log_queue_1.AuditLogQueue(httpClient, redis, this.config, this);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Set ApiClient instance (used to resolve circular dependency)
|
|
36
|
-
* @param apiClient - ApiClient instance
|
|
37
|
-
*/
|
|
38
|
-
setApiClient(apiClient) {
|
|
39
|
-
this.apiClient = apiClient;
|
|
40
|
-
// Also set ApiClient in AuditLogQueue if available
|
|
41
|
-
if (this.auditLogQueue) {
|
|
42
|
-
this.auditLogQueue.setApiClient(apiClient);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Enable or disable sensitive data masking
|
|
47
|
-
*/
|
|
48
|
-
setMasking(enabled) {
|
|
49
|
-
this.maskSensitiveData = enabled;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Generate unique correlation ID for request tracking
|
|
53
|
-
*/
|
|
54
|
-
generateCorrelationId() {
|
|
55
|
-
this.correlationCounter = (this.correlationCounter + 1) % 10000;
|
|
56
|
-
const timestamp = Date.now();
|
|
57
|
-
const random = Math.random().toString(36).substring(2, 8);
|
|
58
|
-
// Use clientId instead of applicationKey
|
|
59
|
-
const clientPrefix = this.config.clientId.substring(0, 10);
|
|
60
|
-
return `${clientPrefix}-${timestamp}-${this.correlationCounter}-${random}`;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Extract JWT token information
|
|
64
|
-
*/
|
|
65
|
-
extractJWTContext(token) {
|
|
66
|
-
if (!token)
|
|
67
|
-
return {};
|
|
68
|
-
try {
|
|
69
|
-
const decoded = jsonwebtoken_1.default.decode(token);
|
|
70
|
-
if (!decoded)
|
|
71
|
-
return {};
|
|
72
|
-
return {
|
|
73
|
-
userId: (decoded.sub || decoded.userId || decoded.user_id),
|
|
74
|
-
applicationId: (decoded.applicationId || decoded.app_id),
|
|
75
|
-
sessionId: (decoded.sessionId || decoded.sid),
|
|
76
|
-
roles: (decoded.roles ||
|
|
77
|
-
decoded.realm_access?.roles ||
|
|
78
|
-
[]),
|
|
79
|
-
permissions: (decoded.permissions ||
|
|
80
|
-
decoded.scope?.split(" ") ||
|
|
81
|
-
[]),
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
catch (error) {
|
|
85
|
-
// JWT parsing failed, return empty context
|
|
86
|
-
return {};
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Extract metadata from environment (browser or Node.js)
|
|
91
|
-
*/
|
|
92
|
-
extractMetadata() {
|
|
93
|
-
const metadata = {};
|
|
94
|
-
// Try to extract browser metadata
|
|
95
|
-
if (typeof globalThis !== "undefined" && "window" in globalThis) {
|
|
96
|
-
const win = globalThis;
|
|
97
|
-
const navigator = win.window?.navigator;
|
|
98
|
-
const location = win.window?.location;
|
|
99
|
-
metadata.userAgent = navigator?.userAgent;
|
|
100
|
-
metadata.hostname = location?.hostname;
|
|
101
|
-
}
|
|
102
|
-
// Try to extract Node.js metadata
|
|
103
|
-
if (typeof process !== "undefined" && process.env) {
|
|
104
|
-
metadata.hostname = process.env["HOSTNAME"] || "unknown";
|
|
105
|
-
}
|
|
106
|
-
return metadata;
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Log error message with optional stack trace and enhanced options
|
|
110
|
-
*/
|
|
111
|
-
async error(message, context, stackTrace, options) {
|
|
112
|
-
await this.log("error", message, context, stackTrace, options);
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Log audit event with enhanced options
|
|
116
|
-
*/
|
|
117
|
-
async audit(action, resource, context, options) {
|
|
118
|
-
const auditContext = {
|
|
119
|
-
action,
|
|
120
|
-
resource,
|
|
121
|
-
...context,
|
|
122
|
-
};
|
|
123
|
-
await this.log("audit", `Audit: ${action} on ${resource}`, auditContext, undefined, options);
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Log info message with enhanced options
|
|
127
|
-
*/
|
|
128
|
-
async info(message, context, options) {
|
|
129
|
-
await this.log("info", message, context, undefined, options);
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Log debug message with enhanced options
|
|
133
|
-
*/
|
|
134
|
-
async debug(message, context, options) {
|
|
135
|
-
if (this.config.logLevel === "debug") {
|
|
136
|
-
await this.log("debug", message, context, undefined, options);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Internal log method with enhanced features
|
|
141
|
-
*/
|
|
142
|
-
async log(level, message, context, stackTrace, options) {
|
|
143
|
-
// Extract JWT context if token provided
|
|
144
|
-
const jwtContext = options?.token
|
|
145
|
-
? this.extractJWTContext(options.token)
|
|
146
|
-
: {};
|
|
147
|
-
// Extract environment metadata
|
|
148
|
-
const metadata = this.extractMetadata();
|
|
149
|
-
// Generate correlation ID if not provided
|
|
150
|
-
const correlationId = options?.correlationId || this.generateCorrelationId();
|
|
151
|
-
// Mask sensitive data in context if enabled
|
|
152
|
-
const maskSensitive = options?.maskSensitiveData !== false && this.maskSensitiveData;
|
|
153
|
-
const maskedContext = maskSensitive && context
|
|
154
|
-
? data_masker_1.DataMasker.maskSensitiveData(context)
|
|
155
|
-
: context;
|
|
156
|
-
const logEntry = {
|
|
157
|
-
timestamp: new Date().toISOString(),
|
|
158
|
-
level,
|
|
159
|
-
environment: "unknown", // Backend extracts from client credentials
|
|
160
|
-
application: this.config.clientId, // Use clientId as application identifier
|
|
161
|
-
applicationId: options?.applicationId || "", // Optional from options
|
|
162
|
-
message,
|
|
163
|
-
context: maskedContext,
|
|
164
|
-
stackTrace,
|
|
165
|
-
correlationId,
|
|
166
|
-
userId: options?.userId || jwtContext.userId,
|
|
167
|
-
sessionId: options?.sessionId || jwtContext.sessionId,
|
|
168
|
-
requestId: options?.requestId,
|
|
169
|
-
ipAddress: options?.ipAddress || metadata.ipAddress,
|
|
170
|
-
userAgent: options?.userAgent || metadata.userAgent,
|
|
171
|
-
...metadata,
|
|
172
|
-
// Indexed context fields
|
|
173
|
-
sourceKey: options?.sourceKey,
|
|
174
|
-
sourceDisplayName: options?.sourceDisplayName,
|
|
175
|
-
externalSystemKey: options?.externalSystemKey,
|
|
176
|
-
externalSystemDisplayName: options?.externalSystemDisplayName,
|
|
177
|
-
recordKey: options?.recordKey,
|
|
178
|
-
recordDisplayName: options?.recordDisplayName,
|
|
179
|
-
// Credential context
|
|
180
|
-
credentialId: options?.credentialId,
|
|
181
|
-
credentialType: options?.credentialType,
|
|
182
|
-
// Request metrics
|
|
183
|
-
requestSize: options?.requestSize,
|
|
184
|
-
responseSize: options?.responseSize,
|
|
185
|
-
durationMs: options?.durationMs,
|
|
186
|
-
// Error classification
|
|
187
|
-
errorCategory: options?.errorCategory,
|
|
188
|
-
httpStatusCategory: options?.httpStatusCategory,
|
|
189
|
-
};
|
|
190
|
-
// If emitEvents is enabled, emit event and skip HTTP/Redis
|
|
191
|
-
if (this.config.emitEvents) {
|
|
192
|
-
// Emit log event - same payload structure as REST API
|
|
193
|
-
// Listener can check logEntry.level to filter by log level if needed
|
|
194
|
-
this.emit("log", logEntry);
|
|
195
|
-
return;
|
|
196
|
-
}
|
|
197
|
-
// Use batch queue for audit logs if available
|
|
198
|
-
if (level === "audit" && this.auditLogQueue) {
|
|
199
|
-
await this.auditLogQueue.add(logEntry);
|
|
200
|
-
return;
|
|
201
|
-
}
|
|
202
|
-
// Try Redis first (if available)
|
|
203
|
-
if (this.redis.isConnected()) {
|
|
204
|
-
const queueName = `logs:${this.config.clientId}`;
|
|
205
|
-
const success = await this.redis.rpush(queueName, JSON.stringify(logEntry));
|
|
206
|
-
if (success) {
|
|
207
|
-
return; // Successfully queued in Redis
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
// Check circuit breaker - skip HTTP logging if we've had too many failures
|
|
211
|
-
const now = Date.now();
|
|
212
|
-
if (this.httpLoggingDisabledUntil && now < this.httpLoggingDisabledUntil) {
|
|
213
|
-
// Circuit breaker is open - skip HTTP logging attempt
|
|
214
|
-
return;
|
|
215
|
-
}
|
|
216
|
-
// Fallback to unified logging endpoint with client credentials
|
|
217
|
-
try {
|
|
218
|
-
// Use ApiClient if available, otherwise fallback to HttpClient
|
|
219
|
-
if (this.apiClient) {
|
|
220
|
-
// Map LogEntry to CreateLogRequest format
|
|
221
|
-
const logType = level === 'audit' ? 'audit' : level === 'error' ? 'error' : 'general';
|
|
222
|
-
// Map level: 'audit' -> 'info', others map directly (CreateLogRequest.data.level doesn't accept 'audit')
|
|
223
|
-
const logLevel = level === 'audit' ? 'info' : level === 'error' ? 'error' : level === 'info' ? 'info' : 'debug';
|
|
224
|
-
// Build context with all LogEntry fields (backend extracts environment/application from credentials)
|
|
225
|
-
const enrichedContext = {
|
|
226
|
-
...logEntry.context,
|
|
227
|
-
// Include additional LogEntry fields in context
|
|
228
|
-
userId: logEntry.userId,
|
|
229
|
-
sessionId: logEntry.sessionId,
|
|
230
|
-
requestId: logEntry.requestId,
|
|
231
|
-
ipAddress: logEntry.ipAddress,
|
|
232
|
-
userAgent: logEntry.userAgent,
|
|
233
|
-
hostname: logEntry.hostname,
|
|
234
|
-
applicationId: logEntry.applicationId,
|
|
235
|
-
sourceKey: logEntry.sourceKey,
|
|
236
|
-
sourceDisplayName: logEntry.sourceDisplayName,
|
|
237
|
-
externalSystemKey: logEntry.externalSystemKey,
|
|
238
|
-
externalSystemDisplayName: logEntry.externalSystemDisplayName,
|
|
239
|
-
recordKey: logEntry.recordKey,
|
|
240
|
-
recordDisplayName: logEntry.recordDisplayName,
|
|
241
|
-
credentialId: logEntry.credentialId,
|
|
242
|
-
credentialType: logEntry.credentialType,
|
|
243
|
-
requestSize: logEntry.requestSize,
|
|
244
|
-
responseSize: logEntry.responseSize,
|
|
245
|
-
durationMs: logEntry.durationMs,
|
|
246
|
-
errorCategory: logEntry.errorCategory,
|
|
247
|
-
httpStatusCategory: logEntry.httpStatusCategory,
|
|
248
|
-
};
|
|
249
|
-
// Remove undefined values to keep payload clean
|
|
250
|
-
Object.keys(enrichedContext).forEach(key => {
|
|
251
|
-
if (enrichedContext[key] === undefined) {
|
|
252
|
-
delete enrichedContext[key];
|
|
253
|
-
}
|
|
254
|
-
});
|
|
255
|
-
// Include stackTrace in context if present
|
|
256
|
-
if (logEntry.stackTrace) {
|
|
257
|
-
enrichedContext.stackTrace = logEntry.stackTrace;
|
|
258
|
-
}
|
|
259
|
-
await this.apiClient.logs.createLog({
|
|
260
|
-
type: logType,
|
|
261
|
-
data: {
|
|
262
|
-
level: logLevel,
|
|
263
|
-
message: logEntry.message,
|
|
264
|
-
context: enrichedContext,
|
|
265
|
-
correlationId: logEntry.correlationId,
|
|
266
|
-
},
|
|
267
|
-
});
|
|
268
|
-
}
|
|
269
|
-
else {
|
|
270
|
-
// Fallback to HttpClient (shouldn't happen after initialization)
|
|
271
|
-
// Backend extracts environment and application from client credentials
|
|
272
|
-
await this.httpClient.request("POST", "/api/v1/logs", {
|
|
273
|
-
...logEntry,
|
|
274
|
-
// Remove fields that backend extracts from credentials
|
|
275
|
-
environment: undefined,
|
|
276
|
-
application: undefined,
|
|
277
|
-
});
|
|
278
|
-
}
|
|
279
|
-
// Success - reset failure counter
|
|
280
|
-
this.httpLoggingFailures = 0;
|
|
281
|
-
this.httpLoggingDisabledUntil = null;
|
|
282
|
-
}
|
|
283
|
-
catch (error) {
|
|
284
|
-
// Failed to send log to controller
|
|
285
|
-
// Increment failure counter and open circuit breaker after too many failures
|
|
286
|
-
this.httpLoggingFailures++;
|
|
287
|
-
if (this.httpLoggingFailures >= LoggerService.MAX_FAILURES) {
|
|
288
|
-
// Open circuit breaker - disable HTTP logging for a period
|
|
289
|
-
this.httpLoggingDisabledUntil = now + LoggerService.DISABLE_DURATION_MS;
|
|
290
|
-
this.httpLoggingFailures = 0; // Reset counter for next attempt after cooldown
|
|
291
|
-
}
|
|
292
|
-
// Silently fail to avoid infinite logging loops
|
|
293
|
-
// Application should implement retry or buffer strategy if needed
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
/**
|
|
297
|
-
* Method chaining support for complex logging scenarios
|
|
298
|
-
*/
|
|
299
|
-
withContext(context) {
|
|
300
|
-
return new LoggerChain(this, context);
|
|
301
|
-
}
|
|
302
|
-
withToken(token) {
|
|
303
|
-
return new LoggerChain(this, {}, { token });
|
|
304
|
-
}
|
|
305
|
-
withoutMasking() {
|
|
306
|
-
return new LoggerChain(this, {}, { maskSensitiveData: false });
|
|
307
|
-
}
|
|
308
|
-
/**
|
|
309
|
-
* Create logger chain with request context pre-populated
|
|
310
|
-
* Auto-extracts: IP, method, path, user-agent, correlation ID, user from JWT
|
|
311
|
-
*
|
|
312
|
-
* @param req - Express Request object
|
|
313
|
-
* @returns LoggerChain with request context pre-populated
|
|
314
|
-
*
|
|
315
|
-
* @example
|
|
316
|
-
* ```typescript
|
|
317
|
-
* await miso.log.forRequest(req).info("Processing request");
|
|
318
|
-
* ```
|
|
319
|
-
*/
|
|
320
|
-
forRequest(req) {
|
|
321
|
-
return new LoggerChain(this, {}, {}).withRequest(req);
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
exports.LoggerService = LoggerService;
|
|
325
|
-
LoggerService.MAX_FAILURES = 3;
|
|
326
|
-
LoggerService.DISABLE_DURATION_MS = 60000; // 1 minute
|
|
327
|
-
/**
|
|
328
|
-
* Method chaining class for fluent logging API
|
|
329
|
-
*/
|
|
330
|
-
class LoggerChain {
|
|
331
|
-
constructor(logger, context = {}, options = {}) {
|
|
332
|
-
this.logger = logger;
|
|
333
|
-
this.context = context;
|
|
334
|
-
this.options = options;
|
|
335
|
-
}
|
|
336
|
-
addContext(key, value) {
|
|
337
|
-
this.context[key] = value;
|
|
338
|
-
return this;
|
|
339
|
-
}
|
|
340
|
-
addUser(userId) {
|
|
341
|
-
this.options.userId = userId;
|
|
342
|
-
return this;
|
|
343
|
-
}
|
|
344
|
-
addApplication(applicationId) {
|
|
345
|
-
this.options.applicationId = applicationId;
|
|
346
|
-
return this;
|
|
347
|
-
}
|
|
348
|
-
addCorrelation(correlationId) {
|
|
349
|
-
this.options.correlationId = correlationId;
|
|
350
|
-
return this;
|
|
351
|
-
}
|
|
352
|
-
withToken(token) {
|
|
353
|
-
this.options.token = token;
|
|
354
|
-
return this;
|
|
355
|
-
}
|
|
356
|
-
withoutMasking() {
|
|
357
|
-
this.options.maskSensitiveData = false;
|
|
358
|
-
return this;
|
|
359
|
-
}
|
|
360
|
-
/**
|
|
361
|
-
* Add indexed logging context fields for fast queries
|
|
362
|
-
*
|
|
363
|
-
* @param context - Indexed logging context with source, external system, and record fields
|
|
364
|
-
* @returns LoggerChain instance for method chaining
|
|
365
|
-
*
|
|
366
|
-
* @example
|
|
367
|
-
* ```typescript
|
|
368
|
-
* await logger
|
|
369
|
-
* .withIndexedContext({
|
|
370
|
-
* sourceKey: 'datasource-1',
|
|
371
|
-
* sourceDisplayName: 'PostgreSQL DB',
|
|
372
|
-
* externalSystemKey: 'system-1',
|
|
373
|
-
* recordKey: 'record-123'
|
|
374
|
-
* })
|
|
375
|
-
* .info('Sync completed');
|
|
376
|
-
* ```
|
|
377
|
-
*/
|
|
378
|
-
withIndexedContext(context) {
|
|
379
|
-
this.options.sourceKey = context.sourceKey;
|
|
380
|
-
this.options.sourceDisplayName = context.sourceDisplayName;
|
|
381
|
-
this.options.externalSystemKey = context.externalSystemKey;
|
|
382
|
-
this.options.externalSystemDisplayName = context.externalSystemDisplayName;
|
|
383
|
-
this.options.recordKey = context.recordKey;
|
|
384
|
-
this.options.recordDisplayName = context.recordDisplayName;
|
|
385
|
-
return this;
|
|
386
|
-
}
|
|
387
|
-
/**
|
|
388
|
-
* Add credential context for audit logging
|
|
389
|
-
*
|
|
390
|
-
* @param credentialId - Optional credential identifier
|
|
391
|
-
* @param credentialType - Optional credential type (e.g., 'oauth2', 'api-key')
|
|
392
|
-
* @returns LoggerChain instance for method chaining
|
|
393
|
-
*
|
|
394
|
-
* @example
|
|
395
|
-
* ```typescript
|
|
396
|
-
* await logger
|
|
397
|
-
* .withCredentialContext('cred-123', 'oauth2')
|
|
398
|
-
* .info('API call completed');
|
|
399
|
-
* ```
|
|
400
|
-
*/
|
|
401
|
-
withCredentialContext(credentialId, credentialType) {
|
|
402
|
-
this.options.credentialId = credentialId;
|
|
403
|
-
this.options.credentialType = credentialType;
|
|
404
|
-
return this;
|
|
405
|
-
}
|
|
406
|
-
/**
|
|
407
|
-
* Add request/response metrics for performance logging
|
|
408
|
-
*
|
|
409
|
-
* @param requestSize - Optional request size in bytes
|
|
410
|
-
* @param responseSize - Optional response size in bytes
|
|
411
|
-
* @param durationMs - Optional request duration in milliseconds
|
|
412
|
-
* @returns LoggerChain instance for method chaining
|
|
413
|
-
*
|
|
414
|
-
* @example
|
|
415
|
-
* ```typescript
|
|
416
|
-
* await logger
|
|
417
|
-
* .withRequestMetrics(1024, 2048, 150)
|
|
418
|
-
* .info('Upstream API call completed');
|
|
419
|
-
* ```
|
|
420
|
-
*/
|
|
421
|
-
withRequestMetrics(requestSize, responseSize, durationMs) {
|
|
422
|
-
this.options.requestSize = requestSize;
|
|
423
|
-
this.options.responseSize = responseSize;
|
|
424
|
-
this.options.durationMs = durationMs;
|
|
425
|
-
return this;
|
|
426
|
-
}
|
|
427
|
-
/**
|
|
428
|
-
* Auto-extract logging context from Express Request
|
|
429
|
-
* Extracts: IP, method, path, user-agent, correlation ID, user from JWT
|
|
430
|
-
*
|
|
431
|
-
* @param req - Express Request object
|
|
432
|
-
* @returns LoggerChain instance for method chaining
|
|
433
|
-
*
|
|
434
|
-
* @example
|
|
435
|
-
* ```typescript
|
|
436
|
-
* await miso.log
|
|
437
|
-
* .withRequest(req)
|
|
438
|
-
* .info("Processing request");
|
|
439
|
-
* ```
|
|
440
|
-
*/
|
|
441
|
-
withRequest(req) {
|
|
442
|
-
const ctx = (0, request_context_1.extractRequestContext)(req);
|
|
443
|
-
// Merge into options (these become top-level LogEntry fields)
|
|
444
|
-
if (ctx.userId) {
|
|
445
|
-
this.options.userId = ctx.userId;
|
|
446
|
-
}
|
|
447
|
-
if (ctx.sessionId) {
|
|
448
|
-
this.options.sessionId = ctx.sessionId;
|
|
449
|
-
}
|
|
450
|
-
if (ctx.correlationId) {
|
|
451
|
-
this.options.correlationId = ctx.correlationId;
|
|
452
|
-
}
|
|
453
|
-
if (ctx.requestId) {
|
|
454
|
-
this.options.requestId = ctx.requestId;
|
|
455
|
-
}
|
|
456
|
-
if (ctx.ipAddress) {
|
|
457
|
-
this.options.ipAddress = ctx.ipAddress;
|
|
458
|
-
}
|
|
459
|
-
if (ctx.userAgent) {
|
|
460
|
-
this.options.userAgent = ctx.userAgent;
|
|
461
|
-
}
|
|
462
|
-
// Merge into context (additional request info, not top-level LogEntry fields)
|
|
463
|
-
if (ctx.method) {
|
|
464
|
-
this.context.method = ctx.method;
|
|
465
|
-
}
|
|
466
|
-
if (ctx.path) {
|
|
467
|
-
this.context.path = ctx.path;
|
|
468
|
-
}
|
|
469
|
-
if (ctx.referer) {
|
|
470
|
-
this.context.referer = ctx.referer;
|
|
471
|
-
}
|
|
472
|
-
if (ctx.requestSize !== undefined) {
|
|
473
|
-
this.context.requestSize = ctx.requestSize;
|
|
474
|
-
}
|
|
475
|
-
return this;
|
|
476
|
-
}
|
|
477
|
-
async error(message, stackTrace) {
|
|
478
|
-
await this.logger.error(message, this.context, stackTrace, this.options);
|
|
479
|
-
}
|
|
480
|
-
async info(message) {
|
|
481
|
-
await this.logger.info(message, this.context, this.options);
|
|
482
|
-
}
|
|
483
|
-
async audit(action, resource) {
|
|
484
|
-
await this.logger.audit(action, resource, this.context, this.options);
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
exports.LoggerChain = LoggerChain;
|
|
488
|
-
//# sourceMappingURL=logger.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.service.js","sourceRoot":"","sources":["../../src/services/logger.service.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;AAEH,mCAAsC;AAKtC,sDAAkD;AAElD,8DAAyD;AACzD,8DAAiE;AAEjE,gEAA+B;AAoC/B,MAAa,aAAc,SAAQ,qBAAY;IAc7C,YAAY,UAAsB,EAAE,KAAmB;QACrD,KAAK,EAAE,CAAC,CAAC,0BAA0B;QAV7B,sBAAiB,GAAG,IAAI,CAAC,CAAC,+BAA+B;QACzD,uBAAkB,GAAG,CAAC,CAAC;QACvB,kBAAa,GAAyB,IAAI,CAAC;QACnD,2EAA2E;QACnE,wBAAmB,GAAG,CAAC,CAAC;QACxB,6BAAwB,GAAkB,IAAI,CAAC;QAMrD,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAE7B,yDAAyD;QACzD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QAC5C,IACE,WAAW,CAAC,SAAS,KAAK,SAAS;YACnC,WAAW,CAAC,aAAa,KAAK,SAAS,EACvC,CAAC;YACD,IAAI,CAAC,aAAa,GAAG,IAAI,+BAAa,CACpC,UAAU,EACV,KAAK,EACL,IAAI,CAAC,MAAM,EACX,IAAI,CACL,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,SAAoB;QAC/B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,mDAAmD;QACnD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,OAAgB;QACzB,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC;IACnC,CAAC;IAED;;OAEG;IACK,qBAAqB;QAC3B,IAAI,CAAC,kBAAkB,GAAG,CAAC,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;QAChE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1D,yCAAyC;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3D,OAAO,GAAG,YAAY,IAAI,SAAS,IAAI,IAAI,CAAC,kBAAkB,IAAI,MAAM,EAAE,CAAC;IAC7E,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,KAAc;QAOtC,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QAEtB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,sBAAG,CAAC,MAAM,CAAC,KAAK,CAAmC,CAAC;YACpE,IAAI,CAAC,OAAO;gBAAE,OAAO,EAAE,CAAC;YAExB,OAAO;gBACL,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,OAAO,CAE5C;gBACb,aAAa,EAAE,CAAC,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,MAAM,CAE1C;gBACb,SAAS,EAAE,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAuB;gBACnE,KAAK,EAAE,CAAC,OAAO,CAAC,KAAK;oBAClB,OAAO,CAAC,YAAiD,EAAE,KAAK;oBACjE,EAAE,CAAa;gBACjB,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW;oBAC9B,OAAO,CAAC,KAA4B,EAAE,KAAK,CAAC,GAAG,CAAC;oBACjD,EAAE,CAAa;aAClB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,2CAA2C;YAC3C,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,eAAe;QACrB,MAAM,QAAQ,GAA4B,EAAE,CAAC;QAE7C,kCAAkC;QAClC,IAAI,OAAO,UAAU,KAAK,WAAW,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;YAChE,MAAM,GAAG,GAAG,UAAqC,CAAC;YAClD,MAAM,SAAS,GAAI,GAAG,CAAC,MAAkC,EAAE,SAE9C,CAAC;YACd,MAAM,QAAQ,GAAI,GAAG,CAAC,MAAkC,EAAE,QAE7C,CAAC;YAEd,QAAQ,CAAC,SAAS,GAAG,SAAS,EAAE,SAA+B,CAAC;YAChE,QAAQ,CAAC,QAAQ,GAAG,QAAQ,EAAE,QAA8B,CAAC;QAC/D,CAAC;QAED,kCAAkC;QAClC,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAClD,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC;QAC3D,CAAC;QAED,OAAO,QAA6B,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CACT,OAAe,EACf,OAAiC,EACjC,UAAmB,EACnB,OAA8B;QAE9B,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACjE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CACT,MAAc,EACd,QAAgB,EAChB,OAAiC,EACjC,OAA8B;QAE9B,MAAM,YAAY,GAAG;YACnB,MAAM;YACN,QAAQ;YACR,GAAG,OAAO;SACX,CAAC;QACF,MAAM,IAAI,CAAC,GAAG,CACZ,OAAO,EACP,UAAU,MAAM,OAAO,QAAQ,EAAE,EACjC,YAAY,EACZ,SAAS,EACT,OAAO,CACR,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CACR,OAAe,EACf,OAAiC,EACjC,OAA8B;QAE9B,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CACT,OAAe,EACf,OAAiC,EACjC,OAA8B;QAE9B,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACrC,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,GAAG,CACf,KAAwB,EACxB,OAAe,EACf,OAAiC,EACjC,UAAmB,EACnB,OAA8B;QAE9B,wCAAwC;QACxC,MAAM,UAAU,GAAG,OAAO,EAAE,KAAK;YAC/B,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC;YACvC,CAAC,CAAC,EAAE,CAAC;QAEP,+BAA+B;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAExC,0CAA0C;QAC1C,MAAM,aAAa,GACjB,OAAO,EAAE,aAAa,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAEzD,4CAA4C;QAC5C,MAAM,aAAa,GACjB,OAAO,EAAE,iBAAiB,KAAK,KAAK,IAAI,IAAI,CAAC,iBAAiB,CAAC;QACjE,MAAM,aAAa,GACjB,aAAa,IAAI,OAAO;YACtB,CAAC,CAAE,wBAAU,CAAC,iBAAiB,CAAC,OAAO,CAA6B;YACpE,CAAC,CAAC,OAAO,CAAC;QAEd,MAAM,QAAQ,GAAa;YACzB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK;YACL,WAAW,EAAE,SAAS,EAAE,2CAA2C;YACnE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,yCAAyC;YAC5E,aAAa,EAAE,OAAO,EAAE,aAAa,IAAI,EAAE,EAAE,wBAAwB;YACrE,OAAO;YACP,OAAO,EAAE,aAAa;YACtB,UAAU;YACV,aAAa;YACb,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,UAAU,CAAC,MAAM;YAC5C,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,UAAU,CAAC,SAAS;YACrD,SAAS,EAAE,OAAO,EAAE,SAAS;YAC7B,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,QAAQ,CAAC,SAAS;YACnD,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,QAAQ,CAAC,SAAS;YACnD,GAAG,QAAQ;YACX,yBAAyB;YACzB,SAAS,EAAE,OAAO,EAAE,SAAS;YAC7B,iBAAiB,EAAE,OAAO,EAAE,iBAAiB;YAC7C,iBAAiB,EAAE,OAAO,EAAE,iBAAiB;YAC7C,yBAAyB,EAAE,OAAO,EAAE,yBAAyB;YAC7D,SAAS,EAAE,OAAO,EAAE,SAAS;YAC7B,iBAAiB,EAAE,OAAO,EAAE,iBAAiB;YAC7C,qBAAqB;YACrB,YAAY,EAAE,OAAO,EAAE,YAAY;YACnC,cAAc,EAAE,OAAO,EAAE,cAAc;YACvC,kBAAkB;YAClB,WAAW,EAAE,OAAO,EAAE,WAAW;YACjC,YAAY,EAAE,OAAO,EAAE,YAAY;YACnC,UAAU,EAAE,OAAO,EAAE,UAAU;YAC/B,uBAAuB;YACvB,aAAa,EAAE,OAAO,EAAE,aAAa;YACrC,kBAAkB,EAAE,OAAO,EAAE,kBAAkB;SAChD,CAAC;QAEF,2DAA2D;QAC3D,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAC3B,sDAAsD;YACtD,qEAAqE;YACrE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,8CAA8C;QAC9C,IAAI,KAAK,KAAK,OAAO,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC5C,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QAED,iCAAiC;QACjC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACjD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CACpC,SAAS,EACT,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CACzB,CAAC;YAEF,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,+BAA+B;YACzC,CAAC;QACH,CAAC;QAED,2EAA2E;QAC3E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,wBAAwB,IAAI,GAAG,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;YACzE,sDAAsD;YACtD,OAAO;QACT,CAAC;QAED,+DAA+D;QAC/D,IAAI,CAAC;YACH,+DAA+D;YAC/D,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,0CAA0C;gBAC1C,MAAM,OAAO,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;gBACtF,yGAAyG;gBACzG,MAAM,QAAQ,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;gBAEhH,qGAAqG;gBACrG,MAAM,eAAe,GAA4B;oBAC/C,GAAG,QAAQ,CAAC,OAAO;oBACnB,gDAAgD;oBAChD,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,SAAS,EAAE,QAAQ,CAAC,SAAS;oBAC7B,SAAS,EAAE,QAAQ,CAAC,SAAS;oBAC7B,SAAS,EAAE,QAAQ,CAAC,SAAS;oBAC7B,SAAS,EAAE,QAAQ,CAAC,SAAS;oBAC7B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;oBAC3B,aAAa,EAAE,QAAQ,CAAC,aAAa;oBACrC,SAAS,EAAE,QAAQ,CAAC,SAAS;oBAC7B,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;oBAC7C,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;oBAC7C,yBAAyB,EAAE,QAAQ,CAAC,yBAAyB;oBAC7D,SAAS,EAAE,QAAQ,CAAC,SAAS;oBAC7B,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;oBAC7C,YAAY,EAAE,QAAQ,CAAC,YAAY;oBACnC,cAAc,EAAE,QAAQ,CAAC,cAAc;oBACvC,WAAW,EAAE,QAAQ,CAAC,WAAW;oBACjC,YAAY,EAAE,QAAQ,CAAC,YAAY;oBACnC,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,aAAa,EAAE,QAAQ,CAAC,aAAa;oBACrC,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB;iBAChD,CAAC;gBAEF,gDAAgD;gBAChD,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;oBACzC,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;wBACvC,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;oBAC9B,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,2CAA2C;gBAC3C,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;oBACxB,eAAe,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;gBACnD,CAAC;gBAED,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;oBAClC,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE;wBACJ,KAAK,EAAE,QAAQ;wBACf,OAAO,EAAE,QAAQ,CAAC,OAAO;wBACzB,OAAO,EAAE,eAAe;wBACxB,aAAa,EAAE,QAAQ,CAAC,aAAa;qBACtC;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,iEAAiE;gBACjE,uEAAuE;gBACvE,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE;oBACpD,GAAG,QAAQ;oBACX,uDAAuD;oBACvD,WAAW,EAAE,SAAS;oBACtB,WAAW,EAAE,SAAS;iBACvB,CAAC,CAAC;YACL,CAAC;YACD,kCAAkC;YAClC,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;YAC7B,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,mCAAmC;YACnC,6EAA6E;YAC7E,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,mBAAmB,IAAI,aAAa,CAAC,YAAY,EAAE,CAAC;gBAC3D,2DAA2D;gBAC3D,IAAI,CAAC,wBAAwB,GAAG,GAAG,GAAG,aAAa,CAAC,mBAAmB,CAAC;gBACxE,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC,gDAAgD;YAChF,CAAC;YACD,gDAAgD;YAChD,kEAAkE;QACpE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,OAAgC;QAC1C,OAAO,IAAI,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,SAAS,CAAC,KAAa;QACrB,OAAO,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAC;IACjE,CAAC;IAED;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,GAAY;QACrB,OAAO,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxD,CAAC;;AAjZH,sCAkZC;AAvYyB,0BAAY,GAAG,CAAC,AAAJ,CAAK;AACjB,iCAAmB,GAAG,KAAK,AAAR,CAAS,CAAC,WAAW;AAwYlE;;GAEG;AACH,MAAa,WAAW;IAKtB,YACE,MAAqB,EACrB,UAAmC,EAAE,EACrC,UAAgC,EAAE;QAElC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,UAAU,CAAC,GAAW,EAAE,KAAc;QACpC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,MAAc;QACpB,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,cAAc,CAAC,aAAqB;QAClC,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,aAAa,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,cAAc,CAAC,aAAqB;QAClC,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,aAAa,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,KAAa;QACrB,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,OAAO,CAAC,iBAAiB,GAAG,KAAK,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,kBAAkB,CAAC,OAA8B;QAC/C,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QAC3C,IAAI,CAAC,OAAO,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;QAC3D,IAAI,CAAC,OAAO,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;QAC3D,IAAI,CAAC,OAAO,CAAC,yBAAyB,GAAG,OAAO,CAAC,yBAAyB,CAAC;QAC3E,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QAC3C,IAAI,CAAC,OAAO,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,qBAAqB,CAAC,YAAqB,EAAE,cAAuB;QAClE,IAAI,CAAC,OAAO,CAAC,YAAY,GAAG,YAAY,CAAC;QACzC,IAAI,CAAC,OAAO,CAAC,cAAc,GAAG,cAAc,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,kBAAkB,CAAC,WAAoB,EAAE,YAAqB,EAAE,UAAmB;QACjF,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,YAAY,GAAG,YAAY,CAAC;QACzC,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,WAAW,CAAC,GAAY;QACtB,MAAM,GAAG,GAAG,IAAA,uCAAqB,EAAC,GAAG,CAAC,CAAC;QAEvC,8DAA8D;QAC9D,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QACnC,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QACzC,CAAC;QACD,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;YACtB,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC;QACjD,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QACzC,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QACzC,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QACzC,CAAC;QAED,8EAA8E;QAC9E,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QACnC,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACb,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QAC/B,CAAC;QACD,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QACrC,CAAC;QACD,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;QAC7C,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAe,EAAE,UAAmB;QAC9C,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAe;QACxB,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAc,EAAE,QAAgB;QAC1C,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACxE,CAAC;CACF;AApLD,kCAoLC"}
|