Spaces:
Sleeping
Sleeping
| /** | |
| * Functions for managing chat data in IndexedDB | |
| */ | |
| import type { Message } from 'ai'; | |
| import type { IChatMetadata } from './db'; // Import IChatMetadata | |
| export interface ChatMessage { | |
| id: string; | |
| role: 'user' | 'assistant' | 'system'; | |
| content: string; | |
| timestamp: number; | |
| } | |
| export interface Chat { | |
| id: string; | |
| description?: string; | |
| messages: Message[]; | |
| timestamp: string; | |
| urlId?: string; | |
| metadata?: IChatMetadata; | |
| } | |
| /** | |
| * Get all chats from the database | |
| * @param db The IndexedDB database instance | |
| * @returns A promise that resolves to an array of chats | |
| */ | |
| export async function getAllChats(db: IDBDatabase): Promise<Chat[]> { | |
| console.log(`getAllChats: Using database '${db.name}', version ${db.version}`); | |
| return new Promise((resolve, reject) => { | |
| try { | |
| const transaction = db.transaction(['chats'], 'readonly'); | |
| const store = transaction.objectStore('chats'); | |
| const request = store.getAll(); | |
| request.onsuccess = () => { | |
| const result = request.result || []; | |
| console.log(`getAllChats: Found ${result.length} chats in database '${db.name}'`); | |
| resolve(result); | |
| }; | |
| request.onerror = () => { | |
| console.error(`getAllChats: Error querying database '${db.name}':`, request.error); | |
| reject(request.error); | |
| }; | |
| } catch (err) { | |
| console.error(`getAllChats: Error creating transaction on database '${db.name}':`, err); | |
| reject(err); | |
| } | |
| }); | |
| } | |
| /** | |
| * Get a chat by ID | |
| * @param db The IndexedDB database instance | |
| * @param id The ID of the chat to get | |
| * @returns A promise that resolves to the chat or null if not found | |
| */ | |
| export async function getChatById(db: IDBDatabase, id: string): Promise<Chat | null> { | |
| return new Promise((resolve, reject) => { | |
| const transaction = db.transaction(['chats'], 'readonly'); | |
| const store = transaction.objectStore('chats'); | |
| const request = store.get(id); | |
| request.onsuccess = () => { | |
| resolve(request.result || null); | |
| }; | |
| request.onerror = () => { | |
| reject(request.error); | |
| }; | |
| }); | |
| } | |
| /** | |
| * Save a chat to the database | |
| * @param db The IndexedDB database instance | |
| * @param chat The chat to save | |
| * @returns A promise that resolves when the chat is saved | |
| */ | |
| export async function saveChat(db: IDBDatabase, chat: Chat): Promise<void> { | |
| return new Promise((resolve, reject) => { | |
| const transaction = db.transaction(['chats'], 'readwrite'); | |
| const store = transaction.objectStore('chats'); | |
| const request = store.put(chat); | |
| request.onsuccess = () => { | |
| resolve(); | |
| }; | |
| request.onerror = () => { | |
| reject(request.error); | |
| }; | |
| }); | |
| } | |
| /** | |
| * Delete a chat by ID | |
| * @param db The IndexedDB database instance | |
| * @param id The ID of the chat to delete | |
| * @returns A promise that resolves when the chat is deleted | |
| */ | |
| export async function deleteChat(db: IDBDatabase, id: string): Promise<void> { | |
| return new Promise((resolve, reject) => { | |
| const transaction = db.transaction(['chats'], 'readwrite'); | |
| const store = transaction.objectStore('chats'); | |
| const request = store.delete(id); | |
| request.onsuccess = () => { | |
| resolve(); | |
| }; | |
| request.onerror = () => { | |
| reject(request.error); | |
| }; | |
| }); | |
| } | |
| /** | |
| * Delete all chats | |
| * @param db The IndexedDB database instance | |
| * @returns A promise that resolves when all chats are deleted | |
| */ | |
| export async function deleteAllChats(db: IDBDatabase): Promise<void> { | |
| return new Promise((resolve, reject) => { | |
| const transaction = db.transaction(['chats'], 'readwrite'); | |
| const store = transaction.objectStore('chats'); | |
| const request = store.clear(); | |
| request.onsuccess = () => { | |
| resolve(); | |
| }; | |
| request.onerror = () => { | |
| reject(request.error); | |
| }; | |
| }); | |
| } | |