import { Storage, browser } from "wxt/browser" interface PageAssistVector { file_id: string content: string embedding: number[] metadata: Record } export type VectorData = { id: string vectors: PageAssistVector[] } export class PageAssistVectorDb { db: Storage.LocalStorageArea constructor() { this.db = browser.storage.local } insertVector = async ( id: string, vector: PageAssistVector[] ): Promise => { return new Promise((resolve, reject) => { // this.db.get(id, (result) => { // if (chrome.runtime.lastError) { // reject(chrome.runtime.lastError) // } else { // const data = result[id] as VectorData // if (!data) { // this.db.set({ [id]: { id, vectors: vector } }, () => { // if (chrome.runtime.lastError) { // reject(chrome.runtime.lastError) // } else { // resolve() // } // }) // } else { // this.db.set( // { // [id]: { // ...data, // vectors: data.vectors.concat(vector) // } // }, // () => { // if (chrome.runtime.lastError) { // reject(chrome.runtime.lastError) // } else { // resolve() // } // } // ) // } // } // }) this.db.get(id).then((result) => { const data = result[id] as VectorData if (!data) { this.db.set({ [id]: { id, vectors: vector } }).then(() => { resolve() }) } else { this.db .set({ [id]: { ...data, vectors: data.vectors.concat(vector) } }) .then(() => { resolve() }) } }) }) } deleteVector = async (id: string): Promise => { return new Promise((resolve, reject) => { // this.db.remove(id, () => { // if (chrome.runtime.lastError) { // reject(chrome.runtime.lastError) // } else { // resolve() // } // }) this.db.remove(id).then(() => { resolve() }) }) } deleteVectorByFileId = async (id: string, file_id: string): Promise => { return new Promise((resolve, reject) => { // this.db.get(id, (result) => { // if (chrome.runtime.lastError) { // reject(chrome.runtime.lastError) // } else { // const data = result[id] as VectorData // data.vectors = data.vectors.filter((v) => v.file_id !== file_id) // this.db.set({ [id]: data }, () => { // if (chrome.runtime.lastError) { // reject(chrome.runtime.lastError) // } else { // resolve() // } // }) // } // }) this.db.get(id).then((result) => { const data = result[id] as VectorData data.vectors = data.vectors.filter((v) => v.file_id !== file_id) this.db.set({ [id]: data }).then(() => { resolve() }) }) }) } getVector = async (id: string): Promise => { return new Promise((resolve, reject) => { // this.db.get(id, (result) => { // if (chrome.runtime.lastError) { // reject(chrome.runtime.lastError) // } else { // resolve(result[id] as VectorData) // } // }) this.db.get(id).then((result) => { resolve(result[id] as VectorData) }) }) } getAll = async (): Promise => { return new Promise((resolve, reject) => { // this.db.get(null, (result) => { // if (chrome.runtime.lastError) { // reject(chrome.runtime.lastError) // } else { // resolve(Object.values(result)) // } // }) this.db.get(null).then((result) => { resolve(Object.values(result)) }) }) } saveImportedData = async (data: VectorData[]): Promise => { return new Promise((resolve, reject) => { const obj: Record = {} data.forEach((d) => { obj[d.id] = d }) // this.db.set(obj, () => { // if (chrome.runtime.lastError) { // reject(chrome.runtime.lastError) // } else { // resolve() // } // }) this.db.set(obj).then(() => { resolve() }) }) } } export const insertVector = async ( id: string, vector: PageAssistVector[] ): Promise => { const db = new PageAssistVectorDb() return db.insertVector(id, vector) } export const getVector = async (id: string): Promise => { const db = new PageAssistVectorDb() return db.getVector(id) } export const deleteVector = async (id: string): Promise => { const db = new PageAssistVectorDb() return db.deleteVector(id) } export const deleteVectorByFileId = async ( id: string, file_id: string ): Promise => { const db = new PageAssistVectorDb() return db.deleteVectorByFileId(id, file_id) } export const exportVectors = async () => { const db = new PageAssistVectorDb() const data = await db.getAll() return data } export const importVectors = async (data: VectorData[]) => { const db = new PageAssistVectorDb() return db.saveImportedData(data) }