vestig 0.11.4 → 0.13.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 (89) hide show
  1. package/README.md +95 -2
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +4 -0
  4. package/dist/config.js.map +1 -1
  5. package/dist/index.d.ts +9 -2
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +7 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/logger.d.ts +85 -0
  10. package/dist/logger.d.ts.map +1 -1
  11. package/dist/logger.js +209 -2
  12. package/dist/logger.js.map +1 -1
  13. package/dist/metrics/index.d.ts +2 -0
  14. package/dist/metrics/index.d.ts.map +1 -0
  15. package/dist/metrics/index.js +2 -0
  16. package/dist/metrics/index.js.map +1 -0
  17. package/dist/metrics/prometheus.d.ts +109 -0
  18. package/dist/metrics/prometheus.d.ts.map +1 -0
  19. package/dist/metrics/prometheus.js +162 -0
  20. package/dist/metrics/prometheus.js.map +1 -0
  21. package/dist/sampling/index.d.ts +2 -0
  22. package/dist/sampling/index.d.ts.map +1 -1
  23. package/dist/sampling/index.js +2 -0
  24. package/dist/sampling/index.js.map +1 -1
  25. package/dist/sampling/tail.d.ts +76 -0
  26. package/dist/sampling/tail.d.ts.map +1 -0
  27. package/dist/sampling/tail.js +138 -0
  28. package/dist/sampling/tail.js.map +1 -0
  29. package/dist/transports/batch.d.ts +2 -0
  30. package/dist/transports/batch.d.ts.map +1 -1
  31. package/dist/transports/batch.js +13 -3
  32. package/dist/transports/batch.js.map +1 -1
  33. package/dist/transports/file.d.ts +14 -1
  34. package/dist/transports/file.d.ts.map +1 -1
  35. package/dist/transports/file.js +59 -4
  36. package/dist/transports/file.js.map +1 -1
  37. package/dist/transports/http.d.ts +29 -1
  38. package/dist/transports/http.d.ts.map +1 -1
  39. package/dist/transports/http.js +63 -6
  40. package/dist/transports/http.js.map +1 -1
  41. package/dist/transports/sentry.d.ts +83 -0
  42. package/dist/transports/sentry.d.ts.map +1 -0
  43. package/dist/transports/sentry.js +283 -0
  44. package/dist/transports/sentry.js.map +1 -0
  45. package/dist/types.d.ts +149 -2
  46. package/dist/types.d.ts.map +1 -1
  47. package/dist/utils/buffer.d.ts +33 -1
  48. package/dist/utils/buffer.d.ts.map +1 -1
  49. package/dist/utils/buffer.js +40 -2
  50. package/dist/utils/buffer.js.map +1 -1
  51. package/dist/utils/dedupe.d.ts +80 -0
  52. package/dist/utils/dedupe.d.ts.map +1 -0
  53. package/dist/utils/dedupe.js +173 -0
  54. package/dist/utils/dedupe.js.map +1 -0
  55. package/dist/utils/sanitize.d.ts +23 -1
  56. package/dist/utils/sanitize.d.ts.map +1 -1
  57. package/dist/utils/sanitize.js +113 -8
  58. package/dist/utils/sanitize.js.map +1 -1
  59. package/dist/version.d.ts +1 -1
  60. package/dist/version.js +1 -1
  61. package/dist/wide-events/builder.d.ts +51 -0
  62. package/dist/wide-events/builder.d.ts.map +1 -0
  63. package/dist/wide-events/builder.js +177 -0
  64. package/dist/wide-events/builder.js.map +1 -0
  65. package/dist/wide-events/context.d.ts +57 -0
  66. package/dist/wide-events/context.d.ts.map +1 -0
  67. package/dist/wide-events/context.js +148 -0
  68. package/dist/wide-events/context.js.map +1 -0
  69. package/dist/wide-events/index.d.ts +6 -0
  70. package/dist/wide-events/index.d.ts.map +1 -0
  71. package/dist/wide-events/index.js +7 -0
  72. package/dist/wide-events/index.js.map +1 -0
  73. package/dist/wide-events/schemas/http.d.ts +179 -0
  74. package/dist/wide-events/schemas/http.d.ts.map +1 -0
  75. package/dist/wide-events/schemas/http.js +25 -0
  76. package/dist/wide-events/schemas/http.js.map +1 -0
  77. package/dist/wide-events/schemas/index.d.ts +5 -0
  78. package/dist/wide-events/schemas/index.d.ts.map +1 -0
  79. package/dist/wide-events/schemas/index.js +5 -0
  80. package/dist/wide-events/schemas/index.js.map +1 -0
  81. package/dist/wide-events/schemas/job.d.ts +130 -0
  82. package/dist/wide-events/schemas/job.d.ts.map +1 -0
  83. package/dist/wide-events/schemas/job.js +27 -0
  84. package/dist/wide-events/schemas/job.js.map +1 -0
  85. package/dist/wide-events/types.d.ts +216 -0
  86. package/dist/wide-events/types.d.ts.map +1 -0
  87. package/dist/wide-events/types.js +2 -0
  88. package/dist/wide-events/types.js.map +1 -0
  89. package/package.json +1 -1
