Skip to content

Commit 7b949e8

Browse files
authored
Merge 8a1e1a2 into d91169f
2 parents d91169f + 8a1e1a2 commit 7b949e8

21 files changed

+575
-185
lines changed

packages/firestore/src/api.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,11 @@ export { debugAssert as _debugAssert } from './util/assert';
238238
export { FieldPath as _FieldPath } from './model/path';
239239
export type { ResourcePath as _ResourcePath } from './model/path';
240240
export { ByteString as _ByteString } from './util/byte_string';
241-
export { logWarn as _logWarn } from './util/log';
241+
export {
242+
logWarn as _logWarn,
243+
enableLogBuffer as _enableLogBuffer,
244+
dumpLogBuffer as _dumpLogBuffer
245+
} from './util/log';
242246
export { AutoId as _AutoId } from './util/misc';
243247
export type {
244248
AuthTokenFactory,

packages/firestore/src/api/database.ts

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,10 @@ import { LRU_MINIMUM_CACHE_SIZE_BYTES } from '../local/lru_garbage_collector_imp
6161
import { debugAssert } from '../util/assert';
6262
import { AsyncQueue } from '../util/async_queue';
6363
import { AsyncQueueImpl } from '../util/async_queue_impl';
64+
import { generateUniqueDebugId } from '../util/debug_uid';
6465
import { Code, FirestoreError } from '../util/error';
6566
import { cast } from '../util/input_validation';
66-
import { logWarn } from '../util/log';
67+
import { logDebug, logWarn } from '../util/log';
6768
import { Deferred } from '../util/promise';
6869

6970
import { LoadBundleTask } from './bundle';
@@ -94,6 +95,7 @@ export const CACHE_SIZE_UNLIMITED = LRU_COLLECTION_DISABLED;
9495
* Do not call this constructor directly. Instead, use {@link (getFirestore:1)}.
9596
*/
9697
export class Firestore extends LiteFirestore {
98+
readonly _debugId = `Firestore@${generateUniqueDebugId()}`;
9799
/**
98100
* Whether it's a {@link Firestore} or Firestore Lite instance.
99101
*/
@@ -204,10 +206,20 @@ export function initializeFirestore(
204206
void pingServer(settings.host);
205207
}
206208

207-
return provider.initialize({
209+
const db = provider.initialize({
208210
options: settings,
209211
instanceIdentifier: databaseId
210212
});
213+
214+
logDebug(
215+
`initializeFirestore(` +
216+
`app.name=${app.name ?? 'undefined'}, databaseId=${
217+
databaseId ?? 'undefined'
218+
}` +
219+
`) returns ${db._debugId}`
220+
);
221+
222+
return db;
211223
}
212224

213225
/**
@@ -269,6 +281,15 @@ export function getFirestore(
269281
connectFirestoreEmulator(db, ...emulator);
270282
}
271283
}
284+
285+
logDebug(
286+
`getFirestore(` +
287+
`app.name=${app.name ?? 'undefined'}, databaseId=${
288+
databaseId ?? 'undefined'
289+
}` +
290+
`) returns ${db._debugId}`
291+
);
292+
272293
return db;
273294
}
274295

@@ -323,6 +344,7 @@ export function configureFirestore(firestore: Firestore): void {
323344
firestore._componentsProvider &&
324345
buildComponentProvider(firestore._componentsProvider)
325346
);
347+
logDebug(`${firestore._firestoreClient} created by ${firestore._debugId}`);
326348
}
327349

328350
function buildComponentProvider(componentsProvider: {
@@ -500,6 +522,8 @@ export function clearIndexedDbPersistence(firestore: Firestore): Promise<void> {
500522
);
501523
}
502524

525+
logDebug(firestore._debugId, 'clearIndexedDbPersistence()');
526+
503527
const deferred = new Deferred<void>();
504528
firestore._queue.enqueueAndForgetEvenWhileRestricted(async () => {
505529
try {
@@ -531,6 +555,7 @@ export function clearIndexedDbPersistence(firestore: Firestore): Promise<void> {
531555
* acknowledged by the backend.
532556
*/
533557
export function waitForPendingWrites(firestore: Firestore): Promise<void> {
558+
logDebug(firestore._debugId, 'waitForPendingWrites()');
534559
firestore = cast(firestore, Firestore);
535560
const client = ensureFirestoreConfigured(firestore);
536561
return firestoreClientWaitForPendingWrites(client);
@@ -543,6 +568,7 @@ export function waitForPendingWrites(firestore: Firestore): Promise<void> {
543568
* @returns A `Promise` that is resolved once the network has been enabled.
544569
*/
545570
export function enableNetwork(firestore: Firestore): Promise<void> {
571+
logDebug(firestore._debugId, 'enableNetwork()');
546572
firestore = cast(firestore, Firestore);
547573
const client = ensureFirestoreConfigured(firestore);
548574
return firestoreClientEnableNetwork(client);
@@ -557,6 +583,7 @@ export function enableNetwork(firestore: Firestore): Promise<void> {
557583
* @returns A `Promise` that is resolved once the network has been disabled.
558584
*/
559585
export function disableNetwork(firestore: Firestore): Promise<void> {
586+
logDebug(firestore._debugId, 'disableNetwork()');
560587
firestore = cast(firestore, Firestore);
561588
const client = ensureFirestoreConfigured(firestore);
562589
return firestoreClientDisableNetwork(client);
@@ -585,6 +612,7 @@ export function disableNetwork(firestore: Firestore): Promise<void> {
585612
* terminated.
586613
*/
587614
export function terminate(firestore: Firestore): Promise<void> {
615+
logDebug(firestore._debugId, 'terminate()');
588616
_removeServiceInstance(
589617
firestore.app,
590618
'firestore',
@@ -608,6 +636,7 @@ export function loadBundle(
608636
firestore: Firestore,
609637
bundleData: ReadableStream<Uint8Array> | ArrayBuffer | string
610638
): LoadBundleTask {
639+
logDebug(firestore._debugId, 'loadBundle()');
611640
firestore = cast(firestore, Firestore);
612641
const client = ensureFirestoreConfigured(firestore);
613642
const resultTask = new LoadBundleTask();
@@ -636,6 +665,7 @@ export function namedQuery(
636665
firestore: Firestore,
637666
name: string
638667
): Promise<Query | null> {
668+
logDebug(firestore._debugId, 'namedQuery() name:', name);
639669
firestore = cast(firestore, Firestore);
640670
const client = ensureFirestoreConfigured(firestore);
641671
return firestoreClientGetNamedQuery(client, name).then(namedQuery => {

packages/firestore/src/core/component_provider.ts

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ import {
5656
import { JsonProtoSerializer } from '../remote/serializer';
5757
import { hardAssert } from '../util/assert';
5858
import { AsyncQueue } from '../util/async_queue';
59+
import { generateUniqueDebugId } from '../util/debug_uid';
5960
import { Code, FirestoreError } from '../util/error';
61+
import { logDebug } from '../util/log';
6062

6163
import { DatabaseInfo } from './database_info';
6264
import { EventManager, newEventManager } from './event_manager';
@@ -78,6 +80,8 @@ import { OnlineStateSource } from './types';
7880
type Kind = 'memory' | 'persistent';
7981

8082
export interface ComponentConfiguration {
83+
readonly debugId: string;
84+
8185
asyncQueue: AsyncQueue;
8286
databaseInfo: DatabaseInfo;
8387
authCredentials: CredentialsProvider<User>;
@@ -96,6 +100,7 @@ export interface OfflineComponentProviderFactory {
96100
* cache. Implementations override `initialize()` to provide all components.
97101
*/
98102
export interface OfflineComponentProvider {
103+
readonly debugId: string;
99104
readonly kind: Kind;
100105
persistence: Persistence;
101106
sharedClientState: SharedClientState;
@@ -116,8 +121,13 @@ export interface OfflineComponentProvider {
116121
export class MemoryOfflineComponentProvider
117122
implements OfflineComponentProvider
118123
{
124+
readonly debugId: string;
119125
kind: Kind = 'memory';
120126

127+
constructor() {
128+
this.debugId = `MemoryOfflineComponentProvider@${generateUniqueDebugId()}`;
129+
}
130+
121131
static readonly provider: OfflineComponentProviderFactory = {
122132
build: () => new MemoryOfflineComponentProvider()
123133
};
@@ -171,7 +181,12 @@ export class MemoryOfflineComponentProvider
171181
}
172182

173183
createPersistence(cfg: ComponentConfiguration): Persistence {
174-
return new MemoryPersistence(MemoryEagerDelegate.factory, this.serializer);
184+
const persistence = new MemoryPersistence(
185+
MemoryEagerDelegate.factory,
186+
this.serializer
187+
);
188+
logDebug(`${persistence.debugId} created from ${this.debugId}`);
189+
return persistence;
175190
}
176191

177192
createSharedClientState(cfg: ComponentConfiguration): SharedClientState {
@@ -222,6 +237,7 @@ export class LruGcMemoryOfflineComponentProvider extends MemoryOfflineComponentP
222237
* Provides all components needed for Firestore with IndexedDB persistence.
223238
*/
224239
export class IndexedDbOfflineComponentProvider extends MemoryOfflineComponentProvider {
240+
readonly debugId: string;
225241
kind: Kind = 'persistent';
226242
persistence!: IndexedDbPersistence;
227243
sharedClientState!: SharedClientState;
@@ -236,6 +252,7 @@ export class IndexedDbOfflineComponentProvider extends MemoryOfflineComponentPro
236252
protected readonly forceOwnership: boolean | undefined
237253
) {
238254
super();
255+
this.debugId = `IndexedDbOfflineComponentProvider@${generateUniqueDebugId()}`;
239256
}
240257

241258
async initialize(cfg: ComponentConfiguration): Promise<void> {
@@ -301,7 +318,7 @@ export class IndexedDbOfflineComponentProvider extends MemoryOfflineComponentPro
301318
? LruParams.withCacheSize(this.cacheSizeBytes)
302319
: LruParams.DEFAULT;
303320

304-
return new IndexedDbPersistence(
321+
const persistence = new IndexedDbPersistence(
305322
this.synchronizeTabs,
306323
persistenceKey,
307324
cfg.clientId,
@@ -313,6 +330,10 @@ export class IndexedDbOfflineComponentProvider extends MemoryOfflineComponentPro
313330
this.sharedClientState,
314331
!!this.forceOwnership
315332
);
333+
334+
logDebug(`${persistence.debugId} created from ${this.debugId}`);
335+
336+
return persistence;
316337
}
317338

318339
createSharedClientState(cfg: ComponentConfiguration): SharedClientState {
@@ -467,6 +488,7 @@ export class OnlineComponentProvider {
467488
createDatastore(cfg: ComponentConfiguration): Datastore {
468489
const serializer = newSerializer(cfg.databaseInfo.databaseId);
469490
const connection = newConnection(cfg.databaseInfo);
491+
logDebug(`${connection.debugId} created for ${cfg.debugId}`);
470492
return newDatastore(
471493
cfg.authCredentials,
472494
cfg.appCheckCredentials,

packages/firestore/src/core/firestore_client.ts

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ import { AsyncQueue, wrapInUserErrorIfRecoverable } from '../util/async_queue';
5656
import { BundleReader, BundleReaderSync } from '../util/bundle_reader';
5757
import { newBundleReader } from '../util/bundle_reader_impl';
5858
import { newBundleReaderSync } from '../util/bundle_reader_sync_impl';
59+
import { generateUniqueDebugId } from '../util/debug_uid';
5960
import { Code, FirestoreError } from '../util/error';
6061
import { logDebug, logWarn } from '../util/log';
6162
import { AutoId } from '../util/misc';
@@ -98,7 +99,6 @@ import { TransactionRunner } from './transaction_runner';
9899
import { View } from './view';
99100
import { ViewSnapshot } from './view_snapshot';
100101

101-
const LOG_TAG = 'FirestoreClient';
102102
export const MAX_CONCURRENT_LIMBO_RESOLUTIONS = 100;
103103

104104
/** DOMException error code constants. */
@@ -112,6 +112,8 @@ const DOM_EXCEPTION_QUOTA_EXCEEDED = 22;
112112
* async queue that is shared by all of the other components in the system. //
113113
*/
114114
export class FirestoreClient {
115+
readonly debugId = `FirestoreClient@${generateUniqueDebugId()}`;
116+
115117
private user = User.UNAUTHENTICATED;
116118
private readonly clientId = AutoId.newId();
117119
private authCredentialListener: CredentialChangeListener<User> = () =>
@@ -148,18 +150,19 @@ export class FirestoreClient {
148150
) {
149151
this._uninitializedComponentsProvider = componentProvider;
150152
this.authCredentials.start(asyncQueue, async user => {
151-
logDebug(LOG_TAG, 'Received user=', user.uid);
153+
logDebug(this.debugId, 'Received user=', user.uid);
152154
await this.authCredentialListener(user);
153155
this.user = user;
154156
});
155157
this.appCheckCredentials.start(asyncQueue, newAppCheckToken => {
156-
logDebug(LOG_TAG, 'Received new app check token=', newAppCheckToken);
158+
logDebug(this.debugId, 'Received new app check token=', newAppCheckToken);
157159
return this.appCheckCredentialListener(newAppCheckToken, this.user);
158160
});
159161
}
160162

161163
get configuration(): ComponentConfiguration {
162164
return {
165+
debugId: this.debugId,
163166
asyncQueue: this.asyncQueue,
164167
databaseInfo: this.databaseInfo,
165168
clientId: this.clientId,
@@ -216,7 +219,7 @@ export async function setOfflineComponentProvider(
216219
): Promise<void> {
217220
client.asyncQueue.verifyOperationInProgress();
218221

219-
logDebug(LOG_TAG, 'Initializing OfflineComponentProvider');
222+
logDebug(client.debugId, 'Initializing OfflineComponentProvider');
220223
const configuration = client.configuration;
221224
await offlineComponentProvider.initialize(configuration);
222225

@@ -260,7 +263,7 @@ export async function setOnlineComponentProvider(
260263

261264
const offlineComponents = await ensureOfflineComponents(client);
262265

263-
logDebug(LOG_TAG, 'Initializing OnlineComponentProvider');
266+
logDebug(client.debugId, 'Initializing OnlineComponentProvider');
264267
await onlineComponentProvider.initialize(
265268
offlineComponents,
266269
client.configuration
@@ -319,7 +322,7 @@ async function ensureOfflineComponents(
319322
): Promise<OfflineComponentProvider> {
320323
if (!client._offlineComponents) {
321324
if (client._uninitializedComponentsProvider) {
322-
logDebug(LOG_TAG, 'Using user provided OfflineComponentProvider');
325+
logDebug(client.debugId, 'Using user provided OfflineComponentProvider');
323326
try {
324327
await setOfflineComponentProvider(
325328
client,
@@ -341,12 +344,17 @@ async function ensureOfflineComponents(
341344
);
342345
}
343346
} else {
344-
logDebug(LOG_TAG, 'Using default OfflineComponentProvider');
347+
logDebug(client.debugId, 'Using default OfflineComponentProvider');
345348
await setOfflineComponentProvider(
346349
client,
347350
new LruGcMemoryOfflineComponentProvider(undefined)
348351
);
349352
}
353+
logDebug(
354+
`${client.debugId} using OfflineComponentProvider: ${
355+
client._offlineComponents!.debugId
356+
}`
357+
);
350358
}
351359

352360
return client._offlineComponents!;
@@ -357,13 +365,13 @@ export async function ensureOnlineComponents(
357365
): Promise<OnlineComponentProvider> {
358366
if (!client._onlineComponents) {
359367
if (client._uninitializedComponentsProvider) {
360-
logDebug(LOG_TAG, 'Using user provided OnlineComponentProvider');
368+
logDebug(client.debugId, 'Using user provided OnlineComponentProvider');
361369
await setOnlineComponentProvider(
362370
client,
363371
client._uninitializedComponentsProvider._online
364372
);
365373
} else {
366-
logDebug(LOG_TAG, 'Using default OnlineComponentProvider');
374+
logDebug(client.debugId, 'Using default OnlineComponentProvider');
367375
await setOnlineComponentProvider(client, new OnlineComponentProvider());
368376
}
369377
}

0 commit comments

Comments
 (0)