fix(server-runtime,server-sdk): accept plain JSON from external WebSocket clients (#1234)
This commit is contained in:
@@ -257,7 +257,22 @@ export function setupApp(options?: {
|
||||
// superjson.parse here instead of message.json() (which uses JSON.parse).
|
||||
// Using JSON.parse on a superjson-encoded string returns the wrapper object
|
||||
// { json: {...}, meta: {...} } with type=undefined, which breaks all event routing.
|
||||
event = parse<WebSocketEvent>(message.text())
|
||||
//
|
||||
// However, external clients may send plain JSON (not superjson-encoded).
|
||||
// superjson.parse on plain JSON returns undefined since there is no `json` wrapper key.
|
||||
// In that case, fall back to JSON.parse so external clients can interoperate.
|
||||
const text = message.text()
|
||||
const parsed = parse<WebSocketEvent>(text)
|
||||
const potentialEvent = (parsed && typeof parsed === 'object' && 'type' in parsed)
|
||||
? parsed
|
||||
: JSON.parse(text)
|
||||
|
||||
if (!potentialEvent || typeof potentialEvent !== 'object' || !('type' in potentialEvent)) {
|
||||
send(peer, RESPONSES.error('invalid event format', instanceId))
|
||||
return
|
||||
}
|
||||
|
||||
event = potentialEvent as WebSocketEvent
|
||||
}
|
||||
catch (err) {
|
||||
const errorMessage = err instanceof Error ? err.message : String(err)
|
||||
|
||||
@@ -262,8 +262,14 @@ export class Client<C = undefined> {
|
||||
|
||||
private async handleMessage(event: MessageEvent) {
|
||||
try {
|
||||
const data = superjson.parse<WebSocketEvent<C> | undefined>(event.data as string)
|
||||
if (!data) {
|
||||
// Try superjson first (used by SDK clients), fall back to plain JSON
|
||||
// for external clients that send standard JSON-encoded messages.
|
||||
const raw = event.data as string
|
||||
const parsed = superjson.parse<WebSocketEvent<C> | undefined>(raw)
|
||||
const data = (parsed && typeof parsed === 'object' && 'type' in parsed)
|
||||
? parsed
|
||||
: JSON.parse(raw) as WebSocketEvent<C>
|
||||
if (!data || typeof data !== 'object' || !('type' in data)) {
|
||||
console.warn('Received empty message')
|
||||
return
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user