sse.client.ts 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import SseSource from '~/services/sse/sseSource'
  2. import { useAccessProfileStore } from '~/stores/accessProfile'
  3. import { useSseStore } from '~/stores/sse'
  4. import type { MercureEntityUpdate } from '~/types/interfaces'
  5. /**
  6. * Setup SSE EventSource, allowing the app to listen for Mercure updates
  7. * /!\ This has to be executed client side
  8. *
  9. * @param ctx
  10. */
  11. export default defineNuxtPlugin((_) => {
  12. const runtimeConfig = useRuntimeConfig()
  13. if (!runtimeConfig.public.baseUrlMercure) {
  14. console.error('Mercure : the hub url is not defined')
  15. return
  16. }
  17. const accessProfile = useAccessProfileStore()
  18. const sseStore = useSseStore()
  19. const onOpen = () => (sseStore.connected = true)
  20. const onClose = () => (sseStore.connected = false)
  21. const onMessage = (eventData: MercureEntityUpdate) => {
  22. sseStore.addEvent(eventData)
  23. }
  24. const sseSource = new SseSource(
  25. runtimeConfig.public.baseUrlMercure,
  26. 'access/' + accessProfile.currentAccessId,
  27. onOpen,
  28. onMessage,
  29. onClose,
  30. )
  31. sseSource.subscribe()
  32. window.addEventListener('beforeunload', () => {
  33. sseSource.unsubscribe()
  34. })
  35. })