@@ -0,0 +1,283 @@
1
+ import { BatchTransport } from './batch';
2
+ /**
3
+ * Sentry severity level mapping from vestig log levels
4
+ */
5
+ const SENTRY_LEVELS = {
6
+ trace: 'debug',
7
+ debug: 'debug',
8
+ info: 'info',
9
+ warn: 'warning',
10
+ error: 'error',
11
+ };
12
+ /**
13
+ * Sentry log level priority for filtering
14
+ */
15
+ const LEVEL_PRIORITY = {
16
+ trace: 0,
17
+ debug: 1,
18
+ info: 2,
19
+ warn: 3,
20
+ error: 4,
21
+ };
22
+ /**
23
+ * Sentry transport for sending logs to Sentry
24
+ *
25
+ * Maps vestig log entries to Sentry events and sends them via
26
+ * Sentry's Store API. Supports environments, releases, tags,
27
+ * and automatic error extraction.
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * const transport = new SentryTransport({
32
+ * name: 'sentry',
33
+ * dsn: process.env.SENTRY_DSN,
34
+ * environment: 'production',
35
+ * release: 'my-app@1.2.3',
36
+ * tags: { team: 'backend' },
37
+ * })
38
+ *
39
+ * logger.addTransport(transport)
40
+ * logger.error('Database connection failed', { host: 'db-1' })
41
+ * ```
42
+ */
43
+ export class SentryTransport extends BatchTransport {
44
+ name;
45
+ parsedDSN;
46
+ environment;
47
+ release;
48
+ service;
49
+ serverName;
50
+ tags;
51
+ minLevel;
52
+ constructor(config) {
53
+ super({
54
+ ...config,
55
+ name: config.name ?? 'sentry',
56
+ // Sentry recommends smaller batches for real-time alerting
57
+ batchSize: config.batchSize ?? 10,
58
+ flushInterval: config.flushInterval ?? 2000,
59
+ });
60
+ this.name = config.name ?? 'sentry';
61
+ this.parsedDSN = this.parseDSN(config.dsn);
62
+ this.environment = config.environment;
63
+ this.release = config.release;
64
+ this.service = config.service;
65
+ this.serverName = config.serverName;
66
+ this.tags = config.tags;
67
+ this.minLevel = config.minLevel ?? 'warn';
68
+ }
69
+ /**
70
+ * Parse Sentry DSN into components
71
+ */
72
+ parseDSN(dsn) {
73
+ try {
74
+ const url = new URL(dsn);
75
+ const publicKey = url.username;
76
+ const host = url.host;
77
+ const projectId = url.pathname.slice(1); // Remove leading slash
78
+ if (!publicKey || !projectId) {
79
+ throw new Error('Invalid DSN format');
80
+ }
81
+ return { publicKey, host, projectId };
82
+ }
83
+ catch {
84
+ throw new SentryTransportError(`Invalid Sentry DSN: ${dsn}`, 0);
85
+ }
86
+ }
87
+ /**
88
+ * Build the Sentry store API URL
89
+ */
90
+ getStoreUrl() {
91
+ const { host, projectId } = this.parsedDSN;
92
+ return `https://${host}/api/${projectId}/store/`;
93
+ }
94
+ /**
95
+ * Check if a log entry should be sent based on minimum level
96
+ */
97
+ shouldSend(entry) {
98
+ return LEVEL_PRIORITY[entry.level] >= LEVEL_PRIORITY[this.minLevel];
99
+ }
100
+ /**
101
+ * Send entries to Sentry
102
+ */
103
+ async send(entries) {
104
+ // Filter entries by minimum level
105
+ const filteredEntries = entries.filter((e) => this.shouldSend(e));
106
+ if (filteredEntries.length === 0) {
107
+ return;
108
+ }
109
+ // Send each entry as a separate event (Sentry doesn't batch well)
110
+ const promises = filteredEntries.map((entry) => this.sendEvent(entry));
111
+ const results = await Promise.allSettled(promises);
112
+ // Check for failures
113
+ const failures = results.filter((r) => r.status === 'rejected');
114
+ if (failures.length > 0) {
115
+ const firstError = failures[0].reason;
116
+ throw firstError;
117
+ }
118
+ }
119
+ /**
120
+ * Send a single event to Sentry
121
+ */
122
+ async sendEvent(entry) {
123
+ const event = this.transformEntry(entry);
124
+ const url = this.getStoreUrl();
125
+ const response = await fetch(url, {
126
+ method: 'POST',
127
+ headers: {
128
+ 'Content-Type': 'application/json',
129
+ 'X-Sentry-Auth': this.buildAuthHeader(),
130
+ },
131
+ body: JSON.stringify(event),
132
+ });
133
+ if (!response.ok) {
134
+ throw new SentryTransportError(`Sentry API error: ${response.status} ${response.statusText}`, response.status, await this.safeReadBody(response));
135
+ }
136
+ }
137
+ /**
138
+ * Build Sentry authentication header
139
+ */
140
+ buildAuthHeader() {
141
+ const { publicKey } = this.parsedDSN;
142
+ const timestamp = Math.floor(Date.now() / 1000);
143
+ return [
144
+ 'Sentry sentry_version=7',
145
+ `sentry_timestamp=${timestamp}`,
146
+ `sentry_key=${publicKey}`,
147
+ 'sentry_client=vestig/1.0.0',
148
+ ].join(', ');
149
+ }
150
+ /**
151
+ * Transform a log entry to Sentry event format
152
+ */
153
+ transformEntry(entry) {
154
+ const event = {
155
+ event_id: this.generateEventId(),
156
+ timestamp: entry.timestamp,
157
+ platform: 'node',
158
+ level: SENTRY_LEVELS[entry.level],
159
+ logger: entry.namespace ?? 'vestig',
160
+ message: {
161
+ formatted: entry.message,
162
+ },
163
+ };
164
+ // Add environment
165
+ if (this.environment) {
166
+ event.environment = this.environment;
167
+ }
168
+ // Add release
169
+ if (this.release) {
170
+ event.release = this.release;
171
+ }
172
+ // Add server name
173
+ if (this.serverName) {
174
+ event.server_name = this.serverName;
175
+ }
176
+ // Build tags
177
+ const tags = {
178
+ runtime: entry.runtime,
179
+ ...(this.tags ?? {}),
180
+ };
181
+ if (this.service) {
182
+ tags.service = this.service;
183
+ }
184
+ if (entry.namespace) {
185
+ tags.namespace = entry.namespace;
186
+ }
187
+ event.tags = tags;
188
+ // Add extra context from metadata
189
+ if (entry.metadata || entry.context) {
190
+ event.extra = {
191
+ ...entry.metadata,
192
+ ...entry.context,
193
+ };
194
+ }
195
+ // Add error information as exception
196
+ if (entry.error) {
197
+ event.exception = {
198
+ values: [
199
+ {
200
+ type: entry.error.name,
201
+ value: entry.error.message,
202
+ stacktrace: entry.error.stack
203
+ ? { frames: this.parseStackTrace(entry.error.stack) }
204
+ : undefined,
205
+ },
206
+ ],
207
+ };
208
+ }
209
+ // Add trace context if available
210
+ if (entry.context?.traceId) {
211
+ event.contexts = {
212
+ trace: {
213
+ trace_id: String(entry.context.traceId),
214
+ span_id: entry.context.spanId ? String(entry.context.spanId) : undefined,
215
+ },
216
+ };
217
+ }
218
+ return event;
219
+ }
220
+ /**
221
+ * Generate a random event ID (32 hex chars)
222
+ */
223
+ generateEventId() {
224
+ const bytes = new Uint8Array(16);
225
+ if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
226
+ crypto.getRandomValues(bytes);
227
+ }
228
+ else {
229
+ // Fallback for environments without crypto
230
+ for (let i = 0; i < bytes.length; i++) {
231
+ bytes[i] = Math.floor(Math.random() * 256);
232
+ }
233
+ }
234
+ return Array.from(bytes)
235
+ .map((b) => b.toString(16).padStart(2, '0'))
236
+ .join('');
237
+ }
238
+ /**
239
+ * Parse stack trace into Sentry frame format
240
+ */
241
+ parseStackTrace(stack) {
242
+ const lines = stack.split('\n').slice(1); // Skip first line (error message)
243
+ const frames = [];
244
+ for (const line of lines) {
245
+ const match = line.match(/^\s*at\s+(?:(.+?)\s+\()?(.+?):(\d+):(\d+)\)?/);
246
+ if (match?.[2] && match[3] && match[4]) {
247
+ frames.push({
248
+ function: match[1] || '<anonymous>',
249
+ filename: match[2],
250
+ lineno: Number.parseInt(match[3], 10),
251
+ colno: Number.parseInt(match[4], 10),
252
+ });
253
+ }
254
+ }
255
+ // Sentry expects frames in reverse order (most recent last)
256
+ return frames.reverse();
257
+ }
258
+ /**
259
+ * Safely read response body for error messages
260
+ */
261
+ async safeReadBody(response) {
262
+ try {
263
+ return await response.text();
264
+ }
265
+ catch {
266
+ return undefined;
267
+ }
268
+ }
269
+ }
270
+ /**
271
+ * Custom error for Sentry transport failures
272
+ */
273
+ export class SentryTransportError extends Error {
274
+ statusCode;
275
+ responseBody;
276
+ constructor(message, statusCode, responseBody) {
277
+ super(message);
278
+ this.statusCode = statusCode;
279
+ this.responseBody = responseBody;
280
+ this.name = 'SentryTransportError';
281
+ }
282
+ }
283
+ //# sourceMappingURL=sentry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentry.js","sourceRoot":"","sources":["../../src/transports/sentry.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -87,6 +87,44 @@ export interface SanitizeConfig {
87
87
  */
