Start of svelte socket rewrite

This commit is contained in:
Niklas Jensen
2025-12-30 01:15:03 +01:00
committed by nikguin04
parent 5459d0edd4
commit 41d1b8e56d
7 changed files with 1769 additions and 31 deletions
File diff suppressed because it is too large Load Diff
+29 -18
View File
@@ -1,30 +1,38 @@
import { writable } from 'svelte/store'
import { encode, decode } from '@msgpack/msgpack'
import { WebsocketMessage } from '$lib/platform_shared/websocket_message'
const socketEvents = ['open', 'close', 'error', 'message', 'unresponsive'] as const
type SocketEvent = (typeof socketEvents)[number]
type SocketMessage = [string, ArrayBuffer]
type TaggedSocketMessage = [string, WebsocketMessage]
let useBinary = false
const decodeMessage = (data: ArrayBuffer): SocketMessage | null => {
const decodeMessage = (data: ArrayBuffer): TaggedSocketMessage => {
try {
const view = new Uint8Array(data);
let comma_index: number = 0;
let tag: string = "";
for (comma_index = 0; view[comma_index] != 0x2c; comma_index++) { // 0x2c is the ascii code for a comma!
tag += String.fromCharCode(view[comma_index]);
if (comma_index >= data.byteLength) { throw new RangeError("Comma index exceeded")}
}
return [ tag, data.slice(comma_index+1) ]
} catch (error) {
console.error(`Could not decode data: ${new Uint8Array(data as ArrayBuffer)} - ${error}`)
const decoded = WebsocketMessage.decode(new Uint8Array(data));
const values = Object.entries(decoded).filter(([, value]) => value !== undefined) // Filter all values which are not undefined
if (values.length != 1) {
throw new Error("Message included either 0 or more than 1 data point")
}
const [tag, value] = values[0]
return [tag, decoded]
// try {
// const view = new Uint8Array(data);
// let comma_index: number = 0;
// let tag: string = "";
// for (comma_index = 0; view[comma_index] != 0x2c; comma_index++) { // 0x2c is the ascii code for a comma!
// tag += String.fromCharCode(view[comma_index]);
// if (comma_index >= data.byteLength) { throw new RangeError("Comma index exceeded")}
// }
// return [ tag, data.slice(comma_index+1) ]
// } catch (error) {
// console.error(`Could not decode data: ${new Uint8Array(data as ArrayBuffer)} - ${error}`)
// }
return null
}
@@ -76,10 +84,8 @@ function createWebSocket() {
}
ws.onmessage = frame => {
resetUnresponsiveCheck()
const message = decodeMessage(frame.data)
if (!message) return
const [event, payload] = message
if (event) listeners.get(event)?.forEach(listener => listener(payload))
const [tag, message] = decodeMessage(frame.data)
if (tag) listeners.get(tag)?.forEach(listener => listener(message))
}
ws.onerror = ev => disconnect('error', ev)
ws.onclose = ev => disconnect('close', ev)
@@ -143,6 +149,11 @@ function createWebSocket() {
sendEvent,
init,
on: <T>(event: string, listener: (data: T) => void): (() => void) => {
if (event !in Object.keys(WebsocketMessage.create())) {
throw new Error("Event not found in 'WebsocketMessage' type, message can never be decoded, and the listener has not been added");
}
let eventListeners = listeners.get(event)
if (!eventListeners) {
if (!socketEvents.includes(event as SocketEvent)) {