actions.js 2.6 KB

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