@johnboxcodes/boxlogger 0.1.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.
@@ -0,0 +1,284 @@
1
+ /**
2
+ * Memory Store Provider
3
+ *
4
+ * In-memory storage implementation for development, testing, or ephemeral logging.
5
+ *
6
+ * @module stores/memory
7
+ * @packageDocumentation
8
+ */
9
+ import { BaseStoreProvider } from './base.js';
10
+ /**
11
+ * In-memory store provider
12
+ *
13
+ * @remarks
14
+ * Fast read/write operations with no persistence.
15
+ * Data is lost when the process exits.
16
+ * Ideal for testing, development, or caching scenarios.
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * import { MemoryStoreProvider } from '@nodelogger/core/memory';
21
+ *
22
+ * const store = new MemoryStoreProvider({ maxLogs: 5000 });
23
+ * await store.init();
24
+ *
25
+ * await store.saveLog({
26
+ * id: '1',
27
+ * timestamp: new Date().toISOString(),
28
+ * level: 'info',
29
+ * message: 'Hello world'
30
+ * });
31
+ * ```
32
+ */
33
+ export class MemoryStoreProvider extends BaseStoreProvider {
34
+ name = 'memory';
35
+ logs = [];
36
+ sessions = new Map();
37
+ constructor(config) {
38
+ super({
39
+ ...config,
40
+ maxLogs: config?.maxLogs ?? 10000,
41
+ maxSessions: config?.maxSessions ?? 1000,
42
+ });
43
+ }
44
+ /**
45
+ * Initialize the memory store
46
+ */
47
+ async init() {
48
+ this._ready = true;
49
+ this.startCleanupTimer();
50
+ }
51
+ /**
52
+ * Close the memory store and clear all data
53
+ */
54
+ async close() {
55
+ this.stopCleanupTimer();
56
+ this.logs = [];
57
+ this.sessions.clear();
58
+ this._ready = false;
59
+ }
60
+ // =========================================================================
61
+ // Log Operations
62
+ // =========================================================================
63
+ /**
64
+ * Save a log entry to memory
65
+ * @param entry - Log entry to save
66
+ */
67
+ async saveLog(entry) {
68
+ this.ensureReady();
69
+ const logEntry = {
70
+ ...entry,
71
+ id: entry.id || this.generateId(),
72
+ timestamp: entry.timestamp || this.now(),
73
+ };
74
+ this.logs.push(logEntry);
75
+ // Enforce max logs limit (FIFO eviction)
76
+ if (this.logs.length > this.config.maxLogs) {
77
+ this.logs = this.logs.slice(-this.config.maxLogs);
78
+ }
79
+ }
80
+ /**
81
+ * Get log entries matching filter
82
+ * @param filter - Query filter
83
+ * @returns Matching log entries
84
+ */
85
+ async getLogs(filter) {
86
+ this.ensureReady();
87
+ if (!filter) {
88
+ return this.logs.map((log) => this.clone(log));
89
+ }
90
+ return this.filterLogs(this.logs, filter).map((log) => this.clone(log));
91
+ }
92
+ /**
93
+ * Delete log entries matching filter
94
+ * @param filter - Query filter
95
+ * @returns Number of deleted entries
96
+ */
97
+ async deleteLogs(filter) {
98
+ this.ensureReady();
99
+ if (!filter) {
100
+ const count = this.logs.length;
101
+ this.logs = [];
102
+ return count;
103
+ }
104
+ const toDelete = new Set(this.filterLogs(this.logs, filter).map((l) => l.id));
105
+ const before = this.logs.length;
106
+ this.logs = this.logs.filter((log) => !toDelete.has(log.id));
107
+ return before - this.logs.length;
108
+ }
109
+ /**
110
+ * Count log entries matching filter
111
+ * @param filter - Query filter
112
+ * @returns Count of matching entries
113
+ */
114
+ async countLogs(filter) {
115
+ this.ensureReady();
116
+ if (!filter) {
117
+ return this.logs.length;
118
+ }
119
+ return this.filterLogs(this.logs, filter).length;
120
+ }
121
+ // =========================================================================
122
+ // Session Operations
123
+ // =========================================================================
124
+ /**
125
+ * Create a new session
126
+ * @param session - Session to create
127
+ */
128
+ async createSession(session) {
129
+ this.ensureReady();
130
+ const sessionEntry = {
131
+ ...session,
132
+ id: session.id || this.generateId(),
133
+ startedAt: session.startedAt || this.now(),
134
+ status: session.status || 'active',
135
+ errorCount: session.errorCount || 0,
136
+ };
137
+ this.sessions.set(sessionEntry.id, sessionEntry);
138
+ // Enforce max sessions limit
139
+ if (this.sessions.size > this.config.maxSessions) {
140
+ const sorted = Array.from(this.sessions.values()).sort((a, b) => this.parseTimestamp(a.startedAt).getTime() -
141
+ this.parseTimestamp(b.startedAt).getTime());
142
+ const toRemove = sorted.slice(0, this.sessions.size - this.config.maxSessions);
143
+ for (const s of toRemove) {
144
+ this.sessions.delete(s.id);
145
+ }
146
+ }
147
+ }
148
+ /**
149
+ * Update an existing session
150
+ * @param sessionId - Session ID
151
+ * @param updates - Partial session data
152
+ */
153
+ async updateSession(sessionId, updates) {
154
+ this.ensureReady();
155
+ const session = this.sessions.get(sessionId);
156
+ if (!session) {
157
+ throw new Error(`Session not found: ${sessionId}`);
158
+ }
159
+ this.sessions.set(sessionId, {
160
+ ...session,
161
+ ...updates,
162
+ id: session.id, // Don't allow ID change
163
+ });
164
+ }
165
+ /**
166
+ * Get a session by ID
167
+ * @param sessionId - Session ID
168
+ * @returns Session or null
169
+ */
170
+ async getSession(sessionId) {
171
+ this.ensureReady();
172
+ const session = this.sessions.get(sessionId);
173
+ return session ? this.clone(session) : null;
174
+ }
175
+ /**
176
+ * Get sessions matching filter
177
+ * @param filter - Query filter
178
+ * @returns Matching sessions
179
+ */
180
+ async getSessions(filter) {
181
+ this.ensureReady();
182
+ const sessions = Array.from(this.sessions.values());
183
+ if (!filter) {
184
+ return sessions
185
+ .sort((a, b) => this.parseTimestamp(b.startedAt).getTime() -
186
+ this.parseTimestamp(a.startedAt).getTime())
187
+ .map((s) => this.clone(s));
188
+ }
189
+ return this.filterSessions(sessions, filter).map((s) => this.clone(s));
190
+ }
191
+ /**
192
+ * Delete a session and its associated logs
193
+ * @param sessionId - Session ID
194
+ */
195
+ async deleteSession(sessionId) {
196
+ this.ensureReady();
197
+ this.sessions.delete(sessionId);
198
+ this.logs = this.logs.filter((log) => log.sessionId !== sessionId);
199
+ }
200
+ // =========================================================================
201
+ // Maintenance Operations
202
+ // =========================================================================
203
+ /**
204
+ * Clean up old data
205
+ * @param olderThan - Delete entries older than this date
206
+ * @returns Number of deleted entries
207
+ */
208
+ async cleanup(olderThan) {
209
+ this.ensureReady();
210
+ const cutoff = olderThan.getTime();
211
+ let deleted = 0;
212
+ // Clean logs
213
+ const logsBefore = this.logs.length;
214
+ this.logs = this.logs.filter((log) => this.parseTimestamp(log.timestamp).getTime() > cutoff);
215
+ deleted += logsBefore - this.logs.length;
216
+ // Clean ended sessions
217
+ for (const [id, session] of this.sessions) {
218
+ if (session.status !== 'active' &&
219
+ session.endedAt &&
220
+ this.parseTimestamp(session.endedAt).getTime() <= cutoff) {
221
+ this.sessions.delete(id);
222
+ deleted++;
223
+ }
224
+ }
225
+ return deleted;
226
+ }
227
+ /**
228
+ * Get storage statistics
229
+ * @returns Storage stats
230
+ */
231
+ async getStats() {
232
+ this.ensureReady();
233
+ const logsByLevel = {
234
+ fatal: 0,
235
+ error: 0,
236
+ warn: 0,
237
+ info: 0,
238
+ debug: 0,
239
+ trace: 0,
240
+ };
241
+ let oldest;
242
+ let newest;
243
+ for (const log of this.logs) {
244
+ logsByLevel[log.level]++;
245
+ if (!oldest || log.timestamp < oldest) {
246
+ oldest = log.timestamp;
247
+ }
248
+ if (!newest || log.timestamp > newest) {
249
+ newest = log.timestamp;
250
+ }
251
+ }
252
+ const activeSessions = Array.from(this.sessions.values()).filter((s) => s.status === 'active').length;
253
+ return {
254
+ totalLogs: this.logs.length,
255
+ totalSessions: this.sessions.size,
256
+ activeSessions,
257
+ logsByLevel,
258
+ oldestLog: oldest,
259
+ newestLog: newest,
260
+ };
261
+ }
262
+ // =========================================================================
263
+ // Additional Memory Store Methods
264
+ // =========================================================================
265
+ /**
266
+ * Clear all data from the store
267
+ */
268
+ async clear() {
269
+ this.ensureReady();
270
+ this.logs = [];
271
+ this.sessions.clear();
272
+ }
273
+ /**
274
+ * Get raw storage arrays (for debugging)
275
+ * @returns Internal storage references
276
+ */
277
+ getRawData() {
278
+ return {
279
+ logs: this.logs,
280
+ sessions: this.sessions,
281
+ };
282
+ }
283
+ }
284
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/stores/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,204 @@
1
+ /**
2
+ * SQLite Store Provider
3
+ *
4
+ * Persistent storage using better-sqlite3 - the most reliable SQLite library for Node.js.
5
+ *
6
+ * @module stores/sqlite
7
+ * @packageDocumentation
8
+ */
9
+ import Database, { type Database as DatabaseType } from 'better-sqlite3';
10
+ import { BaseStoreProvider } from './base.js';
11
+ import type { StoreProviderConfig, LogEntry, Session, LogFilter, SessionFilter, StoreStats } from '../types.js';
12
+ /**
13
+ * Configuration options for SQLite store
14
+ */
15
+ export interface SQLiteStoreConfig extends StoreProviderConfig {
16
+ /**
17
+ * Path to SQLite database file
18
+ * @default ':memory:' for in-memory database
19
+ */
20
+ filename?: string;
21
+ /**
22
+ * Enable WAL mode for better concurrent read performance
23
+ * @default true
24
+ */
25
+ walMode?: boolean;
26
+ /**
27
+ * Cache size in KB (negative for number of pages)
28
+ * @default -2000 (2000 pages)
29
+ */
30
+ cacheSize?: number;
31
+ /**
32
+ * Enable foreign keys
33
+ * @default true
34
+ */
35
+ foreignKeys?: boolean;
36
+ /**
37
+ * Create indexes for common queries
38
+ * @default true
39
+ */
40
+ createIndexes?: boolean;
41
+ }
42
+ /**
43
+ * SQLite store provider using better-sqlite3
44
+ *
45
+ * @remarks
46
+ * Uses synchronous better-sqlite3 for maximum performance and reliability.
47
+ * Supports both file-based and in-memory databases.
48
+ *
49
+ * Features:
50
+ * - WAL mode for concurrent reads
51
+ * - Automatic schema creation and migration
52
+ * - Full-text search on message field
53
+ * - Efficient indexes for common query patterns
54
+ * - Transaction support for bulk operations
55
+ *
56
+ * @example
57
+ * ```typescript
58
+ * import { SQLiteStoreProvider } from '@nodelogger/core/sqlite';
59
+ *
60
+ * // File-based persistent storage
61
+ * const store = new SQLiteStoreProvider({
62
+ * filename: './logs.db',
63
+ * walMode: true
64
+ * });
65
+ * await store.init();
66
+ *
67
+ * // In-memory (fast, non-persistent)
68
+ * const memStore = new SQLiteStoreProvider();
69
+ * await memStore.init();
70
+ * ```
71
+ */
72
+ export declare class SQLiteStoreProvider extends BaseStoreProvider {
73
+ readonly name = "sqlite";
74
+ private db;
75
+ private sqliteConfig;
76
+ constructor(config?: SQLiteStoreConfig);
77
+ /**
78
+ * Initialize the SQLite database
79
+ */
80
+ init(): Promise<void>;
81
+ /**
82
+ * Close the database connection
83
+ */
84
+ close(): Promise<void>;
85
+ /**
86
+ * Create database schema
87
+ */
88
+ private createSchema;
89
+ /**
90
+ * Save a log entry
91
+ * @param entry - Log entry to save
92
+ */
93
+ saveLog(entry: LogEntry): Promise<void>;
94
+ /**
95
+ * Save multiple log entries in a transaction
96
+ * @param entries - Log entries to save
97
+ */
98
+ saveLogs(entries: LogEntry[]): Promise<void>;
99
+ /**
100
+ * Get log entries matching filter
101
+ * @param filter - Query filter
102
+ * @returns Matching log entries
103
+ */
104
+ getLogs(filter?: LogFilter): Promise<LogEntry[]>;
105
+ /**
106
+ * Delete log entries matching filter
107
+ * @param filter - Query filter
108
+ * @returns Number of deleted entries
109
+ */
110
+ deleteLogs(filter?: LogFilter): Promise<number>;
111
+ /**
112
+ * Count log entries matching filter
113
+ * @param filter - Query filter
114
+ * @returns Count of matching entries
115
+ */
116
+ countLogs(filter?: LogFilter): Promise<number>;
117
+ /**
118
+ * Enforce maximum log limit by deleting oldest entries
119
+ */
120
+ private enforceLogLimit;
121
+ /**
122
+ * Create a new session
123
+ * @param session - Session to create
124
+ */
125
+ createSession(session: Session): Promise<void>;
126
+ /**
127
+ * Update an existing session
128
+ * @param sessionId - Session ID
129
+ * @param updates - Partial session data
130
+ */
131
+ updateSession(sessionId: string, updates: Partial<Session>): Promise<void>;
132
+ /**
133
+ * Get a session by ID
134
+ * @param sessionId - Session ID
135
+ * @returns Session or null
136
+ */
137
+ getSession(sessionId: string): Promise<Session | null>;
138
+ /**
139
+ * Get sessions matching filter
140
+ * @param filter - Query filter
141
+ * @returns Matching sessions
142
+ */
143
+ getSessions(filter?: SessionFilter): Promise<Session[]>;
144
+ /**
145
+ * Delete a session and its logs
146
+ * @param sessionId - Session ID
147
+ */
148
+ deleteSession(sessionId: string): Promise<void>;
149
+ /**
150
+ * Enforce maximum session limit
151
+ */
152
+ private enforceSessionLimit;
153
+ /**
154
+ * Clean up old data
155
+ * @param olderThan - Delete entries older than this date
156
+ * @returns Number of deleted entries
157
+ */
158
+ cleanup(olderThan: Date): Promise<number>;
159
+ /**
160
+ * Get storage statistics
161
+ * @returns Storage stats
162
+ */
163
+ getStats(): Promise<StoreStats>;
164
+ /**
165
+ * Build WHERE clause from filter
166
+ */
167
+ private buildWhereClause;
168
+ /**
169
+ * Build complete SELECT query from filter
170
+ */
171
+ private buildLogQuery;
172
+ /**
173
+ * Convert SQLite row to LogEntry
174
+ */
175
+ private rowToLogEntry;
176
+ /**
177
+ * Convert SQLite row to Session
178
+ */
179
+ private rowToSession;
180
+ /**
181
+ * Execute raw SQL query
182
+ * @param sql - SQL query
183
+ * @param params - Query parameters
184
+ * @returns Query results
185
+ */
186
+ query<T>(sql: string, ...params: unknown[]): T[];
187
+ /**
188
+ * Execute raw SQL statement
189
+ * @param sql - SQL statement
190
+ * @param params - Statement parameters
191
+ * @returns Run result
192
+ */
193
+ execute(sql: string, ...params: unknown[]): Database.RunResult;
194
+ /**
195
+ * Run VACUUM to optimize database
196
+ */
197
+ vacuum(): void;
198
+ /**
199
+ * Get the underlying better-sqlite3 database instance
200
+ * @returns Database instance or null
201
+ */
202
+ getDatabase(): DatabaseType | null;
203
+ }
204
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/stores/sqlite.ts"],"names":[],"mappings":"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"}