fix websockets

This commit is contained in:
CoolElectronics 2024-03-02 11:39:08 -05:00
parent 5a5a5debdb
commit 95c4c25cbc
No known key found for this signature in database
GPG key ID: F63593D168636C50
6 changed files with 88 additions and 45 deletions

View file

@ -56,6 +56,6 @@ export declare class BareClient {
* Create a BareClient. Calls to fetch and connect will wait for an implementation to be ready. * Create a BareClient. Calls to fetch and connect will wait for an implementation to be ready.
*/ */
constructor(); constructor();
createWebSocket(remote: string | URL, protocols: string | string[] | undefined, webSocketImpl: WebSocketImpl, requestHeaders: BareHeaders): WebSocket; createWebSocket(remote: string | URL, protocols: string | string[] | undefined, webSocketImpl: WebSocketImpl, requestHeaders: BareHeaders, arrayBufferImpl: typeof ArrayBuffer): WebSocket;
fetch(url: string | URL, init?: RequestInit): Promise<BareResponseFetch>; fetch(url: string | URL, init?: RequestInit): Promise<BareResponseFetch>;
} }

41
dist/bare.cjs vendored
View file

@ -106,7 +106,7 @@
* Create a BareClient. Calls to fetch and connect will wait for an implementation to be ready. * Create a BareClient. Calls to fetch and connect will wait for an implementation to be ready.
*/ */
constructor() { } constructor() { }
createWebSocket(remote, protocols = [], webSocketImpl, requestHeaders) { createWebSocket(remote, protocols = [], webSocketImpl, requestHeaders, arrayBufferImpl) {
let switcher = findSwitcher(); let switcher = findSwitcher();
let client = switcher.active; let client = switcher.active;
if (!client) if (!client)
@ -139,7 +139,15 @@
initialErrorHappened = true; initialErrorHappened = true;
} }
}); });
let initialCloseHappened = false;
socket.addEventListener("close", (e) => {
if (!initialCloseHappened) {
e.stopImmediatePropagation();
initialCloseHappened = true;
}
});
// TODO socket onerror will be broken // TODO socket onerror will be broken
arrayBufferImpl = arrayBufferImpl || webSocketImpl.constructor.constructor("return ArrayBuffer")().prototype;
requestHeaders['Host'] = (new URL(remote)).host; requestHeaders['Host'] = (new URL(remote)).host;
// requestHeaders['Origin'] = origin; // requestHeaders['Origin'] = origin;
requestHeaders['Pragma'] = 'no-cache'; requestHeaders['Pragma'] = 'no-cache';
@ -156,20 +164,27 @@
} }
}; // what the fuck is a meta }; // what the fuck is a meta
socket.dispatchEvent(new Event("open")); socket.dispatchEvent(new Event("open"));
}, (payload) => { }, async (payload) => {
console.log(payload); if (typeof payload === "string") {
if (payload.data) { socket.dispatchEvent(new MessageEvent("message", { data: payload }));
socket.dispatchEvent(new MessageEvent("message", { data: payload.data })); }
return; else if ("byteLength" in payload) {
if (socket.binaryType === "blob") {
payload = new Blob([payload]);
}
else {
Object.setPrototypeOf(payload, arrayBufferImpl);
} }
socket.dispatchEvent(new MessageEvent("message", { data: payload })); socket.dispatchEvent(new MessageEvent("message", { data: payload }));
// if (typeof payload === "string") { }
// } else if (payload instanceof ArrayBuffer) { else if ("arrayBuffer" in payload) {
// Object.setPrototypeOf(payload, ArrayBuffer); if (socket.binaryType === "arraybuffer") {
// payload = await payload.arrayBuffer();
// socket.dispatchEvent(new MessageEvent("message", { data: payload })); Object.setPrototypeOf(payload, arrayBufferImpl);
// } else if (payload instanceof Blob) { console.log(payload);
// } }
socket.dispatchEvent(new MessageEvent("message", { data: payload }));
}
}, (code, reason) => { }, (code, reason) => {
fakeReadyState = WebSocketFields.CLOSED; fakeReadyState = WebSocketFields.CLOSED;
socket.dispatchEvent(new CloseEvent("close", { code, reason })); socket.dispatchEvent(new CloseEvent("close", { code, reason }));

2
dist/bare.cjs.map vendored

File diff suppressed because one or more lines are too long

41
dist/index.js vendored
View file

@ -100,7 +100,7 @@ class BareClient {
* Create a BareClient. Calls to fetch and connect will wait for an implementation to be ready. * Create a BareClient. Calls to fetch and connect will wait for an implementation to be ready.
*/ */
constructor() { } constructor() { }
createWebSocket(remote, protocols = [], webSocketImpl, requestHeaders) { createWebSocket(remote, protocols = [], webSocketImpl, requestHeaders, arrayBufferImpl) {
let switcher = findSwitcher(); let switcher = findSwitcher();
let client = switcher.active; let client = switcher.active;
if (!client) if (!client)
@ -133,7 +133,15 @@ class BareClient {
initialErrorHappened = true; initialErrorHappened = true;
} }
}); });
let initialCloseHappened = false;
socket.addEventListener("close", (e) => {
if (!initialCloseHappened) {
e.stopImmediatePropagation();
initialCloseHappened = true;
}
});
// TODO socket onerror will be broken // TODO socket onerror will be broken
arrayBufferImpl = arrayBufferImpl || webSocketImpl.constructor.constructor("return ArrayBuffer")().prototype;
requestHeaders['Host'] = (new URL(remote)).host; requestHeaders['Host'] = (new URL(remote)).host;
// requestHeaders['Origin'] = origin; // requestHeaders['Origin'] = origin;
requestHeaders['Pragma'] = 'no-cache'; requestHeaders['Pragma'] = 'no-cache';
@ -150,20 +158,27 @@ class BareClient {
} }
}; // what the fuck is a meta }; // what the fuck is a meta
socket.dispatchEvent(new Event("open")); socket.dispatchEvent(new Event("open"));
}, (payload) => { }, async (payload) => {
console.log(payload); if (typeof payload === "string") {
if (payload.data) { socket.dispatchEvent(new MessageEvent("message", { data: payload }));
socket.dispatchEvent(new MessageEvent("message", { data: payload.data })); }
return; else if ("byteLength" in payload) {
if (socket.binaryType === "blob") {
payload = new Blob([payload]);
}
else {
Object.setPrototypeOf(payload, arrayBufferImpl);
} }
socket.dispatchEvent(new MessageEvent("message", { data: payload })); socket.dispatchEvent(new MessageEvent("message", { data: payload }));
// if (typeof payload === "string") { }
// } else if (payload instanceof ArrayBuffer) { else if ("arrayBuffer" in payload) {
// Object.setPrototypeOf(payload, ArrayBuffer); if (socket.binaryType === "arraybuffer") {
// payload = await payload.arrayBuffer();
// socket.dispatchEvent(new MessageEvent("message", { data: payload })); Object.setPrototypeOf(payload, arrayBufferImpl);
// } else if (payload instanceof Blob) { console.log(payload);
// } }
socket.dispatchEvent(new MessageEvent("message", { data: payload }));
}
}, (code, reason) => { }, (code, reason) => {
fakeReadyState = WebSocketFields.CLOSED; fakeReadyState = WebSocketFields.CLOSED;
socket.dispatchEvent(new CloseEvent("close", { code, reason })); socket.dispatchEvent(new CloseEvent("close", { code, reason }));

2
dist/index.js.map vendored

File diff suppressed because one or more lines are too long

View file

@ -99,6 +99,7 @@ export class BareClient {
protocols: string | string[] | undefined = [], protocols: string | string[] | undefined = [],
webSocketImpl: WebSocketImpl, webSocketImpl: WebSocketImpl,
requestHeaders: BareHeaders, requestHeaders: BareHeaders,
arrayBufferImpl: typeof ArrayBuffer,
): WebSocket { ): WebSocket {
let switcher = findSwitcher(); let switcher = findSwitcher();
let client = switcher.active; let client = switcher.active;
@ -148,9 +149,16 @@ export class BareClient {
initialErrorHappened = true; initialErrorHappened = true;
} }
}); });
let initialOnErrorHappenned = false; let initialCloseHappened = false;
socket.addEventListener("close", (e) => {
if (!initialCloseHappened) {
e.stopImmediatePropagation();
initialCloseHappened = true;
}
});
// TODO socket onerror will be broken // TODO socket onerror will be broken
arrayBufferImpl = arrayBufferImpl || webSocketImpl.constructor.constructor("return ArrayBuffer")().prototype;
requestHeaders['Host'] = (new URL(remote)).host; requestHeaders['Host'] = (new URL(remote)).host;
// requestHeaders['Origin'] = origin; // requestHeaders['Origin'] = origin;
requestHeaders['Pragma'] = 'no-cache'; requestHeaders['Pragma'] = 'no-cache';
@ -174,20 +182,25 @@ export class BareClient {
}; // what the fuck is a meta }; // what the fuck is a meta
socket.dispatchEvent(new Event("open")); socket.dispatchEvent(new Event("open"));
}, },
(payload) => { async (payload) => {
console.log(payload); if (typeof payload === "string") {
if ((payload as any).data) {
socket.dispatchEvent(new MessageEvent("message", { data: (payload as any).data }));
return;
}
socket.dispatchEvent(new MessageEvent("message", { data: payload })); socket.dispatchEvent(new MessageEvent("message", { data: payload }));
// if (typeof payload === "string") { } else if ("byteLength" in payload) {
// } else if (payload instanceof ArrayBuffer) { if (socket.binaryType === "blob") {
// Object.setPrototypeOf(payload, ArrayBuffer); payload = new Blob([payload]);
// } else {
// socket.dispatchEvent(new MessageEvent("message", { data: payload })); Object.setPrototypeOf(payload, arrayBufferImpl);
// } else if (payload instanceof Blob) { }
// }
socket.dispatchEvent(new MessageEvent("message", { data: payload }));
} else if ("arrayBuffer" in payload) {
if (socket.binaryType === "arraybuffer") {
payload = await payload.arrayBuffer()
Object.setPrototypeOf(payload, arrayBufferImpl);
}
socket.dispatchEvent(new MessageEvent("message", { data: payload }));
}
}, },
(code, reason) => { (code, reason) => {
fakeReadyState = WebSocketFields.CLOSED; fakeReadyState = WebSocketFields.CLOSED;