references.worker.ts 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import BasicReferenceIndex from './basic-reference-index'
  2. import { ReferenceIndex } from './reference-index'
  3. import { AdvancedReferenceSearchResult, Changes } from './types'
  4. import importOverleafModules from '../../../../macros/import-overleaf-module.macro'
  5. interface IndexConstructor {
  6. new (): ReferenceIndex
  7. }
  8. const indices = importOverleafModules('referenceIndices') as {
  9. import: { default: IndexConstructor }
  10. path: string
  11. }[]
  12. export type ReferenceWorkerRequest =
  13. | { type: 'update'; changes: Changes }
  14. | { type: 'search'; query: string }
  15. export type ReferenceWorkerResponse =
  16. | { type: 'updateKeys'; keys: Set<string> }
  17. | { type: 'searchResult'; result: AdvancedReferenceSearchResult }
  18. function createIndex(): ReferenceIndex {
  19. const Klass = indices[0]?.import.default ?? BasicReferenceIndex
  20. return new Klass()
  21. }
  22. const indexer: ReferenceIndex = createIndex()
  23. self.addEventListener('message', async (event: MessageEvent) => {
  24. const message = event.data as ReferenceWorkerRequest
  25. switch (message.type) {
  26. case 'update':
  27. indexer.updateIndex(message.changes)
  28. self.postMessage({ type: 'updateKeys', keys: indexer.getKeys() })
  29. break
  30. case 'search': {
  31. const result = await indexer.search(message.query)
  32. self.postMessage({ type: 'searchResult', result })
  33. break
  34. }
  35. default:
  36. console.error('Unknown message type:', message)
  37. }
  38. })