@be-link/cls-logger 1.0.1-beta.2 → 1.0.1-beta.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"errorMonitor.d.ts","sourceRoot":"","sources":["../src/errorMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG/D,KAAK,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;AA8MzD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAE,OAAO,GAAG,mBAAmB,GAAG,SAAc,GAAG,IAAI,CAmBhH"}
1
+ {"version":3,"file":"errorMonitor.d.ts","sourceRoot":"","sources":["../src/errorMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG/D,KAAK,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;AA4QzD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAE,OAAO,GAAG,mBAAmB,GAAG,SAAc,GAAG,IAAI,CAqBhH"}
package/dist/index.esm.js CHANGED
@@ -536,6 +536,8 @@ function installRequestMonitor(report, opts = {}) {
536
536
  }
537
537
 
538
538
  const DEFAULT_MAX_TEXT = 4000;
539
+ const DEFAULT_DEDUPE_WINDOW_MS = 3000;
540
+ const DEFAULT_DEDUPE_MAX_KEYS = 200;
539
541
  function truncate$2(s, maxLen) {
540
542
  if (!s)
541
543
  return s;
@@ -569,6 +571,54 @@ function normalizeErrorLike(err, maxTextLength) {
569
571
  const message = truncate$2(stringifyLogValue(err), maxTextLength);
570
572
  return { message, name: '', stack: '' };
571
573
  }
574
+ function createDedupeGuard(options) {
575
+ const cache = new Map(); // key -> lastReportAt
576
+ const maxKeys = Math.max(0, options.dedupeMaxKeys);
577
+ const windowMs = Math.max(0, options.dedupeWindowMs);
578
+ function touch(key, now) {
579
+ // refresh insertion order
580
+ if (cache.has(key))
581
+ cache.delete(key);
582
+ cache.set(key, now);
583
+ if (maxKeys > 0) {
584
+ while (cache.size > maxKeys) {
585
+ const first = cache.keys().next().value;
586
+ if (!first)
587
+ break;
588
+ cache.delete(first);
589
+ }
590
+ }
591
+ }
592
+ return (key) => {
593
+ if (!key)
594
+ return true;
595
+ if (windowMs <= 0 || maxKeys === 0)
596
+ return true;
597
+ const now = Date.now();
598
+ const last = cache.get(key);
599
+ if (typeof last === 'number' && now - last < windowMs)
600
+ return false;
601
+ touch(key, now);
602
+ return true;
603
+ };
604
+ }
605
+ function buildErrorKey(type, payload) {
606
+ // 使用最核心、最稳定的字段构造签名,避免把瞬态字段(如 time)带入导致失效
607
+ const parts = [
608
+ type,
609
+ String(payload.source ?? ''),
610
+ String(payload.pagePath ?? ''),
611
+ String(payload.message ?? ''),
612
+ String(payload.errorName ?? ''),
613
+ String(payload.stack ?? ''),
614
+ String(payload.filename ?? ''),
615
+ String(payload.lineno ?? ''),
616
+ String(payload.colno ?? ''),
617
+ String(payload.tagName ?? ''),
618
+ String(payload.resourceUrl ?? ''),
619
+ ];
620
+ return parts.join('|');
621
+ }
572
622
  function installBrowserErrorMonitor(report, options) {
573
623
  if (typeof window === 'undefined')
574
624
  return;
@@ -576,6 +626,7 @@ function installBrowserErrorMonitor(report, options) {
576
626
  if (w.__beLinkClsLoggerErrorInstalled__)
577
627
  return;
578
628
  w.__beLinkClsLoggerErrorInstalled__ = true;
629
+ const shouldReport = createDedupeGuard(options);
579
630
  window.addEventListener('error', (event) => {
580
631
  try {
581
632
  if (!sampleHit$1(options.sampleRate))
@@ -598,6 +649,8 @@ function installBrowserErrorMonitor(report, options) {
598
649
  if (e.stack)
599
650
  payload.stack = e.stack;
600
651
  }
652
+ if (!shouldReport(buildErrorKey(options.reportType, payload)))
653
+ return;
601
654
  report(options.reportType, payload);
602
655
  return;
603
656
  }
@@ -609,6 +662,8 @@ function installBrowserErrorMonitor(report, options) {
609
662
  payload.source = 'resource.error';
610
663
  payload.tagName = tagName;
611
664
  payload.resourceUrl = truncate$2(url, 2000);
665
+ if (!shouldReport(buildErrorKey(options.reportType, payload)))
666
+ return;
612
667
  report(options.reportType, payload);
613
668
  }
614
669
  }
@@ -629,6 +684,8 @@ function installBrowserErrorMonitor(report, options) {
629
684
  errorName: e.name,
630
685
  stack: e.stack,
631
686
  };
687
+ if (!shouldReport(buildErrorKey(options.reportType, payload)))
688
+ return;
632
689
  report(options.reportType, payload);
633
690
  }
634
691
  catch {
@@ -641,6 +698,7 @@ function installMiniProgramErrorMonitor(report, options) {
641
698
  if (g.__beLinkClsLoggerMpErrorInstalled__)
642
699
  return;
643
700
  g.__beLinkClsLoggerMpErrorInstalled__ = true;
701
+ const shouldReport = createDedupeGuard(options);
644
702
  const wxAny = globalThis.wx;
645
703
  // wx.* 事件(兼容在 App 已经创建后的场景)
646
704
  try {
@@ -649,10 +707,13 @@ function installMiniProgramErrorMonitor(report, options) {
649
707
  try {
650
708
  if (!sampleHit$1(options.sampleRate))
651
709
  return;
652
- report(options.reportType, {
710
+ const payload = {
653
711
  source: 'wx.onError',
654
712
  message: truncate$2(String(msg ?? ''), options.maxTextLength),
655
- });
713
+ };
714
+ if (!shouldReport(buildErrorKey(options.reportType, payload)))
715
+ return;
716
+ report(options.reportType, payload);
656
717
  }
657
718
  catch {
658
719
  // ignore
@@ -670,12 +731,15 @@ function installMiniProgramErrorMonitor(report, options) {
670
731
  if (!sampleHit$1(options.sampleRate))
671
732
  return;
672
733
  const e = normalizeErrorLike(res?.reason, options.maxTextLength);
673
- report(options.reportType, {
734
+ const payload = {
674
735
  source: 'wx.onUnhandledRejection',
675
736
  message: e.message,
676
737
  errorName: e.name,
677
738
  stack: e.stack,
678
- });
739
+ };
740
+ if (!shouldReport(buildErrorKey(options.reportType, payload)))
741
+ return;
742
+ report(options.reportType, payload);
679
743
  }
680
744
  catch {
681
745
  // ignore
@@ -697,10 +761,12 @@ function installMiniProgramErrorMonitor(report, options) {
697
761
  next.onError = function (...args) {
698
762
  try {
699
763
  if (sampleHit$1(options.sampleRate)) {
700
- report(options.reportType, {
764
+ const payload = {
701
765
  source: 'App.onError',
702
766
  message: truncate$2(String(args?.[0] ?? ''), options.maxTextLength),
703
- });
767
+ };
768
+ if (shouldReport(buildErrorKey(options.reportType, payload)))
769
+ report(options.reportType, payload);
704
770
  }
705
771
  }
706
772
  catch {
@@ -716,12 +782,14 @@ function installMiniProgramErrorMonitor(report, options) {
716
782
  if (sampleHit$1(options.sampleRate)) {
717
783
  const reason = args?.[0]?.reason ?? args?.[0];
718
784
  const e = normalizeErrorLike(reason, options.maxTextLength);
719
- report(options.reportType, {
785
+ const payload = {
720
786
  source: 'App.onUnhandledRejection',
721
787
  message: e.message,
722
788
  errorName: e.name,
723
789
  stack: e.stack,
724
- });
790
+ };
791
+ if (shouldReport(buildErrorKey(options.reportType, payload)))
792
+ report(options.reportType, payload);
725
793
  }
726
794
  }
727
795
  catch {
@@ -750,6 +818,8 @@ function installErrorMonitor(report, opts = {}) {
750
818
  sampleRate: raw.sampleRate ?? 1,
751
819
  captureResourceError: raw.captureResourceError ?? true,
752
820
  maxTextLength: raw.maxTextLength ?? DEFAULT_MAX_TEXT,
821
+ dedupeWindowMs: raw.dedupeWindowMs ?? DEFAULT_DEDUPE_WINDOW_MS,
822
+ dedupeMaxKeys: raw.dedupeMaxKeys ?? DEFAULT_DEDUPE_MAX_KEYS,
753
823
  };
754
824
  if (isMiniProgramEnv()) {
755
825
  installMiniProgramErrorMonitor(report, options);
package/dist/index.js CHANGED
@@ -540,6 +540,8 @@ function installRequestMonitor(report, opts = {}) {
540
540
  }
541
541
 
542
542
  const DEFAULT_MAX_TEXT = 4000;
543
+ const DEFAULT_DEDUPE_WINDOW_MS = 3000;
544
+ const DEFAULT_DEDUPE_MAX_KEYS = 200;
543
545
  function truncate$2(s, maxLen) {
544
546
  if (!s)
545
547
  return s;
@@ -573,6 +575,54 @@ function normalizeErrorLike(err, maxTextLength) {
573
575
  const message = truncate$2(stringifyLogValue(err), maxTextLength);
574
576
  return { message, name: '', stack: '' };
575
577
  }
578
+ function createDedupeGuard(options) {
579
+ const cache = new Map(); // key -> lastReportAt
580
+ const maxKeys = Math.max(0, options.dedupeMaxKeys);
581
+ const windowMs = Math.max(0, options.dedupeWindowMs);
582
+ function touch(key, now) {
583
+ // refresh insertion order
584
+ if (cache.has(key))
585
+ cache.delete(key);
586
+ cache.set(key, now);
587
+ if (maxKeys > 0) {
588
+ while (cache.size > maxKeys) {
589
+ const first = cache.keys().next().value;
590
+ if (!first)
591
+ break;
592
+ cache.delete(first);
593
+ }
594
+ }
595
+ }
596
+ return (key) => {
597
+ if (!key)
598
+ return true;
599
+ if (windowMs <= 0 || maxKeys === 0)
600
+ return true;
601
+ const now = Date.now();
602
+ const last = cache.get(key);
603
+ if (typeof last === 'number' && now - last < windowMs)
604
+ return false;
605
+ touch(key, now);
606
+ return true;
607
+ };
608
+ }
609
+ function buildErrorKey(type, payload) {
610
+ // 使用最核心、最稳定的字段构造签名,避免把瞬态字段(如 time)带入导致失效
611
+ const parts = [
612
+ type,
613
+ String(payload.source ?? ''),
614
+ String(payload.pagePath ?? ''),
615
+ String(payload.message ?? ''),
616
+ String(payload.errorName ?? ''),
617
+ String(payload.stack ?? ''),
618
+ String(payload.filename ?? ''),
619
+ String(payload.lineno ?? ''),
620
+ String(payload.colno ?? ''),
621
+ String(payload.tagName ?? ''),
622
+ String(payload.resourceUrl ?? ''),
623
+ ];
624
+ return parts.join('|');
625
+ }
576
626
  function installBrowserErrorMonitor(report, options) {
577
627
  if (typeof window === 'undefined')
578
628
  return;
@@ -580,6 +630,7 @@ function installBrowserErrorMonitor(report, options) {
580
630
  if (w.__beLinkClsLoggerErrorInstalled__)
581
631
  return;
582
632
  w.__beLinkClsLoggerErrorInstalled__ = true;
633
+ const shouldReport = createDedupeGuard(options);
583
634
  window.addEventListener('error', (event) => {
584
635
  try {
585
636
  if (!sampleHit$1(options.sampleRate))
@@ -602,6 +653,8 @@ function installBrowserErrorMonitor(report, options) {
602
653
  if (e.stack)
603
654
  payload.stack = e.stack;
604
655
  }
656
+ if (!shouldReport(buildErrorKey(options.reportType, payload)))
657
+ return;
605
658
  report(options.reportType, payload);
606
659
  return;
607
660
  }
@@ -613,6 +666,8 @@ function installBrowserErrorMonitor(report, options) {
613
666
  payload.source = 'resource.error';
614
667
  payload.tagName = tagName;
615
668
  payload.resourceUrl = truncate$2(url, 2000);
669
+ if (!shouldReport(buildErrorKey(options.reportType, payload)))
670
+ return;
616
671
  report(options.reportType, payload);
617
672
  }
618
673
  }
@@ -633,6 +688,8 @@ function installBrowserErrorMonitor(report, options) {
633
688
  errorName: e.name,
634
689
  stack: e.stack,
635
690
  };
691
+ if (!shouldReport(buildErrorKey(options.reportType, payload)))
692
+ return;
636
693
  report(options.reportType, payload);
637
694
  }
638
695
  catch {
@@ -645,6 +702,7 @@ function installMiniProgramErrorMonitor(report, options) {
645
702
  if (g.__beLinkClsLoggerMpErrorInstalled__)
646
703
  return;
647
704
  g.__beLinkClsLoggerMpErrorInstalled__ = true;
705
+ const shouldReport = createDedupeGuard(options);
648
706
  const wxAny = globalThis.wx;
649
707
  // wx.* 事件(兼容在 App 已经创建后的场景)
650
708
  try {
@@ -653,10 +711,13 @@ function installMiniProgramErrorMonitor(report, options) {
653
711
  try {
654
712
  if (!sampleHit$1(options.sampleRate))
655
713
  return;
656
- report(options.reportType, {
714
+ const payload = {
657
715
  source: 'wx.onError',
658
716
  message: truncate$2(String(msg ?? ''), options.maxTextLength),
659
- });
717
+ };
718
+ if (!shouldReport(buildErrorKey(options.reportType, payload)))
719
+ return;
720
+ report(options.reportType, payload);
660
721
  }
661
722
  catch {
662
723
  // ignore
@@ -674,12 +735,15 @@ function installMiniProgramErrorMonitor(report, options) {
674
735
  if (!sampleHit$1(options.sampleRate))
675
736
  return;
676
737
  const e = normalizeErrorLike(res?.reason, options.maxTextLength);
677
- report(options.reportType, {
738
+ const payload = {
678
739
  source: 'wx.onUnhandledRejection',
679
740
  message: e.message,
680
741
  errorName: e.name,
681
742
  stack: e.stack,
682
- });
743
+ };
744
+ if (!shouldReport(buildErrorKey(options.reportType, payload)))
745
+ return;
746
+ report(options.reportType, payload);
683
747
  }
684
748
  catch {
685
749
  // ignore
@@ -701,10 +765,12 @@ function installMiniProgramErrorMonitor(report, options) {
701
765
  next.onError = function (...args) {
702
766
  try {
703
767
  if (sampleHit$1(options.sampleRate)) {
704
- report(options.reportType, {
768
+ const payload = {
705
769
  source: 'App.onError',
706
770
  message: truncate$2(String(args?.[0] ?? ''), options.maxTextLength),
707
- });
771
+ };
772
+ if (shouldReport(buildErrorKey(options.reportType, payload)))
773
+ report(options.reportType, payload);
708
774
  }
709
775
  }
710
776
  catch {
@@ -720,12 +786,14 @@ function installMiniProgramErrorMonitor(report, options) {
720
786
  if (sampleHit$1(options.sampleRate)) {
721
787
  const reason = args?.[0]?.reason ?? args?.[0];
722
788
  const e = normalizeErrorLike(reason, options.maxTextLength);
723
- report(options.reportType, {
789
+ const payload = {
724
790
  source: 'App.onUnhandledRejection',
725
791
  message: e.message,
726
792
  errorName: e.name,
727
793
  stack: e.stack,
728
- });
794
+ };
795
+ if (shouldReport(buildErrorKey(options.reportType, payload)))
796
+ report(options.reportType, payload);
729
797
  }
730
798
  }
731
799
  catch {
@@ -754,6 +822,8 @@ function installErrorMonitor(report, opts = {}) {
754
822
  sampleRate: raw.sampleRate ?? 1,
755
823
  captureResourceError: raw.captureResourceError ?? true,
756
824
  maxTextLength: raw.maxTextLength ?? DEFAULT_MAX_TEXT,
825
+ dedupeWindowMs: raw.dedupeWindowMs ?? DEFAULT_DEDUPE_WINDOW_MS,
826
+ dedupeMaxKeys: raw.dedupeMaxKeys ?? DEFAULT_DEDUPE_MAX_KEYS,
757
827
  };
758
828
  if (isMiniProgramEnv()) {
759
829
  installMiniProgramErrorMonitor(report, options);
package/dist/index.umd.js CHANGED
@@ -540,6 +540,8 @@
540
540
  }
541
541
 
542
542
  const DEFAULT_MAX_TEXT = 4000;
543
+ const DEFAULT_DEDUPE_WINDOW_MS = 3000;
544
+ const DEFAULT_DEDUPE_MAX_KEYS = 200;
543
545
  function truncate$2(s, maxLen) {
544
546
  if (!s)
545
547
  return s;
@@ -573,6 +575,54 @@
573
575
  const message = truncate$2(stringifyLogValue(err), maxTextLength);
574
576
  return { message, name: '', stack: '' };
575
577
  }
578
+ function createDedupeGuard(options) {
579
+ const cache = new Map(); // key -> lastReportAt
580
+ const maxKeys = Math.max(0, options.dedupeMaxKeys);
581
+ const windowMs = Math.max(0, options.dedupeWindowMs);
582
+ function touch(key, now) {
583
+ // refresh insertion order
584
+ if (cache.has(key))
585
+ cache.delete(key);
586
+ cache.set(key, now);
587
+ if (maxKeys > 0) {
588
+ while (cache.size > maxKeys) {
589
+ const first = cache.keys().next().value;
590
+ if (!first)
591
+ break;
592
+ cache.delete(first);
593
+ }
594
+ }
595
+ }
596
+ return (key) => {
597
+ if (!key)
598
+ return true;
599
+ if (windowMs <= 0 || maxKeys === 0)
600
+ return true;
601
+ const now = Date.now();
602
+ const last = cache.get(key);
603
+ if (typeof last === 'number' && now - last < windowMs)
604
+ return false;
605
+ touch(key, now);
606
+ return true;
607
+ };
608
+ }
609
+ function buildErrorKey(type, payload) {
610
+ // 使用最核心、最稳定的字段构造签名,避免把瞬态字段(如 time)带入导致失效
611
+ const parts = [
612
+ type,
613
+ String(payload.source ?? ''),
614
+ String(payload.pagePath ?? ''),
615
+ String(payload.message ?? ''),
616
+ String(payload.errorName ?? ''),
617
+ String(payload.stack ?? ''),
618
+ String(payload.filename ?? ''),
619
+ String(payload.lineno ?? ''),
620
+ String(payload.colno ?? ''),
621
+ String(payload.tagName ?? ''),
622
+ String(payload.resourceUrl ?? ''),
623
+ ];
624
+ return parts.join('|');
625
+ }
576
626
  function installBrowserErrorMonitor(report, options) {
577
627
  if (typeof window === 'undefined')
578
628
  return;
@@ -580,6 +630,7 @@
580
630
  if (w.__beLinkClsLoggerErrorInstalled__)
581
631
  return;
582
632
  w.__beLinkClsLoggerErrorInstalled__ = true;
633
+ const shouldReport = createDedupeGuard(options);
583
634
  window.addEventListener('error', (event) => {
584
635
  try {
585
636
  if (!sampleHit$1(options.sampleRate))
@@ -602,6 +653,8 @@
602
653
  if (e.stack)
603
654
  payload.stack = e.stack;
604
655
  }
656
+ if (!shouldReport(buildErrorKey(options.reportType, payload)))
657
+ return;
605
658
  report(options.reportType, payload);
606
659
  return;
607
660
  }
@@ -613,6 +666,8 @@
613
666
  payload.source = 'resource.error';
614
667
  payload.tagName = tagName;
615
668
  payload.resourceUrl = truncate$2(url, 2000);
669
+ if (!shouldReport(buildErrorKey(options.reportType, payload)))
670
+ return;
616
671
  report(options.reportType, payload);
617
672
  }
618
673
  }
@@ -633,6 +688,8 @@
633
688
  errorName: e.name,
634
689
  stack: e.stack,
635
690
  };
691
+ if (!shouldReport(buildErrorKey(options.reportType, payload)))
692
+ return;
636
693
  report(options.reportType, payload);
637
694
  }
638
695
  catch {
@@ -645,6 +702,7 @@
645
702
  if (g.__beLinkClsLoggerMpErrorInstalled__)
646
703
  return;
647
704
  g.__beLinkClsLoggerMpErrorInstalled__ = true;
705
+ const shouldReport = createDedupeGuard(options);
648
706
  const wxAny = globalThis.wx;
649
707
  // wx.* 事件(兼容在 App 已经创建后的场景)
650
708
  try {
@@ -653,10 +711,13 @@
653
711
  try {
654
712
  if (!sampleHit$1(options.sampleRate))
655
713
  return;
656
- report(options.reportType, {
714
+ const payload = {
657
715
  source: 'wx.onError',
658
716
  message: truncate$2(String(msg ?? ''), options.maxTextLength),
659
- });
717
+ };
718
+ if (!shouldReport(buildErrorKey(options.reportType, payload)))
719
+ return;
720
+ report(options.reportType, payload);
660
721
  }
661
722
  catch {
662
723
  // ignore
@@ -674,12 +735,15 @@
674
735
  if (!sampleHit$1(options.sampleRate))
675
736
  return;
676
737
  const e = normalizeErrorLike(res?.reason, options.maxTextLength);
677
- report(options.reportType, {
738
+ const payload = {
678
739
  source: 'wx.onUnhandledRejection',
679
740
  message: e.message,
680
741
  errorName: e.name,
681
742
  stack: e.stack,
682
- });
743
+ };
744
+ if (!shouldReport(buildErrorKey(options.reportType, payload)))
745
+ return;
746
+ report(options.reportType, payload);
683
747
  }
684
748
  catch {
685
749
  // ignore
@@ -701,10 +765,12 @@
701
765
  next.onError = function (...args) {
702
766
  try {
703
767
  if (sampleHit$1(options.sampleRate)) {
704
- report(options.reportType, {
768
+ const payload = {
705
769
  source: 'App.onError',
706
770
  message: truncate$2(String(args?.[0] ?? ''), options.maxTextLength),
707
- });
771
+ };
772
+ if (shouldReport(buildErrorKey(options.reportType, payload)))
773
+ report(options.reportType, payload);
708
774
  }
709
775
  }
710
776
  catch {
@@ -720,12 +786,14 @@
720
786
  if (sampleHit$1(options.sampleRate)) {
721
787
  const reason = args?.[0]?.reason ?? args?.[0];
722
788
  const e = normalizeErrorLike(reason, options.maxTextLength);
723
- report(options.reportType, {
789
+ const payload = {
724
790
  source: 'App.onUnhandledRejection',
725
791
  message: e.message,
726
792
  errorName: e.name,
727
793
  stack: e.stack,
728
- });
794
+ };
795
+ if (shouldReport(buildErrorKey(options.reportType, payload)))
796
+ report(options.reportType, payload);
729
797
  }
730
798
  }
731
799
  catch {
@@ -754,6 +822,8 @@
754
822
  sampleRate: raw.sampleRate ?? 1,
755
823
  captureResourceError: raw.captureResourceError ?? true,
756
824
  maxTextLength: raw.maxTextLength ?? DEFAULT_MAX_TEXT,
825
+ dedupeWindowMs: raw.dedupeWindowMs ?? DEFAULT_DEDUPE_WINDOW_MS,
826
+ dedupeMaxKeys: raw.dedupeMaxKeys ?? DEFAULT_DEDUPE_MAX_KEYS,
757
827
  };
758
828
  if (isMiniProgramEnv()) {
759
829
  installMiniProgramErrorMonitor(report, options);
package/dist/types.d.ts CHANGED
@@ -155,6 +155,18 @@ export interface ErrorMonitorOptions {
155
155
  captureResourceError?: boolean;
156
156
  /** stack/message 最大长度(超出截断),默认 4000 */
157
157
  maxTextLength?: number;
158
+ /**
159
+ * 错误去重窗口(ms)
160
+ * - 目的:避免同一错误在短时间内频繁触发导致重复上报
161
+ * - 行为:同一“错误签名”在窗口内只会上报一次
162
+ * - 默认:3000
163
+ */
164
+ dedupeWindowMs?: number;
165
+ /**
166
+ * 去重缓存最大 key 数(超过会淘汰最早的 key)
167
+ * - 默认:200
168
+ */
169
+ dedupeMaxKeys?: number;
158
170
  }
159
171
  export interface PerformanceMonitorOptions {
160
172
  /** 是否开启,默认 true */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@be-link/cls-logger",
3
- "version": "1.0.1-beta.2",
3
+ "version": "1.0.1-beta.4",
4
4
  "description": "@be-link cls-logger - 腾讯云 CLS 日志上报封装",
5
5
  "homepage": "https://github.com/snowmountain-top/be-link",
6
6
  "author": "zhuiyi",