Send, encoding and listeners handling

This commit is contained in:
Niklas Jensen
2025-12-30 19:49:21 +01:00
committed by nikguin04
parent 8098dcec9b
commit 770a462d78
+20 -16
View File
@@ -2,6 +2,7 @@ import { writable } from 'svelte/store'
import { encode, decode } from '@msgpack/msgpack' import { encode, decode } from '@msgpack/msgpack'
import { WebsocketMessage, type MessageFns } from '$lib/platform_shared/websocket_message' import { WebsocketMessage, type MessageFns } from '$lib/platform_shared/websocket_message'
import * as WebsocketMessages from '$lib/platform_shared/websocket_message' import * as WebsocketMessages from '$lib/platform_shared/websocket_message'
import type { BinaryWriter } from '@bufbuild/protobuf/wire'
// Auto-build reverse mapping from MessageFns to event key // Auto-build reverse mapping from MessageFns to event key
const MESSAGE_TYPE_TO_KEY = new Map<MessageFns<any>, string>() const MESSAGE_TYPE_TO_KEY = new Map<MessageFns<any>, string>()
@@ -32,7 +33,6 @@ type SocketEvent = (typeof socketEvents)[number]
type TaggedSocketMessage = [string, WebsocketMessage] type TaggedSocketMessage = [string, WebsocketMessage]
let useBinary = false
@@ -47,12 +47,9 @@ const decodeMessage = (data: ArrayBuffer): TaggedSocketMessage => {
return [event, decoded] return [event, decoded]
} }
const encodeMessage = (data: unknown) => { const encodeMessage = (data: WebsocketMessage): Uint8Array<ArrayBuffer> => {
try { const encoded = WebsocketMessage.encode(data).finish();
return useBinary ? encode(data) : JSON.stringify(data) return encoded;
} catch (error) {
console.error(`Could not encode data: ${data} - ${error}`)
}
} }
function createWebSocket() { function createWebSocket() {
@@ -69,6 +66,19 @@ function createWebSocket() {
connect() connect()
} }
function getListeners<MT>(event_type: MessageFns<MT>): Set<(data?: unknown) => void> {
const event = MESSAGE_TYPE_TO_KEY.get(event_type)
if (!event) {
throw new Error("Event type not found in 'WebsocketMessage'. The MessageFns you passed doesn't correspond to any WebsocketMessage field.");
}
const event_listeners = listeners.get(event);
if (event_listeners == undefined) {
return new Set()
}
return event_listeners;
}
function disconnect(reason: SocketEvent, event?: Event) { function disconnect(reason: SocketEvent, event?: Event) {
ws.close() ws.close()
set(false) set(false)
@@ -82,8 +92,6 @@ function createWebSocket() {
ws = new WebSocket(socketUrl) ws = new WebSocket(socketUrl)
ws.binaryType = 'arraybuffer' ws.binaryType = 'arraybuffer'
ws.onopen = ev => { ws.onopen = ev => {
ping()
useBinary = true
ping() ping()
set(true) set(true)
clearTimeout(reconnectTimeoutId) clearTimeout(reconnectTimeoutId)
@@ -136,14 +144,10 @@ function createWebSocket() {
send([0, event]) send([0, event])
} }
function send(data: unknown) { function send(data: WebsocketMessage) {
if (!ws || ws.readyState !== WebSocket.OPEN) return if (!ws || ws.readyState !== WebSocket.OPEN) return
const serialized = encodeMessage(data) const encoded = encodeMessage(data);
if (!serialized) { ws.send(encoded);
console.error('Could not serialize data:', data)
return
}
ws.send(serialized)
} }
function ping() { function ping() {