Fix out of order WS issues on firefox

This commit is contained in:
MathMan05 2024-08-14 12:35:59 -05:00
parent a605f1672a
commit 3cdb1bb8e1
2 changed files with 82 additions and 60 deletions

View file

@ -143,15 +143,39 @@ class Localuser {
let w; let w;
let r; let r;
let arr; let arr;
let build = "";
if (DecompressionStream) { if (DecompressionStream) {
ds = new DecompressionStream("deflate"); ds = new DecompressionStream("deflate");
w = ds.writable.getWriter(); w = ds.writable.getWriter();
r = ds.readable.getReader(); r = ds.readable.getReader();
arr = new Uint8Array(); arr = new Uint8Array();
} (async () => {
let build = "";
this.ws.addEventListener('message', async (event) => {
let temp; let temp;
while (true) {
const read = (await r.read());
const data = new TextDecoder().decode(read.value);
build += data;
try {
temp = JSON.parse(build);
build = "";
if (temp.op === 0 && temp.t === "READY") {
returny();
}
this.handleEvent(temp);
}
catch {
}
}
})();
}
let order = new Promise((res) => (res()));
this.ws.addEventListener('message', async (event) => {
const temp2 = order;
let res;
order = new Promise((r) => (res = r));
await temp2;
let temp;
try {
if (event.data instanceof Blob) { if (event.data instanceof Blob) {
const buff = await event.data.arrayBuffer(); const buff = await event.data.arrayBuffer();
const array = new Uint8Array(buff); const array = new Uint8Array(buff);
@ -165,26 +189,7 @@ class Localuser {
} }
w.write(arr.buffer); w.write(arr.buffer);
arr = new Uint8Array(); arr = new Uint8Array();
//console.log(data,test); return; //had to move the while loop due to me being dumb
while (true) {
const read = (await r.read());
const data = new TextDecoder().decode(read.value);
if (data === "") {
break;
}
build += data;
console.log("temp");
try {
temp = JSON.parse(build);
build = "";
if (temp.op === 0 && temp.t === "READY") {
returny();
}
this.handleEvent(temp);
}
catch {
}
}
} }
else { else {
temp = JSON.parse(event.data); temp = JSON.parse(event.data);
@ -193,6 +198,13 @@ class Localuser {
returny(); returny();
} }
this.handleEvent(temp); this.handleEvent(temp);
}
catch (e) {
console.error(e);
}
finally {
res();
}
}); });
this.ws.addEventListener("close", event => { this.ws.addEventListener("close", event => {
this.ws = undefined; this.ws = undefined;

View file

@ -149,17 +149,41 @@ class Localuser{
let w:WritableStreamDefaultWriter; let w:WritableStreamDefaultWriter;
let r:ReadableStreamDefaultReader; let r:ReadableStreamDefaultReader;
let arr:Uint8Array; let arr:Uint8Array;
let build="";
if(DecompressionStream){ if(DecompressionStream){
ds = new DecompressionStream("deflate"); ds = new DecompressionStream("deflate");
w= ds.writable.getWriter(); w= ds.writable.getWriter();
r=ds.readable.getReader(); r=ds.readable.getReader();
arr=new Uint8Array(); arr=new Uint8Array();
(async ()=>{
let temp:any;
while(true){
const read=(await r.read());
const data=new TextDecoder().decode(read.value);
build+=data;
try{
temp=JSON.parse(build);
build="";
if(temp.op===0&&temp.t==="READY"){
returny();
}
this.handleEvent(temp);
}catch{
}
}
})();
} }
let build=""; let order=new Promise<void>((res)=>(res()));
this.ws.addEventListener('message', async (event) => { this.ws.addEventListener('message', async (event) => {
const temp2=order;
let res:Function;
order=new Promise<void>((r)=>(res=r))
await temp2;
let temp:{op:number,t:string}; let temp:{op:number,t:string};
try{
if(event.data instanceof Blob){ if(event.data instanceof Blob){
const buff=await event.data.arrayBuffer() const buff=await event.data.arrayBuffer()
const array=new Uint8Array(buff); const array=new Uint8Array(buff);
@ -175,25 +199,7 @@ class Localuser{
} }
w.write(arr.buffer); w.write(arr.buffer);
arr=new Uint8Array(); arr=new Uint8Array();
//console.log(data,test); return;//had to move the while loop due to me being dumb
while(true){
const read=(await r.read());
const data=new TextDecoder().decode(read.value);
if(data===""){
break;
}
build+=data;
console.log("temp");
try{
temp=JSON.parse(build);
build="";
if(temp.op===0&&temp.t==="READY"){
returny();
}
this.handleEvent(temp);
}catch{
}
}
}else{ }else{
temp=JSON.parse(event.data); temp=JSON.parse(event.data);
} }
@ -201,7 +207,11 @@ class Localuser{
returny(); returny();
} }
this.handleEvent(temp); this.handleEvent(temp);
}catch(e){
console.error(e);
}finally{
res();
}
}); });
this.ws.addEventListener("close", event => { this.ws.addEventListener("close", event => {