logixia 2.0.0 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -29
- package/dist/async-context-B05ArHgM.mjs +134 -0
- package/dist/async-context-B05ArHgM.mjs.map +1 -0
- package/dist/async-context-DTQgi8f7.js +150 -0
- package/dist/async-context-DTQgi8f7.js.map +1 -0
- package/dist/{azure-monitor.transport-CHnjVRF-.mjs → azure-monitor.transport-BPbgjATu.mjs} +27 -15
- package/dist/azure-monitor.transport-BPbgjATu.mjs.map +1 -0
- package/dist/{azure-monitor.transport-Cn_3Usvu.d.ts → azure-monitor.transport-C7kYyZUW.d.mts} +3 -6
- package/dist/azure-monitor.transport-C7kYyZUW.d.mts.map +1 -0
- package/dist/{azure-monitor.transport-CrvfHd9C.js → azure-monitor.transport-CwbOLZHB.js} +32 -20
- package/dist/azure-monitor.transport-CwbOLZHB.js.map +1 -0
- package/dist/{azure-monitor.transport-D7Da4RAb.d.mts → azure-monitor.transport-DV03Z5P4.d.ts} +3 -6
- package/dist/azure-monitor.transport-DV03Z5P4.d.ts.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-0fgLmIPn.mjs} +21 -7
- package/dist/batch-buffer-0fgLmIPn.mjs.map +1 -0
- package/dist/{batch-buffer-BY-mRWIK.js → batch-buffer-DT4gdXmf.js} +53 -40
- package/dist/batch-buffer-DT4gdXmf.js.map +1 -0
- package/dist/browser.d.mts +45 -25
- package/dist/browser.d.mts.map +1 -1
- package/dist/browser.d.ts +45 -25
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +420 -53
- package/dist/browser.js.map +1 -1
- package/dist/browser.mjs +421 -56
- package/dist/browser.mjs.map +1 -1
- package/dist/{builder-0gEzRopq.mjs → builder-D70z6kjj.mjs} +212 -104
- package/dist/builder-D70z6kjj.mjs.map +1 -0
- package/dist/{builder-D44QktIo.js → builder-M7NoaugM.js} +355 -249
- package/dist/builder-M7NoaugM.js.map +1 -0
- package/dist/cli/index.js +59 -59
- 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-BO1ahxw-.js → cloudwatch.transport-B2wKQFF7.js} +61 -36
- package/dist/cloudwatch.transport-B2wKQFF7.js.map +1 -0
- package/dist/{cloudwatch.transport-DZ6ies7g.mjs → cloudwatch.transport-BTvYfLs9.mjs} +54 -28
- package/dist/cloudwatch.transport-BTvYfLs9.mjs.map +1 -0
- package/dist/{cloudwatch.transport-DsEq633o.d.ts → cloudwatch.transport-Bf7L4I59.d.ts} +2 -6
- package/dist/cloudwatch.transport-Bf7L4I59.d.ts.map +1 -0
- package/dist/{cloudwatch.transport-UlyZFWMn.d.mts → cloudwatch.transport-Rj4yTpRn.d.mts} +2 -6
- package/dist/cloudwatch.transport-Rj4yTpRn.d.mts.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 +13 -16
- package/dist/correlation.d.mts.map +1 -1
- package/dist/correlation.d.ts +13 -16
- package/dist/correlation.d.ts.map +1 -1
- package/dist/correlation.js +58 -9
- package/dist/correlation.js.map +1 -1
- package/dist/correlation.mjs +56 -6
- package/dist/correlation.mjs.map +1 -1
- package/dist/{entry-fields-BJkuPnIg.mjs → entry-fields-CGuvT2R0.mjs} +5 -6
- package/dist/entry-fields-CGuvT2R0.mjs.map +1 -0
- package/dist/{entry-fields-BvOLFlJ4.js → entry-fields-RLd1jCoR.js} +10 -12
- package/dist/entry-fields-RLd1jCoR.js.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-C5D72b1g.d.mts} +3 -6
- package/dist/gcp.transport-C5D72b1g.d.mts.map +1 -0
- package/dist/{gcp.transport-GrJurKo8.d.mts → gcp.transport-CFQfdAOK.d.ts} +3 -6
- package/dist/gcp.transport-CFQfdAOK.d.ts.map +1 -0
- package/dist/{gcp.transport-DBX5TPIy.mjs → gcp.transport-CGKopAhQ.mjs} +55 -16
- package/dist/gcp.transport-CGKopAhQ.mjs.map +1 -0
- package/dist/{gcp.transport-CHV8MGgz.js → gcp.transport-KZe9hCAR.js} +60 -22
- package/dist/gcp.transport-KZe9hCAR.js.map +1 -0
- package/dist/{index-DhIoploR.d.ts → index-DwozbmB4.d.ts} +3 -8
- package/dist/index-DwozbmB4.d.ts.map +1 -0
- package/dist/{index-3mw5gaCw.d.mts → index-xqaJtAZn.d.mts} +3 -8
- package/dist/index-xqaJtAZn.d.mts.map +1 -0
- package/dist/index.d.mts +106 -165
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +105 -164
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +164 -261
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +147 -243
- package/dist/index.mjs.map +1 -1
- package/dist/internal-log-b0Vp4qrB.js +183 -0
- package/dist/internal-log-b0Vp4qrB.js.map +1 -0
- package/dist/internal-log-uCSd1PMc.mjs +142 -0
- package/dist/internal-log-uCSd1PMc.mjs.map +1 -0
- package/dist/{logitron-logger-UVeN-mQm.d.ts → logitron-logger-D2B75Oc7.d.ts} +116 -8
- package/dist/logitron-logger-D2B75Oc7.d.ts.map +1 -0
- package/dist/{logitron-logger-BFDSO8Io.d.mts → logitron-logger-oEd6wNhf.d.mts} +116 -8
- package/dist/logitron-logger-oEd6wNhf.d.mts.map +1 -0
- package/dist/middleware.d.mts +10 -12
- package/dist/middleware.d.mts.map +1 -1
- package/dist/middleware.d.ts +10 -12
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +16 -47
- package/dist/middleware.js.map +1 -1
- package/dist/middleware.mjs +13 -45
- package/dist/middleware.mjs.map +1 -1
- package/dist/nest.d.mts +26 -44
- package/dist/nest.d.mts.map +1 -1
- package/dist/nest.d.ts +26 -44
- package/dist/nest.d.ts.map +1 -1
- package/dist/nest.js +116 -132
- package/dist/nest.js.map +1 -1
- package/dist/nest.mjs +59 -73
- package/dist/nest.mjs.map +1 -1
- package/dist/{trace.utils-CvXgaiQT.mjs → request-trace-C_fvIDv4.mjs} +44 -9
- package/dist/request-trace-C_fvIDv4.mjs.map +1 -0
- package/dist/{trace.utils-DpBOLDtq.js → request-trace-wTJdKp6-.js} +121 -77
- package/dist/request-trace-wTJdKp6-.js.map +1 -0
- package/dist/rolldown-runtime-D3PmRqjj.mjs +4 -0
- package/dist/{safe-stringify-DJ66tW5I.mjs → safe-stringify-BMRl3EX3.mjs} +3 -4
- package/dist/safe-stringify-BMRl3EX3.mjs.map +1 -0
- package/dist/{safe-stringify-DWo3aZp_.js → safe-stringify-DLz1Kz3o.js} +23 -25
- package/dist/safe-stringify-DLz1Kz3o.js.map +1 -0
- package/dist/{search-CNh9uVwR.d.ts → search-BH33XhuU.d.mts} +2 -22
- package/dist/search-BH33XhuU.d.mts.map +1 -0
- package/dist/{search-BFbu_oVn.mjs → search-CWMVYC-R.mjs} +22 -39
- package/dist/search-CWMVYC-R.mjs.map +1 -0
- package/dist/{search-DXANsQ2n.d.mts → search-CazwyX5Z.d.ts} +2 -22
- package/dist/search-CazwyX5Z.d.ts.map +1 -0
- package/dist/{search-C4V0OMEn.js → search-DUfWuzFP.js} +52 -69
- package/dist/search-DUfWuzFP.js.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-BegMLkYl.mjs +209 -0
- package/dist/secret-config-BegMLkYl.mjs.map +1 -0
- package/dist/secret-config-CBZBs0p1.js +271 -0
- package/dist/secret-config-CBZBs0p1.js.map +1 -0
- package/dist/{slack.transport-Bzw7sucI.mjs → slack.transport-Ce96JBDk.mjs} +212 -31
- package/dist/slack.transport-Ce96JBDk.mjs.map +1 -0
- package/dist/{slack.transport-BfJRouB2.js → slack.transport-Dlx3xvb7.js} +234 -41
- package/dist/slack.transport-Dlx3xvb7.js.map +1 -0
- package/dist/{slack.transport-BZzoXDPn.d.mts → slack.transport-DrirgDNy.d.ts} +56 -9
- package/dist/slack.transport-DrirgDNy.d.ts.map +1 -0
- package/dist/{slack.transport-CXjQYOes.d.ts → slack.transport-DxHOXlLu.d.mts} +56 -9
- package/dist/slack.transport-DxHOXlLu.d.mts.map +1 -0
- package/dist/testing.d.mts +3 -8
- package/dist/testing.d.mts.map +1 -1
- package/dist/testing.d.ts +3 -8
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +3 -4
- package/dist/testing.js.map +1 -1
- package/dist/testing.mjs +2 -3
- package/dist/testing.mjs.map +1 -1
- package/dist/{transport.manager-CXbKKdVE.js → transport.manager-DkcEOlqV.js} +164 -160
- package/dist/transport.manager-DkcEOlqV.js.map +1 -0
- package/dist/{transport.manager-BiuCAJd2.mjs → transport.manager-eZ_EeC00.mjs} +108 -99
- package/dist/transport.manager-eZ_EeC00.mjs.map +1 -0
- package/dist/{transport.types-CGoHpWQR.d.ts → transport.types-BJVL1QQl.d.mts} +1 -3
- package/dist/transport.types-BJVL1QQl.d.mts.map +1 -0
- package/dist/{transport.types-BMnurPcc.d.mts → transport.types-BJVL1QQl.d.ts} +1 -3
- package/dist/transport.types-BJVL1QQl.d.ts.map +1 -0
- package/dist/transports.d.mts +22 -36
- package/dist/transports.d.mts.map +1 -1
- package/dist/transports.d.ts +22 -36
- package/dist/transports.d.ts.map +1 -1
- package/dist/transports.js +10 -13
- package/dist/transports.mjs +7 -13
- package/dist/worker-entry.js +337 -87
- 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-CdzSZJmw.d.ts → worker.transport-BuPwBi3d.d.ts} +2 -6
- package/dist/worker.transport-BuPwBi3d.d.ts.map +1 -0
- package/dist/{worker.transport-BdPxu3PN.js → worker.transport-C6GNl_r2.js} +44 -14
- package/dist/worker.transport-C6GNl_r2.js.map +1 -0
- package/dist/{worker.transport-lPxO2MVL.mjs → worker.transport-DLVA4y2e.mjs} +39 -9
- package/dist/worker.transport-DLVA4y2e.mjs.map +1 -0
- package/dist/{worker.transport-JvGPog3C.d.mts → worker.transport-hJay1wxA.d.mts} +2 -6
- package/dist/worker.transport-hJay1wxA.d.mts.map +1 -0
- package/package.json +19 -11
- 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
package/dist/worker-entry.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// \0rolldown/runtime.js
|
|
2
2
|
var __create = Object.create;
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -15,26 +15,19 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
15
15
|
}
|
|
16
16
|
return to;
|
|
17
17
|
};
|
|
18
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
18
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule || !__hasOwnProp.call(mod, "default") ? __defProp(target, "default", {
|
|
19
19
|
value: mod,
|
|
20
20
|
enumerable: true
|
|
21
21
|
}) : target, mod));
|
|
22
|
-
|
|
23
|
-
//#endregion
|
|
24
22
|
let node_worker_threads = require("node:worker_threads");
|
|
25
|
-
node_worker_threads = __toESM(node_worker_threads);
|
|
26
23
|
let node_fs = require("node:fs");
|
|
27
24
|
node_fs = __toESM(node_fs);
|
|
28
25
|
let node_path = require("node:path");
|
|
29
26
|
node_path = __toESM(node_path);
|
|
30
27
|
let node_stream_promises = require("node:stream/promises");
|
|
31
|
-
node_stream_promises = __toESM(node_stream_promises);
|
|
32
28
|
let node_util = require("node:util");
|
|
33
|
-
node_util = __toESM(node_util);
|
|
34
29
|
let node_zlib = require("node:zlib");
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
//#region src/utils/coerce.utils.ts
|
|
30
|
+
// src/utils/coerce.utils.ts
|
|
38
31
|
/**
|
|
39
32
|
* Defensive value coercion helpers for Logixia.
|
|
40
33
|
*
|
|
@@ -68,9 +61,7 @@ function safeToString(value) {
|
|
|
68
61
|
} catch {}
|
|
69
62
|
return `[${((_constructor = value.constructor) === null || _constructor === void 0 ? void 0 : _constructor.name) ?? "object"}]`;
|
|
70
63
|
}
|
|
71
|
-
|
|
72
|
-
//#endregion
|
|
73
|
-
//#region src/utils/safe-stringify.ts
|
|
64
|
+
// src/utils/safe-stringify.ts
|
|
74
65
|
/** Build a JSONPath like `$["a"][0]["b"]` for a decycle pointer. */
|
|
75
66
|
function jsonPath(parts) {
|
|
76
67
|
let path = "$";
|
|
@@ -154,9 +145,7 @@ function stringifyForLog(value) {
|
|
|
154
145
|
}
|
|
155
146
|
}
|
|
156
147
|
}
|
|
157
|
-
|
|
158
|
-
//#endregion
|
|
159
|
-
//#region src/utils/sanitize.utils.ts
|
|
148
|
+
// src/utils/sanitize.utils.ts
|
|
160
149
|
/**
|
|
161
150
|
* Control-character stripping for text-mode log output.
|
|
162
151
|
*
|
|
@@ -172,11 +161,9 @@ const VISIBLE_ESCAPES = {
|
|
|
172
161
|
function stripControlChars(value) {
|
|
173
162
|
return value.replace(CONTROL_CHARS_RE, (ch) => VISIBLE_ESCAPES[ch] ?? "");
|
|
174
163
|
}
|
|
175
|
-
|
|
176
|
-
//#endregion
|
|
177
|
-
//#region src/transports/entry-fields.ts
|
|
164
|
+
// src/transports/entry-fields.ts
|
|
178
165
|
const PAYLOAD_PREFIX = "data_";
|
|
179
|
-
const UNSAFE_KEYS = new Set(["__proto__"]);
|
|
166
|
+
const UNSAFE_KEYS = /* @__PURE__ */ new Set(["__proto__"]);
|
|
180
167
|
/**
|
|
181
168
|
* Copies `core` and then the user payload into one object. The core fields stay
|
|
182
169
|
* authoritative: a payload key that matches a core key (even one whose value is
|
|
@@ -188,7 +175,7 @@ const UNSAFE_KEYS = new Set(["__proto__"]);
|
|
|
188
175
|
function mergeCoreFields(core, data, extraReserved = []) {
|
|
189
176
|
const merged = { ...core };
|
|
190
177
|
if (!data) return merged;
|
|
191
|
-
const reserved = new Set([...Object.keys(core), ...extraReserved]);
|
|
178
|
+
const reserved = /* @__PURE__ */ new Set([...Object.keys(core), ...extraReserved]);
|
|
192
179
|
const payloadKeys = new Set(Object.keys(data));
|
|
193
180
|
for (const key of payloadKeys) {
|
|
194
181
|
if (UNSAFE_KEYS.has(key)) continue;
|
|
@@ -200,9 +187,7 @@ function mergeCoreFields(core, data, extraReserved = []) {
|
|
|
200
187
|
}
|
|
201
188
|
return merged;
|
|
202
189
|
}
|
|
203
|
-
|
|
204
|
-
//#endregion
|
|
205
|
-
//#region src/transports/console.transport.ts
|
|
190
|
+
// src/transports/console.transport.ts
|
|
206
191
|
/**
|
|
207
192
|
* Writes log entries to stdout (info/debug/verbose) and stderr (error/warn).
|
|
208
193
|
*
|
|
@@ -212,26 +197,6 @@ function mergeCoreFields(core, data, extraReserved = []) {
|
|
|
212
197
|
* transports: { console: { format: 'json' } }
|
|
213
198
|
*/
|
|
214
199
|
var ConsoleTransport = class ConsoleTransport {
|
|
215
|
-
static #_ = this.COLORS = new Map([
|
|
216
|
-
["black", "\x1B[30m"],
|
|
217
|
-
["red", "\x1B[31m"],
|
|
218
|
-
["green", "\x1B[32m"],
|
|
219
|
-
["yellow", "\x1B[33m"],
|
|
220
|
-
["blue", "\x1B[34m"],
|
|
221
|
-
["magenta", "\x1B[35m"],
|
|
222
|
-
["cyan", "\x1B[36m"],
|
|
223
|
-
["white", "\x1B[37m"],
|
|
224
|
-
["gray", "\x1B[90m"],
|
|
225
|
-
["grey", "\x1B[90m"],
|
|
226
|
-
["brightred", "\x1B[91m"],
|
|
227
|
-
["brightgreen", "\x1B[92m"],
|
|
228
|
-
["brightyellow", "\x1B[93m"],
|
|
229
|
-
["brightblue", "\x1B[94m"],
|
|
230
|
-
["brightmagenta", "\x1B[95m"],
|
|
231
|
-
["brightcyan", "\x1B[96m"],
|
|
232
|
-
["brightwhite", "\x1B[97m"],
|
|
233
|
-
["reset", "\x1B[0m"]
|
|
234
|
-
]);
|
|
235
200
|
static sanitize(value) {
|
|
236
201
|
return stripControlChars(safeToString(value));
|
|
237
202
|
}
|
|
@@ -300,10 +265,28 @@ var ConsoleTransport = class ConsoleTransport {
|
|
|
300
265
|
close() {
|
|
301
266
|
return Promise.resolve();
|
|
302
267
|
}
|
|
268
|
+
static #_ = () => this.COLORS = /* @__PURE__ */ new Map([
|
|
269
|
+
["black", "\x1B[30m"],
|
|
270
|
+
["red", "\x1B[31m"],
|
|
271
|
+
["green", "\x1B[32m"],
|
|
272
|
+
["yellow", "\x1B[33m"],
|
|
273
|
+
["blue", "\x1B[34m"],
|
|
274
|
+
["magenta", "\x1B[35m"],
|
|
275
|
+
["cyan", "\x1B[36m"],
|
|
276
|
+
["white", "\x1B[37m"],
|
|
277
|
+
["gray", "\x1B[90m"],
|
|
278
|
+
["grey", "\x1B[90m"],
|
|
279
|
+
["brightred", "\x1B[91m"],
|
|
280
|
+
["brightgreen", "\x1B[92m"],
|
|
281
|
+
["brightyellow", "\x1B[93m"],
|
|
282
|
+
["brightblue", "\x1B[94m"],
|
|
283
|
+
["brightmagenta", "\x1B[95m"],
|
|
284
|
+
["brightcyan", "\x1B[96m"],
|
|
285
|
+
["brightwhite", "\x1B[97m"],
|
|
286
|
+
["reset", "\x1B[0m"]
|
|
287
|
+
]);
|
|
303
288
|
};
|
|
304
|
-
|
|
305
|
-
//#endregion
|
|
306
|
-
//#region src/utils/internal-log.ts
|
|
289
|
+
// src/utils/internal-log.ts
|
|
307
290
|
/**
|
|
308
291
|
* Internal logging helpers for use within the logixia library itself.
|
|
309
292
|
*
|
|
@@ -322,14 +305,26 @@ var ConsoleTransport = class ConsoleTransport {
|
|
|
322
305
|
* behavior was previously unreliable because the value was frozen at load.
|
|
323
306
|
*/
|
|
324
307
|
function isSilent() {
|
|
325
|
-
|
|
308
|
+
var _process$env;
|
|
309
|
+
if (typeof process !== "undefined" && ((_process$env = process.env) === null || _process$env === void 0 ? void 0 : _process$env.LOGIXIA_SILENT_INTERNAL) === "1") return true;
|
|
310
|
+
const flag = globalThis["LOGIXIA_SILENT_INTERNAL"];
|
|
311
|
+
return flag === "1" || flag === 1 || flag === true;
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Write a line to stderr, falling back to the matching console method where
|
|
315
|
+
* `process` is unavailable (browsers, Cloudflare Workers, Deno without Node compat).
|
|
316
|
+
*/
|
|
317
|
+
function writeLine(method, line) {
|
|
318
|
+
var _process$stderr;
|
|
319
|
+
if (typeof process !== "undefined" && typeof ((_process$stderr = process.stderr) === null || _process$stderr === void 0 ? void 0 : _process$stderr.write) === "function") process.stderr.write(`${line}\n`);
|
|
320
|
+
else if (typeof console !== "undefined" && typeof console[method] === "function") console[method](line);
|
|
326
321
|
}
|
|
327
322
|
/**
|
|
328
323
|
* Emit an internal warning to stderr.
|
|
329
324
|
* Use when something is misconfigured but logixia can continue operating.
|
|
330
325
|
*/
|
|
331
326
|
function internalWarn(message) {
|
|
332
|
-
if (!isSilent())
|
|
327
|
+
if (!isSilent()) writeLine("warn", `[logixia:warn] ${message}`);
|
|
333
328
|
}
|
|
334
329
|
/**
|
|
335
330
|
* Emit an internal error to stderr.
|
|
@@ -340,12 +335,10 @@ function internalError(message, error) {
|
|
|
340
335
|
let errStr = "";
|
|
341
336
|
if (error instanceof Error) errStr = ` — ${error.message}`;
|
|
342
337
|
else if (error != null) errStr = ` — ${String(error)}`;
|
|
343
|
-
|
|
338
|
+
writeLine("error", `[logixia:error] ${message}${errStr}`);
|
|
344
339
|
}
|
|
345
340
|
}
|
|
346
|
-
|
|
347
|
-
//#endregion
|
|
348
|
-
//#region src/transports/buffer-cap.ts
|
|
341
|
+
// src/transports/buffer-cap.ts
|
|
349
342
|
const DEFAULT_BUFFER_CAP = 1e4;
|
|
350
343
|
const DROP_WARN_INTERVAL_MS$1 = 5e3;
|
|
351
344
|
/**
|
|
@@ -361,8 +354,10 @@ var BufferCap = class {
|
|
|
361
354
|
this.dropped = 0;
|
|
362
355
|
this.lastWarning = 0;
|
|
363
356
|
let max = fallback;
|
|
364
|
-
if (requested !== void 0)
|
|
365
|
-
|
|
357
|
+
if (requested !== void 0) {
|
|
358
|
+
if (Number.isInteger(requested) && requested >= 1) max = requested;
|
|
359
|
+
else internalWarn(`${name}: maxBufferSize ${String(requested)} is not a positive integer; using ${fallback}`);
|
|
360
|
+
}
|
|
366
361
|
this.max = Math.max(max, batchSize);
|
|
367
362
|
}
|
|
368
363
|
/** Drops the oldest items beyond the cap, in place. */
|
|
@@ -384,9 +379,256 @@ var BufferCap = class {
|
|
|
384
379
|
this.lastWarning = now;
|
|
385
380
|
}
|
|
386
381
|
};
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
382
|
+
// src/utils/sensitive-names.ts
|
|
383
|
+
/**
|
|
384
|
+
* The one list of sensitive names. Log redaction (redact.utils), the HTTP logger
|
|
385
|
+
* middleware and transport secret handling (transports/secret-config) all read it,
|
|
386
|
+
* so the lists cannot drift. No imports: safe from any module, including browser code.
|
|
387
|
+
*/
|
|
388
|
+
/** Field names redacted by name, wherever they appear in logged data. */
|
|
389
|
+
const SENSITIVE_KEY_NAMES = [
|
|
390
|
+
"password",
|
|
391
|
+
"passwd",
|
|
392
|
+
"secret",
|
|
393
|
+
"token",
|
|
394
|
+
"apiKey",
|
|
395
|
+
"api_key",
|
|
396
|
+
"accessToken",
|
|
397
|
+
"access_token",
|
|
398
|
+
"refreshToken",
|
|
399
|
+
"refresh_token",
|
|
400
|
+
"authorization",
|
|
401
|
+
"credentials",
|
|
402
|
+
"privateKey",
|
|
403
|
+
"private_key",
|
|
404
|
+
"clientSecret",
|
|
405
|
+
"client_secret",
|
|
406
|
+
"cookie",
|
|
407
|
+
"set-cookie",
|
|
408
|
+
"x-api-key",
|
|
409
|
+
"session",
|
|
410
|
+
"proxy-authorization",
|
|
411
|
+
"x-auth-token",
|
|
412
|
+
"x-access-token",
|
|
413
|
+
"aws_secret_access_key",
|
|
414
|
+
"awsSecretAccessKey",
|
|
415
|
+
"secretAccessKey"
|
|
416
|
+
];
|
|
417
|
+
/**
|
|
418
|
+
* Extra names that only mean "secret" inside transport configuration, where
|
|
419
|
+
* short words like `key` or `signature` are credentials, not log fields.
|
|
420
|
+
*/
|
|
421
|
+
const TRANSPORT_CONFIG_SECRET_NAMES = [
|
|
422
|
+
"writeKey",
|
|
423
|
+
"apiSecret",
|
|
424
|
+
"connectionString",
|
|
425
|
+
"sessionToken",
|
|
426
|
+
"passphrase",
|
|
427
|
+
"signature",
|
|
428
|
+
"pwd",
|
|
429
|
+
"pfx",
|
|
430
|
+
"cert",
|
|
431
|
+
"key",
|
|
432
|
+
"auth"
|
|
433
|
+
];
|
|
434
|
+
/** Query-string parameters whose values are never logged. */
|
|
435
|
+
const DEFAULT_REDACT_QUERY_PARAMS = [
|
|
436
|
+
"token",
|
|
437
|
+
"access_token",
|
|
438
|
+
"refresh_token",
|
|
439
|
+
"code",
|
|
440
|
+
"password",
|
|
441
|
+
"secret",
|
|
442
|
+
"api_key",
|
|
443
|
+
"apikey",
|
|
444
|
+
"key",
|
|
445
|
+
"signature",
|
|
446
|
+
"sig",
|
|
447
|
+
"auth"
|
|
448
|
+
];
|
|
449
|
+
// src/transports/secret-config.ts
|
|
450
|
+
/**
|
|
451
|
+
* Keeps credentials out of serialized transport output and error text.
|
|
452
|
+
*
|
|
453
|
+
* `protectSecrets()` replaces each listed field with a non-enumerable accessor backed
|
|
454
|
+
* by a WeakMap, whether or not the field is assigned yet, so later assignments (a
|
|
455
|
+
* connection opened on first write, a refreshed token) stay hidden too. It also
|
|
456
|
+
* installs `toJSON()` and a Node inspect hook returning a redacted view: scalar
|
|
457
|
+
* fields stay for debugging, secret-looking keys become '[REDACTED]', URLs lose
|
|
458
|
+
* userinfo, query and fragment. No Node imports, so browser bundles can use it.
|
|
459
|
+
*/
|
|
460
|
+
const REDACTED = "[REDACTED]";
|
|
461
|
+
const INSPECT_CUSTOM = Symbol.for("nodejs.util.inspect.custom");
|
|
462
|
+
const MAX_DEPTH = 4;
|
|
463
|
+
const MIN_SECRET_LENGTH = 4;
|
|
464
|
+
const SCHEME_PREFIX = /^[a-z][a-z0-9+.-]*:\/\//i;
|
|
465
|
+
/** `scheme://userinfo@`: userinfo runs to the LAST `@` before the path, so `p@ss` is covered. */
|
|
466
|
+
const USERINFO = /(\b[a-z][a-z0-9+.-]*:\/\/)[^\s/?#]*@/gi;
|
|
467
|
+
function normalizeName(name) {
|
|
468
|
+
return name.toLowerCase().replaceAll("-", "").replaceAll("_", "");
|
|
469
|
+
}
|
|
470
|
+
const SECRET_NAMES = [...SENSITIVE_KEY_NAMES, ...TRANSPORT_CONFIG_SECRET_NAMES].map(normalizeName);
|
|
471
|
+
const QUERY_NAMES = new Set(DEFAULT_REDACT_QUERY_PARAMS.map(normalizeName));
|
|
472
|
+
/** Exact match for short names (`key`, `pfx`), suffix match for longer ones (`azureClientSecret`). */
|
|
473
|
+
function isSecretKey(key) {
|
|
474
|
+
const name = normalizeName(key);
|
|
475
|
+
return SECRET_NAMES.some((n) => name === n || n.length >= 5 && name.endsWith(n));
|
|
476
|
+
}
|
|
477
|
+
function isUrlKey(key) {
|
|
478
|
+
return /url|uri|endpoint|href/i.test(key);
|
|
479
|
+
}
|
|
480
|
+
function isPlainObject(value) {
|
|
481
|
+
const proto = Object.getPrototypeOf(value);
|
|
482
|
+
return proto === Object.prototype || proto === null;
|
|
483
|
+
}
|
|
484
|
+
function safeDecode(value) {
|
|
485
|
+
try {
|
|
486
|
+
return decodeURIComponent(value.replaceAll("+", " "));
|
|
487
|
+
} catch {
|
|
488
|
+
return value;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
/** Absolute URL: `scheme://host` only. Relative or unparseable: path kept, query and fragment cut. */
|
|
492
|
+
function redactUrl(raw) {
|
|
493
|
+
if (typeof raw !== "string") return `${raw.protocol}//${raw.host}`;
|
|
494
|
+
if (SCHEME_PREFIX.test(raw)) try {
|
|
495
|
+
const url = new URL(raw);
|
|
496
|
+
return `${url.protocol}//${url.host}`;
|
|
497
|
+
} catch {
|
|
498
|
+
return REDACTED;
|
|
499
|
+
}
|
|
500
|
+
return raw.split(/[?#]/, 1)[0] ?? "";
|
|
501
|
+
}
|
|
502
|
+
function redactHeaders(headers) {
|
|
503
|
+
if (!headers || typeof headers !== "object") return headers;
|
|
504
|
+
return Object.fromEntries(Object.keys(headers).map((name) => [name, REDACTED]));
|
|
505
|
+
}
|
|
506
|
+
/** Redacted deep copy of a config-like value. Never throws, never returns a secret. */
|
|
507
|
+
function redactConfig(value, depth = 0, key = "") {
|
|
508
|
+
var _value$constructor;
|
|
509
|
+
if (value === null || value === void 0) return value;
|
|
510
|
+
if (typeof value === "string") return SCHEME_PREFIX.test(value) || isUrlKey(key) ? redactUrl(value) : value;
|
|
511
|
+
if (typeof value === "number" || typeof value === "boolean") return value;
|
|
512
|
+
if (typeof value === "function") return "[Function]";
|
|
513
|
+
if (typeof value !== "object") return "[Unserializable]";
|
|
514
|
+
if (typeof URL !== "undefined" && value instanceof URL) return redactUrl(value);
|
|
515
|
+
if (Array.isArray(value)) return depth >= MAX_DEPTH ? "[Array]" : value.map((v) => redactConfig(v, depth + 1, key));
|
|
516
|
+
if (!isPlainObject(value) || depth >= MAX_DEPTH) return `[${((_value$constructor = value.constructor) === null || _value$constructor === void 0 ? void 0 : _value$constructor.name) ?? "Object"}]`;
|
|
517
|
+
const out = {};
|
|
518
|
+
for (const [name, inner] of Object.entries(value)) if (isSecretKey(name)) out[name] = inner === void 0 ? void 0 : REDACTED;
|
|
519
|
+
else if (name.toLowerCase() === "headers") out[name] = redactHeaders(inner);
|
|
520
|
+
else out[name] = redactConfig(inner, depth + 1, name);
|
|
521
|
+
return out;
|
|
522
|
+
}
|
|
523
|
+
const hiddenKeys = /* @__PURE__ */ new WeakMap();
|
|
524
|
+
const hiddenValues = /* @__PURE__ */ new WeakMap();
|
|
525
|
+
function viewOf(target) {
|
|
526
|
+
var _target$constructor;
|
|
527
|
+
const hidden = hiddenKeys.get(target) ?? /* @__PURE__ */ new Set();
|
|
528
|
+
const values = hiddenValues.get(target);
|
|
529
|
+
const view = { class: (_target$constructor = target.constructor) === null || _target$constructor === void 0 ? void 0 : _target$constructor.name };
|
|
530
|
+
for (const key of /* @__PURE__ */ new Set([...Object.keys(target), ...hidden])) {
|
|
531
|
+
const inner = hidden.has(key) ? values === null || values === void 0 ? void 0 : values.get(key) : target[key];
|
|
532
|
+
if (isSecretKey(key)) view[key] = inner === void 0 ? void 0 : REDACTED;
|
|
533
|
+
else if (key.toLowerCase() === "headers") view[key] = redactHeaders(inner);
|
|
534
|
+
else if (inner !== null && typeof inner === "object" && !hidden.has(key) && !(inner instanceof URL)) view[key] = "[Object]";
|
|
535
|
+
else if (hidden.has(key) && typeof inner === "string" && !isUrlKey(key)) view[key] = REDACTED;
|
|
536
|
+
else view[key] = redactConfig(inner, 0, key);
|
|
537
|
+
}
|
|
538
|
+
return view;
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* Hides `keys` on `target` (assigned or not yet) and gives it a redacted `toJSON()` /
|
|
542
|
+
* inspect view. Fields stay readable and writable. Safe to call more than once.
|
|
543
|
+
* Throws when the target cannot carry the protection (frozen or sealed), instead of
|
|
544
|
+
* silently leaving the secret enumerable.
|
|
545
|
+
*/
|
|
546
|
+
function protectSecrets(target, keys) {
|
|
547
|
+
if (!Object.isExtensible(target)) {
|
|
548
|
+
var _target$constructor2;
|
|
549
|
+
throw new TypeError(`protectSecrets: ${((_target$constructor2 = target.constructor) === null || _target$constructor2 === void 0 ? void 0 : _target$constructor2.name) ?? "object"} is not extensible`);
|
|
550
|
+
}
|
|
551
|
+
let hidden = hiddenKeys.get(target);
|
|
552
|
+
let values = hiddenValues.get(target);
|
|
553
|
+
if (!hidden || !values) {
|
|
554
|
+
hidden = /* @__PURE__ */ new Set();
|
|
555
|
+
values = /* @__PURE__ */ new Map();
|
|
556
|
+
hiddenKeys.set(target, hidden);
|
|
557
|
+
hiddenValues.set(target, values);
|
|
558
|
+
const view = () => viewOf(target);
|
|
559
|
+
Object.defineProperty(target, "toJSON", {
|
|
560
|
+
value: view,
|
|
561
|
+
enumerable: false,
|
|
562
|
+
configurable: true
|
|
563
|
+
});
|
|
564
|
+
Object.defineProperty(target, INSPECT_CUSTOM, {
|
|
565
|
+
value: view,
|
|
566
|
+
enumerable: false,
|
|
567
|
+
configurable: true
|
|
568
|
+
});
|
|
569
|
+
}
|
|
570
|
+
const store = values;
|
|
571
|
+
for (const key of keys) {
|
|
572
|
+
if (hidden.has(key)) continue;
|
|
573
|
+
const desc = Object.getOwnPropertyDescriptor(target, key);
|
|
574
|
+
if (desc && !desc.configurable) throw new TypeError(`protectSecrets: "${key}" is not configurable`);
|
|
575
|
+
if (desc && "value" in desc) store.set(key, desc.value);
|
|
576
|
+
hidden.add(key);
|
|
577
|
+
Object.defineProperty(target, key, {
|
|
578
|
+
enumerable: false,
|
|
579
|
+
configurable: true,
|
|
580
|
+
get: () => store.get(key),
|
|
581
|
+
set: (next) => void store.set(key, next)
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
/** The raw, decoded and percent-encoded spellings of a secret. */
|
|
586
|
+
function variantsOf(secret) {
|
|
587
|
+
return [
|
|
588
|
+
secret,
|
|
589
|
+
safeDecode(secret),
|
|
590
|
+
encodeURIComponent(secret),
|
|
591
|
+
encodeURI(secret)
|
|
592
|
+
];
|
|
593
|
+
}
|
|
594
|
+
/** Secret parts of a URL string: the password and the values of sensitive query parameters. */
|
|
595
|
+
function urlSecrets(raw) {
|
|
596
|
+
const text = typeof raw === "string" ? raw : raw.href;
|
|
597
|
+
const out = [];
|
|
598
|
+
const userinfo = new RegExp(USERINFO.source, "i").exec(text);
|
|
599
|
+
if (userinfo) {
|
|
600
|
+
const info = text.slice(userinfo[1].length, userinfo.index + userinfo[0].length - 1);
|
|
601
|
+
const colon = info.indexOf(":");
|
|
602
|
+
if (colon !== -1) out.push(info.slice(colon + 1));
|
|
603
|
+
}
|
|
604
|
+
const queryStart = text.indexOf("?");
|
|
605
|
+
if (queryStart !== -1) {
|
|
606
|
+
const query = text.slice(queryStart + 1).split("#", 1)[0] ?? "";
|
|
607
|
+
for (const pair of query.split("&")) {
|
|
608
|
+
const eq = pair.indexOf("=");
|
|
609
|
+
if (eq > 0 && QUERY_NAMES.has(normalizeName(safeDecode(pair.slice(0, eq))))) out.push(pair.slice(eq + 1));
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
return out.flatMap(variantsOf);
|
|
613
|
+
}
|
|
614
|
+
/** Replaces URL userinfo and every spelling of the given secret values in `text`. */
|
|
615
|
+
function scrubSecrets(text, secrets) {
|
|
616
|
+
let out = text.replace(USERINFO, `$1${REDACTED}@`);
|
|
617
|
+
const all = new Set(secrets.flatMap((s) => s && s.length >= MIN_SECRET_LENGTH ? variantsOf(s) : []));
|
|
618
|
+
for (const secret of [...all].sort((a, b) => b.length - a.length)) if (secret.length >= MIN_SECRET_LENGTH) out = out.split(secret).join(REDACTED);
|
|
619
|
+
return out;
|
|
620
|
+
}
|
|
621
|
+
/** Scrubs message, stack and the cause chain of `err` in place; returns it. */
|
|
622
|
+
function scrubError(err, secrets, depth = 0) {
|
|
623
|
+
if (!(err instanceof Error) || depth > 3) return err;
|
|
624
|
+
try {
|
|
625
|
+
err.message = scrubSecrets(err.message, secrets);
|
|
626
|
+
if (err.stack) err.stack = scrubSecrets(err.stack, secrets);
|
|
627
|
+
scrubError(err.cause, secrets, depth + 1);
|
|
628
|
+
} catch {}
|
|
629
|
+
return err;
|
|
630
|
+
}
|
|
631
|
+
// src/transports/database.transport.ts
|
|
390
632
|
/**
|
|
391
633
|
* Validates that a SQL identifier (table/index name) contains only safe characters.
|
|
392
634
|
* Prevents SQL injection via user-supplied table names.
|
|
@@ -409,7 +651,7 @@ const PG_DATA_CLASSES = [
|
|
|
409
651
|
"23",
|
|
410
652
|
"54"
|
|
411
653
|
];
|
|
412
|
-
const MYSQL_DATA_CODES = new Set([
|
|
654
|
+
const MYSQL_DATA_CODES = /* @__PURE__ */ new Set([
|
|
413
655
|
"ER_DATA_TOO_LONG",
|
|
414
656
|
"ER_TRUNCATED_WRONG_VALUE",
|
|
415
657
|
"ER_TRUNCATED_WRONG_VALUE_FOR_FIELD",
|
|
@@ -419,7 +661,7 @@ const MYSQL_DATA_CODES = new Set([
|
|
|
419
661
|
"ER_INVALID_JSON_TEXT",
|
|
420
662
|
"ER_INVALID_CHARACTER_STRING"
|
|
421
663
|
]);
|
|
422
|
-
const MYSQL_DATA_ERRNOS = new Set([
|
|
664
|
+
const MYSQL_DATA_ERRNOS = /* @__PURE__ */ new Set([
|
|
423
665
|
1048,
|
|
424
666
|
1062,
|
|
425
667
|
1264,
|
|
@@ -428,12 +670,12 @@ const MYSQL_DATA_ERRNOS = new Set([
|
|
|
428
670
|
1406,
|
|
429
671
|
3140
|
|
430
672
|
]);
|
|
431
|
-
const SQLITE_DATA_CODES = new Set([
|
|
673
|
+
const SQLITE_DATA_CODES = /* @__PURE__ */ new Set([
|
|
432
674
|
"SQLITE_CONSTRAINT",
|
|
433
675
|
"SQLITE_TOOBIG",
|
|
434
676
|
"SQLITE_MISMATCH"
|
|
435
677
|
]);
|
|
436
|
-
const MONGO_DATA_CODES = new Set([
|
|
678
|
+
const MONGO_DATA_CODES = /* @__PURE__ */ new Set([
|
|
437
679
|
2,
|
|
438
680
|
121,
|
|
439
681
|
10334,
|
|
@@ -495,6 +737,7 @@ var DatabaseTransport = class {
|
|
|
495
737
|
this.name = "database";
|
|
496
738
|
this.batch = [];
|
|
497
739
|
this.isConnected = false;
|
|
740
|
+
protectSecrets(this, ["config", "connection"]);
|
|
498
741
|
this.batchSize = config.batchSize || 100;
|
|
499
742
|
this.flushInterval = config.flushInterval || 5e3;
|
|
500
743
|
this.cap = new BufferCap("DatabaseTransport", config.maxBufferSize, this.batchSize);
|
|
@@ -502,6 +745,14 @@ var DatabaseTransport = class {
|
|
|
502
745
|
if (config.table) validateSqlIdentifier(config.table, "table");
|
|
503
746
|
this.setupFlushTimer();
|
|
504
747
|
}
|
|
748
|
+
secretValues() {
|
|
749
|
+
const { connectionString, password } = this.config;
|
|
750
|
+
return [
|
|
751
|
+
connectionString,
|
|
752
|
+
password,
|
|
753
|
+
...connectionString ? urlSecrets(connectionString) : []
|
|
754
|
+
];
|
|
755
|
+
}
|
|
505
756
|
async write(entry) {
|
|
506
757
|
if (!this.isConnected) await this.connect();
|
|
507
758
|
this.addToBatch(entry);
|
|
@@ -562,6 +813,13 @@ var DatabaseTransport = class {
|
|
|
562
813
|
this.cap.enforce(this.batch);
|
|
563
814
|
}
|
|
564
815
|
async writeEntries(entries) {
|
|
816
|
+
try {
|
|
817
|
+
await this.writeEntriesUnscrubbed(entries);
|
|
818
|
+
} catch (error) {
|
|
819
|
+
throw scrubError(error, this.secretValues());
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
async writeEntriesUnscrubbed(entries) {
|
|
565
823
|
switch (this.config.type) {
|
|
566
824
|
case "mongodb":
|
|
567
825
|
await this.flushToMongoDB(entries);
|
|
@@ -640,13 +898,12 @@ var DatabaseTransport = class {
|
|
|
640
898
|
case "mysql":
|
|
641
899
|
await this.connectMySQL();
|
|
642
900
|
break;
|
|
643
|
-
case "sqlite":
|
|
644
|
-
await this.connectSQLite();
|
|
645
|
-
break;
|
|
901
|
+
case "sqlite": await this.connectSQLite();
|
|
646
902
|
}
|
|
647
903
|
this.isConnected = true;
|
|
648
904
|
} catch (error) {
|
|
649
905
|
this.isConnected = false;
|
|
906
|
+
scrubError(error, this.secretValues());
|
|
650
907
|
throw new Error(`Database connection failed: ${error}`, { cause: error });
|
|
651
908
|
}
|
|
652
909
|
}
|
|
@@ -655,7 +912,8 @@ var DatabaseTransport = class {
|
|
|
655
912
|
const { MongoClient } = await import("mongodb").catch(() => {
|
|
656
913
|
throw new Error("MongoDB driver not installed. Run: npm install mongodb");
|
|
657
914
|
});
|
|
658
|
-
|
|
915
|
+
const connectionString = this.config.connectionString || `mongodb://${this.config.host}:${this.config.port}/${this.config.database}`;
|
|
916
|
+
this.connection = new MongoClient(connectionString);
|
|
659
917
|
await this.connection.connect();
|
|
660
918
|
await this.connection.db(this.config.database).admin().ping();
|
|
661
919
|
} catch (error) {
|
|
@@ -767,12 +1025,13 @@ var DatabaseTransport = class {
|
|
|
767
1025
|
entry.environment
|
|
768
1026
|
].map((value, column) => stripNul(column === 3 ? stripJsonNulEscape(value) : value))), POSTGRES_ROWS_PER_INSERT);
|
|
769
1027
|
const insertChunk = async (rows) => {
|
|
1028
|
+
const placeholders = rows.map((_, i) => {
|
|
1029
|
+
return `(${Array.from({ length: POSTGRES_COLUMNS }, (_unused, c) => `$${i * POSTGRES_COLUMNS + c + 1}`).join(", ")})`;
|
|
1030
|
+
}).join(", ");
|
|
770
1031
|
const query = `
|
|
771
1032
|
INSERT INTO ${tableName}
|
|
772
1033
|
(timestamp, level, message, payload, context, trace_id, app_name, environment)
|
|
773
|
-
VALUES ${
|
|
774
|
-
return `(${Array.from({ length: POSTGRES_COLUMNS }, (_unused, c) => `$${i * POSTGRES_COLUMNS + c + 1}`).join(", ")})`;
|
|
775
|
-
}).join(", ")}
|
|
1034
|
+
VALUES ${placeholders}
|
|
776
1035
|
`;
|
|
777
1036
|
await this.connection.query(query, rows.flat());
|
|
778
1037
|
};
|
|
@@ -936,9 +1195,7 @@ var DatabaseTransport = class {
|
|
|
936
1195
|
case "mysql":
|
|
937
1196
|
await this.connection.end();
|
|
938
1197
|
break;
|
|
939
|
-
case "sqlite":
|
|
940
|
-
await this.connection.close();
|
|
941
|
-
break;
|
|
1198
|
+
case "sqlite": await this.connection.close();
|
|
942
1199
|
}
|
|
943
1200
|
this.isConnected = false;
|
|
944
1201
|
}
|
|
@@ -979,9 +1236,7 @@ var DatabaseTransport = class {
|
|
|
979
1236
|
}
|
|
980
1237
|
}
|
|
981
1238
|
};
|
|
982
|
-
|
|
983
|
-
//#endregion
|
|
984
|
-
//#region src/transports/file.transport.ts
|
|
1239
|
+
// src/transports/file.transport.ts
|
|
985
1240
|
const appendFile = (0, node_util.promisify)(node_fs.appendFile);
|
|
986
1241
|
const rename = (0, node_util.promisify)(node_fs.rename);
|
|
987
1242
|
const unlink = (0, node_util.promisify)(node_fs.unlink);
|
|
@@ -1244,7 +1499,6 @@ var FileTransport = class {
|
|
|
1244
1499
|
csvField(entry.traceId),
|
|
1245
1500
|
csvField(stringifyForLog(entry.data || {}))
|
|
1246
1501
|
].join(",");
|
|
1247
|
-
case "text":
|
|
1248
1502
|
default: return `${entry.timestamp.toISOString()} [${stripControlChars(safeToString(entry.level)).toUpperCase()}] ${stripControlChars(safeToString(entry.message))}${entry.data ? " " + stringifyForLog(entry.data) : ""}`;
|
|
1249
1503
|
}
|
|
1250
1504
|
}
|
|
@@ -1270,22 +1524,22 @@ var FileTransport = class {
|
|
|
1270
1524
|
await this.append(content);
|
|
1271
1525
|
return;
|
|
1272
1526
|
}
|
|
1273
|
-
let chunk
|
|
1527
|
+
let chunk = "";
|
|
1274
1528
|
let chunkBytes = 0;
|
|
1275
1529
|
for (const entry of entries) {
|
|
1276
1530
|
const line = this.formatEntry(entry) + "\n";
|
|
1277
1531
|
const lineBytes = Buffer.byteLength(line);
|
|
1278
1532
|
const used = this.bytesWritten + chunkBytes;
|
|
1279
1533
|
if (used > 0 && used + lineBytes > this.maxBytes) {
|
|
1280
|
-
if (chunk
|
|
1281
|
-
chunk
|
|
1534
|
+
if (chunk) await this.append(chunk, chunkBytes);
|
|
1535
|
+
chunk = "";
|
|
1282
1536
|
chunkBytes = 0;
|
|
1283
1537
|
await this.rotateFile();
|
|
1284
1538
|
}
|
|
1285
|
-
chunk
|
|
1539
|
+
chunk += line;
|
|
1286
1540
|
chunkBytes += lineBytes;
|
|
1287
1541
|
}
|
|
1288
|
-
if (chunk
|
|
1542
|
+
if (chunk) await this.append(chunk, chunkBytes);
|
|
1289
1543
|
}
|
|
1290
1544
|
async append(content, bytes = Buffer.byteLength(content)) {
|
|
1291
1545
|
await appendFile(this.currentFilePath, content, { mode: this.fileMode });
|
|
@@ -1314,7 +1568,7 @@ var FileTransport = class {
|
|
|
1314
1568
|
}
|
|
1315
1569
|
parseInterval(interval) {
|
|
1316
1570
|
const match = /^(\d{1,6})([hdwmy])$/i.exec(interval.trim());
|
|
1317
|
-
if (!match) return
|
|
1571
|
+
if (!match) return 864e5;
|
|
1318
1572
|
const value = Number.parseInt(match[1] || "1", 10);
|
|
1319
1573
|
switch ((match[2] || "h").toLowerCase()) {
|
|
1320
1574
|
case "h": return value * 60 * 60 * 1e3;
|
|
@@ -1429,9 +1683,7 @@ var FileTransport = class {
|
|
|
1429
1683
|
this.reportDropped(0);
|
|
1430
1684
|
}
|
|
1431
1685
|
};
|
|
1432
|
-
|
|
1433
|
-
//#endregion
|
|
1434
|
-
//#region src/transports/worker-entry.ts
|
|
1686
|
+
// src/transports/worker-entry.ts
|
|
1435
1687
|
const port = node_worker_threads.parentPort;
|
|
1436
1688
|
if (!port) throw new Error("worker-entry must run inside a worker thread");
|
|
1437
1689
|
const { transportType, transportConfig } = node_worker_threads.workerData;
|
|
@@ -1489,5 +1741,3 @@ port.on("message", (msg) => {
|
|
|
1489
1741
|
queue = queue.then(() => handle(msg));
|
|
1490
1742
|
});
|
|
1491
1743
|
port.postMessage({ type: "ready" });
|
|
1492
|
-
|
|
1493
|
-
//#endregion
|
package/dist/worker.d.mts
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
import "./transport
|
|
2
|
-
import { n as WorkerTransportConfig, t as WorkerTransport } from "./worker.transport-JvGPog3C.mjs";
|
|
1
|
+
import { n as WorkerTransportConfig, t as WorkerTransport } from "./worker.transport-hJay1wxA.mjs";
|
|
3
2
|
export { WorkerTransport, WorkerTransportConfig };
|
package/dist/worker.d.ts
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
import "./transport
|
|
2
|
-
import { n as WorkerTransportConfig, t as WorkerTransport } from "./worker.transport-CdzSZJmw.js";
|
|
1
|
+
import { n as WorkerTransportConfig, t as WorkerTransport } from "./worker.transport-BuPwBi3d.js";
|
|
3
2
|
export { WorkerTransport, WorkerTransportConfig };
|
package/dist/worker.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
const require_worker_transport = require(
|
|
3
|
-
|
|
4
|
-
exports.WorkerTransport = require_worker_transport.WorkerTransport;
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_worker_transport = require("./worker.transport-C6GNl_r2.js");
|
|
3
|
+
exports.WorkerTransport = require_worker_transport.WorkerTransport;
|
package/dist/worker.mjs
CHANGED