Skip to content

Commit 08e1e99

Browse files
fix: handle firebase state transfer better
1 parent a10002a commit 08e1e99

File tree

4 files changed

+51
-20
lines changed

4 files changed

+51
-20
lines changed
Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,30 @@
1-
import { NgModule } from '@angular/core'
1+
import {
2+
NgModule,
3+
ModuleWithProviders,
4+
Optional,
5+
SkipSelf
6+
} from '@angular/core'
27
import { UniversalRtDbService } from './browser.firebase.rtdb.service'
38

4-
// export const FIREBASE_USER_AUTH_TOKEN = new InjectionToken<string>(
5-
// 'fng.fb.svr.usr.auth'
6-
// )
7-
8-
// export const FIREBASE_DATABASE_URL = new InjectionToken<string>(
9-
// 'fng.fb.db.url'
10-
// )
11-
129
// tslint:disable-next-line:no-class
13-
@NgModule({
14-
providers: [UniversalRtDbService]
15-
})
16-
export class FirebaseBrowserModule {}
10+
@NgModule()
11+
export class FirebaseBrowserModule {
12+
static forRoot(): ModuleWithProviders {
13+
return {
14+
ngModule: FirebaseBrowserModule,
15+
providers: [UniversalRtDbService]
16+
}
17+
}
18+
19+
constructor(
20+
@Optional()
21+
@SkipSelf()
22+
parentModule: FirebaseBrowserModule
23+
) {
24+
// tslint:disable-next-line:no-if-statement
25+
if (parentModule)
26+
throw new Error(
27+
'FirebaseBrowserModule already loaded. Import in root module only.'
28+
)
29+
}
30+
}

src/modules/firebase/server.firebase.rtdb.service.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { catchError, take, tap } from 'rxjs/operators'
1+
import { catchError, take, tap, map } from 'rxjs/operators'
22
import { AngularFireDatabase } from 'angularfire2/database'
33
import { Inject, Injectable, Optional } from '@angular/core'
4-
import { HttpClient, HttpParams } from '@angular/common/http'
4+
import { HttpClient, HttpParams, HttpResponse } from '@angular/common/http'
55
import {
66
FIREBASE_USER_AUTH_TOKEN,
77
LRU_CACHE,
@@ -41,10 +41,14 @@ function mapUndefined(err: any) {
4141

4242
function attemptToCacheInLru(key: string, lru?: LruCache) {
4343
return function(response?: any) {
44-
lru && lru.set(sha256(key), response)
44+
lru && response && lru.set(sha256(key), response)
4545
}
4646
}
4747

48+
function httpResponseToValue<T>(value: HttpResponse<T>): T | undefined {
49+
return (value && value.body) || undefined
50+
}
51+
4852
function attemptToGetCachedValue<T>(key: string, lru?: LruCache) {
4953
return lru && lru.get<T>(sha256(key))
5054
}
@@ -82,13 +86,14 @@ export class ServerUniversalRtDbService implements IUniversalRtdbService {
8286
const tsKey = makeRtDbStateTransferKey(url)
8387

8488
const baseObs = this.authToken
85-
? this.http.get<T>(url, { params })
86-
: this.http.get<T>(url)
89+
? this.http.get<HttpResponse<T>>(url, { params })
90+
: this.http.get<HttpResponse<T>>(url)
8791

8892
return cachedValue
8993
? of(cachedValue).pipe(tap(writeLruCacheToTransferState(this.ts, tsKey)))
9094
: baseObs.pipe(
9195
take(1),
96+
map(httpResponseToValue),
9297
tap(attemptToCacheInLru(cacheKey, this.lru)),
9398
catchError(mapUndefined)
9499
)
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
import { platformBrowser } from '@angular/platform-browser'
22
import { AppBrowserModuleNgFactory } from './app.browser.module.ngfactory'
33

4-
platformBrowser().bootstrapModuleFactory(AppBrowserModuleNgFactory)
4+
function domContentLoadedHandler() {
5+
platformBrowser()
6+
.bootstrapModuleFactory(AppBrowserModuleNgFactory)
7+
.catch(console.log)
8+
}
9+
10+
document.addEventListener('DOMContentLoaded', domContentLoadedHandler)
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'
22
import { AppBrowserModule } from './app.browser.module'
33

4-
platformBrowserDynamic().bootstrapModule(AppBrowserModule)
4+
function domContentLoadedHandler() {
5+
platformBrowserDynamic()
6+
.bootstrapModule(AppBrowserModule)
7+
.catch(console.log)
8+
}
9+
10+
document.addEventListener('DOMContentLoaded', domContentLoadedHandler)

0 commit comments

Comments
 (0)