Skip to content

Commit 3cd19cc

Browse files
Eliran Eretz-KedoshaEliran Eretz-Kedosha
authored andcommitted
rethrow errors
1 parent fa096ef commit 3cd19cc

7 files changed

Lines changed: 1234 additions & 552 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@microsoft/objectstoreprovider",
3-
"version": "0.8.7",
3+
"version": "0.9.0",
44
"description": "A cross-browser object store library",
55
"author": "DataStack Team eleretzk@microsoft.com",
66
"scripts": {

src/InMemoryProvider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -863,7 +863,7 @@ class InMemoryIndex extends DbIndexFTSFromRangeQueries {
863863
);
864864
});
865865
if (isError(keys)) {
866-
return Promise.reject(void 0);
866+
return Promise.reject(keys);
867867
}
868868
return Promise.resolve(keys);
869869
}

src/IndexedDbProvider.ts

Lines changed: 57 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ export class IndexedDbProvider extends DbProvider {
192192
{ dbName }
193193
);
194194
}
195-
this.logWriter.log(`Wiping db success`, { dbName });
195+
this.logWriter.log(`Wiping db completed`, { dbName });
196196
}
197197

198198
this._lockHelper = new TransactionLockHelper(schema, true);
@@ -208,12 +208,34 @@ export class IndexedDbProvider extends DbProvider {
208208
upgradeScenarioStartTime: 0,
209209
};
210210

211+
dbOpen.onblocked = () => {
212+
this.logWriter.error(
213+
`Database open is blocked by an existing connection that hasn't closed. ` +
214+
`The open request will not proceed until all other connections are closed.`,
215+
{ dbName }
216+
);
217+
};
218+
211219
dbOpen.onupgradeneeded = (event) => {
220+
const dataLoss = event.dataLoss;
221+
const dataLossMessage = event.dataLossMessage;
222+
223+
if (dataLoss === "total") {
224+
this.logWriter.error(
225+
`IndexedDB reported total data loss during upgrade: ${
226+
dataLossMessage || "(no message)"
227+
}`,
228+
{ dbName }
229+
);
230+
}
231+
212232
upgradeMetadata = {
213233
oldVersion: event.oldVersion,
214234
newVersion: schema.version,
215235
upgradeScenarioStartTime: Date.now(),
216236
upgradeStartTimePerformanceMarker: performance.now(),
237+
dataLoss: dataLoss,
238+
dataLossMessage: dataLossMessage,
217239
};
218240

219241
const db: IDBDatabase = dbOpen.result;
@@ -490,6 +512,7 @@ export class IndexedDbProvider extends DbProvider {
490512
`Error when iterating over cursor on idb index, message: ${err?.message}`,
491513
{ storeName: storeSchema.name }
492514
);
515+
throw err;
493516
}
494517
)
495518
);
@@ -528,6 +551,13 @@ export class IndexedDbProvider extends DbProvider {
528551
}
529552

