@@ -10,6 +10,7 @@ import Repository from '../repository';
10
10
import { DefaultBootstrapProvider } from '../repository/bootstrap-provider' ;
11
11
import { StorageProvider } from '../repository/storage-provider' ;
12
12
import { ClientFeaturesResponse } from '../feature' ;
13
+ import { EventEmitter } from 'events' ;
13
14
14
15
const appName = 'foo' ;
15
16
const instanceId = 'bar' ;
@@ -1360,3 +1361,73 @@ test('Stopping repository should stop storage provider updates', async (t) => {
1360
1361
const result = await storageProvider . get ( appName ) ;
1361
1362
t . is ( result , undefined ) ;
1362
1363
} ) ;
1364
+
1365
+ test ( 'Streaming' , async ( t ) => {
1366
+ t . plan ( 6 ) ;
1367
+ const url = 'irrelevant' ;
1368
+ const feature = {
1369
+ name : 'feature' ,
1370
+ enabled : true ,
1371
+ strategies : [
1372
+ {
1373
+ name : 'default' ,
1374
+ } ,
1375
+ ] ,
1376
+ } ;
1377
+ const storageProvider : StorageProvider < ClientFeaturesResponse > = new InMemStorageProvider ( ) ;
1378
+ const eventSource = {
1379
+ eventEmitter : new EventEmitter ( ) ,
1380
+ listeners : new Set < string > ( ) ,
1381
+ addEventListener ( eventName : string , handler : ( ) => void ) {
1382
+ eventSource . listeners . add ( eventName ) ;
1383
+ eventSource . eventEmitter . on ( eventName , handler ) ;
1384
+ } ,
1385
+ close ( ) {
1386
+ eventSource . listeners . forEach ( ( eventName ) => {
1387
+ eventSource . eventEmitter . removeAllListeners ( eventName ) ;
1388
+ } ) ;
1389
+ } ,
1390
+ emit ( eventName : string , data : unknown ) {
1391
+ eventSource . eventEmitter . emit ( eventName , data ) ;
1392
+ } ,
1393
+ } ;
1394
+ const repo = new Repository ( {
1395
+ url,
1396
+ appName,
1397
+ instanceId,
1398
+ refreshInterval : 10 ,
1399
+ // @ts -expect-error
1400
+ bootstrapProvider : new DefaultBootstrapProvider ( { } ) ,
1401
+ storageProvider,
1402
+ eventSource,
1403
+ } ) ;
1404
+
1405
+ const before = repo . getToggles ( ) ;
1406
+ t . deepEqual ( before , [ ] ) ;
1407
+
1408
+ // update with feature
1409
+ eventSource . emit ( 'unleash-updated' , {
1410
+ type : 'unleash-updated' ,
1411
+ data : JSON . stringify ( { meta : { } , features : [ feature ] } ) ,
1412
+ } ) ;
1413
+ const firstUpdate = repo . getToggles ( ) ;
1414
+ t . deepEqual ( firstUpdate , [ feature ] ) ;
1415
+ // @ts -expect-error
1416
+ t . is ( repo . etag , undefined ) ;
1417
+
1418
+ // update with etag
1419
+ eventSource . emit ( 'unleash-updated' , {
1420
+ type : 'unleash-updated' ,
1421
+ data : JSON . stringify ( { meta : { etag : 'updated' } , features : [ ] } ) ,
1422
+ } ) ;
1423
+ const secondUpdate = repo . getToggles ( ) ;
1424
+ t . deepEqual ( secondUpdate , [ ] ) ;
1425
+ // @ts -expect-error
1426
+ t . is ( repo . etag , 'updated' ) ;
1427
+
1428
+ // SSE error translated to repo warning
1429
+ repo . on ( 'warn' , ( msg ) => {
1430
+ t . is ( msg , 'some error' ) ;
1431
+ } ) ;
1432
+ eventSource . emit ( 'error' , 'some error' ) ;
1433
+ } ) ;
0 commit comments