@@ -10,6 +10,7 @@ import Repository from '../repository';
1010import { DefaultBootstrapProvider } from '../repository/bootstrap-provider' ;
1111import { StorageProvider } from '../repository/storage-provider' ;
1212import { ClientFeaturesResponse } from '../feature' ;
13+ import { EventEmitter } from 'events' ;
1314
1415const appName = 'foo' ;
1516const instanceId = 'bar' ;
@@ -1360,3 +1361,73 @@ test('Stopping repository should stop storage provider updates', async (t) => {
13601361 const result = await storageProvider . get ( appName ) ;
13611362 t . is ( result , undefined ) ;
13621363} ) ;
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