diff --git a/src/plugins/built-in/globalSearch/core/index.ts b/src/plugins/built-in/globalSearch/core/index.ts index 5d64c5b6..174ee6db 100644 --- a/src/plugins/built-in/globalSearch/core/index.ts +++ b/src/plugins/built-in/globalSearch/core/index.ts @@ -15,7 +15,7 @@ import { waitForElm } from "@/seqta/utils/waitForElm"; import { loadAllStoredItems, runIndexing } from "../indexing/indexer"; //import { initVectorSearch } from "../search/vector/vectorSearch"; import { VectorWorkerManager } from "../indexing/worker/vectorWorkerManager"; -import indexWorker from "./indexWorker?inlineWorker"; +import VectorSearchWorkerManager from "../search/vector/vectorSearch"; const settings = defineSettings({ searchHotkey: stringSetting({ @@ -88,18 +88,7 @@ const globalSearchPlugin: Plugin = { run: async (api) => { let app: any; - console.log("=======================") - /* const worker = new Worker(new URL('./indexWorker.ts', import.meta.url), { - type: 'module', - }); */ - //const blob = new Blob([indexWorker], { type: 'application/javascript' }); - const worker = indexWorker(); - worker.addEventListener("message", (e) => { - console.log(e); - }); - - worker.postMessage({ type: "ready" }); - console.log("=======================") + VectorSearchWorkerManager.getInstance(); // Run initial indexing and update dynamic items if (api.settings.runIndexingOnLoad) { @@ -165,9 +154,9 @@ const globalSearchPlugin: Plugin = { if (searchButton) searchButton.remove(); if (searchRoot) searchRoot.remove(); - // Clean up vector worker + // Clean up workers VectorWorkerManager.getInstance().terminate(); - + VectorSearchWorkerManager.getInstance().terminate(); unmount(app); }; }, diff --git a/src/plugins/built-in/globalSearch/core/indexWorker.ts b/src/plugins/built-in/globalSearch/core/indexWorker.ts deleted file mode 100644 index 851e3a2c..00000000 --- a/src/plugins/built-in/globalSearch/core/indexWorker.ts +++ /dev/null @@ -1,5 +0,0 @@ -self.addEventListener('message', (e: Event) => { - console.log(e); -}); - -self.postMessage({ type: 'ready' }); \ No newline at end of file diff --git a/src/plugins/built-in/globalSearch/search/vector/vectorSearch.ts b/src/plugins/built-in/globalSearch/search/vector/vectorSearch.ts index 148504c2..bcb3a37f 100644 --- a/src/plugins/built-in/globalSearch/search/vector/vectorSearch.ts +++ b/src/plugins/built-in/globalSearch/search/vector/vectorSearch.ts @@ -1,17 +1,19 @@ import type { VectorSearchResult } from "./vectorTypes"; -//import vectorSearchWorker from "./vectorSearchWorker?worker"; +import vectorSearchWorker from "./vectorSearchWorker?inlineWorker"; export function searchVectors(query: string, topK: number = 10): Promise { - //return VectorSearchWorkerManager.getInstance().search(query, topK); - return new Promise((resolve) => { + return VectorSearchWorkerManager.getInstance().search(query, topK); + /* return new Promise((resolve) => { resolve([]); - }); + }); */ } -/* class VectorSearchWorkerManager { +class VectorSearchWorkerManager { private static instance: VectorSearchWorkerManager; private worker: Worker | null = null; private pendingSearches = new Map void>(); + private debounceTimer: NodeJS.Timeout | null = null; + private lastSearchParams: { query: string; topK: number; resolve: (results: VectorSearchResult[]) => void } | null = null; constructor() { this.initWorker(); @@ -19,7 +21,7 @@ export function searchVectors(query: string, topK: number = 10): Promise { - console.log("Searching vectors", query, topK); if (!this.worker) { this.initWorker(); } - - const messageId = crypto.randomUUID(); + return new Promise((resolve) => { - this.pendingSearches.set(messageId, resolve); - this.worker?.postMessage({ - type: "search", - data: { query, topK }, - messageId - }); + this.lastSearchParams = { query, topK, resolve }; + if (this.debounceTimer) clearTimeout(this.debounceTimer); + this.debounceTimer = setTimeout(() => { + const messageId = crypto.randomUUID(); + if (this.lastSearchParams) { + this.pendingSearches.set(messageId, this.lastSearchParams.resolve); + this.worker?.postMessage({ + type: "search", + data: { query: this.lastSearchParams.query, topK: this.lastSearchParams.topK }, + messageId + }); + this.lastSearchParams = null; + } + this.debounceTimer = null; + }, query !== '' ? 300 : 0); }); } + + public terminate() { + if (this.worker) { + for (const [messageId, resolve] of this.pendingSearches.entries()) { + resolve([]); + this.pendingSearches.delete(messageId); + } + + this.worker.terminate(); + this.worker = null; + } + } } -export default VectorSearchWorkerManager; */ \ No newline at end of file +export default VectorSearchWorkerManager; \ No newline at end of file diff --git a/src/plugins/built-in/globalSearch/search/vector/vectorSearchWorker.ts b/src/plugins/built-in/globalSearch/search/vector/vectorSearchWorker.ts index d02fb7c8..aab34caa 100644 --- a/src/plugins/built-in/globalSearch/search/vector/vectorSearchWorker.ts +++ b/src/plugins/built-in/globalSearch/search/vector/vectorSearchWorker.ts @@ -44,16 +44,13 @@ self.addEventListener('message', async (e) => { switch (type) { case 'search': console.log("Search request received", data); - const results = await searchVectors(data.query, data.topK); - self.postMessage({ type: 'searchResults', data: { messageId, results } }); + searchVectors(data.query, data.topK).then((results) => { + self.postMessage({ type: 'searchResults', data: { messageId, results } }); + }); break; default: console.warn(`Unknown message type: ${type}`); } }); -initVectorSearch(); - -export default function test() { - console.log("%cTest!!!", "background-color: #000; color: #fff;"); -} \ No newline at end of file +initVectorSearch(); \ No newline at end of file