@homecheck/logger
Version:
A simple logger for Web, Node, Capacitor apps.
140 lines (139 loc) • 5.29 kB
JavaScript
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;
;