mirror of
https://github.com/musistudio/claude-code-router.git
synced 2026-02-02 06:40:50 +08:00
106 lines
3.4 KiB
TypeScript
106 lines
3.4 KiB
TypeScript
export interface RequestHistoryItem {
|
|
id: string;
|
|
url: string;
|
|
method: string;
|
|
headers: string;
|
|
body: string;
|
|
timestamp: string;
|
|
status: number;
|
|
responseTime: number;
|
|
responseBody: string;
|
|
responseHeaders: string;
|
|
}
|
|
|
|
class RequestHistoryDB {
|
|
private readonly DB_NAME = 'RequestHistoryDB';
|
|
private readonly STORE_NAME = 'requests';
|
|
private readonly VERSION = 1;
|
|
|
|
async openDB(): Promise<IDBDatabase> {
|
|
return new Promise((resolve, reject) => {
|
|
const request = indexedDB.open(this.DB_NAME, this.VERSION);
|
|
|
|
request.onerror = () => reject(request.error);
|
|
request.onsuccess = () => resolve(request.result);
|
|
|
|
request.onupgradeneeded = (event) => {
|
|
const db = (event.target as IDBOpenDBRequest).result;
|
|
|
|
if (!db.objectStoreNames.contains(this.STORE_NAME)) {
|
|
const store = db.createObjectStore(this.STORE_NAME, { keyPath: 'id' });
|
|
store.createIndex('timestamp', 'timestamp', { unique: false });
|
|
store.createIndex('url', 'url', { unique: false });
|
|
store.createIndex('method', 'method', { unique: false });
|
|
}
|
|
};
|
|
});
|
|
}
|
|
|
|
async saveRequest(request: Omit<RequestHistoryItem, 'id' | 'timestamp'>): Promise<void> {
|
|
const db = await this.openDB();
|
|
const item: RequestHistoryItem = {
|
|
...request,
|
|
id: Date.now().toString(),
|
|
timestamp: new Date().toISOString(),
|
|
};
|
|
|
|
return new Promise((resolve, reject) => {
|
|
const transaction = db.transaction([this.STORE_NAME], 'readwrite');
|
|
const store = transaction.objectStore(this.STORE_NAME);
|
|
const request = store.add(item);
|
|
|
|
request.onsuccess = () => resolve();
|
|
request.onerror = () => reject(request.error);
|
|
});
|
|
}
|
|
|
|
async getRequests(limit: number = 50): Promise<RequestHistoryItem[]> {
|
|
const db = await this.openDB();
|
|
return new Promise((resolve, reject) => {
|
|
const transaction = db.transaction([this.STORE_NAME], 'readonly');
|
|
const store = transaction.objectStore(this.STORE_NAME);
|
|
const index = store.index('timestamp');
|
|
const request = index.openCursor(null, 'prev');
|
|
|
|
const results: RequestHistoryItem[] = [];
|
|
|
|
request.onsuccess = (event) => {
|
|
const cursor = (event.target as IDBRequest).result;
|
|
if (cursor && results.length < limit) {
|
|
results.push(cursor.value);
|
|
cursor.continue();
|
|
} else {
|
|
resolve(results);
|
|
}
|
|
};
|
|
|
|
request.onerror = () => reject(request.error);
|
|
});
|
|
}
|
|
|
|
async deleteRequest(id: string): Promise<void> {
|
|
const db = await this.openDB();
|
|
return new Promise((resolve, reject) => {
|
|
const transaction = db.transaction([this.STORE_NAME], 'readwrite');
|
|
const store = transaction.objectStore(this.STORE_NAME);
|
|
const request = store.delete(id);
|
|
|
|
request.onsuccess = () => resolve();
|
|
request.onerror = () => reject(request.error);
|
|
});
|
|
}
|
|
|
|
async clearAllRequests(): Promise<void> {
|
|
const db = await this.openDB();
|
|
return new Promise((resolve, reject) => {
|
|
const transaction = db.transaction([this.STORE_NAME], 'readwrite');
|
|
const store = transaction.objectStore(this.STORE_NAME);
|
|
const request = store.clear();
|
|
|
|
request.onsuccess = () => resolve();
|
|
request.onerror = () => reject(request.error);
|
|
});
|
|
}
|
|
}
|
|
|
|
export const requestHistoryDB = new RequestHistoryDB(); |