sse.ts 1023 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import {MercureEntityUpdate, sseState} from "~/types/interfaces";
  2. import {defineStore} from "pinia";
  3. import {ref} from "@vue/reactivity";
  4. import {useEntityManager} from "~/composables/data/useEntityManager";
  5. export const useSseStore = defineStore('sse', () => {
  6. const connected = ref(false)
  7. const events = ref([])
  8. const addEvent = (state: sseState, event: MercureEntityUpdate) => {
  9. const { em } = useEntityManager()
  10. // TODO: voir à refactorer le "get model from iri"
  11. const matches = event.iri.match(/^\/api\/(\w+)\/.*/)
  12. if (!matches || !matches[1]) {
  13. throw new Error('cannot parse the IRI')
  14. }
  15. const entityName = matches[1]
  16. const model = em.getModelFor(entityName)
  17. switch (event.operation) {
  18. case "update":
  19. case "create":
  20. em.persist(model, JSON.parse(event.data))
  21. break
  22. case "delete":
  23. break
  24. default:
  25. throw new Error('SSE: unknown operation type')
  26. }
  27. }
  28. return {
  29. connected,
  30. events,
  31. addEvent
  32. }
  33. })