logixia 2.0.11 → 2.1.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 (177) hide show
  1. package/README.md +2 -1
  2. package/dist/{async-context-D8um9I5V.js → async-context-Dgl3ZLyb.js} +3 -3
  3. package/dist/{async-context-D8um9I5V.js.map → async-context-Dgl3ZLyb.js.map} +1 -1
  4. package/dist/{async-context-BGUCdYAa.mjs → async-context-fBqC5lNc.mjs} +2 -2
  5. package/dist/{async-context-BGUCdYAa.mjs.map → async-context-fBqC5lNc.mjs.map} +1 -1
  6. package/dist/{azure-monitor.transport-CbSHOnNX.d.mts → azure-monitor.transport-C5VjvREZ.d.mts} +2 -2
  7. package/dist/{azure-monitor.transport-CbSHOnNX.d.mts.map → azure-monitor.transport-C5VjvREZ.d.mts.map} +1 -1
  8. package/dist/{azure-monitor.transport-Bvf7Xegt.d.ts → azure-monitor.transport-CyHDjHS-.d.ts} +2 -2
  9. package/dist/{azure-monitor.transport-Bvf7Xegt.d.ts.map → azure-monitor.transport-CyHDjHS-.d.ts.map} +1 -1
  10. package/dist/{azure-monitor.transport-CTnfwA0F.mjs → azure-monitor.transport-DGiacfvT.mjs} +4 -4
  11. package/dist/{azure-monitor.transport-CTnfwA0F.mjs.map → azure-monitor.transport-DGiacfvT.mjs.map} +1 -1
  12. package/dist/{azure-monitor.transport-C8KdmsSw.js → azure-monitor.transport-DX3fuK2t.js} +4 -4
  13. package/dist/{azure-monitor.transport-C8KdmsSw.js.map → azure-monitor.transport-DX3fuK2t.js.map} +1 -1
  14. package/dist/azure.d.mts +1 -1
  15. package/dist/azure.d.ts +1 -1
  16. package/dist/azure.js +1 -1
  17. package/dist/azure.mjs +1 -1
  18. package/dist/{batch-buffer-BTQdAXwC.js → batch-buffer-BLmVvJAZ.js} +2 -2
  19. package/dist/{batch-buffer-BTQdAXwC.js.map → batch-buffer-BLmVvJAZ.js.map} +1 -1
  20. package/dist/{batch-buffer-BJqzpfpT.mjs → batch-buffer-CM-lK_Qy.mjs} +2 -2
  21. package/dist/{batch-buffer-BJqzpfpT.mjs.map → batch-buffer-CM-lK_Qy.mjs.map} +1 -1
  22. package/dist/browser.d.mts +2 -0
  23. package/dist/browser.d.mts.map +1 -1
  24. package/dist/browser.d.ts +2 -0
  25. package/dist/browser.d.ts.map +1 -1
  26. package/dist/browser.js +18 -4
  27. package/dist/browser.js.map +1 -1
  28. package/dist/browser.mjs +18 -4
  29. package/dist/browser.mjs.map +1 -1
  30. package/dist/{builder-C6kKEVrU.mjs → builder-CA_dokb4.mjs} +108 -61
  31. package/dist/builder-CA_dokb4.mjs.map +1 -0
  32. package/dist/{builder-Up4YxX7l.js → builder-jMlVYaQa.js} +114 -67
  33. package/dist/builder-jMlVYaQa.js.map +1 -0
  34. package/dist/cloudwatch.d.mts +1 -1
  35. package/dist/cloudwatch.d.ts +1 -1
  36. package/dist/cloudwatch.js +1 -1
  37. package/dist/cloudwatch.mjs +1 -1
  38. package/dist/{cloudwatch.transport-Bl1qzdBx.mjs → cloudwatch.transport-Cr0fEpko.mjs} +5 -5
  39. package/dist/{cloudwatch.transport-Bl1qzdBx.mjs.map → cloudwatch.transport-Cr0fEpko.mjs.map} +1 -1
  40. package/dist/{cloudwatch.transport-CQyT6U91.d.ts → cloudwatch.transport-DdSjUWvu.d.ts} +2 -2
  41. package/dist/{cloudwatch.transport-CQyT6U91.d.ts.map → cloudwatch.transport-DdSjUWvu.d.ts.map} +1 -1
  42. package/dist/{cloudwatch.transport-BoCyxNKO.js → cloudwatch.transport-Lst1Bbmr.js} +5 -5
  43. package/dist/{cloudwatch.transport-BoCyxNKO.js.map → cloudwatch.transport-Lst1Bbmr.js.map} +1 -1
  44. package/dist/{cloudwatch.transport-CjVrI6S4.d.mts → cloudwatch.transport-_hS7Mcc5.d.mts} +2 -2
  45. package/dist/{cloudwatch.transport-CjVrI6S4.d.mts.map → cloudwatch.transport-_hS7Mcc5.d.mts.map} +1 -1
  46. package/dist/correlation.js +2 -2
  47. package/dist/correlation.mjs +2 -2
  48. package/dist/{entry-fields-CJbeaoBs.js → entry-fields-BSLkzw18.js} +3 -3
  49. package/dist/{entry-fields-CJbeaoBs.js.map → entry-fields-BSLkzw18.js.map} +1 -1
  50. package/dist/{entry-fields-D_aNnjg0.mjs → entry-fields-J1OBi24o.mjs} +2 -2
  51. package/dist/{entry-fields-D_aNnjg0.mjs.map → entry-fields-J1OBi24o.mjs.map} +1 -1
  52. package/dist/gcp.d.mts +1 -1
  53. package/dist/gcp.d.ts +1 -1
  54. package/dist/gcp.js +1 -1
  55. package/dist/gcp.mjs +1 -1
  56. package/dist/{gcp.transport-D_NHVZrw.js → gcp.transport-5-ZIjN8r.js} +5 -5
  57. package/dist/{gcp.transport-D_NHVZrw.js.map → gcp.transport-5-ZIjN8r.js.map} +1 -1
  58. package/dist/{gcp.transport-D9SdLPwP.d.mts → gcp.transport-C8VJiEM7.d.mts} +2 -2
  59. package/dist/{gcp.transport-D9SdLPwP.d.mts.map → gcp.transport-C8VJiEM7.d.mts.map} +1 -1
  60. package/dist/{gcp.transport-BCIvdFV-.d.ts → gcp.transport-Ct0BtKFo.d.ts} +2 -2
  61. package/dist/{gcp.transport-BCIvdFV-.d.ts.map → gcp.transport-Ct0BtKFo.d.ts.map} +1 -1
  62. package/dist/{gcp.transport-DOH4bpWM.mjs → gcp.transport-Cw3Qke85.mjs} +5 -5
  63. package/dist/{gcp.transport-DOH4bpWM.mjs.map → gcp.transport-Cw3Qke85.mjs.map} +1 -1
  64. package/dist/{index-BAkPHp5D.d.mts → index-B3ajtXJd.d.mts} +2 -2
  65. package/dist/{index-BAkPHp5D.d.mts.map → index-B3ajtXJd.d.mts.map} +1 -1
  66. package/dist/{index-e7LowmAu.d.ts → index-oqD3WNxf.d.ts} +2 -2
  67. package/dist/{index-e7LowmAu.d.ts.map → index-oqD3WNxf.d.ts.map} +1 -1
  68. package/dist/index.d.mts +8 -7
  69. package/dist/index.d.mts.map +1 -1
  70. package/dist/index.d.ts +8 -7
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +16 -14
  73. package/dist/index.js.map +1 -1
  74. package/dist/index.mjs +9 -8
  75. package/dist/index.mjs.map +1 -1
  76. package/dist/{logitron-logger-DVUdgmBY.d.ts → logitron-logger-Csn3e6Qu.d.ts} +2 -2
  77. package/dist/{logitron-logger-DVUdgmBY.d.ts.map → logitron-logger-Csn3e6Qu.d.ts.map} +1 -1
  78. package/dist/{logitron-logger-DoWmMjYB.d.mts → logitron-logger-fMOkXr8H.d.mts} +2 -2
  79. package/dist/{logitron-logger-DoWmMjYB.d.mts.map → logitron-logger-fMOkXr8H.d.mts.map} +1 -1
  80. package/dist/middleware.d.mts +1 -1
  81. package/dist/middleware.d.ts +1 -1
  82. package/dist/middleware.js +5 -4
  83. package/dist/middleware.js.map +1 -1
  84. package/dist/middleware.mjs +3 -2
  85. package/dist/middleware.mjs.map +1 -1
  86. package/dist/nest.d.mts +47 -15
  87. package/dist/nest.d.mts.map +1 -1
  88. package/dist/nest.d.ts +47 -15
  89. package/dist/nest.d.ts.map +1 -1
  90. package/dist/nest.js +169 -48
  91. package/dist/nest.js.map +1 -1
  92. package/dist/nest.mjs +166 -45
  93. package/dist/nest.mjs.map +1 -1
  94. package/dist/{otel-DH6-G6DR.js → otel-8ypFGG19.js} +319 -66
  95. package/dist/otel-8ypFGG19.js.map +1 -0
  96. package/dist/{otel-DAVxpArV.mjs → otel-b-s2QbY4.mjs} +319 -66
  97. package/dist/otel-b-s2QbY4.mjs.map +1 -0
  98. package/dist/own-property-BWkibepN.js +40 -0
  99. package/dist/own-property-BWkibepN.js.map +1 -0
  100. package/dist/own-property-CjFw9qwZ.mjs +29 -0
  101. package/dist/own-property-CjFw9qwZ.mjs.map +1 -0
  102. package/dist/{safe-stringify-pZOnzGRJ.mjs → safe-stringify-B5p5ktFe.mjs} +2 -2
  103. package/dist/{safe-stringify-pZOnzGRJ.mjs.map → safe-stringify-B5p5ktFe.mjs.map} +1 -1
  104. package/dist/{safe-stringify-CJisLyZ3.js → safe-stringify-J3sh-7YM.js} +5 -5
  105. package/dist/{safe-stringify-CJisLyZ3.js.map → safe-stringify-J3sh-7YM.js.map} +1 -1
  106. package/dist/{search-Crf2IEoA.d.mts → search-B-hJe2N-.d.mts} +7 -3
  107. package/dist/{search-Crf2IEoA.d.mts.map → search-B-hJe2N-.d.mts.map} +1 -1
  108. package/dist/{search-B4eEzrhM.d.ts → search-BlKBLm5D.d.ts} +7 -3
  109. package/dist/{search-B4eEzrhM.d.ts.map → search-BlKBLm5D.d.ts.map} +1 -1
  110. package/dist/{search-CjYl-mo5.mjs → search-CTR4XNHq.mjs} +52 -14
  111. package/dist/search-CTR4XNHq.mjs.map +1 -0
  112. package/dist/{search-CJw_xoQl.js → search-_qx4YzRP.js} +52 -14
  113. package/dist/search-_qx4YzRP.js.map +1 -0
  114. package/dist/search.d.mts +1 -1
  115. package/dist/search.d.ts +1 -1
  116. package/dist/search.js +1 -1
  117. package/dist/search.mjs +1 -1
  118. package/dist/{secret-config-6hdODxBb.js → secret-config--cVTOWwp.js} +6 -5
  119. package/dist/{secret-config-6hdODxBb.js.map → secret-config--cVTOWwp.js.map} +1 -1
  120. package/dist/{secret-config-D1F4MW69.mjs → secret-config-GKmb15Me.mjs} +3 -2
  121. package/dist/{secret-config-D1F4MW69.mjs.map → secret-config-GKmb15Me.mjs.map} +1 -1
  122. package/dist/{sensitive-names-wv27qBQC.mjs → sensitive-names-BiBM6R1X.mjs} +2 -28
  123. package/dist/sensitive-names-BiBM6R1X.mjs.map +1 -0
  124. package/dist/{sensitive-names-CNgHaqv9.js → sensitive-names-NiKIRhp5.js} +1 -39
  125. package/dist/sensitive-names-NiKIRhp5.js.map +1 -0
  126. package/dist/{slack.transport-C6E0l4kw.d.ts → slack.transport-5OPL7H3u.d.mts} +76 -3
  127. package/dist/slack.transport-5OPL7H3u.d.mts.map +1 -0
  128. package/dist/{slack.transport-BDyENuR0.d.mts → slack.transport-BFpBD_Ri.d.ts} +76 -3
  129. package/dist/slack.transport-BFpBD_Ri.d.ts.map +1 -0
  130. package/dist/{slack.transport-CEYBVzUj.js → slack.transport-Cpx5fKga.js} +231 -8
  131. package/dist/slack.transport-Cpx5fKga.js.map +1 -0
  132. package/dist/{slack.transport-YvaLJxNv.mjs → slack.transport-Qwj9WkrJ.mjs} +226 -9
  133. package/dist/slack.transport-Qwj9WkrJ.mjs.map +1 -0
  134. package/dist/testing.d.mts +1 -1
  135. package/dist/testing.d.ts +1 -1
  136. package/dist/{transport.types-CzJq4IrF.d.ts → transport.types-B1ejJJP6.d.mts} +6 -1
  137. package/dist/transport.types-B1ejJJP6.d.mts.map +1 -0
  138. package/dist/{transport.types-CzJq4IrF.d.mts → transport.types-B1ejJJP6.d.ts} +6 -1
  139. package/dist/transport.types-B1ejJJP6.d.ts.map +1 -0
  140. package/dist/transports.d.mts +61 -11
  141. package/dist/transports.d.mts.map +1 -1
  142. package/dist/transports.d.ts +61 -11
  143. package/dist/transports.d.ts.map +1 -1
  144. package/dist/transports.js +7 -6
  145. package/dist/transports.mjs +7 -7
  146. package/dist/worker-entry.js +91 -11
  147. package/dist/worker.d.mts +1 -1
  148. package/dist/worker.d.ts +1 -1
  149. package/dist/worker.js +1 -1
  150. package/dist/worker.mjs +1 -1
  151. package/dist/{worker.transport-B9mCQSM1.d.ts → worker.transport-B7olL1Uh.d.ts} +12 -2
  152. package/dist/worker.transport-B7olL1Uh.d.ts.map +1 -0
  153. package/dist/{worker.transport-DgK_ZXlB.mjs → worker.transport-BHnWDXPH.mjs} +40 -2
  154. package/dist/worker.transport-BHnWDXPH.mjs.map +1 -0
  155. package/dist/{worker.transport-CwNpH98o.js → worker.transport-C7jNGhev.js} +40 -2
  156. package/dist/worker.transport-C7jNGhev.js.map +1 -0
  157. package/dist/{worker.transport-Bl8lFRck.d.mts → worker.transport-DnU0_9Bd.d.mts} +12 -2
  158. package/dist/worker.transport-DnU0_9Bd.d.mts.map +1 -0
  159. package/package.json +1 -1
  160. package/dist/builder-C6kKEVrU.mjs.map +0 -1
  161. package/dist/builder-Up4YxX7l.js.map +0 -1
  162. package/dist/otel-DAVxpArV.mjs.map +0 -1
  163. package/dist/otel-DH6-G6DR.js.map +0 -1
  164. package/dist/search-CJw_xoQl.js.map +0 -1
  165. package/dist/search-CjYl-mo5.mjs.map +0 -1
  166. package/dist/sensitive-names-CNgHaqv9.js.map +0 -1
  167. package/dist/sensitive-names-wv27qBQC.mjs.map +0 -1
  168. package/dist/slack.transport-BDyENuR0.d.mts.map +0 -1
  169. package/dist/slack.transport-C6E0l4kw.d.ts.map +0 -1
  170. package/dist/slack.transport-CEYBVzUj.js.map +0 -1
  171. package/dist/slack.transport-YvaLJxNv.mjs.map +0 -1
  172. package/dist/transport.types-CzJq4IrF.d.mts.map +0 -1
  173. package/dist/transport.types-CzJq4IrF.d.ts.map +0 -1
  174. package/dist/worker.transport-B9mCQSM1.d.ts.map +0 -1
  175. package/dist/worker.transport-Bl8lFRck.d.mts.map +0 -1
  176. package/dist/worker.transport-CwNpH98o.js.map +0 -1
  177. package/dist/worker.transport-DgK_ZXlB.mjs.map +0 -1
