-
Notifications
You must be signed in to change notification settings - Fork 2.2k
/
Copy pathfunctions.ts
55 lines (45 loc) · 1.87 KB
/
functions.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import { Injectable, Inject, Optional, NgZone, PLATFORM_ID, InjectionToken } from '@angular/core';
import { Observable, from } from 'rxjs';
import { map } from 'rxjs/operators';
import { FirebaseOptions, FirebaseAppConfig } from '@angular/fire';
import { FirebaseFunctions, FirebaseOptionsToken, FirebaseNameOrConfigToken, _firebaseAppFactory, FirebaseZoneScheduler } from '@angular/fire';
// SEMVER: @ v6 remove FunctionsRegionToken in favor of FUNCTIONS_REGION
export const FunctionsRegionToken = new InjectionToken<string>('angularfire2.functions.region');
export const FUNCTIONS_ORIGIN = new InjectionToken<string>('angularfire2.functions.origin');
export const FUNCTIONS_REGION = FunctionsRegionToken;
@Injectable()
export class AngularFireFunctions {
/**
* Firebase Functions instance
*/
public readonly functions: FirebaseFunctions;
public readonly scheduler: FirebaseZoneScheduler;
constructor(
@Inject(FirebaseOptionsToken) options:FirebaseOptions,
@Optional() @Inject(FirebaseNameOrConfigToken) nameOrConfig:string|FirebaseAppConfig|null|undefined,
@Inject(PLATFORM_ID) platformId: Object,
zone: NgZone,
@Optional() @Inject(FUNCTIONS_REGION) region:string|null,
@Optional() @Inject(FUNCTIONS_ORIGIN) origin:string|null
) {
this.scheduler = new FirebaseZoneScheduler(zone, platformId);
this.functions = zone.runOutsideAngular(() => {
const app = _firebaseAppFactory(options, nameOrConfig);
return app.functions(region || undefined);
});
if (origin) {
this.functions.useFunctionsEmulator(origin);
}
}
public httpsCallable<T=any, R=any>(name: string) {
const callable = this.functions.httpsCallable(name);
return (data: T) => {
const callable$ = from(callable(data));
return this.scheduler.runOutsideAngular(
callable$.pipe(
map(r => r.data as R)
)
)
}
}
}