93 lines
2.6 KiB
JavaScript
93 lines
2.6 KiB
JavaScript
|
|
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}});
|
|
// }
|
|
})
|
|
} |