1- import  {  Injectable ,  Inject ,  Optional ,  NgZone  }  from  '@angular/core' ; 
1+ import  {  Injectable ,  Inject ,  Optional ,  NgZone ,   ApplicationRef  }  from  '@angular/core' ; 
22import  {  FirebaseDatabase  }  from  '@firebase/database-types' ; 
33import  {  PathReference ,  DatabaseQuery ,  DatabaseReference ,  DatabaseSnapshot ,  ChildEvent ,  ListenEvent ,  QueryFn ,  AngularFireList ,  AngularFireObject  }  from  './interfaces' ; 
44import  {  getRef  }  from  './utils' ; 
55import  {  InjectionToken  }  from  '@angular/core' ; 
66import  {  FirebaseOptions  }  from  '@firebase/app-types' ; 
77import  {  createListReference  }  from  './list/create-reference' ; 
88import  {  createObjectReference  }  from  './object/create-reference' ; 
9- import  {  FirebaseAppConfig ,  FirebaseAppName ,  RealtimeDatabaseURL ,  _firebaseAppFactory ,  FirebaseZoneScheduler  }  from  'angularfire2' ; 
9+ import  {  FirebaseAppConfig ,  FirebaseAppName ,  RealtimeDatabaseURL ,  UniversalDatabaseTransferStateKeyPrefix ,  _firebaseAppFactory ,  FirebaseZoneScheduler  }  from  'angularfire2' ; 
10+ import  {  makeStateKey ,  TransferState  }  from  '@angular/platform-browser' ; 
11+ import  'rxjs/add/operator/take' ; 
1012
1113@Injectable ( ) 
1214export  class  AngularFireDatabase  { 
1315  public  readonly  database : FirebaseDatabase ; 
1416  public  readonly  scheduler : FirebaseZoneScheduler ; 
17+   private  readFromCache  =  true ; 
1518
1619  constructor ( 
1720    @Inject ( FirebaseAppConfig )  config :FirebaseOptions , 
1821    @Optional ( )  @Inject ( FirebaseAppName )  name :string , 
1922    @Optional ( )  @Inject ( RealtimeDatabaseURL )  databaseURL :string , 
23+     @Inject ( UniversalDatabaseTransferStateKeyPrefix )  private  cacheKeyPrefix :string , 
24+     private  ts : TransferState , 
25+     appRef : ApplicationRef , 
2026    zone : NgZone 
2127  )  { 
2228    this . scheduler  =  new  FirebaseZoneScheduler ( zone ) ; 
2329    this . database  =  zone . runOutsideAngular ( ( )  =>  { 
2430      const  app  =  _firebaseAppFactory ( config ,  name ) ; 
2531      return  app . database ( databaseURL  ||  undefined ) ; 
2632    } ) ; 
33+     appRef . isStable . filter ( Boolean ) . take ( 1 ) . subscribe ( ( )  =>  this . readFromCache  =  false ) 
2734  } 
2835
2936  list < T > ( pathOrRef : PathReference ,  queryFn ?: QueryFn ) : AngularFireList < T >  { 
3037    const  ref  =  getRef ( this . database ,  pathOrRef ) ; 
38+     const  ssrCached  =  this . readFromCache  &&  this . getValueFromServerRequest < T > ( pathOrRef . toString ( ) )  ||  undefined 
3139    let  query : DatabaseQuery  =  ref ; 
3240    if ( queryFn )  { 
3341      query  =  queryFn ( ref ) ; 
@@ -37,13 +45,21 @@ export class AngularFireDatabase {
3745
3846  object < T > ( pathOrRef : PathReference ) : AngularFireObject < T >   { 
3947    const  ref  =  getRef ( this . database ,  pathOrRef ) ; 
40-     return  createObjectReference < T > ( ref ,  this ) ; 
48+     const  ssrCached  =  this . readFromCache  &&  this . getValueFromServerRequest < T > ( pathOrRef . toString ( ) )  ||  undefined 
49+     return  createObjectReference < T > ( ref ,  this ,  ssrCached ) ; 
4150  } 
4251
4352  createPushId ( )  { 
4453    return  this . database . ref ( ) . push ( ) . key ; 
4554  } 
4655
56+   private  getValueFromServerRequest < T > ( path : string )  { 
57+     return  this . ts . get < T  |  undefined > ( this . getTsCacheKey ( path ) ,  undefined ) ; 
58+   } 
59+ 
60+   private  getTsCacheKey ( path : string )  { 
61+     return  makeStateKey < string > ( `${ this . cacheKeyPrefix } ${ path }  ) ; 
62+   } 
4763} 
4864
4965export  { 
0 commit comments