11import { EventListener , EventName , LDLogger } from '../../../src/api' ;
2- import { EventStream , Payload , PayloadReader } from '../../../src/internal/fdv2/payloadReader' ;
2+ import { Payload } from '../../../src/internal/fdv2/payloadProcessor' ;
3+ import { EventStream , PayloadStreamReader } from '../../../src/internal/fdv2/payloadStreamReader' ;
4+
35
46class MockEventStream implements EventStream {
57 private _listeners : Record < EventName , EventListener > = { } ;
@@ -16,7 +18,7 @@ class MockEventStream implements EventStream {
1618it ( 'it sets basis to true when intent code is xfer-full' , ( ) => {
1719 const mockStream = new MockEventStream ( ) ;
1820 const receivedPayloads : Payload [ ] = [ ] ;
19- const readerUnderTest = new PayloadReader ( mockStream , {
21+ const readerUnderTest = new PayloadStreamReader ( mockStream , {
2022 mockKind : ( it ) => it , // obj processor that just returns the same obj
2123 } ) ;
2224 readerUnderTest . addPayloadListener ( ( it ) => {
@@ -38,7 +40,7 @@ it('it sets basis to true when intent code is xfer-full', () => {
3840it ( 'it sets basis to false when intent code is xfer-changes' , ( ) => {
3941 const mockStream = new MockEventStream ( ) ;
4042 const receivedPayloads : Payload [ ] = [ ] ;
41- const readerUnderTest = new PayloadReader ( mockStream , {
43+ const readerUnderTest = new PayloadStreamReader ( mockStream , {
4244 mockKind : ( it ) => it , // obj processor that just returns the same obj
4345 } ) ;
4446 readerUnderTest . addPayloadListener ( ( it ) => {
@@ -57,10 +59,71 @@ it('it sets basis to false when intent code is xfer-changes', () => {
5759 expect ( receivedPayloads [ 0 ] . basis ) . toEqual ( false ) ;
5860} ) ;
5961
62+ it ( 'it sets basis to false and emits empty payload when intent code is none' , ( ) => {
63+ const mockStream = new MockEventStream ( ) ;
64+ const receivedPayloads : Payload [ ] = [ ] ;
65+ const readerUnderTest = new PayloadStreamReader ( mockStream , {
66+ mockKind : ( it ) => it , // obj processor that just returns the same obj
67+ } ) ;
68+ readerUnderTest . addPayloadListener ( ( it ) => {
69+ receivedPayloads . push ( it ) ;
70+ } ) ;
71+
72+ mockStream . simulateEvent ( 'server-intent' , {
73+ data : '{"payloads": [{"code": "none", "id": "mockId", "target": 42}]}' ,
74+ } ) ;
75+ expect ( receivedPayloads . length ) . toEqual ( 1 ) ;
76+ expect ( receivedPayloads [ 0 ] . id ) . toEqual ( 'mockId' ) ;
77+ expect ( receivedPayloads [ 0 ] . version ) . toEqual ( 42 ) ;
78+ expect ( receivedPayloads [ 0 ] . basis ) . toEqual ( false ) ;
79+ } ) ;
80+
81+ it ( 'it handles xfer-full then xfer-changes' , ( ) => {
82+ const mockStream = new MockEventStream ( ) ;
83+ const receivedPayloads : Payload [ ] = [ ] ;
84+ const readerUnderTest = new PayloadStreamReader ( mockStream , {
85+ mockKind : ( it ) => it , // obj processor that just returns the same obj
86+ } ) ;
87+ readerUnderTest . addPayloadListener ( ( it ) => {
88+ receivedPayloads . push ( it ) ;
89+ } ) ;
90+
91+ mockStream . simulateEvent ( 'server-intent' , {
92+ data : '{"payloads": [{"code": "xfer-full", "id": "mockId"}]}' ,
93+ } ) ;
94+ mockStream . simulateEvent ( 'put-object' , {
95+ data : '{"kind": "mockKind", "key": "flagA", "version": 123, "object": {"objectFieldA": "objectValueA"}}' ,
96+ } ) ;
97+ mockStream . simulateEvent ( 'payload-transferred' , {
98+ data : '{"state": "mockState", "version": 1}' ,
99+ } ) ;
100+
101+ mockStream . simulateEvent ( 'put-object' , {
102+ data : '{"kind": "mockKind", "key": "flagA", "version": 456, "object": {"objectFieldA": "newValue"}}' ,
103+ } ) ;
104+ mockStream . simulateEvent ( 'payload-transferred' , {
105+ data : '{"state": "mockState", "version": 1}' ,
106+ } ) ;
107+ expect ( receivedPayloads . length ) . toEqual ( 2 ) ;
108+ expect ( receivedPayloads [ 0 ] . id ) . toEqual ( 'mockId' ) ;
109+ expect ( receivedPayloads [ 0 ] . state ) . toEqual ( 'mockState' ) ;
110+ expect ( receivedPayloads [ 0 ] . basis ) . toEqual ( true ) ;
111+ expect ( receivedPayloads [ 0 ] . updates . length ) . toEqual ( 1 ) ;
112+ expect ( receivedPayloads [ 0 ] . updates [ 0 ] . object ) . toEqual ( { objectFieldA : 'objectValueA' } ) ;
113+ expect ( receivedPayloads [ 0 ] . updates [ 0 ] . deleted ) . toEqual ( undefined ) ;
114+
115+ expect ( receivedPayloads [ 1 ] . id ) . toEqual ( 'mockId' ) ;
116+ expect ( receivedPayloads [ 1 ] . state ) . toEqual ( 'mockState' ) ;
117+ expect ( receivedPayloads [ 1 ] . basis ) . toEqual ( false ) ;
118+ expect ( receivedPayloads [ 1 ] . updates . length ) . toEqual ( 1 ) ;
119+ expect ( receivedPayloads [ 1 ] . updates [ 0 ] . object ) . toEqual ( { objectFieldA : 'newValue' } ) ;
120+ expect ( receivedPayloads [ 1 ] . updates [ 0 ] . deleted ) . toEqual ( undefined ) ;
121+ } ) ;
122+
60123it ( 'it includes multiple types of updates in payload' , ( ) => {
61124 const mockStream = new MockEventStream ( ) ;
62125 const receivedPayloads : Payload [ ] = [ ] ;
63- const readerUnderTest = new PayloadReader ( mockStream , {
126+ const readerUnderTest = new PayloadStreamReader ( mockStream , {
64127 mockKind : ( it ) => it , // obj processor that just returns the same obj
65128 } ) ;
66129 readerUnderTest . addPayloadListener ( ( it ) => {
@@ -98,7 +161,7 @@ it('it includes multiple types of updates in payload', () => {
98161it ( 'it does not include messages thats are not between server-intent and payloader-transferred' , ( ) => {
99162 const mockStream = new MockEventStream ( ) ;
100163 const receivedPayloads : Payload [ ] = [ ] ;
101- const readerUnderTest = new PayloadReader ( mockStream , {
164+ const readerUnderTest = new PayloadStreamReader ( mockStream , {
102165 mockKind : ( it ) => it , // obj processor that just returns the same obj
103166 } ) ;
104167 readerUnderTest . addPayloadListener ( ( it ) => {
@@ -131,7 +194,7 @@ it('logs prescribed message when goodbye event is encountered', () => {
131194 } ;
132195 const mockStream = new MockEventStream ( ) ;
133196 const receivedPayloads : Payload [ ] = [ ] ;
134- const readerUnderTest = new PayloadReader (
197+ const readerUnderTest = new PayloadStreamReader (
135198 mockStream ,
136199 {
137200 mockKind : ( it ) => it , // obj processor that just returns the same obj
@@ -162,7 +225,7 @@ it('logs prescribed message when error event is encountered', () => {
162225 } ;
163226 const mockStream = new MockEventStream ( ) ;
164227 const receivedPayloads : Payload [ ] = [ ] ;
165- const readerUnderTest = new PayloadReader (
228+ const readerUnderTest = new PayloadStreamReader (
166229 mockStream ,
167230 {
168231 mockKind : ( it ) => it , // obj processor that just returns the same obj
@@ -183,12 +246,15 @@ it('logs prescribed message when error event is encountered', () => {
183246 mockStream . simulateEvent ( 'error' , {
184247 data : '{"reason": "Womp womp"}' ,
185248 } ) ;
249+ mockStream . simulateEvent ( 'put-object' , {
250+ data : '{"kind": "mockKind", "key": "flagB", "version": 123, "object": {"objectFieldB": "objectValueB"}}' ,
251+ } ) ;
186252 mockStream . simulateEvent ( 'payload-transferred' , {
187253 data : '{"state": "mockState", "version": 1}' ,
188254 } ) ;
189- expect ( receivedPayloads . length ) . toEqual ( 0 ) ;
255+ expect ( receivedPayloads . length ) . toEqual ( 1 ) ;
190256 expect ( mockLogger . info ) . toHaveBeenCalledWith (
191- 'An issue was encountered receiving updates for payload mockId with reason: Womp womp. Automatic retry will occur. ' ,
257+ 'An issue was encountered receiving updates for payload mockId with reason: Womp womp.' ,
192258 ) ;
193259} ) ;
194260
@@ -201,7 +267,7 @@ it('discards partially transferred data when an error is encountered', () => {
201267 } ;
202268 const mockStream = new MockEventStream ( ) ;
203269 const receivedPayloads : Payload [ ] = [ ] ;
204- const readerUnderTest = new PayloadReader (
270+ const readerUnderTest = new PayloadStreamReader (
205271 mockStream ,
206272 {
207273 mockKind : ( it ) => it , // obj processor that just returns the same obj
@@ -222,6 +288,9 @@ it('discards partially transferred data when an error is encountered', () => {
222288 mockStream . simulateEvent ( 'error' , {
223289 data : '{"reason": "Womp womp"}' ,
224290 } ) ;
291+ mockStream . simulateEvent ( 'put-object' , {
292+ data : '{"kind": "mockKind", "key": "flagB", "version": 123, "object": {"objectFieldB": "objectValueB"}}' ,
293+ } ) ;
225294 mockStream . simulateEvent ( 'payload-transferred' , {
226295 data : '{"state": "mockState", "version": 1}' ,
227296 } ) ;
@@ -240,23 +309,29 @@ it('discards partially transferred data when an error is encountered', () => {
240309 mockStream . simulateEvent ( 'payload-transferred' , {
241310 data : '{"state": "mockState2", "version": 1}' ,
242311 } ) ;
243- expect ( receivedPayloads . length ) . toEqual ( 1 ) ;
244- expect ( receivedPayloads [ 0 ] . id ) . toEqual ( 'mockId2 ' ) ;
245- expect ( receivedPayloads [ 0 ] . state ) . toEqual ( 'mockState2 ' ) ;
312+ expect ( receivedPayloads . length ) . toEqual ( 2 ) ;
313+ expect ( receivedPayloads [ 0 ] . id ) . toEqual ( 'mockId ' ) ;
314+ expect ( receivedPayloads [ 0 ] . state ) . toEqual ( 'mockState ' ) ;
246315 expect ( receivedPayloads [ 0 ] . basis ) . toEqual ( true ) ;
247- expect ( receivedPayloads [ 0 ] . updates . length ) . toEqual ( 3 ) ;
248- expect ( receivedPayloads [ 0 ] . updates [ 0 ] . object ) . toEqual ( { objectFieldX : 'objectValueX ' } ) ;
316+ expect ( receivedPayloads [ 0 ] . updates . length ) . toEqual ( 1 ) ;
317+ expect ( receivedPayloads [ 0 ] . updates [ 0 ] . object ) . toEqual ( { objectFieldB : 'objectValueB ' } ) ;
249318 expect ( receivedPayloads [ 0 ] . updates [ 0 ] . deleted ) . toEqual ( undefined ) ;
250- expect ( receivedPayloads [ 0 ] . updates [ 1 ] . object ) . toEqual ( undefined ) ;
251- expect ( receivedPayloads [ 0 ] . updates [ 1 ] . deleted ) . toEqual ( true ) ;
252- expect ( receivedPayloads [ 0 ] . updates [ 2 ] . object ) . toEqual ( { objectFieldZ : 'objectValueZ' } ) ;
253- expect ( receivedPayloads [ 0 ] . updates [ 2 ] . deleted ) . toEqual ( undefined ) ;
319+ expect ( receivedPayloads [ 1 ] . id ) . toEqual ( 'mockId2' ) ;
320+ expect ( receivedPayloads [ 1 ] . state ) . toEqual ( 'mockState2' ) ;
321+ expect ( receivedPayloads [ 1 ] . basis ) . toEqual ( true ) ;
322+ expect ( receivedPayloads [ 1 ] . updates . length ) . toEqual ( 3 ) ;
323+ expect ( receivedPayloads [ 1 ] . updates [ 0 ] . object ) . toEqual ( { objectFieldX : 'objectValueX' } ) ;
324+ expect ( receivedPayloads [ 1 ] . updates [ 0 ] . deleted ) . toEqual ( undefined ) ;
325+ expect ( receivedPayloads [ 1 ] . updates [ 1 ] . object ) . toEqual ( undefined ) ;
326+ expect ( receivedPayloads [ 1 ] . updates [ 1 ] . deleted ) . toEqual ( true ) ;
327+ expect ( receivedPayloads [ 1 ] . updates [ 2 ] . object ) . toEqual ( { objectFieldZ : 'objectValueZ' } ) ;
328+ expect ( receivedPayloads [ 1 ] . updates [ 2 ] . deleted ) . toEqual ( undefined ) ;
254329} ) ;
255330
256331it ( 'silently ignores unrecognized kinds' , ( ) => {
257332 const mockStream = new MockEventStream ( ) ;
258333 const receivedPayloads : Payload [ ] = [ ] ;
259- const readerUnderTest = new PayloadReader ( mockStream , {
334+ const readerUnderTest = new PayloadStreamReader ( mockStream , {
260335 mockKind : ( it ) => it , // obj processor that just returns the same obj
261336 } ) ;
262337 readerUnderTest . addPayloadListener ( ( it ) => {
@@ -286,7 +361,7 @@ it('silently ignores unrecognized kinds', () => {
286361it ( 'ignores additional payloads beyond the first payload in the server-intent message' , ( ) => {
287362 const mockStream = new MockEventStream ( ) ;
288363 const receivedPayloads : Payload [ ] = [ ] ;
289- const readerUnderTest = new PayloadReader ( mockStream , {
364+ const readerUnderTest = new PayloadStreamReader ( mockStream , {
290365 mockKind : ( it ) => it , // obj processor that just returns the same obj
291366 } ) ;
292367 readerUnderTest . addPayloadListener ( ( it ) => {
0 commit comments