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,106 @@
|
|
|
1
|
+
import { BatchTransport } from './batch';
|
|
2
|
+
/**
|
|
3
|
+
* Default HTTP transport configuration
|
|
4
|
+
*/
|
|
5
|
+
const DEFAULTS = {
|
|
6
|
+
method: 'POST',
|
|
7
|
+
timeout: 30000,
|
|
8
|
+
headers: {
|
|
9
|
+
'Content-Type': 'application/json',
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* HTTP transport for sending logs to external services
|
|
14
|
+
*
|
|
15
|
+
* Supports any runtime with native fetch (Node 18+, Bun, Deno, Edge, Browser).
|
|
16
|
+
* Features batching, retry logic, custom headers, and payload transformation.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const transport = new HTTPTransport({
|
|
21
|
+
* name: 'my-http',
|
|
22
|
+
* url: 'https://logs.example.com/ingest',
|
|
23
|
+
* headers: {
|
|
24
|
+
* 'Authorization': 'Bearer my-token',
|
|
25
|
+
* },
|
|
26
|
+
* transform: (entries) => ({
|
|
27
|
+
* logs: entries,
|
|
28
|
+
* timestamp: Date.now(),
|
|
29
|
+
* }),
|
|
30
|
+
* })
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export class HTTPTransport extends BatchTransport {
|
|
34
|
+
name;
|
|
35
|
+
url;
|
|
36
|
+
method;
|
|
37
|
+
headers;
|
|
38
|
+
timeout;
|
|
39
|
+
transform;
|
|
40
|
+
constructor(config) {
|
|
41
|
+
super({
|
|
42
|
+
...config,
|
|
43
|
+
name: config.name ?? 'http',
|
|
44
|
+
});
|
|
45
|
+
this.name = config.name ?? 'http';
|
|
46
|
+
this.url = config.url;
|
|
47
|
+
this.method = config.method ?? DEFAULTS.method;
|
|
48
|
+
this.headers = { ...DEFAULTS.headers, ...config.headers };
|
|
49
|
+
this.timeout = config.timeout ?? DEFAULTS.timeout;
|
|
50
|
+
this.transform = config.transform;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Send entries to the configured URL
|
|
54
|
+
*/
|
|
55
|
+
async send(entries) {
|
|
56
|
+
const payload = this.transform ? this.transform(entries) : entries;
|
|
57
|
+
const body = JSON.stringify(payload);
|
|
58
|
+
const controller = new AbortController();
|
|
59
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
60
|
+
try {
|
|
61
|
+
const response = await fetch(this.url, {
|
|
62
|
+
method: this.method,
|
|
63
|
+
headers: this.headers,
|
|
64
|
+
body,
|
|
65
|
+
signal: controller.signal,
|
|
66
|
+
});
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
throw new HTTPTransportError(`HTTP ${response.status}: ${response.statusText}`, response.status, await this.safeReadBody(response));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
if (err instanceof Error && err.name === 'AbortError') {
|
|
73
|
+
throw new HTTPTransportError(`Request timeout after ${this.timeout}ms`, 408);
|
|
74
|
+
}
|
|
75
|
+
throw err;
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
clearTimeout(timeoutId);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Safely read response body for error messages
|
|
83
|
+
*/
|
|
84
|
+
async safeReadBody(response) {
|
|
85
|
+
try {
|
|
86
|
+
return await response.text();
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Custom error for HTTP transport failures
|
|
95
|
+
*/
|
|
96
|
+
export class HTTPTransportError extends Error {
|
|
97
|
+
statusCode;
|
|
98
|
+
responseBody;
|
|
99
|
+
constructor(message, statusCode, responseBody) {
|
|
100
|
+
super(message);
|
|
101
|
+
this.statusCode = statusCode;
|
|
102
|
+
this.responseBody = responseBody;
|
|
103
|
+
this.name = 'HTTPTransportError';
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Log levels from least to most severe
|
|
3
|
+
*/
|
|
4
|
+
export type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error';
|
|
5
|
+
/**
|
|
6
|
+
* Runtime environment detection
|
|
7
|
+
*/
|
|
8
|
+
export type Runtime = 'node' | 'bun' | 'edge' | 'browser' | 'worker' | 'unknown';
|
|
9
|
+
/**
|
|
10
|
+
* Metadata attached to log entries
|
|
11
|
+
*/
|
|
12
|
+
export type LogMetadata = Record<string, unknown>;
|
|
13
|
+
/**
|
|
14
|
+
* Context that persists across async operations
|
|
15
|
+
*/
|
|
16
|
+
export interface LogContext {
|
|
17
|
+
requestId?: string;
|
|
18
|
+
traceId?: string;
|
|
19
|
+
spanId?: string;
|
|
20
|
+
userId?: string;
|
|
21
|
+
sessionId?: string;
|
|
22
|
+
[key: string]: unknown;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* A structured log entry
|
|
26
|
+
*/
|
|
27
|
+
export interface LogEntry {
|
|
28
|
+
timestamp: string;
|
|
29
|
+
level: LogLevel;
|
|
30
|
+
message: string;
|
|
31
|
+
metadata?: LogMetadata;
|
|
32
|
+
context?: LogContext;
|
|
33
|
+
runtime: Runtime;
|
|
34
|
+
namespace?: string;
|
|
35
|
+
error?: SerializedError;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Serialized error with cause chain support
|
|
39
|
+
*/
|
|
40
|
+
export interface SerializedError {
|
|
41
|
+
name: string;
|
|
42
|
+
message: string;
|
|
43
|
+
stack?: string;
|
|
44
|
+
cause?: SerializedError;
|
|
45
|
+
code?: string | number;
|
|
46
|
+
[key: string]: unknown;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Field matcher for flexible field matching in sanitization
|
|
50
|
+
*/
|
|
51
|
+
export interface FieldMatcher {
|
|
52
|
+
/** Match type */
|
|
53
|
+
type: 'exact' | 'prefix' | 'suffix' | 'contains' | 'regex';
|
|
54
|
+
/** Pattern or field name to match */
|
|
55
|
+
value: string;
|
|
56
|
+
/** Case sensitive matching (default: false) */
|
|
57
|
+
caseSensitive?: boolean;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Pattern definition for sanitizing string content
|
|
61
|
+
*/
|
|
62
|
+
export interface SanitizePattern {
|
|
63
|
+
/** Pattern identifier */
|
|
64
|
+
name: string;
|
|
65
|
+
/** Regular expression to match */
|
|
66
|
+
pattern: RegExp;
|
|
67
|
+
/** Replacement string or function (default: '[REDACTED]') */
|
|
68
|
+
replacement?: string | ((match: string) => string);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Sanitization configuration
|
|
72
|
+
*/
|
|
73
|
+
export interface SanitizeConfig {
|
|
74
|
+
/** Enable/disable sanitization (default: true) */
|
|
75
|
+
enabled?: boolean;
|
|
76
|
+
/** Fields to sanitize (can be strings or FieldMatchers) */
|
|
77
|
+
fields?: (string | FieldMatcher)[];
|
|
78
|
+
/** Patterns to apply to string values */
|
|
79
|
+
patterns?: SanitizePattern[];
|
|
80
|
+
/** Default replacement string (default: '[REDACTED]') */
|
|
81
|
+
replacement?: string;
|
|
82
|
+
/** Maximum recursion depth (default: 10) */
|
|
83
|
+
depth?: number;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Available sanitization presets
|
|
87
|
+
*/
|
|
88
|
+
export type SanitizePreset = 'none' | 'minimal' | 'default' | 'gdpr' | 'hipaa' | 'pci-dss';
|
|
89
|
+
/**
|
|
90
|
+
* Logger configuration options
|
|
91
|
+
*/
|
|
92
|
+
export interface LoggerConfig {
|
|
93
|
+
/** Minimum log level to output */
|
|
94
|
+
level?: LogLevel;
|
|
95
|
+
/** Enable/disable logging */
|
|
96
|
+
enabled?: boolean;
|
|
97
|
+
/** Output as JSON (production) or formatted (development) */
|
|
98
|
+
structured?: boolean;
|
|
99
|
+
/** Sanitization configuration: boolean, preset name, or full config */
|
|
100
|
+
sanitize?: boolean | SanitizePreset | SanitizeConfig;
|
|
101
|
+
/** @deprecated Use sanitize config instead */
|
|
102
|
+
sanitizeFields?: string[];
|
|
103
|
+
/** Static context added to all logs */
|
|
104
|
+
context?: LogContext;
|
|
105
|
+
/** Logger namespace for child loggers */
|
|
106
|
+
namespace?: string;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Base transport configuration
|
|
110
|
+
*/
|
|
111
|
+
export interface TransportConfig {
|
|
112
|
+
/** Transport name for identification */
|
|
113
|
+
name: string;
|
|
114
|
+
/** Enable/disable this transport (default: true) */
|
|
115
|
+
enabled?: boolean;
|
|
116
|
+
/** Minimum log level for this transport */
|
|
117
|
+
level?: LogLevel;
|
|
118
|
+
/** Filter function for entries */
|
|
119
|
+
filter?: (entry: LogEntry) => boolean;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Transport interface for log output
|
|
123
|
+
*/
|
|
124
|
+
export interface Transport {
|
|
125
|
+
/** Transport identifier */
|
|
126
|
+
readonly name: string;
|
|
127
|
+
/** Transport configuration */
|
|
128
|
+
readonly config: TransportConfig;
|
|
129
|
+
/** Initialize transport (called once on startup) */
|
|
130
|
+
init?(): Promise<void>;
|
|
131
|
+
/** Log a single entry */
|
|
132
|
+
log(entry: LogEntry): void | Promise<void>;
|
|
133
|
+
/** Flush any buffered entries */
|
|
134
|
+
flush?(): Promise<void>;
|
|
135
|
+
/** Cleanup resources (called on shutdown) */
|
|
136
|
+
destroy?(): Promise<void>;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Configuration for batch transports
|
|
140
|
+
*/
|
|
141
|
+
export interface BatchTransportConfig extends TransportConfig {
|
|
142
|
+
/** Maximum entries before auto-flush (default: 100) */
|
|
143
|
+
batchSize?: number;
|
|
144
|
+
/** Interval in ms between auto-flushes (default: 5000) */
|
|
145
|
+
flushInterval?: number;
|
|
146
|
+
/** Maximum retry attempts on failure (default: 3) */
|
|
147
|
+
maxRetries?: number;
|
|
148
|
+
/** Delay between retries in ms (default: 1000) */
|
|
149
|
+
retryDelay?: number;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* HTTP transport configuration
|
|
153
|
+
*/
|
|
154
|
+
export interface HTTPTransportConfig extends BatchTransportConfig {
|
|
155
|
+
/** Destination URL for log entries */
|
|
156
|
+
url: string;
|
|
157
|
+
/** HTTP method (default: POST) */
|
|
158
|
+
method?: 'POST' | 'PUT';
|
|
159
|
+
/** Custom headers */
|
|
160
|
+
headers?: Record<string, string>;
|
|
161
|
+
/** Request timeout in ms (default: 30000) */
|
|
162
|
+
timeout?: number;
|
|
163
|
+
/** Transform entries before sending */
|
|
164
|
+
transform?: (entries: LogEntry[]) => unknown;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* File transport configuration
|
|
168
|
+
*/
|
|
169
|
+
export interface FileTransportConfig extends BatchTransportConfig {
|
|
170
|
+
/** Log file path */
|
|
171
|
+
path: string;
|
|
172
|
+
/** Maximum file size in bytes before rotation (default: 10MB) */
|
|
173
|
+
maxSize?: number;
|
|
174
|
+
/** Maximum number of rotated files to keep (default: 5) */
|
|
175
|
+
maxFiles?: number;
|
|
176
|
+
/** Compress rotated files with gzip (default: false) */
|
|
177
|
+
compress?: boolean;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Datadog transport configuration
|
|
181
|
+
*/
|
|
182
|
+
export interface DatadogTransportConfig extends BatchTransportConfig {
|
|
183
|
+
/** Datadog API key */
|
|
184
|
+
apiKey: string;
|
|
185
|
+
/** Datadog site (default: datadoghq.com) */
|
|
186
|
+
site?: 'datadoghq.com' | 'datadoghq.eu' | 'us3.datadoghq.com' | 'us5.datadoghq.com';
|
|
187
|
+
/** Service name for logs */
|
|
188
|
+
service?: string;
|
|
189
|
+
/** Log source identifier */
|
|
190
|
+
source?: string;
|
|
191
|
+
/** Additional tags */
|
|
192
|
+
tags?: string[];
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Logger interface
|
|
196
|
+
*/
|
|
197
|
+
export interface Logger {
|
|
198
|
+
trace(message: string, metadata?: LogMetadata): void;
|
|
199
|
+
trace(...args: unknown[]): void;
|
|
200
|
+
debug(message: string, metadata?: LogMetadata): void;
|
|
201
|
+
debug(...args: unknown[]): void;
|
|
202
|
+
info(message: string, metadata?: LogMetadata): void;
|
|
203
|
+
info(...args: unknown[]): void;
|
|
204
|
+
warn(message: string, metadata?: LogMetadata): void;
|
|
205
|
+
warn(...args: unknown[]): void;
|
|
206
|
+
error(message: string, metadata?: LogMetadata): void;
|
|
207
|
+
error(...args: unknown[]): void;
|
|
208
|
+
child(namespace: string, config?: Partial<LoggerConfig>): Logger;
|
|
209
|
+
setLevel(level: LogLevel): void;
|
|
210
|
+
getLevel(): LogLevel;
|
|
211
|
+
enable(): void;
|
|
212
|
+
disable(): void;
|
|
213
|
+
isEnabled(): boolean;
|
|
214
|
+
flush(): Promise<void>;
|
|
215
|
+
/** Add a transport to the logger */
|
|
216
|
+
addTransport(transport: Transport): void;
|
|
217
|
+
/** Remove a transport by name */
|
|
218
|
+
removeTransport(name: string): boolean;
|
|
219
|
+
/** Get all registered transports */
|
|
220
|
+
getTransports(): readonly Transport[];
|
|
221
|
+
/** Destroy all transports (call on shutdown) */
|
|
222
|
+
destroy(): Promise<void>;
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circular buffer configuration
|
|
3
|
+
*/
|
|
4
|
+
export interface CircularBufferConfig {
|
|
5
|
+
maxSize: number;
|
|
6
|
+
onDrop?: (items: unknown[]) => void;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* A memory-safe circular buffer for storing log entries
|
|
10
|
+
*/
|
|
11
|
+
export declare class CircularBuffer<T> {
|
|
12
|
+
private buffer;
|
|
13
|
+
private head;
|
|
14
|
+
private tail;
|
|
15
|
+
private count;
|
|
16
|
+
private dropped;
|
|
17
|
+
private readonly maxSize;
|
|
18
|
+
private readonly onDrop?;
|
|
19
|
+
constructor(config: CircularBufferConfig);
|
|
20
|
+
/**
|
|
21
|
+
* Add an item to the buffer
|
|
22
|
+
*/
|
|
23
|
+
push(item: T): void;
|
|
24
|
+
/**
|
|
25
|
+
* Remove and return the oldest item
|
|
26
|
+
*/
|
|
27
|
+
shift(): T | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Get the oldest item without removing
|
|
30
|
+
*/
|
|
31
|
+
peek(): T | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* Convert buffer to array (oldest first)
|
|
34
|
+
*/
|
|
35
|
+
toArray(): T[];
|
|
36
|
+
/**
|
|
37
|
+
* Clear the buffer
|
|
38
|
+
*/
|
|
39
|
+
clear(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Get current size
|
|
42
|
+
*/
|
|
43
|
+
get size(): number;
|
|
44
|
+
/**
|
|
45
|
+
* Get dropped count
|
|
46
|
+
*/
|
|
47
|
+
get droppedCount(): number;
|
|
48
|
+
/**
|
|
49
|
+
* Check if buffer is full
|
|
50
|
+
*/
|
|
51
|
+
get isFull(): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Get buffer statistics
|
|
54
|
+
*/
|
|
55
|
+
getStats(): {
|
|
56
|
+
size: number;
|
|
57
|
+
maxSize: number;
|
|
58
|
+
dropped: number;
|
|
59
|
+
utilization: number;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=buffer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buffer.d.ts","sourceRoot":"","sources":["../../src/utils/buffer.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;CACnC;AAED;;GAEG;AACH,qBAAa,cAAc,CAAC,CAAC;IAC5B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,IAAI,CAAI;IAChB,OAAO,CAAC,IAAI,CAAI;IAChB,OAAO,CAAC,KAAK,CAAI;IACjB,OAAO,CAAC,OAAO,CAAI;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAsB;gBAElC,MAAM,EAAE,oBAAoB;IAMxC;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAiBnB;;OAEG;IACH,KAAK,IAAI,CAAC,GAAG,SAAS;IAWtB;;OAEG;IACH,IAAI,IAAI,CAAC,GAAG,SAAS;IAKrB;;OAEG;IACH,OAAO,IAAI,CAAC,EAAE;IAad;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED;;OAEG;IACH,QAAQ,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;CAQnF"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A memory-safe circular buffer for storing log entries
|
|
3
|
+
*/
|
|
4
|
+
export class CircularBuffer {
|
|
5
|
+
buffer;
|
|
6
|
+
head = 0;
|
|
7
|
+
tail = 0;
|
|
8
|
+
count = 0;
|
|
9
|
+
dropped = 0;
|
|
10
|
+
maxSize;
|
|
11
|
+
onDrop;
|
|
12
|
+
constructor(config) {
|
|
13
|
+
this.maxSize = config.maxSize;
|
|
14
|
+
this.buffer = new Array(config.maxSize);
|
|
15
|
+
this.onDrop = config.onDrop;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Add an item to the buffer
|
|
19
|
+
*/
|
|
20
|
+
push(item) {
|
|
21
|
+
if (this.count === this.maxSize) {
|
|
22
|
+
// Buffer full, drop oldest
|
|
23
|
+
const dropped = this.buffer[this.head];
|
|
24
|
+
if (dropped !== undefined && this.onDrop) {
|
|
25
|
+
this.onDrop([dropped]);
|
|
26
|
+
}
|
|
27
|
+
this.head = (this.head + 1) % this.maxSize;
|
|
28
|
+
this.dropped++;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
this.count++;
|
|
32
|
+
}
|
|
33
|
+
this.buffer[this.tail] = item;
|
|
34
|
+
this.tail = (this.tail + 1) % this.maxSize;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Remove and return the oldest item
|
|
38
|
+
*/
|
|
39
|
+
shift() {
|
|
40
|
+
if (this.count === 0)
|
|
41
|
+
return undefined;
|
|
42
|
+
const item = this.buffer[this.head];
|
|
43
|
+
this.buffer[this.head] = undefined;
|
|
44
|
+
this.head = (this.head + 1) % this.maxSize;
|
|
45
|
+
this.count--;
|
|
46
|
+
return item;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get the oldest item without removing
|
|
50
|
+
*/
|
|
51
|
+
peek() {
|
|
52
|
+
if (this.count === 0)
|
|
53
|
+
return undefined;
|
|
54
|
+
return this.buffer[this.head];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Convert buffer to array (oldest first)
|
|
58
|
+
*/
|
|
59
|
+
toArray() {
|
|
60
|
+
const result = [];
|
|
61
|
+
let index = this.head;
|
|
62
|
+
for (let i = 0; i < this.count; i++) {
|
|
63
|
+
const item = this.buffer[index];
|
|
64
|
+
if (item !== undefined) {
|
|
65
|
+
result.push(item);
|
|
66
|
+
}
|
|
67
|
+
index = (index + 1) % this.maxSize;
|
|
68
|
+
}
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Clear the buffer
|
|
73
|
+
*/
|
|
74
|
+
clear() {
|
|
75
|
+
this.buffer = new Array(this.maxSize);
|
|
76
|
+
this.head = 0;
|
|
77
|
+
this.tail = 0;
|
|
78
|
+
this.count = 0;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get current size
|
|
82
|
+
*/
|
|
83
|
+
get size() {
|
|
84
|
+
return this.count;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get dropped count
|
|
88
|
+
*/
|
|
89
|
+
get droppedCount() {
|
|
90
|
+
return this.dropped;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Check if buffer is full
|
|
94
|
+
*/
|
|
95
|
+
get isFull() {
|
|
96
|
+
return this.count === this.maxSize;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get buffer statistics
|
|
100
|
+
*/
|
|
101
|
+
getStats() {
|
|
102
|
+
return {
|
|
103
|
+
size: this.count,
|
|
104
|
+
maxSize: this.maxSize,
|
|
105
|
+
dropped: this.dropped,
|
|
106
|
+
utilization: this.count / this.maxSize,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=buffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buffer.js","sourceRoot":"","sources":["../../src/utils/buffer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SerializedError } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Check if a value is an Error or error-like object
|
|
4
|
+
*/
|
|
5
|
+
export declare function isError(value: unknown): value is Error;
|
|
6
|
+
/**
|
|
7
|
+
* Serialize an error object with cause chain support
|
|
8
|
+
*/
|
|
9
|
+
export declare function serializeError(error: unknown, depth?: number): SerializedError | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Extract error message from any value
|
|
12
|
+
*/
|
|
13
|
+
export declare function getErrorMessage(error: unknown): string;
|
|
14
|
+
//# sourceMappingURL=error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/utils/error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAqB/C;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,CAQtD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,SAAI,GAAG,eAAe,GAAG,SAAS,CAkDrF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQtD"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maximum depth for error cause chain traversal
|
|
3
|
+
*/
|
|
4
|
+
const MAX_DEPTH = 10;
|
|
5
|
+
/**
|
|
6
|
+
* Properties to extract from error objects
|
|
7
|
+
*/
|
|
8
|
+
const ERROR_PROPERTIES = [
|
|
9
|
+
'code',
|
|
10
|
+
'statusCode',
|
|
11
|
+
'status',
|
|
12
|
+
'errno',
|
|
13
|
+
'syscall',
|
|
14
|
+
'path',
|
|
15
|
+
'address',
|
|
16
|
+
'port',
|
|
17
|
+
];
|
|
18
|
+
/**
|
|
19
|
+
* Check if a value is an Error or error-like object
|
|
20
|
+
*/
|
|
21
|
+
export function isError(value) {
|
|
22
|
+
return (value instanceof Error ||
|
|
23
|
+
(typeof value === 'object' &&
|
|
24
|
+
value !== null &&
|
|
25
|
+
'message' in value &&
|
|
26
|
+
typeof value.message === 'string'));
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Serialize an error object with cause chain support
|
|
30
|
+
*/
|
|
31
|
+
export function serializeError(error, depth = 0) {
|
|
32
|
+
if (depth > MAX_DEPTH)
|
|
33
|
+
return undefined;
|
|
34
|
+
if (!error)
|
|
35
|
+
return undefined;
|
|
36
|
+
// Handle Error instances
|
|
37
|
+
if (error instanceof Error) {
|
|
38
|
+
const serialized = {
|
|
39
|
+
name: error.name,
|
|
40
|
+
message: error.message,
|
|
41
|
+
stack: error.stack,
|
|
42
|
+
};
|
|
43
|
+
// Extract additional properties
|
|
44
|
+
const errorObj = error;
|
|
45
|
+
for (const prop of ERROR_PROPERTIES) {
|
|
46
|
+
const value = errorObj[prop];
|
|
47
|
+
if (value !== undefined && (typeof value === 'string' || typeof value === 'number')) {
|
|
48
|
+
serialized[prop] = value;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Handle cause chain (ES2022)
|
|
52
|
+
if ('cause' in error && error.cause) {
|
|
53
|
+
serialized.cause = serializeError(error.cause, depth + 1);
|
|
54
|
+
}
|
|
55
|
+
return serialized;
|
|
56
|
+
}
|
|
57
|
+
// Handle error-like objects
|
|
58
|
+
if (typeof error === 'object' && error !== null) {
|
|
59
|
+
const obj = error;
|
|
60
|
+
if (typeof obj.message === 'string') {
|
|
61
|
+
return {
|
|
62
|
+
name: obj.name ?? 'Error',
|
|
63
|
+
message: obj.message,
|
|
64
|
+
stack: obj.stack,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Handle strings
|
|
69
|
+
if (typeof error === 'string') {
|
|
70
|
+
return {
|
|
71
|
+
name: 'Error',
|
|
72
|
+
message: error,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Extract error message from any value
|
|
79
|
+
*/
|
|
80
|
+
export function getErrorMessage(error) {
|
|
81
|
+
if (error instanceof Error)
|
|
82
|
+
return error.message;
|
|
83
|
+
if (typeof error === 'string')
|
|
84
|
+
return error;
|
|
85
|
+
if (typeof error === 'object' && error !== null) {
|
|
86
|
+
const obj = error;
|
|
87
|
+
if (typeof obj.message === 'string')
|
|
88
|
+
return obj.message;
|
|
89
|
+
}
|
|
90
|
+
return String(error);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/utils/error.ts"],"names":[],"mappings":"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"}
|