@x12i/logxer 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1255 -0
  3. package/dist/app-info.d.ts +25 -0
  4. package/dist/app-info.d.ts.map +1 -0
  5. package/dist/app-info.js +179 -0
  6. package/dist/app-info.js.map +1 -0
  7. package/dist/formatters/table-formatter.d.ts +23 -0
  8. package/dist/formatters/table-formatter.d.ts.map +1 -0
  9. package/dist/formatters/table-formatter.js +218 -0
  10. package/dist/formatters/table-formatter.js.map +1 -0
  11. package/dist/formatters/yaml-formatter.d.ts +14 -0
  12. package/dist/formatters/yaml-formatter.d.ts.map +1 -0
  13. package/dist/formatters/yaml-formatter.js +164 -0
  14. package/dist/formatters/yaml-formatter.js.map +1 -0
  15. package/dist/index.d.ts +44 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +219 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/logxer.d.ts +145 -0
  20. package/dist/logxer.d.ts.map +1 -0
  21. package/dist/logxer.js +811 -0
  22. package/dist/logxer.js.map +1 -0
  23. package/dist/outputs/shadow-sink.d.ts +83 -0
  24. package/dist/outputs/shadow-sink.d.ts.map +1 -0
  25. package/dist/outputs/shadow-sink.js +380 -0
  26. package/dist/outputs/shadow-sink.js.map +1 -0
  27. package/dist/outputs/unified-logger-output.d.ts +30 -0
  28. package/dist/outputs/unified-logger-output.d.ts.map +1 -0
  29. package/dist/outputs/unified-logger-output.js +125 -0
  30. package/dist/outputs/unified-logger-output.js.map +1 -0
  31. package/dist/sanitizer.d.ts +69 -0
  32. package/dist/sanitizer.d.ts.map +1 -0
  33. package/dist/sanitizer.js +507 -0
  34. package/dist/sanitizer.js.map +1 -0
  35. package/dist/trails/headers.d.ts +21 -0
  36. package/dist/trails/headers.d.ts.map +1 -0
  37. package/dist/trails/headers.js +121 -0
  38. package/dist/trails/headers.js.map +1 -0
  39. package/dist/trails/index.d.ts +59 -0
  40. package/dist/trails/index.d.ts.map +1 -0
  41. package/dist/trails/index.js +197 -0
  42. package/dist/trails/index.js.map +1 -0
  43. package/dist/types.d.ts +411 -0
  44. package/dist/types.d.ts.map +1 -0
  45. package/dist/types.js +8 -0
  46. package/dist/types.js.map +1 -0
  47. package/dist/utils/debug-config.d.ts +19 -0
  48. package/dist/utils/debug-config.d.ts.map +1 -0
  49. package/dist/utils/debug-config.js +172 -0
  50. package/dist/utils/debug-config.js.map +1 -0
  51. package/dist/utils/package-logs-level.d.ts +40 -0
  52. package/dist/utils/package-logs-level.d.ts.map +1 -0
  53. package/dist/utils/package-logs-level.js +79 -0
  54. package/dist/utils/package-logs-level.js.map +1 -0
  55. package/docs/package-usage.md +155 -0
  56. package/docs/package.md +48 -0
  57. package/docs/upgrade-for-package-authors.md +85 -0
  58. package/package.json +98 -0
