@aifabrix/miso-client 3.4.2 → 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.
Files changed (166) hide show
  1. package/CHANGELOG.md +306 -12
  2. package/dist/api/auth-cache.api.d.ts.map +1 -1
  3. package/dist/api/auth-cache.api.js +27 -5
  4. package/dist/api/auth-cache.api.js.map +1 -1
  5. package/dist/api/auth-login.api.d.ts.map +1 -1
  6. package/dist/api/auth-login.api.js +49 -6
  7. package/dist/api/auth-login.api.js.map +1 -1
  8. package/dist/api/auth-token.api.d.ts.map +1 -1
  9. package/dist/api/auth-token.api.js +99 -7
  10. package/dist/api/auth-token.api.js.map +1 -1
  11. package/dist/api/auth-user.api.d.ts.map +1 -1
  12. package/dist/api/auth-user.api.js +22 -4
  13. package/dist/api/auth-user.api.js.map +1 -1
  14. package/dist/api/auth.api.d.ts +2 -9
  15. package/dist/api/auth.api.d.ts.map +1 -1
  16. package/dist/api/auth.api.js +1 -66
  17. package/dist/api/auth.api.js.map +1 -1
  18. package/dist/api/logs-create.api.d.ts.map +1 -1
  19. package/dist/api/logs-create.api.js +57 -4
  20. package/dist/api/logs-create.api.js.map +1 -1
  21. package/dist/api/logs-export.api.d.ts.map +1 -1
  22. package/dist/api/logs-export.api.js +7 -1
  23. package/dist/api/logs-export.api.js.map +1 -1
  24. package/dist/api/logs-list.api.d.ts.map +1 -1
  25. package/dist/api/logs-list.api.js +32 -6
  26. package/dist/api/logs-list.api.js.map +1 -1
  27. package/dist/api/logs-stats.api.d.ts.map +1 -1
  28. package/dist/api/logs-stats.api.js +22 -4
  29. package/dist/api/logs-stats.api.js.map +1 -1
  30. package/dist/api/permissions.api.d.ts +2 -1
  31. package/dist/api/permissions.api.d.ts.map +1 -1
  32. package/dist/api/permissions.api.js +16 -5
  33. package/dist/api/permissions.api.js.map +1 -1
  34. package/dist/api/roles.api.d.ts +2 -1
  35. package/dist/api/roles.api.d.ts.map +1 -1
  36. package/dist/api/roles.api.js +16 -5
  37. package/dist/api/roles.api.js.map +1 -1
  38. package/dist/api/types/logs.types.d.ts +44 -7
  39. package/dist/api/types/logs.types.d.ts.map +1 -1
  40. package/dist/express/client-token-endpoint.d.ts.map +1 -1
  41. package/dist/express/client-token-endpoint.js +42 -5
  42. package/dist/express/client-token-endpoint.js.map +1 -1
  43. package/dist/express/error-handler.d.ts.map +1 -1
  44. package/dist/express/error-handler.js +32 -8
  45. package/dist/express/error-handler.js.map +1 -1
  46. package/dist/express/index.d.ts +1 -0
  47. package/dist/express/index.d.ts.map +1 -1
  48. package/dist/express/index.js +4 -1
  49. package/dist/express/index.js.map +1 -1
  50. package/dist/express/logger-context.middleware.d.ts +46 -0
  51. package/dist/express/logger-context.middleware.d.ts.map +1 -0
  52. package/dist/express/logger-context.middleware.js +99 -0
  53. package/dist/express/logger-context.middleware.js.map +1 -0
  54. package/dist/index.d.ts +6 -3
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +16 -5
  57. package/dist/index.js.map +1 -1
  58. package/dist/services/auth.service.d.ts.map +1 -1
  59. package/dist/services/auth.service.js +97 -8
  60. package/dist/services/auth.service.js.map +1 -1
  61. package/dist/services/browser-permission.service.d.ts +5 -0
  62. package/dist/services/browser-permission.service.d.ts.map +1 -1
  63. package/dist/services/browser-permission.service.js +39 -2
  64. package/dist/services/browser-permission.service.js.map +1 -1
  65. package/dist/services/browser-role.service.d.ts +5 -0
  66. package/dist/services/browser-role.service.d.ts.map +1 -1
  67. package/dist/services/browser-role.service.js +45 -2
  68. package/dist/services/browser-role.service.js.map +1 -1
  69. package/dist/services/logger/index.d.ts +10 -0
  70. package/dist/services/logger/index.d.ts.map +1 -0
  71. package/dist/services/logger/index.js +22 -0
  72. package/dist/services/logger/index.js.map +1 -0
  73. package/dist/services/logger/logger-chain.d.ts +90 -0
  74. package/dist/services/logger/logger-chain.d.ts.map +1 -0
  75. package/dist/services/logger/logger-chain.js +169 -0
  76. package/dist/services/logger/logger-chain.js.map +1 -0
  77. package/dist/services/logger/logger-context-storage.d.ts +73 -0
  78. package/dist/services/logger/logger-context-storage.d.ts.map +1 -0
  79. package/dist/services/logger/logger-context-storage.js +86 -0
  80. package/dist/services/logger/logger-context-storage.js.map +1 -0
  81. package/dist/services/logger/logger-context.d.ts +85 -0
  82. package/dist/services/logger/logger-context.d.ts.map +1 -0
  83. package/dist/services/logger/logger-context.js +192 -0
  84. package/dist/services/logger/logger-context.js.map +1 -0
  85. package/dist/services/{logger.service.d.ts → logger/logger.service.d.ts} +59 -72
  86. package/dist/services/logger/logger.service.d.ts.map +1 -0
  87. package/dist/services/logger/logger.service.js +403 -0
  88. package/dist/services/logger/logger.service.js.map +1 -0
  89. package/dist/services/logger/unified-logger.factory.d.ts +87 -0
  90. package/dist/services/logger/unified-logger.factory.d.ts.map +1 -0
  91. package/dist/services/logger/unified-logger.factory.js +120 -0
  92. package/dist/services/logger/unified-logger.factory.js.map +1 -0
  93. package/dist/services/logger/unified-logger.service.d.ts +89 -0
  94. package/dist/services/logger/unified-logger.service.d.ts.map +1 -0
  95. package/dist/services/logger/unified-logger.service.js +178 -0
  96. package/dist/services/logger/unified-logger.service.js.map +1 -0
  97. package/dist/services/permission.service.d.ts +5 -0
  98. package/dist/services/permission.service.d.ts.map +1 -1
  99. package/dist/services/permission.service.js +42 -2
  100. package/dist/services/permission.service.js.map +1 -1
  101. package/dist/services/redis.service.d.ts.map +1 -1
  102. package/dist/services/redis.service.js +2 -0
  103. package/dist/services/redis.service.js.map +1 -1
  104. package/dist/services/role.service.d.ts +5 -0
  105. package/dist/services/role.service.d.ts.map +1 -1
  106. package/dist/services/role.service.js +42 -2
  107. package/dist/services/role.service.js.map +1 -1
  108. package/dist/types/config.types.d.ts +1 -0
  109. package/dist/types/config.types.d.ts.map +1 -1
  110. package/dist/types/config.types.js.map +1 -1
  111. package/dist/types/filter.types.d.ts +6 -6
  112. package/dist/types/filter.types.d.ts.map +1 -1
  113. package/dist/types/filter.types.js +14 -5
  114. package/dist/types/filter.types.js.map +1 -1
  115. package/dist/utils/config-loader.d.ts.map +1 -1
  116. package/dist/utils/config-loader.js +10 -0
  117. package/dist/utils/config-loader.js.map +1 -1
  118. package/dist/utils/console-logger.d.ts +21 -0
  119. package/dist/utils/console-logger.d.ts.map +1 -0
  120. package/dist/utils/console-logger.js +58 -0
  121. package/dist/utils/console-logger.js.map +1 -0
  122. package/dist/utils/controller-url-resolver.d.ts.map +1 -1
  123. package/dist/utils/controller-url-resolver.js +5 -0
  124. package/dist/utils/controller-url-resolver.js.map +1 -1
  125. package/dist/utils/data-client-auth.d.ts.map +1 -1
  126. package/dist/utils/data-client-auth.js +34 -2
  127. package/dist/utils/data-client-auth.js.map +1 -1
  128. package/dist/utils/data-client-auto-init.d.ts.map +1 -1
  129. package/dist/utils/data-client-auto-init.js +59 -3
  130. package/dist/utils/data-client-auto-init.js.map +1 -1
  131. package/dist/utils/data-client-request.d.ts.map +1 -1
  132. package/dist/utils/data-client-request.js +78 -2
  133. package/dist/utils/data-client-request.js.map +1 -1
  134. package/dist/utils/data-client.d.ts.map +1 -1
  135. package/dist/utils/data-client.js +25 -19
  136. package/dist/utils/data-client.js.map +1 -1
  137. package/dist/utils/environment-token.d.ts.map +1 -1
  138. package/dist/utils/environment-token.js +37 -57
  139. package/dist/utils/environment-token.js.map +1 -1
  140. package/dist/utils/error-extractor.d.ts +52 -0
  141. package/dist/utils/error-extractor.d.ts.map +1 -0
  142. package/dist/utils/error-extractor.js +136 -0
  143. package/dist/utils/error-extractor.js.map +1 -0
  144. package/dist/utils/filter.utils.d.ts +115 -3
  145. package/dist/utils/filter.utils.d.ts.map +1 -1
  146. package/dist/utils/filter.utils.js +298 -27
  147. package/dist/utils/filter.utils.js.map +1 -1
  148. package/dist/utils/http-client-audit.d.ts +1 -1
  149. package/dist/utils/http-client-audit.d.ts.map +1 -1
  150. package/dist/utils/http-client.d.ts +1 -1
  151. package/dist/utils/http-client.d.ts.map +1 -1
  152. package/dist/utils/internal-http-client.d.ts +12 -0
  153. package/dist/utils/internal-http-client.d.ts.map +1 -1
  154. package/dist/utils/internal-http-client.js +235 -11
  155. package/dist/utils/internal-http-client.js.map +1 -1
  156. package/dist/utils/response-validator.d.ts +59 -0
  157. package/dist/utils/response-validator.d.ts.map +1 -0
  158. package/dist/utils/response-validator.js +115 -0
  159. package/dist/utils/response-validator.js.map +1 -0
  160. package/dist/utils/token-utils.d.ts.map +1 -1
  161. package/dist/utils/token-utils.js +75 -4
  162. package/dist/utils/token-utils.js.map +1 -1
  163. package/package.json +2 -1
  164. package/dist/services/logger.service.d.ts.map +0 -1
  165. package/dist/services/logger.service.js +0 -488
  166. package/dist/services/logger.service.js.map +0 -1
