apitally 0.15.2 → 0.16.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 (70) hide show
  1. package/README.md +2 -7
  2. package/dist/adonisjs/configure.cjs +33 -2
  3. package/dist/adonisjs/configure.cjs.map +1 -1
  4. package/dist/adonisjs/configure.js +33 -2
  5. package/dist/adonisjs/configure.js.map +1 -1
  6. package/dist/adonisjs/index.cjs +33 -2
  7. package/dist/adonisjs/index.cjs.map +1 -1
  8. package/dist/adonisjs/index.js +33 -2
  9. package/dist/adonisjs/index.js.map +1 -1
  10. package/dist/adonisjs/middleware.cjs.map +1 -1
  11. package/dist/adonisjs/middleware.js.map +1 -1
  12. package/dist/adonisjs/provider.cjs +118 -46
  13. package/dist/adonisjs/provider.cjs.map +1 -1
  14. package/dist/adonisjs/provider.js +118 -46
  15. package/dist/adonisjs/provider.js.map +1 -1
  16. package/dist/common/client.cjs +118 -46
  17. package/dist/common/client.cjs.map +1 -1
  18. package/dist/common/client.js +118 -46
  19. package/dist/common/client.js.map +1 -1
  20. package/dist/common/requestLogger.cjs +118 -46
  21. package/dist/common/requestLogger.cjs.map +1 -1
  22. package/dist/common/requestLogger.d.cts +5 -0
  23. package/dist/common/requestLogger.d.ts +5 -0
  24. package/dist/common/requestLogger.js +118 -46
  25. package/dist/common/requestLogger.js.map +1 -1
  26. package/dist/express/index.cjs +118 -46
  27. package/dist/express/index.cjs.map +1 -1
  28. package/dist/express/index.js +118 -46
  29. package/dist/express/index.js.map +1 -1
  30. package/dist/express/middleware.cjs +118 -46
  31. package/dist/express/middleware.cjs.map +1 -1
  32. package/dist/express/middleware.js +118 -46
  33. package/dist/express/middleware.js.map +1 -1
  34. package/dist/fastify/index.cjs +118 -46
  35. package/dist/fastify/index.cjs.map +1 -1
  36. package/dist/fastify/index.js +118 -46
  37. package/dist/fastify/index.js.map +1 -1
  38. package/dist/fastify/plugin.cjs +118 -46
  39. package/dist/fastify/plugin.cjs.map +1 -1
  40. package/dist/fastify/plugin.js +118 -46
  41. package/dist/fastify/plugin.js.map +1 -1
  42. package/dist/h3/index.cjs +118 -46
  43. package/dist/h3/index.cjs.map +1 -1
  44. package/dist/h3/index.js +118 -46
  45. package/dist/h3/index.js.map +1 -1
  46. package/dist/h3/plugin.cjs +118 -46
  47. package/dist/h3/plugin.cjs.map +1 -1
  48. package/dist/h3/plugin.js +118 -46
  49. package/dist/h3/plugin.js.map +1 -1
  50. package/dist/hono/index.cjs +118 -46
  51. package/dist/hono/index.cjs.map +1 -1
  52. package/dist/hono/index.js +118 -46
  53. package/dist/hono/index.js.map +1 -1
  54. package/dist/hono/middleware.cjs +118 -46
  55. package/dist/hono/middleware.cjs.map +1 -1
  56. package/dist/hono/middleware.js +118 -46
  57. package/dist/hono/middleware.js.map +1 -1
  58. package/dist/koa/index.cjs +118 -46
  59. package/dist/koa/index.cjs.map +1 -1
  60. package/dist/koa/index.js +118 -46
  61. package/dist/koa/index.js.map +1 -1
  62. package/dist/koa/middleware.cjs +118 -46
  63. package/dist/koa/middleware.cjs.map +1 -1
  64. package/dist/koa/middleware.js +118 -46
  65. package/dist/koa/middleware.js.map +1 -1
  66. package/dist/nestjs/index.cjs +118 -46
  67. package/dist/nestjs/index.cjs.map +1 -1
  68. package/dist/nestjs/index.js +118 -46
  69. package/dist/nestjs/index.js.map +1 -1
  70. package/package.json +1 -1
@@ -437,6 +437,16 @@ var MASK_HEADER_PATTERNS = [
437
437
  /token/i,
438
438
  /cookie/i
439
439
  ];
