diff --git a/src/fetch.ts b/src/fetch.ts index bbcd2c8..fd1ff9b 100644 --- a/src/fetch.ts +++ b/src/fetch.ts @@ -112,7 +112,8 @@ export function fetchEventSource(input: RequestInfo, { await onopen(response); - await getBytes(response.body!, getLines(getMessages(id => { + await getBytes(response.body!, getLines(getMessages(onmessage, + id => { if (id) { // store the id and send it back on the next retry: headers[LastEventId] = id; @@ -122,7 +123,7 @@ export function fetchEventSource(input: RequestInfo, { } }, retry => { retryInterval = retry; - }, onmessage))); + }))); onclose?.(); dispose(); diff --git a/src/parse.spec.ts b/src/parse.spec.ts index 9661c27..3d3169a 100644 --- a/src/parse.spec.ts +++ b/src/parse.spec.ts @@ -190,11 +190,7 @@ describe('parse', () => { it('happy path', () => { // arrange: let msgNum = 0; - const next = parse.getMessages(id => { - expect(id).toEqual('abc'); - }, retry => { - expect(retry).toEqual(42); - }, msg => { + const next = parse.getMessages(msg => { ++msgNum; expect(msg).toEqual({ retry: 42, @@ -202,6 +198,10 @@ describe('parse', () => { event: 'def', data: 'ghi' }); + }, id => { + expect(id).toEqual('abc'); + }, retry => { + expect(retry).toEqual(42); }); // act: @@ -217,11 +217,7 @@ describe('parse', () => { it('skip unknown fields', () => { let msgNum = 0; - const next = parse.getMessages(id => { - expect(id).toEqual('abc'); - }, _retry => { - fail('retry should not be called'); - }, msg => { + const next = parse.getMessages(msg => { ++msgNum; expect(msg).toEqual({ id: 'abc', @@ -229,6 +225,10 @@ describe('parse', () => { event: '', retry: undefined, }); + }, id => { + expect(id).toEqual('abc'); + }, _retry => { + fail('retry should not be called'); }); // act: @@ -242,11 +242,7 @@ describe('parse', () => { it('ignore non-integer retry', () => { let msgNum = 0; - const next = parse.getMessages(_id => { - fail('id should not be called'); - }, _retry => { - fail('retry should not be called'); - }, msg => { + const next = parse.getMessages(msg => { ++msgNum; expect(msg).toEqual({ id: '', @@ -254,6 +250,10 @@ describe('parse', () => { event: '', retry: undefined, }); + }, _id => { + fail('id should not be called'); + }, _retry => { + fail('retry should not be called'); }); // act: @@ -267,11 +267,7 @@ describe('parse', () => { it('skip comment-only messages', () => { // arrange: let msgNum = 0; - const next = parse.getMessages(id => { - expect(id).toEqual('123'); - }, _retry => { - fail('retry should not be called'); - }, msg => { + const next = parse.getMessages(msg => { ++msgNum; expect(msg).toEqual({ retry: undefined, @@ -279,6 +275,10 @@ describe('parse', () => { event: 'foo ', data: '', }); + }, id => { + expect(id).toEqual('123'); + }, _retry => { + fail('retry should not be called'); }); // act: @@ -295,11 +295,7 @@ describe('parse', () => { it('should append data split across multiple lines', () => { // arrange: let msgNum = 0; - const next = parse.getMessages(_id => { - fail('id should not be called'); - }, _retry => { - fail('retry should not be called'); - }, msg => { + const next = parse.getMessages(msg => { ++msgNum; expect(msg).toEqual({ data: 'YHOO\n+2\n\n10', @@ -307,6 +303,10 @@ describe('parse', () => { event: '', retry: undefined, }); + }, _id => { + fail('id should not be called'); + }, _retry => { + fail('retry should not be called'); }); // act: @@ -325,12 +325,7 @@ describe('parse', () => { const expectedIds = ['foo', '']; let idsIdx = 0; let msgNum = 0; - const next = parse.getMessages(id => { - expect(id).toEqual(expectedIds[idsIdx]); - ++idsIdx; - }, _retry => { - fail('retry should not be called'); - }, msg => { + const next = parse.getMessages(msg => { ++msgNum; expect(msg).toEqual({ data: '', @@ -338,6 +333,11 @@ describe('parse', () => { event: '', retry: undefined, }); + }, id => { + expect(id).toEqual(expectedIds[idsIdx]); + ++idsIdx; + }, _retry => { + fail('retry should not be called'); }); // act: diff --git a/src/parse.ts b/src/parse.ts index 67e1eb7..cb26856 100644 --- a/src/parse.ts +++ b/src/parse.ts @@ -117,9 +117,9 @@ export function getLines(onLine: (line: Uint8Array, fieldLength: number) => void * @returns A function that should be called for each incoming line buffer. */ export function getMessages( - onId: (id: string) => void, - onRetry: (retry: number) => void, - onMessage?: (msg: EventSourceMessage) => void + onMessage?: (msg: EventSourceMessage) => void, + onId?: (id: string) => void, + onRetry?: (retry: number) => void, ) { let message = newMessage(); const decoder = new TextDecoder(); @@ -149,12 +149,12 @@ export function getMessages( message.event = value; break; case 'id': - onId(message.id = value); + onId?.(message.id = value); break; case 'retry': const retry = parseInt(value, 10); if (!isNaN(retry)) { // per spec, ignore non-integers - onRetry(message.retry = retry); + onRetry?.(message.retry = retry); } break; }