Files
pathfinder-websocket/js/worker/chat.js
2016-11-12 18:17:33 +01:00

91 lines
2.4 KiB
JavaScript

'use strict';
self.importScripts('message.js');
var socket = null;
var ports = [];
var notifications = false;
var initSocket = function(uri){
var msgWorkerOpen = new msgWorker('ws:open');
if(socket === null){
socket = new WebSocket(uri);
socket.onopen = function(e){
msgWorkerOpen.socket = this;
ports[ports.length - 1].postMessage(msgWorkerOpen);
socket.onmessage = function(e){
let load = JSON.parse(e.data);
let msgWorkerSend = new msgWorker('ws:send');
msgWorkerSend.socket = this;
msgWorkerSend.data(load);
for (let i = 0; i < ports.length; i++) {
ports[i].postMessage(msgWorkerSend);
}
if(notifications){
new Notification('Message: ' + load.text);
}
};
socket.onclose = function(){
let msgWorkerWsClosed = new msgWorker('ws:closed');
msgWorkerWsClosed.socket = this;
console.log(socket.readyState);
for (let i = 0; i < ports.length; i++) {
ports[i].postMessage(msgWorkerWsClosed);
}
};
socket.onerror = function(){
console.error('ws: onerror()');
};
}
}else{
// socket still open
ports[ports.length - 1].postMessage(msgWorkerOpen);
}
};
self.addEventListener('connect', function (event){
let port = event.ports[0];
ports.push(port);
port.addEventListener('message', function (e){
let load = e.data;
load.__proto__ = msgWorker.prototype;
switch(load.command){
case 'ws:init':
initSocket(load.data().uri);
break;
case 'ws:send':
socket.send(JSON.stringify(load.data()));
break;
case 'ws:close':
closeSocket();
break;
case 'ws:notify':
notifications = load.data().status;
break;
}
}, false);
port.start();
}, false);
// Util ================================================================
var closeSocket = function(){
// only close if active
if(socket.readyState === socket.OPEN){
socket.close();
}
};