logixia 1.12.4 → 1.12.6

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 (166) hide show
  1. package/README.md +80 -27
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/async-context-CSHWoHMB.js +88 -0
  4. package/dist/async-context-CSHWoHMB.js.map +1 -0
  5. package/dist/async-context-CwBNMm2E.mjs +68 -0
  6. package/dist/async-context-CwBNMm2E.mjs.map +1 -0
  7. package/dist/azure-monitor.transport-CG7ClkYj.d.ts +62 -0
  8. package/dist/azure-monitor.transport-CG7ClkYj.d.ts.map +1 -0
  9. package/dist/azure-monitor.transport-CHnjVRF-.mjs +152 -0
  10. package/dist/azure-monitor.transport-CHnjVRF-.mjs.map +1 -0
  11. package/dist/azure-monitor.transport-Cm74kXZS.d.mts +62 -0
  12. package/dist/azure-monitor.transport-Cm74kXZS.d.mts.map +1 -0
  13. package/dist/azure-monitor.transport-CrvfHd9C.js +157 -0
  14. package/dist/azure-monitor.transport-CrvfHd9C.js.map +1 -0
  15. package/dist/azure.d.mts +3 -0
  16. package/dist/azure.d.ts +3 -0
  17. package/dist/azure.js +6 -0
  18. package/dist/azure.mjs +6 -0
  19. package/dist/batch-buffer-BY-mRWIK.js +170 -0
  20. package/dist/batch-buffer-BY-mRWIK.js.map +1 -0
  21. package/dist/batch-buffer-PGvSgbmd.mjs +132 -0
  22. package/dist/batch-buffer-PGvSgbmd.mjs.map +1 -0
  23. package/dist/browser.d.mts +427 -0
  24. package/dist/browser.d.mts.map +1 -0
  25. package/dist/browser.d.ts +427 -0
  26. package/dist/browser.d.ts.map +1 -0
  27. package/dist/browser.js +590 -0
  28. package/dist/browser.js.map +1 -0
  29. package/dist/browser.mjs +586 -0
  30. package/dist/browser.mjs.map +1 -0
  31. package/dist/chunk-DLSkYcPk.mjs +7 -0
  32. package/dist/chunk-nOFOJqeH.js +30 -0
  33. package/dist/cloudwatch.d.mts +3 -0
  34. package/dist/cloudwatch.d.ts +3 -0
  35. package/dist/cloudwatch.js +6 -0
  36. package/dist/cloudwatch.mjs +6 -0
  37. package/dist/cloudwatch.transport-CGHY4buE.d.mts +81 -0
  38. package/dist/cloudwatch.transport-CGHY4buE.d.mts.map +1 -0
  39. package/dist/cloudwatch.transport-DK_8cKd3.d.ts +81 -0
  40. package/dist/cloudwatch.transport-DK_8cKd3.d.ts.map +1 -0
  41. package/dist/cloudwatch.transport-pNBNWJLt.js +370 -0
  42. package/dist/cloudwatch.transport-pNBNWJLt.js.map +1 -0
  43. package/dist/cloudwatch.transport-yBwm4OeO.mjs +360 -0
  44. package/dist/cloudwatch.transport-yBwm4OeO.mjs.map +1 -0
  45. package/dist/coerce.utils-BN980Y9V.js +44 -0
  46. package/dist/coerce.utils-BN980Y9V.js.map +1 -0
  47. package/dist/coerce.utils-Dxv4_ikC.mjs +38 -0
  48. package/dist/coerce.utils-Dxv4_ikC.mjs.map +1 -0
  49. package/dist/correlation.d.mts +238 -0
  50. package/dist/correlation.d.mts.map +1 -0
  51. package/dist/correlation.d.ts +238 -0
  52. package/dist/correlation.d.ts.map +1 -0
  53. package/dist/correlation.js +272 -0
  54. package/dist/correlation.js.map +1 -0
  55. package/dist/correlation.mjs +261 -0
  56. package/dist/correlation.mjs.map +1 -0
  57. package/dist/gcp.d.mts +3 -0
  58. package/dist/gcp.d.ts +3 -0
  59. package/dist/gcp.js +6 -0
  60. package/dist/gcp.mjs +6 -0
  61. package/dist/gcp.transport-BJuNRFe_.mjs +192 -0
  62. package/dist/gcp.transport-BJuNRFe_.mjs.map +1 -0
  63. package/dist/gcp.transport-BOhkVKlI.d.ts +71 -0
  64. package/dist/gcp.transport-BOhkVKlI.d.ts.map +1 -0
  65. package/dist/gcp.transport-Bi6CUqZR.d.mts +71 -0
  66. package/dist/gcp.transport-Bi6CUqZR.d.mts.map +1 -0
  67. package/dist/gcp.transport-SHdtc1n0.js +198 -0
  68. package/dist/gcp.transport-SHdtc1n0.js.map +1 -0
  69. package/dist/{index-CwFww7VC.d.ts → index-BPKwwERo.d.mts} +18 -174
  70. package/dist/index-BPKwwERo.d.mts.map +1 -0
  71. package/dist/{index-DnyeaoZU.d.mts → index-C1X-TE5I.d.ts} +18 -174
  72. package/dist/index-C1X-TE5I.d.ts.map +1 -0
  73. package/dist/index.d.mts +41 -11
  74. package/dist/index.d.mts.map +1 -1
  75. package/dist/index.d.ts +40 -10
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +87 -147
  78. package/dist/index.js.map +1 -1
  79. package/dist/index.mjs +62 -132
  80. package/dist/index.mjs.map +1 -1
  81. package/dist/internal-log-BUJYMZbE.js +70 -0
  82. package/dist/internal-log-BUJYMZbE.js.map +1 -0
  83. package/dist/internal-log-Cm8SOWSV.mjs +52 -0
  84. package/dist/internal-log-Cm8SOWSV.mjs.map +1 -0
  85. package/dist/{logitron-logger.module-BIGTm2V6.mjs → logitron-logger.module-Bs3XYZgF.mjs} +266 -166
  86. package/dist/logitron-logger.module-Bs3XYZgF.mjs.map +1 -0
  87. package/dist/{logitron-logger.module-BTxDpK6u.js → logitron-logger.module-BsDZR5BH.js} +297 -203
  88. package/dist/logitron-logger.module-BsDZR5BH.js.map +1 -0
  89. package/dist/{logitron-logger.module-BmT-ewin.d.ts → logitron-logger.module-CxT1F6Cm.d.ts} +23 -10
  90. package/dist/logitron-logger.module-CxT1F6Cm.d.ts.map +1 -0
  91. package/dist/{logitron-logger.module-BCq3sF27.d.mts → logitron-logger.module-zDKVd_o0.d.mts} +23 -10
  92. package/dist/logitron-logger.module-zDKVd_o0.d.mts.map +1 -0
  93. package/dist/middleware.d.mts +5 -2
  94. package/dist/middleware.d.mts.map +1 -1
  95. package/dist/middleware.d.ts +5 -2
  96. package/dist/middleware.d.ts.map +1 -1
  97. package/dist/middleware.js +13 -4
  98. package/dist/middleware.js.map +1 -1
  99. package/dist/middleware.mjs +14 -4
  100. package/dist/middleware.mjs.map +1 -1
  101. package/dist/nest.d.mts +3 -2
  102. package/dist/nest.d.mts.map +1 -1
  103. package/dist/nest.d.ts +3 -2
  104. package/dist/nest.d.ts.map +1 -1
  105. package/dist/nest.js +6 -2
  106. package/dist/nest.mjs +6 -2
  107. package/dist/safe-stringify-DJ66tW5I.mjs +118 -0
  108. package/dist/safe-stringify-DJ66tW5I.mjs.map +1 -0
  109. package/dist/safe-stringify-DWo3aZp_.js +142 -0
  110. package/dist/safe-stringify-DWo3aZp_.js.map +1 -0
  111. package/dist/search-CFQRISUv.mjs +1596 -0
  112. package/dist/search-CFQRISUv.mjs.map +1 -0
  113. package/dist/search-CQOo-Iq6.d.mts +816 -0
  114. package/dist/search-CQOo-Iq6.d.mts.map +1 -0
  115. package/dist/search-DujhR94O.d.ts +816 -0
  116. package/dist/search-DujhR94O.d.ts.map +1 -0
  117. package/dist/search-njTI2hdo.js +1631 -0
  118. package/dist/search-njTI2hdo.js.map +1 -0
  119. package/dist/search.d.mts +4 -1
  120. package/dist/search.d.ts +4 -1
  121. package/dist/search.js +9 -1
  122. package/dist/search.mjs +3 -2
  123. package/dist/testing.d.mts +2 -1
  124. package/dist/testing.d.mts.map +1 -1
  125. package/dist/testing.d.ts +2 -1
  126. package/dist/testing.d.ts.map +1 -1
  127. package/dist/{transport.manager-ciG4r5uz.js → transport.manager-BivyUTtU.js} +497 -437
  128. package/dist/transport.manager-BivyUTtU.js.map +1 -0
  129. package/dist/{transport.manager-DETpXuaY.mjs → transport.manager-D6KL3t9V.mjs} +473 -364
  130. package/dist/transport.manager-D6KL3t9V.mjs.map +1 -0
  131. package/dist/transport.types-B5vcyv2k.d.mts +187 -0
  132. package/dist/transport.types-B5vcyv2k.d.mts.map +1 -0
  133. package/dist/transport.types-BuY84TwO.d.ts +187 -0
  134. package/dist/transport.types-BuY84TwO.d.ts.map +1 -0
  135. package/dist/transports.d.mts +90 -29
  136. package/dist/transports.d.mts.map +1 -1
  137. package/dist/transports.d.ts +90 -29
  138. package/dist/transports.d.ts.map +1 -1
  139. package/dist/transports.js +14 -2
  140. package/dist/transports.mjs +10 -2
  141. package/dist/worker-entry.js +1241 -0
  142. package/dist/worker.d.mts +3 -0
  143. package/dist/worker.d.ts +3 -0
  144. package/dist/worker.js +4 -0
  145. package/dist/worker.mjs +4 -0
  146. package/dist/worker.transport-BP8Q28Z2.d.mts +76 -0
  147. package/dist/worker.transport-BP8Q28Z2.d.mts.map +1 -0
  148. package/dist/worker.transport-BhMyvqQ2.mjs +167 -0
  149. package/dist/worker.transport-BhMyvqQ2.mjs.map +1 -0
  150. package/dist/worker.transport-CfH6z37Z.js +168 -0
  151. package/dist/worker.transport-CfH6z37Z.js.map +1 -0
  152. package/dist/worker.transport-mKXgNK0L.d.ts +76 -0
  153. package/dist/worker.transport-mKXgNK0L.d.ts.map +1 -0
  154. package/package.json +23 -18
  155. package/dist/index-CwFww7VC.d.ts.map +0 -1
  156. package/dist/index-DnyeaoZU.d.mts.map +0 -1
  157. package/dist/logitron-logger.module-BCq3sF27.d.mts.map +0 -1
  158. package/dist/logitron-logger.module-BIGTm2V6.mjs.map +0 -1
  159. package/dist/logitron-logger.module-BTxDpK6u.js.map +0 -1
  160. package/dist/logitron-logger.module-BmT-ewin.d.ts.map +0 -1
  161. package/dist/search-Cg_OasF-.d.ts +0 -1
  162. package/dist/search-DN676Dnz.d.mts +0 -1
  163. package/dist/search-DOvSI-mb.mjs +0 -1
  164. package/dist/search-DoZF3RZj.js +0 -0
  165. package/dist/transport.manager-DETpXuaY.mjs.map +0 -1
  166. package/dist/transport.manager-ciG4r5uz.js.map +0 -1
