|
|
import type { WebSearchSource } from "$lib/types/WebSearch"; |
|
|
import { processTokens, type Token } from "$lib/utils/marked"; |
|
|
|
|
|
export type IncomingMessage = { |
|
|
type: "process"; |
|
|
content: string; |
|
|
sources: WebSearchSource[]; |
|
|
}; |
|
|
|
|
|
export type OutgoingMessage = { |
|
|
type: "processed"; |
|
|
tokens: Token[]; |
|
|
}; |
|
|
|
|
|
|
|
|
let isProcessing = false; |
|
|
|
|
|
|
|
|
let latestMessage: IncomingMessage | null = null; |
|
|
|
|
|
|
|
|
async function processMessage() { |
|
|
if (latestMessage) { |
|
|
const nextMessage = latestMessage; |
|
|
|
|
|
latestMessage = null; |
|
|
isProcessing = true; |
|
|
|
|
|
try { |
|
|
const { content, sources } = nextMessage; |
|
|
const processedTokens = await processTokens(content, sources); |
|
|
postMessage(JSON.parse(JSON.stringify({ type: "processed", tokens: processedTokens }))); |
|
|
} finally { |
|
|
isProcessing = false; |
|
|
|
|
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 100)); |
|
|
processMessage(); |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
onmessage = (event) => { |
|
|
if (event.data.type !== "process") { |
|
|
return; |
|
|
} |
|
|
|
|
|
latestMessage = event.data as IncomingMessage; |
|
|
|
|
|
if (!isProcessing && latestMessage) { |
|
|
processMessage(); |
|
|
} |
|
|
}; |
|
|
|