NDOJ/resources/event.js
2023-05-20 08:52:37 +09:00

74 lines
2.5 KiB
JavaScript
Executable file

function EventReceiver(websocket, poller, channels, last_msg, onmessage) {
this.websocket_path = websocket;
this.channels = channels;
this.last_msg = last_msg;
this.poller_base = poller;
this.poller_path = poller + channels.join('|');
if (onmessage)
this.onmessage = onmessage;
var receiver = this;
function init_poll() {
function long_poll() {
$.ajax({
url: receiver.poller_path,
data: {last: receiver.last_msg},
success: function (data, status, jqXHR) {
receiver.onmessage(data.message);
receiver.last_msg = data.id;
long_poll();
},
error: function (jqXHR, status, error) {
if (jqXHR.status == 504)
long_poll();
else {
console.log('Long poll failure: ' + status);
console.log(jqXHR);
setTimeout(long_poll, 2000);
}
},
dataType: "json"
});
}
long_poll();
}
this.onwsclose = null;
if (window.WebSocket) {
function connect() {
this.websocket = new WebSocket(websocket);
var timeout = setTimeout(function () {
receiver.websocket.close();
receiver.websocket = null;
init_poll();
}, 2000);
this.websocket.onopen = function (event) {
clearTimeout(timeout);
this.send(JSON.stringify({
command: 'start-msg',
start: last_msg
}));
this.send(JSON.stringify({
command: 'set-filter',
filter: channels
}));
};
this.websocket.onmessage = function (event) {
var data = JSON.parse(event.data);
receiver.onmessage(data.message);
receiver.last_msg = data.id;
};
this.websocket.onclose = function (event) {
if (event.code != 1000 && receiver.onwsclose !== null)
receiver.onwsclose(event);
if (event.code == 1006) {
setTimeout(connect, 1000);
}
}
}
connect();
} else {
this.websocket = null;
init_poll();
}
}