Files
2026-06-16 11:24:50 +08:00

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}});
// }
})
}