You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
138 lines
2.9 KiB
138 lines
2.9 KiB
7 years ago
|
/** Handle connections */
|
||
7 years ago
|
window.Conn = function (screen) {
|
||
7 years ago
|
let ws
|
||
|
let heartbeatTout
|
||
|
let pingIv
|
||
|
let xoff = false
|
||
|
let autoXoffTout
|
||
|
let reconTout
|
||
7 years ago
|
|
||
7 years ago
|
let pageShown = false
|
||
7 years ago
|
|
||
7 years ago
|
function onOpen (evt) {
|
||
|
console.log('CONNECTED')
|
||
|
heartbeat()
|
||
|
doSend('i')
|
||
7 years ago
|
}
|
||
|
|
||
7 years ago
|
function onClose (evt) {
|
||
|
console.warn('SOCKET CLOSED, code ' + evt.code + '. Reconnecting...')
|
||
|
clearTimeout(reconTout)
|
||
7 years ago
|
reconTout = setTimeout(function () {
|
||
7 years ago
|
init()
|
||
|
}, 2000)
|
||
7 years ago
|
// this happens when the buffer gets fucked up via invalid unicode.
|
||
|
// we basically use polling instead of socket then
|
||
|
}
|
||
|
|
||
7 years ago
|
function onMessage (evt) {
|
||
7 years ago
|
try {
|
||
|
// . = heartbeat
|
||
|
switch (evt.data.charAt(0)) {
|
||
7 years ago
|
case '.':
|
||
|
// heartbeat, no-op message
|
||
7 years ago
|
break
|
||
7 years ago
|
|
||
|
case '-':
|
||
7 years ago
|
// console.log('xoff');
|
||
|
xoff = true
|
||
7 years ago
|
autoXoffTout = setTimeout(function () {
|
||
7 years ago
|
xoff = false
|
||
|
}, 250)
|
||
|
break
|
||
7 years ago
|
|
||
|
case '+':
|
||
7 years ago
|
// console.log('xon');
|
||
|
xoff = false
|
||
|
clearTimeout(autoXoffTout)
|
||
|
break
|
||
7 years ago
|
|
||
|
default:
|
||
7 years ago
|
screen.load(evt.data)
|
||
7 years ago
|
if (!pageShown) {
|
||
|
showPage()
|
||
|
pageShown = true
|
||
|
}
|
||
|
break
|
||
7 years ago
|
}
|
||
7 years ago
|
heartbeat()
|
||
7 years ago
|
} catch (e) {
|
||
7 years ago
|
console.error(e)
|
||
7 years ago
|
}
|
||
|
}
|
||
|
|
||
7 years ago
|
function canSend () {
|
||
|
return !xoff
|
||
7 years ago
|
}
|
||
|
|
||
7 years ago
|
function doSend (message) {
|
||
7 years ago
|
if (_demo) {
|
||
7 years ago
|
console.log('TX: ', message)
|
||
|
return true // Simulate success
|
||
7 years ago
|
}
|
||
|
if (xoff) {
|
||
|
// TODO queue
|
||
7 years ago
|
console.log("Can't send, flood control.")
|
||
|
return false
|
||
7 years ago
|
}
|
||
|
|
||
7 years ago
|
if (!ws) return false // for dry testing
|
||
7 years ago
|
if (ws.readyState !== 1) {
|
||
7 years ago
|
console.error('Socket not ready')
|
||
|
return false
|
||
7 years ago
|
}
|
||
7 years ago
|
if (typeof message != 'string') {
|
||
|
message = JSON.stringify(message)
|
||
7 years ago
|
}
|
||
7 years ago
|
ws.send(message)
|
||
|
return true
|
||
7 years ago
|
}
|
||
|
|
||
7 years ago
|
function init () {
|
||
7 years ago
|
if (window._demo) {
|
||
7 years ago
|
console.log('Demo mode!')
|
||
7 years ago
|
screen.load(_demo_screen)
|
||
7 years ago
|
showPage()
|
||
|
return
|
||
7 years ago
|
}
|
||
|
|
||
7 years ago
|
clearTimeout(reconTout)
|
||
|
clearTimeout(heartbeatTout)
|
||
7 years ago
|
|
||
7 years ago
|
ws = new WebSocket('ws://' + _root + '/term/update.ws')
|
||
|
ws.onopen = onOpen
|
||
|
ws.onclose = onClose
|
||
|
ws.onmessage = onMessage
|
||
|
console.log('Opening socket.')
|
||
|
heartbeat()
|
||
7 years ago
|
}
|
||
|
|
||
7 years ago
|
function heartbeat () {
|
||
|
clearTimeout(heartbeatTout)
|
||
|
heartbeatTout = setTimeout(heartbeatFail, 2000)
|
||
7 years ago
|
}
|
||
|
|
||
7 years ago
|
function heartbeatFail () {
|
||
|
console.error('Heartbeat lost, probing server...')
|
||
7 years ago
|
pingIv = setInterval(function () {
|
||
7 years ago
|
console.log('> ping')
|
||
7 years ago
|
$.get('http://' + _root + '/system/ping', function (resp, status) {
|
||
7 years ago
|
if (status === 200) {
|
||
7 years ago
|
clearInterval(pingIv)
|
||
|
console.info('Server ready, reloading page...')
|
||
|
location.reload()
|
||
7 years ago
|
}
|
||
|
}, {
|
||
7 years ago
|
timeout: 100
|
||
|
})
|
||
|
}, 1000)
|
||
7 years ago
|
}
|
||
|
|
||
|
return {
|
||
|
ws: null,
|
||
|
init: init,
|
||
|
send: doSend,
|
||
7 years ago
|
canSend: canSend // check flood control
|
||
|
}
|
||
7 years ago
|
}
|