Skip to content

Commit b07ac82

Browse files
feat: preferRest app option for Firestore
1 parent 318f0e4 commit b07ac82

File tree

7 files changed

+415
-496
lines changed

7 files changed

+415
-496
lines changed

etc/firebase-admin.api.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ export interface AppOptions {
7373
databaseAuthVariableOverride?: object | null;
7474
databaseURL?: string;
7575
httpAgent?: Agent;
76+
preferRest?: boolean;
7677
projectId?: string;
7778
serviceAccountId?: string;
7879
storageBucket?: string;

etc/firebase-admin.app.api.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export interface AppOptions {
2323
databaseAuthVariableOverride?: object | null;
2424
databaseURL?: string;
2525
httpAgent?: Agent;
26+
preferRest?: boolean;
2627
projectId?: string;
2728
serviceAccountId?: string;
2829
storageBucket?: string;

package-lock.json

Lines changed: 362 additions & 494 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@
198198
"uuid": "^8.3.2"
199199
},
200200
"optionalDependencies": {
201-
"@google-cloud/firestore": "^6.0.0",
201+
"@google-cloud/firestore": "^6.2.0",
202202
"@google-cloud/storage": "^6.1.0"
203203
},
204204
"devDependencies": {

src/app/core.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,14 @@ export interface AppOptions {
8383
* specifying an HTTP Agent in the corresponding factory methods.
8484
*/
8585
httpAgent?: Agent;
86+
87+
/**
88+
* Prefer REST transport for Firestore.
89+
* By default, Firestore will use gRPC. Pass preferRest: true to use
90+
* HTTP/1.1 REST transport if possible. Note that gRPC will still be
91+
* used for calls that need bi-directional streaming.
92+
*/
93+
preferRest?: boolean;
8694
}
8795

8896
/**

src/firestore/firestore-internal.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ export function getFirestoreOptions(app: App): Settings {
5757

5858
const projectId: string | null = utils.getExplicitProjectId(app);
5959
const credential = app.options.credential;
60+
const preferRest = app.options.preferRest;
6061
// eslint-disable-next-line @typescript-eslint/no-var-requires
6162
const { version: firebaseVersion } = require('../../package.json');
6263
if (credential instanceof ServiceAccountCredential) {
@@ -69,12 +70,15 @@ export function getFirestoreOptions(app: App): Settings {
6970
// guaranteed to be available.
7071
projectId: projectId!,
7172
firebaseVersion,
73+
preferRest,
7274
};
7375
} else if (isApplicationDefault(app.options.credential)) {
7476
// Try to use the Google application default credentials.
7577
// If an explicit project ID is not available, let Firestore client discover one from the
7678
// environment. This prevents the users from having to set GOOGLE_CLOUD_PROJECT in GCP runtimes.
77-
return validator.isNonEmptyString(projectId) ? { projectId, firebaseVersion } : { firebaseVersion };
79+
return validator.isNonEmptyString(projectId)
80+
? { projectId, firebaseVersion, preferRest }
81+
: { firebaseVersion, preferRest };
7882
}
7983

8084
throw new FirebaseFirestoreError({

test/unit/firestore/firestore.spec.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ describe('Firestore', () => {
3131
let mockApp: FirebaseApp;
3232
let mockCredentialApp: FirebaseApp;
3333
let projectIdApp: FirebaseApp;
34+
let preferRestAppDefault: FirebaseApp;
35+
let preferRestAppCredentials: FirebaseApp;
36+
let preferRestAppProjectId: FirebaseApp;
3437
let firestore: any;
3538

3639
let appCredentials: string | undefined;
@@ -70,6 +73,18 @@ describe('Firestore', () => {
7073
credential: mocks.credential,
7174
projectId: 'explicit-project-id',
7275
});
76+
preferRestAppDefault = mocks.appWithOptions({
77+
preferRest: true,
78+
});
79+
preferRestAppCredentials = mocks.appWithOptions({
80+
credential: mocks.credential,
81+
preferRest: true,
82+
});
83+
preferRestAppProjectId = mocks.appWithOptions({
84+
credential: mocks.credential,
85+
projectId: 'explicit-project-id',
86+
preferRest: true,
87+
});
7388
firestore = new FirestoreService(mockApp);
7489
});
7590

@@ -210,4 +225,26 @@ describe('Firestore', () => {
210225
});
211226
});
212227
});
228+
229+
describe('options.preferRest', () => {
230+
it('should set preferRest in Firestore options - default', () => {
231+
const options = getFirestoreOptions(preferRestAppDefault);
232+
expect(options.preferRest).to.be.true;
233+
});
234+
235+
it('should set preferRest in Firestore options - credentials', () => {
236+
const options = getFirestoreOptions(preferRestAppCredentials);
237+
expect(options.preferRest).to.be.true;
238+
});
239+
240+
it('should set preferRest in Firestore options - projectId', () => {
241+
const options = getFirestoreOptions(preferRestAppProjectId);
242+
expect(options.preferRest).to.be.true;
243+
});
244+
245+
it('should not set preferRest in Firestore options by default', () => {
246+
const options = getFirestoreOptions(mockApp);
247+
expect(options.preferRest).to.be.undefined;
248+
});
249+
});
213250
});

0 commit comments

Comments
 (0)