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,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;