Skip to content

Commit 557e0cb

Browse files
Compat Layer for Firestore
1 parent 8922f54 commit 557e0cb

File tree

7 files changed

+267
-356
lines changed

7 files changed

+267
-356
lines changed

packages/firestore/exp/src/api/database.ts

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,22 +37,23 @@ import {
3737
} from '../../../src/core/component_provider';
3838
import {
3939
FirebaseFirestore as LiteFirestore,
40+
makeDatabaseInfo,
4041
Settings as LiteSettings
4142
} from '../../../lite/src/api/database';
4243
import { Code, FirestoreError } from '../../../src/util/error';
4344
import { Deferred } from '../../../src/util/promise';
4445
import { LRU_MINIMUM_CACHE_SIZE_BYTES } from '../../../src/local/lru_garbage_collector';
4546
import {
4647
CACHE_SIZE_UNLIMITED,
47-
configureFirestore,
48-
ensureFirestoreConfigured,
49-
FirestoreCompat
48+
FirestoreDatabase
5049
} from '../../../src/api/database';
5150
import {
5251
indexedDbClearPersistence,
5352
indexedDbStoragePrefix
5453
} from '../../../src/local/indexeddb_persistence';
5554
import { PersistenceSettings } from '../../../exp-types';
55+
import { debugAssert } from '../../../src/util/assert';
56+
import { DatabaseInfo } from '../../../src/core/database_info';
5657

