Check for homeserver liveliness more
This commit is contained in:
@@ -27,13 +27,21 @@ const homeserverStatus = new class HomeserverStatus {
|
|||||||
/** @private */
|
/** @private */
|
||||||
this.pingInterval = undefined
|
this.pingInterval = undefined
|
||||||
|
|
||||||
|
/** @private */
|
||||||
|
this.checkingWhileOnline = true
|
||||||
|
|
||||||
|
/** @private */
|
||||||
|
this.lastCheck = 0
|
||||||
|
|
||||||
/** @private */
|
/** @private */
|
||||||
this.sm = new StateMachine("online")
|
this.sm = new StateMachine("online")
|
||||||
.defineState("online")
|
.defineState("online")
|
||||||
|
|
||||||
.defineState("checking", {
|
.defineState("checking", {
|
||||||
onEnter: [async () => {
|
onEnter: [async (event) => {
|
||||||
|
this.checkingWhileOnline = event === "check while online"
|
||||||
const pingResult = await api.ping().catch(e => ({ok: false}))
|
const pingResult = await api.ping().catch(e => ({ok: false}))
|
||||||
|
this.lastCheck = Date.now()
|
||||||
if (pingResult.ok) {
|
if (pingResult.ok) {
|
||||||
this.sm.doTransition("check ok")
|
this.sm.doTransition("check ok")
|
||||||
} else {
|
} else {
|
||||||
@@ -48,6 +56,7 @@ const homeserverStatus = new class HomeserverStatus {
|
|||||||
onEnter: [() => {
|
onEnter: [() => {
|
||||||
this.pingInterval = setInterval(async () => {
|
this.pingInterval = setInterval(async () => {
|
||||||
const pingResult = await api.ping().catch(e => ({ok: false, status: "net", root: e.message}))
|
const pingResult = await api.ping().catch(e => ({ok: false, status: "net", root: e.message}))
|
||||||
|
this.lastCheck = Date.now()
|
||||||
if (pingResult.ok) {
|
if (pingResult.ok) {
|
||||||
this.sm.doTransition("ping ok")
|
this.sm.doTransition("ping ok")
|
||||||
}
|
}
|
||||||
@@ -77,7 +86,8 @@ const homeserverStatus = new class HomeserverStatus {
|
|||||||
.defineUniversalTransition("error", "offline")
|
.defineUniversalTransition("error", "offline")
|
||||||
.defineTransition("offline", "ping ok", "recovering")
|
.defineTransition("offline", "ping ok", "recovering")
|
||||||
.defineTransition("recovering", "recovered", "online")
|
.defineTransition("recovering", "recovered", "online")
|
||||||
.defineTransition("online", "check", "checking")
|
.defineTransition("online", "check assume online", "checking")
|
||||||
|
.defineTransition("online", "check assume offline", "checking")
|
||||||
.defineTransition("checking", "check ok", "recovering")
|
.defineTransition("checking", "check ok", "recovering")
|
||||||
.defineTransition("checking", "check fail", "offline")
|
.defineTransition("checking", "check fail", "offline")
|
||||||
|
|
||||||
@@ -87,7 +97,7 @@ const homeserverStatus = new class HomeserverStatus {
|
|||||||
}
|
}
|
||||||
|
|
||||||
isRealTime() {
|
isRealTime() {
|
||||||
return this.sm.currentStateName === "online"
|
return this.sm.currentStateName === "online" || (this.sm.currentStateName === "checking" && this.checkingWhileOnline)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @param {boolean} forceCheck */
|
/** @param {boolean} forceCheck */
|
||||||
@@ -96,7 +106,9 @@ const homeserverStatus = new class HomeserverStatus {
|
|||||||
// Already online? Start check or just done
|
// Already online? Start check or just done
|
||||||
if (this.sm.currentStateName === "online") {
|
if (this.sm.currentStateName === "online") {
|
||||||
if (forceCheck) {
|
if (forceCheck) {
|
||||||
this.sm.doTransition("check")
|
this.sm.doTransition("check assume offline")
|
||||||
|
} else if (this.lastCheck < Date.now() - 15e3) {
|
||||||
|
this.sm.doTransition("check assume online")
|
||||||
} else {
|
} else {
|
||||||
return resolve(null)
|
return resolve(null)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user