UNPKG

@homecheck/logger

Version:

A simple logger for Web, Node, Capacitor apps.

140 lines (139 loc) 5.29 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.BrowserStorage = void 0; class BrowserStorage { constructor() { this.db = null; this.dbName = 'logger-db'; this.storeName = 'logs'; this.dbVersion = 1; } async init() { if (this.db) return; return new Promise((resolve, reject) => { try { const request = indexedDB.open(this.dbName, this.dbVersion); request.onupgradeneeded = (event) => { const db = event.target.result; if (!db.objectStoreNames.contains(this.storeName)) { const store = db.createObjectStore(this.storeName, { keyPath: 'id' }); store.createIndex('createdAt', 'createdAt', { unique: false }); } }; request.onsuccess = (event) => { this.db = event.target.result; resolve(); }; request.onerror = () => reject(new Error('Failed to open IndexedDB')); } catch (error) { reject(error); } }); } async addLog(logData) { if (!this.db) await this.init(); return new Promise((resolve, reject) => { try { const transaction = this.db.transaction([this.storeName], 'readwrite'); const store = transaction.objectStore(this.storeName); // ID와 생성 시간 추가 const logWithId = { ...logData, id: crypto.randomUUID ? crypto.randomUUID() : `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`, createdAt: Date.now() }; const request = store.add(logWithId); request.onsuccess = () => resolve(); request.onerror = () => reject(new Error('Failed to add log')); } catch (error) { reject(error); } }); } async getLogs(limit) { if (!this.db) await this.init(); return new Promise((resolve, reject) => { try { const transaction = this.db.transaction([this.storeName], 'readonly'); const store = transaction.objectStore(this.storeName); const index = store.index('createdAt'); const logs = []; // 생성 시간 순으로 정렬하여 가져오기 const request = index.openCursor(); request.onsuccess = (event) => { const cursor = event.target.result; if (cursor && logs.length < limit) { logs.push(cursor.value); cursor.continue(); } else { resolve(logs); } }; request.onerror = () => reject(new Error('Failed to get logs')); } catch (error) { reject(error); } }); } async removeLogs(ids) { if (!this.db) await this.init(); return new Promise((resolve, reject) => { try { const transaction = this.db.transaction([this.storeName], 'readwrite'); const store = transaction.objectStore(this.storeName); let completed = 0; let errors = 0; for (const id of ids) { const request = store.delete(id); request.onsuccess = () => { completed++; if (completed + errors === ids.length) { if (errors > 0) { reject(new Error(`Failed to remove ${errors} logs`)); } else { resolve(); } } }; request.onerror = () => { errors++; if (completed + errors === ids.length) reject(new Error(`Failed to remove ${errors} logs`)); }; } // 삭제할 ID가 없는 경우 if (ids.length === 0) resolve(); } catch (error) { reject(error); } }); } async getCount() { if (!this.db) await this.init(); return new Promise((resolve, reject) => { try { const transaction = this.db.transaction([this.storeName], 'readonly'); const store = transaction.objectStore(this.storeName); const request = store.count(); request.onsuccess = () => resolve(request.result); request.onerror = () => reject(new Error('Failed to get log count')); } catch (error) { reject(error); } }); } } exports.BrowserStorage = BrowserStorage;