🚚 Rename websocket_message to messages

This commit is contained in:
Rune Harlyk
2026-01-03 17:00:33 +01:00
committed by nikguin04
parent c4b1ae8335
commit 775ca78a10
33 changed files with 144 additions and 176 deletions
+1 -1
View File
@@ -17,7 +17,7 @@ const pluginPath =
path.join(projectRoot, 'node_modules', '.bin', 'protoc-gen-ts_proto.cmd')
: path.join(projectRoot, 'node_modules', '.bin', 'protoc-gen-ts_proto')
const protoFiles = ['websocket_message.proto', 'rest_message.proto']
const protoFiles = ['message.proto']
const tsProtoOpts = ['useExactTypes=false', 'outputExtensions=true', 'outputSchema=true'].join(',')
+1 -1
View File
@@ -37,7 +37,7 @@
import { radToDeg } from 'three/src/math/MathUtils.js'
import type { URDFRobot } from 'urdf-loader'
import { get } from 'svelte/store'
import { AnglesData, KinematicData, ModesEnum } from '$lib/platform_shared/websocket_message'
import { AnglesData, KinematicData, ModesEnum } from '$lib/platform_shared/message'
interface Props {
defaultColor?: string | null
@@ -1,5 +1,5 @@
<script lang="ts">
import { ModeData, ModesEnum } from '$lib/platform_shared/websocket_message'
import { ModeData, ModesEnum } from '$lib/platform_shared/message'
import { mode } from '$lib/stores'
const deactivate = async () => {
+1 -1
View File
@@ -1,7 +1,7 @@
import { get } from 'svelte/store'
import type { body_state_t } from './kinematic'
import { currentKinematic } from './stores/featureFlags'
import { HumanInputData, WalkGaits } from './platform_shared/websocket_message'
import { HumanInputData, WalkGaits } from './platform_shared/message'
export interface gait_state_t {
step_height: number
+1 -1
View File
@@ -1,4 +1,4 @@
import { AnalyticsData } from '$lib/platform_shared/websocket_message'
import { AnalyticsData } from '$lib/platform_shared/message'
import { writable } from 'svelte/store'
const analytics_data: AnalyticsData[] = []
+1 -1
View File
@@ -1,5 +1,5 @@
import { writable } from 'svelte/store'
import { IMUData } from '$lib/platform_shared/websocket_message'
import { IMUData } from '$lib/platform_shared/message'
const imu_data: IMUData[] = []
const maxIMUData = 100
+1 -1
View File
@@ -6,7 +6,7 @@ import {
ModesEnum,
WalkGaitData,
WalkGaits
} from '$lib/platform_shared/websocket_message'
} from '$lib/platform_shared/message'
import { persistentStore } from '$lib/utilities/svelte-utilities'
import { writable, type Writable } from 'svelte/store'
+1 -1
View File
@@ -1,4 +1,4 @@
import { AnglesData } from '$lib/platform_shared/websocket_message'
import { AnglesData } from '$lib/platform_shared/message'
import { writable, type Writable } from 'svelte/store'
export const servoAnglesOut: Writable<AnglesData> = writable(
+34 -34
View File
@@ -1,12 +1,12 @@
import { writable } from 'svelte/store'
import {
WebsocketMessage,
Message,
CorrelationRequest,
CorrelationResponse,
protoMetadata as websocket_md,
protoMetadata,
type MessageFns
} from '$lib/platform_shared/websocket_message'
import * as WebsocketMessages from '$lib/platform_shared/websocket_message'
} from '$lib/platform_shared/message'
import * as Messages from '$lib/platform_shared/message'
export const MESSAGE_TYPE_TO_KEY = new Map<MessageFns<unknown>, string>()
export const MESSAGE_TYPE_TO_TAG = new Map<MessageFns<unknown>, number>()
@@ -20,14 +20,14 @@ type PendingRequest = {
timeoutId: ReturnType<typeof setTimeout>
}
const websocketMessageType = websocket_md.fileDescriptor.messageType?.find(
(msg: { name: string }) => msg.name === 'WebsocketMessage'
const MessageType = protoMetadata.fileDescriptor.messageType?.find(
(msg: { name: string }) => msg.name === 'Message'
)
if (websocketMessageType?.field) {
for (const field of websocketMessageType.field) {
if (MessageType?.field) {
for (const field of MessageType.field) {
if (field.typeName) {
const messageFns = websocket_md.references[field.typeName]
const messageFns = protoMetadata.references[field.typeName]
if (messageFns && field.jsonName && field.number) {
MESSAGE_TYPE_TO_KEY.set(messageFns, field.jsonName)
MESSAGE_TYPE_TO_TAG.set(messageFns, field.number)
@@ -38,21 +38,21 @@ if (websocketMessageType?.field) {
}
}
function get_name_from_messagetype<T>(event_type: MessageFns<T>): string {
function getNameFromMessageType<T>(event_type: MessageFns<T>): string {
const event = MESSAGE_TYPE_TO_KEY.get(event_type as MessageFns<unknown>)
if (!event) {
throw new Error(
"Event type not found in 'WebsocketMessage'. The MessageFns you passed doesn't correspond to any WebsocketMessage field."
"Event type not found in 'Message'. The MessageFns you passed doesn't correspond to any Message field."
)
}
return event
}
function get_tag_from_messagetype<T>(event_type: MessageFns<T>): number {
function getTagFromMessageType<T>(event_type: MessageFns<T>): number {
const fieldNumber = MESSAGE_TYPE_TO_TAG.get(event_type as MessageFns<unknown>)
if (fieldNumber === undefined) {
throw new Error(
"Tag not found in 'WebsocketMessage'. The MessageFns you passed doesn't correspond to any WebsocketMessage field."
"Tag not found in 'Message'. The MessageFns you passed doesn't correspond to any Message field."
)
}
return fieldNumber
@@ -60,10 +60,10 @@ function get_tag_from_messagetype<T>(event_type: MessageFns<T>): number {
type SocketEvent = 'open' | 'close' | 'error' | 'message' | 'unresponsive'
type TaggedSocketMessage = { tag: number; msg: WebsocketMessage }
type TaggedMessage = { tag: number; msg: Message }
export const decodeMessage = (data: ArrayBuffer): TaggedSocketMessage => {
const decoded = WebsocketMessage.decode(new Uint8Array(data))
export const decodeMessage = (data: ArrayBuffer): TaggedMessage => {
const decoded = Message.decode(new Uint8Array(data))
const values = Object.entries(decoded).filter(([, value]) => value !== undefined)
if (values.length != 1) {
throw new Error('Message included either 0 or more than 1 data point')
@@ -76,8 +76,8 @@ export const decodeMessage = (data: ArrayBuffer): TaggedSocketMessage => {
return { tag: tag, msg: decoded }
}
export const encodeMessage = (data: WebsocketMessage): Uint8Array<ArrayBuffer> => {
const encoded = WebsocketMessage.encode(data).finish()
export const encodeMessage = (data: Message): Uint8Array<ArrayBuffer> => {
const encoded = Message.encode(data).finish()
return encoded
}
@@ -158,7 +158,7 @@ function createWebSocket() {
}
function unsubscribe<MT>(event_type: MessageFns<MT>, listener: (data: MT) => void) {
const tag = get_tag_from_messagetype(event_type)
const tag = getTagFromMessageType(event_type)
const message_listeners_totag = message_listeners.get(tag)
if (!message_listeners_totag) return
@@ -182,43 +182,43 @@ function createWebSocket() {
function sendEvent<T>(event: MessageFns<T>, data: T) {
if (!ws || ws.readyState !== WebSocket.OPEN) return
const type = get_name_from_messagetype(event)
const wsm = WebsocketMessage.create() as Record<string, unknown>
const type = getNameFromMessageType(event)
const wsm = Message.create() as Record<string, unknown>
wsm[type] = data
send(wsm as WebsocketMessage)
send(wsm as Message)
}
function unsubscribeToMessageFromServer<T>(event_type: MessageFns<T>) {
if (!ws || ws.readyState !== WebSocket.OPEN) return
const unsub_msg = WebsocketMessages.UnsubscribeNotification.create({
tag: get_tag_from_messagetype(event_type)
const unsub_msg = Messages.UnsubscribeNotification.create({
tag: getTagFromMessageType(event_type)
})
send(WebsocketMessage.create({ unsubNotif: unsub_msg }))
send(Message.create({ unsubNotif: unsub_msg }))
}
function subscribeToEvent<T>(event_type: MessageFns<T>) {
if (!ws || ws.readyState !== WebSocket.OPEN) return
const sub_msg = WebsocketMessages.SubscribeNotification.create({
tag: get_tag_from_messagetype(event_type)
const sub_msg = Messages.SubscribeNotification.create({
tag: getTagFromMessageType(event_type)
})
send(WebsocketMessage.create({ subNotif: sub_msg }))
send(Message.create({ subNotif: sub_msg }))
}
function resubscribeAll() {
for (const tag of message_listeners.keys()) {
const sub_msg = WebsocketMessages.SubscribeNotification.create({ tag })
send(WebsocketMessage.create({ subNotif: sub_msg }))
const sub_msg = Messages.SubscribeNotification.create({ tag })
send(Message.create({ subNotif: sub_msg }))
}
}
function send(data: WebsocketMessage) {
function send(data: Message) {
if (!ws || ws.readyState !== WebSocket.OPEN) return
const encoded = encodeMessage(data)
ws.send(encoded)
}
function ping() {
send(WebsocketMessage.create({ pingmsg: {} }))
send(Message.create({ pingmsg: {} }))
}
function sendRequest(
@@ -235,7 +235,7 @@ function createWebSocket() {
pending_requests.set(correlationId, { resolve, reject, timeoutId })
const request = CorrelationRequest.create({ correlationId, ...data })
send(WebsocketMessage.create({ correlationRequest: request }))
send(Message.create({ correlationRequest: request }))
}
function flushQueuedRequests() {
@@ -250,7 +250,7 @@ function createWebSocket() {
sendEvent,
init,
on: <MT>(event_type: MessageFns<MT>, listener: (data: MT) => void): (() => void) => {
const tag = get_tag_from_messagetype(event_type)
const tag = getTagFromMessageType(event_type)
let message_listeners_totag = message_listeners.get(tag)
if (!message_listeners_totag) {
+1 -1
View File
@@ -1,4 +1,4 @@
import { DownloadOTAData, RSSIData } from '$lib/platform_shared/websocket_message'
import { DownloadOTAData, RSSIData } from '$lib/platform_shared/message'
import { writable } from 'svelte/store'
type telemetry_data_type = {
+2 -2
View File
@@ -32,7 +32,7 @@
RSSIData,
SonarData,
WalkGaitData
} from '$lib/platform_shared/websocket_message'
} from '$lib/platform_shared/message'
import { Throttler } from '$lib/utilities'
interface Props {
@@ -82,7 +82,7 @@
servoAngles.set(data)
}),
socket.on(PingMsg, data => {
console.log("Ping received!")
console.log('Ping received!')
})
]
)
+1 -1
View File
@@ -5,7 +5,7 @@
import { onMount } from 'svelte'
import { mpu, socket } from '$lib/stores'
import { imu } from '$lib/stores/imu'
import { IMUData } from '$lib/platform_shared/websocket_message'
import { IMUData } from '$lib/platform_shared/message'
let layout = $derived($views.find(v => v.name === $selectedView)!)
+1 -6
View File
@@ -14,12 +14,7 @@
import { VerticalSlider } from '$lib/components/input'
import { gamepadAxes, gamepadButtonsEdges, hasGamepad } from '$lib/stores/gamepad'
import { notifications } from '$lib/components/toasts/notifications'
import {
ModeData,
ModesEnum,
WalkGaitData,
WalkGaits
} from '$lib/platform_shared/websocket_message'
import { ModeData, ModesEnum, WalkGaitData, WalkGaits } from '$lib/platform_shared/message'
let left: nipplejs.JoystickManager
let right: nipplejs.JoystickManager
+1 -1
View File
@@ -4,7 +4,7 @@
import { socket } from '$lib/stores'
import { Connection } from '$lib/components/icons'
import I2CSetting from './i2cSetting.svelte'
import type { I2CDevice } from '$lib/platform_shared/websocket_message'
import type { I2CDevice } from '$lib/platform_shared/message'
let active_devices: I2CDevice[] = $state([])
let isLoading = $state(false)
@@ -7,7 +7,7 @@
import {
PeripheralSettingsData,
PeripheralSettingsDataRequest
} from '$lib/platform_shared/websocket_message'
} from '$lib/platform_shared/message'
let settings: PeripheralSettingsData | null = $state(null)
let isEditing = $state(false)
+1 -1
View File
@@ -9,7 +9,7 @@
import { useFeatureFlags } from '$lib/stores/featureFlags'
import { Rotate3d } from '$lib/components/icons'
import { type IMUCalibrateData, IMUData } from '$lib/platform_shared/websocket_message'
import { type IMUCalibrateData, IMUData } from '$lib/platform_shared/message'
Chart.register(...registerables)
@@ -1,5 +1,5 @@
<script lang="ts">
import { ServoPWMData, ServoStateData } from '$lib/platform_shared/websocket_message'
import { ServoPWMData, ServoStateData } from '$lib/platform_shared/message'
import { socket } from '$lib/stores'
import { Throttler } from '$lib/utilities'
+23 -11
View File
@@ -3,7 +3,13 @@
import { socket } from '$lib/stores'
//import { IMUReport, IMUType } from '$lib/platform_shared/example';
import { AnglesData, WebsocketMessage, IMUData, CorrelationRequest, CorrelationResponse } from '$lib/platform_shared/websocket_message'
import {
AnglesData,
Message,
IMUData,
CorrelationRequest,
CorrelationResponse
} from '$lib/platform_shared/message'
// const imu_report: IMUReport = {type: IMUType.IMU_ACCEL, xVal: 4}
// const writer = IMUReport.encode(imu_report);
@@ -13,20 +19,20 @@
// .map((b) => b.toString(16).padStart(2, '0'))
// .join(' ');
// const wmd: WebsocketMessage = { imu: {temp: 0, x: 0, y: 0, z: 1}, angles: {angles: [2]}}
// const wmd: WebsocketMessage = { imu: {temp: 0, x: 0, y: 0, z: 0} }
// const wmd: WebsocketMessage = { rssi: { rssi: 16 } }
// const wmd: WebsocketMessage = { imu: {temp: 1, x: 2, y: 4, z: 5} }
// const wmd: WebsocketMessage = { angles: {angles: [1,2,3,4]} }
const wmd: WebsocketMessage = { pongmsg: {} }
const writer = WebsocketMessage.encode(wmd)
// const wmd: Message = { imu: {temp: 0, x: 0, y: 0, z: 1}, angles: {angles: [2]}}
// const wmd: Message = { imu: {temp: 0, x: 0, y: 0, z: 0} }
// const wmd: Message = { rssi: { rssi: 16 } }
// const wmd: Message = { imu: {temp: 1, x: 2, y: 4, z: 5} }
// const wmd: Message = { angles: {angles: [1,2,3,4]} }
const wmd: Message = { pongmsg: {} }
const writer = Message.encode(wmd)
const bytes = writer.finish()
// Convert bytes to hex
const hex = Array.from(bytes)
.map(b => b.toString(16).padStart(2, '0'))
.join(' ')
// const decodedmsg: WebsocketMessage = WebsocketMessage.decode(bytes);
// const decodedmsg: Message = Message.decode(bytes);
// const objects = Object.entries(decodedmsg)
// console.log(Object.keys(AnglesData.create())[0] )
@@ -48,11 +54,17 @@
// console.log(data)
}
onMount(() => {
socket.on(CorrelationResponse, (data) => {
socket.on(CorrelationResponse, data => {
console.log(data)
})
socket.onEvent('open', () => {
socket.sendEvent(CorrelationRequest, CorrelationRequest.create({correlationId: 69, featuresDataRequest: { sonarTest: true }}))
socket.sendEvent(
CorrelationRequest,
CorrelationRequest.create({
correlationId: 69,
featuresDataRequest: { sonarTest: true }
})
)
})
return socket.on(IMUData, handleData)
@@ -31,7 +31,7 @@
} from '$lib/components/icons'
import StatusItem from '$lib/components/StatusItem.svelte'
import ActionButton from './ActionButton.svelte'
import { AnalyticsData, type SystemInformation } from '$lib/platform_shared/websocket_message'
import { AnalyticsData, type SystemInformation } from '$lib/platform_shared/message'
const features = useFeatureFlags()
+1 -1
View File
@@ -33,7 +33,7 @@
Edit
} from '$lib/components/icons'
import StatusItem from '$lib/components/StatusItem.svelte'
import { KnownNetworkItem } from '$lib/platform_shared/websocket_message'
import { KnownNetworkItem } from '$lib/platform_shared/message'
import { WifiSettings, type WifiStatus } from '$lib/platform_shared/rest_message'
let networkEditable: KnownNetworkItem = $state(KnownNetworkItem.create())
+13 -22
View File
@@ -1,20 +1,15 @@
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
import { WebSocketServer } from 'ws'
import { decodeMessage, MESSAGE_KEY_TO_TAG, socket } from '../../src/lib/stores/socket'
import {
IMUData,
PingMsg,
PongMsg,
WebsocketMessage
} from '../../src/lib/platform_shared/websocket_message'
import { IMUData, PingMsg, PongMsg, Message } from '../../src/lib/platform_shared/message'
// Helper function to create encoded WebSocket messages
function createEncodedMessage(messageType: 'imu' | 'rssi' | 'mode', data: unknown): Uint8Array {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const message: any = {}
message[messageType] = data
const wsMessage = WebsocketMessage.create(message)
return WebsocketMessage.encode(wsMessage).finish()
const wsMessage = Message.create(message)
return Message.encode(wsMessage).finish()
}
describe.sequential('WebSocket Integration Tests', () => {
@@ -130,7 +125,7 @@ describe.sequential('WebSocket Integration Tests', () => {
try {
// Decode the protobuf message
const decoded = WebsocketMessage.decode(new Uint8Array(data))
const decoded = Message.decode(new Uint8Array(data))
// console.log('Server: Decoded message:', JSON.stringify(decoded, null, 2))
// Only resolve if we got actual IMU data
@@ -193,9 +188,9 @@ describe.sequential('WebSocket Integration Tests', () => {
setTimeout(() => {
console.log('Client: Sending invalid message type...')
// Send any invalid message type
const wsm = WebsocketMessage.create()
const wsm = Message.create()
try {
socket.sendEvent(WebsocketMessage as any, wsm)
socket.sendEvent(Message as any, wsm)
clearTimeout(timeout)
reject(new Error('Expected sendEvent to throw, but it did not'))
} catch (e) {
@@ -208,7 +203,7 @@ describe.sequential('WebSocket Integration Tests', () => {
})
})
describe('WebsocketMessage Protobuf Encoding/Decoding', () => {
describe('Message Protobuf Encoding/Decoding', () => {
it('should encode and decode IMU data correctly', () => {
const imuData = IMUData.create({
x: 3.25,
@@ -233,21 +228,17 @@ describe('WebsocketMessage Protobuf Encoding/Decoding', () => {
})
it('should encode and decode two empty types correctly', () => {
const encoded_ping = WebsocketMessage.encode(
WebsocketMessage.create({ pingmsg: PingMsg.create() })
).finish()
const encoded_ping = Message.encode(Message.create({ pingmsg: PingMsg.create() })).finish()
const decoded_ping = decodeMessage(encoded_ping.buffer)
expect(decoded_ping.tag).toBe(MESSAGE_KEY_TO_TAG.get('pingmsg'))
const encoded_pong = WebsocketMessage.encode(
WebsocketMessage.create({ pongmsg: PongMsg.create() })
).finish()
const encoded_pong = Message.encode(Message.create({ pongmsg: PongMsg.create() })).finish()
const decoded_pong = decodeMessage(encoded_pong.buffer)
expect(decoded_pong.tag).toBe(MESSAGE_KEY_TO_TAG.get('pongmsg'))
})
it('should encode and decode complete WebsocketMessage', () => {
const original = WebsocketMessage.create({
it('should encode and decode complete Message', () => {
const original = Message.create({
imu: IMUData.create({
x: 3.25,
y: 2.5,
@@ -259,8 +250,8 @@ describe('WebsocketMessage Protobuf Encoding/Decoding', () => {
})
})
const encoded = WebsocketMessage.encode(original).finish()
const decoded = WebsocketMessage.decode(encoded)
const encoded = Message.encode(original).finish()
const decoded = Message.decode(encoded)
expect(decoded.imu).toBeDefined()
expect(decoded.imu?.x).toBe(3.25)