<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
</head>
<body>
	<script type="module">
		function reqAsPromise(req) {
			return new Promise((resolve, reject) => {
				req.addEventListener("success", event => resolve(event.target.result));
				req.addEventListener("error", event => reject(event.target.error));
			});
		}

		function txnAsPromise(txn) {
			return new Promise((resolve, reject) => {
				txn.addEventListener("complete", resolve);
				txn.addEventListener("abort", reject);
			});
		}

		export function readAll(cursor) {
			return new Promise((resolve, reject) => {
				const results = [];
				cursor.onerror = (event) => {
					reject(new Error("Query failed: " + event.target.errorCode));
				};
				cursor.onsuccess = (event) => {
					const cursor = event.target.result;
					if (!cursor) {
						resolve(results);
					} else {
						results.push(cursor.value);
						cursor.continue();
					}
				};
			});
		}

		async function main() {
			let isNew = false;
			const openReq = window.indexedDB.open("composed_binary_keys_test", 1);
			openReq.onupgradeneeded = (ev) => {
				const db = ev.target.result;
				db.createObjectStore("test", {keyPath: ["strKey", "binKey"]});
				isNew = true;
			};
			const db = await reqAsPromise(openReq);
			// fill test store with some initial data
			if (isNew) {
				const txn = db.transaction("test", "readwrite");
				const store = txn.objectStore("test");
				store.add({strKey: "abc", binKey: new Uint8Array([0x0F, 0x00, 0x10, 0x00]).buffer});
				store.add({strKey: "def", binKey: new Uint8Array([0x00, 0x10, 0x00, 0x00]).buffer});
				store.add({strKey: "def", binKey: new Uint8Array([0xFF, 0x10, 0x00, 0x00]).buffer});
				store.add({strKey: "ghi", binKey: new Uint8Array([0x00, 0x00, 0x40, 0x00]).buffer});
				await txnAsPromise(txn);
			}
			
			const txn = db.transaction("test", "readonly");
			const store = txn.objectStore("test");
			const defRange = IDBKeyRange.bound(
				["def", new Uint8Array([0x00, 0x00, 0x00, 0x00]).buffer],
				["def", new Uint8Array([0xFF, 0xFF, 0xFF, 0xFF]).buffer],
				true, true,
				);
			const defValues = await readAll(store.openCursor(defRange, "prev"));
			console.log(defValues);
		}

		main();
	</script>
</body>
</html>