UNPKG

@bryopsida/redis-key-store

Version:

Implementation of @bryopsida/redis-key-store using redis as backing store

71 lines 2.81 kB
import { BaseKeyStore, } from '@bryopsida/key-store'; export class RedisKeyStore extends BaseKeyStore { redisClient; keyPrefix; logger; constructor(logger, redisClient, keyPrefix, keyStorePasswordProvider, keyStoreSaltProvider, keyStoreContextProvider) { super(keyStorePasswordProvider, keyStoreSaltProvider, keyStoreContextProvider); this.logger = logger; this.redisClient = redisClient; this.keyPrefix = keyPrefix || 'hermes-key-store'; } async putKeyInSlot(keySlot, key) { this.logger.trace(`Putting key in slot ${this.keyPrefix}:${keySlot}`); await this.redisClient.set(`{${this.keyPrefix}:${keySlot}}`, key.toString('base64')); } async getKeyInSlot(keySlot) { this.logger.trace(`Getting key in slot ${this.keyPrefix}:${keySlot}`); const val = await this.redisClient.get(`{${this.keyPrefix}:${keySlot}}`); if (val) { return Buffer.from(val, 'base64'); } else { throw new Error('Key not found'); } } async deleteKeySlot(keySlot) { await this.redisClient.del(`{${this.keyPrefix}:${keySlot}}`); } async clearKeySlots() { return new Promise((resolve, reject) => { try { const pattern = `{${this.keyPrefix}:*`; this.logger.info(`Clearing keys matching pattern ${pattern}`); const scanStream = this.redisClient.scanStream({ match: pattern, }); scanStream.on('data', (keys) => { this.logger.info(`Deleting ${keys.length} keys`); keys.forEach((key) => { this.redisClient.del(key); }); }); const timeout = setTimeout(() => { scanStream.destroy(); reject(new Error('Timeout while clearing keys')); }, 10000); scanStream.on('end', () => { this.logger.info('Finished scanning keys for deletion'); clearTimeout(timeout); resolve(); }); scanStream.on('error', (err) => { this.logger.error('Error while scanning keys for deletion', err); clearTimeout(timeout); reject(err); }); } catch (err) { reject(err); } }); } async hasKeyInSlot(keySlot) { return (await this.redisClient.exists(`{${this.keyPrefix}:${keySlot}}`)) > 0; } async close() { this.logger.info('Closing redis client'); this.redisClient.disconnect(false); } } //# sourceMappingURL=redisKeyStore.js.map