actions.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import Vue from 'vue'
  2. import { API_ROUTES, buildURI, buildWsURI, delay } from '../functions'
  3. export default {
  4. setAppUniqueId({ state, commit }) {
  5. if (!state.uuid) commit('setAppUniqueId')
  6. },
  7. resetApp({ commit }, { hostConfig = false, progression = false }) {
  8. commit('resetApp', { hostConfig, progression })
  9. },
  10. async setHostConfig({ state, commit }, { ssl, host, port }) {
  11. // Timeout after 1s
  12. const controller = new AbortController()
  13. const signal = controller.signal
  14. setTimeout(() => controller.abort(), 1500)
  15. const URI = buildURI(ssl, host, port, API_ROUTES.ping())
  16. return fetch(URI, { signal })
  17. .then(async res => {
  18. if (res.status !== 200) throw new Error(`Received wrong HTTP status code : ${res.status} (Need 200).`)
  19. const content = await res.text()
  20. if (content !== 'pong') throw new Error('Received wrong web content (Need to receive "pong").')
  21. this._vm.$connect(buildWsURI(ssl, host, port))
  22. // $connect does not return a Promise, so we wait to know if it worked
  23. await delay(300)
  24. if (!state.socket.isConnected)
  25. throw new Error('Could not connect to remote WebSocket server.')
  26. // Configuration is valid
  27. commit('setHostConfig', { ssl, host, port })
  28. })
  29. .catch(err => {
  30. // Host not reachable or invalid HTTP status code
  31. throw new Error(`Invalid configuration "${URI}". ${!err.message.includes('aborted') ? err.message : ''}`)
  32. })
  33. },
  34. async connectToWs({ state, getters }) {
  35. if (state.socket.isConnected) return /*eslint-disable-line */
  36. else if (getters.isHostConfigured) {
  37. this._vm.$connect(getters.getHostWsURI)
  38. // $connect does not return a Promise, so we wait to know if it worked
  39. await delay(300)
  40. if (!state.socket.isConnected)
  41. throw new Error('Could not connect to remote WebSocket server.')
  42. }
  43. else throw new Error('Could not connect to WebSocket server. Host is not configured.')
  44. },
  45. sendMessage(_, message) {
  46. Vue.prototype.$socket.send(JSON.stringify(message) || message)
  47. },
  48. async loadScenesList({ getters: { isHostConfigured, getHostURI }, commit }) {
  49. if (!isHostConfigured) throw new Error('Host is not configured.')
  50. const URI = getHostURI
  51. const scenes = await fetch(`${URI}${API_ROUTES.listScenes()}`).then(res => res.json())
  52. commit('setListScenes', scenes.data)
  53. },
  54. setExperimentProgress({ commit }, { experimentName, sceneName, data }) {
  55. commit('setExperimentProgress', { experimentName, sceneName, data })
  56. },
  57. setExperimentDone({ commit }, { experimentName, sceneName, done = true }) {
  58. commit('setExperimentDone', { experimentName, sceneName, done })
  59. }
  60. }