@@ -1,11 +1,12 @@
1
- import { a as buildNameSet, n as DEFAULT_REDACT_QUERY_PARAMS, o as redactUrlQuery, r as SENSITIVE_KEY_NAMES, s as redactUrlsInText, u as assignOwn } from "./sensitive-names-wv27qBQC.mjs";
1
+ import { t as assignOwn } from "./own-property-CjFw9qwZ.mjs";
2
2
  import { o as TraceContext } from "./request-trace-Dekcnenb.mjs";
3
- import { t as LogixiaContext } from "./async-context-BGUCdYAa.mjs";
4
- import { n as protectSecrets } from "./secret-config-D1F4MW69.mjs";
3
+ import { t as LogixiaContext } from "./async-context-fBqC5lNc.mjs";
4
+ import { a as buildNameSet, n as DEFAULT_REDACT_QUERY_PARAMS, o as redactUrlQuery, r as SENSITIVE_KEY_NAMES, s as redactUrlsInText } from "./sensitive-names-BiBM6R1X.mjs";
5
+ import { n as protectSecrets } from "./secret-config-GKmb15Me.mjs";
5
6
  import { n as internalLog, r as internalWarn, t as internalError } from "./internal-log-Cy5nF1ZL.mjs";
7
+ import { i as stringifyForLog } from "./safe-stringify-B5p5ktFe.mjs";
6
8
  import { n as safeToString } from "./csv.utils-ZdxSod5g.mjs";
