stream-protocol.host.spec.ts 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import { describe, expect, it } from 'vitest'
  2. import {
  3. parseRemoteStreamClientMessage,
  4. parseRemoteStreamServerMessage,
  5. } from '../src/stream-protocol.ts'
  6. describe('Remote stream wire protocol', () => {
  7. it('accepts every client message variant', () => {
  8. expect(parseRemoteStreamClientMessage(JSON.stringify({
  9. type: 'open', streamId: 'stream-1', endpoint: 'feed/follow', payload: { cursor: 1 },
  10. }))).toEqual({
  11. type: 'open', streamId: 'stream-1', endpoint: 'feed/follow', payload: { cursor: 1 },
  12. })
  13. expect(parseRemoteStreamClientMessage(JSON.stringify({
  14. type: 'cancel', streamId: 'stream-1',
  15. }))).toEqual({ type: 'cancel', streamId: 'stream-1' })
  16. })
  17. it.each([
  18. { type: 'open', streamId: '', endpoint: 'feed/follow', payload: {} },
  19. { type: 'open', streamId: 'stream-1', endpoint: '', payload: {} },
  20. { type: 'open', streamId: 'stream-1', endpoint: 'feed/follow' },
  21. { type: 'cancel', streamId: 'stream-1', extra: true },
  22. { type: 'unknown', streamId: 'stream-1' },
  23. ])('rejects an invalid client message: %j', (message) => {
  24. expect(() => parseRemoteStreamClientMessage(JSON.stringify(message)))
  25. .toThrow('api gateway: invalid Remote stream client message')
  26. })
  27. it('accepts every server message variant', () => {
  28. expect(parseRemoteStreamServerMessage(JSON.stringify({
  29. type: 'item', streamId: 'stream-1', value: null,
  30. }))).toEqual({ type: 'item', streamId: 'stream-1', value: null })
  31. expect(parseRemoteStreamServerMessage(JSON.stringify({
  32. type: 'item', streamId: 'stream-1',
  33. }))).toEqual({ type: 'item', streamId: 'stream-1' })
  34. expect(parseRemoteStreamServerMessage(JSON.stringify({
  35. type: 'error',
  36. streamId: 'stream-1',
  37. error: { code: 'offline', message: 'connection lost', details: {} },
  38. }))).toEqual({
  39. type: 'error',
  40. streamId: 'stream-1',
  41. error: { code: 'offline', message: 'connection lost', details: {} },
  42. })
  43. expect(parseRemoteStreamServerMessage(JSON.stringify({
  44. type: 'end', streamId: 'stream-1',
  45. }))).toEqual({ type: 'end', streamId: 'stream-1' })
  46. })
  47. it.each([
  48. { type: 'item', streamId: '', value: 'item' },
  49. { type: 'item', streamId: 'stream-1', extra: true },
  50. { type: 'end', streamId: 'stream-1', extra: true },
  51. { type: 'error', streamId: 'stream-1', error: [] },
  52. { type: 'error', streamId: 'stream-1', error: { code: 1, message: 'failure', details: {} } },
  53. { type: 'error', streamId: 'stream-1', error: { code: 'failed', message: 1, details: {} } },
  54. { type: 'error', streamId: 'stream-1', error: { code: 'failed', message: 'failure', details: [] } },
  55. { type: 'unknown', streamId: 'stream-1' },
  56. ])('rejects an invalid server message: %j', (message) => {
  57. expect(() => parseRemoteStreamServerMessage(JSON.stringify(message)))
  58. .toThrow('api gateway: invalid Remote stream server message')
  59. })
  60. it.each(['not json', 'null', '[]', '1'])('rejects a non-message payload: %s', (text) => {
  61. expect(() => parseRemoteStreamServerMessage(text)).toThrow('api gateway: Remote stream message')
  62. })
  63. })