Skip to content

Commit f78d638

Browse files
author
michaellaw
committed
initial commit
1 parent e81241b commit f78d638

3 files changed

Lines changed: 126 additions & 26 deletions

File tree

src/IndexedDbProvider.ts

Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ export class IndexedDbProvider extends DbProvider {
159159
resolve(req.result);
160160
};
161161
req.onerror = (ev) => {
162-
reject(ev);
162+
reject((ev.target as IDBRequest)?.error ?? ev);
163163
};
164164
});
165165
}
@@ -566,32 +566,22 @@ export class IndexedDbProvider extends DbProvider {
566566
isCopyRequired: false,
567567
upgradeSteps,
568568
...upgradeMetadata,
569-
errorName: err?.target?.error?.name || "Unknown",
570-
errorMessage: err
571-
? `${err?.message} ${err?.target?.error} ${err?.target?.error?.name}`
572-
: "Unknown error occurred during upgrade",
569+
errorName: err?.name || "Unknown",
570+
errorMessage: err?.message || "Unknown error occurred during upgrade",
573571
});
574572
}
575573

576-
if (
577-
err &&
578-
err.type === "error" &&
579-
err.target &&
580-
err.target.error &&
581-
err.target.error.name === "VersionError"
582-
) {
574+
if (err instanceof DOMException && err.name === "VersionError") {
583575
if (!wipeIfExists) {
584576
this.logWriter.log(
585-
`Database version too new, Wiping: ${
586-
err.target.error.message || err.target.error.name
587-
}`
577+
`Database version too new, Wiping: ${err.message || err.name}`
588578
);
589579

590580
return this.open(dbName, schema, true, verbose);
591581
}
592582
}
593583
this.logWriter.error(
594-
`Error opening db, message: ${err?.message} ${err?.target?.error} ${err?.target?.error?.name}`,
584+
`Error opening db, message: ${err?.message}, name: ${err?.name}`,
595585
{
596586
dbName,
597587
}
@@ -759,10 +749,10 @@ class IndexedDbTransaction implements DbTransaction {
759749

760750
lockHelper.transactionFailed(
761751
this._transToken,
762-
"IndexedDbTransaction OnError: " +
763-
(this._trans.error ? this._trans.error.message : undefined) +
764-
", History: " +
765-
history.join(",")
752+
this._trans.error ??
753+
new Error(
754+
"IndexedDbTransaction OnError, History: " + history.join(",")
755+
)
766756
);
767757
};
768758

@@ -783,10 +773,10 @@ class IndexedDbTransaction implements DbTransaction {
783773

784774
lockHelper.transactionFailed(
785775
this._transToken,
786-
"IndexedDbTransaction Aborted, Error: " +
787-
(this._trans.error ? this._trans.error.message : undefined) +
788-
", History: " +
789-
history.join(",")
776+
this._trans.error ??
777+
new Error(
778+
"IndexedDbTransaction Aborted, History: " + history.join(",")
779+
)
790780
);
791781
};
792782
}

src/TransactionLockHelper.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ export class TransactionLockHelper {
170170
this._cleanTransaction(token);
171171
}
172172

173-
transactionFailed(token: TransactionToken, message: string) {
173+
transactionFailed(token: TransactionToken, message: string | Error) {
174174
const pendingTransIndex = findIndex(
175175
this._pendingTransactions,
176176
(trans) => trans.token === token
@@ -183,7 +183,9 @@ export class TransactionLockHelper {
183183
const toResolve = pendingTrans.completionDefer;
184184
this._pendingTransactions.splice(pendingTransIndex, 1);
185185
pendingTrans.completionDefer = undefined;
186-
toResolve.reject(new Error(message));
186+
toResolve.reject(
187+
message instanceof Error ? message : new Error(message)
188+
);
187189
} else {
188190
throw new Error(
189191
"Failing a transaction that has already been completed. Stores: " +

src/tests/ObjectStoreProvider.spec.ts

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5430,4 +5430,112 @@ describe("ObjectStoreProvider", function () {
54305430
}
54315431
});
54325432
});
5433+
5434+
describe("IndexedDbProvider WrapRequest error surfacing", () => {
5435+
it("resolves with req.result on success", (done) => {
5436+
const mockRequest = {} as IDBRequest<string>;
5437+
(mockRequest as any).result = "test-value";
5438+
5439+
IndexedDbProvider.WrapRequest(mockRequest).then(
5440+
(result) => {
5441+
try {
5442+
assert.equal(result, "test-value");
5443+
done();
5444+
} catch (e) {
5445+
done(e);
5446+
}
5447+
},
5448+
() => done(new Error("Expected promise to resolve"))
5449+
);
5450+
5451+
mockRequest.onsuccess!({} as any);
5452+
});
5453+
5454+
it("rejects with the actual IDBRequest.error DOMException when onerror fires", (done) => {
5455+
const mockError = new DOMException(
5456+
"Quota exceeded",
5457+
"QuotaExceededError"
5458+
);
5459+
const mockRequest = {} as IDBRequest<any>;
5460+
5461+
IndexedDbProvider.WrapRequest(mockRequest).then(
5462+
() => done(new Error("Expected promise to reject")),
5463+
(err) => {
5464+
try {
5465+
assert.strictEqual(err, mockError);
5466+
assert.equal(err.name, "QuotaExceededError");
5467+
done();
5468+
} catch (e) {
5469+
done(e);
5470+
}
5471+
}
5472+
);
5473+
5474+
mockRequest.onerror!({ target: { error: mockError } } as any);
5475+
});
5476+
5477+
it("falls back to the raw event when IDBRequest.error is null", (done) => {
5478+
const mockRequest = {} as IDBRequest<any>;
5479+
const mockEvent = { target: { error: null } } as any;
5480+
5481+
IndexedDbProvider.WrapRequest(mockRequest).then(
5482+
() => done(new Error("Expected promise to reject")),
5483+
(err) => {
5484+
try {
5485+
assert.strictEqual(err, mockEvent);
5486+
done();
5487+
} catch (e) {
5488+
done(e);
5489+
}
5490+
}
5491+
);
5492+
5493+
mockRequest.onerror!(mockEvent);
5494+
});
5495+
});
5496+
5497+
describe("IndexedDbProvider put DOMException propagation", () => {
5498+
it("put rejects with the DOMException surfaced from WrapRequest", (done) => {
5499+
const quotaError = new DOMException(
5500+
"Quota exceeded",
5501+
"QuotaExceededError"
5502+
);
5503+
const originalWrapRequest =
5504+
IndexedDbProviderModule.IndexedDbProvider.WrapRequest;
5505+
5506+
openProvider(
5507+
"indexeddb",
5508+
{ version: 1, stores: [{ name: "test", primaryKeyPath: "id" }] },
5509+
true
5510+
)
5511+
.then((prov) => {
5512+
// Mock only after a successful open so the open itself is unaffected
5513+
IndexedDbProviderModule.IndexedDbProvider.WrapRequest =
5514+
function (): Promise<any> {
5515+
return Promise.reject(quotaError);
5516+
};
5517+
return prov.put("test", { id: "abc", val: "hello" }).then(
5518+
() => {
5519+
prov.close();
5520+
done(new Error("Expected put to reject"));
5521+
},
5522+
(err) => {
5523+
prov.close();
5524+
try {
5525+
assert.strictEqual(err, quotaError);
5526+
assert.equal(err.name, "QuotaExceededError");
5527+
done();
5528+
} catch (e) {
5529+
done(e);
5530+
}
5531+
}
5532+
);
5533+
})
5534+
.catch((err) => done(err))
5535+
.finally(() => {
5536+
IndexedDbProviderModule.IndexedDbProvider.WrapRequest =
5537+
originalWrapRequest;
5538+
});
5539+
});
5540+
});
54335541
});

0 commit comments

Comments
 (0)