package/dist/index.mjs CHANGED
@@ -1,6 +1,11 @@
1
- import { d as internalError, f as internalLog, p as internalWarn, u as safeToString } from "./transport.manager-DETpXuaY.mjs";
2
- import { A as redactObject, B as LogLevel, C as setTraceId, D as registerForShutdown, E as flushOnExit, F as isError, G as createExpressContextMiddleware, H as globalPluginRegistry, I as normalizeError, K as createFastifyContextHook, L as serializeError, M as getActiveOtelContext, N as getOtelMetaFields, O as resetShutdownHandlers, P as initOtelBridge, R as DEFAULT_LOG_COLORS, S as runWithTraceId, T as deregisterFromShutdown, U as usePlugin, V as PluginRegistry, W as LogixiaContext, _ as _setActiveContextKey, b as getCurrentTraceId, c as KafkaTraceInterceptor, d as __decorateMetadata, f as LogixiaLogger, g as TraceContext, h as TRACE_CONTEXT_KEY, i as WebSocketTraceInterceptor, j as disableOtelBridge, k as applyRedaction, l as LogixiaLoggerService, m as DEFAULT_TRACE_HEADERS, n as LOGIXIA_LOGGER_PREFIX, o as resolveResponseHeader, p as createLogger$1, r as LogixiaLoggerModule, s as __decorateParam, t as LOGIXIA_LOGGER_CONFIG, u as __decorate, v as createTraceMiddleware, w as traceStorage, x as getTraceContextKey, y as extractTraceId, z as DEFAULT_LOG_LEVELS } from "./logitron-logger.module-BIGTm2V6.mjs";
3
- import "./search-DOvSI-mb.mjs";
1
+ import { n as internalLog, r as internalWarn, t as internalError } from "./internal-log-Cm8SOWSV.mjs";
2
+ import { i as stringifyForLog, n as retrocycle, r as safeStringify, t as decycleValue } from "./safe-stringify-DJ66tW5I.mjs";
3
+ import { i as HttpError, n as DEFAULT_MAX_BUFFER_SIZE, r as DEFAULT_REQUEST_TIMEOUT_MS, t as BatchBuffer } from "./batch-buffer-PGvSgbmd.mjs";
4
+ import { n as createExpressContextMiddleware, r as createFastifyContextHook, t as LogixiaContext } from "./async-context-CwBNMm2E.mjs";
5
+ import { A as resetShutdownHandlers, B as DEFAULT_LOG_COLORS, C as runWithTraceId, D as deregisterFromShutdown, E as _shutdownRegistrySize, F as getOtelMetaFields, G as usePlugin, H as LogLevel, I as initOtelBridge, L as isError, M as redactObject, N as disableOtelBridge, O as flushOnExit, P as getActiveOtelContext, R as normalizeError, S as getTraceContextKey, T as traceStorage, U as PluginRegistry, V as DEFAULT_LOG_LEVELS, W as globalPluginRegistry, _ as TraceContext, a as WebSocketTraceInterceptor, b as extractTraceId, c as __decorateParam, d as __decorate, f as __decorateMetadata, g as TRACE_CONTEXT_KEY, h as DEFAULT_TRACE_HEADERS, i as LogixiaLoggerModule, j as applyRedaction, k as registerForShutdown, l as KafkaTraceInterceptor, m as createLogger$1, n as LOGIXIA_LOGGER_PREFIX, p as LogixiaLogger, r as LOGIXIA_TRACE_CONFIG, s as resolveResponseHeader, t as LOGIXIA_LOGGER_CONFIG, u as LogixiaLoggerService, v as _setActiveContextKey, w as setTraceId, x as getCurrentTraceId, y as createTraceMiddleware, z as serializeError } from "./logitron-logger.module-Bs3XYZgF.mjs";
6
+ import { t as safeToString } from "./coerce.utils-Dxv4_ikC.mjs";
7
+ import "./transport.manager-D6KL3t9V.mjs";
8
+ import { a as BasicSearchEngine, i as CorrelationEngine, n as PatternRecognitionEngine, o as BasicLogIndexer, r as NLPSearchEngine, t as SearchManager } from "./search-CFQRISUv.mjs";
4
9
  import { AsyncLocalStorage } from "node:async_hooks";
