()
| 221 | let serverState = { status: ServerStates.unavailable, time: Date.now() } |
| 222 | |
| 223 | async function healthCheck() { |
| 224 | if (Date.now() < serverState.time + HEALTH_PING_INTERVAL / 2 && isServerAvailable()) { |
| 225 | // Ping confirmed online less than half of HEALTH_PING_INTERVAL ago. |
| 226 | return true |
| 227 | } |
| 228 | if (Date.now() >= serverState.time + SERVER_STATE_VALIDITY_DURATION) { |
| 229 | console.warn("WARNING! SERVER_STATE_VALIDITY_DURATION has elapsed since the last Ping completed.") |
| 230 | } |
| 231 | try { |
| 232 | let res = undefined |
| 233 | if (typeof sessionId !== "undefined") { |
| 234 | res = await fetch("/ping?session_id=" + sessionId) |
| 235 | } else { |
| 236 | res = await fetch("/ping") |
| 237 | } |
| 238 | serverState = await res.json() |
| 239 | if (typeof serverState !== "object" || typeof serverState.status !== "string") { |
| 240 | console.error(`Server reply didn't contain a state value.`) |
| 241 | serverState = { status: ServerStates.unavailable, time: Date.now() } |
| 242 | setServerStatus("error", "offline") |
| 243 | return false |
| 244 | } |
| 245 | |
| 246 | // Set status |
| 247 | switch (serverState.status) { |
| 248 | case ServerStates.init: |
| 249 | // Wait for init to complete before updating status. |
| 250 | break |
| 251 | case ServerStates.online: |
| 252 | setServerStatus("online", "ready") |
| 253 | break |
| 254 | case ServerStates.loadingModel: |
| 255 | setServerStatus("busy", "loading..") |
| 256 | break |
| 257 | case ServerStates.rendering: |
| 258 | setServerStatus("busy", "rendering..") |
| 259 | break |
| 260 | default: |
| 261 | // Unavailable |
| 262 | console.error("Ping received an unexpected server status. Status: %s", serverState.status) |
| 263 | setServerStatus("error", serverState.status.toLowerCase()) |
| 264 | break |
| 265 | } |
| 266 | serverState.time = Date.now() |
| 267 | await eventSource.fireEvent(EVENT_PING, serverState) |
| 268 | return true |
| 269 | } catch (e) { |
| 270 | console.error(e) |
| 271 | serverState = { status: ServerStates.unavailable, time: Date.now() } |
| 272 | setServerStatus("error", "offline") |
| 273 | } |
| 274 | return false |
| 275 | } |
| 276 | |
| 277 | function isServerAvailable() { |
| 278 | if (typeof serverState !== "object") { |
no test coverage detected