@@ -0,0 +1,507 @@
1
+ "use strict";
2
+ /**
3
+ * logs-gateway - PII/Credentials Sanitizer
4
+ *
5
+ * This file contains the sanitization logic for detecting and masking sensitive data.
6
+ * Uses established npm packages for robust PII detection and sanitization.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.LogSanitizer = void 0;
43
+ const crypto = __importStar(require("crypto"));
44
+ // import fastRedact from 'fast-redact'; // Disabled for now
45
+ const sanitize_pii_1 = require("@cdssnc/sanitize-pii");
46
+ const validator = __importStar(require("validator"));
47
+ const xss_1 = require("xss");
48
+ /**
49
+ * Main sanitizer class for detecting and masking PII/credentials
50
+ */
51
+ class LogSanitizer {
52
+ // private redactor: any; // Currently not used
53
+ constructor(config) {
54
+ this.config = {
55
+ enabled: false,
56
+ detectEmails: true,
57
+ detectIPs: true,
58
+ detectPhoneNumbers: true,
59
+ detectJWTs: true,
60
+ detectAPIKeys: true,
61
+ detectAWSCreds: true,
62
+ detectAzureKeys: true,
63
+ detectGCPKeys: true,
64
+ detectPasswords: true,
65
+ detectCreditCards: true,
66
+ maskWith: '[REDACTED]',
67
+ partialMaskRatio: 1.0,
68
+ maxDepth: 5,
69
+ keysDenylist: ['authorization', 'token', 'secret', 'api_key', 'passwd', 'password'],
70
+ keysAllowlist: [],
71
+ fieldsHashInsteadOfMask: [],
72
+ ...config
73
+ };
74
+ // Validate maxDepth after config merge
75
+ this.config.maxDepth = Math.max(1, this.config.maxDepth);
76
+ // Initialize fast-redact for key-based redaction
77
+ // this.initializeRedactor(); // Disabled for now
78
+ }
79
+ /**
80
+ * Initialize fast-redact with configuration
81
+ */
82
+ // private initializeRedactor(): void {
83
+ // if (!this.config.enabled) {
84
+ // return;
85
+ // }
86
+ // // Build paths from denylist, supporting nested keys
87
+ // const paths = this.config.keysDenylist.filter(key => !key.includes('*')); // Only use exact paths for now
88
+ // this.redactor = fastRedact({
89
+ // paths,
90
+ // censor: this.config.maskWith,
91
+ // serialize: false
92
+ // });
93
+ // }
94
+ /**
95
+ * Sanitize a log entry's message and metadata
96
+ */
97
+ sanitize(message, meta) {
98
+ if (!this.config.enabled) {
99
+ return {
100
+ sanitized: { message, data: meta },
101
+ redactionCount: 0,
102
+ truncated: false
103
+ };
104
+ }
105
+ const startTime = Date.now();
106
+ const maxTime = 100; // 100ms budget
107
+ let redactionCount = 0;
108
+ let truncated = false;
109
+ try {
110
+ // Sanitize message using pattern detection
111
+ const messageResult = this.sanitizeString(message, () => {
112
+ if (Date.now() - startTime > maxTime) {
113
+ truncated = true;
114
+ return message;
115
+ }
116
+ return this.detectAndMask(message);
117
+ });
118
+ const sanitizedMessage = messageResult.sanitized;
119
+ redactionCount += messageResult.redactionCount;
120
+ // Sanitize metadata using fast-redact for key-based redaction
121
+ let sanitizedMeta = meta;
122
+ if (meta && typeof meta === 'object') {
123
+ // Apply manual sanitization with key-based rules and hashing
124
+ const result = this.sanitizeObject(meta, 0, startTime, maxTime, new WeakSet());
125
+ sanitizedMeta = result.sanitized;
126
+ redactionCount += result.redactionCount;
127
+ truncated = truncated || result.truncated;
128
+ }
129
+ // Add sanitization metadata
130
+ if (sanitizedMeta && typeof sanitizedMeta === 'object') {
131
+ sanitizedMeta._sanitization = {
132
+ redactionCount,
133
+ truncated
134
+ };
135
+ }
136
+ return {
137
+ sanitized: { message: sanitizedMessage, data: sanitizedMeta },
138
+ redactionCount,
139
+ truncated
140
+ };
141
+ }
142
+ catch (error) {
143
+ // Handle sanitization errors gracefully
144
+ return {
145
+ sanitized: {
146
+ message: this.config.maskWith,
147
+ data: {
148
+ _sanitization: {
149
+ sanitizationError: true,
150
+ redactionCount: 0,
151
+ truncated: true
152
+ }
153
+ }
154
+ },
155
+ redactionCount: 0,
156
+ truncated: true
157
+ };
158
+ }
159
+ }
160
+ /**
161
+ * Whether `fullPath` (lowercase, dot-separated) matches a deny/allow pattern.
162
+ * - `password` matches only path `password` (single segment).
163
+ * - `user.password` matches exactly that path.
164
+ * - `*.token` matches one segment + `.token` (e.g. `api.token`).
165
+ */
166
+ pathMatchesPattern(fullPath, pattern) {
167
+ const fp = fullPath.toLowerCase();
168
+ const p = pattern.toLowerCase().trim();
169
+ if (!p)
170
+ return false;
171
+ if (p.includes('*')) {
172
+ if (p === '*.token') {
173
+ return /^[^.]+\.token$/.test(fp);
174
+ }
175
+ const parts = p.split('*');
176
+ const re = new RegExp('^' +
177
+ parts
178
+ .map((seg, i) => {
179
+ const escaped = seg.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
180
+ return i < parts.length - 1 ? `${escaped}[^.]*` : escaped;
181
+ })
182
+ .join('') +
183
+ '$');
184
+ return re.test(fp);
185
+ }
186
+ if (!p.includes('.')) {
187
+ return fp === p;
188
+ }
189
+ return fp === p;
190
+ }
191
+ /**
192
+ * Sanitize an object recursively
193
+ */
194
+ sanitizeObject(obj, depth, startTime, maxTime, seen = new WeakSet(), pathPrefix = '') {
195
+ if (depth > this.config.maxDepth) {
196
+ return { sanitized: obj, redactionCount: 0, truncated: true };
197
+ }
198
+ if (Date.now() - startTime > maxTime) {
199
+ return { sanitized: this.config.maskWith, redactionCount: 1, truncated: true };
200
+ }
201
+ if (obj === null || obj === undefined) {
202
+ return { sanitized: obj, redactionCount: 0, truncated: false };
203
+ }
204
+ // Check for circular references
205
+ if (typeof obj === 'object' && seen.has(obj)) {
206
+ throw new Error('Circular reference detected');
207
+ }
208
+ // Add object to seen set for circular reference detection
209
+ if (typeof obj === 'object') {
210
+ seen.add(obj);
211
+ }
212
+ if (typeof obj === 'string') {
213
+ return this.sanitizeString(obj, () => this.detectAndMask(obj));
214
+ }
215
+ if (typeof obj === 'number' || typeof obj === 'boolean') {
216
+ return { sanitized: obj, redactionCount: 0, truncated: false };
217
+ }
218
+ if (Array.isArray(obj)) {
219
+ const sanitizedArray = [];
220
+ let totalRedactions = 0;
221
+ let truncated = false;
222
+ for (let i = 0; i < obj.length; i++) {
223
+ const item = obj[i];
224
+ const indexPath = pathPrefix ? `${pathPrefix}.${i}` : String(i);
225
+ const result = this.sanitizeObject(item, depth + 1, startTime, maxTime, seen, indexPath);
226
+ sanitizedArray.push(result.sanitized);
227
+ totalRedactions += result.redactionCount;
228
+ truncated = truncated || result.truncated;
229
+ }
230
+ return { sanitized: sanitizedArray, redactionCount: totalRedactions, truncated };
231
+ }
232
+ if (typeof obj === 'object') {
233
+ const sanitizedObj = {};
234
+ let totalRedactions = 0;
235
+ let truncated = false;
236
+ for (const [key, value] of Object.entries(obj)) {
237
+ const lowerKey = key.toLowerCase();
238
+ const fullPath = pathPrefix ? `${pathPrefix}.${lowerKey}` : lowerKey;
239
+ const isInAllowlist = this.config.keysAllowlist.some((allowKey) => this.pathMatchesPattern(fullPath, allowKey));
240
+ if (isInAllowlist) {
241
+ sanitizedObj[key] = value;
242
+ continue;
243
+ }
244
+ // Check if this key should be hashed instead of masked
245
+ if (this.config.fieldsHashInsteadOfMask.includes(lowerKey)) {
246
+ if (typeof value === 'string') {
247
+ sanitizedObj[key] = this.hashValue(value);
248
+ totalRedactions++;
249
+ }
250
+ else {
251
+ sanitizedObj[key] = value;
252
+ }
253
+ continue;
254
+ }
255
+ const shouldRedact = this.config.keysDenylist.some((denyKey) => this.pathMatchesPattern(fullPath, denyKey));
256
+ if (shouldRedact) {
257
+ sanitizedObj[key] = this.config.maskWith;
258
+ totalRedactions++;
259
+ continue;
260
+ }
261
+ // For other keys, only apply pattern detection to string values
262
+ if (typeof value === 'string') {
263
+ const sanitizedString = this.detectAndMask(value);
264
+ sanitizedObj[key] = sanitizedString;
265
+ if (sanitizedString !== value) {
266
+ totalRedactions++;
267
+ }
268
+ }
269
+ else {
270
+ const result = this.sanitizeObject(value, depth + 1, startTime, maxTime, seen, fullPath);
271
+ sanitizedObj[key] = result.sanitized;
272
+ totalRedactions += result.redactionCount;
273
+ truncated = truncated || result.truncated;
274
+ }
275
+ }
276
+ return { sanitized: sanitizedObj, redactionCount: totalRedactions, truncated };
277
+ }
278
+ return { sanitized: obj, redactionCount: 0, truncated: false };
279
+ }
280
+ /**
281
+ * Sanitize a string value
282
+ */
283
+ sanitizeString(str, detector) {
284
+ const sanitized = detector();
285
+ return {
286
+ sanitized,
287
+ redactionCount: sanitized !== str ? 1 : 0,
288
+ truncated: false
289
+ };
290
+ }
291
+ /**
292
+ * Detect and mask sensitive patterns in a string using npm packages
293
+ */
294
+ detectAndMask(str) {
295
+ let result = str;
296
+ // Use @cdssnc/sanitize-pii for comprehensive PII detection
297
+ if (this.config.detectEmails || this.config.detectIPs || this.config.detectPhoneNumbers) {
298
+ try {
299
+ result = (0, sanitize_pii_1.sanitizePii)(result, {
300
+ replacementTemplate: this.config.maskWith,
301
+ useDefaultPatterns: true
302
+ });
303
+ }
304
+ catch (error) {
305
+ // Fallback to custom patterns if the package fails
306
+ }
307
+ // Always apply custom patterns as fallback
308
+ result = this.fallbackPatternDetection(result);
309
+ }
310
+ // Use validator for additional email validation
311
+ if (this.config.detectEmails) {
312
+ result = result.replace(/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/g, (match) => {
313
+ if (validator.isEmail(match)) {
314
+ return this.config.maskWith;
315
+ }
316
+ return match;
317
+ });
318
+ }
319
+ // Custom patterns for credentials and tokens
320
+ result = this.detectCredentials(result);
321
+ // XSS protection
322
+ result = (0, xss_1.filterXSS)(result, {
323
+ whiteList: {}, // Remove all HTML tags
324
+ stripIgnoreTag: true,
325
+ stripIgnoreTagBody: ['script']
326
+ });
327
+ return result;
328
+ }
329
+ /**
330
+ * Fallback pattern detection if npm packages fail
331
+ */
332
+ fallbackPatternDetection(str) {
333
+ let result = str;
334
+ // Email addresses
335
+ if (this.config.detectEmails) {
336
+ result = result.replace(/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/g, this.config.maskWith);
337
+ }
338
+ // IP addresses (IPv4 and IPv6)
339
+ if (this.config.detectIPs) {
340
+ // IPv4 addresses
341
+ result = result.replace(/\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/g, this.config.maskWith);
342
+ // IPv6 addresses - comprehensive pattern
343
+ result = result.replace(/\b(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\b/g, this.config.maskWith);
344
+ // Simple pattern for any IPv6-like string with :: (most general, run first)
345
+ result = result.replace(/[0-9a-fA-F]+:[0-9a-fA-F]+::[0-9a-fA-F]+/g, this.config.maskWith);
346
+ result = result.replace(/\b(?:[0-9a-fA-F]{1,4}:)*::(?:[0-9a-fA-F]{1,4}:)*[0-9a-fA-F]{1,4}\b/g, this.config.maskWith);
347
+ result = result.replace(/\b::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}\b/g, this.config.maskWith);
348
+ result = result.replace(/\b(?:[0-9a-fA-F]{1,4}:){1,7}:\b/g, this.config.maskWith);
349
+ }
350
+ // Phone numbers (basic patterns)
351
+ if (this.config.detectPhoneNumbers) {
352
+ // US phone numbers
353
+ result = result.replace(/\b(?:\+?1[-.\s]?)?\(?[0-9]{3}\)?[-.\s]?[0-9]{3}[-.\s]?[0-9]{4}\b/g, this.config.maskWith);
354
+ // International phone numbers with country codes
355
+ result = result.replace(/\b\+[1-9]\d{1,3}[\s-]?\d{1,4}[\s-]?\d{1,4}[\s-]?\d{1,9}\b/g, this.config.maskWith);
356
+ // More flexible pattern for international numbers with spaces
357
+ result = result.replace(/\b\+[1-9]\d{1,3}\s+\d{1,4}\s+\d{1,4}\s+\d{1,9}\b/g, this.config.maskWith);
358
+ // Pattern without word boundaries for better matching
359
+ result = result.replace(/\+[1-9]\d{1,3}\s+\d+\s+\d+\s+\d+/g, this.config.maskWith);
360
+ // Generic phone number pattern
361
+ result = result.replace(/\b\+?[1-9]\d{1,14}\b/g, (match) => {
362
+ // More specific phone number validation
363
+ if (match.length >= 10 && match.length <= 15) {
364
+ return this.config.maskWith;
365
+ }
366
+ return match;
367
+ });
368
+ }
369
+ return result;
370
+ }
371
+ /**
372
+ * Detect credentials and API keys using custom patterns
373
+ */
374
+ detectCredentials(str) {
375
+ let result = str;
376
+ // JWTs
377
+ if (this.config.detectJWTs) {
378
+ result = result.replace(/\beyJ[A-Za-z0-9_-]*\.[A-Za-z0-9_-]*\.[A-Za-z0-9_-]*\b/g, this.config.maskWith);
379
+ }
380
+ // API keys (generic patterns)
381
+ if (this.config.detectAPIKeys) {
382
+ result = result.replace(/\b[A-Za-z0-9_-]{20,}\b/g, (match) => {
383
+ // Skip if it looks like a normal word or number
384
+ if (/^[0-9]+$/.test(match) || /^[A-Za-z]+$/.test(match)) {
385
+ return match;
386
+ }
387
+ return this.config.maskWith;
388
+ });
389
+ // Specific API key patterns
390
+ result = result.replace(/\bsk-[A-Za-z0-9]{10,}\b/g, this.config.maskWith);
391
+ result = result.replace(/\bak_[A-Za-z0-9]{10,}\b/g, this.config.maskWith);
392
+ }
393
+ // AWS credentials
394
+ if (this.config.detectAWSCreds) {
395
+ result = result.replace(/\bAKIA[0-9A-Z]{16}\b/g, this.config.maskWith);
396
+ result = result.replace(/\baws_secret_access_key\s*[:=]\s*[A-Za-z0-9/+=]{40}\b/g, this.config.maskWith);
397
+ }
398
+ // Azure keys
399
+ if (this.config.detectAzureKeys) {
400
+ result = result.replace(/\b[A-Za-z0-9+/]{32,}={0,2}\b/g, (match) => {
401
+ // More specific Azure key patterns
402
+ if (match.length >= 32 && match.length <= 44) {
403
+ return this.config.maskWith;
404
+ }
405
+ return match;
406
+ });
407
+ }
408
+ // GCP keys
409
+ if (this.config.detectGCPKeys) {
410
+ result = result.replace(/\b[A-Za-z0-9_-]{24,}\b/g, (match) => {
411
+ // GCP service account keys are typically longer
412
+ if (match.length >= 24) {
413
+ return this.config.maskWith;
414
+ }
415
+ return match;
416
+ });
417
+ }
418
+ // Password fields
419
+ if (this.config.detectPasswords) {
420
+ result = result.replace(/\b(?:password|pass|pwd)\s*[:=]\s*[^\s]+\b/gi, this.config.maskWith);
421
+ }
422
+ // Credit cards (Luhn algorithm)
423
+ if (this.config.detectCreditCards) {
424
+ result = result.replace(/\b(?:\d{4}[-\s]?){3}\d{4}\b/g, (match) => {
425
+ const digits = match.replace(/[-\s]/g, '');
426
+ if (this.isValidCreditCard(digits)) {
427
+ return this.config.maskWith;
428
+ }
429
+ return match;
430
+ });
431
+ }
432
+ return result;
433
+ }
434
+ /**
435
+ * Apply pattern detection to object values
436
+ */
437
+ applyPatternDetectionToObject(obj, startTime, maxTime) {
438
+ if (Date.now() - startTime > maxTime) {
439
+ return obj;
440
+ }
441
+ if (obj === null || obj === undefined) {
442
+ return obj;
443
+ }
444
+ if (typeof obj === 'string') {
445
+ return this.detectAndMask(obj);
446
+ }
447
+ if (typeof obj === 'number' || typeof obj === 'boolean') {
448
+ return obj;
449
+ }
450
+ if (Array.isArray(obj)) {
451
+ return obj.map(item => this.applyPatternDetectionToObject(item, startTime, maxTime));
452
+ }
453
+ if (typeof obj === 'object') {
454
+ const result = {};
455
+ for (const [key, value] of Object.entries(obj)) {
456
+ // Skip sanitization metadata
457
+ if (key === '_sanitization') {
458
+ result[key] = value;
459
+ continue;
460
+ }
461
+ // Apply hashing for specified fields
462
+ if (this.config.fieldsHashInsteadOfMask.includes(key.toLowerCase()) && typeof value === 'string') {
463
+ result[key] = this.hashValue(value);
464
+ // redactionCount++; // This variable is not in scope here
465
+ }
466
+ else {
467
+ result[key] = this.applyPatternDetectionToObject(value, startTime, maxTime);
468
+ }
469
+ }
470
+ return result;
471
+ }
472
+ return obj;
473
+ }
474
+ /**
475
+ * Hash a value using SHA-256
476
+ */
477
+ hashValue(value) {
478
+ return crypto.createHash('sha256').update(value).digest('hex');
479
+ }
480
+ /**
481
+ * Validate credit card number using Luhn algorithm
482
+ */
483
+ isValidCreditCard(cardNumber) {
484
+ if (!/^\d{13,19}$/.test(cardNumber)) {
485
+ return false;
486
+ }
487
+ let sum = 0;
488
+ let isEven = false;
489
+ for (let i = cardNumber.length - 1; i >= 0; i--) {
490
+ const char = cardNumber[i];
491
+ if (!char)
492
+ continue;
493
+ let digit = parseInt(char);
494
+ if (isEven) {
495
+ digit *= 2;
496
+ if (digit > 9) {
497
+ digit -= 9;
498
+ }
499
+ }
500
+ sum += digit;
501
+ isEven = !isEven;
502
+ }
503
+ return sum % 10 === 0;
504
+ }
505
+ }
506
+ exports.LogSanitizer = LogSanitizer;
507
+ //# sourceMappingURL=sanitizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitizer.js","sourceRoot":"","sources":["../src/sanitizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Header injection and extraction for trails context
3
+ */
4
+ import type { ThreadContext, OperationCtx } from '../types';
5
+ /**
6
+ * Inject thread context into HTTP headers
7
+ */
8
+ export declare function injectThreadHeaders(headers: Record<string, string>, context: ThreadContext): void;
9
+ /**
10
+ * Extract thread context from HTTP headers
11
+ */
12
+ export declare function extractThreadHeaders(headers: Record<string, string>): Partial<ThreadContext>;
13
+ /**
14
+ * Inject operation context into HTTP headers
15
+ */
16
+ export declare function injectOperationHeaders(headers: Record<string, string>, context: OperationCtx): void;
17
+ /**
18
+ * Extract operation context from HTTP headers
19
+ */
20
+ export declare function extractOperationHeaders(headers: Record<string, string>): Partial<OperationCtx>;
21
+ //# sourceMappingURL=headers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../src/trails/headers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE5D;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,OAAO,EAAE,aAAa,GACrB,IAAI,CA2BN;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,OAAO,CAAC,aAAa,CAAC,CA6CxB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,OAAO,EAAE,YAAY,GACpB,IAAI,CAWN;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,OAAO,CAAC,YAAY,CAAC,CAmCvB"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ /**
3
+ * Header injection and extraction for trails context
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.injectThreadHeaders = injectThreadHeaders;
7
+ exports.extractThreadHeaders = extractThreadHeaders;
8
+ exports.injectOperationHeaders = injectOperationHeaders;
9
+ exports.extractOperationHeaders = extractOperationHeaders;
10
+ /**
11
+ * Inject thread context into HTTP headers
12
+ */
13
+ function injectThreadHeaders(headers, context) {
14
+ headers['x-thread-id'] = context.threadId;
15
+ headers['x-event-id'] = context.eventId;
16
+ headers['x-seq-no'] = context.sequenceNo.toString();
17
+ if (context.causationId) {
18
+ const causationStr = Array.isArray(context.causationId)
19
+ ? context.causationId.join(',')
20
+ : context.causationId;
21
+ headers['x-causation-id'] = causationStr;
22
+ }
23
+ if (context.partitionKey) {
24
+ headers['x-partition-key'] = context.partitionKey;
25
+ }
26
+ if (context.attempt !== undefined) {
27
+ headers['x-attempt'] = context.attempt.toString();
28
+ }
29
+ if (context.shardId) {
30
+ headers['x-shard-id'] = context.shardId;
31
+ }
32
+ if (context.workerId) {
33
+ headers['x-worker-id'] = context.workerId;
34
+ }
35
+ }
36
+ /**
37
+ * Extract thread context from HTTP headers
38
+ */
39
+ function extractThreadHeaders(headers) {
40
+ const context = {};
41
+ if (headers['x-thread-id']) {
42
+ context.threadId = headers['x-thread-id'];
43
+ }
44
+ if (headers['x-event-id']) {
45
+ context.eventId = headers['x-event-id'];
46
+ }
47
+ if (headers['x-seq-no']) {
48
+ const seqNo = parseInt(headers['x-seq-no'], 10);
49
+ if (!isNaN(seqNo)) {
50
+ context.sequenceNo = seqNo;
51
+ }
52
+ }
53
+ if (headers['x-causation-id']) {
54
+ const causationStr = headers['x-causation-id'];
55
+ context.causationId = causationStr.includes(',')
56
+ ? causationStr.split(',')
57
+ : causationStr;
58
+ }
59
+ if (headers['x-partition-key']) {
60
+ context.partitionKey = headers['x-partition-key'];
61
+ }
62
+ if (headers['x-attempt']) {
63
+ const attempt = parseInt(headers['x-attempt'], 10);
64
+ if (!isNaN(attempt)) {
65
+ context.attempt = attempt;
66
+ }
67
+ }
68
+ if (headers['x-shard-id']) {
69
+ context.shardId = headers['x-shard-id'];
70
+ }
71
+ if (headers['x-worker-id']) {
72
+ context.workerId = headers['x-worker-id'];
73
+ }
74
+ return context;
75
+ }
76
+ /**
77
+ * Inject operation context into HTTP headers
78
+ */
79
+ function injectOperationHeaders(headers, context) {
80
+ headers['x-operation-id'] = context.operationId;
81
+ headers['x-operation-name'] = context.operationName;
82
+ headers['x-operation-path'] = context.operationPath;
83
+ headers['x-operation-step'] = context.operationStep.toString();
84
+ headers['x-trace-id'] = context.traceId;
85
+ headers['x-span-id'] = context.spanId;
86
+ if (context.parentOperationId) {
87
+ headers['x-parent-operation-id'] = context.parentOperationId;
88
+ }
89
+ }
90
+ /**
91
+ * Extract operation context from HTTP headers
92
+ */
93
+ function extractOperationHeaders(headers) {
94
+ const context = {};
95
+ if (headers['x-operation-id']) {
96
+ context.operationId = headers['x-operation-id'];
97
+ }
98
+ if (headers['x-parent-operation-id']) {
99
+ context.parentOperationId = headers['x-parent-operation-id'];
100
+ }
101
+ if (headers['x-operation-name']) {
102
+ context.operationName = headers['x-operation-name'];
103
+ }
104
+ if (headers['x-operation-path']) {
105
+ context.operationPath = headers['x-operation-path'];
106
+ }
107
+ if (headers['x-operation-step']) {
108
+ const step = parseInt(headers['x-operation-step'], 10);
109
+ if (!isNaN(step)) {
110
+ context.operationStep = step;
111
+ }
112
+ }
113
+ if (headers['x-trace-id']) {
114
+ context.traceId = headers['x-trace-id'];
115
+ }
116
+ if (headers['x-span-id']) {
117
+ context.spanId = headers['x-span-id'];
118
+ }
119
+ return context;
120
+ }
121
+ //# sourceMappingURL=headers.js.map