@freshguard/freshguard-core 0.11.2

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 (180) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +644 -0
  3. package/dist/cli/index.d.ts +3 -0
  4. package/dist/cli/index.d.ts.map +1 -0
  5. package/dist/cli/index.js +350 -0
  6. package/dist/cli/index.js.map +1 -0
  7. package/dist/connectors/base-connector.d.ts +62 -0
  8. package/dist/connectors/base-connector.d.ts.map +1 -0
  9. package/dist/connectors/base-connector.js +549 -0
  10. package/dist/connectors/base-connector.js.map +1 -0
  11. package/dist/connectors/bigquery.d.ts +38 -0
  12. package/dist/connectors/bigquery.d.ts.map +1 -0
  13. package/dist/connectors/bigquery.js +406 -0
  14. package/dist/connectors/bigquery.js.map +1 -0
  15. package/dist/connectors/duckdb.d.ts +36 -0
  16. package/dist/connectors/duckdb.d.ts.map +1 -0
  17. package/dist/connectors/duckdb.js +364 -0
  18. package/dist/connectors/duckdb.js.map +1 -0
  19. package/dist/connectors/index.d.ts +7 -0
  20. package/dist/connectors/index.d.ts.map +1 -0
  21. package/dist/connectors/index.js +7 -0
  22. package/dist/connectors/index.js.map +1 -0
  23. package/dist/connectors/mysql.d.ts +32 -0
  24. package/dist/connectors/mysql.d.ts.map +1 -0
  25. package/dist/connectors/mysql.js +348 -0
  26. package/dist/connectors/mysql.js.map +1 -0
  27. package/dist/connectors/postgres.d.ts +31 -0
  28. package/dist/connectors/postgres.d.ts.map +1 -0
  29. package/dist/connectors/postgres.js +326 -0
  30. package/dist/connectors/postgres.js.map +1 -0
  31. package/dist/connectors/redshift.d.ts +32 -0
  32. package/dist/connectors/redshift.d.ts.map +1 -0
  33. package/dist/connectors/redshift.js +366 -0
  34. package/dist/connectors/redshift.js.map +1 -0
  35. package/dist/connectors/snowflake.d.ts +43 -0
  36. package/dist/connectors/snowflake.d.ts.map +1 -0
  37. package/dist/connectors/snowflake.js +442 -0
  38. package/dist/connectors/snowflake.js.map +1 -0
  39. package/dist/db/index.d.ts +9 -0
  40. package/dist/db/index.d.ts.map +1 -0
  41. package/dist/db/index.js +10 -0
  42. package/dist/db/index.js.map +1 -0
  43. package/dist/db/migrate.d.ts +12 -0
  44. package/dist/db/migrate.d.ts.map +1 -0
  45. package/dist/db/migrate.js +114 -0
  46. package/dist/db/migrate.js.map +1 -0
  47. package/dist/db/schema.d.ts +2053 -0
  48. package/dist/db/schema.d.ts.map +1 -0
  49. package/dist/db/schema.js +164 -0
  50. package/dist/db/schema.js.map +1 -0
  51. package/dist/errors/debug-factory.d.ts +23 -0
  52. package/dist/errors/debug-factory.d.ts.map +1 -0
  53. package/dist/errors/debug-factory.js +149 -0
  54. package/dist/errors/debug-factory.js.map +1 -0
  55. package/dist/errors/index.d.ts +119 -0
  56. package/dist/errors/index.d.ts.map +1 -0
  57. package/dist/errors/index.js +341 -0
  58. package/dist/errors/index.js.map +1 -0
  59. package/dist/index.d.ts +9 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +6 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/metadata/duckdb-storage.d.ts +31 -0
  64. package/dist/metadata/duckdb-storage.d.ts.map +1 -0
  65. package/dist/metadata/duckdb-storage.js +230 -0
  66. package/dist/metadata/duckdb-storage.js.map +1 -0
  67. package/dist/metadata/factory.d.ts +4 -0
  68. package/dist/metadata/factory.d.ts.map +1 -0
  69. package/dist/metadata/factory.js +23 -0
  70. package/dist/metadata/factory.js.map +1 -0
  71. package/dist/metadata/index.d.ts +6 -0
  72. package/dist/metadata/index.d.ts.map +1 -0
  73. package/dist/metadata/index.js +4 -0
  74. package/dist/metadata/index.js.map +1 -0
  75. package/dist/metadata/interface.d.ts +26 -0
  76. package/dist/metadata/interface.d.ts.map +1 -0
  77. package/dist/metadata/interface.js +2 -0
  78. package/dist/metadata/interface.js.map +1 -0
  79. package/dist/metadata/postgresql-storage.d.ts +32 -0
  80. package/dist/metadata/postgresql-storage.d.ts.map +1 -0
  81. package/dist/metadata/postgresql-storage.js +242 -0
  82. package/dist/metadata/postgresql-storage.js.map +1 -0
  83. package/dist/metadata/schema-config.d.ts +30 -0
  84. package/dist/metadata/schema-config.d.ts.map +1 -0
  85. package/dist/metadata/schema-config.js +94 -0
  86. package/dist/metadata/schema-config.js.map +1 -0
  87. package/dist/metadata/types.d.ts +35 -0
  88. package/dist/metadata/types.d.ts.map +1 -0
  89. package/dist/metadata/types.js +2 -0
  90. package/dist/metadata/types.js.map +1 -0
  91. package/dist/monitor/baseline-calculator.d.ts +30 -0
  92. package/dist/monitor/baseline-calculator.d.ts.map +1 -0
  93. package/dist/monitor/baseline-calculator.js +192 -0
  94. package/dist/monitor/baseline-calculator.js.map +1 -0
  95. package/dist/monitor/baseline-config.d.ts +37 -0
  96. package/dist/monitor/baseline-config.d.ts.map +1 -0
  97. package/dist/monitor/baseline-config.js +156 -0
  98. package/dist/monitor/baseline-config.js.map +1 -0
  99. package/dist/monitor/freshness.d.ts +5 -0
  100. package/dist/monitor/freshness.d.ts.map +1 -0
  101. package/dist/monitor/freshness.js +239 -0
  102. package/dist/monitor/freshness.js.map +1 -0
  103. package/dist/monitor/index.d.ts +5 -0
  104. package/dist/monitor/index.d.ts.map +1 -0
  105. package/dist/monitor/index.js +5 -0
  106. package/dist/monitor/index.js.map +1 -0
  107. package/dist/monitor/schema-baseline.d.ts +22 -0
  108. package/dist/monitor/schema-baseline.d.ts.map +1 -0
  109. package/dist/monitor/schema-baseline.js +211 -0
  110. package/dist/monitor/schema-baseline.js.map +1 -0
  111. package/dist/monitor/schema-changes.d.ts +5 -0
  112. package/dist/monitor/schema-changes.d.ts.map +1 -0
  113. package/dist/monitor/schema-changes.js +289 -0
  114. package/dist/monitor/schema-changes.js.map +1 -0
  115. package/dist/monitor/volume.d.ts +5 -0
  116. package/dist/monitor/volume.d.ts.map +1 -0
  117. package/dist/monitor/volume.js +262 -0
  118. package/dist/monitor/volume.js.map +1 -0
  119. package/dist/observability/logger.d.ts +63 -0
  120. package/dist/observability/logger.d.ts.map +1 -0
  121. package/dist/observability/logger.js +282 -0
  122. package/dist/observability/logger.js.map +1 -0
  123. package/dist/observability/metrics.d.ts +106 -0
  124. package/dist/observability/metrics.d.ts.map +1 -0
  125. package/dist/observability/metrics.js +441 -0
  126. package/dist/observability/metrics.js.map +1 -0
  127. package/dist/query-analyzer.js +526 -0
  128. package/dist/resilience/circuit-breaker.d.ts +94 -0
  129. package/dist/resilience/circuit-breaker.d.ts.map +1 -0
  130. package/dist/resilience/circuit-breaker.js +379 -0
  131. package/dist/resilience/circuit-breaker.js.map +1 -0
  132. package/dist/resilience/index.d.ts +7 -0
  133. package/dist/resilience/index.d.ts.map +1 -0
  134. package/dist/resilience/index.js +7 -0
  135. package/dist/resilience/index.js.map +1 -0
  136. package/dist/resilience/retry-policy.d.ts +87 -0
  137. package/dist/resilience/retry-policy.d.ts.map +1 -0
  138. package/dist/resilience/retry-policy.js +423 -0
  139. package/dist/resilience/retry-policy.js.map +1 -0
  140. package/dist/resilience/timeout-manager.d.ts +97 -0
  141. package/dist/resilience/timeout-manager.d.ts.map +1 -0
  142. package/dist/resilience/timeout-manager.js +339 -0
  143. package/dist/resilience/timeout-manager.js.map +1 -0
  144. package/dist/security/query-analyzer.d.ts +82 -0
  145. package/dist/security/query-analyzer.d.ts.map +1 -0
  146. package/dist/security/query-analyzer.js +381 -0
  147. package/dist/security/query-analyzer.js.map +1 -0
  148. package/dist/security/schema-cache.d.ts +95 -0
  149. package/dist/security/schema-cache.d.ts.map +1 -0
  150. package/dist/security/schema-cache.js +344 -0
  151. package/dist/security/schema-cache.js.map +1 -0
  152. package/dist/types/connector.d.ts +68 -0
  153. package/dist/types/connector.d.ts.map +1 -0
  154. package/dist/types/connector.js +26 -0
  155. package/dist/types/connector.js.map +1 -0
  156. package/dist/types.d.ts +244 -0
  157. package/dist/types.d.ts.map +1 -0
  158. package/dist/types.js +2 -0
  159. package/dist/types.js.map +1 -0
  160. package/dist/validation/index.d.ts +7 -0
  161. package/dist/validation/index.d.ts.map +1 -0
  162. package/dist/validation/index.js +5 -0
  163. package/dist/validation/index.js.map +1 -0
  164. package/dist/validation/runtime-validator.d.ts +70 -0
  165. package/dist/validation/runtime-validator.d.ts.map +1 -0
  166. package/dist/validation/runtime-validator.js +206 -0
  167. package/dist/validation/runtime-validator.js.map +1 -0
  168. package/dist/validation/sanitizers.d.ts +56 -0
  169. package/dist/validation/sanitizers.d.ts.map +1 -0
  170. package/dist/validation/sanitizers.js +264 -0
  171. package/dist/validation/sanitizers.js.map +1 -0
  172. package/dist/validation/schemas.d.ts +224 -0
  173. package/dist/validation/schemas.d.ts.map +1 -0
  174. package/dist/validation/schemas.js +263 -0
  175. package/dist/validation/schemas.js.map +1 -0
  176. package/dist/validators/index.d.ts +18 -0
  177. package/dist/validators/index.d.ts.map +1 -0
  178. package/dist/validators/index.js +209 -0
  179. package/dist/validators/index.js.map +1 -0
  180. package/package.json +91 -0
