vestig 0.2.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 (69) hide show
  1. package/dist/config.d.ts +19 -0
  2. package/dist/config.d.ts.map +1 -0
  3. package/dist/config.js +80 -0
  4. package/dist/config.js.map +1 -0
  5. package/dist/context/correlation.d.ts +26 -0
  6. package/dist/context/correlation.d.ts.map +1 -0
  7. package/dist/context/correlation.js +53 -0
  8. package/dist/context/correlation.js.map +1 -0
  9. package/dist/context/index.d.ts +20 -0
  10. package/dist/context/index.d.ts.map +1 -0
  11. package/dist/context/index.js +122 -0
  12. package/dist/context/index.js.map +1 -0
  13. package/dist/index.d.ts +22 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +27 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/levels.d.ts +14 -0
  18. package/dist/levels.d.ts.map +1 -0
  19. package/dist/levels.js +28 -0
  20. package/dist/levels.js.map +1 -0
  21. package/dist/logger.d.ts +82 -0
  22. package/dist/logger.d.ts.map +1 -0
  23. package/dist/logger.js +267 -0
  24. package/dist/logger.js.map +1 -0
  25. package/dist/runtime.d.ts +29 -0
  26. package/dist/runtime.d.ts.map +1 -0
  27. package/dist/runtime.js +72 -0
  28. package/dist/runtime.js.map +1 -0
  29. package/dist/transports/batch.d.ts +69 -0
  30. package/dist/transports/batch.d.ts.map +1 -0
  31. package/dist/transports/batch.js +157 -0
  32. package/dist/transports/batch.js.map +1 -0
  33. package/dist/transports/console.d.ts +27 -0
  34. package/dist/transports/console.d.ts.map +1 -0
  35. package/dist/transports/console.js +82 -0
  36. package/dist/transports/console.js.map +1 -0
  37. package/dist/transports/datadog.d.ts +57 -0
  38. package/dist/transports/datadog.d.ts.map +1 -0
  39. package/dist/transports/datadog.js +173 -0
  40. package/dist/transports/datadog.js.map +1 -0
  41. package/dist/transports/file.d.ts +59 -0
  42. package/dist/transports/file.d.ts.map +1 -0
  43. package/dist/transports/file.js +167 -0
  44. package/dist/transports/file.js.map +1 -0
  45. package/dist/transports/http.d.ts +49 -0
  46. package/dist/transports/http.d.ts.map +1 -0
  47. package/dist/transports/http.js +106 -0
  48. package/dist/transports/http.js.map +1 -0
  49. package/dist/types.d.ts +224 -0
  50. package/dist/types.d.ts.map +1 -0
  51. package/dist/types.js +2 -0
  52. package/dist/types.js.map +1 -0
  53. package/dist/utils/buffer.d.ts +62 -0
  54. package/dist/utils/buffer.d.ts.map +1 -0
  55. package/dist/utils/buffer.js +110 -0
  56. package/dist/utils/buffer.js.map +1 -0
  57. package/dist/utils/error.d.ts +14 -0
  58. package/dist/utils/error.d.ts.map +1 -0
  59. package/dist/utils/error.js +92 -0
  60. package/dist/utils/error.js.map +1 -0
  61. package/dist/utils/sanitize-presets.d.ts +54 -0
  62. package/dist/utils/sanitize-presets.d.ts.map +1 -0
  63. package/dist/utils/sanitize-presets.js +245 -0
  64. package/dist/utils/sanitize-presets.js.map +1 -0
  65. package/dist/utils/sanitize.d.ts +75 -0
  66. package/dist/utils/sanitize.d.ts.map +1 -0
  67. package/dist/utils/sanitize.js +216 -0
  68. package/dist/utils/sanitize.js.map +1 -0
  69. package/package.json +76 -0
