@loggerjs/node 0.5.6 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -26
- package/dist/bullmq-integration.cjs +2 -145
- package/dist/bullmq-integration.cjs.map +1 -1
- package/dist/bullmq-integration.js +1 -144
- package/dist/bullmq-integration.js.map +1 -1
- package/dist/chunks/node-destination-DvP8jBvm.cjs +254 -0
- package/dist/chunks/node-destination-DvP8jBvm.cjs.map +1 -0
- package/dist/chunks/node-destination-YnpYbctz.js +243 -0
- package/dist/chunks/node-destination-YnpYbctz.js.map +1 -0
- package/dist/context.cjs +1 -1
- package/dist/context.js +1 -1
- package/dist/diagnostics-channel-integration.cjs +1 -1
- package/dist/file-transport.cjs +3 -231
- package/dist/file-transport.cjs.map +1 -1
- package/dist/file-transport.js +3 -231
- package/dist/file-transport.js.map +1 -1
- package/dist/http-transport.cjs +25 -4
- package/dist/http-transport.cjs.map +1 -1
- package/dist/http-transport.d.ts +15 -0
- package/dist/http-transport.d.ts.map +1 -1
- package/dist/http-transport.js +25 -4
- package/dist/http-transport.js.map +1 -1
- package/dist/index.cjs +54 -2355
- package/dist/index.d.ts +211 -19
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -2327
- package/dist/internal-types.d.ts +1 -0
- package/dist/internal-types.d.ts.map +1 -1
- package/dist/logger-diagnostics.cjs +4 -5
- package/dist/logger-diagnostics.cjs.map +1 -1
- package/dist/logger-diagnostics.d.ts +1 -1
- package/dist/logger-diagnostics.d.ts.map +1 -1
- package/dist/logger-diagnostics.js +1 -1
- package/dist/logger-diagnostics.js.map +1 -1
- package/dist/nest-integration.cjs +2 -127
- package/dist/nest-integration.cjs.map +1 -1
- package/dist/nest-integration.js +1 -126
- package/dist/nest-integration.js.map +1 -1
- package/dist/node-destination.d.ts.map +1 -1
- package/dist/payload-transforms.cjs +2 -2
- package/dist/payload-transforms.cjs.map +1 -1
- package/dist/payload-transforms.d.ts.map +1 -1
- package/dist/payload-transforms.js +1 -1
- package/dist/payload-transforms.js.map +1 -1
- package/dist/prisma-integration.cjs +2 -125
- package/dist/prisma-integration.cjs.map +1 -1
- package/dist/prisma-integration.js +1 -124
- package/dist/prisma-integration.js.map +1 -1
- package/dist/process-integration.cjs +20 -1
- package/dist/process-integration.cjs.map +1 -1
- package/dist/process-integration.d.ts +7 -0
- package/dist/process-integration.d.ts.map +1 -1
- package/dist/process-integration.js +20 -1
- package/dist/process-integration.js.map +1 -1
- package/dist/redis-integration.cjs +2 -125
- package/dist/redis-integration.cjs.map +1 -1
- package/dist/redis-integration.js +1 -124
- package/dist/redis-integration.js.map +1 -1
- package/dist/rotating-file-transport.cjs +24 -238
- package/dist/rotating-file-transport.cjs.map +1 -1
- package/dist/rotating-file-transport.d.ts.map +1 -1
- package/dist/rotating-file-transport.js +24 -238
- package/dist/rotating-file-transport.js.map +1 -1
- package/dist/stdout-transport.cjs +3 -162
- package/dist/stdout-transport.cjs.map +1 -1
- package/dist/stdout-transport.js +3 -162
- package/dist/stdout-transport.js.map +1 -1
- package/dist/syslog-transport.cjs +1 -1
- package/dist/syslog-transport.js +1 -1
- package/dist/worker-transport.cjs +5 -4
- package/dist/worker-transport.cjs.map +1 -1
- package/dist/worker-transport.d.ts.map +1 -1
- package/dist/worker-transport.js +3 -2
- package/dist/worker-transport.js.map +1 -1
- package/package.json +5 -2
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
package/dist/internal-types.d.ts
CHANGED
|
@@ -4,5 +4,6 @@ export interface WritableLike {
|
|
|
4
4
|
off?: (event: "error", listener: (error: Error) => void) => unknown;
|
|
5
5
|
once?: (event: "drain", listener: () => void) => unknown;
|
|
6
6
|
end?: (callback?: (error?: Error | null) => void) => unknown;
|
|
7
|
+
readonly destroyed?: boolean;
|
|
7
8
|
}
|
|
8
9
|
//# sourceMappingURL=internal-types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal-types.d.ts","sourceRoot":"","sources":["../src/internal-types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,KAAK,OAAO,CAAC;IAC1F,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,KAAK,OAAO,CAAC;IACnE,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,KAAK,OAAO,CAAC;IACpE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,OAAO,CAAC;IACzD,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,KAAK,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"internal-types.d.ts","sourceRoot":"","sources":["../src/internal-types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,KAAK,OAAO,CAAC;IAC1F,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,KAAK,OAAO,CAAC;IACnE,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,KAAK,OAAO,CAAC;IACpE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,OAAO,CAAC;IACzD,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,KAAK,OAAO,CAAC;IAC7D,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
let
|
|
3
|
-
let _loggerjs_core = require("@loggerjs/core");
|
|
2
|
+
let _loggerjs_core_diagnostics = require("@loggerjs/core/diagnostics");
|
|
4
3
|
//#region src/logger-diagnostics.ts
|
|
5
|
-
const requireBuiltin = (0,
|
|
4
|
+
const requireBuiltin = (0, require("node:module").createRequire)(require("url").pathToFileURL(__filename).href);
|
|
6
5
|
let cachedDiagnosticsChannel;
|
|
7
6
|
function loadDiagnosticsChannel() {
|
|
8
7
|
if (cachedDiagnosticsChannel !== void 0) return cachedDiagnosticsChannel;
|
|
@@ -35,9 +34,9 @@ function installLoggerDiagnosticsChannel(options = {}) {
|
|
|
35
34
|
channelFor(event.stage).publish(event);
|
|
36
35
|
};
|
|
37
36
|
sink.enabled = (stage) => channelFor(stage).hasSubscribers !== false;
|
|
38
|
-
const previous = (0,
|
|
37
|
+
const previous = (0, _loggerjs_core_diagnostics.setLoggerDiagnosticSink)(sink);
|
|
39
38
|
return () => {
|
|
40
|
-
(0,
|
|
39
|
+
(0, _loggerjs_core_diagnostics.setLoggerDiagnosticSink)(previous);
|
|
41
40
|
};
|
|
42
41
|
}
|
|
43
42
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger-diagnostics.cjs","names":[],"sources":["../src/logger-diagnostics.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport {\n setLoggerDiagnosticSink,\n type LoggerDiagnosticEvent,\n type LoggerDiagnosticSink,\n type LoggerDiagnosticStage,\n} from \"@loggerjs/core\";\n\nexport interface LoggerDiagnosticsChannelPublisher {\n hasSubscribers?: boolean;\n publish: (message: LoggerDiagnosticEvent) => void;\n}\n\nexport interface LoggerDiagnosticsChannelModule {\n channel: (name: string) => LoggerDiagnosticsChannelPublisher;\n}\n\nexport interface InstallLoggerDiagnosticsChannelOptions {\n diagnosticsChannel?: LoggerDiagnosticsChannelModule | null;\n prefix?: string;\n}\n\nconst requireBuiltin = createRequire(import.meta.url);\nlet cachedDiagnosticsChannel: LoggerDiagnosticsChannelModule | null | undefined;\n\nfunction loadDiagnosticsChannel(): LoggerDiagnosticsChannelModule | null {\n if (cachedDiagnosticsChannel !== undefined) return cachedDiagnosticsChannel;\n try {\n cachedDiagnosticsChannel = requireBuiltin(\n \"node:diagnostics_channel\",\n ) as LoggerDiagnosticsChannelModule;\n } catch {\n try {\n cachedDiagnosticsChannel = requireBuiltin(\n \"diagnostics_channel\",\n ) as LoggerDiagnosticsChannelModule;\n } catch {\n cachedDiagnosticsChannel = null;\n }\n }\n return cachedDiagnosticsChannel;\n}\n\nexport function installLoggerDiagnosticsChannel(\n options: InstallLoggerDiagnosticsChannelOptions = {},\n): () => void {\n const diagnosticsChannel =\n options.diagnosticsChannel === undefined\n ? loadDiagnosticsChannel()\n : options.diagnosticsChannel;\n if (!diagnosticsChannel) return () => {};\n\n const prefix = options.prefix ?? \"loggerjs\";\n const channels = new Map<string, LoggerDiagnosticsChannelPublisher>();\n const channelFor = (stage: LoggerDiagnosticStage) => {\n const name = `${prefix}.${stage}`;\n let channel = channels.get(name);\n if (!channel) {\n channel = diagnosticsChannel.channel(name);\n channels.set(name, channel);\n }\n return channel;\n };\n const sink: LoggerDiagnosticSink = (event) => {\n channelFor(event.stage).publish(event);\n };\n sink.enabled = (stage) => channelFor(stage).hasSubscribers !== false;\n const previous = setLoggerDiagnosticSink(sink);\n\n return () => {\n setLoggerDiagnosticSink(previous);\n };\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"logger-diagnostics.cjs","names":[],"sources":["../src/logger-diagnostics.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport {\n setLoggerDiagnosticSink,\n type LoggerDiagnosticEvent,\n type LoggerDiagnosticSink,\n type LoggerDiagnosticStage,\n} from \"@loggerjs/core/diagnostics\";\n\nexport interface LoggerDiagnosticsChannelPublisher {\n hasSubscribers?: boolean;\n publish: (message: LoggerDiagnosticEvent) => void;\n}\n\nexport interface LoggerDiagnosticsChannelModule {\n channel: (name: string) => LoggerDiagnosticsChannelPublisher;\n}\n\nexport interface InstallLoggerDiagnosticsChannelOptions {\n diagnosticsChannel?: LoggerDiagnosticsChannelModule | null;\n prefix?: string;\n}\n\nconst requireBuiltin = createRequire(import.meta.url);\nlet cachedDiagnosticsChannel: LoggerDiagnosticsChannelModule | null | undefined;\n\nfunction loadDiagnosticsChannel(): LoggerDiagnosticsChannelModule | null {\n if (cachedDiagnosticsChannel !== undefined) return cachedDiagnosticsChannel;\n try {\n cachedDiagnosticsChannel = requireBuiltin(\n \"node:diagnostics_channel\",\n ) as LoggerDiagnosticsChannelModule;\n } catch {\n try {\n cachedDiagnosticsChannel = requireBuiltin(\n \"diagnostics_channel\",\n ) as LoggerDiagnosticsChannelModule;\n } catch {\n cachedDiagnosticsChannel = null;\n }\n }\n return cachedDiagnosticsChannel;\n}\n\nexport function installLoggerDiagnosticsChannel(\n options: InstallLoggerDiagnosticsChannelOptions = {},\n): () => void {\n const diagnosticsChannel =\n options.diagnosticsChannel === undefined\n ? loadDiagnosticsChannel()\n : options.diagnosticsChannel;\n if (!diagnosticsChannel) return () => {};\n\n const prefix = options.prefix ?? \"loggerjs\";\n const channels = new Map<string, LoggerDiagnosticsChannelPublisher>();\n const channelFor = (stage: LoggerDiagnosticStage) => {\n const name = `${prefix}.${stage}`;\n let channel = channels.get(name);\n if (!channel) {\n channel = diagnosticsChannel.channel(name);\n channels.set(name, channel);\n }\n return channel;\n };\n const sink: LoggerDiagnosticSink = (event) => {\n channelFor(event.stage).publish(event);\n };\n sink.enabled = (stage) => channelFor(stage).hasSubscribers !== false;\n const previous = setLoggerDiagnosticSink(sink);\n\n return () => {\n setLoggerDiagnosticSink(previous);\n };\n}\n"],"mappings":";;;AAsBA,MAAM,kBAAA,wBAAA,CAAA,CAAA,cAAA,CAAA,QAAA,KAAA,CAAA,CAAA,cAAA,UAAA,CAAA,CAAA,IAA8C;AACpD,IAAI;AAEJ,SAAS,yBAAgE;CACvE,IAAI,6BAA6B,KAAA,GAAW,OAAO;CACnD,IAAI;EACF,2BAA2B,eACzB,0BACF;CACF,QAAQ;EACN,IAAI;GACF,2BAA2B,eACzB,qBACF;EACF,QAAQ;GACN,2BAA2B;EAC7B;CACF;CACA,OAAO;AACT;AAEA,SAAgB,gCACd,UAAkD,CAAC,GACvC;CACZ,MAAM,qBACJ,QAAQ,uBAAuB,KAAA,IAC3B,uBAAuB,IACvB,QAAQ;CACd,IAAI,CAAC,oBAAoB,aAAa,CAAC;CAEvC,MAAM,SAAS,QAAQ,UAAU;CACjC,MAAM,2BAAW,IAAI,IAA+C;CACpE,MAAM,cAAc,UAAiC;EACnD,MAAM,OAAO,GAAG,OAAO,GAAG;EAC1B,IAAI,UAAU,SAAS,IAAI,IAAI;EAC/B,IAAI,CAAC,SAAS;GACZ,UAAU,mBAAmB,QAAQ,IAAI;GACzC,SAAS,IAAI,MAAM,OAAO;EAC5B;EACA,OAAO;CACT;CACA,MAAM,QAA8B,UAAU;EAC5C,WAAW,MAAM,KAAK,CAAC,CAAC,QAAQ,KAAK;CACvC;CACA,KAAK,WAAW,UAAU,WAAW,KAAK,CAAC,CAAC,mBAAmB;CAC/D,MAAM,YAAA,GAAA,2BAAA,wBAAA,CAAmC,IAAI;CAE7C,aAAa;EACX,CAAA,GAAA,2BAAA,wBAAA,CAAwB,QAAQ;CAClC;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger-diagnostics.d.ts","sourceRoot":"","sources":["../src/logger-diagnostics.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,qBAAqB,EAG3B,MAAM,
|
|
1
|
+
{"version":3,"file":"logger-diagnostics.d.ts","sourceRoot":"","sources":["../src/logger-diagnostics.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,qBAAqB,EAG3B,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,iCAAiC;IAChD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,IAAI,CAAC;CACnD;AAED,MAAM,WAAW,8BAA8B;IAC7C,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,iCAAiC,CAAC;CAC9D;AAED,MAAM,WAAW,sCAAsC;IACrD,kBAAkB,CAAC,EAAE,8BAA8B,GAAG,IAAI,CAAC;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAuBD,wBAAgB,+BAA+B,CAC7C,OAAO,GAAE,sCAA2C,GACnD,MAAM,IAAI,CA2BZ"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire } from "node:module";
|
|
2
|
-
import { setLoggerDiagnosticSink } from "@loggerjs/core";
|
|
2
|
+
import { setLoggerDiagnosticSink } from "@loggerjs/core/diagnostics";
|
|
3
3
|
//#region src/logger-diagnostics.ts
|
|
4
4
|
const requireBuiltin = createRequire(import.meta.url);
|
|
5
5
|
let cachedDiagnosticsChannel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger-diagnostics.js","names":[],"sources":["../src/logger-diagnostics.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport {\n setLoggerDiagnosticSink,\n type LoggerDiagnosticEvent,\n type LoggerDiagnosticSink,\n type LoggerDiagnosticStage,\n} from \"@loggerjs/core\";\n\nexport interface LoggerDiagnosticsChannelPublisher {\n hasSubscribers?: boolean;\n publish: (message: LoggerDiagnosticEvent) => void;\n}\n\nexport interface LoggerDiagnosticsChannelModule {\n channel: (name: string) => LoggerDiagnosticsChannelPublisher;\n}\n\nexport interface InstallLoggerDiagnosticsChannelOptions {\n diagnosticsChannel?: LoggerDiagnosticsChannelModule | null;\n prefix?: string;\n}\n\nconst requireBuiltin = createRequire(import.meta.url);\nlet cachedDiagnosticsChannel: LoggerDiagnosticsChannelModule | null | undefined;\n\nfunction loadDiagnosticsChannel(): LoggerDiagnosticsChannelModule | null {\n if (cachedDiagnosticsChannel !== undefined) return cachedDiagnosticsChannel;\n try {\n cachedDiagnosticsChannel = requireBuiltin(\n \"node:diagnostics_channel\",\n ) as LoggerDiagnosticsChannelModule;\n } catch {\n try {\n cachedDiagnosticsChannel = requireBuiltin(\n \"diagnostics_channel\",\n ) as LoggerDiagnosticsChannelModule;\n } catch {\n cachedDiagnosticsChannel = null;\n }\n }\n return cachedDiagnosticsChannel;\n}\n\nexport function installLoggerDiagnosticsChannel(\n options: InstallLoggerDiagnosticsChannelOptions = {},\n): () => void {\n const diagnosticsChannel =\n options.diagnosticsChannel === undefined\n ? loadDiagnosticsChannel()\n : options.diagnosticsChannel;\n if (!diagnosticsChannel) return () => {};\n\n const prefix = options.prefix ?? \"loggerjs\";\n const channels = new Map<string, LoggerDiagnosticsChannelPublisher>();\n const channelFor = (stage: LoggerDiagnosticStage) => {\n const name = `${prefix}.${stage}`;\n let channel = channels.get(name);\n if (!channel) {\n channel = diagnosticsChannel.channel(name);\n channels.set(name, channel);\n }\n return channel;\n };\n const sink: LoggerDiagnosticSink = (event) => {\n channelFor(event.stage).publish(event);\n };\n sink.enabled = (stage) => channelFor(stage).hasSubscribers !== false;\n const previous = setLoggerDiagnosticSink(sink);\n\n return () => {\n setLoggerDiagnosticSink(previous);\n };\n}\n"],"mappings":";;;AAsBA,MAAM,iBAAiB,cAAc,OAAO,KAAK,GAAG;AACpD,IAAI;AAEJ,SAAS,yBAAgE;CACvE,IAAI,6BAA6B,KAAA,GAAW,OAAO;CACnD,IAAI;EACF,2BAA2B,eACzB,0BACF;CACF,QAAQ;EACN,IAAI;GACF,2BAA2B,eACzB,qBACF;EACF,QAAQ;GACN,2BAA2B;EAC7B;CACF;CACA,OAAO;AACT;AAEA,SAAgB,gCACd,UAAkD,CAAC,GACvC;CACZ,MAAM,qBACJ,QAAQ,uBAAuB,KAAA,IAC3B,uBAAuB,IACvB,QAAQ;CACd,IAAI,CAAC,oBAAoB,aAAa,CAAC;CAEvC,MAAM,SAAS,QAAQ,UAAU;CACjC,MAAM,2BAAW,IAAI,IAA+C;CACpE,MAAM,cAAc,UAAiC;EACnD,MAAM,OAAO,GAAG,OAAO,GAAG;EAC1B,IAAI,UAAU,SAAS,IAAI,IAAI;EAC/B,IAAI,CAAC,SAAS;GACZ,UAAU,mBAAmB,QAAQ,IAAI;GACzC,SAAS,IAAI,MAAM,OAAO;EAC5B;EACA,OAAO;CACT;CACA,MAAM,QAA8B,UAAU;EAC5C,WAAW,MAAM,KAAK,CAAC,CAAC,QAAQ,KAAK;CACvC;CACA,KAAK,WAAW,UAAU,WAAW,KAAK,CAAC,CAAC,mBAAmB;CAC/D,MAAM,WAAW,wBAAwB,IAAI;CAE7C,aAAa;EACX,wBAAwB,QAAQ;CAClC;AACF"}
|
|
1
|
+
{"version":3,"file":"logger-diagnostics.js","names":[],"sources":["../src/logger-diagnostics.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport {\n setLoggerDiagnosticSink,\n type LoggerDiagnosticEvent,\n type LoggerDiagnosticSink,\n type LoggerDiagnosticStage,\n} from \"@loggerjs/core/diagnostics\";\n\nexport interface LoggerDiagnosticsChannelPublisher {\n hasSubscribers?: boolean;\n publish: (message: LoggerDiagnosticEvent) => void;\n}\n\nexport interface LoggerDiagnosticsChannelModule {\n channel: (name: string) => LoggerDiagnosticsChannelPublisher;\n}\n\nexport interface InstallLoggerDiagnosticsChannelOptions {\n diagnosticsChannel?: LoggerDiagnosticsChannelModule | null;\n prefix?: string;\n}\n\nconst requireBuiltin = createRequire(import.meta.url);\nlet cachedDiagnosticsChannel: LoggerDiagnosticsChannelModule | null | undefined;\n\nfunction loadDiagnosticsChannel(): LoggerDiagnosticsChannelModule | null {\n if (cachedDiagnosticsChannel !== undefined) return cachedDiagnosticsChannel;\n try {\n cachedDiagnosticsChannel = requireBuiltin(\n \"node:diagnostics_channel\",\n ) as LoggerDiagnosticsChannelModule;\n } catch {\n try {\n cachedDiagnosticsChannel = requireBuiltin(\n \"diagnostics_channel\",\n ) as LoggerDiagnosticsChannelModule;\n } catch {\n cachedDiagnosticsChannel = null;\n }\n }\n return cachedDiagnosticsChannel;\n}\n\nexport function installLoggerDiagnosticsChannel(\n options: InstallLoggerDiagnosticsChannelOptions = {},\n): () => void {\n const diagnosticsChannel =\n options.diagnosticsChannel === undefined\n ? loadDiagnosticsChannel()\n : options.diagnosticsChannel;\n if (!diagnosticsChannel) return () => {};\n\n const prefix = options.prefix ?? \"loggerjs\";\n const channels = new Map<string, LoggerDiagnosticsChannelPublisher>();\n const channelFor = (stage: LoggerDiagnosticStage) => {\n const name = `${prefix}.${stage}`;\n let channel = channels.get(name);\n if (!channel) {\n channel = diagnosticsChannel.channel(name);\n channels.set(name, channel);\n }\n return channel;\n };\n const sink: LoggerDiagnosticSink = (event) => {\n channelFor(event.stage).publish(event);\n };\n sink.enabled = (stage) => channelFor(stage).hasSubscribers !== false;\n const previous = setLoggerDiagnosticSink(sink);\n\n return () => {\n setLoggerDiagnosticSink(previous);\n };\n}\n"],"mappings":";;;AAsBA,MAAM,iBAAiB,cAAc,OAAO,KAAK,GAAG;AACpD,IAAI;AAEJ,SAAS,yBAAgE;CACvE,IAAI,6BAA6B,KAAA,GAAW,OAAO;CACnD,IAAI;EACF,2BAA2B,eACzB,0BACF;CACF,QAAQ;EACN,IAAI;GACF,2BAA2B,eACzB,qBACF;EACF,QAAQ;GACN,2BAA2B;EAC7B;CACF;CACA,OAAO;AACT;AAEA,SAAgB,gCACd,UAAkD,CAAC,GACvC;CACZ,MAAM,qBACJ,QAAQ,uBAAuB,KAAA,IAC3B,uBAAuB,IACvB,QAAQ;CACd,IAAI,CAAC,oBAAoB,aAAa,CAAC;CAEvC,MAAM,SAAS,QAAQ,UAAU;CACjC,MAAM,2BAAW,IAAI,IAA+C;CACpE,MAAM,cAAc,UAAiC;EACnD,MAAM,OAAO,GAAG,OAAO,GAAG;EAC1B,IAAI,UAAU,SAAS,IAAI,IAAI;EAC/B,IAAI,CAAC,SAAS;GACZ,UAAU,mBAAmB,QAAQ,IAAI;GACzC,SAAS,IAAI,MAAM,OAAO;EAC5B;EACA,OAAO;CACT;CACA,MAAM,QAA8B,UAAU;EAC5C,WAAW,MAAM,KAAK,CAAC,CAAC,QAAQ,KAAK;CACvC;CACA,KAAK,WAAW,UAAU,WAAW,KAAK,CAAC,CAAC,mBAAmB;CAC/D,MAAM,WAAW,wBAAwB,IAAI;CAE7C,aAAa;EACX,wBAAwB,QAAQ;CAClC;AACF"}
|
|
@@ -1,130 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
|
|
3
|
-
//#region src/express-integration.ts
|
|
4
|
-
const defaultRandom = () => Math.random();
|
|
5
|
-
function defaultSanitizeUrl(url) {
|
|
6
|
-
const queryIndex = url.indexOf("?");
|
|
7
|
-
const hashIndex = url.indexOf("#");
|
|
8
|
-
const end = Math.min(queryIndex >= 0 ? queryIndex : url.length, hashIndex >= 0 ? hashIndex : url.length);
|
|
9
|
-
return url.slice(0, end);
|
|
10
|
-
}
|
|
11
|
-
function defaultLevel(status, _req, _res, aborted) {
|
|
12
|
-
if (aborted) return "warn";
|
|
13
|
-
if (status >= 500) return "error";
|
|
14
|
-
if (status >= 400) return "warn";
|
|
15
|
-
return "info";
|
|
16
|
-
}
|
|
17
|
-
function requestUrl(req) {
|
|
18
|
-
return req.originalUrl ?? req.url ?? req.path ?? "/";
|
|
19
|
-
}
|
|
20
|
-
function headerValue(value) {
|
|
21
|
-
if (typeof value === "number") return String(value);
|
|
22
|
-
return value;
|
|
23
|
-
}
|
|
24
|
-
function pickRequestHeaders(req, names) {
|
|
25
|
-
if (!names || names.length === 0 || !req.headers) return void 0;
|
|
26
|
-
const out = {};
|
|
27
|
-
for (const name of names) {
|
|
28
|
-
const value = req.headers[name.toLowerCase()] ?? req.headers[name];
|
|
29
|
-
if (value !== void 0) out[name.toLowerCase()] = value;
|
|
30
|
-
}
|
|
31
|
-
return Object.keys(out).length > 0 ? out : void 0;
|
|
32
|
-
}
|
|
33
|
-
function pickResponseHeaders(res, names) {
|
|
34
|
-
if (!names || names.length === 0 || !res.getHeader) return void 0;
|
|
35
|
-
const out = {};
|
|
36
|
-
for (const name of names) {
|
|
37
|
-
const value = headerValue(res.getHeader(name));
|
|
38
|
-
if (value !== void 0) out[name.toLowerCase()] = value;
|
|
39
|
-
}
|
|
40
|
-
return Object.keys(out).length > 0 ? out : void 0;
|
|
41
|
-
}
|
|
42
|
-
function defaultRoute(req) {
|
|
43
|
-
const path = req.route?.path;
|
|
44
|
-
return typeof path === "string" ? path : void 0;
|
|
45
|
-
}
|
|
46
|
-
function removeListener(res, event, listener) {
|
|
47
|
-
if (res.off) {
|
|
48
|
-
res.off(event, listener);
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
res.removeListener?.(event, listener);
|
|
52
|
-
}
|
|
53
|
-
function onResponseDone(res, event, listener) {
|
|
54
|
-
if (res.once) {
|
|
55
|
-
res.once(event, listener);
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
res.on?.(event, listener);
|
|
59
|
-
}
|
|
60
|
-
function expressIntegration(logger, options = {}) {
|
|
61
|
-
const name = options.name ?? "express";
|
|
62
|
-
const minStatus = options.minStatus ?? 400;
|
|
63
|
-
const captureAll = options.captureAll ?? options.captureSuccessful ?? false;
|
|
64
|
-
const captureAborted = options.captureAborted ?? true;
|
|
65
|
-
const sampleRate = options.sampleRate ?? 1;
|
|
66
|
-
const random = options.random ?? defaultRandom;
|
|
67
|
-
const sanitizeUrl = options.sanitizeUrl ?? defaultSanitizeUrl;
|
|
68
|
-
const levelFor = options.level ?? defaultLevel;
|
|
69
|
-
const routeFor = options.getRoute ?? defaultRoute;
|
|
70
|
-
const bindContext = options.bindContext ?? true;
|
|
71
|
-
return (req, res, next) => {
|
|
72
|
-
const started = Date.now();
|
|
73
|
-
const method = (req.method ?? "GET").toUpperCase();
|
|
74
|
-
const url = sanitizeUrl(requestUrl(req));
|
|
75
|
-
const requestId = options.getRequestId?.(req, res);
|
|
76
|
-
let completed = false;
|
|
77
|
-
const context = {
|
|
78
|
-
httpMethod: method,
|
|
79
|
-
httpUrl: url,
|
|
80
|
-
requestId,
|
|
81
|
-
...options.context?.(req, res)
|
|
82
|
-
};
|
|
83
|
-
const shouldCapture = (status, aborted) => {
|
|
84
|
-
if (aborted && captureAborted) return true;
|
|
85
|
-
if (status >= minStatus) return true;
|
|
86
|
-
if (!captureAll) return false;
|
|
87
|
-
return sampleRate >= 1 || random() < sampleRate;
|
|
88
|
-
};
|
|
89
|
-
const cleanup = () => {
|
|
90
|
-
removeListener(res, "finish", onFinish);
|
|
91
|
-
removeListener(res, "close", onClose);
|
|
92
|
-
};
|
|
93
|
-
const logRequest = (event) => {
|
|
94
|
-
if (completed) return;
|
|
95
|
-
completed = true;
|
|
96
|
-
cleanup();
|
|
97
|
-
const status = res.statusCode ?? 0;
|
|
98
|
-
const aborted = event === "close" && res.writableEnded !== true;
|
|
99
|
-
if (!shouldCapture(status, aborted)) return;
|
|
100
|
-
const http = {
|
|
101
|
-
kind: name,
|
|
102
|
-
framework: "express",
|
|
103
|
-
method,
|
|
104
|
-
url,
|
|
105
|
-
route: routeFor(req),
|
|
106
|
-
status,
|
|
107
|
-
durationMs: Date.now() - started,
|
|
108
|
-
aborted,
|
|
109
|
-
requestId,
|
|
110
|
-
remoteAddress: req.ip ?? req.socket?.remoteAddress,
|
|
111
|
-
requestHeaders: pickRequestHeaders(req, options.captureRequestHeaders),
|
|
112
|
-
responseHeaders: pickResponseHeaders(res, options.captureResponseHeaders)
|
|
113
|
-
};
|
|
114
|
-
logger.log(levelFor(status, req, res, aborted), `Express ${status} ${method} ${url}`, { http });
|
|
115
|
-
};
|
|
116
|
-
const onFinish = () => logRequest("finish");
|
|
117
|
-
const onClose = () => logRequest("close");
|
|
118
|
-
onResponseDone(res, "finish", onFinish);
|
|
119
|
-
onResponseDone(res, "close", onClose);
|
|
120
|
-
if (bindContext) {
|
|
121
|
-
(0, _loggerjs_core.withContext)(context, () => next());
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
next();
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
//#endregion
|
|
2
|
+
const require_express_integration = require("./express-integration.cjs");
|
|
128
3
|
//#region src/nest-integration.ts
|
|
129
4
|
/**
|
|
130
5
|
* Express-compatible Nest middleware adapter. It observes the same request and
|
|
@@ -132,7 +7,7 @@ function expressIntegration(logger, options = {}) {
|
|
|
132
7
|
* exception filters, interceptors, guards, or the original thrown `Error`.
|
|
133
8
|
*/
|
|
134
9
|
function nestMiddlewareIntegration(logger, options = {}) {
|
|
135
|
-
return expressIntegration(logger, {
|
|
10
|
+
return require_express_integration.expressIntegration(logger, {
|
|
136
11
|
name: "nestjs",
|
|
137
12
|
...options
|
|
138
13
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nest-integration.cjs","names":[],"sources":["../src/express-integration.ts","../src/nest-integration.ts"],"sourcesContent":["import { withContext, type LoggerLevel, type LoggerLike, type LogData } from \"@loggerjs/core\";\n\nexport interface ExpressRequestLike {\n method?: string;\n originalUrl?: string;\n url?: string;\n path?: string;\n headers?: Record<string, string | string[] | undefined>;\n ip?: string;\n route?: { path?: string };\n socket?: { remoteAddress?: string };\n [key: string]: unknown;\n}\n\nexport interface ExpressResponseLike {\n statusCode?: number;\n writableEnded?: boolean;\n headersSent?: boolean;\n getHeader?: (name: string) => number | string | string[] | undefined;\n once?: (event: \"finish\" | \"close\", listener: () => void) => unknown;\n on?: (event: \"finish\" | \"close\", listener: () => void) => unknown;\n off?: (event: \"finish\" | \"close\", listener: () => void) => unknown;\n removeListener?: (event: \"finish\" | \"close\", listener: () => void) => unknown;\n}\n\nexport type ExpressNextFunction = (error?: unknown) => void;\nexport type ExpressRequestHandler = (\n req: ExpressRequestLike,\n res: ExpressResponseLike,\n next: ExpressNextFunction,\n) => void;\n\nexport interface ExpressIntegrationOptions {\n name?: string;\n minStatus?: number;\n captureAll?: boolean;\n captureSuccessful?: boolean;\n captureAborted?: boolean;\n sampleRate?: number;\n random?: () => number;\n bindContext?: boolean;\n captureRequestHeaders?: readonly string[];\n captureResponseHeaders?: readonly string[];\n sanitizeUrl?: (url: string) => string;\n getRequestId?: (req: ExpressRequestLike, res: ExpressResponseLike) => string | undefined;\n getRoute?: (req: ExpressRequestLike) => string | undefined;\n context?: (\n req: ExpressRequestLike,\n res: ExpressResponseLike,\n ) => Record<string, unknown> | undefined;\n level?: (\n status: number,\n req: ExpressRequestLike,\n res: ExpressResponseLike,\n aborted: boolean,\n ) => LoggerLevel;\n}\n\nconst defaultRandom = () => Math.random();\n\nfunction defaultSanitizeUrl(url: string): string {\n const queryIndex = url.indexOf(\"?\");\n const hashIndex = url.indexOf(\"#\");\n const end = Math.min(\n queryIndex >= 0 ? queryIndex : url.length,\n hashIndex >= 0 ? hashIndex : url.length,\n );\n return url.slice(0, end);\n}\n\nfunction defaultLevel(\n status: number,\n _req: ExpressRequestLike,\n _res: ExpressResponseLike,\n aborted: boolean,\n): LoggerLevel {\n if (aborted) return \"warn\";\n if (status >= 500) return \"error\";\n if (status >= 400) return \"warn\";\n return \"info\";\n}\n\nfunction requestUrl(req: ExpressRequestLike): string {\n return req.originalUrl ?? req.url ?? req.path ?? \"/\";\n}\n\nfunction headerValue(value: number | string | string[] | undefined): string | string[] | undefined {\n if (typeof value === \"number\") return String(value);\n return value;\n}\n\nfunction pickRequestHeaders(\n req: ExpressRequestLike,\n names: readonly string[] | undefined,\n): Record<string, string | string[]> | undefined {\n if (!names || names.length === 0 || !req.headers) return undefined;\n const out: Record<string, string | string[]> = {};\n for (const name of names) {\n const value = req.headers[name.toLowerCase()] ?? req.headers[name];\n if (value !== undefined) out[name.toLowerCase()] = value;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction pickResponseHeaders(\n res: ExpressResponseLike,\n names: readonly string[] | undefined,\n): Record<string, string | string[]> | undefined {\n if (!names || names.length === 0 || !res.getHeader) return undefined;\n const out: Record<string, string | string[]> = {};\n for (const name of names) {\n const value = headerValue(res.getHeader(name));\n if (value !== undefined) out[name.toLowerCase()] = value;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction defaultRoute(req: ExpressRequestLike): string | undefined {\n const path = req.route?.path;\n return typeof path === \"string\" ? path : undefined;\n}\n\nfunction removeListener(res: ExpressResponseLike, event: \"finish\" | \"close\", listener: () => void) {\n if (res.off) {\n res.off(event, listener);\n return;\n }\n res.removeListener?.(event, listener);\n}\n\nfunction onResponseDone(res: ExpressResponseLike, event: \"finish\" | \"close\", listener: () => void) {\n if (res.once) {\n res.once(event, listener);\n return;\n }\n res.on?.(event, listener);\n}\n\nexport function expressIntegration(\n logger: LoggerLike,\n options: ExpressIntegrationOptions = {},\n): ExpressRequestHandler {\n const name = options.name ?? \"express\";\n const minStatus = options.minStatus ?? 400;\n const captureAll = options.captureAll ?? options.captureSuccessful ?? false;\n const captureAborted = options.captureAborted ?? true;\n const sampleRate = options.sampleRate ?? 1;\n const random = options.random ?? defaultRandom;\n const sanitizeUrl = options.sanitizeUrl ?? defaultSanitizeUrl;\n const levelFor = options.level ?? defaultLevel;\n const routeFor = options.getRoute ?? defaultRoute;\n const bindContext = options.bindContext ?? true;\n\n return (req, res, next) => {\n const started = Date.now();\n const method = (req.method ?? \"GET\").toUpperCase();\n const url = sanitizeUrl(requestUrl(req));\n const requestId = options.getRequestId?.(req, res);\n let completed = false;\n\n const context = {\n httpMethod: method,\n httpUrl: url,\n requestId,\n ...options.context?.(req, res),\n };\n\n const shouldCapture = (status: number, aborted: boolean) => {\n if (aborted && captureAborted) return true;\n if (status >= minStatus) return true;\n if (!captureAll) return false;\n return sampleRate >= 1 || random() < sampleRate;\n };\n\n const cleanup = () => {\n removeListener(res, \"finish\", onFinish);\n removeListener(res, \"close\", onClose);\n };\n\n const logRequest = (event: \"finish\" | \"close\") => {\n if (completed) return;\n completed = true;\n cleanup();\n const status = res.statusCode ?? 0;\n const aborted = event === \"close\" && res.writableEnded !== true;\n if (!shouldCapture(status, aborted)) return;\n const http: Record<string, unknown> = {\n kind: name,\n framework: \"express\",\n method,\n url,\n route: routeFor(req),\n status,\n durationMs: Date.now() - started,\n aborted,\n requestId,\n remoteAddress: req.ip ?? req.socket?.remoteAddress,\n requestHeaders: pickRequestHeaders(req, options.captureRequestHeaders),\n responseHeaders: pickResponseHeaders(res, options.captureResponseHeaders),\n };\n logger.log(levelFor(status, req, res, aborted), `Express ${status} ${method} ${url}`, {\n http,\n } as LogData);\n };\n\n const onFinish = () => logRequest(\"finish\");\n const onClose = () => logRequest(\"close\");\n onResponseDone(res, \"finish\", onFinish);\n onResponseDone(res, \"close\", onClose);\n\n if (bindContext) {\n withContext(context, () => next());\n return;\n }\n next();\n };\n}\n","import type { LoggerLike } from \"@loggerjs/core\";\nimport {\n expressIntegration,\n type ExpressIntegrationOptions,\n type ExpressRequestHandler,\n} from \"./express-integration\";\n\nexport type NestMiddleware = ExpressRequestHandler;\n\n/**\n * Express-compatible Nest middleware adapter. It observes the same request and\n * response completion surface as `expressIntegration`; it does not hook Nest\n * exception filters, interceptors, guards, or the original thrown `Error`.\n */\nexport function nestMiddlewareIntegration(\n logger: LoggerLike,\n options: ExpressIntegrationOptions = {},\n): NestMiddleware {\n return expressIntegration(logger, {\n name: \"nestjs\",\n ...options,\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"nest-integration.cjs","names":["expressIntegration"],"sources":["../src/nest-integration.ts"],"sourcesContent":["import type { LoggerLike } from \"@loggerjs/core\";\nimport {\n expressIntegration,\n type ExpressIntegrationOptions,\n type ExpressRequestHandler,\n} from \"./express-integration\";\n\nexport type NestMiddleware = ExpressRequestHandler;\n\n/**\n * Express-compatible Nest middleware adapter. It observes the same request and\n * response completion surface as `expressIntegration`; it does not hook Nest\n * exception filters, interceptors, guards, or the original thrown `Error`.\n */\nexport function nestMiddlewareIntegration(\n logger: LoggerLike,\n options: ExpressIntegrationOptions = {},\n): NestMiddleware {\n return expressIntegration(logger, {\n name: \"nestjs\",\n ...options,\n });\n}\n"],"mappings":";;;;;;;;AAcA,SAAgB,0BACd,QACA,UAAqC,CAAC,GACtB;CAChB,OAAOA,4BAAAA,mBAAmB,QAAQ;EAChC,MAAM;EACN,GAAG;CACL,CAAC;AACH"}
|
package/dist/nest-integration.js
CHANGED
|
@@ -1,129 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
//#region src/express-integration.ts
|
|
3
|
-
const defaultRandom = () => Math.random();
|
|
4
|
-
function defaultSanitizeUrl(url) {
|
|
5
|
-
const queryIndex = url.indexOf("?");
|
|
6
|
-
const hashIndex = url.indexOf("#");
|
|
7
|
-
const end = Math.min(queryIndex >= 0 ? queryIndex : url.length, hashIndex >= 0 ? hashIndex : url.length);
|
|
8
|
-
return url.slice(0, end);
|
|
9
|
-
}
|
|
10
|
-
function defaultLevel(status, _req, _res, aborted) {
|
|
11
|
-
if (aborted) return "warn";
|
|
12
|
-
if (status >= 500) return "error";
|
|
13
|
-
if (status >= 400) return "warn";
|
|
14
|
-
return "info";
|
|
15
|
-
}
|
|
16
|
-
function requestUrl(req) {
|
|
17
|
-
return req.originalUrl ?? req.url ?? req.path ?? "/";
|
|
18
|
-
}
|
|
19
|
-
function headerValue(value) {
|
|
20
|
-
if (typeof value === "number") return String(value);
|
|
21
|
-
return value;
|
|
22
|
-
}
|
|
23
|
-
function pickRequestHeaders(req, names) {
|
|
24
|
-
if (!names || names.length === 0 || !req.headers) return void 0;
|
|
25
|
-
const out = {};
|
|
26
|
-
for (const name of names) {
|
|
27
|
-
const value = req.headers[name.toLowerCase()] ?? req.headers[name];
|
|
28
|
-
if (value !== void 0) out[name.toLowerCase()] = value;
|
|
29
|
-
}
|
|
30
|
-
return Object.keys(out).length > 0 ? out : void 0;
|
|
31
|
-
}
|
|
32
|
-
function pickResponseHeaders(res, names) {
|
|
33
|
-
if (!names || names.length === 0 || !res.getHeader) return void 0;
|
|
34
|
-
const out = {};
|
|
35
|
-
for (const name of names) {
|
|
36
|
-
const value = headerValue(res.getHeader(name));
|
|
37
|
-
if (value !== void 0) out[name.toLowerCase()] = value;
|
|
38
|
-
}
|
|
39
|
-
return Object.keys(out).length > 0 ? out : void 0;
|
|
40
|
-
}
|
|
41
|
-
function defaultRoute(req) {
|
|
42
|
-
const path = req.route?.path;
|
|
43
|
-
return typeof path === "string" ? path : void 0;
|
|
44
|
-
}
|
|
45
|
-
function removeListener(res, event, listener) {
|
|
46
|
-
if (res.off) {
|
|
47
|
-
res.off(event, listener);
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
res.removeListener?.(event, listener);
|
|
51
|
-
}
|
|
52
|
-
function onResponseDone(res, event, listener) {
|
|
53
|
-
if (res.once) {
|
|
54
|
-
res.once(event, listener);
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
res.on?.(event, listener);
|
|
58
|
-
}
|
|
59
|
-
function expressIntegration(logger, options = {}) {
|
|
60
|
-
const name = options.name ?? "express";
|
|
61
|
-
const minStatus = options.minStatus ?? 400;
|
|
62
|
-
const captureAll = options.captureAll ?? options.captureSuccessful ?? false;
|
|
63
|
-
const captureAborted = options.captureAborted ?? true;
|
|
64
|
-
const sampleRate = options.sampleRate ?? 1;
|
|
65
|
-
const random = options.random ?? defaultRandom;
|
|
66
|
-
const sanitizeUrl = options.sanitizeUrl ?? defaultSanitizeUrl;
|
|
67
|
-
const levelFor = options.level ?? defaultLevel;
|
|
68
|
-
const routeFor = options.getRoute ?? defaultRoute;
|
|
69
|
-
const bindContext = options.bindContext ?? true;
|
|
70
|
-
return (req, res, next) => {
|
|
71
|
-
const started = Date.now();
|
|
72
|
-
const method = (req.method ?? "GET").toUpperCase();
|
|
73
|
-
const url = sanitizeUrl(requestUrl(req));
|
|
74
|
-
const requestId = options.getRequestId?.(req, res);
|
|
75
|
-
let completed = false;
|
|
76
|
-
const context = {
|
|
77
|
-
httpMethod: method,
|
|
78
|
-
httpUrl: url,
|
|
79
|
-
requestId,
|
|
80
|
-
...options.context?.(req, res)
|
|
81
|
-
};
|
|
82
|
-
const shouldCapture = (status, aborted) => {
|
|
83
|
-
if (aborted && captureAborted) return true;
|
|
84
|
-
if (status >= minStatus) return true;
|
|
85
|
-
if (!captureAll) return false;
|
|
86
|
-
return sampleRate >= 1 || random() < sampleRate;
|
|
87
|
-
};
|
|
88
|
-
const cleanup = () => {
|
|
89
|
-
removeListener(res, "finish", onFinish);
|
|
90
|
-
removeListener(res, "close", onClose);
|
|
91
|
-
};
|
|
92
|
-
const logRequest = (event) => {
|
|
93
|
-
if (completed) return;
|
|
94
|
-
completed = true;
|
|
95
|
-
cleanup();
|
|
96
|
-
const status = res.statusCode ?? 0;
|
|
97
|
-
const aborted = event === "close" && res.writableEnded !== true;
|
|
98
|
-
if (!shouldCapture(status, aborted)) return;
|
|
99
|
-
const http = {
|
|
100
|
-
kind: name,
|
|
101
|
-
framework: "express",
|
|
102
|
-
method,
|
|
103
|
-
url,
|
|
104
|
-
route: routeFor(req),
|
|
105
|
-
status,
|
|
106
|
-
durationMs: Date.now() - started,
|
|
107
|
-
aborted,
|
|
108
|
-
requestId,
|
|
109
|
-
remoteAddress: req.ip ?? req.socket?.remoteAddress,
|
|
110
|
-
requestHeaders: pickRequestHeaders(req, options.captureRequestHeaders),
|
|
111
|
-
responseHeaders: pickResponseHeaders(res, options.captureResponseHeaders)
|
|
112
|
-
};
|
|
113
|
-
logger.log(levelFor(status, req, res, aborted), `Express ${status} ${method} ${url}`, { http });
|
|
114
|
-
};
|
|
115
|
-
const onFinish = () => logRequest("finish");
|
|
116
|
-
const onClose = () => logRequest("close");
|
|
117
|
-
onResponseDone(res, "finish", onFinish);
|
|
118
|
-
onResponseDone(res, "close", onClose);
|
|
119
|
-
if (bindContext) {
|
|
120
|
-
withContext(context, () => next());
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
next();
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
//#endregion
|
|
1
|
+
import { expressIntegration } from "./express-integration.js";
|
|
127
2
|
//#region src/nest-integration.ts
|
|
128
3
|
/**
|
|
129
4
|
* Express-compatible Nest middleware adapter. It observes the same request and
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nest-integration.js","names":[],"sources":["../src/express-integration.ts","../src/nest-integration.ts"],"sourcesContent":["import { withContext, type LoggerLevel, type LoggerLike, type LogData } from \"@loggerjs/core\";\n\nexport interface ExpressRequestLike {\n method?: string;\n originalUrl?: string;\n url?: string;\n path?: string;\n headers?: Record<string, string | string[] | undefined>;\n ip?: string;\n route?: { path?: string };\n socket?: { remoteAddress?: string };\n [key: string]: unknown;\n}\n\nexport interface ExpressResponseLike {\n statusCode?: number;\n writableEnded?: boolean;\n headersSent?: boolean;\n getHeader?: (name: string) => number | string | string[] | undefined;\n once?: (event: \"finish\" | \"close\", listener: () => void) => unknown;\n on?: (event: \"finish\" | \"close\", listener: () => void) => unknown;\n off?: (event: \"finish\" | \"close\", listener: () => void) => unknown;\n removeListener?: (event: \"finish\" | \"close\", listener: () => void) => unknown;\n}\n\nexport type ExpressNextFunction = (error?: unknown) => void;\nexport type ExpressRequestHandler = (\n req: ExpressRequestLike,\n res: ExpressResponseLike,\n next: ExpressNextFunction,\n) => void;\n\nexport interface ExpressIntegrationOptions {\n name?: string;\n minStatus?: number;\n captureAll?: boolean;\n captureSuccessful?: boolean;\n captureAborted?: boolean;\n sampleRate?: number;\n random?: () => number;\n bindContext?: boolean;\n captureRequestHeaders?: readonly string[];\n captureResponseHeaders?: readonly string[];\n sanitizeUrl?: (url: string) => string;\n getRequestId?: (req: ExpressRequestLike, res: ExpressResponseLike) => string | undefined;\n getRoute?: (req: ExpressRequestLike) => string | undefined;\n context?: (\n req: ExpressRequestLike,\n res: ExpressResponseLike,\n ) => Record<string, unknown> | undefined;\n level?: (\n status: number,\n req: ExpressRequestLike,\n res: ExpressResponseLike,\n aborted: boolean,\n ) => LoggerLevel;\n}\n\nconst defaultRandom = () => Math.random();\n\nfunction defaultSanitizeUrl(url: string): string {\n const queryIndex = url.indexOf(\"?\");\n const hashIndex = url.indexOf(\"#\");\n const end = Math.min(\n queryIndex >= 0 ? queryIndex : url.length,\n hashIndex >= 0 ? hashIndex : url.length,\n );\n return url.slice(0, end);\n}\n\nfunction defaultLevel(\n status: number,\n _req: ExpressRequestLike,\n _res: ExpressResponseLike,\n aborted: boolean,\n): LoggerLevel {\n if (aborted) return \"warn\";\n if (status >= 500) return \"error\";\n if (status >= 400) return \"warn\";\n return \"info\";\n}\n\nfunction requestUrl(req: ExpressRequestLike): string {\n return req.originalUrl ?? req.url ?? req.path ?? \"/\";\n}\n\nfunction headerValue(value: number | string | string[] | undefined): string | string[] | undefined {\n if (typeof value === \"number\") return String(value);\n return value;\n}\n\nfunction pickRequestHeaders(\n req: ExpressRequestLike,\n names: readonly string[] | undefined,\n): Record<string, string | string[]> | undefined {\n if (!names || names.length === 0 || !req.headers) return undefined;\n const out: Record<string, string | string[]> = {};\n for (const name of names) {\n const value = req.headers[name.toLowerCase()] ?? req.headers[name];\n if (value !== undefined) out[name.toLowerCase()] = value;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction pickResponseHeaders(\n res: ExpressResponseLike,\n names: readonly string[] | undefined,\n): Record<string, string | string[]> | undefined {\n if (!names || names.length === 0 || !res.getHeader) return undefined;\n const out: Record<string, string | string[]> = {};\n for (const name of names) {\n const value = headerValue(res.getHeader(name));\n if (value !== undefined) out[name.toLowerCase()] = value;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction defaultRoute(req: ExpressRequestLike): string | undefined {\n const path = req.route?.path;\n return typeof path === \"string\" ? path : undefined;\n}\n\nfunction removeListener(res: ExpressResponseLike, event: \"finish\" | \"close\", listener: () => void) {\n if (res.off) {\n res.off(event, listener);\n return;\n }\n res.removeListener?.(event, listener);\n}\n\nfunction onResponseDone(res: ExpressResponseLike, event: \"finish\" | \"close\", listener: () => void) {\n if (res.once) {\n res.once(event, listener);\n return;\n }\n res.on?.(event, listener);\n}\n\nexport function expressIntegration(\n logger: LoggerLike,\n options: ExpressIntegrationOptions = {},\n): ExpressRequestHandler {\n const name = options.name ?? \"express\";\n const minStatus = options.minStatus ?? 400;\n const captureAll = options.captureAll ?? options.captureSuccessful ?? false;\n const captureAborted = options.captureAborted ?? true;\n const sampleRate = options.sampleRate ?? 1;\n const random = options.random ?? defaultRandom;\n const sanitizeUrl = options.sanitizeUrl ?? defaultSanitizeUrl;\n const levelFor = options.level ?? defaultLevel;\n const routeFor = options.getRoute ?? defaultRoute;\n const bindContext = options.bindContext ?? true;\n\n return (req, res, next) => {\n const started = Date.now();\n const method = (req.method ?? \"GET\").toUpperCase();\n const url = sanitizeUrl(requestUrl(req));\n const requestId = options.getRequestId?.(req, res);\n let completed = false;\n\n const context = {\n httpMethod: method,\n httpUrl: url,\n requestId,\n ...options.context?.(req, res),\n };\n\n const shouldCapture = (status: number, aborted: boolean) => {\n if (aborted && captureAborted) return true;\n if (status >= minStatus) return true;\n if (!captureAll) return false;\n return sampleRate >= 1 || random() < sampleRate;\n };\n\n const cleanup = () => {\n removeListener(res, \"finish\", onFinish);\n removeListener(res, \"close\", onClose);\n };\n\n const logRequest = (event: \"finish\" | \"close\") => {\n if (completed) return;\n completed = true;\n cleanup();\n const status = res.statusCode ?? 0;\n const aborted = event === \"close\" && res.writableEnded !== true;\n if (!shouldCapture(status, aborted)) return;\n const http: Record<string, unknown> = {\n kind: name,\n framework: \"express\",\n method,\n url,\n route: routeFor(req),\n status,\n durationMs: Date.now() - started,\n aborted,\n requestId,\n remoteAddress: req.ip ?? req.socket?.remoteAddress,\n requestHeaders: pickRequestHeaders(req, options.captureRequestHeaders),\n responseHeaders: pickResponseHeaders(res, options.captureResponseHeaders),\n };\n logger.log(levelFor(status, req, res, aborted), `Express ${status} ${method} ${url}`, {\n http,\n } as LogData);\n };\n\n const onFinish = () => logRequest(\"finish\");\n const onClose = () => logRequest(\"close\");\n onResponseDone(res, \"finish\", onFinish);\n onResponseDone(res, \"close\", onClose);\n\n if (bindContext) {\n withContext(context, () => next());\n return;\n }\n next();\n };\n}\n","import type { LoggerLike } from \"@loggerjs/core\";\nimport {\n expressIntegration,\n type ExpressIntegrationOptions,\n type ExpressRequestHandler,\n} from \"./express-integration\";\n\nexport type NestMiddleware = ExpressRequestHandler;\n\n/**\n * Express-compatible Nest middleware adapter. It observes the same request and\n * response completion surface as `expressIntegration`; it does not hook Nest\n * exception filters, interceptors, guards, or the original thrown `Error`.\n */\nexport function nestMiddlewareIntegration(\n logger: LoggerLike,\n options: ExpressIntegrationOptions = {},\n): NestMiddleware {\n return expressIntegration(logger, {\n name: \"nestjs\",\n ...options,\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"nest-integration.js","names":[],"sources":["../src/nest-integration.ts"],"sourcesContent":["import type { LoggerLike } from \"@loggerjs/core\";\nimport {\n expressIntegration,\n type ExpressIntegrationOptions,\n type ExpressRequestHandler,\n} from \"./express-integration\";\n\nexport type NestMiddleware = ExpressRequestHandler;\n\n/**\n * Express-compatible Nest middleware adapter. It observes the same request and\n * response completion surface as `expressIntegration`; it does not hook Nest\n * exception filters, interceptors, guards, or the original thrown `Error`.\n */\nexport function nestMiddlewareIntegration(\n logger: LoggerLike,\n options: ExpressIntegrationOptions = {},\n): NestMiddleware {\n return expressIntegration(logger, {\n name: \"nestjs\",\n ...options,\n });\n}\n"],"mappings":";;;;;;;AAcA,SAAgB,0BACd,QACA,UAAqC,CAAC,GACtB;CAChB,OAAO,mBAAmB,QAAQ;EAChC,MAAM;EACN,GAAG;CACL,CAAC;AACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-destination.d.ts","sourceRoot":"","sources":["../src/node-destination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgE,KAAK,WAAW,EAAE,MAAM,IAAI,CAAC;AAEpG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,OAAO,CAAC,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC1E,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,KAAK,IAAI,CAAC;CACpD;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAqCD,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,4BAA4B,GACpC,eAAe,
|
|
1
|
+
{"version":3,"file":"node-destination.d.ts","sourceRoot":"","sources":["../src/node-destination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgE,KAAK,WAAW,EAAE,MAAM,IAAI,CAAC;AAEpG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,OAAO,CAAC,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC1E,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,KAAK,IAAI,CAAC;CACpD;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAqCD,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,4BAA4B,GACpC,eAAe,CAkKjB;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,0BAA0B,GAAG,eAAe,CAoF9F"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
let _loggerjs_core_payload_transforms = require("@loggerjs/core/payload-transforms");
|
|
2
3
|
let node_zlib = require("node:zlib");
|
|
3
|
-
let _loggerjs_core = require("@loggerjs/core");
|
|
4
4
|
//#region src/payload-transforms.ts
|
|
5
5
|
const contentEncodingByFormat = {
|
|
6
6
|
gzip: "gzip",
|
|
@@ -8,7 +8,7 @@ const contentEncodingByFormat = {
|
|
|
8
8
|
deflate: "deflate"
|
|
9
9
|
};
|
|
10
10
|
function compressPayload(payload, format, options) {
|
|
11
|
-
const input = (0,
|
|
11
|
+
const input = (0, _loggerjs_core_payload_transforms.encodedPayloadToUint8Array)(payload);
|
|
12
12
|
if (format === "brotli") return Uint8Array.from((0, node_zlib.brotliCompressSync)(input, options.brotliOptions));
|
|
13
13
|
if (format === "deflate") return Uint8Array.from((0, node_zlib.deflateSync)(input, options.deflateOptions));
|
|
14
14
|
return Uint8Array.from((0, node_zlib.gzipSync)(input, options.gzipOptions));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payload-transforms.cjs","names":[],"sources":["../src/payload-transforms.ts"],"sourcesContent":["import {\n brotliCompressSync,\n deflateSync,\n gzipSync,\n type BrotliOptions,\n type ZlibOptions,\n} from \"node:zlib\";\nimport {
|
|
1
|
+
{"version":3,"file":"payload-transforms.cjs","names":[],"sources":["../src/payload-transforms.ts"],"sourcesContent":["import {\n brotliCompressSync,\n deflateSync,\n gzipSync,\n type BrotliOptions,\n type ZlibOptions,\n} from \"node:zlib\";\nimport { type EncodedPayload, type PayloadTransform } from \"@loggerjs/core\";\nimport { encodedPayloadToUint8Array } from \"@loggerjs/core/payload-transforms\";\n\nexport type NodeCompressionFormat = \"gzip\" | \"brotli\" | \"deflate\";\n\nexport interface NodeCompressionPayloadTransformOptions {\n format?: NodeCompressionFormat;\n gzipOptions?: ZlibOptions;\n brotliOptions?: BrotliOptions;\n deflateOptions?: ZlibOptions;\n headers?: Record<string, string>;\n}\n\nconst contentEncodingByFormat: Record<NodeCompressionFormat, string> = {\n gzip: \"gzip\",\n brotli: \"br\",\n deflate: \"deflate\",\n};\n\nfunction compressPayload(\n payload: EncodedPayload,\n format: NodeCompressionFormat,\n options: NodeCompressionPayloadTransformOptions,\n): Uint8Array {\n const input = encodedPayloadToUint8Array(payload);\n if (format === \"brotli\") return Uint8Array.from(brotliCompressSync(input, options.brotliOptions));\n if (format === \"deflate\") return Uint8Array.from(deflateSync(input, options.deflateOptions));\n return Uint8Array.from(gzipSync(input, options.gzipOptions));\n}\n\nexport function nodeCompressionPayloadTransform(\n options: NodeCompressionPayloadTransformOptions = {},\n): PayloadTransform {\n const format = options.format ?? \"gzip\";\n return (payload) => ({\n payload: compressPayload(payload, format, options),\n headers: {\n \"content-encoding\": contentEncodingByFormat[format],\n ...options.headers,\n },\n });\n}\n"],"mappings":";;;;AAoBA,MAAM,0BAAiE;CACrE,MAAM;CACN,QAAQ;CACR,SAAS;AACX;AAEA,SAAS,gBACP,SACA,QACA,SACY;CACZ,MAAM,SAAA,GAAA,kCAAA,2BAAA,CAAmC,OAAO;CAChD,IAAI,WAAW,UAAU,OAAO,WAAW,MAAA,GAAA,UAAA,mBAAA,CAAwB,OAAO,QAAQ,aAAa,CAAC;CAChG,IAAI,WAAW,WAAW,OAAO,WAAW,MAAA,GAAA,UAAA,YAAA,CAAiB,OAAO,QAAQ,cAAc,CAAC;CAC3F,OAAO,WAAW,MAAA,GAAA,UAAA,SAAA,CAAc,OAAO,QAAQ,WAAW,CAAC;AAC7D;AAEA,SAAgB,gCACd,UAAkD,CAAC,GACjC;CAClB,MAAM,SAAS,QAAQ,UAAU;CACjC,QAAQ,aAAa;EACnB,SAAS,gBAAgB,SAAS,QAAQ,OAAO;EACjD,SAAS;GACP,oBAAoB,wBAAwB;GAC5C,GAAG,QAAQ;EACb;CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payload-transforms.d.ts","sourceRoot":"","sources":["../src/payload-transforms.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,WAAW,EACjB,MAAM,WAAW,CAAC;AACnB,OAAO,
|
|
1
|
+
{"version":3,"file":"payload-transforms.d.ts","sourceRoot":"","sources":["../src/payload-transforms.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,WAAW,EACjB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAG5E,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAElE,MAAM,WAAW,sCAAsC;IACrD,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,cAAc,CAAC,EAAE,WAAW,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAmBD,wBAAgB,+BAA+B,CAC7C,OAAO,GAAE,sCAA2C,GACnD,gBAAgB,CASlB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { encodedPayloadToUint8Array } from "@loggerjs/core/payload-transforms";
|
|
1
2
|
import { brotliCompressSync, deflateSync, gzipSync } from "node:zlib";
|
|
2
|
-
import { encodedPayloadToUint8Array } from "@loggerjs/core";
|
|
3
3
|
//#region src/payload-transforms.ts
|
|
4
4
|
const contentEncodingByFormat = {
|
|
5
5
|
gzip: "gzip",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payload-transforms.js","names":[],"sources":["../src/payload-transforms.ts"],"sourcesContent":["import {\n brotliCompressSync,\n deflateSync,\n gzipSync,\n type BrotliOptions,\n type ZlibOptions,\n} from \"node:zlib\";\nimport {
|
|
1
|
+
{"version":3,"file":"payload-transforms.js","names":[],"sources":["../src/payload-transforms.ts"],"sourcesContent":["import {\n brotliCompressSync,\n deflateSync,\n gzipSync,\n type BrotliOptions,\n type ZlibOptions,\n} from \"node:zlib\";\nimport { type EncodedPayload, type PayloadTransform } from \"@loggerjs/core\";\nimport { encodedPayloadToUint8Array } from \"@loggerjs/core/payload-transforms\";\n\nexport type NodeCompressionFormat = \"gzip\" | \"brotli\" | \"deflate\";\n\nexport interface NodeCompressionPayloadTransformOptions {\n format?: NodeCompressionFormat;\n gzipOptions?: ZlibOptions;\n brotliOptions?: BrotliOptions;\n deflateOptions?: ZlibOptions;\n headers?: Record<string, string>;\n}\n\nconst contentEncodingByFormat: Record<NodeCompressionFormat, string> = {\n gzip: \"gzip\",\n brotli: \"br\",\n deflate: \"deflate\",\n};\n\nfunction compressPayload(\n payload: EncodedPayload,\n format: NodeCompressionFormat,\n options: NodeCompressionPayloadTransformOptions,\n): Uint8Array {\n const input = encodedPayloadToUint8Array(payload);\n if (format === \"brotli\") return Uint8Array.from(brotliCompressSync(input, options.brotliOptions));\n if (format === \"deflate\") return Uint8Array.from(deflateSync(input, options.deflateOptions));\n return Uint8Array.from(gzipSync(input, options.gzipOptions));\n}\n\nexport function nodeCompressionPayloadTransform(\n options: NodeCompressionPayloadTransformOptions = {},\n): PayloadTransform {\n const format = options.format ?? \"gzip\";\n return (payload) => ({\n payload: compressPayload(payload, format, options),\n headers: {\n \"content-encoding\": contentEncodingByFormat[format],\n ...options.headers,\n },\n });\n}\n"],"mappings":";;;AAoBA,MAAM,0BAAiE;CACrE,MAAM;CACN,QAAQ;CACR,SAAS;AACX;AAEA,SAAS,gBACP,SACA,QACA,SACY;CACZ,MAAM,QAAQ,2BAA2B,OAAO;CAChD,IAAI,WAAW,UAAU,OAAO,WAAW,KAAK,mBAAmB,OAAO,QAAQ,aAAa,CAAC;CAChG,IAAI,WAAW,WAAW,OAAO,WAAW,KAAK,YAAY,OAAO,QAAQ,cAAc,CAAC;CAC3F,OAAO,WAAW,KAAK,SAAS,OAAO,QAAQ,WAAW,CAAC;AAC7D;AAEA,SAAgB,gCACd,UAAkD,CAAC,GACjC;CAClB,MAAM,SAAS,QAAQ,UAAU;CACjC,QAAQ,aAAa;EACnB,SAAS,gBAAgB,SAAS,QAAQ,OAAO;EACjD,SAAS;GACP,oBAAoB,wBAAwB;GAC5C,GAAG,QAAQ;EACb;CACF;AACF"}
|
|
@@ -1,128 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
|
|
3
|
-
//#region src/database-integration.ts
|
|
4
|
-
const defaultMethods = [
|
|
5
|
-
"query",
|
|
6
|
-
"execute",
|
|
7
|
-
"run",
|
|
8
|
-
"all",
|
|
9
|
-
"get"
|
|
10
|
-
];
|
|
11
|
-
const defaultRandom = () => Math.random();
|
|
12
|
-
function defaultLevel(_durationMs, error) {
|
|
13
|
-
return error ? "error" : "debug";
|
|
14
|
-
}
|
|
15
|
-
function isPromiseLike(value) {
|
|
16
|
-
return typeof value === "object" && value !== null && typeof value.then === "function";
|
|
17
|
-
}
|
|
18
|
-
function defaultStatement(args) {
|
|
19
|
-
const first = args[0];
|
|
20
|
-
if (typeof first === "string") return first;
|
|
21
|
-
if (typeof first !== "object" || first === null) return void 0;
|
|
22
|
-
const input = first;
|
|
23
|
-
if (typeof input.sql === "string") return input.sql;
|
|
24
|
-
if (typeof input.text === "string") return input.text;
|
|
25
|
-
if (typeof input.query === "string") return input.query;
|
|
26
|
-
}
|
|
27
|
-
function statementFor(args, method, options) {
|
|
28
|
-
const statement = options.getStatement?.(args, method) ?? defaultStatement(args);
|
|
29
|
-
return statement && options.sanitizeStatement ? options.sanitizeStatement(statement) : statement;
|
|
30
|
-
}
|
|
31
|
-
function parametersFor(args, captureParameters) {
|
|
32
|
-
if (!captureParameters) return void 0;
|
|
33
|
-
const first = args[0];
|
|
34
|
-
const parameters = args[1] ?? (typeof first === "object" && first ? first.values ?? first.params ?? first.parameters : void 0);
|
|
35
|
-
return parameters === void 0 ? void 0 : (0, _loggerjs_core.normalizeValue)(parameters, {
|
|
36
|
-
maxDepth: 4,
|
|
37
|
-
maxObjectKeys: 80
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
function databaseIntegration(options = {}) {
|
|
41
|
-
const targets = options.targets ?? (options.client ? [{
|
|
42
|
-
client: options.client,
|
|
43
|
-
name: options.name,
|
|
44
|
-
system: options.system,
|
|
45
|
-
methods: options.methods
|
|
46
|
-
}] : []);
|
|
47
|
-
const captureAll = options.captureAll ?? options.captureSuccessful ?? false;
|
|
48
|
-
const sampleRate = options.sampleRate ?? 1;
|
|
49
|
-
const random = options.random ?? defaultRandom;
|
|
50
|
-
const levelFor = options.level ?? defaultLevel;
|
|
51
|
-
const shouldCapture = (durationMs, error) => {
|
|
52
|
-
if (error) return true;
|
|
53
|
-
if (options.minDurationMs !== void 0 && durationMs >= options.minDurationMs) return true;
|
|
54
|
-
if (!captureAll) return false;
|
|
55
|
-
return sampleRate >= 1 || random() < sampleRate;
|
|
56
|
-
};
|
|
57
|
-
return {
|
|
58
|
-
name: "database",
|
|
59
|
-
setup(api) {
|
|
60
|
-
const capture = api.guard((input) => api.capture(input));
|
|
61
|
-
const disposers = [];
|
|
62
|
-
let disposed = false;
|
|
63
|
-
const captureResult = (info, started, args, error) => {
|
|
64
|
-
const durationMs = Date.now() - started;
|
|
65
|
-
if (disposed || !shouldCapture(durationMs, error)) return;
|
|
66
|
-
capture({
|
|
67
|
-
level: levelFor(durationMs, error, info),
|
|
68
|
-
message: error ? `Database error ${info.method}${info.statement ? ` ${info.statement}` : ""}` : `Database ${info.method}${info.statement ? ` ${info.statement}` : ""}`,
|
|
69
|
-
error,
|
|
70
|
-
props: { db: {
|
|
71
|
-
kind: info.target,
|
|
72
|
-
system: info.system,
|
|
73
|
-
method: info.method,
|
|
74
|
-
statement: info.statement,
|
|
75
|
-
durationMs,
|
|
76
|
-
parameters: parametersFor(args, options.captureParameters ?? false)
|
|
77
|
-
} }
|
|
78
|
-
});
|
|
79
|
-
};
|
|
80
|
-
for (const target of targets) {
|
|
81
|
-
const methods = target.methods ?? options.methods ?? defaultMethods;
|
|
82
|
-
for (const method of methods) {
|
|
83
|
-
const original = target.client[method];
|
|
84
|
-
if (typeof original !== "function") continue;
|
|
85
|
-
const originalMethod = original;
|
|
86
|
-
const targetName = target.name ?? options.name ?? "database";
|
|
87
|
-
const system = target.system ?? options.system;
|
|
88
|
-
target.client[method] = function wrappedDatabaseMethod(...args) {
|
|
89
|
-
const started = Date.now();
|
|
90
|
-
const info = {
|
|
91
|
-
target: targetName,
|
|
92
|
-
system,
|
|
93
|
-
method,
|
|
94
|
-
statement: statementFor(args, method, options)
|
|
95
|
-
};
|
|
96
|
-
try {
|
|
97
|
-
const result = originalMethod.apply(this, args);
|
|
98
|
-
if (isPromiseLike(result)) return result.then((value) => {
|
|
99
|
-
captureResult(info, started, args, void 0);
|
|
100
|
-
return value;
|
|
101
|
-
}, (error) => {
|
|
102
|
-
captureResult(info, started, args, error);
|
|
103
|
-
throw error;
|
|
104
|
-
});
|
|
105
|
-
captureResult(info, started, args, void 0);
|
|
106
|
-
return result;
|
|
107
|
-
} catch (error) {
|
|
108
|
-
captureResult(info, started, args, error);
|
|
109
|
-
throw error;
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
|
-
disposers.push(() => {
|
|
113
|
-
target.client[method] = originalMethod;
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
return () => {
|
|
118
|
-
if (disposed) return;
|
|
119
|
-
disposed = true;
|
|
120
|
-
for (const dispose of disposers) dispose();
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
//#endregion
|
|
2
|
+
const require_database_integration = require("./database-integration.cjs");
|
|
126
3
|
//#region src/prisma-integration.ts
|
|
127
4
|
const prismaMethods = [
|
|
128
5
|
"$executeRaw",
|
|
@@ -136,7 +13,7 @@ function prismaStatement(args) {
|
|
|
136
13
|
if (Array.isArray(first) && "raw" in first) return first.raw?.join("?");
|
|
137
14
|
}
|
|
138
15
|
function prismaIntegration(options) {
|
|
139
|
-
return databaseIntegration({
|
|
16
|
+
return require_database_integration.databaseIntegration({
|
|
140
17
|
...options,
|
|
141
18
|
name: options.name ?? "prisma",
|
|
142
19
|
system: "prisma",
|