@atproto/oauth-client-browser
Version: 
ATPROTO OAuth client for the browser (relies on WebCrypto & Indexed DB)
68 lines • 2.22 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.IndexedDBStore = void 0;
const index_js_1 = require("./indexed-db/index.js");
const storeName = 'store';
class IndexedDBStore {
    constructor(dbName, maxAge = 600e3) {
        Object.defineProperty(this, "dbName", {
            enumerable: true,
            configurable: true,
            writable: true,
            value: dbName
        });
        Object.defineProperty(this, "maxAge", {
            enumerable: true,
            configurable: true,
            writable: true,
            value: maxAge
        });
    }
    async run(mode, fn) {
        const db = await index_js_1.DB.open(this.dbName, [
            (db) => {
                const store = db.createObjectStore(storeName);
                store.createIndex('createdAt', 'createdAt', { unique: false });
            },
        ], { durability: 'strict' });
        try {
            return await db.transaction([storeName], mode, (tx) => fn(tx.objectStore(storeName)));
        }
        finally {
            await db[Symbol.dispose]();
        }
    }
    async get(key) {
        const item = await this.run('readonly', (store) => store.get(key));
        if (!item)
            return undefined;
        const age = Date.now() - item.createdAt.getTime();
        if (age > this.maxAge) {
            await this.del(key);
            return undefined;
        }
        return item?.value;
    }
    async set(key, value) {
        await this.run('readwrite', (store) => {
            store.put({ value, createdAt: new Date() }, key);
        });
    }
    async del(key) {
        await this.run('readwrite', (store) => {
            store.delete(key);
        });
    }
    async deleteOutdated() {
        const upperBound = new Date(Date.now() - this.maxAge);
        const query = IDBKeyRange.upperBound(upperBound);
        await this.run('readwrite', async (store) => {
            const index = store.index('createdAt');
            const keys = await index.getAllKeys(query);
            for (const key of keys)
                store.delete(key);
        });
    }
}
exports.IndexedDBStore = IndexedDBStore;
//# sourceMappingURL=indexed-db-store.js.map