2021-08-05 02:22:28 +02:00
|
|
|
import buildUrl from 'build-url'
|
|
|
|
|
2021-07-30 21:03:43 +02:00
|
|
|
export default (context, inject) => {
|
2021-08-12 23:08:17 +02:00
|
|
|
const { store, $axios, $config, redirect } = context
|
2021-07-30 21:03:43 +02:00
|
|
|
|
|
|
|
const engine = {
|
|
|
|
lastFetched: [0, 0, 0, 0, 0],
|
2021-08-09 11:16:45 +02:00
|
|
|
isActive: false,
|
|
|
|
shouldStop: false,
|
|
|
|
|
2021-08-05 02:22:28 +02:00
|
|
|
async start() {
|
|
|
|
if (!store.state.engine.user) {
|
2021-08-05 02:33:47 +02:00
|
|
|
if (!await this.fetchUserInfo()) {
|
2021-08-12 23:08:17 +02:00
|
|
|
redirect('/')
|
2021-08-05 02:33:47 +02:00
|
|
|
}
|
2021-08-05 02:22:28 +02:00
|
|
|
}
|
2021-08-09 11:16:45 +02:00
|
|
|
if (this.isActive) {
|
|
|
|
console.warn('attempt to start already running engine!')
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
this.isActive = true
|
2021-07-30 21:03:43 +02:00
|
|
|
this.fetchUpdate()
|
|
|
|
},
|
2021-08-09 11:16:45 +02:00
|
|
|
|
|
|
|
stop() {
|
|
|
|
if (!this.isActive) return
|
|
|
|
this.shouldStop = true
|
|
|
|
},
|
|
|
|
|
2021-07-30 21:03:43 +02:00
|
|
|
async fetchUpdate() {
|
2021-08-09 11:16:45 +02:00
|
|
|
if (this.shouldStop || !this.isActive) {
|
|
|
|
this.isActive = false
|
|
|
|
this.shouldStop = false
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2021-07-30 21:03:43 +02:00
|
|
|
let delay = 0
|
|
|
|
try {
|
2021-08-05 02:22:28 +02:00
|
|
|
const url = buildUrl($config.serverBaseUrl, {
|
|
|
|
path: '/api/sync',
|
|
|
|
queryParams: {
|
|
|
|
v: store.state.engine.version + 1,
|
|
|
|
g: store.state.engine.user?.game,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
const response = await $axios.get(url)
|
2021-08-06 22:20:54 +02:00
|
|
|
store.commit('engine/setJson', response.data)
|
2021-07-30 21:03:43 +02:00
|
|
|
} catch (e) {
|
|
|
|
const { status, statusText } = e.response
|
2021-08-05 01:04:53 +02:00
|
|
|
if (status != 200) {
|
2021-07-30 21:03:43 +02:00
|
|
|
console.warn(`HTTP ${status} ${statusText}`)
|
|
|
|
delay = 5000
|
2021-07-30 21:49:39 +02:00
|
|
|
store.commit('engine/setVersion', -1)
|
2021-07-30 21:03:43 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const now = new Date().getTime()
|
|
|
|
const last = this.lastFetched.splice(0, 1)
|
|
|
|
this.lastFetched.push(now)
|
|
|
|
|
|
|
|
if (now - last < 1000) {
|
|
|
|
console.warn('engine: respawning too fast, throttling down')
|
|
|
|
delay = 5000
|
|
|
|
}
|
|
|
|
window.setTimeout(() => {
|
|
|
|
this.fetchUpdate()
|
|
|
|
}, delay)
|
|
|
|
},
|
|
|
|
|
2021-08-05 02:33:47 +02:00
|
|
|
async fetchUserInfo() {
|
|
|
|
try {
|
2021-08-12 23:08:17 +02:00
|
|
|
const response = await $axios.get('/api/userinfo')
|
|
|
|
store.commit('engine/setUser', response.data)
|
2021-08-05 02:33:47 +02:00
|
|
|
} catch(e) {
|
|
|
|
store.commit('engine/setUser', undefined)
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
return true
|
|
|
|
},
|
2021-07-30 21:03:43 +02:00
|
|
|
}
|
|
|
|
inject('engine', engine)
|
|
|
|
}
|