sse.ts 1002 B

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