5
10
  import { Catch, Inject, Optional } from "@nestjs/common";
6
11
 
@@ -251,7 +256,7 @@ function LogMethod(options = {}) {
251
256
  const label = options.label ?? `${className}.${methodName}`;
252
257
  let _warnedNoLogger = false;
253
258
  const reportLogFailure = (phase, err) => {
254
- process.stderr.write(`[logixia] @LogMethod(${label}) ${phase} log failed: ${String(err)}\n`);
259
+ internalError(`@LogMethod(${label}) ${phase} log failed: ${String(err)}`);
255
260
  };
256
261
  const emit$1 = (logger$1, phase, message, data) => {
257
262
  const logFnRaw = logger$1[level];
@@ -270,7 +275,7 @@ function LogMethod(options = {}) {
270
275
  const logger$1 = this.logger ?? LogixiaLoggerModule._globalLogger ?? void 0;
271
276
  if (!logger$1 && !_warnedNoLogger) {
272
277
  _warnedNoLogger = true;
273
- console.warn(`[logixia] @LogMethod on ${label}: no logger available. Either inject LogixiaLoggerService as this.logger or ensure LogixiaLoggerModule is initialised.`);
278
+ internalWarn(`@LogMethod on ${label}: no logger available. Either inject LogixiaLoggerService as this.logger or ensure LogixiaLoggerModule is initialised.`);
274
279
  }
275
280
  const start = Date.now();
276
281
  const entry = { method: label };
@@ -329,7 +334,7 @@ let LogixiaExceptionFilter = class LogixiaExceptionFilter$1 {
329
334
  ...errorResponse.meta.trace_id !== void 0 ? { trace_id: errorResponse.meta.trace_id } : {}
330
335
  };
331
336
  const onLogFailure = (err) => {
332
- process.stderr.write(`[logixia] ExceptionFilter failed to write log entry: ${String(err)}\n`);
337
+ internalError(`ExceptionFilter failed to write log entry: ${String(err)}`);
333
338
  };
334
339
  let logPromise;
335
340
  if (httpStatus >= 500) {
@@ -677,103 +682,6 @@ function createLevelControlHandler(logger$1, options = {}) {
677
682
  };
678
683
  }
679
684
 
680
- //#endregion
681
- //#region src/utils/safe-stringify.ts
682
- /** Build a JSONPath like `$["a"][0]["b"]` for a decycle pointer. */
683
- function jsonPath(parts) {
684
- let path = "$";
685
- for (const p of parts) path += typeof p === "number" ? `[${p}]` : `[${JSON.stringify(p)}]`;
686
- return path;
687
- }
688
- /**
689
- * Serialize any value to JSON without throwing on circular references or BigInt.
690
- * Circular refs become `"[Circular]"` (or `{ $ref }` pointers when `decycle`).
691
- */
692
- function safeStringify(value, options = {}) {
693
- const { indent, deterministic = false, decycle = false, bigint = "string" } = options;
694
- if (decycle) return JSON.stringify(decycleValue(value, bigint), void 0, indent);
695
- const seen = /* @__PURE__ */ new WeakSet();
696
- const transform = (val) => {
697
- if (typeof val === "bigint") return bigint === "number" ? Number(val) : val.toString();
698
- if (typeof val === "function") return `[Function: ${val.name || "anonymous"}]`;
699
- if (typeof val === "symbol") return val.toString();
700
- if (val === null || typeof val !== "object") return val;
701
- if (seen.has(val)) return "[Circular]";
702
- seen.add(val);
703
- let out;
704
- if (Array.isArray(val)) out = val.map((item) => transform(item));
705
- else if (val instanceof Date) out = val.toISOString();
706
- else {
707
- const rec = val;
708
- const keys = deterministic ? Object.keys(rec).sort() : Object.keys(rec);
709
- const obj = {};
710
- for (const k of keys) {
711
- if (k === "__proto__" || k === "constructor" || k === "prototype") continue;
712
- obj[k] = transform(rec[k]);
713
- }
714
- out = obj;
715
- }
716
- seen.delete(val);
717
- return out;
718
- };
719
- return JSON.stringify(transform(value), void 0, indent);
720
- }
721
- /**
722
- * Replace repeated object references with round-trippable `{ "$ref": "$..." }`
723
- * JSONPath pointers (the classic Crockford decycle). Pair with {@link retrocycle}
724
- * to reconstruct the original shared/circular graph.
725
- */
726
- function decycleValue(value, bigint = "string") {
727
- const paths = /* @__PURE__ */ new WeakMap();
728
- const walk = (val, path) => {
729
- if (typeof val === "bigint") return bigint === "number" ? Number(val) : val.toString();
730
- if (val === null || typeof val !== "object") return val;
731
- if (val instanceof Date) return val.toISOString();
732
- const existing = paths.get(val);
733
- if (existing !== void 0) return { $ref: existing };
734
- paths.set(val, jsonPath(path));
735
- if (Array.isArray(val)) return val.map((item, i) => walk(item, [...path, i]));
736
- const rec = val;
737
- const obj = {};
738
- for (const k of Object.keys(rec)) {
739
- if (k === "__proto__" || k === "constructor" || k === "prototype") continue;
740
- obj[k] = walk(rec[k], [...path, k]);
741
- }
742
- return obj;
743
- };
744
- return walk(value, []);
745
- }
746
- /**
747
- * Inverse of {@link decycleValue}: resolve `{ "$ref": "$..." }` pointers back
748
- * into the live object graph (mutates and returns the parsed input).
749
- */
750
- function retrocycle(root) {
751
- const refRe = /^\$(?:\[(?:\d+|"(?:[^"\\]|\\.)*")\])*$/;
752
- const resolve = (path) => {
753
- const segs = [];
754
- const partRe = /\[(\d+|"(?:[^"\\]|\\.)*")\]/g;
755
- let m;
756
- while ((m = partRe.exec(path)) !== null) {
757
- const raw = m[1];
758
- segs.push(raw.startsWith("\"") ? JSON.parse(raw) : Number(raw));
759
- }
760
- let node = root;
761
- for (const s of segs) node = node[s];
762
- return node;
763
- };
764
- const walk = (val) => {
765
- if (val === null || typeof val !== "object") return;
766
- const rec = val;
767
- for (const k of Object.keys(rec)) {
768
- const child = rec[k];
769
- if (child !== null && typeof child === "object" && typeof child.$ref === "string" && refRe.test(child.$ref)) rec[k] = resolve(child.$ref);
770
- else walk(child);
771
- }
772
- };
773
- walk(root);
774
- return root;
775
- }
776
-
777
685
  //#endregion
778
686
  //#region src/utils/typed-logger.ts
779
687
  /**
@@ -939,6 +847,15 @@ function wideEventMiddleware(logger$1, options = {}) {
939
847
 
940
848
  //#endregion
941
849
  //#region src/transports/otlp.transport.ts
850
+ const HEX_32 = /^[0-9a-f]{32}$/;
851
+ /**
852
+ * OTLP JSON wants a 32-char lowercase hex trace id. Dashed UUIDs are
853
+ * normalised; anything else (or all zeros) returns undefined.
854
+ */
855
+ function toOtlpTraceId(id) {
856
+ const hex = id.replace(/-/g, "").toLowerCase();
857
+ return HEX_32.test(hex) && hex !== "0".repeat(32) ? hex : void 0;
858
+ }
942
859
  /**
943
860
  * Map a logixia level name to an OTel SeverityNumber (1–24) and text.
944
861
  * Per the OTel logs SDK spec: TRACE=1, DEBUG=5, INFO=9, WARN=13, ERROR=17,
@@ -989,7 +906,7 @@ function toAnyValue(value) {
989
906
  if (typeof value === "bigint") return { stringValue: value.toString() };
990
907
  if (value === null || value === void 0) return { stringValue: "" };
991
908
  try {
992
- return { stringValue: JSON.stringify(value) };
909
+ return { stringValue: stringifyForLog(value) };
993
910
  } catch {
994
911
  return { stringValue: String(value) };
995
912
  }
@@ -1004,13 +921,19 @@ function toAttributes(rec) {
1004
921
  var OtlpLogTransport = class {
1005
922
  constructor(config) {
1006
923
  this.name = "otlp";
1007
- this.batch = [];
1008
924
  this.flushTimer = null;
1009
925
  this.url = config.url;
1010
926
  this.headers = config.headers ?? {};
1011
927
  this.batchSize = config.batchSize ?? 100;
1012
928
  this.flushIntervalMs = config.flushIntervalMs ?? 5e3;
929
+ this.requestTimeoutMs = config.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
1013
930
  this.level = config.level;
931
+ this.buffer = new BatchBuffer({
932
+ name: "OtlpLogTransport",
933
+ batchSize: this.batchSize,
934
+ maxBufferSize: config.maxBufferSize ?? DEFAULT_MAX_BUFFER_SIZE,
935
+ send: (entries) => this.send(entries)
936
+ });
1014
937
  this.resourceAttrs = toAttributes({
1015
938
  "service.name": config.serviceName ?? "logixia",
1016
939
  ...config.serviceVersion ? { "service.version": config.serviceVersion } : {},
@@ -1023,8 +946,8 @@ var OtlpLogTransport = class {
1023
946
  if (this.flushTimer.unref) this.flushTimer.unref();
1024
947
  }
1025
948
  write(entry) {
1026
- this.batch.push(entry);
1027
- if (this.batch.length >= this.batchSize) this.flush().catch(() => {});
949
+ this.buffer.push(entry);
950
+ this.buffer.flushIfFull();
1028
951
  }
1029
952
  /** Convert one entry into an OTLP LogRecord. */
1030
953
  toLogRecord(entry) {
@@ -1042,11 +965,18 @@ var OtlpLogTransport = class {
1042
965
  body: { stringValue: entry.message },
1043
966
  attributes: toAttributes(attrs)
1044
967
  };
1045
- if (entry.traceId) record["traceId"] = entry.traceId;
968
+ if (entry.traceId) {
969
+ const traceId = toOtlpTraceId(entry.traceId);
970
+ if (traceId) record["traceId"] = traceId;
971
+ else record["attributes"].push({
972
+ key: "trace_id",
973
+ value: { stringValue: entry.traceId }
974
+ });
975
+ }
1046
976
  return record;
1047
977
  }
1048
978
  buildPayload(entries) {
1049
- return JSON.stringify({ resourceLogs: [{
979
+ return stringifyForLog({ resourceLogs: [{
1050
980
  resource: { attributes: this.resourceAttrs },
1051
981
  scopeLogs: [{
1052
982
  scope: { name: "logixia" },
@@ -1054,40 +984,40 @@ var OtlpLogTransport = class {
1054
984
  }]
1055
985
  }] });
1056
986
  }
1057
- async flush() {
1058
- while (this.batch.length > 0) {
1059
- const entries = this.batch.splice(0, this.batchSize);
1060
- try {
1061
- await this.send(entries);
1062
- } catch (err) {
1063
- internalError("OtlpLogTransport flush error", err);
1064
- this.batch.unshift(...entries);
1065
- return;
1066
- }
1067
- }
987
+ flush() {
988
+ return this.buffer.flush();
1068
989
  }
1069
990
  async send(entries) {
1070
991
  if (typeof fetch !== "function") {
1071
992
  internalWarn("OtlpLogTransport: global fetch unavailable — cannot export logs");
1072
993
  return;
1073
994
  }
1074
- const res = await fetch(this.url, {
1075
- method: "POST",
1076
- headers: {
1077
- "Content-Type": "application/json",
1078
- ...this.headers
1079
- },
1080
- body: this.buildPayload(entries)
1081
- });
1082
- if (!res.ok) throw new Error(`OTLP export failed: HTTP ${res.status}`);
995
+ const controller = new AbortController();
996
+ const timer = setTimeout(() => controller.abort(), this.requestTimeoutMs);
997
+ try {
998
+ const res = await fetch(this.url, {
999
+ method: "POST",
1000
+ headers: {
1001
+ "Content-Type": "application/json",
1002
+ ...this.headers
1003
+ },
1004
+ body: this.buildPayload(entries),
1005
+ signal: controller.signal
1006
+ });
1007
+ if (!res.ok) throw new HttpError(res.status, "", "OTLP export");
1008
+ } catch (err) {
1009
+ if (controller.signal.aborted) throw new Error(`OTLP export timed out after ${this.requestTimeoutMs}ms`, { cause: err });
1010
+ throw err;
1011
+ } finally {
1012
+ clearTimeout(timer);
1013
+ }
1083
1014
  }
1084
1015
  async close() {
1085
1016
  if (this.flushTimer) {
1086
1017
  clearInterval(this.flushTimer);
1087
1018
  this.flushTimer = null;
1088
1019
  }
1089
- for (let attempt = 0; attempt < 3 && this.batch.length > 0; attempt += 1) await this.flush();
1090
- if (this.batch.length > 0) internalError(`OtlpLogTransport closing with ${this.batch.length} undelivered record(s)`);
1020
+ await this.buffer.close();
1091
1021
  }
1092
1022
  };
1093
1023
 
@@ -1417,5 +1347,5 @@ const logger = new LogixiaLogger(DEFAULT_CONFIG);
1417
1347
  */
1418
1348
 
1419
1349
  //#endregion
1420
- export { DEFAULT_CONFIG, DEFAULT_LOG_COLORS, DEFAULT_LOG_LEVELS, DEFAULT_TRACE_HEADERS, ErrorResponseBuilder, InjectLogger, JsonFormatter, KafkaTraceInterceptor, LOGIXIA_LOGGER_CONFIG, LOGIXIA_LOGGER_PREFIX, LogLevel, LogMethod, LogixiaContext, LogixiaException, LogixiaExceptionFilter, LogixiaLogger, LogixiaLoggerModule, LogixiaLoggerService, MetricsPlugin, OtlpLogTransport, PluginRegistry, TRACE_CONTEXT_KEY, TextFormatter, TraceContext, WebSocketTraceInterceptor, _setActiveContextKey, addEventFields, applyRedaction, createExpressContextMiddleware, createFastifyContextHook, createLevelControlHandler, createLogger, createLoggerService, createMetricsPlugin, createTraceMiddleware, createTypedLogger, decycleValue, defineLogSchema, deregisterFromShutdown, disableOtelBridge, extractTraceId, flushOnExit, generateRequestId, generateTraceId, getActiveOtelContext, getCurrentTraceId, getEventFields, getOtelMetaFields, getTraceContextKey, globalPluginRegistry, initOtelBridge, isError, isLogixiaException, logger, normalizeError, redactObject, registerForShutdown, registerLevelSignal, resetShutdownHandlers, retrocycle, runWithTraceId, safeStringify, serializeError, setEventField, setTraceId, toOtelSeverity, traceStorage, usePlugin, wideEventMiddleware, withWideEvent };
1350
+ export { BasicLogIndexer, BasicSearchEngine, CorrelationEngine, DEFAULT_CONFIG, DEFAULT_LOG_COLORS, DEFAULT_LOG_LEVELS, DEFAULT_TRACE_HEADERS, ErrorResponseBuilder, InjectLogger, JsonFormatter, KafkaTraceInterceptor, LOGIXIA_LOGGER_CONFIG, LOGIXIA_LOGGER_PREFIX, LOGIXIA_TRACE_CONFIG, LogLevel, LogMethod, LogixiaContext, LogixiaException, LogixiaExceptionFilter, LogixiaLogger, LogixiaLoggerModule, LogixiaLoggerService, MetricsPlugin, NLPSearchEngine, OtlpLogTransport, PatternRecognitionEngine, PluginRegistry, SearchManager, TRACE_CONTEXT_KEY, TextFormatter, TraceContext, WebSocketTraceInterceptor, _setActiveContextKey, _shutdownRegistrySize, addEventFields, applyRedaction, createExpressContextMiddleware, createFastifyContextHook, createLevelControlHandler, createLogger, createLoggerService, createMetricsPlugin, createTraceMiddleware, createTypedLogger, decycleValue, defineLogSchema, deregisterFromShutdown, disableOtelBridge, extractTraceId, flushOnExit, generateRequestId, generateTraceId, getActiveOtelContext, getCurrentTraceId, getEventFields, getOtelMetaFields, getTraceContextKey, globalPluginRegistry, initOtelBridge, isError, isLogixiaException, logger, normalizeError, redactObject, registerForShutdown, registerLevelSignal, resetShutdownHandlers, retrocycle, runWithTraceId, safeStringify, serializeError, setEventField, setTraceId, stringifyForLog, toOtelSeverity, traceStorage, usePlugin, wideEventMiddleware, withWideEvent };
1421
1351
  //# sourceMappingURL=index.mjs.map