@bryopsida/redis-key-store
Version:
Implementation of @bryopsida/redis-key-store using redis as backing store
71 lines • 2.81 kB
JavaScript
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