mirror of
https://github.com/stackblitz/bolt.new
synced 2024-11-27 22:42:21 +00:00
68 lines
2.2 KiB
TypeScript
68 lines
2.2 KiB
TypeScript
|
import type { ChatHistory } from './useChatHistory';
|
||
|
import type { Message } from 'ai';
|
||
|
import { createScopedLogger } from '~/utils/logger';
|
||
|
|
||
|
const logger = createScopedLogger('ChatHistory');
|
||
|
|
||
|
// this is used at the top level and never rejects
|
||
|
export async function openDatabase(): Promise<IDBDatabase | undefined> {
|
||
|
return new Promise((resolve) => {
|
||
|
const request = indexedDB.open('boltHistory', 1);
|
||
|
|
||
|
request.onupgradeneeded = (event: IDBVersionChangeEvent) => {
|
||
|
const db = (event.target as IDBOpenDBRequest).result;
|
||
|
|
||
|
if (!db.objectStoreNames.contains('chats')) {
|
||
|
const store = db.createObjectStore('chats', { keyPath: 'id' });
|
||
|
store.createIndex('id', 'id', { unique: true });
|
||
|
}
|
||
|
};
|
||
|
|
||
|
request.onsuccess = (event: Event) => {
|
||
|
resolve((event.target as IDBOpenDBRequest).result);
|
||
|
};
|
||
|
|
||
|
request.onerror = (event: Event) => {
|
||
|
resolve(undefined);
|
||
|
logger.error((event.target as IDBOpenDBRequest).error);
|
||
|
};
|
||
|
});
|
||
|
}
|
||
|
|
||
|
export async function setMessages(db: IDBDatabase, id: string, messages: Message[]): Promise<void> {
|
||
|
return new Promise((resolve, reject) => {
|
||
|
const transaction = db.transaction('chats', 'readwrite');
|
||
|
const store = transaction.objectStore('chats');
|
||
|
|
||
|
const request = store.put({
|
||
|
id,
|
||
|
messages,
|
||
|
});
|
||
|
|
||
|
request.onsuccess = () => resolve();
|
||
|
request.onerror = () => reject(request.error);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
export async function getMessages(db: IDBDatabase, id: string): Promise<ChatHistory> {
|
||
|
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 as ChatHistory);
|
||
|
request.onerror = () => reject(request.error);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
export async function getNextID(db: IDBDatabase): Promise<string> {
|
||
|
return new Promise((resolve, reject) => {
|
||
|
const transaction = db.transaction('chats', 'readonly');
|
||
|
const store = transaction.objectStore('chats');
|
||
|
const request = store.count();
|
||
|
|
||
|
request.onsuccess = () => resolve(String(request.result));
|
||
|
request.onerror = () => reject(request.error);
|
||
|
});
|
||
|
}
|