Skip to content

Commit cdf7b39

Browse files
committed
add custom headers to track web frameworks usage
1 parent dafae52 commit cdf7b39

File tree

5 files changed

+78
-7
lines changed

5 files changed

+78
-7
lines changed

packages/data-connect/src/api/DataConnect.ts

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,9 @@ export class DataConnect {
9292
private _transportOptions?: TransportOptions;
9393
private _authTokenProvider?: AuthTokenProvider;
9494
_isUsingGeneratedSdk: boolean = false;
95+
_isUsingTanStackSdk: boolean = false;
96+
_isUsingReactSdk: boolean = false;
97+
_isUsingAngularFireSdk: boolean = false;
9598
private _appCheckTokenProvider?: AppCheckTokenProvider;
9699
// @internal
97100
constructor(
@@ -116,6 +119,24 @@ export class DataConnect {
116119
this._isUsingGeneratedSdk = true;
117120
}
118121
}
122+
// @internal
123+
_useTanStackSdk(): void {
124+
if (!this._isUsingTanStackSdk) {
125+
this._isUsingTanStackSdk = true;
126+
}
127+
}
128+
// @internal
129+
_useReactSdk(): void {
130+
if (!this._isUsingReactSdk) {
131+
this._isUsingReactSdk = true;
132+
}
133+
}
134+
// @internal
135+
_useAngularFireSdk(): void {
136+
if (!this._isUsingAngularFireSdk) {
137+
this._isUsingAngularFireSdk = true;
138+
}
139+
}
119140
_delete(): Promise<void> {
120141
_removeServiceInstance(
121142
this.app,
@@ -164,7 +185,10 @@ export class DataConnect {
164185
this._authTokenProvider,
165186
this._appCheckTokenProvider,
166187
undefined,
167-
this._isUsingGeneratedSdk
188+
this._isUsingGeneratedSdk,
189+
this._isUsingTanStackSdk,
190+
this._isUsingReactSdk,
191+
this._isUsingAngularFireSdk
168192
);
169193
if (this._transportOptions) {
170194
this._transport.useEmulator(

packages/data-connect/src/network/fetch.ts

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,27 @@ function getGoogApiClientValue(_isUsingGen: boolean): string {
3030
}
3131
return str;
3232
}
33+
function getWebFrameworkValue(
34+
_isUsingTanStack: boolean,
35+
_isUsingReact: boolean,
36+
_isUsingAngularFire: boolean
37+
): string {
38+
let str = '';
39+
if (_isUsingTanStack) {
40+
str += ' tanstack/';
41+
}
42+
if (_isUsingReact) {
43+
str += ' react/';
44+
}
45+
if (_isUsingAngularFire) {
46+
str += ' angularfire/';
47+
}
48+
// no framework SDK used
49+
if (str === '') {
50+
str = 'vanilla/';
51+
}
52+
return str.trim();
53+
}
3354
export interface DataConnectFetchBody<T> {
3455
name: string;
3556
operationName: string;
@@ -42,14 +63,22 @@ export function dcFetch<T, U>(
4263
appId: string | null,
4364
accessToken: string | null,
4465
appCheckToken: string | null,
45-
_isUsingGen: boolean
66+
_isUsingGen: boolean,
67+
_isUsingTanStack: boolean,
68+
_isUsingReact: boolean,
69+
_isUsingAngularFire: boolean
4670
): Promise<{ data: T; errors: Error[] }> {
4771
if (!connectFetch) {
4872
throw new DataConnectError(Code.OTHER, 'No Fetch Implementation detected!');
4973
}
5074
const headers: HeadersInit = {
5175
'Content-Type': 'application/json',
52-
'X-Goog-Api-Client': getGoogApiClientValue(_isUsingGen)
76+
'X-Goog-Api-Client': getGoogApiClientValue(_isUsingGen),
77+
'X-Firebase-DataConnect-Web-Frameworks': getWebFrameworkValue(
78+
_isUsingTanStack,
79+
_isUsingReact,
80+
_isUsingAngularFire
81+
)
5382
};
5483
if (accessToken) {
5584
headers['X-Firebase-Auth-Token'] = accessToken;

packages/data-connect/src/network/transport/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,8 @@ export type TransportClass = new (
4545
authProvider?: AuthTokenProvider,
4646
appCheckProvider?: AppCheckTokenProvider,
4747
transportOptions?: TransportOptions,
48-
_isUsingGen?: boolean
48+
_isUsingGen?: boolean,
49+
_isUsingTanStack?: boolean,
50+
_isUsingReact?: boolean,
51+
_isUsingAngularFire?: boolean
4952
) => DataConnectTransport;

packages/data-connect/src/network/transport/rest.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@ export class RESTTransport implements DataConnectTransport {
4343
private authProvider?: AuthTokenProvider | undefined,
4444
private appCheckProvider?: AppCheckTokenProvider | undefined,
4545
transportOptions?: TransportOptions | undefined,
46-
private _isUsingGen = false
46+
private _isUsingGen = false,
47+
private _isUsingReact = false,
48+
private _isUsingAngularFire = false,
49+
private _isUsingTanStack = false
4750
) {
4851
if (transportOptions) {
4952
if (typeof transportOptions.port === 'number') {
@@ -180,7 +183,10 @@ export class RESTTransport implements DataConnectTransport {
180183
this.appId,
181184
this._accessToken,
182185
this._appCheckToken,
183-
this._isUsingGen
186+
this._isUsingGen,
187+
this._isUsingTanStack,
188+
this._isUsingReact,
189+
this._isUsingAngularFire
184190
)
185191
);
186192
return withAuth;
@@ -205,7 +211,10 @@ export class RESTTransport implements DataConnectTransport {
205211
this.appId,
206212
this._accessToken,
207213
this._appCheckToken,
208-
this._isUsingGen
214+
this._isUsingGen,
215+
this._isUsingTanStack,
216+
this._isUsingReact,
217+
this._isUsingAngularFire
209218
);
210219
});
211220
return taskResult;

packages/data-connect/test/unit/fetch.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ describe('fetch', () => {
5151
null,
5252
null,
5353
null,
54+
false,
55+
false,
56+
false,
5457
false
5558
)
5659
).to.eventually.be.rejectedWith(message);
@@ -74,6 +77,9 @@ describe('fetch', () => {
7477
null,
7578
null,
7679
null,
80+
false,
81+
false,
82+
false,
7783
false
7884
)
7985
).to.eventually.be.rejectedWith(JSON.stringify(json));

0 commit comments

Comments
 (0)