@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.
Files changed (77) hide show
  1. package/README.md +18 -26
  2. package/dist/bullmq-integration.cjs +2 -145
  3. package/dist/bullmq-integration.cjs.map +1 -1
  4. package/dist/bullmq-integration.js +1 -144
  5. package/dist/bullmq-integration.js.map +1 -1
  6. package/dist/chunks/node-destination-DvP8jBvm.cjs +254 -0
  7. package/dist/chunks/node-destination-DvP8jBvm.cjs.map +1 -0
  8. package/dist/chunks/node-destination-YnpYbctz.js +243 -0
  9. package/dist/chunks/node-destination-YnpYbctz.js.map +1 -0
  10. package/dist/context.cjs +1 -1
  11. package/dist/context.js +1 -1
  12. package/dist/diagnostics-channel-integration.cjs +1 -1
  13. package/dist/file-transport.cjs +3 -231
  14. package/dist/file-transport.cjs.map +1 -1
  15. package/dist/file-transport.js +3 -231
  16. package/dist/file-transport.js.map +1 -1
  17. package/dist/http-transport.cjs +25 -4
  18. package/dist/http-transport.cjs.map +1 -1
  19. package/dist/http-transport.d.ts +15 -0
  20. package/dist/http-transport.d.ts.map +1 -1
  21. package/dist/http-transport.js +25 -4
  22. package/dist/http-transport.js.map +1 -1
  23. package/dist/index.cjs +54 -2355
  24. package/dist/index.d.ts +211 -19
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +25 -2327
  27. package/dist/internal-types.d.ts +1 -0
  28. package/dist/internal-types.d.ts.map +1 -1
  29. package/dist/logger-diagnostics.cjs +4 -5
  30. package/dist/logger-diagnostics.cjs.map +1 -1
  31. package/dist/logger-diagnostics.d.ts +1 -1
  32. package/dist/logger-diagnostics.d.ts.map +1 -1
  33. package/dist/logger-diagnostics.js +1 -1
  34. package/dist/logger-diagnostics.js.map +1 -1
  35. package/dist/nest-integration.cjs +2 -127
  36. package/dist/nest-integration.cjs.map +1 -1
  37. package/dist/nest-integration.js +1 -126
  38. package/dist/nest-integration.js.map +1 -1
  39. package/dist/node-destination.d.ts.map +1 -1
  40. package/dist/payload-transforms.cjs +2 -2
  41. package/dist/payload-transforms.cjs.map +1 -1
  42. package/dist/payload-transforms.d.ts.map +1 -1
  43. package/dist/payload-transforms.js +1 -1
  44. package/dist/payload-transforms.js.map +1 -1
  45. package/dist/prisma-integration.cjs +2 -125
  46. package/dist/prisma-integration.cjs.map +1 -1
  47. package/dist/prisma-integration.js +1 -124
  48. package/dist/prisma-integration.js.map +1 -1
  49. package/dist/process-integration.cjs +20 -1
  50. package/dist/process-integration.cjs.map +1 -1
  51. package/dist/process-integration.d.ts +7 -0
  52. package/dist/process-integration.d.ts.map +1 -1
  53. package/dist/process-integration.js +20 -1
  54. package/dist/process-integration.js.map +1 -1
  55. package/dist/redis-integration.cjs +2 -125
  56. package/dist/redis-integration.cjs.map +1 -1
  57. package/dist/redis-integration.js +1 -124
  58. package/dist/redis-integration.js.map +1 -1
  59. package/dist/rotating-file-transport.cjs +24 -238
  60. package/dist/rotating-file-transport.cjs.map +1 -1
  61. package/dist/rotating-file-transport.d.ts.map +1 -1
  62. package/dist/rotating-file-transport.js +24 -238
  63. package/dist/rotating-file-transport.js.map +1 -1
  64. package/dist/stdout-transport.cjs +3 -162
  65. package/dist/stdout-transport.cjs.map +1 -1
  66. package/dist/stdout-transport.js +3 -162
  67. package/dist/stdout-transport.js.map +1 -1
  68. package/dist/syslog-transport.cjs +1 -1
  69. package/dist/syslog-transport.js +1 -1
  70. package/dist/worker-transport.cjs +5 -4
  71. package/dist/worker-transport.cjs.map +1 -1
  72. package/dist/worker-transport.d.ts.map +1 -1
  73. package/dist/worker-transport.js +3 -2
  74. package/dist/worker-transport.js.map +1 -1
  75. package/package.json +5 -2
  76. package/dist/index.cjs.map +0 -1
  77. package/dist/index.js.map +0 -1
