From 3cdb1bb8e107ef75d0f9c9e054f9361f999a6f65 Mon Sep 17 00:00:00 2001 From: MathMan05 Date: Wed, 14 Aug 2024 12:35:59 -0500 Subject: [PATCH] Fix out of order WS issues on firefox --- .dist/localuser.js | 66 ++++++++++++++++++++++---------------- webpage/localuser.ts | 76 +++++++++++++++++++++++++------------------- 2 files changed, 82 insertions(+), 60 deletions(-) diff --git a/.dist/localuser.js b/.dist/localuser.js index a0f1a25..3465949 100644 --- a/.dist/localuser.js +++ b/.dist/localuser.js @@ -143,37 +143,18 @@ class Localuser { let w; let r; let arr; + let build = ""; if (DecompressionStream) { ds = new DecompressionStream("deflate"); w = ds.writable.getWriter(); r = ds.readable.getReader(); arr = new Uint8Array(); - } - let build = ""; - this.ws.addEventListener('message', async (event) => { - let temp; - if (event.data instanceof Blob) { - const buff = await event.data.arrayBuffer(); - const array = new Uint8Array(buff); - const temparr = new Uint8Array(array.length + arr.length); - temparr.set(arr, 0); - temparr.set(array, arr.length); - arr = temparr; - const len = array.length; - if (!(array[len - 1] === 255 && array[len - 2] === 255 && array[len - 3] === 0 && array[len - 4] === 0)) { - return; - } - w.write(arr.buffer); - arr = new Uint8Array(); - //console.log(data,test); + (async () => { + let temp; 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 = ""; @@ -185,14 +166,45 @@ class Localuser { 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) { + const buff = await event.data.arrayBuffer(); + const array = new Uint8Array(buff); + const temparr = new Uint8Array(array.length + arr.length); + temparr.set(arr, 0); + temparr.set(array, arr.length); + arr = temparr; + const len = array.length; + if (!(array[len - 1] === 255 && array[len - 2] === 255 && array[len - 3] === 0 && array[len - 4] === 0)) { + return; + } + w.write(arr.buffer); + arr = new Uint8Array(); + return; //had to move the while loop due to me being dumb + } + else { + temp = JSON.parse(event.data); + } + if (temp.op === 0 && temp.t === "READY") { + returny(); + } + this.handleEvent(temp); } - else { - temp = JSON.parse(event.data); + catch (e) { + console.error(e); } - if (temp.op === 0 && temp.t === "READY") { - returny(); + finally { + res(); } - this.handleEvent(temp); }); this.ws.addEventListener("close", event => { this.ws = undefined; diff --git a/webpage/localuser.ts b/webpage/localuser.ts index 15ee8f2..6382ee8 100644 --- a/webpage/localuser.ts +++ b/webpage/localuser.ts @@ -149,41 +149,18 @@ class Localuser{ let w:WritableStreamDefaultWriter; let r:ReadableStreamDefaultReader; let arr:Uint8Array; + let build=""; if(DecompressionStream){ ds = new DecompressionStream("deflate"); w= ds.writable.getWriter(); r=ds.readable.getReader(); arr=new Uint8Array(); - } - - - let build=""; - this.ws.addEventListener('message', async (event) => { - let temp:{op:number,t:string}; - if(event.data instanceof Blob){ - const buff=await event.data.arrayBuffer() - const array=new Uint8Array(buff); - - const temparr=new Uint8Array(array.length+arr.length); - temparr.set(arr, 0); - temparr.set(array, arr.length); - arr=temparr; - - const len=array.length; - if(!(array[len-1]===255&&array[len-2]===255&&array[len-3]===0&&array[len-4]===0)){ - return; - } - w.write(arr.buffer); - arr=new Uint8Array(); - //console.log(data,test); + (async ()=>{ + let temp:any; 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=""; @@ -194,14 +171,47 @@ class Localuser{ }catch{ } } - }else{ - temp=JSON.parse(event.data); - } - if(temp.op===0&&temp.t==="READY"){ - returny(); - } - this.handleEvent(temp); + })(); + } + + let order=new Promise((res)=>(res())); + + this.ws.addEventListener('message', async (event) => { + const temp2=order; + let res:Function; + order=new Promise((r)=>(res=r)) + await temp2; + let temp:{op:number,t:string}; + try{ + if(event.data instanceof Blob){ + const buff=await event.data.arrayBuffer() + const array=new Uint8Array(buff); + + const temparr=new Uint8Array(array.length+arr.length); + temparr.set(arr, 0); + temparr.set(array, arr.length); + arr=temparr; + + const len=array.length; + if(!(array[len-1]===255&&array[len-2]===255&&array[len-3]===0&&array[len-4]===0)){ + return; + } + w.write(arr.buffer); + arr=new Uint8Array(); + return;//had to move the while loop due to me being dumb + }else{ + temp=JSON.parse(event.data); + } + if(temp.op===0&&temp.t==="READY"){ + returny(); + } + this.handleEvent(temp); + }catch(e){ + console.error(e); + }finally{ + res(); + } }); this.ws.addEventListener("close", event => {