@@ -3,10 +3,11 @@
3
3
  */
4
4
  import { EventEmitter } from "events";
5
5
  import { Request } from "express";
6
- import { HttpClient } from "../utils/http-client";
7
- import { ApiClient } from "../api";
8
- import { RedisService } from "./redis.service";
9
- import { IndexedLoggingContext } from "../utils/logging-helpers";
6
+ import { HttpClient } from "../../utils/http-client";
7
+ import { ApiClient } from "../../api";
8
+ import { RedisService } from "../redis.service";
9
+ import { LogEntry } from "../../types/config.types";
10
+ import { LoggerChain } from "./logger-chain";
10
11
  export interface ClientLoggingOptions {
11
12
  applicationId?: string;
12
13
  userId?: string;
@@ -55,16 +56,16 @@ export declare class LoggerService extends EventEmitter {
55
56
  setMasking(enabled: boolean): void;
56
57
  /**
57
58
  * Generate unique correlation ID for request tracking
59
+ * Public method to allow other modules to generate consistent correlation IDs
60
+ *
61
+ * @returns Unique correlation ID string
62
+ *
63
+ * @example
64
+ * ```typescript
65
+ * const correlationId = loggerService.generateCorrelationId();
66
+ * ```
58
67
  */
59
- private generateCorrelationId;
60
- /**
61
- * Extract JWT token information
62
- */
63
- private extractJWTContext;
64
- /**
65
- * Extract metadata from environment (browser or Node.js)
66
- */
67
- private extractMetadata;
68
+ generateCorrelationId(): string;
68
69
  /**
69
70
  * Log error message with optional stack trace and enhanced options
70
71
  */
@@ -92,100 +93,86 @@ export declare class LoggerService extends EventEmitter {
92
93
  withToken(token: string): LoggerChain;
93
94
  withoutMasking(): LoggerChain;
94
95
  /**
95
- * Create logger chain with request context pre-populated
96
- * Auto-extracts: IP, method, path, user-agent, correlation ID, user from JWT
96
+ * Get LogEntry object with request context extracted
97
+ * Extracts IP, method, path, userAgent, correlationId, userId from Express Request
98
+ * Returns structured LogEntry object ready for external logger tables
97
99
  *
98
100
  * @param req - Express Request object
99
- * @returns LoggerChain with request context pre-populated
101
+ * @param message - Log message
102
+ * @param level - Optional log level (defaults to 'info')
103
+ * @param context - Optional additional context
104
+ * @returns Complete LogEntry object with all request context extracted
100
105
  *
101
106
  * @example
102
107
  * ```typescript
103
- * await miso.log.forRequest(req).info("Processing request");
108
+ * const logEntry = client.log.getLogWithRequest(req, 'User action', 'info', { action: 'login' });
109
+ * await myCustomLogger.save(logEntry); // Save to own logger table
104
110
  * ```
105
111
  */
106
- forRequest(req: Request): LoggerChain;
107
- }
108
- /**
109
- * Method chaining class for fluent logging API
110
- */
111
- export declare class LoggerChain {
112
- private logger;
113
- private context;
114
- private options;
115
- constructor(logger: LoggerService, context?: Record<string, unknown>, options?: ClientLoggingOptions);
116
- addContext(key: string, value: unknown): LoggerChain;
117
- addUser(userId: string): LoggerChain;
118
- addApplication(applicationId: string): LoggerChain;
119
- addCorrelation(correlationId: string): LoggerChain;
120
- withToken(token: string): LoggerChain;
121
- withoutMasking(): LoggerChain;
112
+ getLogWithRequest(req: Request, message: string, level?: LogEntry["level"], context?: Record<string, unknown>): LogEntry;
122
113
  /**
123
- * Add indexed logging context fields for fast queries
114
+ * Get LogEntry object with provided context
115
+ * Generates correlation ID automatically and extracts metadata from environment
124
116
  *
125
- * @param context - Indexed logging context with source, external system, and record fields
126
- * @returns LoggerChain instance for method chaining
117
+ * @param context - Context object to include in logs
118
+ * @param message - Log message
119
+ * @param level - Optional log level (defaults to 'info')
120
+ * @returns Complete LogEntry object
127
121
  *
128
122
  * @example
129
123
  * ```typescript
130
- * await logger
131
- * .withIndexedContext({
132
- * sourceKey: 'datasource-1',
133
- * sourceDisplayName: 'PostgreSQL DB',
134
- * externalSystemKey: 'system-1',
135
- * recordKey: 'record-123'
136
- * })
137
- * .info('Sync completed');
124
+ * const logEntry = client.log.getWithContext({ operation: 'sync' }, 'Sync started');
125
+ * await myCustomLogger.save(logEntry);
138
126
  * ```
139
127
  */
140
- withIndexedContext(context: IndexedLoggingContext): LoggerChain;
128
+ getWithContext(context: Record<string, unknown>, message: string, level?: LogEntry["level"]): LogEntry;
141
129
  /**
142
- * Add credential context for audit logging
130
+ * Get LogEntry object with token context extracted
131
+ * Extracts userId, sessionId, applicationId from JWT token
132
+ * Generates correlation ID automatically
143
133
  *
144
- * @param credentialId - Optional credential identifier
145
- * @param credentialType - Optional credential type (e.g., 'oauth2', 'api-key')
146
- * @returns LoggerChain instance for method chaining
134
+ * @param token - JWT token to extract user context from
135
+ * @param message - Log message
136
+ * @param level - Optional log level (defaults to 'info')
137
+ * @param context - Optional additional context
138
+ * @returns Complete LogEntry object with user context
147
139
  *
148
140
  * @example
149
141
  * ```typescript
150
- * await logger
151
- * .withCredentialContext('cred-123', 'oauth2')
152
- * .info('API call completed');
142
+ * const logEntry = client.log.getWithToken(token, 'Token validated', 'audit');
143
+ * await myCustomLogger.save(logEntry);
153
144
  * ```
154
145
  */
155
- withCredentialContext(credentialId?: string, credentialType?: string): LoggerChain;
146
+ getWithToken(token: string, message: string, level?: LogEntry["level"], context?: Record<string, unknown>): LogEntry;
156
147
  /**
157
- * Add request/response metrics for performance logging
148
+ * Get LogEntry object with request context extracted (alias for getLogWithRequest)
149
+ * Alias for getLogWithRequest() for consistency with existing forRequest() pattern
158
150
  *
159
- * @param requestSize - Optional request size in bytes
160
- * @param responseSize - Optional response size in bytes
161
- * @param durationMs - Optional request duration in milliseconds
162
- * @returns LoggerChain instance for method chaining
151
+ * @param req - Express Request object
152
+ * @param message - Log message
153
+ * @param level - Optional log level (defaults to 'info')
154
+ * @param context - Optional additional context
155
+ * @returns Complete LogEntry object
163
156
  *
164
157
  * @example
165
158
  * ```typescript
166
- * await logger
167
- * .withRequestMetrics(1024, 2048, 150)
168
- * .info('Upstream API call completed');
159
+ * const logEntry = client.log.getForRequest(req, 'User action', 'info', { action: 'login' });
160
+ * await myCustomLogger.save(logEntry);
169
161
  * ```
170
162
  */
171
- withRequestMetrics(requestSize?: number, responseSize?: number, durationMs?: number): LoggerChain;
163
+ getForRequest(req: Request, message: string, level?: LogEntry["level"], context?: Record<string, unknown>): LogEntry;
172
164
  /**
173
- * Auto-extract logging context from Express Request
174
- * Extracts: IP, method, path, user-agent, correlation ID, user from JWT
165
+ * Create logger chain with request context pre-populated
166
+ * Auto-extracts: IP, method, path, user-agent, correlation ID, user from JWT
175
167
  *
176
168
  * @param req - Express Request object
177
- * @returns LoggerChain instance for method chaining
169
+ * @returns LoggerChain with request context pre-populated
178
170
  *
179
171
  * @example
180
172
  * ```typescript
181
- * await miso.log
182
- * .withRequest(req)
183
- * .info("Processing request");
173
+ * await miso.log.forRequest(req).info("Processing request");
184
174
  * ```
185
175
  */
186
- withRequest(req: Request): LoggerChain;
187
- error(message: string, stackTrace?: string): Promise<void>;
188
- info(message: string): Promise<void>;
189
- audit(action: string, resource: string): Promise<void>;
176
+ forRequest(req: Request): LoggerChain;
190
177
  }
191
178
  //# sourceMappingURL=logger.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.service.d.ts","sourceRoot":"","sources":["../../../src/services/logger/logger.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAoB,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEtE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAS7C,MAAM,WAAW,oBAAoB;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAG3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IAGxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,SAAS,CAAC,CAAY;IAC9B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,iBAAiB,CAAQ;IACjC,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,aAAa,CAA8B;IAEnD,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,wBAAwB,CAAuB;IACvD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAK;IACzC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAS;gBAExC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY;IAqBvD;;;OAGG;IACH,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAQxC;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC;;;;;;;;;;OAUG;IACI,qBAAqB,IAAI,MAAM;IAStC;;OAEG;IACG,KAAK,CACT,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,IAAI,CAAC;IAIhB;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,IAAI,CAAC;IAehB;;OAEG;IACG,IAAI,CACR,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,IAAI,CAAC;IAIhB;;OAEG;IACG,KAAK,CACT,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,IAAI,CAAC;IAMhB;;OAEG;YACW,GAAG;IAiOjB;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;IAI1D,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW;IAIrC,cAAc,IAAI,WAAW;IAI7B;;;;;;;;;;;;;;;;OAgBG;IACH,iBAAiB,CACf,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,QAAQ,CAAC,OAAO,CAAU,EACjC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,QAAQ;IAYX;;;;;;;;;;;;;;OAcG;IACH,cAAc,CACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,QAAQ,CAAC,OAAO,CAAU,GAChC,QAAQ;IAWX;;;;;;;;;;;;;;;;OAgBG;IACH,YAAY,CACV,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,QAAQ,CAAC,OAAO,CAAU,EACjC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,QAAQ;IAYX;;;;;;;;;;;;;;;OAeG;IACH,aAAa,CACX,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,QAAQ,CAAC,OAAO,CAAU,EACjC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,QAAQ;IAIX;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW;CAGtC"}
@@ -0,0 +1,403 @@
1
+ "use strict";
2
+ /**
3
+ * Logger service for application logging and audit events
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LoggerService = void 0;
7
+ const events_1 = require("events");
8
+ const data_masker_1 = require("../../utils/data-masker");
9
+ const audit_log_queue_1 = require("../../utils/audit-log-queue");
10
+ const logger_chain_1 = require("./logger-chain");
11
+ const logger_context_1 = require("./logger-context");
12
+ class LoggerService extends events_1.EventEmitter {
13
+ constructor(httpClient, redis) {
14
+ super(); // Initialize EventEmitter
15
+ this.maskSensitiveData = true; // Default: mask sensitive data
16
+ this.correlationCounter = 0;
17
+ this.auditLogQueue = null;
18
+ // Circuit breaker for HTTP logging - skip attempts after repeated failures
19
+ this.httpLoggingFailures = 0;
20
+ this.httpLoggingDisabledUntil = null;
21
+ this.config = httpClient.config;
22
+ this.redis = redis;
23
+ this.httpClient = httpClient;
24
+ // Initialize audit log queue if batch logging is enabled
25
+ const auditConfig = this.config.audit || {};
26
+ if (auditConfig.batchSize !== undefined ||
27
+ auditConfig.batchInterval !== undefined) {
28
+ this.auditLogQueue = new audit_log_queue_1.AuditLogQueue(httpClient, redis, this.config, this);
29
+ }
30
+ }
31
+ /**
32
+ * Set ApiClient instance (used to resolve circular dependency)
33
+ * @param apiClient - ApiClient instance
34
+ */
35
+ setApiClient(apiClient) {
36
+ this.apiClient = apiClient;
37
+ // Also set ApiClient in AuditLogQueue if available
38
+ if (this.auditLogQueue) {
39
+ this.auditLogQueue.setApiClient(apiClient);
40
+ }
41
+ }
42
+ /**
43
+ * Enable or disable sensitive data masking
44
+ */
45
+ setMasking(enabled) {
46
+ this.maskSensitiveData = enabled;
47
+ }
48
+ /**
49
+ * Generate unique correlation ID for request tracking
50
+ * Public method to allow other modules to generate consistent correlation IDs
51
+ *
52
+ * @returns Unique correlation ID string
53
+ *
54
+ * @example
55
+ * ```typescript
56
+ * const correlationId = loggerService.generateCorrelationId();
57
+ * ```
58
+ */
59
+ generateCorrelationId() {
60
+ this.correlationCounter = (this.correlationCounter + 1) % 10000;
61
+ const timestamp = Date.now();
62
+ const random = Math.random().toString(36).substring(2, 8);
63
+ // Use clientId instead of applicationKey
64
+ const clientPrefix = this.config.clientId.substring(0, 10);
65
+ return `${clientPrefix}-${timestamp}-${this.correlationCounter}-${random}`;
66
+ }
67
+ /**
68
+ * Log error message with optional stack trace and enhanced options
69
+ */
70
+ async error(message, context, stackTrace, options) {
71
+ await this.log("error", message, context, stackTrace, options);
72
+ }
73
+ /**
74
+ * Log audit event with enhanced options
75
+ */
76
+ async audit(action, resource, context, options) {
77
+ const auditContext = {
78
+ action,
79
+ resource,
80
+ ...context,
81
+ };
82
+ await this.log("audit", `Audit: ${action} on ${resource}`, auditContext, undefined, options);
83
+ }
84
+ /**
85
+ * Log info message with enhanced options
86
+ */
87
+ async info(message, context, options) {
88
+ await this.log("info", message, context, undefined, options);
89
+ }
90
+ /**
91
+ * Log debug message with enhanced options
92
+ */
93
+ async debug(message, context, options) {
94
+ if (this.config.logLevel === "debug") {
95
+ await this.log("debug", message, context, undefined, options);
96
+ }
97
+ }
98
+ /**
99
+ * Internal log method with enhanced features
100
+ */
101
+ async log(level, message, context, stackTrace, options) {
102
+ // Extract JWT context if token provided
103
+ const jwtContext = options?.token
104
+ ? (0, logger_context_1.extractJwtContext)(options.token)
105
+ : {};
106
+ // Extract environment metadata
107
+ const metadata = (0, logger_context_1.extractEnvironmentMetadata)();
108
+ // Generate correlation ID if not provided
109
+ const correlationId = options?.correlationId || this.generateCorrelationId();
110
+ // Mask sensitive data in context if enabled
111
+ const maskSensitive = options?.maskSensitiveData !== false && this.maskSensitiveData;
112
+ const maskedContext = maskSensitive && context
113
+ ? data_masker_1.DataMasker.maskSensitiveData(context)
114
+ : context;
115
+ const logEntry = {
116
+ timestamp: new Date().toISOString(),
117
+ level,
118
+ environment: "unknown", // Backend extracts from client credentials
119
+ application: this.config.clientId, // Use clientId as application identifier
120
+ applicationId: options?.applicationId || "", // Optional from options
121
+ message,
122
+ context: maskedContext,
123
+ stackTrace,
124
+ correlationId,
125
+ userId: options?.userId || jwtContext.userId,
126
+ sessionId: options?.sessionId || jwtContext.sessionId,
127
+ requestId: options?.requestId,
128
+ ipAddress: options?.ipAddress || metadata.ipAddress,
129
+ userAgent: options?.userAgent || metadata.userAgent,
130
+ ...metadata,
131
+ // Indexed context fields
132
+ sourceKey: options?.sourceKey,
133
+ sourceDisplayName: options?.sourceDisplayName,
134
+ externalSystemKey: options?.externalSystemKey,
135
+ externalSystemDisplayName: options?.externalSystemDisplayName,
136
+ recordKey: options?.recordKey,
137
+ recordDisplayName: options?.recordDisplayName,
138
+ // Credential context
139
+ credentialId: options?.credentialId,
140
+ credentialType: options?.credentialType,
141
+ // Request metrics
142
+ requestSize: options?.requestSize,
143
+ responseSize: options?.responseSize,
144
+ durationMs: options?.durationMs,
145
+ // Error classification
146
+ errorCategory: options?.errorCategory,
147
+ httpStatusCategory: options?.httpStatusCategory,
148
+ };
149
+ // If emitEvents is enabled, emit event and skip HTTP/Redis
150
+ if (this.config.emitEvents) {
151
+ // Emit log event - same payload structure as REST API
152
+ // Listener can check logEntry.level to filter by log level if needed
153
+ this.emit("log", logEntry);
154
+ return;
155
+ }
156
+ // Use batch queue for audit logs if available
157
+ if (level === "audit" && this.auditLogQueue) {
158
+ await this.auditLogQueue.add(logEntry);
159
+ return;
160
+ }
161
+ // Try Redis first (if available)
162
+ if (this.redis.isConnected()) {
163
+ const queueName = `logs:${this.config.clientId}`;
164
+ const success = await this.redis.rpush(queueName, JSON.stringify(logEntry));
165
+ if (success) {
166
+ return; // Successfully queued in Redis
167
+ }
168
+ }
169
+ // Check circuit breaker - skip HTTP logging if we've had too many failures
170
+ const now = Date.now();
171
+ if (this.httpLoggingDisabledUntil && now < this.httpLoggingDisabledUntil) {
172
+ // Circuit breaker is open - skip HTTP logging attempt
173
+ return;
174
+ }
175
+ // Send to unified logging endpoint with client credentials
176
+ try {
177
+ if (!this.apiClient) {
178
+ throw new Error('ApiClient not initialized. Call setApiClient() before logging.');
179
+ }
180
+ // Map LogEntry to CreateLogRequest format
181
+ const logType = level === 'audit' ? 'audit' : level === 'error' ? 'error' : 'general';
182
+ // Map level: 'audit' -> 'info', others map directly (CreateLogRequest.data.level doesn't accept 'audit')
183
+ const logLevel = level === 'audit' ? 'info' : level === 'error' ? 'error' : level === 'info' ? 'info' : 'debug';
184
+ // Build context with all LogEntry fields (backend extracts environment/application from credentials)
185
+ const enrichedContext = {
186
+ ...logEntry.context,
187
+ // Include additional LogEntry fields in context
188
+ userId: logEntry.userId,
189
+ sessionId: logEntry.sessionId,
190
+ requestId: logEntry.requestId,
191
+ ipAddress: logEntry.ipAddress,
192
+ userAgent: logEntry.userAgent,
193
+ hostname: logEntry.hostname,
194
+ applicationId: logEntry.applicationId,
195
+ sourceKey: logEntry.sourceKey,
196
+ sourceDisplayName: logEntry.sourceDisplayName,
197
+ externalSystemKey: logEntry.externalSystemKey,
198
+ externalSystemDisplayName: logEntry.externalSystemDisplayName,
199
+ recordKey: logEntry.recordKey,
200
+ recordDisplayName: logEntry.recordDisplayName,
201
+ credentialId: logEntry.credentialId,
202
+ credentialType: logEntry.credentialType,
203
+ requestSize: logEntry.requestSize,
204
+ responseSize: logEntry.responseSize,
205
+ durationMs: logEntry.durationMs,
206
+ errorCategory: logEntry.errorCategory,
207
+ httpStatusCategory: logEntry.httpStatusCategory,
208
+ };
209
+ // Remove undefined values to keep payload clean
210
+ Object.keys(enrichedContext).forEach(key => {
211
+ if (enrichedContext[key] === undefined) {
212
+ delete enrichedContext[key];
213
+ }
214
+ });
215
+ // Include stackTrace in context if present
216
+ if (logEntry.stackTrace) {
217
+ enrichedContext.stackTrace = logEntry.stackTrace;
218
+ }
219
+ // For audit logs, extract required fields from context
220
+ if (level === 'audit') {
221
+ // Extract action and resource from context (set by audit() method)
222
+ const auditAction = enrichedContext.action;
223
+ const auditResource = enrichedContext.resource;
224
+ // Extract entityType and entityId if already provided in context
225
+ const providedEntityType = enrichedContext.entityType;
226
+ const providedEntityId = enrichedContext.entityId;
227
+ const providedOldValues = enrichedContext.oldValues;
228
+ const providedNewValues = enrichedContext.newValues;
229
+ // Remove fields that will be moved to data object (not in context)
230
+ delete enrichedContext.action;
231
+ delete enrichedContext.resource;
232
+ delete enrichedContext.entityType;
233
+ delete enrichedContext.entityId;
234
+ delete enrichedContext.oldValues;
235
+ delete enrichedContext.newValues;
236
+ // Map to required audit log fields
237
+ // entityType: Type of entity (use provided, or default to "HTTP Request" for HTTP requests, or "API Endpoint" for API paths)
238
+ // entityId: The resource/URL being acted upon (use provided, or default to resource/URL)
239
+ // action: The action being performed (use provided action from audit() call)
240
+ const entityType = providedEntityType ||
241
+ (auditResource && auditResource.startsWith('/api/') ? 'API Endpoint' : 'HTTP Request');
242
+ const entityId = providedEntityId || auditResource || 'unknown';
243
+ const action = auditAction || 'unknown';
244
+ await this.apiClient.logs.createLog({
245
+ type: logType,
246
+ data: {
247
+ level: logLevel,
248
+ message: logEntry.message,
249
+ context: enrichedContext,
250
+ correlationId: logEntry.correlationId,
251
+ entityType,
252
+ entityId,
253
+ action,
254
+ // Include oldValues and newValues if present
255
+ oldValues: providedOldValues,
256
+ newValues: providedNewValues,
257
+ },
258
+ });
259
+ }
260
+ else {
261
+ await this.apiClient.logs.createLog({
262
+ type: logType,
263
+ data: {
264
+ level: logLevel,
265
+ message: logEntry.message,
266
+ context: enrichedContext,
267
+ correlationId: logEntry.correlationId,
268
+ },
269
+ });
270
+ }
271
+ // Success - reset failure counter
272
+ this.httpLoggingFailures = 0;
273
+ this.httpLoggingDisabledUntil = null;
274
+ }
275
+ catch (error) {
276
+ // Failed to send log to controller
277
+ // Check if it's a 401 (token expired) - don't count towards failure threshold
278
+ const isAuthError = error instanceof Error &&
279
+ (error.message.includes('401') ||
280
+ error.message.includes('Unauthorized') ||
281
+ error.statusCode === 401);
282
+ if (!isAuthError) {
283
+ // Only increment failure counter for non-auth errors
284
+ this.httpLoggingFailures++;
285
+ if (this.httpLoggingFailures >= LoggerService.MAX_FAILURES) {
286
+ // Open circuit breaker - disable HTTP logging for a period
287
+ this.httpLoggingDisabledUntil = now + LoggerService.DISABLE_DURATION_MS;
288
+ this.httpLoggingFailures = 0; // Reset counter for next attempt after cooldown
289
+ }
290
+ }
291
+ // Silently fail to avoid infinite logging loops
292
+ // Application should implement retry or buffer strategy if needed
293
+ }
294
+ }
295
+ /**
296
+ * Method chaining support for complex logging scenarios
297
+ */
298
+ withContext(context) {
299
+ return new logger_chain_1.LoggerChain(this, context);
300
+ }
301
+ withToken(token) {
302
+ return new logger_chain_1.LoggerChain(this, {}, { token });
303
+ }
304
+ withoutMasking() {
305
+ return new logger_chain_1.LoggerChain(this, {}, { maskSensitiveData: false });
306
+ }
307
+ /**
308
+ * Get LogEntry object with request context extracted
309
+ * Extracts IP, method, path, userAgent, correlationId, userId from Express Request
310
+ * Returns structured LogEntry object ready for external logger tables
311
+ *
312
+ * @param req - Express Request object
313
+ * @param message - Log message
314
+ * @param level - Optional log level (defaults to 'info')
315
+ * @param context - Optional additional context
316
+ * @returns Complete LogEntry object with all request context extracted
317
+ *
318
+ * @example
319
+ * ```typescript
320
+ * const logEntry = client.log.getLogWithRequest(req, 'User action', 'info', { action: 'login' });
321
+ * await myCustomLogger.save(logEntry); // Save to own logger table
322
+ * ```
323
+ */
324
+ getLogWithRequest(req, message, level = "info", context) {
325
+ return (0, logger_context_1.getLogWithRequest)(req, message, level, context, this.config, () => this.generateCorrelationId(), this.maskSensitiveData);
326
+ }
327
+ /**
328
+ * Get LogEntry object with provided context
329
+ * Generates correlation ID automatically and extracts metadata from environment
330
+ *
331
+ * @param context - Context object to include in logs
332
+ * @param message - Log message
333
+ * @param level - Optional log level (defaults to 'info')
334
+ * @returns Complete LogEntry object
335
+ *
336
+ * @example
337
+ * ```typescript
338
+ * const logEntry = client.log.getWithContext({ operation: 'sync' }, 'Sync started');
339
+ * await myCustomLogger.save(logEntry);
340
+ * ```
341
+ */
342
+ getWithContext(context, message, level = "info") {
343
+ return (0, logger_context_1.getWithContext)(context, message, level, this.config, () => this.generateCorrelationId(), this.maskSensitiveData);
344
+ }
345
+ /**
346
+ * Get LogEntry object with token context extracted
347
+ * Extracts userId, sessionId, applicationId from JWT token
348
+ * Generates correlation ID automatically
349
+ *
350
+ * @param token - JWT token to extract user context from
351
+ * @param message - Log message
352
+ * @param level - Optional log level (defaults to 'info')
353
+ * @param context - Optional additional context
354
+ * @returns Complete LogEntry object with user context
355
+ *
356
+ * @example
357
+ * ```typescript
358
+ * const logEntry = client.log.getWithToken(token, 'Token validated', 'audit');
359
+ * await myCustomLogger.save(logEntry);
360
+ * ```
361
+ */
362
+ getWithToken(token, message, level = "info", context) {
363
+ return (0, logger_context_1.getWithToken)(token, message, level, context, this.config, () => this.generateCorrelationId(), this.maskSensitiveData);
364
+ }
365
+ /**
366
+ * Get LogEntry object with request context extracted (alias for getLogWithRequest)
367
+ * Alias for getLogWithRequest() for consistency with existing forRequest() pattern
368
+ *
369
+ * @param req - Express Request object
370
+ * @param message - Log message
371
+ * @param level - Optional log level (defaults to 'info')
372
+ * @param context - Optional additional context
373
+ * @returns Complete LogEntry object
374
+ *
375
+ * @example
376
+ * ```typescript
377
+ * const logEntry = client.log.getForRequest(req, 'User action', 'info', { action: 'login' });
378
+ * await myCustomLogger.save(logEntry);
379
+ * ```
380
+ */
381
+ getForRequest(req, message, level = "info", context) {
382
+ return this.getLogWithRequest(req, message, level, context);
383
+ }
384
+ /**
385
+ * Create logger chain with request context pre-populated
386
+ * Auto-extracts: IP, method, path, user-agent, correlation ID, user from JWT
387
+ *
388
+ * @param req - Express Request object
389
+ * @returns LoggerChain with request context pre-populated
390
+ *
391
+ * @example
392
+ * ```typescript
393
+ * await miso.log.forRequest(req).info("Processing request");
394
+ * ```
395
+ */
396
+ forRequest(req) {
397
+ return new logger_chain_1.LoggerChain(this, {}, {}).withRequest(req);
398
+ }
399
+ }
400
+ exports.LoggerService = LoggerService;
401
+ LoggerService.MAX_FAILURES = 3;
402
+ LoggerService.DISABLE_DURATION_MS = 60000; // 1 minute
403
+ //# sourceMappingURL=logger.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.service.js","sourceRoot":"","sources":["../../../src/services/logger/logger.service.ts"],"names":[],"mappings":"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"}