5758
/** DOMException error code constants. */
5859
const DOM_EXCEPTION_INVALID_STATE = 11;
@@ -70,18 +71,18 @@ export interface Settings extends LiteSettings {
7071
*/
7172
export class FirebaseFirestore
7273
extends LiteFirestore
73-
implements _FirebaseService, FirestoreCompat {
74+
implements _FirebaseService {
7475
readonly _queue = new AsyncQueue();
7576
readonly _persistenceKey: string;
7677

7778
_firestoreClient: FirestoreClient | undefined;
7879

7980
constructor(
80-
app: FirebaseApp,
81+
app: FirestoreDatabase | FirebaseApp,
8182
authProvider: Provider<FirebaseAuthInternalName>
8283
) {
8384
super(app, authProvider);
84-
this._persistenceKey = app.name;
85+
this._persistenceKey = 'name' in app ? app.name : '[DEFAULT]';
8586
}
8687

8788
_terminate(): Promise<void> {
@@ -94,6 +95,36 @@ export class FirebaseFirestore
9495
}
9596
}
9697

98+
export function ensureFirestoreConfigured(
99+
firestore: FirebaseFirestore
100+
): FirestoreClient {
101+
if (!firestore._firestoreClient) {
102+
configureFirestore(firestore);
103+
}
104+
firestore._firestoreClient!.verifyNotTerminated();
105+
return firestore._firestoreClient as FirestoreClient;
106+
}
107+
108+
export function configureFirestore(firestore: FirebaseFirestore): void {
109+
const settings = firestore._getSettings();
110+
debugAssert(!!settings.host, 'FirestoreSettings.host is not set');
111+
debugAssert(
112+
!firestore._firestoreClient,
113+
'configureFirestore() called multiple times'
114+
);
115+
116+
const databaseInfo = makeDatabaseInfo(
117+
firestore._databaseId,
118+
firestore._persistenceKey,
119+
settings
120+
);
121+
firestore._firestoreClient = new FirestoreClient(
122+
firestore._credentials,
123+
firestore._queue,
124+
databaseInfo
125+
);
126+
}
127+
97128
/**
98129
* Initializes a new instance of Cloud Firestore with the provided settings.
99130
* Can only be called before any other function, including
@@ -129,6 +160,16 @@ export function initializeFirestore(
129160
return firestore;
130161
}
131162

163+
export function initializeStandalone(
164+
database: FirestoreDatabase,
165+
authProvider: Provider<FirebaseAuthInternalName>,
166+
settings: Settings
167+
): FirebaseFirestore {
168+
const firestore = new FirebaseFirestore(database, authProvider);
169+
firestore._setSettings(settings);
170+
return firestore;
171+
}
172+
132173
/**
133174
* Returns the existing instance of Firestore that is associated with the
134175
* provided {@link FirebaseApp}. If no instance exists, initializes a new
@@ -165,7 +206,7 @@ export function getFirestore(app: FirebaseApp): FirebaseFirestore {
165206
* @return A promise that represents successfully enabling persistent storage.
166207
*/
167208
export function enableIndexedDbPersistence(
168-
firestore: FirestoreCompat,
209+
firestore: FirebaseFirestore,
169210
persistenceSettings?: PersistenceSettings
170211
): Promise<void> {
171212
verifyNotInitialized(firestore);
@@ -209,7 +250,7 @@ export function enableIndexedDbPersistence(
209250
* storage.
210251
*/
211252
export function enableMultiTabIndexedDbPersistence(
212-
firestore: FirestoreCompat
253+
firestore: FirebaseFirestore
213254
): Promise<void> {
214255
verifyNotInitialized(firestore);
215256

@@ -322,7 +363,7 @@ function canFallbackFromIndexedDbError(
322363
* cleared. Otherwise, the promise is rejected with an error.
323364
*/
324365
export function clearIndexedDbPersistence(
325-
firestore: FirestoreCompat
366+
firestore: FirebaseFirestore
326367
): Promise<void> {
327368
if (firestore._initialized && !firestore._terminated) {
328369
throw new FirestoreError(
@@ -420,7 +461,7 @@ export function terminate(firestore: FirebaseFirestore): Promise<void> {
420461
return firestore._delete();
421462
}
422463

423-
function verifyNotInitialized(firestore: FirestoreCompat): void {
464+
function verifyNotInitialized(firestore: FirebaseFirestore): void {
424465
if (firestore._initialized || firestore._terminated) {
425466
throw new FirestoreError(
426467
Code.FAILED_PRECONDITION,

packages/firestore/exp/src/api/transaction.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,9 @@ import { Transaction as LiteTransaction } from '../../../lite/src/api/transactio
1919
import { DocumentSnapshot } from './snapshot';
2020
import { TransactionRunner } from '../../../src/core/transaction_runner';
2121
import { AsyncQueue } from '../../../src/util/async_queue';
22-
import { FirebaseFirestore } from './database';
22+
import { ensureFirestoreConfigured, FirebaseFirestore } from './database';
2323
import { Deferred } from '../../../src/util/promise';
24-
import {
25-
ensureFirestoreConfigured,
26-
SnapshotMetadata
27-
} from '../../../src/api/database';
24+
import { SnapshotMetadata } from '../../../src/api/database';
2825
import { Transaction as InternalTransaction } from '../../../src/core/transaction';
2926
import { validateReference } from '../../../lite/src/api/write_batch';
3027
import { getDatastore } from '../../../lite/src/api/components';

packages/firestore/exp/src/api/write_batch.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,8 @@
1616
*/
1717

1818
import { WriteBatch } from '../../../lite/src/api/write_batch';
19-
import { FirebaseFirestore } from './database';
19+
import { ensureFirestoreConfigured, FirebaseFirestore } from './database';
2020
import { executeWrite } from './reference';
21-
import { ensureFirestoreConfigured } from '../../../src/api/database';
2221

2322
/**
2423
* Creates a write batch, used for performing multiple writes as a single

packages/firestore/exp/test/shim.ts

Lines changed: 10 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ import {
7070
validateSetOptions
7171
} from '../../src/util/input_validation';
7272
import { Compat } from '../../src/compat/compat';
73+
import { Firestore } from '../../src/api/database';
7374

7475
export { GeoPoint, Timestamp } from '../index';
7576
export { FieldValue } from '../../src/compat/field_value';
@@ -93,92 +94,11 @@ export class FirebaseApp
9394
}
9495
}
9596

96-
export class FirebaseFirestore
97-
extends Compat<exp.FirebaseFirestore>
98-
implements legacy.FirebaseFirestore {
99-
app = new FirebaseApp(this._delegate.app);
100-
101-
settings(settings: legacy.Settings): void {
102-
initializeFirestore(this.app._delegate, settings);
103-
}
104-
105-
useEmulator(host: string, port: number): void {
106-
this.settings({ host: `${host}:${port}`, ssl: false, merge: true });
107-
}
108-
109-
enablePersistence(settings?: legacy.PersistenceSettings): Promise<void> {
110-
return settings?.synchronizeTabs
111-
? enableMultiTabIndexedDbPersistence(this._delegate)
112-
: enableIndexedDbPersistence(this._delegate);
113-
}
114-
115-
collection(collectionPath: string): CollectionReference<legacy.DocumentData> {
116-
return new CollectionReference(
117-
this,
118-
collection(this._delegate, collectionPath)
119-
);
120-
}
121-
122-
doc(documentPath: string): DocumentReference<legacy.DocumentData> {
123-
return new DocumentReference(this, doc(this._delegate, documentPath));
124-
}
125-
126-
collectionGroup(collectionId: string): Query<legacy.DocumentData> {
127-
return new Query(this, collectionGroup(this._delegate, collectionId));
128-
}
129-
130-
runTransaction<T>(
131-
updateFunction: (transaction: legacy.Transaction) => Promise<T>
132-
): Promise<T> {
133-
return runTransaction(this._delegate, t =>
134-
updateFunction(new Transaction(this, t))
135-
);
136-
}
137-
138-
batch(): legacy.WriteBatch {
139-
return new WriteBatch(writeBatch(this._delegate));
140-
}
141-
142-
clearPersistence(): Promise<void> {
143-
return clearIndexedDbPersistence(this._delegate);
144-
}
145-
146-
enableNetwork(): Promise<void> {
147-
return enableNetwork(this._delegate);
148-
}
149-
150-
disableNetwork(): Promise<void> {
151-
return disableNetwork(this._delegate);
152-
}
153-
154-
waitForPendingWrites(): Promise<void> {
155-
return waitForPendingWrites(this._delegate);
156-
}
157-
158-
onSnapshotsInSync(observer: {
159-
next?: (value: void) => void;
160-
error?: (error: legacy.FirestoreError) => void;
161-
complete?: () => void;
162-
}): () => void;
163-
onSnapshotsInSync(onSync: () => void): () => void;
164-
onSnapshotsInSync(arg: any): () => void {
165-
return onSnapshotsInSync(this._delegate, arg);
166-
}
167-
168-
terminate(): Promise<void> {
169-
return terminate(this._delegate);
170-
}
171-
172-
INTERNAL = {
173-
delete: () => terminate(this._delegate)
174-
};
175-
}
176-
17797
export class Transaction
17898
extends Compat<exp.Transaction>
17999
implements legacy.Transaction {
180100
constructor(
181-
private readonly _firestore: FirebaseFirestore,
101+
private readonly _firestore: Firestore,
182102
delegate: exp.Transaction
183103
) {
184104
super(delegate);
@@ -301,7 +221,7 @@ export class DocumentReference<T = legacy.DocumentData>
301221
extends Compat<exp.DocumentReference<T>>
302222
implements legacy.DocumentReference<T> {
303223
constructor(
304-
readonly firestore: FirebaseFirestore,
224+
readonly firestore: Firestore,
305225
delegate: exp.DocumentReference<T>
306226
) {
307227
super(delegate);
@@ -424,7 +344,7 @@ export class DocumentSnapshot<T = legacy.DocumentData>
424344
extends Compat<exp.DocumentSnapshot<T>>
425345
implements legacy.DocumentSnapshot<T> {
426346
constructor(
427-
private readonly _firestore: FirebaseFirestore,
347+
private readonly _firestore: Firestore,
428348
delegate: exp.DocumentSnapshot<T>
429349
) {
430350
super(delegate);
@@ -455,7 +375,7 @@ export class QueryDocumentSnapshot<T = legacy.DocumentData>
455375
extends DocumentSnapshot<T>
456376
implements legacy.QueryDocumentSnapshot<T> {
457377
constructor(
458-
firestore: FirebaseFirestore,
378+
firestore: Firestore,
459379
readonly _delegate: exp.QueryDocumentSnapshot<T>
460380
) {
461381
super(firestore, _delegate);
@@ -469,7 +389,7 @@ export class QueryDocumentSnapshot<T = legacy.DocumentData>
469389
export class Query<T = legacy.DocumentData>
470390
extends Compat<exp.Query<T>>
471391
implements legacy.Query<T> {
472-
constructor(readonly firestore: FirebaseFirestore, delegate: exp.Query<T>) {
392+
constructor(readonly firestore: Firestore, delegate: exp.Query<T>) {
473393
super(delegate);
474394
}
475395

@@ -592,7 +512,7 @@ export class Query<T = legacy.DocumentData>
592512
export class QuerySnapshot<T = legacy.DocumentData>
593513
implements legacy.QuerySnapshot<T> {
594514
constructor(
595-
readonly _firestore: FirebaseFirestore,
515+
readonly _firestore: Firestore,
596516
readonly _delegate: exp.QuerySnapshot<T>
597517
) {}
598518

@@ -633,7 +553,7 @@ export class QuerySnapshot<T = legacy.DocumentData>
633553
export class DocumentChange<T = legacy.DocumentData>
634554
implements legacy.DocumentChange<T> {
635555
constructor(
636-
private readonly _firestore: FirebaseFirestore,
556+
private readonly _firestore: Firestore,
637557
private readonly _delegate: exp.DocumentChange<T>
638558
) {}
639559
readonly type = this._delegate.type;
@@ -649,7 +569,7 @@ export class CollectionReference<T = legacy.DocumentData>
649569
extends Query<T>
650570
implements legacy.CollectionReference<T> {
651571
constructor(
652-
firestore: FirebaseFirestore,
572+
firestore: Firestore,
653573
readonly _delegate: exp.CollectionReference<T>
654574
) {
655575
super(firestore, _delegate);
@@ -755,7 +675,7 @@ function wrap(value: any): any {
755675
// TODO(mrschmidt): Ideally, we should use an existing instance of
756676
// FirebaseFirestore here rather than instantiating a new instance
757677
return new DocumentReference(
758-
new FirebaseFirestore(value.firestore as exp.FirebaseFirestore),
678+
null as any, //new Firestore(value.firestore as exp.FirebaseFirestore),
759679
value
760680
);
761681
} else if (isPlainObject(value)) {

0 commit comments

Comments
 (0)