taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit 74724178d53be1b41e768772e3de8c6ad56cdc78
parent eda73e896e354f1ce8a0dea9b4a6e04d6c810704
Author: Florian Dold <dold@taler.net>
Date:   Sun, 13 Sep 2026 16:16:35 +0200

idb-bridge: respect open lower bounds in range deletes

Start range deletion after an open lower bound so the boundary record is
retained, matching the existing handling of open upper bounds.

Diffstat:
Mpackages/idb-bridge/src/SqliteBackend.ts | 2+-
Mpackages/idb-bridge/src/backends.test.ts | 32++++++++++++++++++++++++++++++++
2 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/packages/idb-bridge/src/SqliteBackend.ts b/packages/idb-bridge/src/SqliteBackend.ts @@ -2187,7 +2187,7 @@ export class SqliteBackend implements Backend { objectStoreId: objectStoreId, currentKey: null, forward: true, - inclusive: true, + inclusive: !range.lowerOpen, targetKey, }); } else { diff --git a/packages/idb-bridge/src/backends.test.ts b/packages/idb-bridge/src/backends.test.ts @@ -42,6 +42,38 @@ import { initTestIndexedDB, useTestIndexedDb } from "./testingdb.js"; before(initTestIndexedDB); +test("range deletion respects both open endpoints", async () => { + for (const lowerOpen of [false, true]) { + for (const upperOpen of [false, true]) { + for (const bounded of [false, true]) { + const open = useTestIndexedDb().open(`delete-range-${Math.random()}`); + open.onupgradeneeded = () => { + const store = open.result.createObjectStore("rows"); + for (let key = 1; key <= 5; key++) store.put(key, key); + }; + const db = await promiseFromRequest(open); + try { + const tx = db.transaction("rows", "readwrite"); + const range = bounded + ? BridgeIDBKeyRange.bound(2, 4, lowerOpen, upperOpen) + : BridgeIDBKeyRange.lowerBound(2, lowerOpen); + tx.objectStore("rows").delete(range); + await promiseFromTransaction(tx); + const remaining = await promiseFromRequest( + db.transaction("rows").objectStore("rows").getAll(), + ); + assert.deepStrictEqual( + remaining, + [1, 2, 3, 4, 5].filter((k) => !range.includes(k)), + ); + } finally { + db.close(); + } + } + } + } +}); + test("Spec: Example 1 Part 1", async (t) => { const idb = useTestIndexedDb();