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
package/dist/h3/index.js CHANGED
@@ -410,6 +410,16 @@ var MASK_HEADER_PATTERNS = [
410
410
  /token/i,
411
411
  /cookie/i
412
412
  ];
413
+ var MASK_BODY_FIELD_PATTERNS = [
414
+ /password/i,
415
+ /pwd/i,
416
+ /token/i,
417
+ /secret/i,
418
+ /auth/i,
419
+ /card[-_ ]?number/i,
420
+ /ccv/i,
421
+ /ssn/i
422
+ ];
413
423
  var DEFAULT_CONFIG = {
414
424
  enabled: false,
415
425
  logQueryParams: true,
@@ -420,6 +430,7 @@ var DEFAULT_CONFIG = {
420
430
  logException: true,
421
431
  maskQueryParams: [],
422
432
  maskHeaders: [],
433
+ maskBodyFields: [],
423
434
  excludePaths: []
424
435
  };
425
436
  var _RequestLogger = class _RequestLogger {
@@ -470,11 +481,23 @@ var _RequestLogger = class _RequestLogger {
470
481
  ];
471
482
  return matchPatterns(name, patterns);
472
483
  }
484
+ shouldMaskBodyField(name) {
485
+ const patterns = [
486
+ ...this.config.maskBodyFields,
487
+ ...MASK_BODY_FIELD_PATTERNS
488
+ ];
489
+ return matchPatterns(name, patterns);
490
+ }
473
491
  hasSupportedContentType(headers) {
474
492
  var _a2;
475
493
  const contentType = (_a2 = headers.find(([k]) => k.toLowerCase() === "content-type")) == null ? void 0 : _a2[1];
476
494
  return this.isSupportedContentType(contentType);
477
495
  }
496
+ hasJsonContentType(headers) {
497
+ var _a2;
498
+ const contentType = (_a2 = headers.find(([k]) => k.toLowerCase() === "content-type")) == null ? void 0 : _a2[1];
499
+ return contentType ? /\bjson\b/i.test(contentType) : null;
500
+ }
478
501
  isSupportedContentType(contentType) {
479
502
  return typeof contentType === "string" && ALLOWED_CONTENT_TYPES.some((t) => contentType.startsWith(t));
480
503
  }
@@ -493,6 +516,72 @@ var _RequestLogger = class _RequestLogger {
493
516
  this.shouldMaskHeader(k) ? MASKED : v
494
517
  ]);
495
518
  }
