markdown-worker-transport.ts 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. export function createWorkerTransport<T extends { id: number; key: string }>(input: {
  2. post: (request: T) => void
  3. supersede: (request: T) => void
  4. }) {
  5. const active = new Map<string, T>()
  6. const queued = new Map<string, T>()
  7. return {
  8. send(request: T) {
  9. if (!active.has(request.key)) {
  10. active.set(request.key, request)
  11. input.post(request)
  12. return
  13. }
  14. const previous = queued.get(request.key)
  15. if (previous) input.supersede(previous)
  16. queued.set(request.key, request)
  17. },
  18. complete(key: string, id: number) {
  19. if (active.get(key)?.id !== id) return
  20. active.delete(key)
  21. const next = queued.get(key)
  22. if (!next) return
  23. queued.delete(key)
  24. active.set(key, next)
  25. input.post(next)
  26. },
  27. dispose(key: string) {
  28. active.delete(key)
  29. const request = queued.get(key)
  30. if (request) input.supersede(request)
  31. queued.delete(key)
  32. },
  33. reset() {
  34. queued.forEach(input.supersede)
  35. queued.clear()
  36. active.clear()
  37. },
  38. queued: () => queued.size,
  39. }
  40. }