Files
overleaf-cep/services/web/frontend/js/features/ide-react/references/references.worker.ts
Mathias Jakobsen ed0c4c447e Merge pull request #24468 from overleaf/mj-client-side-references
[web] Perform ARS on client-side

GitOrigin-RevId: 19703c82758cae450fe52463ad9612d3a2383ba0
2025-09-03 08:05:41 +00:00

48 lines
1.4 KiB
TypeScript

import BasicReferenceIndex from './basic-reference-index'
import { ReferenceIndex } from './reference-index'
import { AdvancedReferenceSearchResult, Changes } from './types'
import importOverleafModules from '../../../../macros/import-overleaf-module.macro'
interface IndexConstructor {
new (): ReferenceIndex
}
const indices = importOverleafModules('referenceIndices') as {
import: { default: IndexConstructor }
path: string
}[]
export type ReferenceWorkerRequest =
| { type: 'update'; changes: Changes }
| { type: 'search'; query: string }
export type ReferenceWorkerResponse =
| { type: 'updateKeys'; keys: Set<string> }
| { type: 'searchResult'; result: AdvancedReferenceSearchResult }
function createIndex(): ReferenceIndex {
const Klass = indices[0]?.import.default ?? BasicReferenceIndex
return new Klass()
}
const indexer: ReferenceIndex = createIndex()
self.addEventListener('message', async (event: MessageEvent) => {
const message = event.data as ReferenceWorkerRequest
switch (message.type) {
case 'update':
indexer.updateIndex(message.changes)
self.postMessage({ type: 'updateKeys', keys: indexer.getKeys() })
break
case 'search': {
const result = await indexer.search(message.query)
self.postMessage({ type: 'searchResult', result })
break
}
default:
console.error('Unknown message type:', message)
}
})