@@ -24,6 +24,10 @@ import {
24
24
} from '@firebase/messaging-types' ;
25
25
26
26
import { Provider } from '@firebase/component' ;
27
+ import {
28
+ AppCheckInternalComponentName ,
29
+ FirebaseAppCheckInternal
30
+ } from '@firebase/app-check-interop-types' ;
27
31
28
32
/**
29
33
* The metadata that should be supplied with function calls.
@@ -32,6 +36,7 @@ import { Provider } from '@firebase/component';
32
36
export interface Context {
33
37
authToken ?: string ;
34
38
messagingToken ?: string ;
39
+ appCheckToken : string | null ;
35
40
}
36
41
37
42
/**
@@ -41,9 +46,11 @@ export interface Context {
41
46
export class ContextProvider {
42
47
private auth : FirebaseAuthInternal | null = null ;
43
48
private messaging : FirebaseMessaging | null = null ;
49
+ private appCheck : FirebaseAppCheckInternal | null = null ;
44
50
constructor (
45
51
authProvider : Provider < FirebaseAuthInternalName > ,
46
- messagingProvider : Provider < FirebaseMessagingName >
52
+ messagingProvider : Provider < FirebaseMessagingName > ,
53
+ appCheckProvider : Provider < AppCheckInternalComponentName >
47
54
) {
48
55
this . auth = authProvider . getImmediate ( { optional : true } ) ;
49
56
this . messaging = messagingProvider . getImmediate ( {
@@ -67,6 +74,15 @@ export class ContextProvider {
67
74
}
68
75
) ;
69
76
}
77
+
78
+ if ( ! this . appCheck ) {
79
+ appCheckProvider . get ( ) . then (
80
+ appCheck => ( this . appCheck = appCheck ) ,
81
+ ( ) => {
82
+ /* get() never rejects */
83
+ }
84
+ ) ;
85
+ }
70
86
}
71
87
72
88
async getAuthToken ( ) : Promise < string | undefined > {
@@ -103,9 +119,22 @@ export class ContextProvider {
103
119
}
104
120
}
105
121
122
+ async getAppCheckToken ( ) : Promise < string | null > {
123
+ if ( this . appCheck ) {
124
+ const result = await this . appCheck . getToken ( ) ;
125
+ // If getToken() fails, it will still return a dummy token that also has
126
+ // an error field containing the error message. We will send any token
127
+ // provided here and show an error if/when it is rejected by the functions
128
+ // endpoint.
129
+ return result . token ;
130
+ }
131
+ return null ;
132
+ }
133
+
106
134
async getContext ( ) : Promise < Context > {
107
135
const authToken = await this . getAuthToken ( ) ;
108
136
const messagingToken = await this . getMessagingToken ( ) ;
109
- return { authToken, messagingToken } ;
137
+ const appCheckToken = await this . getAppCheckToken ( ) ;
138
+ return { authToken, messagingToken, appCheckToken } ;
110
139
}
111
140
}
0 commit comments