@@ -1,12 +1,31 @@
1
- import { applyPayloadTransforms, batchTransport, safeJsonCodec } from "@loggerjs/core";
1
+ import { batchTransport, httpStatusError, safeJsonEncoder } from "@loggerjs/core";
2
+ import { applyPayloadTransforms } from "@loggerjs/core/payload-transforms";
2
3
  //#region src/http-transport.ts
3
4
  function payloadToBody(payload) {
4
5
  if (typeof payload === "string") return payload;
5
6
  return Uint8Array.from(payload);
6
7
  }
8
+ function idempotencyKeyHeaders(header) {
9
+ if (!header) return () => void 0;
10
+ new Headers().append(header, "");
11
+ const prefix = Array.from(crypto.getRandomValues(new Uint32Array(2)), (word) => word.toString(36)).join("");
12
+ const keys = /* @__PURE__ */ new WeakMap();
13
+ let next = 0;
14
+ return (events) => {
15
+ const last = events[events.length - 1];
16
+ let key = keys.get(last);
17
+ if (key === void 0) {
18
+ key = `${prefix}-${(next++).toString(36)}`;
19
+ keys.set(last, key);
20
+ }
21
+ return { [header]: key };
22
+ };
23
+ }
7
24
  function nodeHttpTransport(options) {
8
- const codec = options.codec ?? safeJsonCodec();
25
+ const codec = options.codec ?? safeJsonEncoder();
9
26
  const fetchFn = options.fetchFn ?? globalThis.fetch?.bind(globalThis);
27
+ const keyHeaders = idempotencyKeyHeaders(options.idempotencyKeyHeader);
28
+ const timeoutMs = options.timeoutMs ?? 1e4;
10
29
  return batchTransport({
11
30
  name: options.name ?? "node-http-inner",
12
31
  minLevel: options.minLevel,
@@ -22,11 +41,13 @@ function nodeHttpTransport(options) {
22
41
  headers: {
23
42
  "content-type": transformed.contentType,
24
43
  ...transformed.headers,
44
+ ...keyHeaders(events),
25
45
  ...options.headers
26
46
  },
27
- body: payloadToBody(transformed.payload)
47
+ body: payloadToBody(transformed.payload),
48
+ signal: timeoutMs > 0 ? AbortSignal.timeout(timeoutMs) : void 0
28
49
  });
29
- if (!response.ok) throw new Error(`nodeHttpTransport failed with status ${response.status}`);
50
+ if (!response.ok) throw httpStatusError("nodeHttpTransport", response);
30
51
  }
31
52
  }, {
32
53
  name: options.name ?? "node-http",
@@ -1 +1 @@
1
- {"version":3,"file":"http-transport.js","names":[],"sources":["../src/http-transport.ts"],"sourcesContent":["import {\n applyPayloadTransforms,\n batchTransport,\n safeJsonCodec,\n type BatchTransportOptions,\n type Codec,\n type EncodedPayload,\n type LogEvent,\n type LoggerLevel,\n type PayloadTransform,\n type Transport,\n} from \"@loggerjs/core\";\n\nexport interface NodeHttpTransportOptions extends BatchTransportOptions {\n url: string;\n name?: string;\n method?: \"POST\" | \"PUT\";\n headers?: Record<string, string>;\n codec?: Codec<string | Uint8Array>;\n minLevel?: LoggerLevel;\n fetchFn?: typeof fetch;\n transformPayload?: PayloadTransform | readonly PayloadTransform[];\n}\n\nfunction payloadToBody(payload: EncodedPayload): BodyInit {\n if (typeof payload === \"string\") return payload;\n return Uint8Array.from(payload);\n}\n\nexport function nodeHttpTransport(options: NodeHttpTransportOptions): Transport {\n const codec = options.codec ?? safeJsonCodec();\n const fetchFn = options.fetchFn ?? globalThis.fetch?.bind(globalThis);\n const inner: Transport = {\n name: options.name ?? \"node-http-inner\",\n minLevel: options.minLevel,\n async logBatch(events: LogEvent[]) {\n if (!fetchFn) throw new Error(\"fetch is not available. Use Node.js 18+ or pass fetchFn.\");\n const encoded = codec.encode(events);\n const transformed = await applyPayloadTransforms(\n encoded,\n {\n contentType: codec.contentType,\n events,\n transport: options.name ?? \"node-http\",\n },\n options.transformPayload,\n );\n const response = await fetchFn(options.url, {\n method: options.method ?? \"POST\",\n headers: {\n \"content-type\": transformed.contentType,\n ...transformed.headers,\n ...options.headers,\n },\n body: payloadToBody(transformed.payload),\n });\n if (!response.ok) throw new Error(`nodeHttpTransport failed with status ${response.status}`);\n },\n };\n return batchTransport(inner, {\n name: options.name ?? \"node-http\",\n maxRecords: options.maxRecords,\n maxBatchSize: options.maxBatchSize,\n maxBytes: options.maxBytes,\n maxWaitMs: options.maxWaitMs,\n flushIntervalMs: options.flushIntervalMs,\n concurrency: options.concurrency,\n maxQueueSize: options.maxQueueSize,\n dropPolicy: options.dropPolicy,\n estimateEventBytes: options.estimateEventBytes,\n maxRetries: options.maxRetries,\n retryBaseDelayMs: options.retryBaseDelayMs,\n retryMaxDelayMs: options.retryMaxDelayMs,\n random: options.random,\n circuitBreakerFailureThreshold: options.circuitBreakerFailureThreshold,\n circuitBreakerResetMs: options.circuitBreakerResetMs,\n onDrop: options.onDrop,\n });\n}\n"],"mappings":";;AAwBA,SAAS,cAAc,SAAmC;CACxD,IAAI,OAAO,YAAY,UAAU,OAAO;CACxC,OAAO,WAAW,KAAK,OAAO;AAChC;AAEA,SAAgB,kBAAkB,SAA8C;CAC9E,MAAM,QAAQ,QAAQ,SAAS,cAAc;CAC7C,MAAM,UAAU,QAAQ,WAAW,WAAW,OAAO,KAAK,UAAU;CA4BpE,OAAO,eAAe;EA1BpB,MAAM,QAAQ,QAAQ;EACtB,UAAU,QAAQ;EAClB,MAAM,SAAS,QAAoB;GACjC,IAAI,CAAC,SAAS,MAAM,IAAI,MAAM,0DAA0D;GAExF,MAAM,cAAc,MAAM,uBADV,MAAM,OAAO,MAErB,GACN;IACE,aAAa,MAAM;IACnB;IACA,WAAW,QAAQ,QAAQ;GAC7B,GACA,QAAQ,gBACV;GACA,MAAM,WAAW,MAAM,QAAQ,QAAQ,KAAK;IAC1C,QAAQ,QAAQ,UAAU;IAC1B,SAAS;KACP,gBAAgB,YAAY;KAC5B,GAAG,YAAY;KACf,GAAG,QAAQ;IACb;IACA,MAAM,cAAc,YAAY,OAAO;GACzC,CAAC;GACD,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,wCAAwC,SAAS,QAAQ;EAC7F;CAEwB,GAAG;EAC3B,MAAM,QAAQ,QAAQ;EACtB,YAAY,QAAQ;EACpB,cAAc,QAAQ;EACtB,UAAU,QAAQ;EAClB,WAAW,QAAQ;EACnB,iBAAiB,QAAQ;EACzB,aAAa,QAAQ;EACrB,cAAc,QAAQ;EACtB,YAAY,QAAQ;EACpB,oBAAoB,QAAQ;EAC5B,YAAY,QAAQ;EACpB,kBAAkB,QAAQ;EAC1B,iBAAiB,QAAQ;EACzB,QAAQ,QAAQ;EAChB,gCAAgC,QAAQ;EACxC,uBAAuB,QAAQ;EAC/B,QAAQ,QAAQ;CAClB,CAAC;AACH"}
1
+ {"version":3,"file":"http-transport.js","names":[],"sources":["../src/http-transport.ts"],"sourcesContent":["import {\n httpStatusError,\n batchTransport,\n safeJsonEncoder,\n type BatchTransportOptions,\n type Codec,\n type EncodedPayload,\n type LogEvent,\n type LoggerLevel,\n type PayloadTransform,\n type Transport,\n} from \"@loggerjs/core\";\nimport { applyPayloadTransforms } from \"@loggerjs/core/payload-transforms\";\n\nexport interface NodeHttpTransportOptions extends BatchTransportOptions {\n url: string;\n name?: string;\n method?: \"POST\" | \"PUT\";\n headers?: Record<string, string>;\n codec?: Codec<string | Uint8Array>;\n minLevel?: LoggerLevel;\n fetchFn?: typeof fetch;\n transformPayload?: PayloadTransform | readonly PayloadTransform[];\n /**\n * Abort a delivery attempt after this many milliseconds so a collector that\n * accepts the connection but never answers cannot stall flush() and close().\n * A timed-out attempt fails like any other and follows the retry settings.\n * Set to 0 to disable. Defaults to 10000.\n */\n timeoutMs?: number;\n /**\n * Header that carries an idempotency key for each request, for example\n * \"Idempotency-Key\". Every resend of a batch repeats its key, so the\n * collector can drop the duplicate that a retry after a timeout may cause.\n * Keys start with a random per-transport prefix, so senders never share\n * one. Off by default.\n */\n idempotencyKeyHeader?: string;\n}\n\nfunction payloadToBody(payload: EncodedPayload): BodyInit {\n if (typeof payload === \"string\") return payload;\n return Uint8Array.from(payload);\n}\n\n// Keys are a random per-transport prefix, which keeps senders apart, and a\n// batch number. A batch's key is stored under its last event: retries and\n// resends of a batch handed back to the queue keep that event, because a full\n// queue only drops events from the front. Mirrors @loggerjs/browser.\nfunction idempotencyKeyHeaders(\n header: string | undefined,\n): (events: readonly LogEvent[]) => Record<string, string> | undefined {\n if (!header) return () => undefined;\n // Throws a TypeError for an invalid header name now instead of on every send.\n new Headers().append(header, \"\");\n const prefix = Array.from(crypto.getRandomValues(new Uint32Array(2)), (word) =>\n word.toString(36),\n ).join(\"\");\n const keys = new WeakMap<LogEvent, string>();\n let next = 0;\n return (events) => {\n const last = events[events.length - 1]!;\n let key = keys.get(last);\n if (key === undefined) {\n key = `${prefix}-${(next++).toString(36)}`;\n keys.set(last, key);\n }\n return { [header]: key };\n };\n}\n\nexport function nodeHttpTransport(options: NodeHttpTransportOptions): Transport {\n const codec = options.codec ?? safeJsonEncoder();\n const fetchFn = options.fetchFn ?? globalThis.fetch?.bind(globalThis);\n const keyHeaders = idempotencyKeyHeaders(options.idempotencyKeyHeader);\n const timeoutMs = options.timeoutMs ?? 10_000;\n const inner: Transport = {\n name: options.name ?? \"node-http-inner\",\n minLevel: options.minLevel,\n async logBatch(events: LogEvent[]) {\n if (!fetchFn) throw new Error(\"fetch is not available. Use Node.js 18+ or pass fetchFn.\");\n const encoded = codec.encode(events);\n const transformed = await applyPayloadTransforms(\n encoded,\n {\n contentType: codec.contentType,\n events,\n transport: options.name ?? \"node-http\",\n },\n options.transformPayload,\n );\n const response = await fetchFn(options.url, {\n method: options.method ?? \"POST\",\n headers: {\n \"content-type\": transformed.contentType,\n ...transformed.headers,\n ...keyHeaders(events),\n ...options.headers,\n },\n body: payloadToBody(transformed.payload),\n signal: timeoutMs > 0 ? AbortSignal.timeout(timeoutMs) : undefined,\n });\n if (!response.ok) throw httpStatusError(\"nodeHttpTransport\", response);\n },\n };\n return batchTransport(inner, {\n name: options.name ?? \"node-http\",\n maxRecords: options.maxRecords,\n maxBatchSize: options.maxBatchSize,\n maxBytes: options.maxBytes,\n maxWaitMs: options.maxWaitMs,\n flushIntervalMs: options.flushIntervalMs,\n concurrency: options.concurrency,\n maxQueueSize: options.maxQueueSize,\n dropPolicy: options.dropPolicy,\n estimateEventBytes: options.estimateEventBytes,\n maxRetries: options.maxRetries,\n retryBaseDelayMs: options.retryBaseDelayMs,\n retryMaxDelayMs: options.retryMaxDelayMs,\n random: options.random,\n circuitBreakerFailureThreshold: options.circuitBreakerFailureThreshold,\n circuitBreakerResetMs: options.circuitBreakerResetMs,\n onDrop: options.onDrop,\n });\n}\n"],"mappings":";;;AAwCA,SAAS,cAAc,SAAmC;CACxD,IAAI,OAAO,YAAY,UAAU,OAAO;CACxC,OAAO,WAAW,KAAK,OAAO;AAChC;AAMA,SAAS,sBACP,QACqE;CACrE,IAAI,CAAC,QAAQ,aAAa,KAAA;CAE1B,IAAI,QAAQ,CAAC,CAAC,OAAO,QAAQ,EAAE;CAC/B,MAAM,SAAS,MAAM,KAAK,OAAO,gBAAgB,IAAI,YAAY,CAAC,CAAC,IAAI,SACrE,KAAK,SAAS,EAAE,CAClB,CAAC,CAAC,KAAK,EAAE;CACT,MAAM,uBAAO,IAAI,QAA0B;CAC3C,IAAI,OAAO;CACX,QAAQ,WAAW;EACjB,MAAM,OAAO,OAAO,OAAO,SAAS;EACpC,IAAI,MAAM,KAAK,IAAI,IAAI;EACvB,IAAI,QAAQ,KAAA,GAAW;GACrB,MAAM,GAAG,OAAO,IAAI,OAAA,CAAQ,SAAS,EAAE;GACvC,KAAK,IAAI,MAAM,GAAG;EACpB;EACA,OAAO,GAAG,SAAS,IAAI;CACzB;AACF;AAEA,SAAgB,kBAAkB,SAA8C;CAC9E,MAAM,QAAQ,QAAQ,SAAS,gBAAgB;CAC/C,MAAM,UAAU,QAAQ,WAAW,WAAW,OAAO,KAAK,UAAU;CACpE,MAAM,aAAa,sBAAsB,QAAQ,oBAAoB;CACrE,MAAM,YAAY,QAAQ,aAAa;CA8BvC,OAAO,eAAe;EA5BpB,MAAM,QAAQ,QAAQ;EACtB,UAAU,QAAQ;EAClB,MAAM,SAAS,QAAoB;GACjC,IAAI,CAAC,SAAS,MAAM,IAAI,MAAM,0DAA0D;GAExF,MAAM,cAAc,MAAM,uBADV,MAAM,OAAO,MAErB,GACN;IACE,aAAa,MAAM;IACnB;IACA,WAAW,QAAQ,QAAQ;GAC7B,GACA,QAAQ,gBACV;GACA,MAAM,WAAW,MAAM,QAAQ,QAAQ,KAAK;IAC1C,QAAQ,QAAQ,UAAU;IAC1B,SAAS;KACP,gBAAgB,YAAY;KAC5B,GAAG,YAAY;KACf,GAAG,WAAW,MAAM;KACpB,GAAG,QAAQ;IACb;IACA,MAAM,cAAc,YAAY,OAAO;IACvC,QAAQ,YAAY,IAAI,YAAY,QAAQ,SAAS,IAAI,KAAA;GAC3D,CAAC;GACD,IAAI,CAAC,SAAS,IAAI,MAAM,gBAAgB,qBAAqB,QAAQ;EACvE;CAEwB,GAAG;EAC3B,MAAM,QAAQ,QAAQ;EACtB,YAAY,QAAQ;EACpB,cAAc,QAAQ;EACtB,UAAU,QAAQ;EAClB,WAAW,QAAQ;EACnB,iBAAiB,QAAQ;EACzB,aAAa,QAAQ;EACrB,cAAc,QAAQ;EACtB,YAAY,QAAQ;EACpB,oBAAoB,QAAQ;EAC5B,YAAY,QAAQ;EACpB,kBAAkB,QAAQ;EAC1B,iBAAiB,QAAQ;EACzB,QAAQ,QAAQ;EAChB,gCAAgC,QAAQ;EACxC,uBAAuB,QAAQ;EAC/B,QAAQ,QAAQ;CAClB,CAAC;AACH"}