519
+ maskBody(data) {
520
+ if (typeof data === "object" && data !== null && !Array.isArray(data)) {
521
+ const result = {};
522
+ for (const [key, value] of Object.entries(data)) {
523
+ if (typeof value === "string" && this.shouldMaskBodyField(key)) {
524
+ result[key] = MASKED;
525
+ } else {
526
+ result[key] = this.maskBody(value);
527
+ }
528
+ }
529
+ return result;
530
+ }
531
+ if (Array.isArray(data)) {
532
+ return data.map((item) => this.maskBody(item));
533
+ }
534
+ return data;
535
+ }
536
+ applyMasking(item) {
537
+ if (this.config.maskRequestBodyCallback && item.request.body && item.request.body !== BODY_TOO_LARGE) {
538
+ try {
539
+ const maskedBody = this.config.maskRequestBodyCallback(item.request);
540
+ item.request.body = maskedBody ?? BODY_MASKED;
541
+ } catch {
542
+ item.request.body = void 0;
543
+ }
544
+ }
545
+ if (this.config.maskResponseBodyCallback && item.response.body && item.response.body !== BODY_TOO_LARGE) {
546
+ try {
547
+ const maskedBody = this.config.maskResponseBodyCallback(item.request, item.response);
548
+ item.response.body = maskedBody ?? BODY_MASKED;
549
+ } catch {
550
+ item.response.body = void 0;
551
+ }
552
+ }
553
+ if (item.request.body && item.request.body.length > MAX_BODY_SIZE) {
554
+ item.request.body = BODY_TOO_LARGE;
555
+ }
556
+ if (item.response.body && item.response.body.length > MAX_BODY_SIZE) {
557
+ item.response.body = BODY_TOO_LARGE;
558
+ }
559
+ for (const key of [
560
+ "request",
561
+ "response"
562
+ ]) {
563
+ const bodyData = item[key].body;
564
+ if (!bodyData || bodyData === BODY_TOO_LARGE || bodyData === BODY_MASKED) {
565
+ continue;
566
+ }
567
+ const headers = item[key].headers;
568
+ const hasJsonContent = this.hasJsonContentType(headers);
569
+ if (hasJsonContent === null || hasJsonContent) {
570
+ try {
571
+ const parsedBody = JSON.parse(bodyData.toString());
572
+ const maskedBody = this.maskBody(parsedBody);
573
+ item[key].body = Buffer3.from(JSON.stringify(maskedBody));
574
+ } catch {
575
+ }
576
+ }
577
+ }
578
+ item.request.headers = this.config.logRequestHeaders ? this.maskHeaders(item.request.headers) : [];
579
+ item.response.headers = this.config.logResponseHeaders ? this.maskHeaders(item.response.headers) : [];
580
+ const url = new URL(item.request.url);
581
+ url.search = this.config.logQueryParams ? this.maskQueryParams(url.search) : "";
582
+ item.request.url = url.toString();
583
+ return item;
584
+ }
496
585
  logRequest(request, response, error) {
497
586
  var _a2, _b, _c;
498
587
  if (!this.enabled || this.suspendUntil !== null) return;
@@ -502,64 +591,30 @@ var _RequestLogger = class _RequestLogger {
502
591
  if (this.shouldExcludePath(path) || this.shouldExcludeUserAgent(userAgent) || (((_c = (_b = this.config).excludeCallback) == null ? void 0 : _c.call(_b, request, response)) ?? false)) {
503
592
  return;
504
593
  }
505
- url.search = this.config.logQueryParams ? this.maskQueryParams(url.search) : "";
506
- request.url = url.toString();
507
594
  if (!this.config.logRequestBody || !this.hasSupportedContentType(request.headers)) {
508
595
  request.body = void 0;
509
- } else if (request.body) {
510
- if (request.body.length > MAX_BODY_SIZE) {
511
- request.body = BODY_TOO_LARGE;
512
- } else if (this.config.maskRequestBodyCallback) {
513
- try {
514
- request.body = this.config.maskRequestBodyCallback(request) ?? BODY_MASKED;
515
- if (request.body.length > MAX_BODY_SIZE) {
516
- request.body = BODY_TOO_LARGE;
517
- }
518
- } catch {
519
- request.body = void 0;
520
- }
521
- }
522
596
  }
523
597
  if (!this.config.logResponseBody || !this.hasSupportedContentType(response.headers)) {
524
598
  response.body = void 0;
525
- } else if (response.body) {
526
- if (response.body.length > MAX_BODY_SIZE) {
527
- response.body = BODY_TOO_LARGE;
528
- } else if (this.config.maskResponseBodyCallback) {
529
- try {
530
- response.body = this.config.maskResponseBodyCallback(request, response) ?? BODY_MASKED;
531
- if (response.body.length > MAX_BODY_SIZE) {
532
- response.body = BODY_TOO_LARGE;
533
- }
534
- } catch {
535
- response.body = void 0;
536
- }
537
- }
538
599
  }
539
- request.headers = this.config.logRequestHeaders ? this.maskHeaders(request.headers) : [];
540
- response.headers = this.config.logResponseHeaders ? this.maskHeaders(response.headers) : [];
600
+ if (request.size !== void 0 && request.size < 0) {
601
+ request.size = void 0;
602
+ }
603
+ if (response.size !== void 0 && response.size < 0) {
604
+ response.size = void 0;
605
+ }
541
606
  const item = {
542
607
  uuid: randomUUID2(),
543
- request: skipEmptyValues(request),
544
- response: skipEmptyValues(response),
608
+ request,
609
+ response,
545
610
  exception: error && this.config.logException ? {
546
611
  type: error.name,
547
612
  message: truncateExceptionMessage(error.message),
548
613
  stacktrace: truncateExceptionStackTrace(error.stack || ""),
549
614
  sentryEventId: getSentryEventId()
550
- } : null
615
+ } : void 0
551
616
  };
552
- [
553
- item.request.body,
554
- item.response.body
555
- ].forEach((body) => {
556
- if (body) {
557
- body.toJSON = function() {
558
- return this.toString("base64");
559
- };
560
- }
561
- });
562
- this.pendingWrites.push(JSON.stringify(item));
617
+ this.pendingWrites.push(item);
563
618
  if (this.pendingWrites.length > MAX_PENDING_WRITES) {
564
619
  this.pendingWrites.shift();
565
620
  }
@@ -573,9 +628,26 @@ var _RequestLogger = class _RequestLogger {
573
628
  this.currentFile = new TempGzipFile();
574
629
  }
575
630
  while (this.pendingWrites.length > 0) {
576
- const item = this.pendingWrites.shift();
631
+ let item = this.pendingWrites.shift();
577
632
  if (item) {
578
- await this.currentFile.writeLine(Buffer3.from(item));
633
+ item = this.applyMasking(item);
634
+ const finalItem = {
635
+ uuid: item.uuid,
636
+ request: skipEmptyValues(item.request),
637
+ response: skipEmptyValues(item.response),
638
+ exception: item.exception
639
+ };
640
+ [
641
+ finalItem.request.body,
642
+ finalItem.response.body
643
+ ].forEach((body) => {
644
+ if (body) {
645
+ body.toJSON = function() {
646
+ return this.toString("base64");
647
+ };
648
+ }
649
+ });
650
+ await this.currentFile.writeLine(Buffer3.from(JSON.stringify(finalItem)));
579
651
  }
580
652
  }
581
653
  });