<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
    <script type="text/javascript">
        function reqAsPromise(req) {
            return new Promise((resolve, reject) => {
                req.onsuccess = () => resolve(req);
                req.onerror = (err) => reject(err);
            });
        }

        class Storage {
            constructor(databaseName) {
                this._databaseName = databaseName;
                this._database = null;
            }

            async open() {
                const req = window.indexedDB.open(this._databaseName);
                req.onupgradeneeded = (ev) => {
                    const db = ev.target.result;
                    const oldVersion = ev.oldVersion;
                    this._createStores(db, oldVersion);
                }; 
                await reqAsPromise(req);
                this._database = req.result;
            }

            _createStores(db) {
                db.createObjectStore("files", {keyPath: ["idName"]});
            }

            async storeFoo(id, name) {
                const tx = this._database.transaction(["files"], "readwrite");
                const store = tx.objectStore("files");
                await reqAsPromise(store.add(value(id, name)));
            }
        }

        function value(id, name) {
            return {idName: key(id, name)};
        }

        function key(id, name) {
            return id+","+name;
        }

        async function main() {
            let storage = new Storage("idb-multi-key2");
            try {
                await storage.open();
                await storage.storeFoo(5, "foo");
                await storage.storeFoo(6, "bar");
                alert("all good");
            } catch(err) {
                alert(err.message);
            }
            try {
                const result = indexedDB.cmp(key(5, "foo"), key(6, "bar"));
                //IDBKeyRange.bound(["aaa", "111"],["zzz", "999"], false, false);
                alert("all good: " + result);
            } catch (err) {
                alert(`IDBKeyRange.bound: ${err.message}`);
            }
        }

        main();

    </script>
</body>
</html>