88 lines
2.3 KiB
TypeScript
88 lines
2.3 KiB
TypeScript
/*
|
|
* Copyright (C) Sapphirecode - All Rights Reserved
|
|
* This file is part of Auth-Server-Helper which is released under MIT.
|
|
* See file 'LICENSE' for full license details.
|
|
* Created by Timo Hocker <timo@scode.ovh>, August 2022
|
|
*/
|
|
|
|
import IORedis from 'ioredis';
|
|
import {debug} from './debug';
|
|
import {LabelledKey} from './Key';
|
|
|
|
const logger = debug('redis');
|
|
|
|
export class Redis {
|
|
private _redis: IORedis | null = null;
|
|
|
|
public connect(url: string): void {
|
|
const log = logger.extend('connect');
|
|
log('connecting to redis instance %s', url);
|
|
if (this._redis !== null) {
|
|
log('disconnecting existing redis client');
|
|
this.disconnect();
|
|
}
|
|
|
|
this._redis = new IORedis(url);
|
|
this._redis.on('connect', () => {
|
|
log('connected');
|
|
});
|
|
this._redis.on('ready', () => {
|
|
log('ready');
|
|
});
|
|
this._redis.on('error', (err) => {
|
|
log('error %o', err);
|
|
});
|
|
this._redis.on('reconnecting', () => {
|
|
log('reconnecting');
|
|
});
|
|
this._redis.on('end', () => {
|
|
log('connection ended');
|
|
});
|
|
}
|
|
|
|
public disconnect(): void {
|
|
const log = logger.extend('disconnect');
|
|
log('disconnecting redis client');
|
|
if (this._redis === null) {
|
|
log('redis is inactive, skipping');
|
|
return;
|
|
}
|
|
this._redis.quit();
|
|
this._redis = null;
|
|
log('done');
|
|
}
|
|
|
|
public async set_key(key: LabelledKey): Promise<void> {
|
|
const log = logger.extend('set_key');
|
|
log('trying to set key %s to redis', key.index);
|
|
if (this._redis === null) {
|
|
log('redis is inactive, skipping');
|
|
return;
|
|
}
|
|
const valid_for = Math.floor(
|
|
(key.valid_until - new Date().getTime()) / 1000
|
|
);
|
|
log('key is valid for %d seconds', valid_for);
|
|
await this._redis.setex(key.index, valid_for, JSON.stringify(key));
|
|
log('saved key');
|
|
}
|
|
|
|
public async get_key(index: string): Promise<LabelledKey | null> {
|
|
const log = logger.extend('get_key');
|
|
log('trying to get key %s from redis', index);
|
|
if (this._redis === null) {
|
|
log('redis is inactive, skipping');
|
|
return null;
|
|
}
|
|
const res = await this._redis.get(index);
|
|
if (res === null) {
|
|
log('key not found in redis');
|
|
return null;
|
|
}
|
|
log('key found');
|
|
return JSON.parse(res);
|
|
}
|
|
}
|
|
|
|
export const redis = new Redis();
|