@@ -19,8 +19,8 @@ export class GlobalStore implements IGlobalStore {
19
19
private _stores : { [ key : string ] : Store } ;
20
20
private _globalActions : { [ key : string ] : Array < string > } ;
21
21
private _globalListeners : Array < ( state : any ) => void > ;
22
- private _eagerPartnerStoreSubscribers : { [ key : string ] : ( state : any ) => void } ;
23
- private _eagerUnsubscribers : { [ key : string ] : ( ) => void } ;
22
+ private _eagerPartnerStoreSubscribers : { [ key : string ] : { [ key : string ] : ( state ) => void } }
23
+ private _eagerUnsubscribers : { [ key : string ] : { [ key : string ] : ( ) => void } }
24
24
private _actionLogger : ActionLogger = null ;
25
25
26
26
private constructor ( private _logger : ILogger = null ) {
@@ -38,7 +38,7 @@ export class GlobalStore implements IGlobalStore {
38
38
* @param {ILogger } logger Logger service.
39
39
*/
40
40
public static Get ( debugMode : boolean = false , logger : ILogger = null ) : IGlobalStore {
41
- if ( debugMode ) {
41
+ if ( debugMode ) {
42
42
this . DebugMode = debugMode ;
43
43
}
44
44
if ( debugMode && ( logger === undefined || logger === null ) ) {
@@ -70,7 +70,7 @@ export class GlobalStore implements IGlobalStore {
70
70
if ( existingStore === null || existingStore === undefined || shouldReplaceStore ) {
71
71
if ( middlewares === undefined || middlewares === null )
72
72
middlewares = [ ] ;
73
- let appStore = createStore ( appReducer , GlobalStore . DebugMode ? composeWithDevTools ( applyMiddleware ( ...middlewares ) ) : applyMiddleware ( ...middlewares ) ) ;
73
+ let appStore = createStore ( appReducer , GlobalStore . DebugMode ? composeWithDevTools ( applyMiddleware ( ...middlewares ) ) : applyMiddleware ( ...middlewares ) ) ;
74
74
this . RegisterStore ( appName , appStore , globalActions , shouldReplaceStore ) ;
75
75
return appStore ;
76
76
}
@@ -100,10 +100,7 @@ export class GlobalStore implements IGlobalStore {
100
100
this . _stores [ appName ] = store ;
101
101
store . subscribe ( this . InvokeGlobalListeners . bind ( this ) ) ;
102
102
this . RegisterGlobalActions ( appName , globalActions ) ;
103
- let eagerSubscription = this . _eagerPartnerStoreSubscribers [ appName ] ;
104
- if ( eagerSubscription !== undefined && eagerSubscription !== null ) {
105
- this . _eagerUnsubscribers [ appName ] = this . SubscribeToPartnerState ( "SYS" , appName , eagerSubscription ) ;
106
- }
103
+ this . RegisterEagerSubscriptions ( appName ) ;
107
104
this . LogRegistration ( appName , ( existingStore !== undefined && existingStore !== null ) ) ;
108
105
}
109
106
@@ -282,13 +279,19 @@ export class GlobalStore implements IGlobalStore {
282
279
SubscribeToPartnerState ( source : string , partner : string , callback : ( state : any ) => void , eager : boolean = true ) : ( ) => void {
283
280
let partnerStore = this . GetPartnerStore ( partner ) ;
284
281
if ( partnerStore === undefined || partnerStore === null ) {
285
- if ( ! eager ) {
282
+ if ( ! eager ) {
286
283
throw new Error ( `ERROR: ${ source } is trying to subscribe to partner ${ partner } . Either ${ partner } doesn't exist or hasn't been loaded yet` ) ;
287
284
}
288
-
289
- this . _eagerPartnerStoreSubscribers [ partner ] = callback ;
285
+ if ( this . _eagerPartnerStoreSubscribers [ partner ] ) {
286
+ this . _eagerPartnerStoreSubscribers [ partner ] . source = callback ;
287
+ } else {
288
+ this . _eagerPartnerStoreSubscribers [ partner ] = {
289
+ source : callback
290
+ }
291
+ }
292
+
290
293
return ( ) => {
291
- this . UnsubscribeEagerSubscription ( partner ) ;
294
+ this . UnsubscribeEagerSubscription ( source , partner ) ;
292
295
}
293
296
}
294
297
return partnerStore . subscribe ( ( ) => callback ( partnerStore . getState ( ) ) ) ;
@@ -311,6 +314,18 @@ export class GlobalStore implements IGlobalStore {
311
314
}
312
315
}
313
316
317
+ UnsubscribeEagerSubscription ( source : string , partnerName : string ) {
318
+ if ( ! partnerName || ! source )
319
+ return ;
320
+
321
+ if ( ! this . _eagerUnsubscribers [ partnerName ] )
322
+ return ;
323
+
324
+ let unsubscriber = this . _eagerUnsubscribers [ partnerName ] . source ;
325
+ if ( unsubscriber )
326
+ unsubscriber ( ) ;
327
+ }
328
+
314
329
SetLogger ( logger : ILogger ) {
315
330
if ( this . _logger === undefined || this . _logger === null )
316
331
this . _logger = logger ;
@@ -319,6 +334,26 @@ export class GlobalStore implements IGlobalStore {
319
334
this . _actionLogger . SetLogger ( logger ) ;
320
335
}
321
336
337
+ private RegisterEagerSubscriptions ( appName : string ) {
338
+ let eagerCallbacksRegistrations = this . _eagerPartnerStoreSubscribers [ appName ] ;
339
+ if ( eagerCallbacksRegistrations === undefined || eagerCallbacksRegistrations === undefined )
340
+ return ;
341
+ let registeredApps = Object . keys ( eagerCallbacksRegistrations ) ;
342
+ registeredApps . forEach ( sourceApp => {
343
+ let callback = eagerCallbacksRegistrations [ sourceApp ] ;
344
+ if ( callback ) {
345
+ let unregistrationCallback = this . SubscribeToPartnerState ( sourceApp , appName , callback , false ) ;
346
+ if ( this . _eagerPartnerStoreSubscribers [ appName ] ) {
347
+ this . _eagerPartnerStoreSubscribers [ appName ] . sourceApp = unregistrationCallback ;
348
+ } else {
349
+ this . _eagerPartnerStoreSubscribers [ appName ] = {
350
+ sourceApp : unregistrationCallback
351
+ } ;
352
+ }
353
+ }
354
+ } ) ;
355
+ }
356
+
322
357
private InvokeGlobalListeners ( ) : void {
323
358
let globalState = this . GetGlobalState ( ) ;
324
359
this . _globalListeners . forEach ( globalListener => {
@@ -341,21 +376,12 @@ export class GlobalStore implements IGlobalStore {
341
376
342
377
private IsActionRegisteredAsGlobal ( appName : string , action : IAction < any > ) : boolean {
343
378
let registeredGlobalActions = this . _globalActions [ appName ] ;
344
- if ( registeredGlobalActions === undefined || registeredGlobalActions === null ) {
345
- return false ;
346
- }
379
+ if ( registeredGlobalActions === undefined || registeredGlobalActions === null ) {
380
+ return false ;
381
+ }
347
382
return registeredGlobalActions . some ( registeredAction => registeredAction === action . type || registeredAction === GlobalStore . AllowAll ) ;
348
383
}
349
384
350
- private UnsubscribeEagerSubscription ( partnerName : string ) {
351
- if ( ! partnerName )
352
- return ;
353
-
354
- let unsubscriber = this . _eagerUnsubscribers [ partnerName ] ;
355
- if ( unsubscriber )
356
- unsubscriber ( ) ;
357
- }
358
-
359
385
private LogRegistration ( appName : string , isReplaced : boolean ) {
360
386
try {
361
387
let properties = {
0 commit comments