logixia 2.0.4 → 2.0.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 (218) hide show
  1. package/README.md +172 -2614
  2. package/dist/{async-context-B05ArHgM.mjs → async-context-2mbUKhcl.mjs} +4 -6
  3. package/dist/async-context-2mbUKhcl.mjs.map +1 -0
  4. package/dist/{async-context-DTQgi8f7.js → async-context-DUFMDYAr.js} +4 -6
  5. package/dist/async-context-DUFMDYAr.js.map +1 -0
  6. package/dist/{azure-monitor.transport-CwbOLZHB.js → azure-monitor.transport-Bu4S2I2q.js} +5 -5
  7. package/dist/azure-monitor.transport-Bu4S2I2q.js.map +1 -0
  8. package/dist/{azure-monitor.transport-DV03Z5P4.d.ts → azure-monitor.transport-Bvf7Xegt.d.ts} +2 -2
  9. package/dist/{azure-monitor.transport-DV03Z5P4.d.ts.map → azure-monitor.transport-Bvf7Xegt.d.ts.map} +1 -1
  10. package/dist/{azure-monitor.transport-BPbgjATu.mjs → azure-monitor.transport-C1RWAumT.mjs} +5 -5
  11. package/dist/azure-monitor.transport-C1RWAumT.mjs.map +1 -0
  12. package/dist/{azure-monitor.transport-C7kYyZUW.d.mts → azure-monitor.transport-CbSHOnNX.d.mts} +2 -2
  13. package/dist/{azure-monitor.transport-C7kYyZUW.d.mts.map → azure-monitor.transport-CbSHOnNX.d.mts.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-0fgLmIPn.mjs → batch-buffer-BvXLDPlV.mjs} +3 -3
  19. package/dist/{batch-buffer-0fgLmIPn.mjs.map → batch-buffer-BvXLDPlV.mjs.map} +1 -1
  20. package/dist/{batch-buffer-DT4gdXmf.js → batch-buffer-C7Am4Mw-.js} +3 -3
  21. package/dist/{batch-buffer-DT4gdXmf.js.map → batch-buffer-C7Am4Mw-.js.map} +1 -1
  22. package/dist/browser.d.mts +5 -5
  23. package/dist/browser.d.mts.map +1 -1
  24. package/dist/browser.d.ts +5 -5
  25. package/dist/browser.d.ts.map +1 -1
  26. package/dist/browser.js +47 -12
  27. package/dist/browser.js.map +1 -1
  28. package/dist/browser.mjs +47 -12
  29. package/dist/browser.mjs.map +1 -1
  30. package/dist/{builder-D70z6kjj.mjs → builder-DhNhvOkt.mjs} +106 -153
  31. package/dist/builder-DhNhvOkt.mjs.map +1 -0
  32. package/dist/{builder-M7NoaugM.js → builder-yFvJrz7o.js} +109 -179
  33. package/dist/builder-yFvJrz7o.js.map +1 -0
  34. package/dist/cli/index.js +157 -66
  35. package/dist/cloudwatch.d.mts +1 -1
  36. package/dist/cloudwatch.d.ts +1 -1
  37. package/dist/cloudwatch.js +1 -1
  38. package/dist/cloudwatch.mjs +1 -1
  39. package/dist/{cloudwatch.transport-Bf7L4I59.d.ts → cloudwatch.transport-CQyT6U91.d.ts} +2 -2
  40. package/dist/{cloudwatch.transport-Bf7L4I59.d.ts.map → cloudwatch.transport-CQyT6U91.d.ts.map} +1 -1
  41. package/dist/{cloudwatch.transport-B2wKQFF7.js → cloudwatch.transport-Ch1Uae-0.js} +6 -6
  42. package/dist/cloudwatch.transport-Ch1Uae-0.js.map +1 -0
  43. package/dist/{cloudwatch.transport-Rj4yTpRn.d.mts → cloudwatch.transport-CjVrI6S4.d.mts} +2 -2
  44. package/dist/{cloudwatch.transport-Rj4yTpRn.d.mts.map → cloudwatch.transport-CjVrI6S4.d.mts.map} +1 -1
  45. package/dist/{cloudwatch.transport-BTvYfLs9.mjs → cloudwatch.transport-DZqF2xZO.mjs} +6 -6
  46. package/dist/cloudwatch.transport-DZqF2xZO.mjs.map +1 -0
  47. package/dist/correlation.d.mts +4 -55
  48. package/dist/correlation.d.mts.map +1 -1
  49. package/dist/correlation.d.ts +4 -55
  50. package/dist/correlation.d.ts.map +1 -1
  51. package/dist/correlation.js +13 -13
  52. package/dist/correlation.js.map +1 -1
  53. package/dist/correlation.mjs +13 -13
  54. package/dist/correlation.mjs.map +1 -1
  55. package/dist/{entry-fields-RLd1jCoR.js → entry-fields-BSLkzw18.js} +8 -3
  56. package/dist/entry-fields-BSLkzw18.js.map +1 -0
  57. package/dist/{entry-fields-CGuvT2R0.mjs → entry-fields-J1OBi24o.mjs} +8 -3
  58. package/dist/entry-fields-J1OBi24o.mjs.map +1 -0
  59. package/dist/gcp.d.mts +1 -1
  60. package/dist/gcp.d.ts +1 -1
  61. package/dist/gcp.js +1 -1
  62. package/dist/gcp.mjs +1 -1
  63. package/dist/{gcp.transport-CFQfdAOK.d.ts → gcp.transport-BCIvdFV-.d.ts} +4 -4
  64. package/dist/{gcp.transport-CFQfdAOK.d.ts.map → gcp.transport-BCIvdFV-.d.ts.map} +1 -1
  65. package/dist/{gcp.transport-C5D72b1g.d.mts → gcp.transport-D9SdLPwP.d.mts} +4 -4
  66. package/dist/{gcp.transport-C5D72b1g.d.mts.map → gcp.transport-D9SdLPwP.d.mts.map} +1 -1
  67. package/dist/{gcp.transport-CGKopAhQ.mjs → gcp.transport-DVCmnA3b.mjs} +20 -16
  68. package/dist/gcp.transport-DVCmnA3b.mjs.map +1 -0
  69. package/dist/{gcp.transport-KZe9hCAR.js → gcp.transport-Dy2Lf8FI.js} +20 -16
  70. package/dist/gcp.transport-Dy2Lf8FI.js.map +1 -0
  71. package/dist/http-shapes-BnBkJcid.d.mts +32 -0
  72. package/dist/http-shapes-BnBkJcid.d.mts.map +1 -0
  73. package/dist/http-shapes-BnBkJcid.d.ts +32 -0
  74. package/dist/http-shapes-BnBkJcid.d.ts.map +1 -0
  75. package/dist/{index-xqaJtAZn.d.mts → index-BSTtFcQ6.d.mts} +142 -8
  76. package/dist/index-BSTtFcQ6.d.mts.map +1 -0
  77. package/dist/{index-DwozbmB4.d.ts → index-CFDGkI8n.d.ts} +142 -8
  78. package/dist/index-CFDGkI8n.d.ts.map +1 -0
  79. package/dist/index.d.mts +21 -65
  80. package/dist/index.d.mts.map +1 -1
  81. package/dist/index.d.ts +21 -65
  82. package/dist/index.d.ts.map +1 -1
  83. package/dist/index.js +26 -26
  84. package/dist/index.js.map +1 -1
  85. package/dist/index.mjs +21 -21
  86. package/dist/index.mjs.map +1 -1
  87. package/dist/{internal-log-uCSd1PMc.mjs → internal-log-Bg4V1cPg.mjs} +30 -2
  88. package/dist/internal-log-Bg4V1cPg.mjs.map +1 -0
  89. package/dist/{internal-log-b0Vp4qrB.js → internal-log-By4Govmu.js} +41 -1
  90. package/dist/internal-log-By4Govmu.js.map +1 -0
  91. package/dist/{logitron-logger-D2B75Oc7.d.ts → logitron-logger-D22Yb61K.d.mts} +13 -100
  92. package/dist/logitron-logger-D22Yb61K.d.mts.map +1 -0
  93. package/dist/{logitron-logger-oEd6wNhf.d.mts → logitron-logger-D_MYYrQt.d.ts} +13 -100
  94. package/dist/logitron-logger-D_MYYrQt.d.ts.map +1 -0
  95. package/dist/middleware.d.mts +4 -17
  96. package/dist/middleware.d.mts.map +1 -1
  97. package/dist/middleware.d.ts +4 -17
  98. package/dist/middleware.d.ts.map +1 -1
  99. package/dist/middleware.js +9 -39
  100. package/dist/middleware.js.map +1 -1
  101. package/dist/middleware.mjs +7 -37
  102. package/dist/middleware.mjs.map +1 -1
  103. package/dist/nest.d.mts +14 -7
  104. package/dist/nest.d.mts.map +1 -1
  105. package/dist/nest.d.ts +14 -7
  106. package/dist/nest.d.ts.map +1 -1
  107. package/dist/nest.js +15 -10
  108. package/dist/nest.js.map +1 -1
  109. package/dist/nest.mjs +15 -10
  110. package/dist/nest.mjs.map +1 -1
  111. package/dist/{transport.manager-eZ_EeC00.mjs → otel-Dt5riXuE.mjs} +173 -24
  112. package/dist/otel-Dt5riXuE.mjs.map +1 -0
  113. package/dist/{transport.manager-DkcEOlqV.js → otel-DyeH6DVR.js} +214 -23
  114. package/dist/otel-DyeH6DVR.js.map +1 -0
  115. package/dist/own-property-BWkibepN.js +40 -0
  116. package/dist/own-property-BWkibepN.js.map +1 -0
  117. package/dist/own-property-CjFw9qwZ.mjs +29 -0
  118. package/dist/own-property-CjFw9qwZ.mjs.map +1 -0
  119. package/dist/{request-trace-C_fvIDv4.mjs → request-trace-BgNykH9M.mjs} +1 -5
  120. package/dist/{request-trace-C_fvIDv4.mjs.map → request-trace-BgNykH9M.mjs.map} +1 -1
  121. package/dist/{request-trace-wTJdKp6-.js → request-trace-ByujsUZk.js} +1 -5
  122. package/dist/{request-trace-wTJdKp6-.js.map → request-trace-ByujsUZk.js.map} +1 -1
  123. package/dist/{safe-stringify-BMRl3EX3.mjs → safe-stringify-B5p5ktFe.mjs} +37 -12
  124. package/dist/safe-stringify-B5p5ktFe.mjs.map +1 -0
  125. package/dist/{safe-stringify-DLz1Kz3o.js → safe-stringify-J3sh-7YM.js} +37 -12
  126. package/dist/safe-stringify-J3sh-7YM.js.map +1 -0
  127. package/dist/{search-DUfWuzFP.js → search-CRjhHxe9.js} +269 -25
  128. package/dist/search-CRjhHxe9.js.map +1 -0
  129. package/dist/{search-CazwyX5Z.d.ts → search-DA3ft3X5.d.mts} +5 -2
  130. package/dist/search-DA3ft3X5.d.mts.map +1 -0
  131. package/dist/{search-CWMVYC-R.mjs → search-DAXKE-P9.mjs} +269 -25
  132. package/dist/search-DAXKE-P9.mjs.map +1 -0
  133. package/dist/{search-BH33XhuU.d.mts → search-DEl3Pe47.d.ts} +5 -2
  134. package/dist/search-DEl3Pe47.d.ts.map +1 -0
  135. package/dist/search.d.mts +1 -1
  136. package/dist/search.d.ts +1 -1
  137. package/dist/search.js +1 -1
  138. package/dist/search.mjs +1 -1
  139. package/dist/{secret-config-CBZBs0p1.js → secret-config-CmK2wVkr.js} +6 -5
  140. package/dist/secret-config-CmK2wVkr.js.map +1 -0
  141. package/dist/{secret-config-BegMLkYl.mjs → secret-config-Dhb6pqTU.mjs} +6 -5
  142. package/dist/secret-config-Dhb6pqTU.mjs.map +1 -0
  143. package/dist/{slack.transport-DxHOXlLu.d.mts → slack.transport-BDyENuR0.d.mts} +2 -2
  144. package/dist/{slack.transport-DxHOXlLu.d.mts.map → slack.transport-BDyENuR0.d.mts.map} +1 -1
  145. package/dist/{slack.transport-Ce96JBDk.mjs → slack.transport-BTEwsREY.mjs} +66 -15
  146. package/dist/slack.transport-BTEwsREY.mjs.map +1 -0
  147. package/dist/{slack.transport-DrirgDNy.d.ts → slack.transport-C6E0l4kw.d.ts} +2 -2
  148. package/dist/{slack.transport-DrirgDNy.d.ts.map → slack.transport-C6E0l4kw.d.ts.map} +1 -1
  149. package/dist/{slack.transport-Dlx3xvb7.js → slack.transport-UbYvOdKx.js} +67 -16
  150. package/dist/slack.transport-UbYvOdKx.js.map +1 -0
  151. package/dist/testing.d.mts +11 -4
  152. package/dist/testing.d.mts.map +1 -1
  153. package/dist/testing.d.ts +11 -4
  154. package/dist/testing.d.ts.map +1 -1
  155. package/dist/testing.js +38 -3
  156. package/dist/testing.js.map +1 -1
  157. package/dist/testing.mjs +38 -3
  158. package/dist/testing.mjs.map +1 -1
  159. package/dist/{transport.types-BJVL1QQl.d.ts → transport.types-CzJq4IrF.d.mts} +14 -3
  160. package/dist/transport.types-CzJq4IrF.d.mts.map +1 -0
  161. package/dist/{transport.types-BJVL1QQl.d.mts → transport.types-CzJq4IrF.d.ts} +14 -3
  162. package/dist/transport.types-CzJq4IrF.d.ts.map +1 -0
  163. package/dist/transports.d.mts +25 -13
  164. package/dist/transports.d.mts.map +1 -1
  165. package/dist/transports.d.ts +25 -13
  166. package/dist/transports.d.ts.map +1 -1
  167. package/dist/transports.js +15 -15
  168. package/dist/transports.mjs +6 -6
  169. package/dist/worker-entry.js +105 -24
  170. package/dist/worker.d.mts +1 -1
  171. package/dist/worker.d.ts +1 -1
  172. package/dist/worker.js +1 -1
  173. package/dist/worker.mjs +1 -1
  174. package/dist/{worker.transport-BuPwBi3d.d.ts → worker.transport-B9mCQSM1.d.ts} +7 -2
  175. package/dist/worker.transport-B9mCQSM1.d.ts.map +1 -0
  176. package/dist/{worker.transport-hJay1wxA.d.mts → worker.transport-Bl8lFRck.d.mts} +7 -2
  177. package/dist/worker.transport-Bl8lFRck.d.mts.map +1 -0
  178. package/dist/{worker.transport-DLVA4y2e.mjs → worker.transport-BmmOKb1-.mjs} +13 -10
  179. package/dist/worker.transport-BmmOKb1-.mjs.map +1 -0
  180. package/dist/{worker.transport-C6GNl_r2.js → worker.transport-DxxbqQCG.js} +13 -10
  181. package/dist/worker.transport-DxxbqQCG.js.map +1 -0
  182. package/package.json +33 -65
  183. package/dist/async-context-B05ArHgM.mjs.map +0 -1
  184. package/dist/async-context-DTQgi8f7.js.map +0 -1
  185. package/dist/azure-monitor.transport-BPbgjATu.mjs.map +0 -1
  186. package/dist/azure-monitor.transport-CwbOLZHB.js.map +0 -1
  187. package/dist/builder-D70z6kjj.mjs.map +0 -1
  188. package/dist/builder-M7NoaugM.js.map +0 -1
  189. package/dist/cloudwatch.transport-B2wKQFF7.js.map +0 -1
  190. package/dist/cloudwatch.transport-BTvYfLs9.mjs.map +0 -1
  191. package/dist/entry-fields-CGuvT2R0.mjs.map +0 -1
  192. package/dist/entry-fields-RLd1jCoR.js.map +0 -1
  193. package/dist/gcp.transport-CGKopAhQ.mjs.map +0 -1
  194. package/dist/gcp.transport-KZe9hCAR.js.map +0 -1
  195. package/dist/index-DwozbmB4.d.ts.map +0 -1
  196. package/dist/index-xqaJtAZn.d.mts.map +0 -1
  197. package/dist/internal-log-b0Vp4qrB.js.map +0 -1
  198. package/dist/internal-log-uCSd1PMc.mjs.map +0 -1
  199. package/dist/logitron-logger-D2B75Oc7.d.ts.map +0 -1
  200. package/dist/logitron-logger-oEd6wNhf.d.mts.map +0 -1
  201. package/dist/safe-stringify-BMRl3EX3.mjs.map +0 -1
  202. package/dist/safe-stringify-DLz1Kz3o.js.map +0 -1
  203. package/dist/search-BH33XhuU.d.mts.map +0 -1
  204. package/dist/search-CWMVYC-R.mjs.map +0 -1
  205. package/dist/search-CazwyX5Z.d.ts.map +0 -1
  206. package/dist/search-DUfWuzFP.js.map +0 -1
  207. package/dist/secret-config-BegMLkYl.mjs.map +0 -1
  208. package/dist/secret-config-CBZBs0p1.js.map +0 -1
  209. package/dist/slack.transport-Ce96JBDk.mjs.map +0 -1
  210. package/dist/slack.transport-Dlx3xvb7.js.map +0 -1
  211. package/dist/transport.manager-DkcEOlqV.js.map +0 -1
  212. package/dist/transport.manager-eZ_EeC00.mjs.map +0 -1
  213. package/dist/transport.types-BJVL1QQl.d.mts.map +0 -1
  214. package/dist/transport.types-BJVL1QQl.d.ts.map +0 -1
  215. package/dist/worker.transport-BuPwBi3d.d.ts.map +0 -1
  216. package/dist/worker.transport-C6GNl_r2.js.map +0 -1
  217. package/dist/worker.transport-DLVA4y2e.mjs.map +0 -1
  218. package/dist/worker.transport-hJay1wxA.d.mts.map +0 -1
