logixia 2.0.0 → 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.
- package/README.md +172 -2597
- package/dist/async-context-2mbUKhcl.mjs +132 -0
- package/dist/async-context-2mbUKhcl.mjs.map +1 -0
- package/dist/async-context-DUFMDYAr.js +148 -0
- package/dist/async-context-DUFMDYAr.js.map +1 -0
- package/dist/{azure-monitor.transport-CrvfHd9C.js → azure-monitor.transport-Bu4S2I2q.js} +32 -20
- package/dist/azure-monitor.transport-Bu4S2I2q.js.map +1 -0
- package/dist/{azure-monitor.transport-Cn_3Usvu.d.ts → azure-monitor.transport-Bvf7Xegt.d.ts} +3 -6
- package/dist/azure-monitor.transport-Bvf7Xegt.d.ts.map +1 -0
- package/dist/{azure-monitor.transport-CHnjVRF-.mjs → azure-monitor.transport-C1RWAumT.mjs} +27 -15
- package/dist/azure-monitor.transport-C1RWAumT.mjs.map +1 -0
- package/dist/{azure-monitor.transport-D7Da4RAb.d.mts → azure-monitor.transport-CbSHOnNX.d.mts} +3 -6
- package/dist/azure-monitor.transport-CbSHOnNX.d.mts.map +1 -0
- package/dist/azure.d.mts +1 -2
- package/dist/azure.d.ts +1 -2
- package/dist/azure.js +3 -6
- package/dist/azure.mjs +1 -6
- package/dist/{batch-buffer-PGvSgbmd.mjs → batch-buffer-BvXLDPlV.mjs} +21 -7
- package/dist/batch-buffer-BvXLDPlV.mjs.map +1 -0
- package/dist/{batch-buffer-BY-mRWIK.js → batch-buffer-C7Am4Mw-.js} +53 -40
- package/dist/batch-buffer-C7Am4Mw-.js.map +1 -0
- package/dist/browser.d.mts +47 -27
- package/dist/browser.d.mts.map +1 -1
- package/dist/browser.d.ts +47 -27
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +464 -62
- package/dist/browser.js.map +1 -1
- package/dist/browser.mjs +465 -65
- package/dist/browser.mjs.map +1 -1
- package/dist/{builder-0gEzRopq.mjs → builder-DhNhvOkt.mjs} +307 -246
- package/dist/builder-DhNhvOkt.mjs.map +1 -0
- package/dist/{builder-D44QktIo.js → builder-yFvJrz7o.js} +435 -399
- package/dist/builder-yFvJrz7o.js.map +1 -0
- package/dist/cli/index.js +216 -125
- package/dist/cloudwatch.d.mts +1 -2
- package/dist/cloudwatch.d.ts +1 -2
- package/dist/cloudwatch.js +3 -7
- package/dist/cloudwatch.mjs +1 -7
- package/dist/{cloudwatch.transport-DsEq633o.d.ts → cloudwatch.transport-CQyT6U91.d.ts} +2 -6
- package/dist/cloudwatch.transport-CQyT6U91.d.ts.map +1 -0
- package/dist/{cloudwatch.transport-BO1ahxw-.js → cloudwatch.transport-Ch1Uae-0.js} +61 -36
- package/dist/cloudwatch.transport-Ch1Uae-0.js.map +1 -0
- package/dist/{cloudwatch.transport-UlyZFWMn.d.mts → cloudwatch.transport-CjVrI6S4.d.mts} +2 -6
- package/dist/cloudwatch.transport-CjVrI6S4.d.mts.map +1 -0
- package/dist/{cloudwatch.transport-DZ6ies7g.mjs → cloudwatch.transport-DZqF2xZO.mjs} +54 -28
- package/dist/cloudwatch.transport-DZqF2xZO.mjs.map +1 -0
- package/dist/{coerce.utils-Cu6IUTgX.mjs → coerce.utils-B_rEudCn.mjs} +3 -4
- package/dist/{coerce.utils-Cu6IUTgX.mjs.map → coerce.utils-B_rEudCn.mjs.map} +1 -1
- package/dist/{coerce.utils-B-LilukN.js → coerce.utils-C1C5sIX0.js} +8 -10
- package/dist/{coerce.utils-B-LilukN.js.map → coerce.utils-C1C5sIX0.js.map} +1 -1
- package/dist/correlation.d.mts +15 -69
- package/dist/correlation.d.mts.map +1 -1
- package/dist/correlation.d.ts +15 -69
- package/dist/correlation.d.ts.map +1 -1
- package/dist/correlation.js +69 -20
- package/dist/correlation.js.map +1 -1
- package/dist/correlation.mjs +67 -17
- package/dist/correlation.mjs.map +1 -1
- package/dist/{entry-fields-BvOLFlJ4.js → entry-fields-BSLkzw18.js} +16 -13
- package/dist/entry-fields-BSLkzw18.js.map +1 -0
- package/dist/{entry-fields-BJkuPnIg.mjs → entry-fields-J1OBi24o.mjs} +11 -7
- package/dist/entry-fields-J1OBi24o.mjs.map +1 -0
- package/dist/gcp.d.mts +1 -2
- package/dist/gcp.d.ts +1 -2
- package/dist/gcp.js +3 -7
- package/dist/gcp.mjs +1 -7
- package/dist/{gcp.transport-B7oc97sG.d.ts → gcp.transport-BCIvdFV-.d.ts} +5 -8
- package/dist/gcp.transport-BCIvdFV-.d.ts.map +1 -0
- package/dist/{gcp.transport-GrJurKo8.d.mts → gcp.transport-D9SdLPwP.d.mts} +5 -8
- package/dist/gcp.transport-D9SdLPwP.d.mts.map +1 -0
- package/dist/{gcp.transport-DBX5TPIy.mjs → gcp.transport-DVCmnA3b.mjs} +59 -16
- package/dist/gcp.transport-DVCmnA3b.mjs.map +1 -0
- package/dist/{gcp.transport-CHV8MGgz.js → gcp.transport-Dy2Lf8FI.js} +64 -22
- package/dist/gcp.transport-Dy2Lf8FI.js.map +1 -0
- package/dist/http-shapes-BnBkJcid.d.mts +32 -0
- package/dist/http-shapes-BnBkJcid.d.mts.map +1 -0
- package/dist/http-shapes-BnBkJcid.d.ts +32 -0
- package/dist/http-shapes-BnBkJcid.d.ts.map +1 -0
- package/dist/{index-3mw5gaCw.d.mts → index-BSTtFcQ6.d.mts} +142 -13
- package/dist/index-BSTtFcQ6.d.mts.map +1 -0
- package/dist/{index-DhIoploR.d.ts → index-CFDGkI8n.d.ts} +142 -13
- package/dist/index-CFDGkI8n.d.ts.map +1 -0
- package/dist/index.d.mts +114 -217
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +113 -216
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +182 -279
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +160 -256
- package/dist/index.mjs.map +1 -1
- package/dist/internal-log-Bg4V1cPg.mjs +170 -0
- package/dist/internal-log-Bg4V1cPg.mjs.map +1 -0
- package/dist/internal-log-By4Govmu.js +223 -0
- package/dist/internal-log-By4Govmu.js.map +1 -0
- package/dist/{logitron-logger-UVeN-mQm.d.ts → logitron-logger-D22Yb61K.d.mts} +121 -100
- package/dist/logitron-logger-D22Yb61K.d.mts.map +1 -0
- package/dist/{logitron-logger-BFDSO8Io.d.mts → logitron-logger-D_MYYrQt.d.ts} +121 -100
- package/dist/logitron-logger-D_MYYrQt.d.ts.map +1 -0
- package/dist/middleware.d.mts +13 -28
- package/dist/middleware.d.mts.map +1 -1
- package/dist/middleware.d.ts +13 -28
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +20 -81
- package/dist/middleware.js.map +1 -1
- package/dist/middleware.mjs +17 -79
- package/dist/middleware.mjs.map +1 -1
- package/dist/nest.d.mts +37 -48
- package/dist/nest.d.mts.map +1 -1
- package/dist/nest.d.ts +37 -48
- package/dist/nest.d.ts.map +1 -1
- package/dist/nest.js +124 -135
- package/dist/nest.js.map +1 -1
- package/dist/nest.mjs +69 -78
- package/dist/nest.mjs.map +1 -1
- package/dist/{transport.manager-BiuCAJd2.mjs → otel-Dt5riXuE.mjs} +275 -117
- package/dist/otel-Dt5riXuE.mjs.map +1 -0
- package/dist/{transport.manager-CXbKKdVE.js → otel-DyeH6DVR.js} +373 -178
- package/dist/otel-DyeH6DVR.js.map +1 -0
- package/dist/own-property-BWkibepN.js +40 -0
- package/dist/own-property-BWkibepN.js.map +1 -0
- package/dist/own-property-CjFw9qwZ.mjs +29 -0
- package/dist/own-property-CjFw9qwZ.mjs.map +1 -0
- package/dist/{trace.utils-CvXgaiQT.mjs → request-trace-BgNykH9M.mjs} +40 -9
- package/dist/request-trace-BgNykH9M.mjs.map +1 -0
- package/dist/{trace.utils-DpBOLDtq.js → request-trace-ByujsUZk.js} +117 -77
- package/dist/request-trace-ByujsUZk.js.map +1 -0
- package/dist/rolldown-runtime-D3PmRqjj.mjs +4 -0
- package/dist/{safe-stringify-DJ66tW5I.mjs → safe-stringify-B5p5ktFe.mjs} +39 -15
- package/dist/safe-stringify-B5p5ktFe.mjs.map +1 -0
- package/dist/{safe-stringify-DWo3aZp_.js → safe-stringify-J3sh-7YM.js} +59 -36
- package/dist/safe-stringify-J3sh-7YM.js.map +1 -0
- package/dist/{search-C4V0OMEn.js → search-CRjhHxe9.js} +319 -92
- package/dist/search-CRjhHxe9.js.map +1 -0
- package/dist/{search-CNh9uVwR.d.ts → search-DA3ft3X5.d.mts} +5 -22
- package/dist/search-DA3ft3X5.d.mts.map +1 -0
- package/dist/{search-BFbu_oVn.mjs → search-DAXKE-P9.mjs} +289 -62
- package/dist/search-DAXKE-P9.mjs.map +1 -0
- package/dist/{search-DXANsQ2n.d.mts → search-DEl3Pe47.d.ts} +5 -22
- package/dist/search-DEl3Pe47.d.ts.map +1 -0
- package/dist/search.d.mts +2 -4
- package/dist/search.d.ts +2 -4
- package/dist/search.js +3 -4
- package/dist/search.mjs +1 -4
- package/dist/secret-config-CmK2wVkr.js +272 -0
- package/dist/secret-config-CmK2wVkr.js.map +1 -0
- package/dist/secret-config-Dhb6pqTU.mjs +210 -0
- package/dist/secret-config-Dhb6pqTU.mjs.map +1 -0
- package/dist/{slack.transport-CXjQYOes.d.ts → slack.transport-BDyENuR0.d.mts} +56 -9
- package/dist/slack.transport-BDyENuR0.d.mts.map +1 -0
- package/dist/{slack.transport-Bzw7sucI.mjs → slack.transport-BTEwsREY.mjs} +263 -31
- package/dist/slack.transport-BTEwsREY.mjs.map +1 -0
- package/dist/{slack.transport-BZzoXDPn.d.mts → slack.transport-C6E0l4kw.d.ts} +56 -9
- package/dist/slack.transport-C6E0l4kw.d.ts.map +1 -0
- package/dist/{slack.transport-BfJRouB2.js → slack.transport-UbYvOdKx.js} +286 -42
- package/dist/slack.transport-UbYvOdKx.js.map +1 -0
- package/dist/testing.d.mts +13 -11
- package/dist/testing.d.mts.map +1 -1
- package/dist/testing.d.ts +13 -11
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +41 -7
- package/dist/testing.js.map +1 -1
- package/dist/testing.mjs +40 -6
- package/dist/testing.mjs.map +1 -1
- package/dist/{transport.types-CGoHpWQR.d.ts → transport.types-CzJq4IrF.d.mts} +14 -5
- package/dist/transport.types-CzJq4IrF.d.mts.map +1 -0
- package/dist/{transport.types-BMnurPcc.d.mts → transport.types-CzJq4IrF.d.ts} +14 -5
- package/dist/transport.types-CzJq4IrF.d.ts.map +1 -0
- package/dist/transports.d.mts +39 -41
- package/dist/transports.d.mts.map +1 -1
- package/dist/transports.d.ts +39 -41
- package/dist/transports.d.ts.map +1 -1
- package/dist/transports.js +19 -22
- package/dist/transports.mjs +7 -13
- package/dist/worker-entry.js +438 -107
- package/dist/worker.d.mts +1 -2
- package/dist/worker.d.ts +1 -2
- package/dist/worker.js +3 -4
- package/dist/worker.mjs +1 -4
- package/dist/{worker.transport-JvGPog3C.d.mts → worker.transport-B9mCQSM1.d.ts} +7 -6
- package/dist/worker.transport-B9mCQSM1.d.ts.map +1 -0
- package/dist/{worker.transport-CdzSZJmw.d.ts → worker.transport-Bl8lFRck.d.mts} +7 -6
- package/dist/worker.transport-Bl8lFRck.d.mts.map +1 -0
- package/dist/{worker.transport-lPxO2MVL.mjs → worker.transport-BmmOKb1-.mjs} +43 -10
- package/dist/worker.transport-BmmOKb1-.mjs.map +1 -0
- package/dist/{worker.transport-BdPxu3PN.js → worker.transport-DxxbqQCG.js} +48 -15
- package/dist/worker.transport-DxxbqQCG.js.map +1 -0
- package/package.json +51 -75
- package/dist/async-context-BzJrbfQs.mjs +0 -72
- package/dist/async-context-BzJrbfQs.mjs.map +0 -1
- package/dist/async-context-DyQQYq3I.js +0 -92
- package/dist/async-context-DyQQYq3I.js.map +0 -1
- package/dist/azure-monitor.transport-CHnjVRF-.mjs.map +0 -1
- package/dist/azure-monitor.transport-Cn_3Usvu.d.ts.map +0 -1
- package/dist/azure-monitor.transport-CrvfHd9C.js.map +0 -1
- package/dist/azure-monitor.transport-D7Da4RAb.d.mts.map +0 -1
- package/dist/batch-buffer-BY-mRWIK.js.map +0 -1
- package/dist/batch-buffer-PGvSgbmd.mjs.map +0 -1
- package/dist/builder-0gEzRopq.mjs.map +0 -1
- package/dist/builder-D44QktIo.js.map +0 -1
- package/dist/chunk-DLSkYcPk.mjs +0 -7
- package/dist/chunk-nOFOJqeH.js +0 -30
- package/dist/cloudwatch.transport-BO1ahxw-.js.map +0 -1
- package/dist/cloudwatch.transport-DZ6ies7g.mjs.map +0 -1
- package/dist/cloudwatch.transport-DsEq633o.d.ts.map +0 -1
- package/dist/cloudwatch.transport-UlyZFWMn.d.mts.map +0 -1
- package/dist/entry-fields-BJkuPnIg.mjs.map +0 -1
- package/dist/entry-fields-BvOLFlJ4.js.map +0 -1
- package/dist/gcp.transport-B7oc97sG.d.ts.map +0 -1
- package/dist/gcp.transport-CHV8MGgz.js.map +0 -1
- package/dist/gcp.transport-DBX5TPIy.mjs.map +0 -1
- package/dist/gcp.transport-GrJurKo8.d.mts.map +0 -1
- package/dist/index-3mw5gaCw.d.mts.map +0 -1
- package/dist/index-DhIoploR.d.ts.map +0 -1
- package/dist/internal-log-BUJYMZbE.js +0 -70
- package/dist/internal-log-BUJYMZbE.js.map +0 -1
- package/dist/internal-log-Cm8SOWSV.mjs +0 -52
- package/dist/internal-log-Cm8SOWSV.mjs.map +0 -1
- package/dist/logitron-logger-BFDSO8Io.d.mts.map +0 -1
- package/dist/logitron-logger-UVeN-mQm.d.ts.map +0 -1
- package/dist/safe-stringify-DJ66tW5I.mjs.map +0 -1
- package/dist/safe-stringify-DWo3aZp_.js.map +0 -1
- package/dist/search-BFbu_oVn.mjs.map +0 -1
- package/dist/search-C4V0OMEn.js.map +0 -1
- package/dist/search-CNh9uVwR.d.ts.map +0 -1
- package/dist/search-DXANsQ2n.d.mts.map +0 -1
- package/dist/slack.transport-BZzoXDPn.d.mts.map +0 -1
- package/dist/slack.transport-BfJRouB2.js.map +0 -1
- package/dist/slack.transport-Bzw7sucI.mjs.map +0 -1
- package/dist/slack.transport-CXjQYOes.d.ts.map +0 -1
- package/dist/trace.utils-CvXgaiQT.mjs.map +0 -1
- package/dist/trace.utils-DpBOLDtq.js.map +0 -1
- package/dist/transport.manager-BiuCAJd2.mjs.map +0 -1
- package/dist/transport.manager-CXbKKdVE.js.map +0 -1
- package/dist/transport.types-BMnurPcc.d.mts.map +0 -1
- package/dist/transport.types-CGoHpWQR.d.ts.map +0 -1
- package/dist/worker.transport-BdPxu3PN.js.map +0 -1
- package/dist/worker.transport-CdzSZJmw.d.ts.map +0 -1
- package/dist/worker.transport-JvGPog3C.d.mts.map +0 -1
- package/dist/worker.transport-lPxO2MVL.mjs.map +0 -1
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { t as __require } from "./
|
|
2
|
-
import { n as internalLog, r as internalWarn, t as internalError } from "./internal-log-
|
|
3
|
-
import {
|
|
4
|
-
import { t as
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
7
|
-
import * as path$1 from "node:path";
|
|
1
|
+
import { t as __require } from "./rolldown-runtime-D3PmRqjj.mjs";
|
|
2
|
+
import { n as internalLog, r as internalWarn, t as internalError } from "./internal-log-Bg4V1cPg.mjs";
|
|
3
|
+
import { n as protectSecrets, o as urlSecrets, r as scrubError, t as collectSecrets } from "./secret-config-Dhb6pqTU.mjs";
|
|
4
|
+
import { t as safeToString } from "./coerce.utils-B_rEudCn.mjs";
|
|
5
|
+
import { i as stringifyForLog } from "./safe-stringify-B5p5ktFe.mjs";
|
|
6
|
+
import { t as mergeCoreFields } from "./entry-fields-J1OBi24o.mjs";
|
|
8
7
|
import { EventEmitter } from "node:events";
|
|
9
8
|
import { promisify } from "node:util";
|
|
10
9
|
import { createGzip, gzip } from "node:zlib";
|
|
10
|
+
import * as fs from "node:fs";
|
|
11
|
+
import * as path$1 from "node:path";
|
|
11
12
|
import { pipeline } from "node:stream/promises";
|
|
12
|
-
|
|
13
|
-
//#region src/utils/sanitize.utils.ts
|
|
13
|
+
// src/utils/sanitize.utils.ts
|
|
14
14
|
/**
|
|
15
15
|
* Control-character stripping for text-mode log output.
|
|
16
16
|
*
|
|
@@ -26,9 +26,7 @@ const VISIBLE_ESCAPES = {
|
|
|
26
26
|
function stripControlChars(value) {
|
|
27
27
|
return value.replace(CONTROL_CHARS_RE, (ch) => VISIBLE_ESCAPES[ch] ?? "");
|
|
28
28
|
}
|
|
29
|
-
|
|
30
|
-
//#endregion
|
|
31
|
-
//#region src/transports/console.transport.ts
|
|
29
|
+
// src/transports/console.transport.ts
|
|
32
30
|
/**
|
|
33
31
|
* Writes log entries to stdout (info/debug/verbose) and stderr (error/warn).
|
|
34
32
|
*
|
|
@@ -38,32 +36,13 @@ function stripControlChars(value) {
|
|
|
38
36
|
* transports: { console: { format: 'json' } }
|
|
39
37
|
*/
|
|
40
38
|
var ConsoleTransport = class ConsoleTransport {
|
|
41
|
-
static #_ = this.COLORS = new Map([
|
|
42
|
-
["black", "\x1B[30m"],
|
|
43
|
-
["red", "\x1B[31m"],
|
|
44
|
-
["green", "\x1B[32m"],
|
|
45
|
-
["yellow", "\x1B[33m"],
|
|
46
|
-
["blue", "\x1B[34m"],
|
|
47
|
-
["magenta", "\x1B[35m"],
|
|
48
|
-
["cyan", "\x1B[36m"],
|
|
49
|
-
["white", "\x1B[37m"],
|
|
50
|
-
["gray", "\x1B[90m"],
|
|
51
|
-
["grey", "\x1B[90m"],
|
|
52
|
-
["brightred", "\x1B[91m"],
|
|
53
|
-
["brightgreen", "\x1B[92m"],
|
|
54
|
-
["brightyellow", "\x1B[93m"],
|
|
55
|
-
["brightblue", "\x1B[94m"],
|
|
56
|
-
["brightmagenta", "\x1B[95m"],
|
|
57
|
-
["brightcyan", "\x1B[96m"],
|
|
58
|
-
["brightwhite", "\x1B[97m"],
|
|
59
|
-
["reset", "\x1B[0m"]
|
|
60
|
-
]);
|
|
61
39
|
static sanitize(value) {
|
|
62
40
|
return stripControlChars(safeToString(value));
|
|
63
41
|
}
|
|
64
42
|
constructor(config = {}) {
|
|
65
43
|
this.config = config;
|
|
66
44
|
this.name = "console";
|
|
45
|
+
this.level = config.level;
|
|
67
46
|
if (config.filter) this.filter = config.filter;
|
|
68
47
|
}
|
|
69
48
|
write(entry) {
|
|
@@ -126,10 +105,28 @@ var ConsoleTransport = class ConsoleTransport {
|
|
|
126
105
|
close() {
|
|
127
106
|
return Promise.resolve();
|
|
128
107
|
}
|
|
108
|
+
static #_ = () => this.COLORS = /* @__PURE__ */ new Map([
|
|
109
|
+
["black", "\x1B[30m"],
|
|
110
|
+
["red", "\x1B[31m"],
|
|
111
|
+
["green", "\x1B[32m"],
|
|
112
|
+
["yellow", "\x1B[33m"],
|
|
113
|
+
["blue", "\x1B[34m"],
|
|
114
|
+
["magenta", "\x1B[35m"],
|
|
115
|
+
["cyan", "\x1B[36m"],
|
|
116
|
+
["white", "\x1B[37m"],
|
|
117
|
+
["gray", "\x1B[90m"],
|
|
118
|
+
["grey", "\x1B[90m"],
|
|
119
|
+
["brightred", "\x1B[91m"],
|
|
120
|
+
["brightgreen", "\x1B[92m"],
|
|
121
|
+
["brightyellow", "\x1B[93m"],
|
|
122
|
+
["brightblue", "\x1B[94m"],
|
|
123
|
+
["brightmagenta", "\x1B[95m"],
|
|
124
|
+
["brightcyan", "\x1B[96m"],
|
|
125
|
+
["brightwhite", "\x1B[97m"],
|
|
126
|
+
["reset", "\x1B[0m"]
|
|
127
|
+
]);
|
|
129
128
|
};
|
|
130
|
-
|
|
131
|
-
//#endregion
|
|
132
|
-
//#region src/transports/buffer-cap.ts
|
|
129
|
+
// src/transports/buffer-cap.ts
|
|
133
130
|
const DEFAULT_BUFFER_CAP = 1e4;
|
|
134
131
|
const DROP_WARN_INTERVAL_MS$1 = 5e3;
|
|
135
132
|
/**
|
|
@@ -145,8 +142,10 @@ var BufferCap = class {
|
|
|
145
142
|
this.dropped = 0;
|
|
146
143
|
this.lastWarning = 0;
|
|
147
144
|
let max = fallback;
|
|
148
|
-
if (requested !== void 0)
|
|
149
|
-
|
|
145
|
+
if (requested !== void 0) {
|
|
146
|
+
if (Number.isInteger(requested) && requested >= 1) max = requested;
|
|
147
|
+
else internalWarn(`${name}: maxBufferSize ${String(requested)} is not a positive integer; using ${fallback}`);
|
|
148
|
+
}
|
|
150
149
|
this.max = Math.max(max, batchSize);
|
|
151
150
|
}
|
|
152
151
|
/** Drops the oldest items beyond the cap, in place. */
|
|
@@ -168,9 +167,7 @@ var BufferCap = class {
|
|
|
168
167
|
this.lastWarning = now;
|
|
169
168
|
}
|
|
170
169
|
};
|
|
171
|
-
|
|
172
|
-
//#endregion
|
|
173
|
-
//#region src/transports/database.transport.ts
|
|
170
|
+
// src/transports/database.transport.ts
|
|
174
171
|
/**
|
|
175
172
|
* Validates that a SQL identifier (table/index name) contains only safe characters.
|
|
176
173
|
* Prevents SQL injection via user-supplied table names.
|
|
@@ -193,7 +190,7 @@ const PG_DATA_CLASSES = [
|
|
|
193
190
|
"23",
|
|
194
191
|
"54"
|
|
195
192
|
];
|
|
196
|
-
const MYSQL_DATA_CODES = new Set([
|
|
193
|
+
const MYSQL_DATA_CODES = /* @__PURE__ */ new Set([
|
|
197
194
|
"ER_DATA_TOO_LONG",
|
|
198
195
|
"ER_TRUNCATED_WRONG_VALUE",
|
|
199
196
|
"ER_TRUNCATED_WRONG_VALUE_FOR_FIELD",
|
|
@@ -203,7 +200,7 @@ const MYSQL_DATA_CODES = new Set([
|
|
|
203
200
|
"ER_INVALID_JSON_TEXT",
|
|
204
201
|
"ER_INVALID_CHARACTER_STRING"
|
|
205
202
|
]);
|
|
206
|
-
const MYSQL_DATA_ERRNOS = new Set([
|
|
203
|
+
const MYSQL_DATA_ERRNOS = /* @__PURE__ */ new Set([
|
|
207
204
|
1048,
|
|
208
205
|
1062,
|
|
209
206
|
1264,
|
|
@@ -212,12 +209,12 @@ const MYSQL_DATA_ERRNOS = new Set([
|
|
|
212
209
|
1406,
|
|
213
210
|
3140
|
|
214
211
|
]);
|
|
215
|
-
const SQLITE_DATA_CODES = new Set([
|
|
212
|
+
const SQLITE_DATA_CODES = /* @__PURE__ */ new Set([
|
|
216
213
|
"SQLITE_CONSTRAINT",
|
|
217
214
|
"SQLITE_TOOBIG",
|
|
218
215
|
"SQLITE_MISMATCH"
|
|
219
216
|
]);
|
|
220
|
-
const MONGO_DATA_CODES = new Set([
|
|
217
|
+
const MONGO_DATA_CODES = /* @__PURE__ */ new Set([
|
|
221
218
|
2,
|
|
222
219
|
121,
|
|
223
220
|
10334,
|
|
@@ -279,13 +276,23 @@ var DatabaseTransport = class {
|
|
|
279
276
|
this.name = "database";
|
|
280
277
|
this.batch = [];
|
|
281
278
|
this.isConnected = false;
|
|
279
|
+
protectSecrets(this, ["config", "connection"]);
|
|
282
280
|
this.batchSize = config.batchSize || 100;
|
|
283
281
|
this.flushInterval = config.flushInterval || 5e3;
|
|
284
282
|
this.cap = new BufferCap("DatabaseTransport", config.maxBufferSize, this.batchSize);
|
|
283
|
+
this.level = config.level;
|
|
285
284
|
if (config.filter) this.filter = config.filter;
|
|
286
285
|
if (config.table) validateSqlIdentifier(config.table, "table");
|
|
287
286
|
this.setupFlushTimer();
|
|
288
287
|
}
|
|
288
|
+
secretValues() {
|
|
289
|
+
const { connectionString, password } = this.config;
|
|
290
|
+
return [
|
|
291
|
+
connectionString,
|
|
292
|
+
password,
|
|
293
|
+
...connectionString ? urlSecrets(connectionString) : []
|
|
294
|
+
];
|
|
295
|
+
}
|
|
289
296
|
async write(entry) {
|
|
290
297
|
if (!this.isConnected) await this.connect();
|
|
291
298
|
this.addToBatch(entry);
|
|
@@ -346,6 +353,13 @@ var DatabaseTransport = class {
|
|
|
346
353
|
this.cap.enforce(this.batch);
|
|
347
354
|
}
|
|
348
355
|
async writeEntries(entries) {
|
|
356
|
+
try {
|
|
357
|
+
await this.writeEntriesUnscrubbed(entries);
|
|
358
|
+
} catch (error) {
|
|
359
|
+
throw scrubError(error, this.secretValues());
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
async writeEntriesUnscrubbed(entries) {
|
|
349
363
|
switch (this.config.type) {
|
|
350
364
|
case "mongodb":
|
|
351
365
|
await this.flushToMongoDB(entries);
|
|
@@ -424,13 +438,12 @@ var DatabaseTransport = class {
|
|
|
424
438
|
case "mysql":
|
|
425
439
|
await this.connectMySQL();
|
|
426
440
|
break;
|
|
427
|
-
case "sqlite":
|
|
428
|
-
await this.connectSQLite();
|
|
429
|
-
break;
|
|
441
|
+
case "sqlite": await this.connectSQLite();
|
|
430
442
|
}
|
|
431
443
|
this.isConnected = true;
|
|
432
444
|
} catch (error) {
|
|
433
445
|
this.isConnected = false;
|
|
446
|
+
scrubError(error, this.secretValues());
|
|
434
447
|
throw new Error(`Database connection failed: ${error}`, { cause: error });
|
|
435
448
|
}
|
|
436
449
|
}
|
|
@@ -439,7 +452,8 @@ var DatabaseTransport = class {
|
|
|
439
452
|
const { MongoClient } = await import("mongodb").catch(() => {
|
|
440
453
|
throw new Error("MongoDB driver not installed. Run: npm install mongodb");
|
|
441
454
|
});
|
|
442
|
-
|
|
455
|
+
const connectionString = this.config.connectionString || `mongodb://${this.config.host}:${this.config.port}/${this.config.database}`;
|
|
456
|
+
this.connection = new MongoClient(connectionString);
|
|
443
457
|
await this.connection.connect();
|
|
444
458
|
await this.connection.db(this.config.database).admin().ping();
|
|
445
459
|
} catch (error) {
|
|
@@ -551,12 +565,13 @@ var DatabaseTransport = class {
|
|
|
551
565
|
entry.environment
|
|
552
566
|
].map((value, column) => stripNul(column === 3 ? stripJsonNulEscape(value) : value))), POSTGRES_ROWS_PER_INSERT);
|
|
553
567
|
const insertChunk = async (rows) => {
|
|
568
|
+
const placeholders = rows.map((_, i) => {
|
|
569
|
+
return `(${Array.from({ length: POSTGRES_COLUMNS }, (_unused, c) => `$${i * POSTGRES_COLUMNS + c + 1}`).join(", ")})`;
|
|
570
|
+
}).join(", ");
|
|
554
571
|
const query = `
|
|
555
572
|
INSERT INTO ${tableName}
|
|
556
573
|
(timestamp, level, message, payload, context, trace_id, app_name, environment)
|
|
557
|
-
VALUES ${
|
|
558
|
-
return `(${Array.from({ length: POSTGRES_COLUMNS }, (_unused, c) => `$${i * POSTGRES_COLUMNS + c + 1}`).join(", ")})`;
|
|
559
|
-
}).join(", ")}
|
|
574
|
+
VALUES ${placeholders}
|
|
560
575
|
`;
|
|
561
576
|
await this.connection.query(query, rows.flat());
|
|
562
577
|
};
|
|
@@ -720,9 +735,7 @@ var DatabaseTransport = class {
|
|
|
720
735
|
case "mysql":
|
|
721
736
|
await this.connection.end();
|
|
722
737
|
break;
|
|
723
|
-
case "sqlite":
|
|
724
|
-
await this.connection.close();
|
|
725
|
-
break;
|
|
738
|
+
case "sqlite": await this.connection.close();
|
|
726
739
|
}
|
|
727
740
|
this.isConnected = false;
|
|
728
741
|
}
|
|
@@ -763,9 +776,7 @@ var DatabaseTransport = class {
|
|
|
763
776
|
}
|
|
764
777
|
}
|
|
765
778
|
};
|
|
766
|
-
|
|
767
|
-
//#endregion
|
|
768
|
-
//#region src/transports/analytics.transport.ts
|
|
779
|
+
// src/transports/analytics.transport.ts
|
|
769
780
|
/**
|
|
770
781
|
* Thrown by sendBatch() when part of a batch was already delivered. drain()
|
|
771
782
|
* requeues only `unsent`, so delivered entries are not sent twice.
|
|
@@ -789,16 +800,25 @@ var AnalyticsTransport = class {
|
|
|
789
800
|
enableEventTracking: true,
|
|
790
801
|
...config
|
|
791
802
|
};
|
|
803
|
+
protectSecrets(this, ["config"]);
|
|
792
804
|
this.level = config.level;
|
|
793
805
|
this.batchSize = this.config.batchSize || 50;
|
|
794
806
|
this.flushInterval = this.config.flushInterval || 1e4;
|
|
795
807
|
this.cap = new BufferCap(name, config.maxBufferSize, this.batchSize);
|
|
796
808
|
}
|
|
809
|
+
/** Secret strings to scrub from errors: everything secret-looking in the config. Override to add more. */
|
|
810
|
+
secretValues() {
|
|
811
|
+
return collectSecrets(this.config);
|
|
812
|
+
}
|
|
797
813
|
async write(entry) {
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
814
|
+
try {
|
|
815
|
+
if (!this.isReady) await this.ensureReady();
|
|
816
|
+
if (this.shouldSkipEntry(entry)) return;
|
|
817
|
+
if (this.config.batchSize && this.config.batchSize > 1) this.addToBatch(entry);
|
|
818
|
+
else await this.sendEntry(entry);
|
|
819
|
+
} catch (error) {
|
|
820
|
+
throw scrubError(error, this.secretValues());
|
|
821
|
+
}
|
|
802
822
|
}
|
|
803
823
|
addToBatch(entry) {
|
|
804
824
|
this.batch.push(entry);
|
|
@@ -836,6 +856,7 @@ var AnalyticsTransport = class {
|
|
|
836
856
|
try {
|
|
837
857
|
await this.sendBatch(entriesToSend);
|
|
838
858
|
} catch (error) {
|
|
859
|
+
scrubError(error, this.secretValues());
|
|
839
860
|
internalError(`Analytics transport ${this.name} flush failed`, error);
|
|
840
861
|
this.batch.unshift(...error instanceof PartialBatchError ? error.unsent : entriesToSend);
|
|
841
862
|
this.cap.enforce(this.batch);
|
|
@@ -897,9 +918,7 @@ var AnalyticsTransport = class {
|
|
|
897
918
|
await this.ensureReady();
|
|
898
919
|
}
|
|
899
920
|
};
|
|
900
|
-
|
|
901
|
-
//#endregion
|
|
902
|
-
//#region src/transports/datadog.transport.ts
|
|
921
|
+
// src/transports/datadog.transport.ts
|
|
903
922
|
const gzipAsync = promisify(gzip);
|
|
904
923
|
const MAX_LOGS_PER_REQUEST = 1e3;
|
|
905
924
|
const MAX_LOGS_PAYLOAD_BYTES = 5e6;
|
|
@@ -968,8 +987,12 @@ function tag(key, value) {
|
|
|
968
987
|
*
|
|
969
988
|
* The API key is transmitted via the `DD-API-KEY` request header — never in the URL.
|
|
970
989
|
*
|
|
990
|
+
* Metric names keep the legacy `logitron.logs.<level>` prefix (kept for
|
|
991
|
+
* dashboards and monitors that already query it; renaming would be a breaking
|
|
992
|
+
* change). Query `logitron.logs.error`, not `logixia.logs.error`.
|
|
993
|
+
*
|
|
971
994
|
* @example
|
|
972
|
-
*
|
|
995
|
+
* analytics: { datadog: { apiKey: process.env.DD_API_KEY, service: 'api', env: 'production' } }
|
|
973
996
|
*/
|
|
974
997
|
var DataDogTransport = class extends AnalyticsTransport {
|
|
975
998
|
constructor(config) {
|
|
@@ -979,6 +1002,7 @@ var DataDogTransport = class extends AnalyticsTransport {
|
|
|
979
1002
|
this.baseUrl = `https://api.${site}`;
|
|
980
1003
|
this.logsUrl = `https://http-intake.logs.${site}`;
|
|
981
1004
|
this.metricsUrl = `https://api.${site}`;
|
|
1005
|
+
protectSecrets(this, ["datadogConfig"]);
|
|
982
1006
|
}
|
|
983
1007
|
async initialize() {
|
|
984
1008
|
try {
|
|
@@ -1014,9 +1038,9 @@ var DataDogTransport = class extends AnalyticsTransport {
|
|
|
1014
1038
|
}));
|
|
1015
1039
|
const chunks = this.chunkLogs(items);
|
|
1016
1040
|
for (let i = 0; i < chunks.length; i += 1) {
|
|
1017
|
-
const chunk
|
|
1041
|
+
const chunk = chunks[i];
|
|
1018
1042
|
try {
|
|
1019
|
-
await this.makeLogsRequest("/api/v2/logs", `[${chunk
|
|
1043
|
+
await this.makeLogsRequest("/api/v2/logs", `[${chunk.map((item) => item.json).join(",")}]`);
|
|
1020
1044
|
} catch (error) {
|
|
1021
1045
|
if (i === 0) throw error;
|
|
1022
1046
|
const unsent = chunks.slice(i).flatMap((c) => c.map((item) => item.entry));
|
|
@@ -1205,9 +1229,7 @@ var DataDogTransport = class extends AnalyticsTransport {
|
|
|
1205
1229
|
}
|
|
1206
1230
|
}
|
|
1207
1231
|
};
|
|
1208
|
-
|
|
1209
|
-
//#endregion
|
|
1210
|
-
//#region src/transports/file.transport.ts
|
|
1232
|
+
// src/transports/file.transport.ts
|
|
1211
1233
|
const appendFile = promisify(fs.appendFile);
|
|
1212
1234
|
const rename = promisify(fs.rename);
|
|
1213
1235
|
const unlink = promisify(fs.unlink);
|
|
@@ -1470,7 +1492,6 @@ var FileTransport = class {
|
|
|
1470
1492
|
csvField(entry.traceId),
|
|
1471
1493
|
csvField(stringifyForLog(entry.data || {}))
|
|
1472
1494
|
].join(",");
|
|
1473
|
-
case "text":
|
|
1474
1495
|
default: return `${entry.timestamp.toISOString()} [${stripControlChars(safeToString(entry.level)).toUpperCase()}] ${stripControlChars(safeToString(entry.message))}${entry.data ? " " + stringifyForLog(entry.data) : ""}`;
|
|
1475
1496
|
}
|
|
1476
1497
|
}
|
|
@@ -1496,22 +1517,22 @@ var FileTransport = class {
|
|
|
1496
1517
|
await this.append(content);
|
|
1497
1518
|
return;
|
|
1498
1519
|
}
|
|
1499
|
-
let chunk
|
|
1520
|
+
let chunk = "";
|
|
1500
1521
|
let chunkBytes = 0;
|
|
1501
1522
|
for (const entry of entries) {
|
|
1502
1523
|
const line = this.formatEntry(entry) + "\n";
|
|
1503
1524
|
const lineBytes = Buffer.byteLength(line);
|
|
1504
1525
|
const used = this.bytesWritten + chunkBytes;
|
|
1505
1526
|
if (used > 0 && used + lineBytes > this.maxBytes) {
|
|
1506
|
-
if (chunk
|
|
1507
|
-
chunk
|
|
1527
|
+
if (chunk) await this.append(chunk, chunkBytes);
|
|
1528
|
+
chunk = "";
|
|
1508
1529
|
chunkBytes = 0;
|
|
1509
1530
|
await this.rotateFile();
|
|
1510
1531
|
}
|
|
1511
|
-
chunk
|
|
1532
|
+
chunk += line;
|
|
1512
1533
|
chunkBytes += lineBytes;
|
|
1513
1534
|
}
|
|
1514
|
-
if (chunk
|
|
1535
|
+
if (chunk) await this.append(chunk, chunkBytes);
|
|
1515
1536
|
}
|
|
1516
1537
|
async append(content, bytes = Buffer.byteLength(content)) {
|
|
1517
1538
|
await appendFile(this.currentFilePath, content, { mode: this.fileMode });
|
|
@@ -1540,7 +1561,7 @@ var FileTransport = class {
|
|
|
1540
1561
|
}
|
|
1541
1562
|
parseInterval(interval) {
|
|
1542
1563
|
const match = /^(\d{1,6})([hdwmy])$/i.exec(interval.trim());
|
|
1543
|
-
if (!match) return
|
|
1564
|
+
if (!match) return 864e5;
|
|
1544
1565
|
const value = Number.parseInt(match[1] || "1", 10);
|
|
1545
1566
|
switch ((match[2] || "h").toLowerCase()) {
|
|
1546
1567
|
case "h": return value * 60 * 60 * 1e3;
|
|
@@ -1655,14 +1676,12 @@ var FileTransport = class {
|
|
|
1655
1676
|
this.reportDropped(0);
|
|
1656
1677
|
}
|
|
1657
1678
|
};
|
|
1658
|
-
|
|
1659
|
-
//#endregion
|
|
1660
|
-
//#region src/transports/google-analytics.transport.ts
|
|
1679
|
+
// src/transports/google-analytics.transport.ts
|
|
1661
1680
|
/**
|
|
1662
1681
|
* Sends log entries as Google Analytics 4 Measurement Protocol events.
|
|
1663
1682
|
*
|
|
1664
1683
|
* @example
|
|
1665
|
-
*
|
|
1684
|
+
* analytics: {
|
|
1666
1685
|
* googleAnalytics: { measurementId: 'G-XXXXXXX', apiSecret: process.env.GA_API_SECRET }
|
|
1667
1686
|
* }
|
|
1668
1687
|
*/
|
|
@@ -1672,6 +1691,7 @@ var GoogleAnalyticsTransport = class extends AnalyticsTransport {
|
|
|
1672
1691
|
this.baseUrl = "https://www.google-analytics.com/mp/collect";
|
|
1673
1692
|
this.debugUrl = "https://www.google-analytics.com/debug/mp/collect";
|
|
1674
1693
|
this.gaConfig = config;
|
|
1694
|
+
protectSecrets(this, ["gaConfig"]);
|
|
1675
1695
|
}
|
|
1676
1696
|
async initialize() {
|
|
1677
1697
|
try {
|
|
@@ -1759,10 +1779,10 @@ var GoogleAnalyticsTransport = class extends AnalyticsTransport {
|
|
|
1759
1779
|
}
|
|
1760
1780
|
async sendEvents(events) {
|
|
1761
1781
|
const chunks = this.chunkArray(events, 25);
|
|
1762
|
-
for (const chunk
|
|
1782
|
+
for (const chunk of chunks) {
|
|
1763
1783
|
const payload = {
|
|
1764
1784
|
client_id: this.gaConfig.clientId || this.generateClientId(),
|
|
1765
|
-
events: chunk
|
|
1785
|
+
events: chunk
|
|
1766
1786
|
};
|
|
1767
1787
|
await this.makeRequest(payload);
|
|
1768
1788
|
}
|
|
@@ -1883,20 +1903,49 @@ var GoogleAnalyticsTransport = class extends AnalyticsTransport {
|
|
|
1883
1903
|
await this.sendEvent(event);
|
|
1884
1904
|
}
|
|
1885
1905
|
};
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
|
|
1906
|
+
// src/transports/level-filter.ts
|
|
1907
|
+
/** Severity values of the built-in levels; lower is more severe (same scale as the logger). */
|
|
1908
|
+
const BUILTIN_LEVEL_VALUES = {
|
|
1909
|
+
error: 0,
|
|
1910
|
+
warn: 1,
|
|
1911
|
+
info: 2,
|
|
1912
|
+
debug: 3,
|
|
1913
|
+
trace: 4,
|
|
1914
|
+
verbose: 5
|
|
1915
|
+
};
|
|
1916
|
+
/** Built-in levels plus the logger's custom `levelOptions.levels`. */
|
|
1917
|
+
function buildLevelValues(custom) {
|
|
1918
|
+
return new Map([...Object.entries(BUILTIN_LEVEL_VALUES), ...Object.entries(custom ?? {})]);
|
|
1919
|
+
}
|
|
1920
|
+
function lookup(values, level) {
|
|
1921
|
+
return values.get(level) ?? values.get(level.toLowerCase());
|
|
1922
|
+
}
|
|
1923
|
+
/**
|
|
1924
|
+
* Whether an entry at `level` passes a transport's minimum `threshold`, using the
|
|
1925
|
+
* logger's scale (an entry passes when its value is <= the threshold's value).
|
|
1926
|
+
* The logger has already rejected unknown entry levels, so an unknown entry level
|
|
1927
|
+
* or threshold here does not filter.
|
|
1928
|
+
*/
|
|
1929
|
+
function meetsTransportLevel(threshold, level, values) {
|
|
1930
|
+
if (!threshold) return true;
|
|
1931
|
+
const min = lookup(values, threshold);
|
|
1932
|
+
const actual = lookup(values, level);
|
|
1933
|
+
if (min === void 0 || actual === void 0) return true;
|
|
1934
|
+
return actual <= min;
|
|
1935
|
+
}
|
|
1936
|
+
// src/transports/mixpanel.transport.ts
|
|
1889
1937
|
/**
|
|
1890
1938
|
* Sends log entries as Mixpanel events via the Track and Engage HTTP APIs.
|
|
1891
1939
|
*
|
|
1892
1940
|
* @example
|
|
1893
|
-
*
|
|
1941
|
+
* analytics: { mixpanel: { token: process.env.MIXPANEL_TOKEN } }
|
|
1894
1942
|
*/
|
|
1895
1943
|
var MixpanelTransport = class extends AnalyticsTransport {
|
|
1896
1944
|
constructor(config) {
|
|
1897
1945
|
super("mixpanel", config);
|
|
1898
1946
|
this.baseUrl = "https://api.mixpanel.com";
|
|
1899
1947
|
this.mixpanelConfig = config;
|
|
1948
|
+
protectSecrets(this, ["mixpanelConfig"]);
|
|
1900
1949
|
}
|
|
1901
1950
|
async initialize() {
|
|
1902
1951
|
try {
|
|
@@ -2022,9 +2071,7 @@ var MixpanelTransport = class extends AnalyticsTransport {
|
|
|
2022
2071
|
await this.makeRequest("/track", [payload]);
|
|
2023
2072
|
}
|
|
2024
2073
|
};
|
|
2025
|
-
|
|
2026
|
-
//#endregion
|
|
2027
|
-
//#region src/version.ts
|
|
2074
|
+
// src/version.ts
|
|
2028
2075
|
/**
|
|
2029
2076
|
* The published version of this package.
|
|
2030
2077
|
*
|
|
@@ -2033,14 +2080,12 @@ var MixpanelTransport = class extends AnalyticsTransport {
|
|
|
2033
2080
|
* free of a JSON import that bundlers and consumers would have to resolve.
|
|
2034
2081
|
*/
|
|
2035
2082
|
const LOGIXIA_VERSION = "1.12.0";
|
|
2036
|
-
|
|
2037
|
-
//#endregion
|
|
2038
|
-
//#region src/transports/segment.transport.ts
|
|
2083
|
+
// src/transports/segment.transport.ts
|
|
2039
2084
|
/**
|
|
2040
2085
|
* Sends log entries as Segment track/identify events via the HTTP Tracking API.
|
|
2041
2086
|
*
|
|
2042
2087
|
* @example
|
|
2043
|
-
*
|
|
2088
|
+
* analytics: { segment: { writeKey: process.env.SEGMENT_WRITE_KEY } }
|
|
2044
2089
|
*/
|
|
2045
2090
|
var SegmentTransport = class extends AnalyticsTransport {
|
|
2046
2091
|
constructor(config) {
|
|
@@ -2053,6 +2098,10 @@ var SegmentTransport = class extends AnalyticsTransport {
|
|
|
2053
2098
|
...config
|
|
2054
2099
|
};
|
|
2055
2100
|
this.baseUrl = config.dataPlaneUrl || "https://api.segment.io";
|
|
2101
|
+
protectSecrets(this, ["segmentConfig", "baseUrl"]);
|
|
2102
|
+
}
|
|
2103
|
+
secretValues() {
|
|
2104
|
+
return [...super.secretValues(), Buffer.from(`${this.segmentConfig.writeKey}:`).toString("base64")];
|
|
2056
2105
|
}
|
|
2057
2106
|
async initialize() {
|
|
2058
2107
|
try {
|
|
@@ -2120,8 +2169,8 @@ var SegmentTransport = class extends AnalyticsTransport {
|
|
|
2120
2169
|
}
|
|
2121
2170
|
async batchTrack(events) {
|
|
2122
2171
|
const chunks = this.chunkArray(events, this.segmentConfig.maxBatchSize || 100);
|
|
2123
|
-
for (const chunk
|
|
2124
|
-
const payload = { batch: chunk
|
|
2172
|
+
for (const chunk of chunks) {
|
|
2173
|
+
const payload = { batch: chunk };
|
|
2125
2174
|
await this.makeRequest("/v1/batch", payload);
|
|
2126
2175
|
}
|
|
2127
2176
|
}
|
|
@@ -2298,20 +2347,24 @@ var SegmentTransport = class extends AnalyticsTransport {
|
|
|
2298
2347
|
await this.makeRequest("/v1/track", payload);
|
|
2299
2348
|
}
|
|
2300
2349
|
};
|
|
2301
|
-
|
|
2302
|
-
//#endregion
|
|
2303
|
-
//#region src/transports/transport.manager.ts
|
|
2350
|
+
// src/transports/transport.manager.ts
|
|
2304
2351
|
function _sleep(ms) {
|
|
2305
2352
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
2306
2353
|
}
|
|
2307
2354
|
var TransportManager = class extends EventEmitter {
|
|
2308
|
-
|
|
2355
|
+
/**
|
|
2356
|
+
* @param config Transport configuration.
|
|
2357
|
+
* @param levels The logger's `levelOptions.levels`; used with the built-in levels
|
|
2358
|
+
* to compare entries against each transport's `level`.
|
|
2359
|
+
*/
|
|
2360
|
+
constructor(config = {}, levels) {
|
|
2309
2361
|
super();
|
|
2310
2362
|
this.transports = /* @__PURE__ */ new Map();
|
|
2311
2363
|
this.metrics = /* @__PURE__ */ new Map();
|
|
2312
2364
|
this.isShuttingDown = false;
|
|
2313
2365
|
this.transportLevelPreferences = /* @__PURE__ */ new Map();
|
|
2314
2366
|
this.warnedPromptDeprecated = false;
|
|
2367
|
+
this.levelValues = buildLevelValues(levels);
|
|
2315
2368
|
this.setupTransports(config);
|
|
2316
2369
|
}
|
|
2317
2370
|
setupTransports(config) {
|
|
@@ -2495,7 +2548,6 @@ var TransportManager = class extends EventEmitter {
|
|
|
2495
2548
|
case "linear":
|
|
2496
2549
|
wait = baseDelay * (attempt + 1);
|
|
2497
2550
|
break;
|
|
2498
|
-
case "exponential":
|
|
2499
2551
|
default: wait = Math.min(baseDelay * Math.pow(2, attempt), maxDelay);
|
|
2500
2552
|
}
|
|
2501
2553
|
this.emit("transport:retry", transport.name, attempt + 1, maxRetries, wait);
|
|
@@ -2514,19 +2566,7 @@ var TransportManager = class extends EventEmitter {
|
|
|
2514
2566
|
}
|
|
2515
2567
|
shouldTransportHandle(transport, level, transportId) {
|
|
2516
2568
|
if (transportId && this.transportLevelPreferences.has(transportId)) return this.transportLevelPreferences.get(transportId).includes(level.toLowerCase());
|
|
2517
|
-
|
|
2518
|
-
const levels = [
|
|
2519
|
-
"error",
|
|
2520
|
-
"warn",
|
|
2521
|
-
"info",
|
|
2522
|
-
"debug",
|
|
2523
|
-
"trace",
|
|
2524
|
-
"verbose"
|
|
2525
|
-
];
|
|
2526
|
-
const transportLevelIndex = levels.indexOf(transport.level.toLowerCase());
|
|
2527
|
-
const entryLevelIndex = levels.indexOf(level.toLowerCase());
|
|
2528
|
-
if (transportLevelIndex === -1 || entryLevelIndex === -1) return true;
|
|
2529
|
-
return entryLevelIndex <= transportLevelIndex;
|
|
2569
|
+
return meetsTransportLevel(transport.level, level, this.levelValues);
|
|
2530
2570
|
}
|
|
2531
2571
|
getTransportType(transport) {
|
|
2532
2572
|
if (transport.name === "console") return "console";
|
|
@@ -2649,7 +2689,125 @@ var TransportManager = class extends EventEmitter {
|
|
|
2649
2689
|
internalLog("Transport level preferences cleared");
|
|
2650
2690
|
}
|
|
2651
2691
|
};
|
|
2692
|
+
// src/utils/otel.ts
|
|
2693
|
+
/** W3C trace-flags bit 0: the span is sampled (`TraceFlags.SAMPLED` in the OTel API). */
|
|
2694
|
+
const TRACE_FLAG_SAMPLED = 1;
|
|
2695
|
+
let _otelApi;
|
|
2696
|
+
function tryLoadOtelApi() {
|
|
2697
|
+
if (_otelApi !== void 0) return _otelApi;
|
|
2698
|
+
try {
|
|
2699
|
+
_otelApi = __require("@opentelemetry/api");
|
|
2700
|
+
return _otelApi;
|
|
2701
|
+
} catch {
|
|
2702
|
+
_otelApi = null;
|
|
2703
|
+
return null;
|
|
2704
|
+
}
|
|
2705
|
+
}
|
|
2706
|
+
/**
|
|
2707
|
+
* Read the currently active OTel span context (if any) and return its fields
|
|
2708
|
+
* in a plain object suitable for spreading into a log entry.
|
|
2709
|
+
*
|
|
2710
|
+
* Returns `undefined` when:
|
|
2711
|
+
* - `@opentelemetry/api` is not installed
|
|
2712
|
+
* - No active span exists (root context)
|
|
2713
|
+
* - The span context is invalid (all-zeros)
|
|
2714
|
+
*/
|
|
2715
|
+
function getActiveOtelContext(opts = {}) {
|
|
2716
|
+
const api = tryLoadOtelApi();
|
|
2717
|
+
if (!api) return void 0;
|
|
2718
|
+
try {
|
|
2719
|
+
const ctx = api.context.active();
|
|
2720
|
+
const sc = api.trace.getSpanContext(ctx);
|
|
2721
|
+
if (!sc || !api.trace.isSpanContextValid(sc)) return void 0;
|
|
2722
|
+
const isSampled = (sc.traceFlags & TRACE_FLAG_SAMPLED) === TRACE_FLAG_SAMPLED;
|
|
2723
|
+
if (opts.sampledOnly && !isSampled) return void 0;
|
|
2724
|
+
return {
|
|
2725
|
+
traceId: sc.traceId,
|
|
2726
|
+
spanId: sc.spanId,
|
|
2727
|
+
traceFlags: sc.traceFlags,
|
|
2728
|
+
isSampled
|
|
2729
|
+
};
|
|
2730
|
+
} catch {
|
|
2731
|
+
return;
|
|
2732
|
+
}
|
|
2733
|
+
}
|
|
2734
|
+
/**
|
|
2735
|
+
* Returns a metadata object with OTel context fields ready to merge into a log call,
|
|
2736
|
+
* using the configured field names.
|
|
2737
|
+
*
|
|
2738
|
+
* Returns `{}` when no active span exists (safe to spread unconditionally).
|
|
2739
|
+
*
|
|
2740
|
+
* @example
|
|
2741
|
+
* ```ts
|
|
2742
|
+
* await logger.info('Payment processed', {
|
|
2743
|
+
* ...getOtelMetaFields(),
|
|
2744
|
+
* orderId: 'ord_123',
|
|
2745
|
+
* });
|
|
2746
|
+
* ```
|
|
2747
|
+
*/
|
|
2748
|
+
function getOtelMetaFields(opts = {}) {
|
|
2749
|
+
const { traceIdField = "traceId", spanIdField = "spanId", traceFlagsField = "traceFlags" } = opts;
|
|
2750
|
+
const ctx = getActiveOtelContext(opts);
|
|
2751
|
+
if (!ctx) return {};
|
|
2752
|
+
return {
|
|
2753
|
+
[traceIdField]: ctx.traceId,
|
|
2754
|
+
[spanIdField]: ctx.spanId,
|
|
2755
|
+
[traceFlagsField]: ctx.traceFlags
|
|
2756
|
+
};
|
|
2757
|
+
}
|
|
2758
|
+
let _bridgeOptions = null;
|
|
2759
|
+
/**
|
|
2760
|
+
* Initialise the global OTel bridge.
|
|
2761
|
+
*
|
|
2762
|
+
* Once called, logixia's internal log pipeline checks for an active OTel span
|
|
2763
|
+
* on **every** log call and automatically merges the span context into the
|
|
2764
|
+
* entry's metadata — no per-call wiring needed.
|
|
2765
|
+
*
|
|
2766
|
+
* Call once at app startup, **after** the OTel SDK has been initialised:
|
|
2767
|
+
* ```ts
|
|
2768
|
+
* import { initOtelBridge } from 'logixia';
|
|
2769
|
+
* initOtelBridge();
|
|
2770
|
+
* ```
|
|
2771
|
+
*/
|
|
2772
|
+
function initOtelBridge(opts = {}) {
|
|
2773
|
+
_bridgeOptions = opts;
|
|
2774
|
+
}
|
|
2775
|
+
/**
|
|
2776
|
+
* @internal
|
|
2777
|
+
* True when initOtelBridge() has been called. Lets the logger hot path skip the
|
|
2778
|
+
* `_getOtelPayloadIfEnabled()` call (and its `{}` allocation + Object.keys) on
|
|
2779
|
+
* every log when the bridge is off — the overwhelmingly common case.
|
|
2780
|
+
*/
|
|
2781
|
+
function _isOtelBridgeEnabled() {
|
|
2782
|
+
return _bridgeOptions !== null;
|
|
2783
|
+
}
|
|
2784
|
+
/**
|
|
2785
|
+
* @internal
|
|
2786
|
+
* Used by the core logger to inject OTel context when the bridge is active.
|
|
2787
|
+
* Returns `{}` when the bridge is not initialised or no active span exists.
|
|
2788
|
+
*/
|
|
2789
|
+
function _getOtelPayloadIfEnabled() {
|
|
2790
|
+
if (!_bridgeOptions) return {};
|
|
2791
|
+
return getOtelMetaFields(_bridgeOptions);
|
|
2792
|
+
}
|
|
2793
|
+
/**
|
|
2794
|
+
* @internal
|
|
2795
|
+
* Payload field names the active bridge writes the trace and span ids to, or
|
|
2796
|
+
* `undefined` when the bridge is not initialised.
|
|
2797
|
+
*/
|
|
2798
|
+
function _getOtelBridgeFieldNames() {
|
|
2799
|
+
if (!_bridgeOptions) return void 0;
|
|
2800
|
+
return {
|
|
2801
|
+
traceIdField: _bridgeOptions.traceIdField ?? "traceId",
|
|
2802
|
+
spanIdField: _bridgeOptions.spanIdField ?? "spanId"
|
|
2803
|
+
};
|
|
2804
|
+
}
|
|
2805
|
+
/**
|
|
2806
|
+
* Disable the OTel bridge (useful for tests).
|
|
2807
|
+
*/
|
|
2808
|
+
function disableOtelBridge() {
|
|
2809
|
+
_bridgeOptions = null;
|
|
2810
|
+
}
|
|
2811
|
+
export { ConsoleTransport as _, getActiveOtelContext as a, TransportManager as c, GoogleAnalyticsTransport as d, FileTransport as f, BufferCap as g, DatabaseTransport as h, disableOtelBridge as i, SegmentTransport as l, AnalyticsTransport as m, _getOtelPayloadIfEnabled as n, getOtelMetaFields as o, DataDogTransport as p, _isOtelBridgeEnabled as r, initOtelBridge as s, _getOtelBridgeFieldNames as t, MixpanelTransport as u, stripControlChars as v };
|
|
2652
2812
|
|
|
2653
|
-
//#
|
|
2654
|
-
export { FileTransport as a, DatabaseTransport as c, stripControlChars as d, GoogleAnalyticsTransport as i, BufferCap as l, SegmentTransport as n, DataDogTransport as o, MixpanelTransport as r, AnalyticsTransport as s, TransportManager as t, ConsoleTransport as u };
|
|
2655
|
-
//# sourceMappingURL=transport.manager-BiuCAJd2.mjs.map
|
|
2813
|
+
//# sourceMappingURL=otel-Dt5riXuE.mjs.map
|