Skip to content

Commit b7a9d0f

Browse files
committed
simple_db: revert change that threw after close()
1 parent 9b3b856 commit b7a9d0f

File tree

2 files changed

+37
-79
lines changed

2 files changed

+37
-79
lines changed

packages/firestore/src/local/simple_db.ts

Lines changed: 18 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -162,57 +162,24 @@ export interface IdbDatabaseDebugIdPair {
162162

163163
class SimpleDbStateNew {
164164
readonly name = 'new' as const;
165-
166-
constructor(
167-
readonly databaseDeletedListener: DatabaseDeletedListener | null
168-
) {}
169-
170-
withDatabaseDeletedListener(
171-
databaseDeletedListener: DatabaseDeletedListener
172-
): SimpleDbStateNew {
173-
return new SimpleDbStateNew(databaseDeletedListener);
174-
}
175165
}
176166

177167
class SimpleDbStateOpening {
178168
readonly name = 'opening' as const;
179169

180-
constructor(
181-
readonly promise: Promise<unknown>,
182-
readonly databaseDeletedListener: DatabaseDeletedListener | null
183-
) {}
184-
185-
withDatabaseDeletedListener(
186-
databaseDeletedListener: DatabaseDeletedListener
187-
): SimpleDbStateOpening {
188-
return new SimpleDbStateOpening(this.promise, databaseDeletedListener);
189-
}
170+
constructor(readonly promise: Promise<unknown>) {}
190171
}
191172

192173
class SimpleDbStateOpened {
193174
readonly name = 'opened' as const;
194175

195-
constructor(
196-
readonly db: IdbDatabaseDebugIdPair,
197-
readonly databaseDeletedListener: DatabaseDeletedListener | null
198-
) {}
199-
200-
withDatabaseDeletedListener(
201-
databaseDeletedListener: DatabaseDeletedListener
202-
): SimpleDbStateOpened {
203-
return new SimpleDbStateOpened(this.db, databaseDeletedListener);
204-
}
205-
}
206-
207-
class SimpleDbStateClosed {
208-
readonly name = 'closed' as const;
176+
constructor(readonly db: IdbDatabaseDebugIdPair) {}
209177
}
210178

211179
type SimpleDbState =
212180
| SimpleDbStateNew
213181
| SimpleDbStateOpened
214-
| SimpleDbStateOpening
215-
| SimpleDbStateClosed;
182+
| SimpleDbStateOpening;
216183

217184
/**
218185
* Provides a wrapper around IndexedDb with a simplified interface that uses
@@ -223,7 +190,8 @@ type SimpleDbState =
223190
*/
224191
export class SimpleDb {
225192
readonly debugId = `SimpleDb@${generateUniqueDebugId()}`;
226-
private state: SimpleDbState = new SimpleDbStateNew(null);
193+
private state: SimpleDbState = new SimpleDbStateNew();
194+
private databaseDeletedListener: DatabaseDeletedListener | null = null;
227195

228196
/** Deletes the specified database. */
229197
static delete(name: string): Promise<void> {
@@ -363,36 +331,26 @@ export class SimpleDb {
363331
async ensureDb(action: string): Promise<IdbDatabaseDebugIdPair> {
364332
while (true) {
365333
const currentState = this.state;
366-
if (currentState.name === 'closed') {
367-
throw new Error(`${this.debugId} has been closed`);
368-
} else if (currentState.name === 'opening') {
334+
if (currentState.name === 'opening') {
369335
await currentState.promise.catch(_ => {});
370336
} else if (currentState.name === 'opened') {
371337
return currentState.db;
372338
} else {
373339
hardAssert(currentState.name === 'new', 0x56e8, { state: this.state });
374340
const promise = this.openDb(action);
375-
const openingState = new SimpleDbStateOpening(
376-
promise,
377-
currentState.databaseDeletedListener
378-
);
341+
const openingState = new SimpleDbStateOpening(promise);
379342
this.state = openingState;
380343
try {
381344
const db = await promise;
382345
if (this.state === openingState) {
383-
this.state = new SimpleDbStateOpened(
384-
db,
385-
openingState.databaseDeletedListener
386-
);
346+
this.state = new SimpleDbStateOpened(db);
387347
return db;
388348
} else {
389349
db.idbDatabase.close();
390350
}
391351
} catch (e) {
392352
if (this.state === openingState) {
393-
this.state = new SimpleDbStateNew(
394-
this.state.databaseDeletedListener
395-
);
353+
this.state = new SimpleDbStateNew();
396354
throw e;
397355
}
398356
}
@@ -496,9 +454,7 @@ export class SimpleDb {
496454
`Received "versionchange" event with newVersion===null; ` +
497455
'notifying the registered DatabaseDeletedListener, if any'
498456
);
499-
if ('databaseDeletedListener' in this.state) {
500-
this.state.databaseDeletedListener?.();
501-
}
457+
this.databaseDeletedListener?.();
502458
}
503459
},
504460
{ passive: true }
@@ -514,7 +470,10 @@ export class SimpleDb {
514470
`One possible cause is clicking the "Clear Site Data" button ` +
515471
`in a web browser.`
516472
);
517-
dumpLogBuffer("SimpleDbCloseEvent");
473+
dumpLogBuffer('SimpleDbCloseEvent');
474+
if (this.state.name === 'opened' && this.state.db.idbDatabase === db) {
475+
this.state = new SimpleDbStateNew();
476+
}
518477
},
519478
{ passive: true }
520479
);
@@ -525,15 +484,10 @@ export class SimpleDb {
525484
setDatabaseDeletedListener(
526485
databaseDeletedListener: DatabaseDeletedListener
527486
): void {
528-
if (!('databaseDeletedListener' in this.state)) {
529-
return;
530-
}
531-
if (this.state.databaseDeletedListener) {
487+
if (this.databaseDeletedListener) {
532488
throw new Error('setDatabaseDeletedListener() has already been called');
533489
}
534-
this.state = this.state.withDatabaseDeletedListener(
535-
databaseDeletedListener
536-
);
490+
this.databaseDeletedListener = databaseDeletedListener;
537491
}
538492

539493
async runTransaction<T>(
@@ -614,7 +568,7 @@ export class SimpleDb {
614568
);
615569

616570
if ('db' in this.state && dbBefore === this.state.db) {
617-
this.state = new SimpleDbStateNew(this.state.databaseDeletedListener);
571+
this.state = new SimpleDbStateNew();
618572
logWarn(
619573
this.debugId,
620574
`Transaction transactionId=${transactionId} closing IDBDatabase ` +
@@ -632,14 +586,11 @@ export class SimpleDb {
632586
}
633587

634588
close(): void {
635-
if (this.state.name === 'closed') {
636-
return;
637-
}
638589
logDebug(this.debugId, 'close()');
639590
if ('db' in this.state) {
640591
this.state.db.idbDatabase.close();
641592
}
642-
this.state = new SimpleDbStateClosed();
593+
this.state = new SimpleDbStateNew();
643594
}
644595
}
645596

packages/firestore/src/util/log.ts

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ interface LogBufferMessage {
9898

9999
class LogBuffer {
100100
private readonly messages: LogBufferMessage[] = [];
101-
private readonly enabledDumpIds: strings[];
101+
private readonly enabledDumpIds: string[];
102102

103103
constructor(private readonly maxLength: number, enabledDumpIds: string[]) {
104104
this.enabledDumpIds = Array.from(enabledDumpIds);
@@ -118,13 +118,11 @@ class LogBuffer {
118118
}
119119

120120
private isDumpIdEnabled(dumpId: string | undefined): boolean {
121-
if (dumpId === undefined) {
122-
return true;
123-
} else if (this.enabledDumpIds.length === 0) {
124-
return true;
125-
} else {
126-
return this.enabledDumpIds.includes(dumpId);
127-
}
121+
return (
122+
dumpId === undefined ||
123+
this.enabledDumpIds.length === 0 ||
124+
this.enabledDumpIds.includes(dumpId)
125+
);
128126
}
129127

130128
dump(dumpId?: string | undefined): void {
@@ -140,9 +138,15 @@ class LogBuffer {
140138
}
141139
}
142140

143-
private doDump(): void {
141+
private doDump(dumpId?: string | undefined): void {
144142
const now = performance.now();
145143
const numBufferedMessages = this.messages.length;
144+
logClient.info(
145+
`Firestore (${SDK_VERSION}): ` +
146+
`Dumping ${numBufferedMessages} buffered log messages ` +
147+
`with dumpId=${dumpId}`
148+
);
149+
146150
const i = 1;
147151

148152
while (true) {
@@ -153,7 +157,7 @@ class LogBuffer {
153157
const { level, msg, objs, timestamp } = message;
154158
const args = objs.map(argToString);
155159
const messageString =
156-
`Firestore BUFFERED ${i}/${numBufferedMessages} ` +
160+
`Firestore (${SDK_VERSION}): BUFFERED ${i}/${numBufferedMessages} ` +
157161
`(${now - timestamp}ms ago): ${msg}`;
158162
if (level === LogLevel.WARN) {
159163
logClient.warn(messageString, ...args);
@@ -168,11 +172,14 @@ class LogBuffer {
168172

169173
let logBuffer: LogBuffer | null = null;
170174

171-
export function enableLogBuffer(maxLength: number, enabledDumpIds?: string[]): void {
175+
export function enableLogBuffer(
176+
maxLength: number,
177+
enabledDumpIds?: string[]
178+
): void {
172179
if (logBuffer) {
173180
throw new Error('log buffer has already been enabled');
174181
}
175-
logBuffer = new LogBuffer(maxLength, ids ?? []);
182+
logBuffer = new LogBuffer(maxLength, enabledDumpIds ?? []);
176183
}
177184

178185
export function dumpLogBuffer(dumpId?: string | undefined): void {

0 commit comments

Comments
 (0)