530553
this._db = db;
554+
this._db.onversionchange = () => {
555+
this.logWriter.warn(
556+
`Database version change requested by another connection. ` +
557+
`Keeping this connection open; the requesting connection will be blocked.`,
558+
{ dbName }
559+
);
560+
};
531561
this._db.onclose = (event: Event) => {
532562
if (this._handleOnClose) {
533563
// instantiate payload
@@ -568,7 +598,9 @@ export class IndexedDbProvider extends DbProvider {
568598
...upgradeMetadata,
569599
errorName: err?.target?.error?.name || "Unknown",
570600
errorMessage: err
571-
? `${err?.message} ${err?.target?.error} ${err?.target?.error?.name}`
601+
? `${
602+
err?.target?.error?.message || err?.message || "Unknown error"
603+
} (name: ${err?.target?.error?.name || "Unknown"})`
572604
: "Unknown error occurred during upgrade",
573605
});
574606
}
@@ -591,7 +623,9 @@ export class IndexedDbProvider extends DbProvider {
591623
}
592624
}
593625
this.logWriter.error(
594-
`Error opening db, message: ${err?.message} ${err?.target?.error} ${err?.target?.error?.name}`,
626+
`Error opening db, message: ${
627+
err?.target?.error?.message || err?.message || "Unknown error"
628+
}, name: ${err?.target?.error?.name || "Unknown"}`,
595629
{
596630
dbName,
597631
}
@@ -632,6 +666,13 @@ export class IndexedDbProvider extends DbProvider {
632666
}
633667

634668
return new Promise((resolve, reject) => {
669+
trans.onblocked = () => {
670+
this.logWriter.error(
671+
`Database deletion is blocked by an existing connection that hasn't closed. ` +
672+
`The delete request will not proceed until all other connections are closed.`,
673+
{ dbName: this._dbName }
674+
);
675+
};
635676
trans.onsuccess = () => {
636677
resolve(void 0);
637678
};
@@ -743,14 +784,15 @@ class IndexedDbTransaction implements DbTransaction {
743784
};
744785

745786
this._trans.onerror = () => {
746-
history.push(
747-
"error-" + (this._trans.error ? this._trans.error.message : "")
748-
);
787+
const errorDetail = this._trans.error
788+
? `${this._trans.error.name}: ${this._trans.error.message}`
789+
: "Unknown error";
790+
history.push("error-" + errorDetail);
749791

750792
if (history.length > 1) {
751793
this.logWriter.warn(
752794
"IndexedDbTransaction Errored after Resolution, Swallowing. Error: " +
753-
(this._trans.error ? this._trans.error.message : undefined) +
795+
errorDetail +
754796
", History: " +
755797
history.join(",")
756798
);
@@ -760,21 +802,22 @@ class IndexedDbTransaction implements DbTransaction {
760802
lockHelper.transactionFailed(
761803
this._transToken,
762804
"IndexedDbTransaction OnError: " +
763-
(this._trans.error ? this._trans.error.message : undefined) +
805+
errorDetail +
764806
", History: " +
765807
history.join(",")
766808
);
767809
};
768810

769811
this._trans.onabort = () => {
770-
history.push(
771-
"abort-" + (this._trans.error ? this._trans.error.message : "")
772-
);
812+
const errorDetail = this._trans.error
813+
? `${this._trans.error.name}: ${this._trans.error.message}`
814+
: "Unknown error";
815+
history.push("abort-" + errorDetail);
773816

774817
if (history.length > 1) {
775818
this.logWriter.warn(
776819
"IndexedDbTransaction Aborted after Resolution, Swallowing. Error: " +
777-
(this._trans.error ? this._trans.error.message : undefined) +
820+
errorDetail +
778821
", History: " +
779822
history.join(",")
780823
);
@@ -784,7 +827,7 @@ class IndexedDbTransaction implements DbTransaction {
784827
lockHelper.transactionFailed(
785828
this._transToken,
786829
"IndexedDbTransaction Aborted, Error: " +
787-
(this._trans.error ? this._trans.error.message : undefined) +
830+
errorDetail +
788831
", History: " +
789832
history.join(",")
790833
);
@@ -1150,7 +1193,7 @@ class IndexedDbStore implements DbStore {
11501193
highRangeExclusive
11511194
)
11521195
.then((keys) => {
1153-
this.remove(keys);
1196+
return this.remove(keys);
11541197
});
11551198
}
11561199

src/ObjectStoreProvider.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,10 @@ export type UpgradeMetadata = {
111111
newVersion: number;
112112
upgradeScenarioStartTime: number;
113113
upgradeStartTimePerformanceMarker: number;
114+
/** Non-standard Chromium extension: "none" or "total". Indicates whether data was lost during upgrade. */
115+
dataLoss?: "none" | "total";
116+
/** Non-standard Chromium extension: message describing the data loss, if any. */
117+
dataLossMessage?: string;
114118
};
115119

116120
export type UpgradeDetails = UpgradeMetadata & {

0 commit comments

Comments
 (0)