UNPKG

@solid/community-server

Version:

Community Solid Server: an open and modular implementation of the Solid specifications

104 lines 3.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ExpiringAdapterFactory = exports.ExpiringAdapter = void 0; const global_logger_factory_1 = require("global-logger-factory"); /** * An IDP storage adapter that uses an ExpiringStorage * to persist data. */ class ExpiringAdapter { logger = (0, global_logger_factory_1.getLoggerFor)(this); name; storage; constructor(name, storage) { this.name = name; this.storage = storage; } grantKeyFor(id) { return `grants/${encodeURIComponent(id)}`; } userCodeKeyFor(userCode) { return `user_codes/${encodeURIComponent(userCode)}`; } uidKeyFor(uid) { return `uids/${encodeURIComponent(uid)}`; } keyFor(id) { return `${this.name}/${encodeURIComponent(id)}`; } async upsert(id, payload, expiresIn) { // Despite what the typings say, `expiresIn` can be undefined const expiration = expiresIn ? expiresIn * 1000 : undefined; const key = this.keyFor(id); this.logger.debug(`Storing payload data for ${id}`); const storagePromises = [ this.storage.set(key, payload, expiration), ]; if (payload.grantId) { storagePromises.push((async () => { const grantKey = this.grantKeyFor(payload.grantId); const grants = (await this.storage.get(grantKey) || []); grants.push(key); await this.storage.set(grantKey, grants, expiration); })()); } if (payload.userCode) { storagePromises.push(this.storage.set(this.userCodeKeyFor(payload.userCode), id, expiration)); } if (payload.uid) { storagePromises.push(this.storage.set(this.uidKeyFor(payload.uid), id, expiration)); } await Promise.all(storagePromises); } async find(id) { return await this.storage.get(this.keyFor(id)); } async findByUserCode(userCode) { const id = await this.storage.get(this.userCodeKeyFor(userCode)); return this.find(id); } async findByUid(uid) { const id = await this.storage.get(this.uidKeyFor(uid)); return this.find(id); } async destroy(id) { await this.storage.delete(this.keyFor(id)); } async revokeByGrantId(grantId) { this.logger.debug(`Revoking grantId ${grantId}`); const grantKey = this.grantKeyFor(grantId); const grants = await this.storage.get(grantKey); if (!grants) { return; } const deletePromises = []; for (const grant of grants) { deletePromises.push(this.storage.delete(grant)); } deletePromises.push(this.storage.delete(grantKey)); await Promise.all(deletePromises); } async consume(id) { const payload = await this.find(id); if (!payload) { return; } payload.consumed = Math.floor(Date.now() / 1000); await this.storage.set(this.keyFor(id), payload); } } exports.ExpiringAdapter = ExpiringAdapter; /** * The factory for a ExpiringStorageAdapter */ class ExpiringAdapterFactory { storage; constructor(storage) { this.storage = storage; } createStorageAdapter(name) { return new ExpiringAdapter(name, this.storage); } } exports.ExpiringAdapterFactory = ExpiringAdapterFactory; //# sourceMappingURL=ExpiringAdapterFactory.js.map