88
88
  export type SanitizePreset = 'none' | 'minimal' | 'default' | 'gdpr' | 'hipaa' | 'pci-dss';
89
89
  export type { NamespaceSamplerConfig, ProbabilitySamplerConfig, RateLimitSamplerConfig, Sampler, SamplerConfig, SamplingConfig, } from './sampling/types';
90
+ /**
91
+ * Duplicate log suppression configuration
92
+ *
93
+ * When enabled, identical logs within a time window are suppressed.
94
+ * A summary log is emitted when the window expires showing how many
95
+ * duplicates were suppressed.
96
+ */
97
+ export interface DedupeConfig {
98
+ /**
99
+ * Enable duplicate suppression (default: true when config provided)
100
+ */
101
+ enabled?: boolean;
102
+ /**
103
+ * Time window in milliseconds for suppression (default: 1000)
104
+ *
105
+ * Logs with the same signature within this window are deduplicated.
106
+ */
107
+ windowMs?: number;
108
+ /**
109
+ * Maximum unique log signatures to track (default: 1000)
110
+ *
111
+ * When exceeded, oldest entries are evicted. This prevents
112
+ * unbounded memory growth from unique log messages.
113
+ */
114
+ maxSize?: number;
115
+ /**
116
+ * Include level in deduplication key (default: true)
117
+ *
118
+ * When true, same message at different levels are treated as different.
119
+ */
120
+ includeLevel?: boolean;
121
+ /**
122
+ * Include namespace in deduplication key (default: true)
123
+ *
124
+ * When true, same message from different namespaces are treated as different.
125
+ */
126
+ includeNamespace?: boolean;
127
+ }
90
128
  /**
91
129
  * Logger configuration options
92
130
  */