7
- import { i as stringifyForLog } from "./safe-stringify-pZOnzGRJ.mjs";
8
- import { c as TransportManager, n as _getOtelPayloadIfEnabled, r as _isOtelBridgeEnabled, v as stripControlChars } from "./otel-DAVxpArV.mjs";
9
+ import { c as TransportManager, n as _getOtelPayloadIfEnabled, r as _isOtelBridgeEnabled, v as stripControlChars } from "./otel-b-s2QbY4.mjs";
9
10
  import { constants } from "node:os";
10
11
  // src/types/index.ts
11
12
  const LogLevel = {
@@ -711,12 +712,28 @@ function isCacheableTraceId(id) {
711
712
  }
712
713
  return true;
713
714
  }
715
+ /** Maps a trace id to a stable number in [0, 1): FNV-1a followed by a murmur3 finalizer. */
716
+ function traceFraction(id) {
717
+ let h = 2166136261;
718
+ for (let i = 0; i < id.length; i++) {
719
+ h ^= id.charCodeAt(i);
720
+ h = Math.imul(h, 16777619);
721
+ }
722
+ h ^= h >>> 16;
723
+ h = Math.imul(h, 2246822507);
724
+ h ^= h >>> 13;
725
+ h = Math.imul(h, 3266489909);
726
+ h ^= h >>> 16;
727
+ return (h >>> 0) / 4294967296;
728
+ }
729
+ const ADAPTIVE_BUCKETS = 100;
714
730
  var Sampler = class {
715
731
  config;
716
732
  /**
717
- * Per-trace decisions in LRU order (Map preserves insertion order; a hit
718
- * re-inserts the key). Survives resetStats() so a long trace is not re-decided
719
- * mid-flight. Bounded by size, by an idle TTL (refreshed on hit) and by a hard
733
+ * Per-trace sampling fractions in LRU order (Map preserves insertion order; a
734
+ * hit re-inserts the key). A trace is kept at a level when its fraction is below
735
+ * that level's rate, so it is never fixed by the first level seen. Survives
736
+ * resetStats() so a long trace is not re-evaluated mid-flight. Bounded by size, by an idle TTL (refreshed on hit) and by a hard
720
737
  * lifetime measured from the first decision.
721
738
  */
722
739
  traceDecisions = /* @__PURE__ */ new Map();
@@ -725,8 +742,11 @@ var Sampler = class {
725
742
  traceMaxLifetimeMs = 36e5;
726
743
  _tokenBucket = 0;
727
744
  _lastRefillMs = Date.now();
728
- _adaptiveWindow = [];
729
- _adaptiveHead = 0;
745
+ _adaptiveBucketMs;
746
+ _adaptiveTotals = new Float64Array(ADAPTIVE_BUCKETS);
747
+ _adaptiveErrorCounts = new Float64Array(ADAPTIVE_BUCKETS);
748
+ _adaptiveBucket = 0;
749
+ _adaptiveTotal = 0;
730
750
  _adaptiveErrors = 0;
731
751
  _stats = {
732
752
  evaluated: 0,
@@ -737,7 +757,9 @@ var Sampler = class {
737
757
  };
738
758
  _statsTimer;
739
759
  constructor(config, onStats) {
760
+ var _config$adaptive;
740
761
  this.config = config;
762
+ this._adaptiveBucketMs = Math.max(1, Math.ceil((((_config$adaptive = config.adaptive) === null || _config$adaptive === void 0 ? void 0 : _config$adaptive.windowMs) ?? 1e4) / ADAPTIVE_BUCKETS));
741
763
  if (config.maxLogsPerSecond && config.maxLogsPerSecond > 0) this._tokenBucket = config.maxLogsPerSecond;
742
764
  const interval = config.statsIntervalMs ?? 6e4;
743
765
  if (interval > 0 && onStats) {
@@ -795,34 +817,38 @@ var Sampler = class {
795
817
  destroy() {
796
818
  if (this._statsTimer) clearInterval(this._statsTimer);
797
819
  }
798
- _sampleByRate(level) {
820
+ _sampleByRate(level, fraction) {
799
821
  var _this$config$perLevel2, _this$config$perLevel3;
800
822
  const baseRate = ((_this$config$perLevel2 = this.config.perLevel) === null || _this$config$perLevel2 === void 0 ? void 0 : _this$config$perLevel2[level]) ?? ((_this$config$perLevel3 = this.config.perLevel) === null || _this$config$perLevel3 === void 0 ? void 0 : _this$config$perLevel3["*"]) ?? this.config.rate ?? 1;
801
823
  const rate = Math.max(baseRate, this._adaptiveBoostRate());
802
824
  if (rate >= 1) return true;
803
825
  if (rate <= 0) return false;
826
+ if (fraction !== void 0) return fraction < rate;
804
827
  return Math.random() < rate;
805
828
  }
806
- /** Record one evaluated sample and evict entries older than the window. O(1) amortized. */
807
- _recordAdaptiveSample(level) {
808
- var _this$config$adaptive;
809
- const now = Date.now();
810
- const windowMs = ((_this$config$adaptive = this.config.adaptive) === null || _this$config$adaptive === void 0 ? void 0 : _this$config$adaptive.windowMs) ?? 1e4;
811
- const err = level === "error" || level === "fatal";
812
- this._adaptiveWindow.push({
813
- t: now,
814
- err
815
- });
816
- if (err) this._adaptiveErrors += 1;
817
- const cutoff = now - windowMs;
818
- const win = this._adaptiveWindow;
819
- while (this._adaptiveHead < win.length && win[this._adaptiveHead].t < cutoff) {
820
- if (win[this._adaptiveHead].err) this._adaptiveErrors -= 1;
821
- this._adaptiveHead += 1;
829
+ /** Moves the ring forward to the bucket holding `now`, dropping buckets that left the window. */
830
+ _advanceAdaptive(now) {
831
+ const target = Math.floor(now / this._adaptiveBucketMs);
832
+ if (target <= this._adaptiveBucket) return this._adaptiveBucket;
833
+ const steps = Math.min(target - this._adaptiveBucket, ADAPTIVE_BUCKETS);
834
+ for (let i = 1; i <= steps; i++) {
835
+ const slot = (this._adaptiveBucket + i) % ADAPTIVE_BUCKETS;
836
+ this._adaptiveTotal -= this._adaptiveTotals[slot];
837
+ this._adaptiveErrors -= this._adaptiveErrorCounts[slot];
838
+ this._adaptiveTotals[slot] = 0;
839
+ this._adaptiveErrorCounts[slot] = 0;
822
840
  }
823
- if (this._adaptiveHead >= 1024 && this._adaptiveHead * 2 >= win.length) {
824
- this._adaptiveWindow = win.slice(this._adaptiveHead);
825
- this._adaptiveHead = 0;
841
+ this._adaptiveBucket = target;
842
+ return target;
843
+ }
844
+ /** Record one evaluated sample in the current bucket. O(1). */
845
+ _recordAdaptiveSample(level) {
846
+ const slot = this._advanceAdaptive(Date.now()) % ADAPTIVE_BUCKETS;
847
+ this._adaptiveTotals[slot] += 1;
848
+ this._adaptiveTotal += 1;
849
+ if (level === "error" || level === "fatal") {
850
+ this._adaptiveErrorCounts[slot] += 1;
851
+ this._adaptiveErrors += 1;
826
852
  }
827
853
  }
828
854
  /**
@@ -833,8 +859,9 @@ var Sampler = class {
833
859
  _adaptiveBoostRate() {
834
860
  const cfg = this.config.adaptive;
835
861
  if (!cfg) return 0;
862
+ this._advanceAdaptive(Date.now());
836
863
  const minSamples = cfg.minSamples ?? 20;
837
- const total = this._adaptiveWindow.length - this._adaptiveHead;
864
+ const total = this._adaptiveTotal;
838
865
  if (total < minSamples) return 0;
839
866
  return this._adaptiveErrors / total >= (cfg.errorRateThreshold ?? .05) ? cfg.boostRate ?? 1 : 0;
840
867
  }
@@ -843,8 +870,9 @@ var Sampler = class {
843
870
  return this._adaptiveBoostRate() > 0;
844
871
  }
845
872
  /**
846
- * Return the cached decision for a trace, or make and cache a new one. Entries
847
- * idle past the TTL, or older than the hard lifetime, are re-decided; the least
873
+ * Decide a trace by comparing its stable fraction with the level's rate, caching
874
+ * the fraction. Entries idle past the TTL, or older than the hard lifetime, are
875
+ * recomputed; the least
848
876
  * recently used entry is evicted once the cap is reached. IDs that are empty,
849
877
  * too long or contain control characters are sampled independently and never cached.
850
878
  */
@@ -856,12 +884,12 @@ var Sampler = class {
856
884
  this.traceDecisions.delete(traceId);
857
885
  known.seenAt = now;
858
886
  this.traceDecisions.set(traceId, known);
859
- return known.emit;
887
+ return this._sampleByRate(level, known.fraction);
860
888
  }
861
- const emit = this._sampleByRate(level);
889
+ const fraction = traceFraction(traceId);
862
890
  this.traceDecisions.delete(traceId);
863
891
  this.traceDecisions.set(traceId, {
864
- emit,
892
+ fraction,
865
893
  firstAt: now,
866
894
  seenAt: now
867
895
  });
@@ -869,7 +897,7 @@ var Sampler = class {
869
897
  const oldest = this.traceDecisions.keys().next().value;
870
898
  if (oldest !== void 0) this.traceDecisions.delete(oldest);
871
899
  }
872
- return emit;
900
+ return this._sampleByRate(level, fraction);
873
901
  }
874
902
  _consumeToken() {
875
903
  const now = Date.now();
@@ -946,7 +974,8 @@ function deregisterFromShutdown(logger) {
946
974
  * the process exits. Idempotent — the first call wins and later calls with
947
975
  * conflicting options print a warning. The process is ended with 128 + signal
948
976
  * number only when logixia's handler is the sole listener for that signal (see
949
- * `exit`); otherwise it just flushes and leaves shutdown to the application.
977
+ * `exit`), closing the loggers first; otherwise it only flushes them and leaves
978
+ * shutdown to the application.
950
979
  * Loggers are also flushed (not closed) on `beforeExit`.
951
980
  *
952
981
  * @example
@@ -973,7 +1002,8 @@ function flushOnExit(options = {}) {
973
1002
  }, timeout).unref() : void 0;
974
1003
  try {
975
1004
  if (beforeFlush) await beforeFlush();
976
- await Promise.allSettled([...registry].map((logger) => logger.close()));
1005
+ const ownsExit = shouldExit(signal);
1006
+ await Promise.allSettled([...registry].map((logger) => ownsExit || !logger.flush ? logger.close() : logger.flush()));
977
1007
  if (afterFlush) await afterFlush();
978
1008
  } catch (err) {
979
1009
  process.stderr.write(`[logixia] Shutdown hook failed: ${String(err)}\n`);
@@ -1094,6 +1124,7 @@ function nowIso() {
1094
1124
  return _tsCacheStr;
1095
1125
  }
1096
1126
  const RESOLVED = Promise.resolve();
1127
+ const UNSERIALIZABLE = "[Unserializable]";
1097
1128
  const JSON_STRING_FIELDS = [
1098
1129
  "timestamp",
1099
1130
  "level",
@@ -1130,6 +1161,21 @@ function toContextLabel(context) {
1130
1161
  if (context === void 0 || context === null) return "";
1131
1162
  return typeof context === "string" ? context : safeToString(context);
1132
1163
  }
1164
+ function serializeErrorSafely(error) {
1165
+ try {
1166
+ return serializeError(error);
1167
+ } catch (cause) {
1168
+ internalError("Error serialization failed", cause);
1169
+ return UNSERIALIZABLE;
1170
+ }
1171
+ }
1172
+ function errorMessageSafely(error) {
1173
+ try {
1174
+ return safeToString(error.message);
1175
+ } catch {
1176
+ return UNSERIALIZABLE;
1177
+ }
1178
+ }
1133
1179
  function namespacePatternToRegex(pattern) {
1134
1180
  const escaped = pattern.split(".").map((s) => s === "*" ? "[^.]+" : s.replace(/[$()*+.?[\\\]^{|}]/g, "\\$&")).join("\\.");
1135
1181
  return new RegExp(`^${escaped}$`);
@@ -1345,19 +1391,25 @@ var LogixiaLogger = class LogixiaLogger {
1345
1391
  });
1346
1392
  }
1347
1393
  createCustomLevelMethods() {
1348
- var _this$config$levelOpt3, _this$config$levelOpt4;
1349
- warnOnReservedLevelNames((_this$config$levelOpt3 = this.config.levelOptions) === null || _this$config$levelOpt3 === void 0 ? void 0 : _this$config$levelOpt3.levels);
1350
- if ((_this$config$levelOpt4 = this.config.levelOptions) === null || _this$config$levelOpt4 === void 0 ? void 0 : _this$config$levelOpt4.levels) {
1351
- for (const levelName of Object.keys(this.config.levelOptions.levels)) if (!this[levelName.toLowerCase()]) this[levelName.toLowerCase()] = (message, data) => this.logLevel(levelName.toLowerCase(), message, data);
1352
- }
1394
+ var _this$config$levelOpt3;
1395
+ const levels = (_this$config$levelOpt3 = this.config.levelOptions) === null || _this$config$levelOpt3 === void 0 ? void 0 : _this$config$levelOpt3.levels;
1396
+ warnOnReservedLevelNames(levels);
1397
+ if (!levels) return;
1398
+ const self = this;
1399
+ const names = Object.keys(levels);
1400
+ const define = (method, levelName) => {
1401
+ if (!self[method]) self[method] = (message, data) => this.logLevel(levelName, message, data);
1402
+ };
1403
+ for (const levelName of names) define(levelName, levelName);
1404
+ for (const levelName of names) define(levelName.toLowerCase(), levelName);
1353
1405
  }
1354
1406
  /**
1355
1407
  * Rebuild all hot-path caches after any config mutation or level change.
1356
1408
  * Keeps the actual log() call free of allocations in the common case.
1357
1409
  */
1358
1410
  _buildPerfCaches() {
1359
- var _this$config$levelOpt5, _this$config$format, _this$config$redact$p, _this$config$redact$p2;
1360
- const customLevelEntries = Object.entries(((_this$config$levelOpt5 = this.config.levelOptions) === null || _this$config$levelOpt5 === void 0 ? void 0 : _this$config$levelOpt5.levels) ?? {});
1411
+ var _this$config$levelOpt4, _this$config$format, _this$config$redact$p, _this$config$redact$p2;
1412
+ const customLevelEntries = Object.entries(((_this$config$levelOpt4 = this.config.levelOptions) === null || _this$config$levelOpt4 === void 0 ? void 0 : _this$config$levelOpt4.levels) ?? {});
1361
1413
  this._levelValues = new Map([
1362
1414
  [LogLevel.ERROR, 0],
1363
1415
  [LogLevel.WARN, 1],
@@ -1426,8 +1478,8 @@ var LogixiaLogger = class LogixiaLogger {
1426
1478
  for (const [lvl] of this._levelValues) {
1427
1479
  const upper = lvl.toUpperCase();
1428
1480
  if (colorize && this._fieldCache.get("level") !== false) {
1429
- var _this$config$levelOpt6;
1430
- let colorName = (_this$config$levelOpt6 = this.config.levelOptions) === null || _this$config$levelOpt6 === void 0 || (_this$config$levelOpt6 = _this$config$levelOpt6.colors) === null || _this$config$levelOpt6 === void 0 ? void 0 : _this$config$levelOpt6[lvl];
1481
+ var _this$config$levelOpt5;
1482
+ let colorName = (_this$config$levelOpt5 = this.config.levelOptions) === null || _this$config$levelOpt5 === void 0 || (_this$config$levelOpt5 = _this$config$levelOpt5.colors) === null || _this$config$levelOpt5 === void 0 ? void 0 : _this$config$levelOpt5[lvl];
1431
1483
  if (!colorName) {
1432
1484
  if (_BUILTIN_LEVELS.has(lvl)) colorName = "white";
1433
1485
  else {
@@ -1452,9 +1504,9 @@ var LogixiaLogger = class LogixiaLogger {
1452
1504
  */
1453
1505
  error(messageOrError, data) {
1454
1506
  try {
1455
- return isError(messageOrError) ? this._run("error", messageOrError.message, {
1507
+ return isError(messageOrError) ? this._run("error", errorMessageSafely(messageOrError), {
1456
1508
  ...data,
1457
- error: serializeError(messageOrError)
1509
+ error: serializeErrorSafely(messageOrError)
1458
1510
  }) : this._run("error", messageOrError, data);
1459
1511
  } catch (error) {
1460
1512
  return Promise.reject(error);
@@ -1574,8 +1626,8 @@ var LogixiaLogger = class LogixiaLogger {
1574
1626
  * else a `NODE_ENV` default (`debug` in development, `warn` in test), else `info`.
1575
1627
  */
1576
1628
  getLevel() {
1577
- var _this$config$levelOpt7;
1578
- return ((_this$config$levelOpt7 = this.config.levelOptions) === null || _this$config$levelOpt7 === void 0 ? void 0 : _this$config$levelOpt7.level) ?? LogLevel.INFO;
1629
+ var _this$config$levelOpt6;
1630
+ return ((_this$config$levelOpt6 = this.config.levelOptions) === null || _this$config$levelOpt6 === void 0 ? void 0 : _this$config$levelOpt6.level) ?? LogLevel.INFO;
1579
1631
  }
1580
1632
  _validLevelList() {
1581
1633
  return [...this._levelValues.keys()].join(", ");
@@ -1639,6 +1691,7 @@ var LogixiaLogger = class LogixiaLogger {
1639
1691
  /** Set the context label (e.g. a class or module name) attached to every subsequent entry. */
1640
1692
  setContext(context) {
1641
1693
  this.context = typeof context === "string" ? context : safeToString(context);
1694
+ this._syncNamespaceLevels();
1642
1695
  }
1643
1696
  /** Return the current context label, or `undefined` if none is set. */
1644
1697
  getContext() {
@@ -1807,7 +1860,7 @@ var LogixiaLogger = class LogixiaLogger {
1807
1860
  const config = this.config;
1808
1861
  if (config.silent) return;
1809
1862
  if (!this.shouldLog(level)) return;
1810
- const data = rawData instanceof Error ? { error: serializeError(rawData) } : rawData;
1863
+ const data = rawData instanceof Error ? { error: serializeErrorSafely(rawData) } : rawData;
1811
1864
  const alsContext = LogixiaContext.get();
1812
1865
  let activeTraceId;
1813
1866
  if (config.traceId) {
@@ -2034,13 +2087,7 @@ var LogixiaLogger = class LogixiaLogger {
2034
2087
  * ```
2035
2088
  */
2036
2089
  function createLogger(config, context) {
2037
- var _config$levelOptions3;
2038
- const logger = new LogixiaLogger(config, context);
2039
- const mutableLogger = logger;
2040
- if ((_config$levelOptions3 = config.levelOptions) === null || _config$levelOptions3 === void 0 ? void 0 : _config$levelOptions3.levels) {
2041
- for (const levelName of Object.keys(config.levelOptions.levels)) if (!mutableLogger[levelName]) mutableLogger[levelName] = (message, data) => logger.logLevel(levelName, message, data);
2042
- }
2043
- return logger;
2090
+ return new LogixiaLogger(config, context);
2044
2091
  }
2045
2092
  // src/exceptions/exception.ts
2046
2093
  var LogixiaException = class extends Error {
@@ -2283,4 +2330,4 @@ var ErrorResponseBuilder = class {
2283
2330
  };
2284
2331
  export { DEFAULT_LOG_COLORS as C, DEFAULT_CONFIG as S, LogLevel as T, serializeError as _, isLogixiaException as a, globalPluginRegistry as b, _shutdownRegistrySize as c, registerForShutdown as d, resetShutdownHandlers as f, normalizeError as g, isError as h, LogixiaException as i, deregisterFromShutdown as l, redactObject as m, generateRequestId as n, LogixiaLogger as o, applyRedaction as p, generateTraceId as r, createLogger as s, ErrorResponseBuilder as t, flushOnExit as u, serializeNestedErrors as v, DEFAULT_LOG_LEVELS as w, usePlugin as x, PluginRegistry as y };
2285
2332
 
2286
- //# sourceMappingURL=builder-C6kKEVrU.mjs.map
2333
+ //# sourceMappingURL=builder-CA_dokb4.mjs.map