@@ -1,6 +1,6 @@
1
+ import { n as isProtoKey } from "./own-property-CjFw9qwZ.mjs";
1
2
  // src/transports/entry-fields.ts
2
3
  const PAYLOAD_PREFIX = "data_";
3
- const UNSAFE_KEYS = /* @__PURE__ */ new Set(["__proto__"]);
4
4
  /**
5
5
  * Copies `core` and then the user payload into one object. The core fields stay
6
6
  * authoritative: a payload key that matches a core key (even one whose value is
@@ -8,6 +8,10 @@ const UNSAFE_KEYS = /* @__PURE__ */ new Set(["__proto__"]);
8
8
  * prefix is repeated until the name is free of core keys and of every other
9
9
  * payload key, so the result does not depend on key order and a payload's own
10
10
  * `data_level` stays where it is.
11
+ *
12
+ * Exception: a payload `traceId` equal to the core `traceId` is a duplicate (the
13
+ * context middleware copies the trace id into the payload) and is dropped rather
14
+ * than emitted again as `data_traceId`. A different value is still kept.
11
15
  */
12
16
  function mergeCoreFields(core, data, extraReserved = []) {
13
17
  const merged = { ...core };
@@ -15,7 +19,8 @@ function mergeCoreFields(core, data, extraReserved = []) {
15
19
  const reserved = /* @__PURE__ */ new Set([...Object.keys(core), ...extraReserved]);
16
20
  const payloadKeys = new Set(Object.keys(data));
17
21
  for (const key of payloadKeys) {
18
- if (UNSAFE_KEYS.has(key)) continue;
22
+ if (isProtoKey(key)) continue;
23
+ if (key === "traceId" && core["traceId"] !== void 0 && data[key] === core["traceId"]) continue;
19
24
  let target = key;
20
25
  if (reserved.has(target)) do
21
26
  target = `${PAYLOAD_PREFIX}${target}`;
@@ -26,4 +31,4 @@ function mergeCoreFields(core, data, extraReserved = []) {
26
31
  }
27
32
  export { mergeCoreFields as t };
28
33
 
29
- //# sourceMappingURL=entry-fields-CGuvT2R0.mjs.map
34
+ //# sourceMappingURL=entry-fields-J1OBi24o.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-fields-J1OBi24o.mjs","names":[],"sources":["../src/transports/entry-fields.ts"],"sourcesContent":["import { isProtoKey } from '../utils/own-property';\n\nconst PAYLOAD_PREFIX = 'data_';\n\n/**\n * Copies `core` and then the user payload into one object. The core fields stay\n * authoritative: a payload key that matches a core key (even one whose value is\n * undefined) or a reserved name is kept under a `data_` prefix instead. The\n * prefix is repeated until the name is free of core keys and of every other\n * payload key, so the result does not depend on key order and a payload's own\n * `data_level` stays where it is.\n *\n * Exception: a payload `traceId` equal to the core `traceId` is a duplicate (the\n * context middleware copies the trace id into the payload) and is dropped rather\n * than emitted again as `data_traceId`. A different value is still kept.\n */\nexport function mergeCoreFields(\n core: Record<string, unknown>,\n data: Record<string, unknown> | undefined,\n extraReserved: readonly string[] = []\n): Record<string, unknown> {\n const merged: Record<string, unknown> = { ...core };\n if (!data) return merged;\n const reserved = new Set([...Object.keys(core), ...extraReserved]);\n const payloadKeys = new Set(Object.keys(data));\n for (const key of payloadKeys) {\n if (isProtoKey(key)) continue;\n if (key === 'traceId' && core['traceId'] !== undefined && data[key] === core['traceId'])\n continue;\n let target = key;\n if (reserved.has(target)) {\n do {\n target = `${PAYLOAD_PREFIX}${target}`;\n } while (reserved.has(target) || payloadKeys.has(target));\n }\n merged[target] = data[key];\n }\n return merged;\n}\n"],"mappings":";;AAEA,MAAM,iBAAiB;;;;;;;;;;;;;AAcvB,SAAgB,gBACd,MACA,MACA,gBAAmC,CAAC,GACX;CACzB,MAAM,SAAkC,EAAE,GAAG,KAAK;CAClD,IAAI,CAAC,MAAM,OAAO;CAClB,MAAM,2BAAW,IAAI,IAAI,CAAC,GAAG,OAAO,KAAK,IAAI,GAAG,GAAG,aAAa,CAAC;CACjE,MAAM,cAAc,IAAI,IAAI,OAAO,KAAK,IAAI,CAAC;CAC7C,KAAK,MAAM,OAAO,aAAa;EAC7B,IAAI,WAAW,GAAG,GAAG;EACrB,IAAI,QAAQ,aAAa,KAAK,eAAe,KAAA,KAAa,KAAK,SAAS,KAAK,YAC3E;EACF,IAAI,SAAS;EACb,IAAI,SAAS,IAAI,MAAM,GACrB;GACE,SAAS,GAAG,iBAAiB;SACtB,SAAS,IAAI,MAAM,KAAK,YAAY,IAAI,MAAM;EAEzD,OAAO,UAAU,KAAK;CACxB;CACA,OAAO;AACT"}
package/dist/gcp.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { n as GCPTransport, r as GCPTransportConfig, t as GCPMonitoredResource } from "./gcp.transport-C5D72b1g.mjs";
1
+ import { n as GCPTransport, r as GCPTransportConfig, t as GCPMonitoredResource } from "./gcp.transport-D9SdLPwP.mjs";
2
2
  export { GCPMonitoredResource, GCPTransport, GCPTransportConfig };
package/dist/gcp.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { n as GCPTransport, r as GCPTransportConfig, t as GCPMonitoredResource } from "./gcp.transport-CFQfdAOK.js";
1
+ import { n as GCPTransport, r as GCPTransportConfig, t as GCPMonitoredResource } from "./gcp.transport-BCIvdFV-.js";
2
2
  export { GCPMonitoredResource, GCPTransport, GCPTransportConfig };
package/dist/gcp.js CHANGED
@@ -1,3 +1,3 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_gcp_transport = require("./gcp.transport-KZe9hCAR.js");
2
+ const require_gcp_transport = require("./gcp.transport-Dy2Lf8FI.js");
3
3
  exports.GCPTransport = require_gcp_transport.GCPTransport;
package/dist/gcp.mjs CHANGED
@@ -1 +1 @@
1
- export { t as GCPTransport } from "./gcp.transport-CGKopAhQ.mjs";
1
+ export { t as GCPTransport } from "./gcp.transport-DVCmnA3b.mjs";
@@ -1,4 +1,4 @@
1
- import { p as TransportLogEntry, s as IAsyncTransport } from "./transport.types-BJVL1QQl.js";
1
+ import { _ as TransportLogEntry, l as IAsyncTransport } from "./transport.types-CzJq4IrF.js";
2
2
  interface GCPMonitoredResource {
3
3
  type: string;
4
4
  labels?: Record<string, string>;
@@ -14,8 +14,8 @@ interface GCPTransportConfig {
14
14
  /** Monitored resource descriptor. Defaults to `global`. */
15
15
  resource?: GCPMonitoredResource;
16
16
  /**
17
- * Service account key JSON (parsed). If omitted, ADC is used
18
- * (GOOGLE_APPLICATION_CREDENTIALS env var or metadata server).
17
+ * Service account key JSON (parsed). If omitted, only the metadata server
18
+ * (GCE/GKE/Cloud Run) is tried; the key-file env var is not read.
19
19
  */
20
20
  credentials?: {
21
21
  client_email: string;
@@ -65,4 +65,4 @@ declare class GCPTransport implements IAsyncTransport {
65
65
  private writeEntries;
66
66
  }
67
67
  export { GCPTransport as n, GCPTransportConfig as r, GCPMonitoredResource as t };
68
- //# sourceMappingURL=gcp.transport-CFQfdAOK.d.ts.map
68
+ //# sourceMappingURL=gcp.transport-BCIvdFV-.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gcp.transport-CFQfdAOK.d.ts","names":[],"sources":["../src/transports/gcp.transport.ts"],"mappings":";UA2CiB;EACf;EACA,SAAS;;UAGM;;EAEf;;;;;EAKA;;EAEA,WAAW;;;;;EAKX;IACE;IACA;;;EAGF;;EAEA;;EAEA;;EAEA;EACA;;;;;cAuCW,wBAAwB;WACnB;WACA;WACA;WACA;mBAEC;mBACA;UACT;UACA;UACA;mBAES;mBACA;mBACA;mBACA;EAEL,YAAA,QAAQ;EA4BpB,MAAM,OAAO;EAKb,SAAS;;;;;;EASH,SAAS;UAQP;UAqBM;UAgCN;UAmCA;UA+CA;UASM"}
1
+ {"version":3,"file":"gcp.transport-BCIvdFV-.d.ts","names":[],"sources":["../src/transports/gcp.transport.ts"],"mappings":";UA+CiB;EACf;EACA,SAAS;;UAGM;;EAEf;;;;;EAKA;;EAEA,WAAW;;;;;EAKX;IACE;IACA;;;EAGF;;EAEA;;EAEA;;EAEA;EACA;;;;;cAuCW,wBAAwB;WACnB;WACA;WACA;WACA;mBAEC;mBACA;UACT;UACA;UACA;mBAES;mBACA;mBACA;mBACA;EAEL,YAAA,QAAQ;EA4BpB,MAAM,OAAO;EAKb,SAAS;;;;;;EASH,SAAS;UAQP;UAqBM;UAgCN;UAmCA;UA+CA;UASM"}
@@ -1,4 +1,4 @@
1
- import { p as TransportLogEntry, s as IAsyncTransport } from "./transport.types-BJVL1QQl.mjs";
1
+ import { _ as TransportLogEntry, l as IAsyncTransport } from "./transport.types-CzJq4IrF.mjs";
2
2
  interface GCPMonitoredResource {
3
3
  type: string;
4
4
  labels?: Record<string, string>;
@@ -14,8 +14,8 @@ interface GCPTransportConfig {
14
14
  /** Monitored resource descriptor. Defaults to `global`. */
15
15
  resource?: GCPMonitoredResource;
16
16
  /**
17
- * Service account key JSON (parsed). If omitted, ADC is used
18
- * (GOOGLE_APPLICATION_CREDENTIALS env var or metadata server).
17
+ * Service account key JSON (parsed). If omitted, only the metadata server
18
+ * (GCE/GKE/Cloud Run) is tried; the key-file env var is not read.
19
19
  */
20
20
  credentials?: {
21
21
  client_email: string;
@@ -65,4 +65,4 @@ declare class GCPTransport implements IAsyncTransport {
65
65
  private writeEntries;
66
66
  }
67
67
  export { GCPTransport as n, GCPTransportConfig as r, GCPMonitoredResource as t };
68
- //# sourceMappingURL=gcp.transport-C5D72b1g.d.mts.map
68
+ //# sourceMappingURL=gcp.transport-D9SdLPwP.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gcp.transport-C5D72b1g.d.mts","names":[],"sources":["../src/transports/gcp.transport.ts"],"mappings":";UA2CiB;EACf;EACA,SAAS;;UAGM;;EAEf;;;;;EAKA;;EAEA,WAAW;;;;;EAKX;IACE;IACA;;;EAGF;;EAEA;;EAEA;;EAEA;EACA;;;;;cAuCW,wBAAwB;WACnB;WACA;WACA;WACA;mBAEC;mBACA;UACT;UACA;UACA;mBAES;mBACA;mBACA;mBACA;EAEL,YAAA,QAAQ;EA4BpB,MAAM,OAAO;EAKb,SAAS;;;;;;EASH,SAAS;UAQP;UAqBM;UAgCN;UAmCA;UA+CA;UASM"}
1
+ {"version":3,"file":"gcp.transport-D9SdLPwP.d.mts","names":[],"sources":["../src/transports/gcp.transport.ts"],"mappings":";UA+CiB;EACf;EACA,SAAS;;UAGM;;EAEf;;;;;EAKA;;EAEA,WAAW;;;;;EAKX;IACE;IACA;;;EAGF;;EAEA;;EAEA;;EAEA;EACA;;;;;cAuCW,wBAAwB;WACnB;WACA;WACA;WACA;mBAEC;mBACA;UACT;UACA;UACA;mBAES;mBACA;mBACA;mBACA;EAEL,YAAA,QAAQ;EA4BpB,MAAM,OAAO;EAKb,SAAS;;;;;;EASH,SAAS;UAQP;UAqBM;UAgCN;UAmCA;UA+CA;UASM"}
@@ -1,9 +1,9 @@
1
1
  import { t as __require } from "./rolldown-runtime-D3PmRqjj.mjs";
2
- import { t as internalError } from "./internal-log-uCSd1PMc.mjs";
3
- import { n as protectSecrets } from "./secret-config-BegMLkYl.mjs";
4
- import { i as stringifyForLog } from "./safe-stringify-BMRl3EX3.mjs";
5
- import { t as mergeCoreFields } from "./entry-fields-CGuvT2R0.mjs";
6
- import { a as httpRequest, t as BatchBuffer } from "./batch-buffer-0fgLmIPn.mjs";
2
+ import { t as internalError } from "./internal-log-Bg4V1cPg.mjs";
3
+ import { n as protectSecrets } from "./secret-config-Dhb6pqTU.mjs";
4
+ import { i as stringifyForLog } from "./safe-stringify-B5p5ktFe.mjs";
5
+ import { t as mergeCoreFields } from "./entry-fields-J1OBi24o.mjs";
6
+ import { a as httpRequest, t as BatchBuffer } from "./batch-buffer-BvXLDPlV.mjs";
7
7
  import * as https from "node:https";
8
8
  // src/transports/gcp.transport.ts
9
9
  /**
@@ -12,24 +12,28 @@ import * as https from "node:https";
12
12
  * Maps logixia log entries to the GCP Logging REST API format:
13
13
  * - Maps `level` → `severity` (INFO, WARNING, ERROR, CRITICAL…)
14
14
  * - Injects `logging.googleapis.com/trace` for Cloud Trace correlation
15
- * - Injects `logging.googleapis.com/spanId` and `traceSampled`
16
- * - Adds `logging.googleapis.com/sourceLocation` when available
15
+ * - Sets `traceSampled: true` whenever a trace id is present
16
+ * (`logging.googleapis.com/spanId` and `sourceLocation` are not populated)
17
17
  * - Supports structured `jsonPayload` and plain `textPayload`
18
18
  *
19
- * Auth: uses Application Default Credentials (ADC) — the `GOOGLE_APPLICATION_CREDENTIALS`
20
- * env var pointing to a service-account key file, or the metadata server on GCE/GKE.
19
+ * Auth: the metadata server on GCE/GKE/Cloud Run, or a service-account key passed
20
+ * as `credentials`. The `GOOGLE_APPLICATION_CREDENTIALS` key-file variable is not
21
+ * read; full ADC is not supported.
21
22
  *
22
23
  * @example
23
24
  * ```ts
24
- * import { GCPTransport } from 'logixia';
25
+ * import { createLogger } from 'logixia';
26
+ * import { GCPTransport } from 'logixia/gcp';
25
27
  *
26
28
  * const logger = createLogger({
27
29
  * transports: {
28
- * gcp: new GCPTransport({
29
- * projectId: process.env.GOOGLE_CLOUD_PROJECT,
30
- * logName: 'projects/my-project/logs/api',
31
- * resource: { type: 'gce_instance', labels: { instance_id: '123' } },
32
- * }),
30
+ * custom: [
31
+ * new GCPTransport({
32
+ * projectId: process.env.GOOGLE_CLOUD_PROJECT,
33
+ * logName: 'projects/my-project/logs/api',
34
+ * resource: { type: 'gce_instance', labels: { instance_id: '123' } },
35
+ * }),
36
+ * ],
33
37
  * },
34
38
  * });
35
39
  * ```
@@ -228,4 +232,4 @@ var GCPTransport = class {
228
232
  };
229
233
  export { GCPTransport as t };
230
234
 
231
- //# sourceMappingURL=gcp.transport-CGKopAhQ.mjs.map
235
+ //# sourceMappingURL=gcp.transport-DVCmnA3b.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gcp.transport-DVCmnA3b.mjs","names":[],"sources":["../src/transports/gcp.transport.ts"],"sourcesContent":["/**\n * logixia — Google Cloud Logging (Stackdriver) transport\n *\n * Maps logixia log entries to the GCP Logging REST API format:\n * - Maps `level` → `severity` (INFO, WARNING, ERROR, CRITICAL…)\n * - Injects `logging.googleapis.com/trace` for Cloud Trace correlation\n * - Sets `traceSampled: true` whenever a trace id is present\n * (`logging.googleapis.com/spanId` and `sourceLocation` are not populated)\n * - Supports structured `jsonPayload` and plain `textPayload`\n *\n * Auth: the metadata server on GCE/GKE/Cloud Run, or a service-account key passed\n * as `credentials`. The `GOOGLE_APPLICATION_CREDENTIALS` key-file variable is not\n * read; full ADC is not supported.\n *\n * @example\n * ```ts\n * import { createLogger } from 'logixia';\n * import { GCPTransport } from 'logixia/gcp';\n *\n * const logger = createLogger({\n * transports: {\n * custom: [\n * new GCPTransport({\n * projectId: process.env.GOOGLE_CLOUD_PROJECT,\n * logName: 'projects/my-project/logs/api',\n * resource: { type: 'gce_instance', labels: { instance_id: '123' } },\n * }),\n * ],\n * },\n * });\n * ```\n */\n\nimport * as https from 'node:https';\n\nimport type { IAsyncTransport, TransportLogEntry } from '../types/transport.types';\nimport { internalError } from '../utils/internal-log';\nimport { stringifyForLog } from '../utils/safe-stringify';\nimport {\n BatchBuffer,\n DEFAULT_MAX_BUFFER_SIZE,\n DEFAULT_REQUEST_TIMEOUT_MS,\n httpRequest,\n} from './batch-buffer';\nimport { mergeCoreFields } from './entry-fields';\nimport { protectSecrets } from './secret-config';\n\nexport interface GCPMonitoredResource {\n type: string;\n labels?: Record<string, string>;\n}\n\nexport interface GCPTransportConfig {\n /** GCP project ID. Falls back to `GOOGLE_CLOUD_PROJECT` or `GCLOUD_PROJECT` env vars. */\n projectId?: string;\n /**\n * Full log name, e.g. `'projects/my-project/logs/api'`.\n * If omitted, defaults to `projects/{projectId}/logs/logixia`.\n */\n logName?: string;\n /** Monitored resource descriptor. Defaults to `global`. */\n resource?: GCPMonitoredResource;\n /**\n * Service account key JSON (parsed). If omitted, only the metadata server\n * (GCE/GKE/Cloud Run) is tried; the key-file env var is not read.\n */\n credentials?: {\n client_email: string;\n private_key: string;\n };\n /** Number of entries to batch. @default 200 */\n batchSize?: number;\n /** Flush interval in ms. @default 5000 */\n flushIntervalMs?: number;\n /** Abort a request that has not finished after this many ms. @default 10000 */\n requestTimeoutMs?: number;\n /** Max buffered entries; the oldest are dropped past this. @default 10000 */\n maxBufferSize?: number;\n level?: string;\n}\n\ntype GcpSeverity =\n | 'DEFAULT'\n | 'DEBUG'\n | 'INFO'\n | 'NOTICE'\n | 'WARNING'\n | 'ERROR'\n | 'CRITICAL'\n | 'ALERT'\n | 'EMERGENCY';\n\nfunction toGcpSeverity(level: string): GcpSeverity {\n switch (level.toLowerCase()) {\n case 'trace':\n case 'verbose':\n case 'debug':\n return 'DEBUG';\n case 'info':\n case 'log':\n return 'INFO';\n case 'warn':\n case 'warning':\n return 'WARNING';\n case 'error':\n return 'ERROR';\n case 'critical':\n case 'fatal':\n return 'CRITICAL';\n default:\n return 'DEFAULT';\n }\n}\n\n/**\n * Google Cloud Logging transport with trace correlation and GCP severity mapping.\n */\nexport class GCPTransport implements IAsyncTransport {\n public readonly name = 'gcp';\n public readonly batchSize: number;\n public readonly flushInterval: number;\n public readonly level: string | undefined;\n\n private readonly buffer: BatchBuffer<TransportLogEntry>;\n private readonly requestTimeoutMs: number;\n private flushTimer: NodeJS.Timeout | null = null;\n private accessToken: string | null = null;\n private tokenExpiry = 0;\n\n private readonly projectId: string;\n private readonly logName: string;\n private readonly resource: GCPMonitoredResource;\n private readonly credentials: { client_email: string; private_key: string } | undefined;\n\n constructor(config: GCPTransportConfig) {\n protectSecrets(this, ['credentials', 'accessToken']);\n this.projectId =\n config.projectId ??\n process.env['GOOGLE_CLOUD_PROJECT'] ??\n process.env['GCLOUD_PROJECT'] ??\n 'unknown-project';\n this.logName = config.logName ?? `projects/${this.projectId}/logs/logixia`;\n this.resource = config.resource ?? { type: 'global' };\n this.credentials = config.credentials;\n this.batchSize = config.batchSize ?? 200;\n this.flushInterval = config.flushIntervalMs ?? 5000;\n this.level = config.level;\n this.requestTimeoutMs = config.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n this.buffer = new BatchBuffer<TransportLogEntry>({\n name: 'GCPTransport',\n batchSize: this.batchSize,\n maxBufferSize: config.maxBufferSize ?? DEFAULT_MAX_BUFFER_SIZE,\n send: (entries) => this.writeEntries(entries),\n secrets: () => this.secretValues(),\n });\n\n this.flushTimer = setInterval(() => {\n this.flush().catch(() => {});\n }, this.flushInterval);\n if (this.flushTimer.unref) this.flushTimer.unref();\n }\n\n write(entry: TransportLogEntry): void {\n this.buffer.push(entry);\n this.buffer.flushIfFull();\n }\n\n flush(): Promise<void> {\n return this.buffer.flush();\n }\n\n /**\n * Flush remaining entries and stop the interval timer on shutdown. Without\n * this the manager's close() skipped the transport (close was undefined) and\n * buffered entries were lost on deploy. Waits for any in-flight send first.\n */\n async close(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n await this.buffer.close();\n }\n\n private buildLogEntry(entry: TransportLogEntry): Record<string, unknown> {\n const gcpEntry: Record<string, unknown> = {\n logName: this.logName,\n resource: this.resource,\n severity: toGcpSeverity(entry.level),\n timestamp: entry.timestamp ?? new Date().toISOString(),\n jsonPayload: mergeCoreFields(\n { message: entry.message, appName: entry.appName, context: entry.context },\n entry.data\n ),\n };\n\n // GCP Cloud Trace correlation\n if (entry.traceId) {\n gcpEntry['trace'] = `projects/${this.projectId}/traces/${entry.traceId}`;\n gcpEntry['traceSampled'] = true;\n }\n\n return gcpEntry;\n }\n\n private async getAccessToken(): Promise<string | null> {\n if (this.accessToken && Date.now() < this.tokenExpiry) return this.accessToken;\n\n // Try ADC metadata server (GCE/GKE/Cloud Run)\n try {\n const token = await this.fetchFromMetadataServer();\n if (token) {\n this.accessToken = token;\n this.tokenExpiry = Date.now() + 55 * 60 * 1000; // 55 minutes\n return this.accessToken;\n }\n } catch {\n /* fall through to service account */\n }\n\n // Try service account key\n if (this.credentials) {\n try {\n const token = await this.fetchServiceAccountToken();\n if (token) {\n this.accessToken = token;\n this.tokenExpiry = Date.now() + 55 * 60 * 1000;\n return this.accessToken;\n }\n } catch (err) {\n internalError('GCPTransport service account token error', err);\n }\n }\n\n return null;\n }\n\n private fetchFromMetadataServer(): Promise<string | null> {\n return new Promise((resolve, reject) => {\n const req = https.request(\n {\n hostname: 'metadata.google.internal',\n path: '/computeMetadata/v1/instance/service-accounts/default/token',\n headers: { 'Metadata-Flavor': 'Google' },\n timeout: 3000,\n },\n (res) => {\n let raw = '';\n res.on('data', (c: Buffer) => (raw += c.toString()));\n res.on('end', () => {\n if (res.statusCode === 200) {\n try {\n const parsed = JSON.parse(raw) as { access_token?: string };\n resolve(parsed.access_token ?? null);\n } catch {\n resolve(null);\n }\n } else {\n resolve(null);\n }\n });\n }\n );\n req.on('error', reject);\n req.on('timeout', () => {\n req.destroy();\n reject(new Error('metadata timeout'));\n });\n req.end();\n });\n }\n\n private fetchServiceAccountToken(): Promise<string | null> {\n // Minimal JWT creation for service account — only for environments without\n // the full Google Auth Library. For production workloads, prefer ADC.\n if (!this.credentials) return Promise.resolve(null);\n\n const iat = Math.floor(Date.now() / 1000);\n const exp = iat + 3600;\n const scope = 'https://www.googleapis.com/auth/logging.write';\n\n const header = Buffer.from(JSON.stringify({ alg: 'RS256', typ: 'JWT' })).toString('base64url');\n const payload = Buffer.from(\n JSON.stringify({\n iss: this.credentials.client_email,\n scope,\n aud: 'https://oauth2.googleapis.com/token',\n exp,\n iat,\n })\n ).toString('base64url');\n\n const signingInput = `${header}.${payload}`;\n\n let signature: string;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const sign = require('node:crypto').createSign('RSA-SHA256');\n sign.update(signingInput);\n signature = sign.sign(this.credentials.private_key, 'base64url') as string;\n } catch {\n return Promise.resolve(null);\n }\n\n const jwt = `${signingInput}.${signature}`;\n const body = `grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=${jwt}`;\n\n return httpRequest({\n url: new URL('https://oauth2.googleapis.com/token'),\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body,\n timeoutMs: this.requestTimeoutMs,\n label: 'GCP token request',\n }).then(\n (res) => (JSON.parse(res.body) as { access_token?: string }).access_token ?? null,\n () => null\n );\n }\n\n private secretValues(token?: string): (string | undefined)[] {\n return [\n ...(this.credentials?.private_key.split('\\n') ?? []),\n this.credentials?.private_key,\n this.accessToken ?? undefined,\n token,\n ];\n }\n\n private async writeEntries(entries: TransportLogEntry[]): Promise<void> {\n const token = await this.getAccessToken();\n if (!token) {\n throw new Error('GCPTransport: no access token available');\n }\n\n const body = stringifyForLog({\n logName: this.logName,\n resource: this.resource,\n entries: entries.map((e) => this.buildLogEntry(e)),\n });\n\n await httpRequest({\n url: new URL('https://logging.googleapis.com/v2/entries:write'),\n headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },\n body,\n timeoutMs: this.requestTimeoutMs,\n label: 'GCP Logging API',\n secrets: () => this.secretValues(token),\n });\n }\n}\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- const require_secret_config = require("./secret-config-CBZBs0p1.js");
2
- const require_internal_log = require("./internal-log-b0Vp4qrB.js");
3
- const require_safe_stringify = require("./safe-stringify-DLz1Kz3o.js");
4
- const require_entry_fields = require("./entry-fields-RLd1jCoR.js");
5
- const require_batch_buffer = require("./batch-buffer-DT4gdXmf.js");
1
+ const require_secret_config = require("./secret-config-CmK2wVkr.js");
2
+ const require_internal_log = require("./internal-log-By4Govmu.js");
3
+ const require_safe_stringify = require("./safe-stringify-J3sh-7YM.js");
4
+ const require_entry_fields = require("./entry-fields-BSLkzw18.js");
5
+ const require_batch_buffer = require("./batch-buffer-C7Am4Mw-.js");
6
6
  let node_https = require("node:https");
7
7
  node_https = require_secret_config.__toESM(node_https);
8
8
  // src/transports/gcp.transport.ts
@@ -12,24 +12,28 @@ node_https = require_secret_config.__toESM(node_https);
12
12
  * Maps logixia log entries to the GCP Logging REST API format:
13
13
  * - Maps `level` → `severity` (INFO, WARNING, ERROR, CRITICAL…)
14
14
  * - Injects `logging.googleapis.com/trace` for Cloud Trace correlation
15
- * - Injects `logging.googleapis.com/spanId` and `traceSampled`
16
- * - Adds `logging.googleapis.com/sourceLocation` when available
15
+ * - Sets `traceSampled: true` whenever a trace id is present
16
+ * (`logging.googleapis.com/spanId` and `sourceLocation` are not populated)
17
17
  * - Supports structured `jsonPayload` and plain `textPayload`
18
18
  *
19
- * Auth: uses Application Default Credentials (ADC) — the `GOOGLE_APPLICATION_CREDENTIALS`
20
- * env var pointing to a service-account key file, or the metadata server on GCE/GKE.
19
+ * Auth: the metadata server on GCE/GKE/Cloud Run, or a service-account key passed
20
+ * as `credentials`. The `GOOGLE_APPLICATION_CREDENTIALS` key-file variable is not
21
+ * read; full ADC is not supported.
21
22
  *
22
23
  * @example
23
24
  * ```ts
24
- * import { GCPTransport } from 'logixia';
25
+ * import { createLogger } from 'logixia';
26
+ * import { GCPTransport } from 'logixia/gcp';
25
27
  *
26
28
  * const logger = createLogger({
27
29
  * transports: {
28
- * gcp: new GCPTransport({
29
- * projectId: process.env.GOOGLE_CLOUD_PROJECT,
30
- * logName: 'projects/my-project/logs/api',
31
- * resource: { type: 'gce_instance', labels: { instance_id: '123' } },
32
- * }),
30
+ * custom: [
31
+ * new GCPTransport({
32
+ * projectId: process.env.GOOGLE_CLOUD_PROJECT,
33
+ * logName: 'projects/my-project/logs/api',
34
+ * resource: { type: 'gce_instance', labels: { instance_id: '123' } },
35
+ * }),
36
+ * ],
33
37
  * },
34
38
  * });
35
39
  * ```
@@ -233,4 +237,4 @@ Object.defineProperty(exports, "GCPTransport", {
233
237
  }
234
238
  });
235
239
 
236
- //# sourceMappingURL=gcp.transport-KZe9hCAR.js.map
240
+ //# sourceMappingURL=gcp.transport-Dy2Lf8FI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gcp.transport-Dy2Lf8FI.js","names":["BatchBuffer","mergeCoreFields","https","httpRequest","stringifyForLog"],"sources":["../src/transports/gcp.transport.ts"],"sourcesContent":["/**\n * logixia — Google Cloud Logging (Stackdriver) transport\n *\n * Maps logixia log entries to the GCP Logging REST API format:\n * - Maps `level` → `severity` (INFO, WARNING, ERROR, CRITICAL…)\n * - Injects `logging.googleapis.com/trace` for Cloud Trace correlation\n * - Sets `traceSampled: true` whenever a trace id is present\n * (`logging.googleapis.com/spanId` and `sourceLocation` are not populated)\n * - Supports structured `jsonPayload` and plain `textPayload`\n *\n * Auth: the metadata server on GCE/GKE/Cloud Run, or a service-account key passed\n * as `credentials`. The `GOOGLE_APPLICATION_CREDENTIALS` key-file variable is not\n * read; full ADC is not supported.\n *\n * @example\n * ```ts\n * import { createLogger } from 'logixia';\n * import { GCPTransport } from 'logixia/gcp';\n *\n * const logger = createLogger({\n * transports: {\n * custom: [\n * new GCPTransport({\n * projectId: process.env.GOOGLE_CLOUD_PROJECT,\n * logName: 'projects/my-project/logs/api',\n * resource: { type: 'gce_instance', labels: { instance_id: '123' } },\n * }),\n * ],\n * },\n * });\n * ```\n */\n\nimport * as https from 'node:https';\n\nimport type { IAsyncTransport, TransportLogEntry } from '../types/transport.types';\nimport { internalError } from '../utils/internal-log';\nimport { stringifyForLog } from '../utils/safe-stringify';\nimport {\n BatchBuffer,\n DEFAULT_MAX_BUFFER_SIZE,\n DEFAULT_REQUEST_TIMEOUT_MS,\n httpRequest,\n} from './batch-buffer';\nimport { mergeCoreFields } from './entry-fields';\nimport { protectSecrets } from './secret-config';\n\nexport interface GCPMonitoredResource {\n type: string;\n labels?: Record<string, string>;\n}\n\nexport interface GCPTransportConfig {\n /** GCP project ID. Falls back to `GOOGLE_CLOUD_PROJECT` or `GCLOUD_PROJECT` env vars. */\n projectId?: string;\n /**\n * Full log name, e.g. `'projects/my-project/logs/api'`.\n * If omitted, defaults to `projects/{projectId}/logs/logixia`.\n */\n logName?: string;\n /** Monitored resource descriptor. Defaults to `global`. */\n resource?: GCPMonitoredResource;\n /**\n * Service account key JSON (parsed). If omitted, only the metadata server\n * (GCE/GKE/Cloud Run) is tried; the key-file env var is not read.\n */\n credentials?: {\n client_email: string;\n private_key: string;\n };\n /** Number of entries to batch. @default 200 */\n batchSize?: number;\n /** Flush interval in ms. @default 5000 */\n flushIntervalMs?: number;\n /** Abort a request that has not finished after this many ms. @default 10000 */\n requestTimeoutMs?: number;\n /** Max buffered entries; the oldest are dropped past this. @default 10000 */\n maxBufferSize?: number;\n level?: string;\n}\n\ntype GcpSeverity =\n | 'DEFAULT'\n | 'DEBUG'\n | 'INFO'\n | 'NOTICE'\n | 'WARNING'\n | 'ERROR'\n | 'CRITICAL'\n | 'ALERT'\n | 'EMERGENCY';\n\nfunction toGcpSeverity(level: string): GcpSeverity {\n switch (level.toLowerCase()) {\n case 'trace':\n case 'verbose':\n case 'debug':\n return 'DEBUG';\n case 'info':\n case 'log':\n return 'INFO';\n case 'warn':\n case 'warning':\n return 'WARNING';\n case 'error':\n return 'ERROR';\n case 'critical':\n case 'fatal':\n return 'CRITICAL';\n default:\n return 'DEFAULT';\n }\n}\n\n/**\n * Google Cloud Logging transport with trace correlation and GCP severity mapping.\n */\nexport class GCPTransport implements IAsyncTransport {\n public readonly name = 'gcp';\n public readonly batchSize: number;\n public readonly flushInterval: number;\n public readonly level: string | undefined;\n\n private readonly buffer: BatchBuffer<TransportLogEntry>;\n private readonly requestTimeoutMs: number;\n private flushTimer: NodeJS.Timeout | null = null;\n private accessToken: string | null = null;\n private tokenExpiry = 0;\n\n private readonly projectId: string;\n private readonly logName: string;\n private readonly resource: GCPMonitoredResource;\n private readonly credentials: { client_email: string; private_key: string } | undefined;\n\n constructor(config: GCPTransportConfig) {\n protectSecrets(this, ['credentials', 'accessToken']);\n this.projectId =\n config.projectId ??\n process.env['GOOGLE_CLOUD_PROJECT'] ??\n process.env['GCLOUD_PROJECT'] ??\n 'unknown-project';\n this.logName = config.logName ?? `projects/${this.projectId}/logs/logixia`;\n this.resource = config.resource ?? { type: 'global' };\n this.credentials = config.credentials;\n this.batchSize = config.batchSize ?? 200;\n this.flushInterval = config.flushIntervalMs ?? 5000;\n this.level = config.level;\n this.requestTimeoutMs = config.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n this.buffer = new BatchBuffer<TransportLogEntry>({\n name: 'GCPTransport',\n batchSize: this.batchSize,\n maxBufferSize: config.maxBufferSize ?? DEFAULT_MAX_BUFFER_SIZE,\n send: (entries) => this.writeEntries(entries),\n secrets: () => this.secretValues(),\n });\n\n this.flushTimer = setInterval(() => {\n this.flush().catch(() => {});\n }, this.flushInterval);\n if (this.flushTimer.unref) this.flushTimer.unref();\n }\n\n write(entry: TransportLogEntry): void {\n this.buffer.push(entry);\n this.buffer.flushIfFull();\n }\n\n flush(): Promise<void> {\n return this.buffer.flush();\n }\n\n /**\n * Flush remaining entries and stop the interval timer on shutdown. Without\n * this the manager's close() skipped the transport (close was undefined) and\n * buffered entries were lost on deploy. Waits for any in-flight send first.\n */\n async close(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n await this.buffer.close();\n }\n\n private buildLogEntry(entry: TransportLogEntry): Record<string, unknown> {\n const gcpEntry: Record<string, unknown> = {\n logName: this.logName,\n resource: this.resource,\n severity: toGcpSeverity(entry.level),\n timestamp: entry.timestamp ?? new Date().toISOString(),\n jsonPayload: mergeCoreFields(\n { message: entry.message, appName: entry.appName, context: entry.context },\n entry.data\n ),\n };\n\n // GCP Cloud Trace correlation\n if (entry.traceId) {\n gcpEntry['trace'] = `projects/${this.projectId}/traces/${entry.traceId}`;\n gcpEntry['traceSampled'] = true;\n }\n\n return gcpEntry;\n }\n\n private async getAccessToken(): Promise<string | null> {\n if (this.accessToken && Date.now() < this.tokenExpiry) return this.accessToken;\n\n // Try ADC metadata server (GCE/GKE/Cloud Run)\n try {\n const token = await this.fetchFromMetadataServer();\n if (token) {\n this.accessToken = token;\n this.tokenExpiry = Date.now() + 55 * 60 * 1000; // 55 minutes\n return this.accessToken;\n }\n } catch {\n /* fall through to service account */\n }\n\n // Try service account key\n if (this.credentials) {\n try {\n const token = await this.fetchServiceAccountToken();\n if (token) {\n this.accessToken = token;\n this.tokenExpiry = Date.now() + 55 * 60 * 1000;\n return this.accessToken;\n }\n } catch (err) {\n internalError('GCPTransport service account token error', err);\n }\n }\n\n return null;\n }\n\n private fetchFromMetadataServer(): Promise<string | null> {\n return new Promise((resolve, reject) => {\n const req = https.request(\n {\n hostname: 'metadata.google.internal',\n path: '/computeMetadata/v1/instance/service-accounts/default/token',\n headers: { 'Metadata-Flavor': 'Google' },\n timeout: 3000,\n },\n (res) => {\n let raw = '';\n res.on('data', (c: Buffer) => (raw += c.toString()));\n res.on('end', () => {\n if (res.statusCode === 200) {\n try {\n const parsed = JSON.parse(raw) as { access_token?: string };\n resolve(parsed.access_token ?? null);\n } catch {\n resolve(null);\n }\n } else {\n resolve(null);\n }\n });\n }\n );\n req.on('error', reject);\n req.on('timeout', () => {\n req.destroy();\n reject(new Error('metadata timeout'));\n });\n req.end();\n });\n }\n\n private fetchServiceAccountToken(): Promise<string | null> {\n // Minimal JWT creation for service account — only for environments without\n // the full Google Auth Library. For production workloads, prefer ADC.\n if (!this.credentials) return Promise.resolve(null);\n\n const iat = Math.floor(Date.now() / 1000);\n const exp = iat + 3600;\n const scope = 'https://www.googleapis.com/auth/logging.write';\n\n const header = Buffer.from(JSON.stringify({ alg: 'RS256', typ: 'JWT' })).toString('base64url');\n const payload = Buffer.from(\n JSON.stringify({\n iss: this.credentials.client_email,\n scope,\n aud: 'https://oauth2.googleapis.com/token',\n exp,\n iat,\n })\n ).toString('base64url');\n\n const signingInput = `${header}.${payload}`;\n\n let signature: string;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const sign = require('node:crypto').createSign('RSA-SHA256');\n sign.update(signingInput);\n signature = sign.sign(this.credentials.private_key, 'base64url') as string;\n } catch {\n return Promise.resolve(null);\n }\n\n const jwt = `${signingInput}.${signature}`;\n const body = `grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=${jwt}`;\n\n return httpRequest({\n url: new URL('https://oauth2.googleapis.com/token'),\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body,\n timeoutMs: this.requestTimeoutMs,\n label: 'GCP token request',\n }).then(\n (res) => (JSON.parse(res.body) as { access_token?: string }).access_token ?? null,\n () => null\n );\n }\n\n private secretValues(token?: string): (string | undefined)[] {\n return [\n ...(this.credentials?.private_key.split('\\n') ?? []),\n this.credentials?.private_key,\n this.accessToken ?? undefined,\n token,\n ];\n }\n\n private async writeEntries(entries: TransportLogEntry[]): Promise<void> {\n const token = await this.getAccessToken();\n if (!token) {\n throw new Error('GCPTransport: no access token available');\n }\n\n const body = stringifyForLog({\n logName: this.logName,\n resource: this.resource,\n entries: entries.map((e) => this.buildLogEntry(e)),\n });\n\n await httpRequest({\n url: new URL('https://logging.googleapis.com/v2/entries:write'),\n headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },\n body,\n timeoutMs: this.requestTimeoutMs,\n label: 'GCP Logging API',\n secrets: () => this.secretValues(token),\n });\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Structural request/response shapes shared by every framework helper, so Express,
3
+ * Fastify and Node `http` objects are accepted without importing their types. Every
4
+ * optional member also accepts `undefined`, which keeps `exactOptionalPropertyTypes`
5
+ * consumers compiling against real framework types.
6
+ */
7
+ /** Minimal request shape that Express, Fastify and Node `IncomingMessage` satisfy. */
8
+ interface HttpRequestShape {
9
+ method?: string | undefined;
10
+ url?: string | undefined;
11
+ originalUrl?: string | undefined;
12
+ headers?: Record<string, string | string[] | undefined> | undefined;
13
+ body?: unknown;
14
+ ip?: string | undefined;
15
+ id?: unknown;
16
+ socket?: {
17
+ remoteAddress?: string | undefined;
18
+ } | undefined;
19
+ }
20
+ /** Minimal response shape that Express, Fastify replies and Node `ServerResponse` satisfy. */
21
+ interface HttpResponseShape {
22
+ statusCode?: number | undefined;
23
+ on?: ((event: string, cb: () => void) => void) | undefined;
24
+ once?: ((event: string, cb: () => void) => void) | undefined;
25
+ getHeader?: ((name: string) => string | number | string[] | undefined) | undefined;
26
+ /** Express / Node `res.setHeader`. */
27
+ setHeader?: ((name: string, value: string) => unknown) | undefined;
28
+ /** Fastify `reply.header`. */
29
+ header?: ((name: string, value: string) => unknown) | undefined;
30
+ }
31
+ export { HttpResponseShape as n, HttpRequestShape as t };
32
+ //# sourceMappingURL=http-shapes-BnBkJcid.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-shapes-BnBkJcid.d.mts","names":[],"sources":["../src/types/http-shapes.ts"],"mappings":";;;;;;;UAQiB;EACf;EACA;EACA;EACA,UAAU;EACV;EACA;EACA;EACA;IAAW;;;;UAII;EACf;EACA,OAAO,eAAe;EACtB,SAAS,eAAe;EACxB,cAAc;;EAEd,cAAc,cAAc;;EAE5B,WAAW,cAAc"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Structural request/response shapes shared by every framework helper, so Express,
3
+ * Fastify and Node `http` objects are accepted without importing their types. Every
4
+ * optional member also accepts `undefined`, which keeps `exactOptionalPropertyTypes`
5
+ * consumers compiling against real framework types.
6
+ */
7
+ /** Minimal request shape that Express, Fastify and Node `IncomingMessage` satisfy. */
8
+ interface HttpRequestShape {
9
+ method?: string | undefined;
10
+ url?: string | undefined;
11
+ originalUrl?: string | undefined;
12
+ headers?: Record<string, string | string[] | undefined> | undefined;
13
+ body?: unknown;
14
+ ip?: string | undefined;
15
+ id?: unknown;
16
+ socket?: {
17
+ remoteAddress?: string | undefined;
18
+ } | undefined;
19
+ }
20
+ /** Minimal response shape that Express, Fastify replies and Node `ServerResponse` satisfy. */
21
+ interface HttpResponseShape {
22
+ statusCode?: number | undefined;
23
+ on?: ((event: string, cb: () => void) => void) | undefined;
24
+ once?: ((event: string, cb: () => void) => void) | undefined;
25
+ getHeader?: ((name: string) => string | number | string[] | undefined) | undefined;
26
+ /** Express / Node `res.setHeader`. */
27
+ setHeader?: ((name: string, value: string) => unknown) | undefined;
28
+ /** Fastify `reply.header`. */
29
+ header?: ((name: string, value: string) => unknown) | undefined;
30
+ }
31
+ export { HttpResponseShape as n, HttpRequestShape as t };
32
+ //# sourceMappingURL=http-shapes-BnBkJcid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-shapes-BnBkJcid.d.ts","names":[],"sources":["../src/types/http-shapes.ts"],"mappings":";;;;;;;UAQiB;EACf;EACA;EACA;EACA,UAAU;EACV;EACA;EACA;EACA;IAAW;;;;UAII;EACf;EACA,OAAO,eAAe;EACtB,SAAS,eAAe;EACxB,cAAc;;EAEd,cAAc,cAAc;;EAE5B,WAAW,cAAc"}
@@ -1,4 +1,100 @@
1
- import { f as TransportConfig } from "./transport.types-BJVL1QQl.mjs";
1
+ import { h as TransportConfig } from "./transport.types-CzJq4IrF.mjs";
2
+ interface LogixiaPlugin {
3
+ /**
4
+ * Unique plugin name.
5
+ * logixia uses this to prevent duplicate registration of the same plugin
6
+ * on the same logger instance.
7
+ */
8
+ name: string;
9
+ /**
10
+ * Called once immediately after `logger.use(plugin)` is called.
11
+ * Use for one-time setup (open connections, allocate buffers, etc.).
12
+ * Async `onInit` errors are silently swallowed to avoid blocking the logger.
13
+ */
14
+ onInit?(): void | Promise<void>;
15
+ /**
16
+ * Called for every log entry **after** PII redaction and **before** transport
17
+ * dispatch. Plugins run in registration order; each receives the (possibly
18
+ * modified) output of the previous plugin.
19
+ *
20
+ * - Return the entry (modified or unchanged) to continue processing.
21
+ * - Return `null` to **drop** the entry — no transport will receive it.
22
+ *
23
+ * Errors thrown inside `onLog` are swallowed so a buggy plugin cannot crash
24
+ * logging; the chain continues with the previous (un-transformed) entry.
25
+ */
26
+ onLog?(entry: LogEntry): LogEntry | null | Promise<LogEntry | null>;
27
+ /**
28
+ * Called when a transport write fails (after any configured retries).
29
+ * Useful for routing transport errors to an alerting or metrics system.
30
+ * Errors thrown inside `onError` are silently swallowed.
31
+ */
32
+ onError?(error: Error, entry?: LogEntry): void | Promise<void>;
33
+ /**
34
+ * Called when the logger is closed via `logger.close()` or the process
35
+ * receives a shutdown signal (when `gracefulShutdown` is enabled).
36
+ * Errors thrown inside `onShutdown` are silently swallowed.
37
+ */
38
+ onShutdown?(): void | Promise<void>;
39
+ }
40
+ /**
41
+ * Holds an ordered list of `LogixiaPlugin` instances and dispatches lifecycle
42
+ * events to them. One registry is created per logger instance; a global
43
+ * singleton is also exported for process-wide registration.
44
+ */
45
+ declare class PluginRegistry {
46
+ private readonly _plugins;
47
+ /**
48
+ * Register a plugin. Silently skips if a plugin with the same `name` is
49
+ * already registered on this registry.
50
+ */
51
+ register(plugin: LogixiaPlugin): void;
52
+ /** Remove a previously registered plugin by name. No-op if not found. */
53
+ unregister(name: string): void;
54
+ /** Returns `true` if a plugin with the given name is registered. */
55
+ has(name: string): boolean;
56
+ /** Number of currently registered plugins. */
57
+ get size(): number;
58
+ /**
59
+ * Run all `onLog` hooks in order.
60
+ * Returns `null` if any plugin cancels the entry; otherwise returns the
61
+ * (possibly transformed) entry.
62
+ */
63
+ runOnLog(entry: LogEntry): Promise<LogEntry | null>;
64
+ /**
65
+ * Notify all `onError` hooks.
66
+ * Errors thrown inside hooks are swallowed to prevent error cascades.
67
+ */
68
+ runOnError(error: Error, entry?: LogEntry): Promise<void>;
69
+ /** Run all `onShutdown` hooks concurrently. Hook errors are swallowed. */
70
+ runOnShutdown(): Promise<void>;
71
+ }
72
+ /**
73
+ * Module-level singleton registry.
74
+ *
75
+ * Plugins registered here are automatically copied into every **new** logger
76
+ * instance created after the registration. Already-created loggers are not
77
+ * retroactively affected — use `logger.use(plugin)` for per-instance control.
78
+ */
79
+ declare const globalPluginRegistry: PluginRegistry;
80
+ /**
81
+ * Register a plugin in the global registry so it applies to every future
82
+ * logger instance.
83
+ *
84
+ * @example
85
+ * ```ts
86
+ * import { usePlugin } from 'logixia';
87
+ *
88
+ * usePlugin({
89
+ * name: 'audit-sink',
90
+ * onLog(entry) {
91
+ * if (entry.level === 'error') auditQueue.push(entry);
92
+ * return entry;
93
+ * },
94
+ * });
95
+ * ```
96
+ */
97
+ declare function usePlugin(plugin: LogixiaPlugin): void;
2
98
  /**
3
99
  * HTTP-related type definitions for Logixia
4
100
  */
@@ -292,7 +388,9 @@ interface IBaseLogger {
292
388
  time(label: string): void;
293
389
  timeEnd(label: string): Promise<number | undefined>;
294
390
  timeAsync<T>(label: string, fn: () => Promise<T>): Promise<T>;
391
+ /** Set the minimum log level at runtime. Unknown levels are ignored with a warning. */
295
392
  setLevel(level: LogLevel | string): void;
393
+ /** Return the configured minimum log level (not the per-namespace effective one). */
296
394
  getLevel(): string;
297
395
  setContext(context: string): void;
298
396
  getContext(): string | undefined;
@@ -311,17 +409,53 @@ interface IBaseLogger {
311
409
  getAvailableTransports(): string[];
312
410
  child(context: string, data?: Record<string, unknown>): ILogger;
313
411
  close(): Promise<void>;
314
- use(plugin: {
315
- name: string;
316
- }): this;
412
+ use(plugin: LogixiaPlugin): this;
317
413
  unuse(pluginName: string): this;
318
414
  }
319
- type CustomLevelMethods<T extends Record<string, number>> = { [K in keyof T]: (message: string, data?: Record<string, unknown>) => Promise<void>; };
415
+ /**
416
+ * Runtime controls implemented by loggers returned from `createLogger`.
417
+ * Kept separate from {@link IBaseLogger} and {@link ILogger}, so existing
418
+ * implementations of those (mocks, adapters) keep compiling.
419
+ */
420
+ interface ILoggerRuntimeControls {
421
+ /**
422
+ * Replace the per-namespace level map at runtime.
423
+ * @example logger.setNamespaceLevels({ 'db.*': 'debug', '*': 'info' });
424
+ */
425
+ setNamespaceLevels(levels: NamespaceLevels): void;
426
+ /** Merge entries into the existing per-namespace level map at runtime. */
427
+ patchNamespaceLevels(levels: NamespaceLevels): void;
428
+ /** Return a copy of the current per-namespace level map. */
429
+ getNamespaceLevels(): NamespaceLevels;
430
+ /** Flush buffered entries in all transports without closing them. */
431
+ flush(): Promise<void>;
432
+ /** Report whether the transports are healthy. */
433
+ healthCheck(): Promise<{
434
+ healthy: boolean;
435
+ details: Record<string, unknown>;
436
+ }>;
437
+ }
438
+ /**
439
+ * Logger member names a custom level must not use: a level with one of these
440
+ * names would shadow, or be shadowed by, a built-in logger method. The built-in
441
+ * level methods (`error`, `warn`, `info`, `debug`, `trace`, `verbose`) are valid level names.
442
+ */
443
+ type ReservedLevelName = Exclude<keyof IBaseLogger | keyof ILoggerRuntimeControls, 'error' | 'warn' | 'info' | 'debug' | 'trace' | 'verbose'>;
444
+ type CustomLevelMethods<T extends Record<string, number>> = { [K in keyof T as K extends ReservedLevelName ? never : K]: (message: string, data?: Record<string, unknown>) => Promise<void>; };
320
445
  type ILogger<TLevels extends Record<string, number> = {}> = IBaseLogger & CustomLevelMethods<TLevels>;
321
446
  interface ILoggerDefault extends IBaseLogger {}
447
+ /** What `createLogger` returns for a config with custom levels: the logger plus its runtime controls. */
448
+ type LogixiaLoggerInstance<TLevels extends Record<string, number> = {}> = {
449
+ /** Child loggers carry the runtime controls too. */
450
+ child(context: string, data?: Record<string, unknown>): LogixiaLoggerInstance<TLevels>;
451
+ } & ILogger<TLevels> & ILoggerRuntimeControls;
452
+ /** What `createLogger` returns for a config without custom levels. */
453
+ interface LogixiaLoggerDefault extends ILoggerDefault, ILoggerRuntimeControls {
454
+ child(context: string, data?: Record<string, unknown>): LogixiaLoggerDefault;
455
+ }
322
456
  type LoggerWithLevels<T extends LoggerConfig<any>> = T['levelOptions'] extends {
323
457
  levels: infer L;
324
- } ? L extends Record<string, number> ? ILogger<L> : ILoggerDefault : ILoggerDefault;
458
+ } ? L extends Record<string, number> ? LogixiaLoggerInstance<L> : LogixiaLoggerDefault : LogixiaLoggerDefault;
325
459
  type ExtractLevels<T> = T extends LoggerConfig<infer L> ? L : Record<string, number>;
326
460
  interface LogEntry {
327
461
  timestamp: string;
@@ -380,5 +514,5 @@ declare const DEFAULT_LOG_COLORS: {
380
514
  trace: string;
381
515
  verbose: string;
382
516
  };
383
- export { HttpResponse as A, RequestContext as C, TraceIdExtractorConfig as D, TraceIdConfig as E, RequestTiming as M, HttpError as O, RedactConfig as S, TimingEntry as T, LogLevel as _, DEFAULT_LOG_LEVELS as a, LoggerWithLevels as b, ExtractLevels as c, ILogFormatter as d, ILogger as f, LogFieldKey as g, LogEntry as h, DEFAULT_LOG_COLORS as i, RequestMetrics as j, HttpRequest as k, GracefulShutdownConfig as l, LogColor as m, ContextData as n, Environment as o, ILoggerDefault as p, CustomLevelMethods as r, ErrorSerializationOptions as s, AdaptiveSamplingConfig as t, IBaseLogger as u, LogLevelString as v, SamplingConfig as w, NamespaceLevels as x, LoggerConfig as y };
384
- //# sourceMappingURL=index-xqaJtAZn.d.mts.map
517
+ export { TraceIdConfig as A, usePlugin as B, LogixiaLoggerInstance as C, ReservedLevelName as D, RequestContext as E, RequestMetrics as F, RequestTiming as I, LogixiaPlugin as L, HttpError as M, HttpRequest as N, SamplingConfig as O, HttpResponse as P, PluginRegistry as R, LogixiaLoggerDefault as S, RedactConfig as T, LogFieldKey as _, DEFAULT_LOG_LEVELS as a, LoggerConfig as b, ExtractLevels as c, ILogFormatter as d, ILogger as f, LogEntry as g, LogColor as h, DEFAULT_LOG_COLORS as i, TraceIdExtractorConfig as j, TimingEntry as k, GracefulShutdownConfig as l, ILoggerRuntimeControls as m, ContextData as n, Environment as o, ILoggerDefault as p, CustomLevelMethods as r, ErrorSerializationOptions as s, AdaptiveSamplingConfig as t, IBaseLogger as u, LogLevel as v, NamespaceLevels as w, LoggerWithLevels as x, LogLevelString as y, globalPluginRegistry as z };
518
+ //# sourceMappingURL=index-BSTtFcQ6.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-BSTtFcQ6.d.mts","names":[],"sources":["../src/plugin.ts","../src/types/http.types.ts","../src/types/index.ts"],"mappings":"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"}