440
+ var MASK_BODY_FIELD_PATTERNS = [
441
+ /password/i,
442
+ /pwd/i,
443
+ /token/i,
444
+ /secret/i,
445
+ /auth/i,
446
+ /card[-_ ]?number/i,
447
+ /ccv/i,
448
+ /ssn/i
449
+ ];
440
450
  var DEFAULT_CONFIG = {
441
451
  enabled: false,
442
452
  logQueryParams: true,
@@ -447,6 +457,7 @@ var DEFAULT_CONFIG = {
447
457
  logException: true,
448
458
  maskQueryParams: [],
449
459
  maskHeaders: [],
460
+ maskBodyFields: [],
450
461
  excludePaths: []
451
462
  };
452
463
  var _RequestLogger = class _RequestLogger {
@@ -497,11 +508,23 @@ var _RequestLogger = class _RequestLogger {
497
508
  ];
498
509
  return matchPatterns(name, patterns);
499
510
  }
511
+ shouldMaskBodyField(name) {
512
+ const patterns = [
513
+ ...this.config.maskBodyFields,
514
+ ...MASK_BODY_FIELD_PATTERNS
515
+ ];
516
+ return matchPatterns(name, patterns);
517
+ }
500
518
  hasSupportedContentType(headers) {
501
519
  var _a2;
502
520
  const contentType = (_a2 = headers.find(([k]) => k.toLowerCase() === "content-type")) == null ? void 0 : _a2[1];
503
521
  return this.isSupportedContentType(contentType);
504
522
  }
523
+ hasJsonContentType(headers) {
524
+ var _a2;
525
+ const contentType = (_a2 = headers.find(([k]) => k.toLowerCase() === "content-type")) == null ? void 0 : _a2[1];
526
+ return contentType ? /\bjson\b/i.test(contentType) : null;
527
+ }
505
528
  isSupportedContentType(contentType) {
506
529
  return typeof contentType === "string" && ALLOWED_CONTENT_TYPES.some((t) => contentType.startsWith(t));
507
530
  }
@@ -520,6 +543,72 @@ var _RequestLogger = class _RequestLogger {
520
543
  this.shouldMaskHeader(k) ? MASKED : v
521
544
  ]);
522
545
  }
