Mercurial > code > home > repos > light9
changeset 1950:19c2e6216cf8
support disconnect() on a reconnectingWebSocket to make it stop connecting
Ignore-this: db2fa6ff2ccdeadecf1fc7a1d144535c
author | Drew Perttula <drewp@bigasterisk.com> |
---|---|
date | Thu, 06 Jun 2019 00:07:07 +0000 |
parents | 88ca10c9e31a |
children | 9f0f2b39ad95 |
files | light9/web/websocket.js |
diffstat | 1 files changed, 52 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- a/light9/web/websocket.js Thu Jun 06 00:06:00 2019 +0000 +++ b/light9/web/websocket.js Thu Jun 06 00:07:07 2019 +0000 @@ -2,30 +2,61 @@ url is now relative to the window location. Note that nginx may drop the connection after 60sec of inactivity. */ -function reconnectingWebSocket(url, onMessage) { - var pong = 0; + +class ReconnectingWebsocket { - var fullUrl = ( - "ws://" - + window.location.host - + window.location.pathname - + (window.location.pathname.match(/\/$/) ? "" : "/") - + url); - function connect() { - var ws = new WebSocket(fullUrl); + constructor(url, onMessage) { + this.onMessage = onMessage; + this.ws = null; + this.connectTimer = null + this.pong = 0; - ws.onopen = function() { $("#status").text("connected"); }; - ws.onerror = function(e) { $("#status").text("error: "+e); }; - ws.onclose = function() { - pong = 1 - pong; - $("#status").text("disconnected (retrying "+(pong ? "😼":"😺")+")"); - // this should be under a requestAnimationFrame to - // save resources - setTimeout(connect, 2000); + this.fullUrl = ( + "ws://" + + window.location.host + + window.location.pathname + + (window.location.pathname.match(/\/$/) ? "" : "/") + + url); + this.connect(); + } + setStatus(txt) { + const docStatus = document.querySelector('#status') + if (docStatus) { + docStatus.innerText = txt; + } + } + connect() { + this.reconnect = true; + this.ws = new WebSocket(this.fullUrl); + + this.ws.onopen = () => { this.setStatus("connected"); }; + this.ws.onerror = (e) => { this.setStatus("error: "+e); }; + this.ws.onclose = () => { + this.pong = 1 - this.pong; + this.setStatus("disconnected (retrying "+(this.pong ? "😼":"😺")+")"); + this.ws = null; + + this.connectTimer = setTimeout(() => { + this.connectTimer = null; + requestAnimationFrame(() => { + if (this.reconnect) { + this.connect(); + } + }); + }, 2000); }; - ws.onmessage = function (evt) { - onMessage(JSON.parse(evt.data)); + this.ws.onmessage = (evt) => { + this.onMessage(JSON.parse(evt.data)); }; } - connect(); + disconnect() { + this.reconnect = false; + this.ws.close(); + } } + + + +function reconnectingWebSocket(url, onMessage) { + return new ReconnectingWebsocket(url, onMessage); +}