@@ -0,0 +1,82 @@
1
+ import { IS_BROWSER } from '../runtime';
2
+ /**
3
+ * ANSI color codes for terminal output
4
+ */
5
+ const COLORS = {
6
+ trace: '\x1b[90m', // gray
7
+ debug: '\x1b[36m', // cyan
8
+ info: '\x1b[32m', // green
9
+ warn: '\x1b[33m', // yellow
10
+ error: '\x1b[31m', // red
11
+ };
12
+ const RESET = '\x1b[0m';
13
+ /**
14
+ * Console method mapping
15
+ */
16
+ const CONSOLE_METHODS = {
17
+ trace: 'debug',
18
+ debug: 'debug',
19
+ info: 'info',
20
+ warn: 'warn',
21
+ error: 'error',
22
+ };
23
+ /**
24
+ * Format a log entry as a structured JSON string
25
+ */
26
+ function formatStructured(entry) {
27
+ return JSON.stringify(entry);
28
+ }
29
+ /**
30
+ * Format a log entry for human-readable output
31
+ */
32
+ function formatPretty(entry, useColors) {
33
+ const color = useColors ? COLORS[entry.level] : '';
34
+ const reset = useColors ? RESET : '';
35
+ const level = entry.level.toUpperCase().padEnd(5);
36
+ const namespace = entry.namespace ? `[${entry.namespace}] ` : '';
37
+ const timestamp = new Date(entry.timestamp).toISOString();
38
+ let output = `${color}${level}${reset} ${timestamp} ${namespace}${entry.message}`;
39
+ if (entry.metadata && Object.keys(entry.metadata).length > 0) {
40
+ output += ` ${JSON.stringify(entry.metadata)}`;
41
+ }
42
+ if (entry.error) {
43
+ output += `\n${entry.error.stack ?? entry.error.message}`;
44
+ }
45
+ return output;
46
+ }
47
+ /**
48
+ * Console transport for logging to stdout/stderr
49
+ */
50
+ export class ConsoleTransport {
51
+ name = 'console';
52
+ config;
53
+ structured;
54
+ colors;
55
+ constructor(config = {}) {
56
+ this.config = {
57
+ name: 'console',
58
+ enabled: config.enabled ?? true,
59
+ level: config.level,
60
+ filter: config.filter,
61
+ };
62
+ this.structured = config.structured ?? false;
63
+ this.colors = config.colors ?? !IS_BROWSER;
64
+ }
65
+ log(entry) {
66
+ const method = CONSOLE_METHODS[entry.level];
67
+ const output = this.structured ? formatStructured(entry) : formatPretty(entry, this.colors);
68
+ // Use appropriate console method
69
+ const consoleFn = console[method];
70
+ consoleFn(output);
71
+ }
72
+ /**
73
+ * Update configuration
74
+ */
75
+ setStructured(structured) {
76
+ this.structured = structured;
77
+ }
78
+ setColors(colors) {
79
+ this.colors = colors;
80
+ }
81
+ }
82
+ //# sourceMappingURL=console.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console.js","sourceRoot":"","sources":["../../src/transports/console.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { DatadogTransportConfig, LogEntry } from '../types';
2
+ import { BatchTransport } from './batch';
3
+ /**
4
+ * Datadog transport for sending logs to Datadog Log Management
5
+ *
6
+ * Automatically formats logs to Datadog's expected format and handles
7
+ * authentication via DD-API-KEY header.
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * const transport = new DatadogTransport({
12
+ * name: 'datadog',
13
+ * apiKey: process.env.DD_API_KEY,
14
+ * service: 'my-service',
15
+ * site: 'datadoghq.com',
16
+ * tags: ['env:production', 'team:backend'],
17
+ * })
18
+ * ```
19
+ */
20
+ export declare class DatadogTransport extends BatchTransport {
21
+ readonly name: string;
22
+ private readonly apiKey;
23
+ private readonly url;
24
+ private readonly service?;
25
+ private readonly source?;
26
+ private readonly tags?;
27
+ constructor(config: DatadogTransportConfig);
28
+ /**
29
+ * Send entries to Datadog
30
+ */
31
+ protected send(entries: LogEntry[]): Promise<void>;
32
+ /**
33
+ * Transform a log entry to Datadog format
34
+ */
35
+ private transformEntry;
36
+ /**
37
+ * Build Datadog tags from entry
38
+ */
39
+ private buildTags;
40
+ /**
41
+ * Get hostname from entry context or environment
42
+ */
43
+ private getHostname;
44
+ /**
45
+ * Safely read response body for error messages
46
+ */
47
+ private safeReadBody;
48
+ }
49
+ /**
50
+ * Custom error for Datadog transport failures
51
+ */
52
+ export declare class DatadogTransportError extends Error {
53
+ readonly statusCode: number;
54
+ readonly responseBody?: string | undefined;
55
+ constructor(message: string, statusCode: number, responseBody?: string | undefined);
56
+ }
57
+ //# sourceMappingURL=datadog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datadog.d.ts","sourceRoot":"","sources":["../../src/transports/datadog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAuBxC;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,gBAAiB,SAAQ,cAAc;IACnD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAU;gBAEpB,MAAM,EAAE,sBAAsB;IAmB1C;;OAEG;cACa,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBxD;;OAEG;IACH,OAAO,CAAC,cAAc;IAiCtB;;OAEG;IACH,OAAO,CAAC,SAAS;IA2BjB;;OAEG;IACH,OAAO,CAAC,WAAW;IAcnB;;OAEG;YACW,YAAY;CAO1B;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;aAG9B,UAAU,EAAE,MAAM;aAClB,YAAY,CAAC,EAAE,MAAM;gBAFrC,OAAO,EAAE,MAAM,EACC,UAAU,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,YAAA;CAKtC"}
@@ -0,0 +1,173 @@
1
+ import { BatchTransport } from './batch';
2
+ /**
3
+ * Datadog intake URLs by site
4
+ */
5
+ const DATADOG_URLS = {
6
+ 'datadoghq.com': 'https://http-intake.logs.datadoghq.com/api/v2/logs',
7
+ 'datadoghq.eu': 'https://http-intake.logs.datadoghq.eu/api/v2/logs',
8
+ 'us3.datadoghq.com': 'https://http-intake.logs.us3.datadoghq.com/api/v2/logs',
9
+ 'us5.datadoghq.com': 'https://http-intake.logs.us5.datadoghq.com/api/v2/logs',
10
+ };
11
+ /**
12
+ * Datadog log level mapping
13
+ */
14
+ const DD_LEVELS = {
15
+ trace: 'debug',
16
+ debug: 'debug',
17
+ info: 'info',
18
+ warn: 'warning',
19
+ error: 'error',
20
+ };
21
+ /**
22
+ * Datadog transport for sending logs to Datadog Log Management
23
+ *
24
+ * Automatically formats logs to Datadog's expected format and handles
25
+ * authentication via DD-API-KEY header.
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * const transport = new DatadogTransport({
30
+ * name: 'datadog',
31
+ * apiKey: process.env.DD_API_KEY,
32
+ * service: 'my-service',
33
+ * site: 'datadoghq.com',
34
+ * tags: ['env:production', 'team:backend'],
35
+ * })
36
+ * ```
37
+ */
38
+ export class DatadogTransport extends BatchTransport {
39
+ name;
40
+ apiKey;
41
+ url;
42
+ service;
43
+ source;
44
+ tags;
45
+ constructor(config) {
46
+ super({
47
+ ...config,
48
+ name: config.name ?? 'datadog',
49
+ // Datadog recommends smaller batches
50
+ batchSize: config.batchSize ?? 50,
51
+ flushInterval: config.flushInterval ?? 3000,
52
+ });
53
+ this.name = config.name ?? 'datadog';
54
+ this.apiKey = config.apiKey;
55
+ const site = config.site ?? 'datadoghq.com';
56
+ const defaultUrl = 'https://http-intake.logs.datadoghq.com/api/v2/logs';
57
+ this.url = DATADOG_URLS[site] ?? defaultUrl;
58
+ this.service = config.service;
59
+ this.source = config.source ?? 'vestig';
60
+ this.tags = config.tags;
61
+ }
62
+ /**
63
+ * Send entries to Datadog
64
+ */
65
+ async send(entries) {
66
+ const ddLogs = entries.map((entry) => this.transformEntry(entry));
67
+ const response = await fetch(this.url, {
68
+ method: 'POST',
69
+ headers: {
70
+ 'Content-Type': 'application/json',
71
+ 'DD-API-KEY': this.apiKey,
72
+ },
73
+ body: JSON.stringify(ddLogs),
74
+ });
75
+ if (!response.ok) {
76
+ throw new DatadogTransportError(`Datadog API error: ${response.status} ${response.statusText}`, response.status, await this.safeReadBody(response));
77
+ }
78
+ }
79
+ /**
80
+ * Transform a log entry to Datadog format
81
+ */
82
+ transformEntry(entry) {
83
+ const ddEntry = {
84
+ ddsource: this.source ?? 'vestig',
85
+ ddtags: this.buildTags(entry),
86
+ hostname: this.getHostname(entry),
87
+ message: entry.message,
88
+ service: this.service ?? entry.namespace ?? 'unknown',
89
+ status: DD_LEVELS[entry.level] ?? 'info',
90
+ timestamp: entry.timestamp,
91
+ };
92
+ // Add structured attributes
93
+ if (entry.metadata) {
94
+ ddEntry.attributes = entry.metadata;
95
+ }
96
+ // Add context as attributes
97
+ if (entry.context) {
98
+ ddEntry.attributes = { ...ddEntry.attributes, ...entry.context };
99
+ }
100
+ // Add error information
101
+ if (entry.error) {
102
+ ddEntry.error = {
103
+ kind: entry.error.name,
104
+ message: entry.error.message,
105
+ stack: entry.error.stack,
106
+ };
107
+ }
108
+ return ddEntry;
109
+ }
110
+ /**
111
+ * Build Datadog tags from entry
112
+ */
113
+ buildTags(entry) {
114
+ const tags = [];
115
+ // Add configured tags
116
+ if (this.tags) {
117
+ tags.push(...this.tags);
118
+ }
119
+ // Add runtime tag
120
+ tags.push(`runtime:${entry.runtime}`);
121
+ // Add namespace if present
122
+ if (entry.namespace) {
123
+ tags.push(`namespace:${entry.namespace}`);
124
+ }
125
+ // Add trace IDs if present
126
+ if (entry.context?.traceId) {
127
+ tags.push(`trace_id:${entry.context.traceId}`);
128
+ }
129
+ if (entry.context?.spanId) {
130
+ tags.push(`span_id:${entry.context.spanId}`);
131
+ }
132
+ return tags.join(',');
133
+ }
134
+ /**
135
+ * Get hostname from entry context or environment
136
+ */
137
+ getHostname(entry) {
138
+ // Try to get from context
139
+ if (entry.context?.hostname) {
140
+ return String(entry.context.hostname);
141
+ }
142
+ // Try environment variable
143
+ if (typeof process !== 'undefined' && process.env?.HOSTNAME) {
144
+ return process.env.HOSTNAME;
145
+ }
146
+ return 'unknown';
147
+ }
148
+ /**
149
+ * Safely read response body for error messages
150
+ */
151
+ async safeReadBody(response) {
152
+ try {
153
+ return await response.text();
154
+ }
155
+ catch {
156
+ return undefined;
157
+ }
158
+ }
159
+ }
160
+ /**
161
+ * Custom error for Datadog transport failures
162
+ */
163
+ export class DatadogTransportError extends Error {
164
+ statusCode;
165
+ responseBody;
166
+ constructor(message, statusCode, responseBody) {
167
+ super(message);
168
+ this.statusCode = statusCode;
169
+ this.responseBody = responseBody;
170
+ this.name = 'DatadogTransportError';
171
+ }
172
+ }
173
+ //# sourceMappingURL=datadog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datadog.js","sourceRoot":"","sources":["../../src/transports/datadog.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAExC;;GAEG;AACH,MAAM,YAAY,GAA2B;IAC5C,eAAe,EAAE,oDAAoD;IACrE,cAAc,EAAE,mDAAmD;IACnE,mBAAmB,EAAE,wDAAwD;IAC7E,mBAAmB,EAAE,wDAAwD;CAC7E,CAAA;AAED;;GAEG;AACH,MAAM,SAAS,GAA2B;IACzC,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,OAAO;CACd,CAAA;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,gBAAiB,SAAQ,cAAc;IAC1C,IAAI,CAAQ;IAEJ,MAAM,CAAQ;IACd,GAAG,CAAQ;IACX,OAAO,CAAS;IAChB,MAAM,CAAS;IACf,IAAI,CAAW;IAEhC,YAAY,MAA8B;QACzC,KAAK,CAAC;YACL,GAAG,MAAM;YACT,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,SAAS;YAC9B,qCAAqC;YACrC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE;YACjC,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,IAAI;SAC3C,CAAC,CAAA;QAEF,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,SAAS,CAAA;QACpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,eAAe,CAAA;QAC3C,MAAM,UAAU,GAAG,oDAAoD,CAAA;QACvE,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,UAAU,CAAA;QAC3C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAA;QACvC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;IACxB,CAAC;IAED;;OAEG;IACO,KAAK,CAAC,IAAI,CAAC,OAAmB;QACvC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAA;QAEjE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;YACtC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACR,cAAc,EAAE,kBAAkB;gBAClC,YAAY,EAAE,IAAI,CAAC,MAAM;aACzB;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;SAC5B,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,MAAM,IAAI,qBAAqB,CAC9B,sBAAsB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,EAC9D,QAAQ,CAAC,MAAM,EACf,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CACjC,CAAA;QACF,CAAC;IACF,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,KAAe;QACrC,MAAM,OAAO,GAAoB;YAChC,QAAQ,EAAE,IAAI,CAAC,MAAM,IAAI,QAAQ;YACjC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;YAC7B,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;YACjC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,SAAS,IAAI,SAAS;YACrD,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM;YACxC,SAAS,EAAE,KAAK,CAAC,SAAS;SAC1B,CAAA;QAED,4BAA4B;QAC5B,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAA;QACpC,CAAC;QAED,4BAA4B;QAC5B,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,UAAU,GAAG,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAA;QACjE,CAAC;QAED,wBAAwB;QACxB,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,GAAG;gBACf,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;gBACtB,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO;gBAC5B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK;aACxB,CAAA;QACF,CAAC;QAED,OAAO,OAAO,CAAA;IACf,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,KAAe;QAChC,MAAM,IAAI,GAAa,EAAE,CAAA;QAEzB,sBAAsB;QACtB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;QACxB,CAAC;QAED,kBAAkB;QAClB,IAAI,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QAErC,2BAA2B;QAC3B,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,SAAS,EAAE,CAAC,CAAA;QAC1C,CAAC;QAED,2BAA2B;QAC3B,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;QAC/C,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;QAC7C,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACtB,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,KAAe;QAClC,0BAA0B;QAC1B,IAAI,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;YAC7B,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QACtC,CAAC;QAED,2BAA2B;QAC3B,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;YAC7D,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAA;QAC5B,CAAC;QAED,OAAO,SAAS,CAAA;IACjB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY,CAAC,QAAkB;QAC5C,IAAI,CAAC;YACJ,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAC7B,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,SAAS,CAAA;QACjB,CAAC;IACF,CAAC;CACD;AAED;;GAEG;AACH,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAG9B;IACA;IAHjB,YACC,OAAe,EACC,UAAkB,EAClB,YAAqB;QAErC,KAAK,CAAC,OAAO,CAAC,CAAA;QAHE,eAAU,GAAV,UAAU,CAAQ;QAClB,iBAAY,GAAZ,YAAY,CAAS;QAGrC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAA;IACpC,CAAC;CACD"}
@@ -0,0 +1,59 @@
1
+ import type { FileTransportConfig, LogEntry } from '../types';
2
+ import { BatchTransport } from './batch';
3
+ /**
4
+ * File transport for writing logs to disk
5
+ *
6
+ * Server-side only. Supports log rotation by size and optional gzip compression.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * const transport = new FileTransport({
11
+ * name: 'file',
12
+ * path: '/var/log/app/app.log',
13
+ * maxSize: 10 * 1024 * 1024, // 10MB
14
+ * maxFiles: 5,
15
+ * compress: true,
16
+ * })
17
+ * ```
18
+ */
19
+ export declare class FileTransport extends BatchTransport {
20
+ readonly name: string;
21
+ private readonly path;
22
+ private readonly maxSize;
23
+ private readonly maxFiles;
24
+ private readonly compress;
25
+ private currentSize;
26
+ private fd;
27
+ private fs;
28
+ private zlib;
29
+ constructor(config: FileTransportConfig);
30
+ /**
31
+ * Initialize the file transport
32
+ */
33
+ init(): Promise<void>;
34
+ /**
35
+ * Open the log file for appending
36
+ */
37
+ private openFile;
38
+ /**
39
+ * Send entries to the file
40
+ */
41
+ protected send(entries: LogEntry[]): Promise<void>;
42
+ /**
43
+ * Rotate log files
44
+ */
45
+ private rotate;
46
+ /**
47
+ * Compress a file using gzip
48
+ */
49
+ private compressFile;
50
+ /**
51
+ * Cleanup and close the file
52
+ */
53
+ destroy(): Promise<void>;
54
+ /**
55
+ * Get current file size
56
+ */
57
+ getCurrentSize(): number;
58
+ }
59
+ //# sourceMappingURL=file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/transports/file.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAWxC;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,aAAc,SAAQ,cAAc;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC,OAAO,CAAC,WAAW,CAAI;IACvB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,EAAE,CAAiD;IAC3D,OAAO,CAAC,IAAI,CAA0C;gBAE1C,MAAM,EAAE,mBAAmB;IAiBvC;;OAEG;IACY,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBpC;;OAEG;YACW,QAAQ;IAUtB;;OAEG;cACa,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBxD;;OAEG;YACW,MAAM;IAsCpB;;OAEG;YACW,YAAY;IAW1B;;OAEG;IACY,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IASvC;;OAEG;IACH,cAAc,IAAI,MAAM;CAGxB"}
@@ -0,0 +1,167 @@
1
+ import { IS_SERVER } from '../runtime';
2
+ import { BatchTransport } from './batch';
3
+ /**
4
+ * Default file transport configuration
5
+ */
6
+ const DEFAULTS = {
7
+ maxSize: 10 * 1024 * 1024, // 10MB
8
+ maxFiles: 5,
9
+ compress: false,
10
+ };
11
+ /**
12
+ * File transport for writing logs to disk
13
+ *
14
+ * Server-side only. Supports log rotation by size and optional gzip compression.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const transport = new FileTransport({
19
+ * name: 'file',
20
+ * path: '/var/log/app/app.log',
21
+ * maxSize: 10 * 1024 * 1024, // 10MB
22
+ * maxFiles: 5,
23
+ * compress: true,
24
+ * })
25
+ * ```
26
+ */
27
+ export class FileTransport extends BatchTransport {
28
+ name;
29
+ path;
30
+ maxSize;
31
+ maxFiles;
32
+ compress;
33
+ currentSize = 0;
34
+ fd = null;
35
+ fs = null;
36
+ zlib = null;
37
+ constructor(config) {
38
+ if (!IS_SERVER) {
39
+ throw new Error('FileTransport is only available in server environments (Node.js, Bun, Deno)');
40
+ }
41
+ super({
42
+ ...config,
43
+ name: config.name ?? 'file',
44
+ });
45
+ this.name = config.name ?? 'file';
46
+ this.path = config.path;
47
+ this.maxSize = config.maxSize ?? DEFAULTS.maxSize;
48
+ this.maxFiles = config.maxFiles ?? DEFAULTS.maxFiles;
49
+ this.compress = config.compress ?? DEFAULTS.compress;
50
+ }
51
+ /**
52
+ * Initialize the file transport
53
+ */
54
+ async init() {
55
+ // Dynamic import for server-only modules
56
+ this.fs = await import('node:fs/promises');
57
+ if (this.compress) {
58
+ this.zlib = await import('node:zlib');
59
+ }
60
+ // Ensure directory exists
61
+ const dir = this.path.substring(0, this.path.lastIndexOf('/'));
62
+ if (dir) {
63
+ await this.fs.mkdir(dir, { recursive: true });
64
+ }
65
+ // Open or create file
66
+ await this.openFile();
67
+ // Start the flush timer
68
+ await super.init();
69
+ }
70
+ /**
71
+ * Open the log file for appending
72
+ */
73
+ async openFile() {
74
+ if (!this.fs)
75
+ return;
76
+ this.fd = await this.fs.open(this.path, 'a');
77
+ // Get current file size
78
+ const stats = await this.fd.stat();
79
+ this.currentSize = stats.size;
80
+ }
81
+ /**
82
+ * Send entries to the file
83
+ */
84
+ async send(entries) {
85
+ if (!this.fd || !this.fs) {
86
+ throw new Error('FileTransport not initialized');
87
+ }
88
+ // Format entries as newline-delimited JSON
89
+ const data = `${entries.map((e) => JSON.stringify(e)).join('\n')}\n`;
90
+ const bytes = Buffer.byteLength(data, 'utf8');
91
+ // Check if rotation needed
92
+ if (this.currentSize + bytes > this.maxSize) {
93
+ await this.rotate();
94
+ }
95
+ // Write to file
96
+ await this.fd.write(data);
97
+ this.currentSize += bytes;
98
+ }
99
+ /**
100
+ * Rotate log files
101
+ */
102
+ async rotate() {
103
+ if (!this.fd || !this.fs)
104
+ return;
105
+ // Close current file
106
+ await this.fd.close();
107
+ this.fd = null;
108
+ // Rotate existing files
109
+ for (let i = this.maxFiles - 1; i >= 1; i--) {
110
+ const oldPath = i === 1 ? this.path : `${this.path}.${i - 1}${this.compress ? '.gz' : ''}`;
111
+ const newPath = `${this.path}.${i}${this.compress ? '.gz' : ''}`;
112
+ try {
113
+ await this.fs.access(oldPath);
114
+ if (i === 1 && this.compress) {
115
+ // Compress the current log file
116
+ await this.compressFile(oldPath, newPath);
117
+ await this.fs.unlink(oldPath);
118
+ }
119
+ else {
120
+ await this.fs.rename(oldPath, newPath);
121
+ }
122
+ }
123
+ catch {
124
+ // File doesn't exist, skip
125
+ }
126
+ }
127
+ // Delete oldest file if it exists
128
+ const oldestPath = `${this.path}.${this.maxFiles}${this.compress ? '.gz' : ''}`;
129
+ try {
130
+ await this.fs.unlink(oldestPath);
131
+ }
132
+ catch {
133
+ // File doesn't exist
134
+ }
135
+ // Reopen file
136
+ await this.openFile();
137
+ }
138
+ /**
139
+ * Compress a file using gzip
140
+ */
141
+ async compressFile(src, dest) {
142
+ if (!this.fs || !this.zlib)
143
+ return;
144
+ const { promisify } = await import('node:util');
145
+ const gzip = promisify(this.zlib.gzip);
146
+ const content = await this.fs.readFile(src);
147
+ const compressed = await gzip(content);
148
+ await this.fs.writeFile(dest, compressed);
149
+ }
150
+ /**
151
+ * Cleanup and close the file
152
+ */
153
+ async destroy() {
154
+ await super.destroy();
155
+ if (this.fd) {
156
+ await this.fd.close();
157
+ this.fd = null;
158
+ }
159
+ }
160
+ /**
161
+ * Get current file size
162
+ */
163
+ getCurrentSize() {
164
+ return this.currentSize;
165
+ }
166
+ }
167
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/transports/file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { HTTPTransportConfig, LogEntry } from '../types';
2
+ import { BatchTransport } from './batch';
3
+ /**
4
+ * HTTP transport for sending logs to external services
5
+ *
6
+ * Supports any runtime with native fetch (Node 18+, Bun, Deno, Edge, Browser).
7
+ * Features batching, retry logic, custom headers, and payload transformation.
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * const transport = new HTTPTransport({
12
+ * name: 'my-http',
13
+ * url: 'https://logs.example.com/ingest',
14
+ * headers: {
15
+ * 'Authorization': 'Bearer my-token',
16
+ * },
17
+ * transform: (entries) => ({
18
+ * logs: entries,
19
+ * timestamp: Date.now(),
20
+ * }),
21
+ * })
22
+ * ```
23
+ */
24
+ export declare class HTTPTransport extends BatchTransport {
25
+ readonly name: string;
26
+ private readonly url;
27
+ private readonly method;
28
+ private readonly headers;
29
+ private readonly timeout;
30
+ private readonly transform?;
31
+ constructor(config: HTTPTransportConfig);
32
+ /**
33
+ * Send entries to the configured URL
34
+ */
35
+ protected send(entries: LogEntry[]): Promise<void>;
36
+ /**
37
+ * Safely read response body for error messages
38
+ */
39
+ private safeReadBody;
40
+ }
41
+ /**
42
+ * Custom error for HTTP transport failures
43
+ */
44
+ export declare class HTTPTransportError extends Error {
45
+ readonly statusCode: number;
46
+ readonly responseBody?: string | undefined;
47
+ constructor(message: string, statusCode: number, responseBody?: string | undefined);
48
+ }
49
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAaxC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,aAAc,SAAQ,cAAc;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAkC;gBAEjD,MAAM,EAAE,mBAAmB;IAcvC;;OAEG;cACa,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCxD;;OAEG;YACW,YAAY;CAO1B;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;aAG3B,UAAU,EAAE,MAAM;aAClB,YAAY,CAAC,EAAE,MAAM;gBAFrC,OAAO,EAAE,MAAM,EACC,UAAU,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,YAAA;CAKtC"}