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.
- package/dist/config.d.ts +19 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +80 -0
- package/dist/config.js.map +1 -0
- package/dist/context/correlation.d.ts +26 -0
- package/dist/context/correlation.d.ts.map +1 -0
- package/dist/context/correlation.js +53 -0
- package/dist/context/correlation.js.map +1 -0
- package/dist/context/index.d.ts +20 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +122 -0
- package/dist/context/index.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/levels.d.ts +14 -0
- package/dist/levels.d.ts.map +1 -0
- package/dist/levels.js +28 -0
- package/dist/levels.js.map +1 -0
- package/dist/logger.d.ts +82 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +267 -0
- package/dist/logger.js.map +1 -0
- package/dist/runtime.d.ts +29 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +72 -0
- package/dist/runtime.js.map +1 -0
- package/dist/transports/batch.d.ts +69 -0
- package/dist/transports/batch.d.ts.map +1 -0
- package/dist/transports/batch.js +157 -0
- package/dist/transports/batch.js.map +1 -0
- package/dist/transports/console.d.ts +27 -0
- package/dist/transports/console.d.ts.map +1 -0
- package/dist/transports/console.js +82 -0
- package/dist/transports/console.js.map +1 -0
- package/dist/transports/datadog.d.ts +57 -0
- package/dist/transports/datadog.d.ts.map +1 -0
- package/dist/transports/datadog.js +173 -0
- package/dist/transports/datadog.js.map +1 -0
- package/dist/transports/file.d.ts +59 -0
- package/dist/transports/file.d.ts.map +1 -0
- package/dist/transports/file.js +167 -0
- package/dist/transports/file.js.map +1 -0
- package/dist/transports/http.d.ts +49 -0
- package/dist/transports/http.d.ts.map +1 -0
- package/dist/transports/http.js +106 -0
- package/dist/transports/http.js.map +1 -0
- package/dist/types.d.ts +224 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/buffer.d.ts +62 -0
- package/dist/utils/buffer.d.ts.map +1 -0
- package/dist/utils/buffer.js +110 -0
- package/dist/utils/buffer.js.map +1 -0
- package/dist/utils/error.d.ts +14 -0
- package/dist/utils/error.d.ts.map +1 -0
- package/dist/utils/error.js +92 -0
- package/dist/utils/error.js.map +1 -0
- package/dist/utils/sanitize-presets.d.ts +54 -0
- package/dist/utils/sanitize-presets.d.ts.map +1 -0
- package/dist/utils/sanitize-presets.js +245 -0
- package/dist/utils/sanitize-presets.js.map +1 -0
- package/dist/utils/sanitize.d.ts +75 -0
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/utils/sanitize.js +216 -0
- package/dist/utils/sanitize.js.map +1 -0
- 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"}
|