@@ -132,13 +170,66 @@ export interface LoggerConfig {
132
170
  * ```
133
171
  */
134
172
  sampling?: import('./sampling/types').SamplingConfig;
173
+ /**
174
+ * Duplicate log suppression configuration.
175
+ *
176
+ * Prevents flooding from identical repeated log messages.
177
+ *
178
+ * @example
179
+ * ```typescript
180
+ * // Suppress duplicates within 1 second (default)
181
+ * createLogger({ dedupe: { enabled: true } })
182
+ *
183
+ * // Custom window and size
184
+ * createLogger({
185
+ * dedupe: {
186
+ * enabled: true,
187
+ * windowMs: 5000, // 5 second window
188
+ * maxSize: 500 // Track up to 500 unique messages
189
+ * }
190
+ * })
191
+ * ```
192
+ */
193
+ dedupe?: DedupeConfig;
194
+ /**
195
+ * Tail sampling configuration for wide events.
196
+ *
197
+ * Tail sampling decides AFTER an operation completes whether to keep it,
198
+ * enabling 100% retention of errors/slow requests while sampling success.
199
+ *
200
+ * @example
201
+ * ```typescript
202
+ * // Keep all errors, sample 10% of successful requests
203
+ * createLogger({
204
+ * tailSampling: {
205
+ * enabled: true,
206
+ * alwaysKeepStatuses: ['error'],
207
+ * slowThresholdMs: 2000,
208
+ * successSampleRate: 0.1,
209
+ * }
210
+ * })
211
+ *
212
+ * // VIP users get 100% sampling
213
+ * createLogger({
214
+ * tailSampling: {
215
+ * enabled: true,
216
+ * vipUserIds: ['user-123', 'user-456'],
217
+ * vipTiers: ['enterprise', 'premium'],
218
+ * successSampleRate: 0.1,
219
+ * }
220
+ * })
221
+ * ```
222
+ */
223
+ tailSampling?: import('./wide-events/types').TailSamplingConfig;
135
224
  }
136
225
  /**
137
226
  * Resolved logger configuration with all required fields populated.
138
- * Note: `sampling` remains optional as it's disabled by default.
227
+ * Note: `sampling`, `dedupe`, and `tailSampling` remain optional as they're disabled by default.
139
228
  */
140
- export type ResolvedLoggerConfig = Required<Omit<LoggerConfig, 'sampling'>> & {
229
+ export type ResolvedLoggerConfig = Required<Omit<LoggerConfig, 'sampling' | 'dedupe' | 'tailSampling'>> & {
141
230
  sampling?: import('./sampling/types').SamplingConfig;
231
+ dedupe?: DedupeConfig;
232
+ tailSampling?: import('./wide-events/types').TailSamplingConfig;
142
233
  };
143
234
  /**
144
235
  * Base transport configuration
@@ -197,7 +288,17 @@ export interface HTTPTransportConfig extends BatchTransportConfig {
197
288
  timeout?: number;
198
289
  /** Transform entries before sending */
199
290
  transform?: (entries: LogEntry[]) => unknown;
291
+ /**
292
+ * Enable keep-alive connections (default: true).
293
+ * When true, adds Connection: keep-alive header and enables
294
+ * the fetch keepalive option for browser page-unload scenarios.
295
+ */
296
+ keepAlive?: boolean;
200
297
  }
298
+ /**
299
+ * Rotation interval for time-based log rotation
300
+ */
301
+ export type RotationInterval = 'hourly' | 'daily' | 'weekly' | 'none';
201
302
  /**
202
303
  * File transport configuration
203
304
  */
@@ -210,6 +311,8 @@ export interface FileTransportConfig extends BatchTransportConfig {
210
311
  maxFiles?: number;
211
312
  /** Compress rotated files with gzip (default: false) */
212
313
  compress?: boolean;
314
+ /** Time-based rotation interval (default: 'none' - only size-based rotation) */
315
+ rotateInterval?: RotationInterval;
213
316
  }
214
317
  /**
215
318
  * Datadog transport configuration
@@ -226,6 +329,31 @@ export interface DatadogTransportConfig extends BatchTransportConfig {
226
329
  /** Additional tags */
227
330
  tags?: string[];
228
331
  }
332
+ /**
333
+ * Sentry transport configuration
334
+ */
335
+ export interface SentryTransportConfig extends BatchTransportConfig {
336
+ /**
337
+ * Sentry DSN (Data Source Name)
338
+ * @example "https://abc123@o123456.ingest.sentry.io/1234567"
339
+ */
340
+ dsn: string;
341
+ /** Environment name (e.g., 'production', 'staging') */
342
+ environment?: string;
343
+ /** Application release/version */
344
+ release?: string;
345
+ /** Service name (added as 'service' tag) */
346
+ service?: string;
347
+ /** Server name or hostname */
348
+ serverName?: string;
349
+ /** Additional tags (key-value pairs) */
350
+ tags?: Record<string, string>;
351
+ /**
352
+ * Minimum log level to send to Sentry (default: 'warn')
353
+ * Lower levels (trace, debug, info) are typically too verbose for Sentry
354
+ */
355
+ minLevel?: LogLevel;
356
+ }
229
357
  export type { Span, SpanCallback, SpanEvent, SpanOptions, SpanStatus, SpanSyncCallback, } from './tracing/types';
230
358
  /**
231
359
  * Logger interface
@@ -276,5 +404,24 @@ export interface Logger {
276
404
  * @returns The result of the function
277
405
  */
278
406
  spanSync<T>(name: string, fn: import('./tracing/types').SpanSyncCallback<T>, options?: import('./tracing/types').SpanOptions): T;
407
+ /**
408
+ * Emit a completed wide event through the logger's transports.
409
+ *
410
+ * Wide events are comprehensive, single-event records of complete
411
+ * operations (like HTTP requests or background jobs). They contain
412
+ * all relevant context for debugging and observability.
413
+ *
414
+ * @param event - The completed WideEvent to emit
415
+ *
416
+ * @example
417
+ * ```typescript
418
+ * const builder = createWideEvent({ type: 'http.request' });
419
+ * builder.set('http', 'method', 'POST');
420
+ * builder.set('user', 'id', userId);
421
+ * const wideEvent = builder.end({ status: 'success' });
422
+ * logger.emitWideEvent(wideEvent);
423
+ * ```
424
+ */
425
+ emitWideEvent(event: import('./wide-events/types').WideEvent): void;
279
426
  }
280
427
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -7,8 +7,10 @@ export interface CircularBufferConfig {
7
7
  }
8
8
  /**
9
9
  * A memory-safe circular buffer for storing log entries
10
+ *
11
+ * Implements the Iterable protocol for use with for...of loops
10
12
  */
11
- export declare class CircularBuffer<T> {
13
+ export declare class CircularBuffer<T> implements Iterable<T> {
12
14
  private buffer;
13
15
  private head;
14
16
  private tail;
@@ -33,6 +35,36 @@ export declare class CircularBuffer<T> {
33
35
  * Convert buffer to array (oldest first)
34
36
  */
35
37
  toArray(): T[];
38
+ /**
39
+ * Iterator implementation for for...of loops
40
+ *
41
+ * Iterates from oldest to newest without removing items.
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * const buffer = new CircularBuffer<number>({ maxSize: 10 })
46
+ * buffer.push(1)
47
+ * buffer.push(2)
48
+ * buffer.push(3)
49
+ *
50
+ * for (const item of buffer) {
51
+ * console.log(item) // 1, 2, 3
52
+ * }
53
+ *
54
+ * // Spread operator
55
+ * const arr = [...buffer] // [1, 2, 3]
56
+ *
57
+ * // Array.from
58
+ * const arr2 = Array.from(buffer) // [1, 2, 3]
59
+ * ```
60
+ */
61
+ [Symbol.iterator](): Iterator<T>;
62
+ /**
63
+ * Returns an iterator over buffer values (oldest first)
64
+ *
65
+ * Alias for [Symbol.iterator]() for explicit usage.
66
+ */
67
+ values(): IterableIterator<T>;
36
68
  /**
37
69
  * Clear the buffer
38
70
  */
@@ -1 +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"}
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;;;;GAIG;AACH,qBAAa,cAAc,CAAC,CAAC,CAAE,YAAW,QAAQ,CAAC,CAAC,CAAC;IACpD,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;IAQd;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACF,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;IAWjC;;;;OAIG;IACH,MAAM,IAAI,gBAAgB,CAAC,CAAC,CAAC;IAI7B;;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"}
@@ -1,5 +1,7 @@
1
1
  /**
2
2
  * A memory-safe circular buffer for storing log entries
3
+ *
4
+ * Implements the Iterable protocol for use with for...of loops
3
5
  */
4
6
  export class CircularBuffer {
5
7
  buffer;
@@ -58,15 +60,51 @@ export class CircularBuffer {
58
60
  */
59
61
  toArray() {
60
62
  const result = [];
63
+ for (const item of this) {
64
+ result.push(item);
65
+ }
66
+ return result;
67
+ }
68
+ /**
69
+ * Iterator implementation for for...of loops
70
+ *
71
+ * Iterates from oldest to newest without removing items.
72
+ *
73
+ * @example
74
+ * ```typescript
75
+ * const buffer = new CircularBuffer<number>({ maxSize: 10 })
76
+ * buffer.push(1)
77
+ * buffer.push(2)
78
+ * buffer.push(3)
79
+ *
80
+ * for (const item of buffer) {
81
+ * console.log(item) // 1, 2, 3
82
+ * }
83
+ *
84
+ * // Spread operator
85
+ * const arr = [...buffer] // [1, 2, 3]
86
+ *
87
+ * // Array.from
88
+ * const arr2 = Array.from(buffer) // [1, 2, 3]
89
+ * ```
90
+ */
91
+ *[Symbol.iterator]() {
61
92
  let index = this.head;
62
93
  for (let i = 0; i < this.count; i++) {
63
94
  const item = this.buffer[index];
64
95
  if (item !== undefined) {
65
- result.push(item);
96
+ yield item;
66
97
  }
67
98
  index = (index + 1) % this.maxSize;
68
99
  }
69
- return result;
100
+ }
101
+ /**
102
+ * Returns an iterator over buffer values (oldest first)
103
+ *
104
+ * Alias for [Symbol.iterator]() for explicit usage.
105
+ */
106
+ values() {
107
+ return this[Symbol.iterator]();
70
108
  }
71
109
  /**
72
110
  * Clear the buffer
@@ -1 +1 @@
1
- {"version":3,"file":"buffer.js","sourceRoot":"","sources":["../../src/utils/buffer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"buffer.js","sourceRoot":"","sources":["../../src/utils/buffer.ts"],"names":[],"mappings":"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"}