event-source.host.spec.ts 1.3 KB

12345678910111213141516171819202122232425262728293031
  1. /** Consumer-neutral Server-Sent Event parsing behavior. */
  2. import { describe, expect, it } from 'vitest'
  3. import { InspectorEventSourceParser } from '../src/shared/network/event-source.ts'
  4. const encoder = new TextEncoder()
  5. describe('InspectorEventSourceParser', () => {
  6. it('preserves parser state across chunks, CRLF boundaries, and UTF-8 boundaries', () => {
  7. const parser = new InspectorEventSourceParser()
  8. expect(parser.push(encoder.encode(': ignored\rid:first\revent: update\rdata: one\r'))).toEqual([])
  9. const unicode = encoder.encode('\ndata: two 你\r\n\r\n')
  10. const split = unicode.indexOf(0xe4) + 1
  11. expect(parser.push(unicode.subarray(0, split))).toEqual([])
  12. expect(parser.push(unicode.subarray(split))).toEqual([{
  13. eventName: 'update',
  14. eventId: 'first',
  15. data: 'one\ntwo 你',
  16. }])
  17. })
  18. it('retains valid ids, ignores comments and unknown fields, and emits empty data', () => {
  19. const parser = new InspectorEventSourceParser()
  20. expect(parser.push(encoder.encode('retry: 1000\nunknown\n\n'))).toEqual([])
  21. expect(parser.push(encoder.encode('id: stable\ndata: value\n\nid: bad\0id\ndata:\n\n'))).toEqual([
  22. { eventName: 'message', eventId: 'stable', data: 'value' },
  23. { eventName: 'message', eventId: 'stable', data: '' },
  24. ])
  25. })
  26. })