sse.ts 901 B

123456789101112131415161718192021222324252627282930313233343536
  1. import { defineStore } from 'pinia'
  2. import { ref } from 'vue'
  3. import type { Ref } from 'vue'
  4. import { useEntityManager } from '~/composables/data/useEntityManager'
  5. import type { MercureEntityUpdate } from '~/types/interfaces'
  6. export const useSseStore = defineStore('sse', () => {
  7. const connected: Ref<boolean> = ref(false)
  8. const events: Ref<Array<MercureEntityUpdate>> = ref([])
  9. const addEvent = async (event: MercureEntityUpdate) => {
  10. const { em } = useEntityManager()
  11. const model = await em.getModelFromIri(event.iri)
  12. const instance = em.newInstance(model, JSON.parse(event.data))
  13. switch (event.operation) {
  14. case 'update':
  15. case 'create':
  16. em.save(instance, true)
  17. break
  18. case 'delete':
  19. break
  20. default:
  21. throw new Error('SSE: unknown operation type')
  22. }
  23. }
  24. return {
  25. connected,
  26. events,
  27. addEvent,
  28. }
  29. })