/ src / lib / server / gateway / protocol.test.ts
protocol.test.ts
 1  import assert from 'node:assert/strict'
 2  import { test } from 'node:test'
 3  import {
 4    createGatewayRequestFrame,
 5    parseGatewayFrame,
 6    serializeGatewayFrame,
 7  } from './protocol'
 8  
 9  test('gateway protocol parses request/response/event frames', () => {
10    const req = parseGatewayFrame('{"type":"req","id":"1","method":"connect","params":{"foo":"bar"}}')
11    assert.deepEqual(req, {
12      type: 'req',
13      id: '1',
14      method: 'connect',
15      params: { foo: 'bar' },
16    })
17  
18    const res = parseGatewayFrame('{"type":"res","id":"1","ok":true,"payload":{"ok":true}}')
19    assert.deepEqual(res, {
20      type: 'res',
21      id: '1',
22      ok: true,
23      payload: { ok: true },
24      error: null,
25    })
26  
27    const event = parseGatewayFrame('{"type":"event","event":"tick","payload":{"n":1}}')
28    assert.deepEqual(event, {
29      type: 'event',
30      event: 'tick',
31      payload: { n: 1 },
32    })
33  })
34  
35  test('gateway protocol rejects malformed frames', () => {
36    assert.equal(parseGatewayFrame('not-json'), null)
37    assert.equal(parseGatewayFrame('{"type":"event"}'), null)
38    assert.equal(parseGatewayFrame('{"type":"req","id":"1"}'), null)
39    assert.equal(parseGatewayFrame({ nope: true }), null)
40  })
41  
42  test('gateway request helper and serializer produce valid frame', () => {
43    const frame = createGatewayRequestFrame('abc', 'chat.send', { message: 'hello' })
44    assert.deepEqual(frame, {
45      type: 'req',
46      id: 'abc',
47      method: 'chat.send',
48      params: { message: 'hello' },
49    })
50  
51    const encoded = serializeGatewayFrame(frame)
52    const decoded = parseGatewayFrame(encoded)
53    assert.deepEqual(decoded, frame)
54  })