@bufferlog/sdk-node 1.0.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 (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +194 -0
  3. package/dist/config.d.ts +97 -0
  4. package/dist/config.d.ts.map +1 -0
  5. package/dist/config.js +38 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/context/async-context.d.ts +86 -0
  8. package/dist/context/async-context.d.ts.map +1 -0
  9. package/dist/context/async-context.js +90 -0
  10. package/dist/context/async-context.js.map +1 -0
  11. package/dist/control-plane/policy-fetcher.d.ts +73 -0
  12. package/dist/control-plane/policy-fetcher.d.ts.map +1 -0
  13. package/dist/control-plane/policy-fetcher.js +116 -0
  14. package/dist/control-plane/policy-fetcher.js.map +1 -0
  15. package/dist/control-plane/telemetry-reporter.d.ts +73 -0
  16. package/dist/control-plane/telemetry-reporter.d.ts.map +1 -0
  17. package/dist/control-plane/telemetry-reporter.js +133 -0
  18. package/dist/control-plane/telemetry-reporter.js.map +1 -0
  19. package/dist/core/buffer-manager.d.ts +83 -0
  20. package/dist/core/buffer-manager.d.ts.map +1 -0
  21. package/dist/core/buffer-manager.js +119 -0
  22. package/dist/core/buffer-manager.js.map +1 -0
  23. package/dist/core/log-event.d.ts +72 -0
  24. package/dist/core/log-event.d.ts.map +1 -0
  25. package/dist/core/log-event.js +78 -0
  26. package/dist/core/log-event.js.map +1 -0
  27. package/dist/core/ring-buffer.d.ts +60 -0
  28. package/dist/core/ring-buffer.d.ts.map +1 -0
  29. package/dist/core/ring-buffer.js +120 -0
  30. package/dist/core/ring-buffer.js.map +1 -0
  31. package/dist/flash/adapters/datadog.d.ts +40 -0
  32. package/dist/flash/adapters/datadog.d.ts.map +1 -0
  33. package/dist/flash/adapters/datadog.js +67 -0
  34. package/dist/flash/adapters/datadog.js.map +1 -0
  35. package/dist/flash/adapters/splunk.d.ts +46 -0
  36. package/dist/flash/adapters/splunk.d.ts.map +1 -0
  37. package/dist/flash/adapters/splunk.js +71 -0
  38. package/dist/flash/adapters/splunk.js.map +1 -0
  39. package/dist/flash/adapters/stdout.d.ts +25 -0
  40. package/dist/flash/adapters/stdout.d.ts.map +1 -0
  41. package/dist/flash/adapters/stdout.js +29 -0
  42. package/dist/flash/adapters/stdout.js.map +1 -0
  43. package/dist/flash/adapters/types.d.ts +25 -0
  44. package/dist/flash/adapters/types.d.ts.map +1 -0
  45. package/dist/flash/adapters/types.js +10 -0
  46. package/dist/flash/adapters/types.js.map +1 -0
  47. package/dist/flash/flash-controller.d.ts +78 -0
  48. package/dist/flash/flash-controller.d.ts.map +1 -0
  49. package/dist/flash/flash-controller.js +157 -0
  50. package/dist/flash/flash-controller.js.map +1 -0
  51. package/dist/index.d.ts +126 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +185 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/integrations/pino.d.ts +37 -0
  56. package/dist/integrations/pino.d.ts.map +1 -0
  57. package/dist/integrations/pino.js +86 -0
  58. package/dist/integrations/pino.js.map +1 -0
  59. package/dist/integrations/winston.d.ts +61 -0
  60. package/dist/integrations/winston.d.ts.map +1 -0
  61. package/dist/integrations/winston.js +120 -0
  62. package/dist/integrations/winston.js.map +1 -0
  63. package/dist/middleware/express.d.ts +47 -0
  64. package/dist/middleware/express.d.ts.map +1 -0
  65. package/dist/middleware/express.js +71 -0
  66. package/dist/middleware/express.js.map +1 -0
  67. package/dist/middleware/fastify.d.ts +32 -0
  68. package/dist/middleware/fastify.d.ts.map +1 -0
  69. package/dist/middleware/fastify.js +91 -0
  70. package/dist/middleware/fastify.js.map +1 -0
  71. package/package.json +82 -0
@@ -0,0 +1,78 @@
1
+ /**
2
+ * BufferLog Log Event Schema
3
+ *
4
+ * Lightweight internal representation of a log event.
5
+ * Designed for minimal allocation in the hot path:
6
+ * - Numeric timestamp (not ISO string)
7
+ * - Numeric enum for level (fast comparison)
8
+ * - Optional metadata to avoid empty object allocation
9
+ */
10
+ /**
11
+ * Log severity levels as numeric enum for fast comparison.
12
+ * Usage: `if (event.level >= LogLevel.ERROR)` triggers a flush.
13
+ */
14
+ export var LogLevel;
15
+ (function (LogLevel) {
16
+ LogLevel[LogLevel["TRACE"] = 0] = "TRACE";
17
+ LogLevel[LogLevel["DEBUG"] = 10] = "DEBUG";
18
+ LogLevel[LogLevel["INFO"] = 20] = "INFO";
19
+ LogLevel[LogLevel["WARN"] = 30] = "WARN";
20
+ LogLevel[LogLevel["ERROR"] = 40] = "ERROR";
21
+ LogLevel[LogLevel["FATAL"] = 50] = "FATAL";
22
+ })(LogLevel || (LogLevel = {}));
23
+ /**
24
+ * Human-readable label map for serialization.
25
+ */
26
+ export const LOG_LEVEL_LABELS = {
27
+ [LogLevel.TRACE]: 'TRACE',
28
+ [LogLevel.DEBUG]: 'DEBUG',
29
+ [LogLevel.INFO]: 'INFO',
30
+ [LogLevel.WARN]: 'WARN',
31
+ [LogLevel.ERROR]: 'ERROR',
32
+ [LogLevel.FATAL]: 'FATAL',
33
+ };
34
+ /**
35
+ * Reverse lookup: string label → LogLevel.
36
+ * Used when parsing levels from external logging libraries (e.g., Winston's 'info' → LogLevel.INFO).
37
+ */
38
+ export const LOG_LEVEL_FROM_STRING = {
39
+ trace: LogLevel.TRACE,
40
+ debug: LogLevel.DEBUG,
41
+ info: LogLevel.INFO,
42
+ warn: LogLevel.WARN,
43
+ warning: LogLevel.WARN,
44
+ error: LogLevel.ERROR,
45
+ fatal: LogLevel.FATAL,
46
+ crit: LogLevel.FATAL,
47
+ emerg: LogLevel.FATAL,
48
+ // Winston-specific numeric levels (lower = more severe in Winston)
49
+ // We handle these in the Winston transport via explicit mapping
50
+ };
51
+ /**
52
+ * Convert an internal LogEvent to its serialized downstream format.
53
+ * Called only on the flush path (not hot path), so string allocation is acceptable.
54
+ */
55
+ export function serializeLogEvent(event) {
56
+ return {
57
+ timestamp: new Date(event.timestamp).toISOString(),
58
+ level: LOG_LEVEL_LABELS[event.level] ?? 'UNKNOWN',
59
+ message: event.message,
60
+ ...(event.metadata && { metadata: event.metadata }),
61
+ contextId: event.contextId,
62
+ source: 'bufferlog',
63
+ };
64
+ }
65
+ /**
66
+ * Factory for creating LogEvents with minimal ceremony.
67
+ * Captures timestamp at call time.
68
+ */
69
+ export function createLogEvent(level, message, contextId, metadata) {
70
+ return {
71
+ timestamp: Date.now(),
72
+ level,
73
+ message,
74
+ contextId,
75
+ ...(metadata && { metadata }),
76
+ };
77
+ }
78
+ //# sourceMappingURL=log-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-event.js","sourceRoot":"","sources":["../../src/core/log-event.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;GAGG;AACH,MAAM,CAAN,IAAY,QAOX;AAPD,WAAY,QAAQ;IAClB,yCAAS,CAAA;IACT,0CAAU,CAAA;IACV,wCAAS,CAAA;IACT,wCAAS,CAAA;IACT,0CAAU,CAAA;IACV,0CAAU,CAAA;AACZ,CAAC,EAPW,QAAQ,KAAR,QAAQ,QAOnB;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAA6B;IACxD,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO;IACzB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO;IACzB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM;IACvB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM;IACvB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO;IACzB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO;CAC1B,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAA6B;IAC7D,KAAK,EAAE,QAAQ,CAAC,KAAK;IACrB,KAAK,EAAE,QAAQ,CAAC,KAAK;IACrB,IAAI,EAAE,QAAQ,CAAC,IAAI;IACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;IACnB,OAAO,EAAE,QAAQ,CAAC,IAAI;IACtB,KAAK,EAAE,QAAQ,CAAC,KAAK;IACrB,KAAK,EAAE,QAAQ,CAAC,KAAK;IACrB,IAAI,EAAE,QAAQ,CAAC,KAAK;IACpB,KAAK,EAAE,QAAQ,CAAC,KAAK;IACrB,mEAAmE;IACnE,gEAAgE;CACjE,CAAC;AAuCF;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAe;IAC/C,OAAO;QACL,SAAS,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;QAClD,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,SAAS;QACjD,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnD,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,WAAW;KACpB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAe,EACf,OAAe,EACf,SAAiB,EACjB,QAAkC;IAElC,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,KAAK;QACL,OAAO;QACP,SAAS;QACT,GAAG,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,CAAC;KAC9B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Ring Buffer — Fixed-size circular buffer for log events.
3
+ *
4
+ * Design goals:
5
+ * - O(1) push with zero allocation (pre-allocated array slots)
6
+ * - O(n) drain that returns items in chronological (insertion) order
7
+ * - Overwrites oldest entries when full (ring/circular behavior)
8
+ * - Minimal GC pressure: `clear()` resets pointers, doesn't deallocate
9
+ *
10
+ * Node.js is single-threaded per event loop, so no mutex is needed.
11
+ * However, `drain()` is designed to be atomic within a single tick —
12
+ * no interleaving with `push()` can occur in the same microtask.
13
+ */
14
+ export declare class RingBuffer<T> {
15
+ private readonly capacity;
16
+ private readonly buffer;
17
+ private head;
18
+ private _size;
19
+ /**
20
+ * @param capacity Maximum number of items before oldest are overwritten.
21
+ * Must be a positive integer.
22
+ */
23
+ constructor(capacity: number);
24
+ /**
25
+ * Push an item into the buffer. O(1).
26
+ * If the buffer is full, the oldest item is silently overwritten.
27
+ */
28
+ push(item: T): void;
29
+ /**
30
+ * Drain all items from the buffer in chronological (insertion) order.
31
+ * Resets the buffer to empty after draining.
32
+ *
33
+ * @returns Array of items ordered from oldest to newest.
34
+ */
35
+ drain(): T[];
36
+ /**
37
+ * Peek at all items without draining. Returns items in chronological order.
38
+ * Useful for testing and debugging.
39
+ */
40
+ peek(): T[];
41
+ /**
42
+ * Clear the buffer. Resets pointers only — slots are reused, not deallocated.
43
+ * This minimizes GC pressure: the underlying array stays allocated.
44
+ */
45
+ clear(): void;
46
+ /**
47
+ * Clear the buffer AND release all references (allows GC of stored items).
48
+ * Use this when the buffer itself will persist but stored items should be freed.
49
+ */
50
+ clearFull(): void;
51
+ /** Current number of items in the buffer. */
52
+ get size(): number;
53
+ /** Whether the buffer has reached its maximum capacity. */
54
+ get isFull(): boolean;
55
+ /** Whether the buffer contains no items. */
56
+ get isEmpty(): boolean;
57
+ /** Maximum capacity of the buffer. */
58
+ get maxCapacity(): number;
59
+ }
60
+ //# sourceMappingURL=ring-buffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ring-buffer.d.ts","sourceRoot":"","sources":["../../src/core/ring-buffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,qBAAa,UAAU,CAAC,CAAC;IASX,OAAO,CAAC,QAAQ,CAAC,QAAQ;IARrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,KAAK,CAAa;IAE1B;;;OAGG;gBAC0B,QAAQ,EAAE,MAAM;IAQ7C;;;OAGG;IACH,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAUnB;;;;;OAKG;IACH,KAAK,IAAI,CAAC,EAAE;IAuBZ;;;OAGG;IACH,IAAI,IAAI,CAAC,EAAE;IAgBX;;;OAGG;IACH,KAAK,IAAI,IAAI;IAQb;;;OAGG;IACH,SAAS,IAAI,IAAI;IAMjB,6CAA6C;IAC7C,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,2DAA2D;IAC3D,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,4CAA4C;IAC5C,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,sCAAsC;IACtC,IAAI,WAAW,IAAI,MAAM,CAExB;CACF"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Ring Buffer — Fixed-size circular buffer for log events.
3
+ *
4
+ * Design goals:
5
+ * - O(1) push with zero allocation (pre-allocated array slots)
6
+ * - O(n) drain that returns items in chronological (insertion) order
7
+ * - Overwrites oldest entries when full (ring/circular behavior)
8
+ * - Minimal GC pressure: `clear()` resets pointers, doesn't deallocate
9
+ *
10
+ * Node.js is single-threaded per event loop, so no mutex is needed.
11
+ * However, `drain()` is designed to be atomic within a single tick —
12
+ * no interleaving with `push()` can occur in the same microtask.
13
+ */
14
+ export class RingBuffer {
15
+ capacity;
16
+ buffer;
17
+ head = 0; // Next write position
18
+ _size = 0; // Current number of items
19
+ /**
20
+ * @param capacity Maximum number of items before oldest are overwritten.
21
+ * Must be a positive integer.
22
+ */
23
+ constructor(capacity) {
24
+ this.capacity = capacity;
25
+ if (capacity <= 0 || !Number.isInteger(capacity)) {
26
+ throw new Error(`RingBuffer capacity must be a positive integer, got: ${capacity}`);
27
+ }
28
+ // Pre-allocate all slots to avoid dynamic resizing
29
+ this.buffer = new Array(capacity).fill(undefined);
30
+ }
31
+ /**
32
+ * Push an item into the buffer. O(1).
33
+ * If the buffer is full, the oldest item is silently overwritten.
34
+ */
35
+ push(item) {
36
+ this.buffer[this.head] = item;
37
+ this.head = (this.head + 1) % this.capacity;
38
+ if (this._size < this.capacity) {
39
+ this._size++;
40
+ }
41
+ // When _size === capacity, head has wrapped and is now pointing
42
+ // at the oldest item (which we just overwrote). _size stays at capacity.
43
+ }
44
+ /**
45
+ * Drain all items from the buffer in chronological (insertion) order.
46
+ * Resets the buffer to empty after draining.
47
+ *
48
+ * @returns Array of items ordered from oldest to newest.
49
+ */
50
+ drain() {
51
+ if (this._size === 0) {
52
+ return [];
53
+ }
54
+ const result = new Array(this._size);
55
+ // Calculate the start position (oldest item)
56
+ // If buffer hasn't wrapped: start = 0
57
+ // If buffer has wrapped: start = head (which points to the oldest after overwrite)
58
+ const start = this._size < this.capacity ? 0 : this.head;
59
+ for (let i = 0; i < this._size; i++) {
60
+ const idx = (start + i) % this.capacity;
61
+ result[i] = this.buffer[idx];
62
+ }
63
+ // Reset the buffer
64
+ this.clear();
65
+ return result;
66
+ }
67
+ /**
68
+ * Peek at all items without draining. Returns items in chronological order.
69
+ * Useful for testing and debugging.
70
+ */
71
+ peek() {
72
+ if (this._size === 0) {
73
+ return [];
74
+ }
75
+ const result = new Array(this._size);
76
+ const start = this._size < this.capacity ? 0 : this.head;
77
+ for (let i = 0; i < this._size; i++) {
78
+ const idx = (start + i) % this.capacity;
79
+ result[i] = this.buffer[idx];
80
+ }
81
+ return result;
82
+ }
83
+ /**
84
+ * Clear the buffer. Resets pointers only — slots are reused, not deallocated.
85
+ * This minimizes GC pressure: the underlying array stays allocated.
86
+ */
87
+ clear() {
88
+ this.head = 0;
89
+ this._size = 0;
90
+ // Intentionally NOT clearing buffer slots to avoid allocation.
91
+ // Old references will be overwritten on next push() cycle.
92
+ // If you need to release references for GC (e.g., large objects), use clearFull().
93
+ }
94
+ /**
95
+ * Clear the buffer AND release all references (allows GC of stored items).
96
+ * Use this when the buffer itself will persist but stored items should be freed.
97
+ */
98
+ clearFull() {
99
+ this.buffer.fill(undefined);
100
+ this.head = 0;
101
+ this._size = 0;
102
+ }
103
+ /** Current number of items in the buffer. */
104
+ get size() {
105
+ return this._size;
106
+ }
107
+ /** Whether the buffer has reached its maximum capacity. */
108
+ get isFull() {
109
+ return this._size === this.capacity;
110
+ }
111
+ /** Whether the buffer contains no items. */
112
+ get isEmpty() {
113
+ return this._size === 0;
114
+ }
115
+ /** Maximum capacity of the buffer. */
116
+ get maxCapacity() {
117
+ return this.capacity;
118
+ }
119
+ }
120
+ //# sourceMappingURL=ring-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ring-buffer.js","sourceRoot":"","sources":["../../src/core/ring-buffer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Datadog HTTP Intake Adapter
3
+ *
4
+ * Sends flushed log events to Datadog's HTTP Intake API.
5
+ * API Docs: https://docs.datadoghq.com/api/latest/logs/#send-logs
6
+ *
7
+ * Endpoint: POST https://http-intake.logs.{site}/api/v2/logs
8
+ * Auth: DD-API-KEY header
9
+ */
10
+ import type { SerializedLogEvent } from '../../core/log-event.js';
11
+ import type { DownstreamAdapter } from './types.js';
12
+ export interface DatadogAdapterOptions {
13
+ /** Datadog API key */
14
+ apiKey: string;
15
+ /**
16
+ * Datadog site.
17
+ * @default 'datadoghq.com'
18
+ */
19
+ site?: string;
20
+ /** Service name to tag logs with */
21
+ service?: string;
22
+ /** Source tag (e.g., 'nodejs') */
23
+ source?: string;
24
+ /** Additional tags to apply to all events (e.g., 'env:production') */
25
+ tags?: string[];
26
+ /** Request timeout in ms. @default 10000 */
27
+ timeoutMs?: number;
28
+ }
29
+ export declare class DatadogAdapter implements DownstreamAdapter {
30
+ readonly name = "datadog";
31
+ private readonly apiKey;
32
+ private readonly endpoint;
33
+ private readonly service;
34
+ private readonly source;
35
+ private readonly tags;
36
+ private readonly timeoutMs;
37
+ constructor(options: DatadogAdapterOptions);
38
+ send(events: SerializedLogEvent[], contextId: string): Promise<void>;
39
+ }
40
+ //# sourceMappingURL=datadog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datadog.d.ts","sourceRoot":"","sources":["../../../src/flash/adapters/datadog.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,qBAAqB;IACpC,sBAAsB;IACtB,MAAM,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,cAAe,YAAW,iBAAiB;IACtD,QAAQ,CAAC,IAAI,aAAa;IAE1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,EAAE,qBAAqB;IAUpC,IAAI,CAAC,MAAM,EAAE,kBAAkB,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA2C3E"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Datadog HTTP Intake Adapter
3
+ *
4
+ * Sends flushed log events to Datadog's HTTP Intake API.
5
+ * API Docs: https://docs.datadoghq.com/api/latest/logs/#send-logs
6
+ *
7
+ * Endpoint: POST https://http-intake.logs.{site}/api/v2/logs
8
+ * Auth: DD-API-KEY header
9
+ */
10
+ export class DatadogAdapter {
11
+ name = 'datadog';
12
+ apiKey;
13
+ endpoint;
14
+ service;
15
+ source;
16
+ tags;
17
+ timeoutMs;
18
+ constructor(options) {
19
+ this.apiKey = options.apiKey;
20
+ const site = options.site ?? 'datadoghq.com';
21
+ this.endpoint = `https://http-intake.logs.${site}/api/v2/logs`;
22
+ this.service = options.service ?? 'bufferlog';
23
+ this.source = options.source ?? 'nodejs';
24
+ this.tags = (options.tags ?? []).join(',');
25
+ this.timeoutMs = options.timeoutMs ?? 10_000;
26
+ }
27
+ async send(events, contextId) {
28
+ // Transform to Datadog's expected log format
29
+ const ddLogs = events.map((event) => ({
30
+ ddsource: this.source,
31
+ ddtags: this.tags
32
+ ? `${this.tags},bufferlog.context_id:${contextId}`
33
+ : `bufferlog.context_id:${contextId}`,
34
+ hostname: process.env.HOSTNAME ?? 'unknown',
35
+ service: this.service,
36
+ status: event.level.toLowerCase(),
37
+ message: event.message,
38
+ timestamp: event.timestamp,
39
+ ...event.metadata,
40
+ bufferlog: {
41
+ contextId,
42
+ source: 'bufferlog-flush',
43
+ },
44
+ }));
45
+ const controller = new AbortController();
46
+ const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
47
+ try {
48
+ const response = await fetch(this.endpoint, {
49
+ method: 'POST',
50
+ headers: {
51
+ 'Content-Type': 'application/json',
52
+ 'DD-API-KEY': this.apiKey,
53
+ },
54
+ body: JSON.stringify(ddLogs),
55
+ signal: controller.signal,
56
+ });
57
+ if (!response.ok) {
58
+ const body = await response.text().catch(() => 'unknown');
59
+ throw new Error(`Datadog API returned ${response.status}: ${body}`);
60
+ }
61
+ }
62
+ finally {
63
+ clearTimeout(timeout);
64
+ }
65
+ }
66
+ }
67
+ //# sourceMappingURL=datadog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datadog.js","sourceRoot":"","sources":["../../../src/flash/adapters/datadog.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA4BH,MAAM,OAAO,cAAc;IAChB,IAAI,GAAG,SAAS,CAAC;IAET,MAAM,CAAS;IACf,QAAQ,CAAS;IACjB,OAAO,CAAS;IAChB,MAAM,CAAS;IACf,IAAI,CAAS;IACb,SAAS,CAAS;IAEnC,YAAY,OAA8B;QACxC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,eAAe,CAAC;QAC7C,IAAI,CAAC,QAAQ,GAAG,4BAA4B,IAAI,cAAc,CAAC;QAC/D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,WAAW,CAAC;QAC9C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAA4B,EAAE,SAAiB;QACxD,6CAA6C;QAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACpC,QAAQ,EAAE,IAAI,CAAC,MAAM;YACrB,MAAM,EAAE,IAAI,CAAC,IAAI;gBACf,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,yBAAyB,SAAS,EAAE;gBAClD,CAAC,CAAC,wBAAwB,SAAS,EAAE;YACvC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,SAAS;YAC3C,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE;YACjC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,GAAG,KAAK,CAAC,QAAQ;YACjB,SAAS,EAAE;gBACT,SAAS;gBACT,MAAM,EAAE,iBAAiB;aAC1B;SACF,CAAC,CAAC,CAAC;QAEJ,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAErE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAC1C,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,YAAY,EAAE,IAAI,CAAC,MAAM;iBAC1B;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;gBAC5B,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC1D,MAAM,IAAI,KAAK,CACb,wBAAwB,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,CACnD,CAAC;YACJ,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Splunk HTTP Event Collector (HEC) Adapter
3
+ *
4
+ * Sends flushed log events to Splunk via the HEC endpoint.
5
+ * API Docs: https://docs.splunk.com/Documentation/Splunk/latest/Data/UsetheHTTPEventCollector
6
+ *
7
+ * Endpoint: POST https://{host}:{port}/services/collector/event
8
+ * Auth: Splunk {token} in Authorization header
9
+ */
10
+ import type { SerializedLogEvent } from '../../core/log-event.js';
11
+ import type { DownstreamAdapter } from './types.js';
12
+ export interface SplunkAdapterOptions {
13
+ /** Splunk HEC token */
14
+ token: string;
15
+ /**
16
+ * Splunk HEC endpoint URL (including port).
17
+ * @example 'https://splunk.example.com:8088'
18
+ */
19
+ url: string;
20
+ /** Splunk index to write to. If not set, uses the HEC token's default index. */
21
+ index?: string;
22
+ /** Source type for the events. @default '_json' */
23
+ sourceType?: string;
24
+ /** Source identifier. @default 'bufferlog' */
25
+ source?: string;
26
+ /** Request timeout in ms. @default 10000 */
27
+ timeoutMs?: number;
28
+ /**
29
+ * Whether to skip TLS certificate verification.
30
+ * Useful for self-signed certs in development.
31
+ * @default false
32
+ */
33
+ insecure?: boolean;
34
+ }
35
+ export declare class SplunkAdapter implements DownstreamAdapter {
36
+ readonly name = "splunk";
37
+ private readonly token;
38
+ private readonly endpoint;
39
+ private readonly index?;
40
+ private readonly sourceType;
41
+ private readonly source;
42
+ private readonly timeoutMs;
43
+ constructor(options: SplunkAdapterOptions);
44
+ send(events: SerializedLogEvent[], contextId: string): Promise<void>;
45
+ }
46
+ //# sourceMappingURL=splunk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"splunk.d.ts","sourceRoot":"","sources":["../../../src/flash/adapters/splunk.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,oBAAoB;IACnC,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,aAAc,YAAW,iBAAiB;IACrD,QAAQ,CAAC,IAAI,YAAY;IAEzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,EAAE,oBAAoB;IAWnC,IAAI,CAAC,MAAM,EAAE,kBAAkB,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA+C3E"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Splunk HTTP Event Collector (HEC) Adapter
3
+ *
4
+ * Sends flushed log events to Splunk via the HEC endpoint.
5
+ * API Docs: https://docs.splunk.com/Documentation/Splunk/latest/Data/UsetheHTTPEventCollector
6
+ *
7
+ * Endpoint: POST https://{host}:{port}/services/collector/event
8
+ * Auth: Splunk {token} in Authorization header
9
+ */
10
+ export class SplunkAdapter {
11
+ name = 'splunk';
12
+ token;
13
+ endpoint;
14
+ index;
15
+ sourceType;
16
+ source;
17
+ timeoutMs;
18
+ constructor(options) {
19
+ this.token = options.token;
20
+ // Ensure the URL ends with the collector path
21
+ const baseUrl = options.url.replace(/\/+$/, '');
22
+ this.endpoint = `${baseUrl}/services/collector/event`;
23
+ this.index = options.index;
24
+ this.sourceType = options.sourceType ?? '_json';
25
+ this.source = options.source ?? 'bufferlog';
26
+ this.timeoutMs = options.timeoutMs ?? 10_000;
27
+ }
28
+ async send(events, contextId) {
29
+ // Splunk HEC expects newline-delimited JSON events (batch mode)
30
+ // Each event is a separate JSON object on its own line
31
+ const hecEvents = events.map((event) => ({
32
+ time: new Date(event.timestamp).getTime() / 1000, // Splunk expects epoch seconds
33
+ host: process.env.HOSTNAME ?? 'unknown',
34
+ source: this.source,
35
+ sourcetype: this.sourceType,
36
+ ...(this.index && { index: this.index }),
37
+ event: {
38
+ level: event.level,
39
+ message: event.message,
40
+ contextId,
41
+ ...event.metadata,
42
+ bufferlog: {
43
+ source: 'bufferlog-flush',
44
+ },
45
+ },
46
+ }));
47
+ // Splunk HEC batch format: newline-delimited JSON
48
+ const body = hecEvents.map((e) => JSON.stringify(e)).join('\n');
49
+ const controller = new AbortController();
50
+ const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
51
+ try {
52
+ const response = await fetch(this.endpoint, {
53
+ method: 'POST',
54
+ headers: {
55
+ 'Content-Type': 'application/json',
56
+ 'Authorization': `Splunk ${this.token}`,
57
+ },
58
+ body,
59
+ signal: controller.signal,
60
+ });
61
+ if (!response.ok) {
62
+ const respBody = await response.text().catch(() => 'unknown');
63
+ throw new Error(`Splunk HEC returned ${response.status}: ${respBody}`);
64
+ }
65
+ }
66
+ finally {
67
+ clearTimeout(timeout);
68
+ }
69
+ }
70
+ }
71
+ //# sourceMappingURL=splunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"splunk.js","sourceRoot":"","sources":["../../../src/flash/adapters/splunk.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAmCH,MAAM,OAAO,aAAa;IACf,IAAI,GAAG,QAAQ,CAAC;IAER,KAAK,CAAS;IACd,QAAQ,CAAS;IACjB,KAAK,CAAU;IACf,UAAU,CAAS;IACnB,MAAM,CAAS;IACf,SAAS,CAAS;IAEnC,YAAY,OAA6B;QACvC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,8CAA8C;QAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,GAAG,GAAG,OAAO,2BAA2B,CAAC;QACtD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC;QAChD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,WAAW,CAAC;QAC5C,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAA4B,EAAE,SAAiB;QACxD,gEAAgE;QAChE,uDAAuD;QACvD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACvC,IAAI,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,+BAA+B;YACjF,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,SAAS;YACvC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;YACxC,KAAK,EAAE;gBACL,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,SAAS;gBACT,GAAG,KAAK,CAAC,QAAQ;gBACjB,SAAS,EAAE;oBACT,MAAM,EAAE,iBAAiB;iBAC1B;aACF;SACF,CAAC,CAAC,CAAC;QAEJ,kDAAkD;QAClD,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEhE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAErE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAC1C,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,eAAe,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;iBACxC;gBACD,IAAI;gBACJ,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC9D,MAAM,IAAI,KAAK,CACb,uBAAuB,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE,CACtD,CAAC;YACJ,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * StdOut Adapter — Simple JSON-line output to stdout.
3
+ *
4
+ * Default fallback adapter. Writes each log event as a single JSON line,
5
+ * making it compatible with container log aggregation (Docker, K8s).
6
+ */
7
+ import type { SerializedLogEvent } from '../../core/log-event.js';
8
+ import type { DownstreamAdapter } from './types.js';
9
+ export interface StdOutAdapterOptions {
10
+ /** Use stderr instead of stdout. Default: false */
11
+ useStderr?: boolean;
12
+ /** Pretty-print JSON (useful for development). Default: false */
13
+ pretty?: boolean;
14
+ /** Optional prefix for each line (e.g., '[BufferLog]') */
15
+ prefix?: string;
16
+ }
17
+ export declare class StdOutAdapter implements DownstreamAdapter {
18
+ readonly name = "stdout";
19
+ private readonly stream;
20
+ private readonly pretty;
21
+ private readonly prefix;
22
+ constructor(options?: StdOutAdapterOptions);
23
+ send(events: SerializedLogEvent[], contextId: string): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=stdout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdout.d.ts","sourceRoot":"","sources":["../../../src/flash/adapters/stdout.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,oBAAoB;IACnC,mDAAmD;IACnD,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,iEAAiE;IACjE,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,aAAc,YAAW,iBAAiB;IACrD,QAAQ,CAAC,IAAI,YAAY;IAEzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,OAAO,GAAE,oBAAyB;IAMxC,IAAI,CAAC,MAAM,EAAE,kBAAkB,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAc3E"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * StdOut Adapter — Simple JSON-line output to stdout.
3
+ *
4
+ * Default fallback adapter. Writes each log event as a single JSON line,
5
+ * making it compatible with container log aggregation (Docker, K8s).
6
+ */
7
+ export class StdOutAdapter {
8
+ name = 'stdout';
9
+ stream;
10
+ pretty;
11
+ prefix;
12
+ constructor(options = {}) {
13
+ this.stream = options.useStderr ? process.stderr : process.stdout;
14
+ this.pretty = options.pretty ?? false;
15
+ this.prefix = options.prefix ?? '';
16
+ }
17
+ async send(events, contextId) {
18
+ const separator = `--- BufferLog Flush [${contextId}] (${events.length} events) ---`;
19
+ this.stream.write(this.prefix + separator + '\n');
20
+ for (const event of events) {
21
+ const line = this.pretty
22
+ ? JSON.stringify(event, null, 2)
23
+ : JSON.stringify(event);
24
+ this.stream.write(this.prefix + line + '\n');
25
+ }
26
+ this.stream.write(this.prefix + '--- End Flush ---\n');
27
+ }
28
+ }
29
+ //# sourceMappingURL=stdout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdout.js","sourceRoot":"","sources":["../../../src/flash/adapters/stdout.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH,MAAM,OAAO,aAAa;IACf,IAAI,GAAG,QAAQ,CAAC;IAER,MAAM,CAAqB;IAC3B,MAAM,CAAU;IAChB,MAAM,CAAS;IAEhC,YAAY,UAAgC,EAAE;QAC5C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QAClE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAA4B,EAAE,SAAiB;QACxD,MAAM,SAAS,GAAG,wBAAwB,SAAS,MAAM,MAAM,CAAC,MAAM,cAAc,CAAC;QAErF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC;QAElD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM;gBACtB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,qBAAqB,CAAC,CAAC;IACzD,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Downstream Adapter Interface
3
+ *
4
+ * All adapters implement this interface to send flushed log events
5
+ * to an APM/aggregator (Datadog, Splunk, stdout, etc.).
6
+ *
7
+ * Adapters are called only on the error path (flush), never on the hot path.
8
+ */
9
+ import type { SerializedLogEvent } from '../../core/log-event.js';
10
+ /**
11
+ * A downstream target that receives flushed log events.
12
+ */
13
+ export interface DownstreamAdapter {
14
+ /** Human-readable name for logging/debugging (e.g., 'datadog', 'splunk', 'stdout') */
15
+ readonly name: string;
16
+ /**
17
+ * Send a batch of serialized log events to the downstream target.
18
+ *
19
+ * @param events - Log events in chronological order (oldest first, error last)
20
+ * @param contextId - The request context ID for correlation
21
+ * @throws Should throw on unrecoverable errors (FlashController handles retries/fallbacks)
22
+ */
23
+ send(events: SerializedLogEvent[], contextId: string): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/flash/adapters/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,sFAAsF;IACtF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;;;;OAMG;IACH,IAAI,CAAC,MAAM,EAAE,kBAAkB,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtE"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Downstream Adapter Interface
3
+ *
4
+ * All adapters implement this interface to send flushed log events
5
+ * to an APM/aggregator (Datadog, Splunk, stdout, etc.).
6
+ *
7
+ * Adapters are called only on the error path (flush), never on the hot path.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/flash/adapters/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}