@@ -0,0 +1,262 @@
1
+ import { validateTableName } from '../validators/index.js';
2
+ import { TimeoutError, ConfigurationError, ErrorHandler } from '../errors/index.js';
3
+ import { DebugErrorFactory, mergeDebugConfig } from '../errors/debug-factory.js';
4
+ import { BaselineConfigResolver } from './baseline-config.js';
5
+ import { BaselineCalculator } from './baseline-calculator.js';
6
+ export async function checkVolumeAnomaly(connector, rule, metadataStorage, config) {
7
+ const startTime = process.hrtime.bigint();
8
+ const debugConfig = mergeDebugConfig(config?.debug);
9
+ const debugFactory = new DebugErrorFactory(debugConfig);
10
+ const debugId = `fg-${Date.now().toString(36)}-${Math.random().toString(36).substr(2, 5)}`;
11
+ try {
12
+ if (debugConfig.enabled) {
13
+ console.log(`[DEBUG-${debugId}] Starting volume anomaly check:`, {
14
+ table: rule.tableName,
15
+ ruleId: rule.id,
16
+ timestamp: new Date().toISOString()
17
+ });
18
+ }
19
+ validateVolumeRule(rule);
20
+ const baselineConfigResolver = new BaselineConfigResolver(rule);
21
+ const baselineConfig = baselineConfigResolver.getConfig();
22
+ const baselineWindowDays = baselineConfig.windowDays;
23
+ const deviationThresholdPercent = baselineConfig.deviationThresholdPercent;
24
+ const minimumRowCount = baselineConfig.minimumRowCount;
25
+ const timeoutMs = baselineConfig.timeoutSeconds * 1000;
26
+ validateTableName(rule.tableName);
27
+ validateVolumeParameters(baselineWindowDays, deviationThresholdPercent, minimumRowCount);
28
+ const currentRowCount = await executeWithTimeout(() => getCurrentRowCount(connector, rule.tableName, debugConfig, debugFactory), config?.timeoutMs || timeoutMs, 'Volume check row count query timeout');
29
+ if (currentRowCount < minimumRowCount) {
30
+ const executedAt = new Date();
31
+ const executionDurationMs = Number(process.hrtime.bigint() - startTime) / 1000000;
32
+ await saveExecutionResult(metadataStorage, {
33
+ ruleId: rule.id,
34
+ status: 'ok',
35
+ rowCount: currentRowCount,
36
+ deviation: 0,
37
+ baselineAverage: currentRowCount,
38
+ executionDurationMs,
39
+ executedAt,
40
+ }, debugConfig);
41
+ return createSecureCheckResult('ok', {
42
+ rowCount: currentRowCount,
43
+ deviation: 0,
44
+ baselineAverage: currentRowCount,
45
+ executionDurationMs,
46
+ executedAt,
47
+ });
48
+ }
49
+ let historicalExecutions = [];
50
+ if (metadataStorage) {
51
+ try {
52
+ historicalExecutions = await executeWithTimeout(() => metadataStorage.getHistoricalData(rule.id, baselineWindowDays), timeoutMs, 'Volume check historical data query timeout');
53
+ }
54
+ catch (error) {
55
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
56
+ if (debugConfig.enabled) {
57
+ console.error(`[DEBUG-${debugId}] Metadata storage unavailable:`, {
58
+ ruleId: rule.id,
59
+ error: errorMessage,
60
+ rawError: debugConfig.exposeRawErrors ? errorMessage : undefined,
61
+ fallback: 'treating as fresh installation'
62
+ });
63
+ }
64
+ else {
65
+ console.warn(`Metadata storage unavailable, treating as fresh installation: ${errorMessage}`);
66
+ }
67
+ historicalExecutions = [];
68
+ }
69
+ }
70
+ const baselineCalculator = new BaselineCalculator(baselineConfig);
71
+ const baselineResult = baselineCalculator.calculateBaseline(historicalExecutions, currentRowCount);
72
+ if (baselineResult.dataPointsUsed < baselineConfig.minimumDataPoints) {
73
+ const executedAt = new Date();
74
+ const executionDurationMs = Number(process.hrtime.bigint() - startTime) / 1000000;
75
+ await saveExecutionResult(metadataStorage, {
76
+ ruleId: rule.id,
77
+ status: 'ok',
78
+ rowCount: currentRowCount,
79
+ deviation: 0,
80
+ baselineAverage: currentRowCount,
81
+ executionDurationMs,
82
+ executedAt,
83
+ }, debugConfig);
84
+ return createSecureCheckResult('ok', {
85
+ rowCount: currentRowCount,
86
+ deviation: 0,
87
+ baselineAverage: currentRowCount,
88
+ executionDurationMs,
89
+ executedAt,
90
+ });
91
+ }
92
+ const isAnomaly = baselineResult.deviationPercent > deviationThresholdPercent;
93
+ const status = isAnomaly ? 'alert' : 'ok';
94
+ const executedAt = new Date();
95
+ const executionDurationMs = Number(process.hrtime.bigint() - startTime) / 1000000;
96
+ await saveExecutionResult(metadataStorage, {
97
+ ruleId: rule.id,
98
+ status,
99
+ rowCount: currentRowCount,
100
+ deviation: baselineResult.deviationPercent,
101
+ baselineAverage: baselineResult.mean,
102
+ executionDurationMs,
103
+ executedAt,
104
+ }, debugConfig);
105
+ return createSecureCheckResult(status, {
106
+ rowCount: currentRowCount,
107
+ deviation: baselineResult.deviationPercent,
108
+ baselineAverage: baselineResult.mean,
109
+ executionDurationMs,
110
+ executedAt,
111
+ });
112
+ }
113
+ catch (error) {
114
+ const userMessage = ErrorHandler.getUserMessage(error);
115
+ const executedAt = new Date();
116
+ const executionDurationMs = Number(process.hrtime.bigint() - startTime) / 1000000;
117
+ if (debugConfig.enabled) {
118
+ console.error(`[DEBUG-${debugId}] Volume anomaly check failed:`, {
119
+ table: rule.tableName,
120
+ ruleId: rule.id,
121
+ error: userMessage,
122
+ rawError: debugConfig.exposeRawErrors && error instanceof Error ? error.message : undefined,
123
+ duration: executionDurationMs
124
+ });
125
+ }
126
+ if (rule?.id) {
127
+ await saveExecutionResult(metadataStorage, {
128
+ ruleId: rule.id,
129
+ status: 'failed',
130
+ executionDurationMs,
131
+ executedAt,
132
+ error: userMessage,
133
+ }, debugConfig);
134
+ }
135
+ const result = createSecureCheckResult('failed', {
136
+ error: userMessage,
137
+ executionDurationMs,
138
+ executedAt,
139
+ debugId,
140
+ });
141
+ if (debugConfig.enabled && error instanceof Error && 'debug' in error) {
142
+ result.debug = error.debug;
143
+ }
144
+ return result;
145
+ }
146
+ }
147
+ async function saveExecutionResult(metadataStorage, execution, debugConfig) {
148
+ if (!metadataStorage)
149
+ return;
150
+ try {
151
+ await metadataStorage.saveExecution({
152
+ ruleId: execution.ruleId,
153
+ status: execution.status,
154
+ rowCount: execution.rowCount,
155
+ deviation: execution.deviation,
156
+ baselineAverage: execution.baselineAverage,
157
+ executionDurationMs: execution.executionDurationMs,
158
+ executedAt: execution.executedAt,
159
+ error: execution.error,
160
+ });
161
+ }
162
+ catch (error) {
163
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
164
+ if (debugConfig?.enabled) {
165
+ console.error('[DEBUG] Failed to save volume execution history:', {
166
+ ruleId: execution.ruleId,
167
+ error: errorMessage,
168
+ rawError: debugConfig.exposeRawErrors ? errorMessage : undefined
169
+ });
170
+ }
171
+ else {
172
+ console.warn(`Failed to save execution history for rule ${execution.ruleId}: ${errorMessage}`);
173
+ }
174
+ }
175
+ }
176
+ function validateVolumeRule(rule) {
177
+ if (!rule) {
178
+ throw new ConfigurationError('Monitoring rule is required');
179
+ }
180
+ if (!rule.tableName || typeof rule.tableName !== 'string') {
181
+ throw new ConfigurationError('Table name is required and must be a string');
182
+ }
183
+ if (rule.tableName.length > 256) {
184
+ throw new ConfigurationError('Table name too long (max 256 characters)');
185
+ }
186
+ if (rule.ruleType !== 'volume_anomaly') {
187
+ throw new ConfigurationError('Rule type must be "volume_anomaly" for volume anomaly checks');
188
+ }
189
+ if (!rule.id || typeof rule.id !== 'string') {
190
+ throw new ConfigurationError('Rule ID is required and must be a string');
191
+ }
192
+ }
193
+ function validateVolumeParameters(baselineWindowDays, deviationThresholdPercent, minimumRowCount) {
194
+ if (typeof baselineWindowDays !== 'number' || !Number.isInteger(baselineWindowDays)) {
195
+ throw new ConfigurationError('Baseline window days must be an integer');
196
+ }
197
+ if (baselineWindowDays < 1 || baselineWindowDays > 365) {
198
+ throw new ConfigurationError('Baseline window days must be between 1 and 365');
199
+ }
200
+ if (typeof deviationThresholdPercent !== 'number' || deviationThresholdPercent < 0) {
201
+ throw new ConfigurationError('Deviation threshold percent must be a positive number');
202
+ }
203
+ if (deviationThresholdPercent > 1000) {
204
+ throw new ConfigurationError('Deviation threshold percent cannot exceed 1000%');
205
+ }
206
+ if (typeof minimumRowCount !== 'number' || !Number.isInteger(minimumRowCount)) {
207
+ throw new ConfigurationError('Minimum row count must be an integer');
208
+ }
209
+ if (minimumRowCount < 0) {
210
+ throw new ConfigurationError('Minimum row count cannot be negative');
211
+ }
212
+ }
213
+ async function getCurrentRowCount(connector, tableName, debugConfig, debugFactory) {
214
+ const startTime = performance.now();
215
+ const queryContext = {
216
+ sql: `connector.getRowCount('${tableName}')`,
217
+ params: [],
218
+ table: tableName,
219
+ operation: 'volume_count'
220
+ };
221
+ try {
222
+ if (debugConfig.enabled) {
223
+ console.log(`[DEBUG] Executing volume count via connector:`, {
224
+ table: tableName,
225
+ operation: debugConfig.exposeQueries ? `getRowCount('${tableName}')` : '[Connector operation hidden]'
226
+ });
227
+ }
228
+ const rowCount = await connector.getRowCount(tableName);
229
+ queryContext.duration = performance.now() - startTime;
230
+ if (isNaN(rowCount) || rowCount < 0) {
231
+ throw debugFactory.createQueryError('Invalid row count returned from connector', undefined, queryContext);
232
+ }
233
+ if (rowCount > Number.MAX_SAFE_INTEGER) {
234
+ throw debugFactory.createQueryError('Row count exceeds safe integer limit', undefined, queryContext);
235
+ }
236
+ return rowCount;
237
+ }
238
+ catch (error) {
239
+ queryContext.duration = performance.now() - startTime;
240
+ throw debugFactory.createQueryError('Failed to get current row count via connector', error instanceof Error ? error : undefined, queryContext);
241
+ }
242
+ }
243
+ async function executeWithTimeout(operation, timeoutMs, timeoutMessage) {
244
+ return new Promise((resolve, reject) => {
245
+ const timer = setTimeout(() => {
246
+ reject(new TimeoutError(timeoutMessage, 'volume_check', timeoutMs));
247
+ }, timeoutMs);
248
+ operation()
249
+ .then(resolve)
250
+ .catch(reject)
251
+ .finally(() => clearTimeout(timer));
252
+ });
253
+ }
254
+ function createSecureCheckResult(status, data) {
255
+ return {
256
+ ...data,
257
+ status,
258
+ executedAt: data.executedAt || new Date(),
259
+ executionDurationMs: data.executionDurationMs
260
+ };
261
+ }
262
+ //# sourceMappingURL=volume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"volume.js","sourceRoot":"","sources":["../../src/monitor/volume.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import { type Logger as PinoLogger, type LoggerOptions } from 'pino';
2
+ export declare enum LogLevel {
3
+ TRACE = "trace",
4
+ DEBUG = "debug",
5
+ INFO = "info",
6
+ WARN = "warn",
7
+ ERROR = "error",
8
+ FATAL = "fatal"
9
+ }
10
+ export interface LogContext {
11
+ operation?: string;
12
+ table?: string;
13
+ database?: string;
14
+ duration?: number;
15
+ component?: string;
16
+ connectionId?: string;
17
+ queryComplexity?: number;
18
+ retryAttempt?: number;
19
+ circuitBreakerState?: string;
20
+ [key: string]: any;
21
+ }
22
+ export interface LoggerConfig {
23
+ level?: LogLevel;
24
+ prettyPrint?: boolean;
25
+ serviceName?: string;
26
+ environment?: string;
27
+ sanitizeSensitiveData?: boolean;
28
+ baseContext?: Record<string, any>;
29
+ pinoOptions?: Partial<LoggerOptions>;
30
+ }
31
+ export interface TimingInfo {
32
+ startTime: Date;
33
+ endTime: Date | null;
34
+ duration: number;
35
+ }
36
+ export declare class StructuredLogger {
37
+ private readonly logger;
38
+ private readonly config;
39
+ private readonly baseContext;
40
+ constructor(config?: LoggerConfig);
41
+ child(context: LogContext): StructuredLogger;
42
+ createTimer(): {
43
+ start(): void;
44
+ end(message?: string, context?: LogContext): TimingInfo;
45
+ getDuration(): number;
46
+ };
47
+ trace(message: string, context?: LogContext): void;
48
+ debug(message: string, context?: LogContext): void;
49
+ info(message: string, context?: LogContext): void;
50
+ warn(message: string, context?: LogContext): void;
51
+ error(message: string, error?: Error | unknown, context?: LogContext): void;
52
+ fatal(message: string, error?: Error | unknown, context?: LogContext): void;
53
+ private log;
54
+ getPinoLogger(): PinoLogger;
55
+ isLevelEnabled(level: LogLevel): boolean;
56
+ getConfig(): Required<LoggerConfig>;
57
+ flush(): void;
58
+ }
59
+ export declare const defaultLogger: StructuredLogger;
60
+ export declare function createComponentLogger(component: string, config?: LoggerConfig): StructuredLogger;
61
+ export declare function createDatabaseLogger(database: string, config?: LoggerConfig): StructuredLogger;
62
+ export declare function logTimedOperation<T>(logger: StructuredLogger, operation: string, fn: () => Promise<T>, context?: LogContext): Promise<T>;
63
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/observability/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,282 @@
1
+ import pino, {} from 'pino';
2
+ export var LogLevel;
3
+ (function (LogLevel) {
4
+ LogLevel["TRACE"] = "trace";
5
+ LogLevel["DEBUG"] = "debug";
6
+ LogLevel["INFO"] = "info";
7
+ LogLevel["WARN"] = "warn";
8
+ LogLevel["ERROR"] = "error";
9
+ LogLevel["FATAL"] = "fatal";
10
+ })(LogLevel || (LogLevel = {}));
11
+ const SENSITIVE_PATTERNS = [
12
+ /password/i,
13
+ /secret/i,
14
+ /token/i,
15
+ /key/i,
16
+ /credential/i,
17
+ /auth/i,
18
+ /connection.*string/i,
19
+ /database.*url/i,
20
+ /email/i,
21
+ /phone/i,
22
+ /address/i,
23
+ /ssn/i,
24
+ /credit.*card/i,
25
+ /api.*key/i,
26
+ /access.*token/i,
27
+ /refresh.*token/i,
28
+ /bearer.*token/i,
29
+ ];
30
+ const SENSITIVE_FIELDS = new Set([
31
+ 'password',
32
+ 'secret',
33
+ 'token',
34
+ 'apiKey',
35
+ 'accessToken',
36
+ 'refreshToken',
37
+ 'connectionString',
38
+ 'credentials',
39
+ 'authorization',
40
+ 'cookie',
41
+ 'session',
42
+ ]);
43
+ function sanitizeObject(obj, depth = 0) {
44
+ if (depth > 10) {
45
+ return '[Maximum depth reached]';
46
+ }
47
+ if (obj === null || obj === undefined) {
48
+ return obj;
49
+ }
50
+ if (typeof obj === 'string') {
51
+ return sanitizeString(obj);
52
+ }
53
+ if (typeof obj === 'number' || typeof obj === 'boolean') {
54
+ return obj;
55
+ }
56
+ if (obj instanceof Date) {
57
+ return obj.toISOString();
58
+ }
59
+ if (obj instanceof Error) {
60
+ return {
61
+ name: obj.name,
62
+ message: sanitizeString(obj.message),
63
+ stack: process.env.NODE_ENV === 'development' ? obj.stack : undefined,
64
+ };
65
+ }
66
+ if (Array.isArray(obj)) {
67
+ return obj.map(item => sanitizeObject(item, depth + 1));
68
+ }
69
+ if (typeof obj === 'object') {
70
+ const sanitized = {};
71
+ for (const [key, value] of Object.entries(obj)) {
72
+ const sanitizedKey = key.toLowerCase();
73
+ if (SENSITIVE_FIELDS.has(sanitizedKey) || SENSITIVE_PATTERNS.some(pattern => pattern.test(key))) {
74
+ sanitized[key] = '[REDACTED]';
75
+ }
76
+ else {
77
+ sanitized[key] = sanitizeObject(value, depth + 1);
78
+ }
79
+ }
80
+ return sanitized;
81
+ }
82
+ return obj;
83
+ }
84
+ function sanitizeString(str) {
85
+ return str
86
+ .replace(/(?:password|pwd|secret|token|key)=[\w\-\.]+/gi, '$&=[REDACTED]')
87
+ .replace(/(?:mongodb|postgres|mysql):\/\/[^:]+:[^@]+@/gi, (match) => match.replace(/:[^:@]+@/, ':***@'));
88
+ }
89
+ function createTimingTracker() {
90
+ let startTime = null;
91
+ let endTime = null;
92
+ return {
93
+ start() {
94
+ startTime = new Date();
95
+ endTime = null;
96
+ },
97
+ end() {
98
+ if (!startTime) {
99
+ throw new Error('Timer not started. Call start() first.');
100
+ }
101
+ endTime = new Date();
102
+ const duration = endTime.getTime() - startTime.getTime();
103
+ return {
104
+ startTime,
105
+ endTime,
106
+ duration,
107
+ };
108
+ },
109
+ getDuration() {
110
+ if (!startTime) {
111
+ return 0;
112
+ }
113
+ const now = endTime || new Date();
114
+ return now.getTime() - startTime.getTime();
115
+ },
116
+ };
117
+ }
118
+ export class StructuredLogger {
119
+ logger;
120
+ config;
121
+ baseContext;
122
+ constructor(config = {}) {
123
+ this.config = {
124
+ level: config.level || LogLevel.INFO,
125
+ prettyPrint: config.prettyPrint || process.env.NODE_ENV === 'development',
126
+ serviceName: config.serviceName || 'freshguard-core',
127
+ environment: config.environment || process.env.NODE_ENV || 'development',
128
+ sanitizeSensitiveData: config.sanitizeSensitiveData !== false,
129
+ baseContext: config.baseContext || {},
130
+ pinoOptions: config.pinoOptions || {},
131
+ };
132
+ this.baseContext = {
133
+ service: this.config.serviceName,
134
+ environment: this.config.environment,
135
+ pid: process.pid,
136
+ hostname: process.env.HOSTNAME || 'unknown',
137
+ version: process.env.npm_package_version || '0.0.0',
138
+ ...this.config.baseContext,
139
+ };
140
+ const pinoConfig = {
141
+ level: this.config.level,
142
+ base: this.baseContext,
143
+ timestamp: pino.stdTimeFunctions.isoTime,
144
+ formatters: {
145
+ level: (label, _number) => ({ level: label }),
146
+ },
147
+ ...this.config.pinoOptions,
148
+ };
149
+ if (this.config.prettyPrint) {
150
+ pinoConfig.transport = {
151
+ target: 'pino-pretty',
152
+ options: {
153
+ colorize: true,
154
+ ignore: 'pid,hostname',
155
+ translateTime: 'HH:MM:ss.l',
156
+ },
157
+ };
158
+ }
159
+ try {
160
+ this.logger = pino(pinoConfig);
161
+ }
162
+ catch (error) {
163
+ if (this.config.prettyPrint && error instanceof Error && error.message.includes('pino-pretty')) {
164
+ console.warn('pino-pretty not available, using default formatting');
165
+ const fallbackConfig = { ...pinoConfig };
166
+ delete fallbackConfig.transport;
167
+ this.logger = pino(fallbackConfig);
168
+ }
169
+ else {
170
+ throw error;
171
+ }
172
+ }
173
+ }
174
+ child(context) {
175
+ const sanitizedContext = this.config.sanitizeSensitiveData
176
+ ? sanitizeObject(context)
177
+ : context;
178
+ const childLogger = new StructuredLogger({
179
+ ...this.config,
180
+ pinoOptions: {
181
+ ...this.config.pinoOptions,
182
+ base: {
183
+ ...this.baseContext,
184
+ ...sanitizedContext,
185
+ },
186
+ },
187
+ });
188
+ return childLogger;
189
+ }
190
+ createTimer() {
191
+ const tracker = createTimingTracker();
192
+ return {
193
+ start: tracker.start.bind(tracker),
194
+ getDuration: tracker.getDuration.bind(tracker),
195
+ end: (message, context) => {
196
+ const timing = tracker.end();
197
+ if (message) {
198
+ this.info(message, {
199
+ ...context,
200
+ duration: timing.duration,
201
+ startTime: timing.startTime.toISOString(),
202
+ endTime: timing.endTime?.toISOString(),
203
+ });
204
+ }
205
+ return timing;
206
+ },
207
+ };
208
+ }
209
+ trace(message, context) {
210
+ this.log(LogLevel.TRACE, message, context);
211
+ }
212
+ debug(message, context) {
213
+ this.log(LogLevel.DEBUG, message, context);
214
+ }
215
+ info(message, context) {
216
+ this.log(LogLevel.INFO, message, context);
217
+ }
218
+ warn(message, context) {
219
+ this.log(LogLevel.WARN, message, context);
220
+ }
221
+ error(message, error, context) {
222
+ const errorContext = error ? { error } : {};
223
+ this.log(LogLevel.ERROR, message, { ...errorContext, ...context });
224
+ }
225
+ fatal(message, error, context) {
226
+ const errorContext = error ? { error } : {};
227
+ this.log(LogLevel.FATAL, message, { ...errorContext, ...context });
228
+ }
229
+ log(level, message, context) {
230
+ const sanitizedContext = context && this.config.sanitizeSensitiveData
231
+ ? sanitizeObject(context)
232
+ : context;
233
+ this.logger[level](sanitizedContext || {}, message);
234
+ }
235
+ getPinoLogger() {
236
+ return this.logger;
237
+ }
238
+ isLevelEnabled(level) {
239
+ return this.logger.isLevelEnabled(level);
240
+ }
241
+ getConfig() {
242
+ return { ...this.config };
243
+ }
244
+ flush() {
245
+ this.logger.flush();
246
+ }
247
+ }
248
+ export const defaultLogger = new StructuredLogger();
249
+ export function createComponentLogger(component, config) {
250
+ return new StructuredLogger({
251
+ ...config,
252
+ baseContext: {
253
+ component,
254
+ ...(config?.baseContext || {}),
255
+ },
256
+ });
257
+ }
258
+ export function createDatabaseLogger(database, config) {
259
+ return createComponentLogger('database', {
260
+ ...config,
261
+ baseContext: {
262
+ database,
263
+ ...(config?.baseContext || {}),
264
+ },
265
+ });
266
+ }
267
+ export async function logTimedOperation(logger, operation, fn, context) {
268
+ const timer = logger.createTimer();
269
+ timer.start();
270
+ try {
271
+ logger.debug(`Starting ${operation}`, context);
272
+ const result = await fn();
273
+ timer.end(`Completed ${operation}`, { ...context, success: true });
274
+ return result;
275
+ }
276
+ catch (error) {
277
+ timer.end(`Failed ${operation}`, { ...context, success: false });
278
+ logger.error(`Operation failed: ${operation}`, error, context);
279
+ throw error;
280
+ }
281
+ }
282
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/observability/logger.ts"],"names":[],"mappings":"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"}