546
+ maskBody(data) {
547
+ if (typeof data === "object" && data !== null && !Array.isArray(data)) {
548
+ const result = {};
549
+ for (const [key, value] of Object.entries(data)) {
550
+ if (typeof value === "string" && this.shouldMaskBodyField(key)) {
551
+ result[key] = MASKED;
552
+ } else {
553
+ result[key] = this.maskBody(value);
554
+ }
555
+ }
556
+ return result;
557
+ }
558
+ if (Array.isArray(data)) {
559
+ return data.map((item) => this.maskBody(item));
560
+ }
561
+ return data;
562
+ }
563
+ applyMasking(item) {
564
+ if (this.config.maskRequestBodyCallback && item.request.body && item.request.body !== BODY_TOO_LARGE) {
565
+ try {
566
+ const maskedBody = this.config.maskRequestBodyCallback(item.request);
567
+ item.request.body = maskedBody ?? BODY_MASKED;
568
+ } catch {
569
+ item.request.body = void 0;
570
+ }
571
+ }
572
+ if (this.config.maskResponseBodyCallback && item.response.body && item.response.body !== BODY_TOO_LARGE) {
573
+ try {
574
+ const maskedBody = this.config.maskResponseBodyCallback(item.request, item.response);
575
+ item.response.body = maskedBody ?? BODY_MASKED;
576
+ } catch {
577
+ item.response.body = void 0;
578
+ }
579
+ }
580
+ if (item.request.body && item.request.body.length > MAX_BODY_SIZE) {
581
+ item.request.body = BODY_TOO_LARGE;
582
+ }
583
+ if (item.response.body && item.response.body.length > MAX_BODY_SIZE) {
584
+ item.response.body = BODY_TOO_LARGE;
585
+ }
586
+ for (const key of [
587
+ "request",
588
+ "response"
589
+ ]) {
590
+ const bodyData = item[key].body;
591
+ if (!bodyData || bodyData === BODY_TOO_LARGE || bodyData === BODY_MASKED) {
592
+ continue;
593
+ }
594
+ const headers = item[key].headers;
595
+ const hasJsonContent = this.hasJsonContentType(headers);
596
+ if (hasJsonContent === null || hasJsonContent) {
597
+ try {
598
+ const parsedBody = JSON.parse(bodyData.toString());
599
+ const maskedBody = this.maskBody(parsedBody);
600
+ item[key].body = import_buffer2.Buffer.from(JSON.stringify(maskedBody));
601
+ } catch {
602
+ }
603
+ }
604
+ }
605
+ item.request.headers = this.config.logRequestHeaders ? this.maskHeaders(item.request.headers) : [];
606
+ item.response.headers = this.config.logResponseHeaders ? this.maskHeaders(item.response.headers) : [];
607
+ const url = new URL(item.request.url);
608
+ url.search = this.config.logQueryParams ? this.maskQueryParams(url.search) : "";
609
+ item.request.url = url.toString();
610
+ return item;
611
+ }
523
612
  logRequest(request, response, error) {
524
613
  var _a2, _b, _c;
525
614
  if (!this.enabled || this.suspendUntil !== null) return;
@@ -529,64 +618,30 @@ var _RequestLogger = class _RequestLogger {
529
618
  if (this.shouldExcludePath(path) || this.shouldExcludeUserAgent(userAgent) || (((_c = (_b = this.config).excludeCallback) == null ? void 0 : _c.call(_b, request, response)) ?? false)) {
530
619
  return;
531
620
  }
532
- url.search = this.config.logQueryParams ? this.maskQueryParams(url.search) : "";
533
- request.url = url.toString();
534
621
  if (!this.config.logRequestBody || !this.hasSupportedContentType(request.headers)) {
535
622
  request.body = void 0;
536
- } else if (request.body) {
537
- if (request.body.length > MAX_BODY_SIZE) {
538
- request.body = BODY_TOO_LARGE;
539
- } else if (this.config.maskRequestBodyCallback) {
540
- try {
541
- request.body = this.config.maskRequestBodyCallback(request) ?? BODY_MASKED;
542
- if (request.body.length > MAX_BODY_SIZE) {
543
- request.body = BODY_TOO_LARGE;
544
- }
545
- } catch {
546
- request.body = void 0;
547
- }
548
- }
549
623
  }
550
624
  if (!this.config.logResponseBody || !this.hasSupportedContentType(response.headers)) {
551
625
  response.body = void 0;
552
- } else if (response.body) {
553
- if (response.body.length > MAX_BODY_SIZE) {
554
- response.body = BODY_TOO_LARGE;
555
- } else if (this.config.maskResponseBodyCallback) {
556
- try {
557
- response.body = this.config.maskResponseBodyCallback(request, response) ?? BODY_MASKED;
558
- if (response.body.length > MAX_BODY_SIZE) {
559
- response.body = BODY_TOO_LARGE;
560
- }
561
- } catch {
562
- response.body = void 0;
563
- }
564
- }
565
626
  }
566
- request.headers = this.config.logRequestHeaders ? this.maskHeaders(request.headers) : [];
567
- response.headers = this.config.logResponseHeaders ? this.maskHeaders(response.headers) : [];
627
+ if (request.size !== void 0 && request.size < 0) {
628
+ request.size = void 0;
629
+ }
630
+ if (response.size !== void 0 && response.size < 0) {
631
+ response.size = void 0;
632
+ }
568
633
  const item = {
569
634
  uuid: (0, import_crypto3.randomUUID)(),
570
- request: skipEmptyValues(request),
571
- response: skipEmptyValues(response),
635
+ request,
636
+ response,
572
637
  exception: error && this.config.logException ? {
573
638
  type: error.name,
574
639
  message: truncateExceptionMessage(error.message),
575
640
  stacktrace: truncateExceptionStackTrace(error.stack || ""),
576
641
  sentryEventId: getSentryEventId()
577
- } : null
642
+ } : void 0
578
643
  };
579
- [
580
- item.request.body,
581
- item.response.body
582
- ].forEach((body) => {
583
- if (body) {
584
- body.toJSON = function() {
585
- return this.toString("base64");
586
- };
587
- }
588
- });
589
- this.pendingWrites.push(JSON.stringify(item));
644
+ this.pendingWrites.push(item);
590
645
  if (this.pendingWrites.length > MAX_PENDING_WRITES) {
591
646
  this.pendingWrites.shift();
592
647
  }
@@ -600,9 +655,26 @@ var _RequestLogger = class _RequestLogger {
600
655
  this.currentFile = new TempGzipFile();
601
656
  }
602
657
  while (this.pendingWrites.length > 0) {
603
- const item = this.pendingWrites.shift();
658
+ let item = this.pendingWrites.shift();
604
659
  if (item) {
605
- await this.currentFile.writeLine(import_buffer2.Buffer.from(item));
660
+ item = this.applyMasking(item);
661
+ const finalItem = {
662
+ uuid: item.uuid,
663
+ request: skipEmptyValues(item.request),
664
+ response: skipEmptyValues(item.response),
665
+ exception: item.exception
666
+ };
667
+ [
668
+ finalItem.request.body,
669
+ finalItem.response.body
670
+ ].forEach((body) => {
671
+ if (body) {
672
+ body.toJSON = function() {
673
+ return this.toString("base64");
674
+ };
675
+ }
676
+ });
677
+ await this.currentFile.writeLine(import_buffer2.Buffer.from(JSON.stringify(finalItem)));
606
678
  }
607
679
  }
608
680
  });