Blob.prototype.arrayBuffer = function(){ var reader = new FileReader(); var _resolve; var _Promise = new Promise(function(resolve,reject){ _resolve = resolve; }); reader.onloadend = function(){ _resolve(reader.result); } reader.readAsArrayBuffer(this); return _Promise; } this.timer = { time:0, offset:0, interval:1000, running:false, timerId:-1, start(){ this.running = true; this.time = performance.now(); this.loop(); }, stop(){ this.running = false; }, loop(){ if(!this.running) return; let now = performance.now(); let span = now - ( this.time - this.offset ); if(span > this.interval){ this.time = now; this.offset = span % this.interval ; this.handles.forEach(async handle=>{ handle(); }); } this.running && (this.timerId = setTimeout(()=>this.loop(),100)); }, handles:new Set(), on(handle){ if(!this.handles.has(handle))this.handles.add(handle); }, }; addEventListener("message",async function(ev){ var {key,payload} = ev.data; switch(key){ case "open": var {url} = payload; opensocket(url); break; case "send": var {data} = payload; this.socket.send(data); break; case "close": closesocket(); break; case "bufferedAmount": let val = (this.socket?.bufferedAmount || 0); postMessage({key:"bufferedAmount",payload:val}); break; } }); this.socket = null; let closesocket = function(){ socket.close(1000,"user closed"); } let opensocket = function(url){ this.socket = new WebSocket(url); this.socket.onopen = function () { postMessage({"key":"onopen","payload":null},[]); } this.socket.onclose = function (args) { let { code,reason,type,target } = args; let { url } = target; postMessage({"key":"onclose","payload":{code,reason,type,url}}); } this.socket.onerror = function () { postMessage({"key":"onerror","payload":null}); } this.socket.onmessage = async function (e) { var buffer = await e.data.arrayBuffer(); postMessage({"key":"onmessage","payload":buffer},[buffer]); } this.timer.start(); this.timer.on(()=>{ // if(this.socket.bufferedAmount > this.bufferMax){ // postMessage({"key":"onoverflow","payload":{size:this.socket.bufferedAmount}}); // } }) }