have redis working

This commit is contained in:
Nour Alharithi
2023-10-25 14:27:16 -07:00
parent 99cd43c012
commit 7181912607
9 changed files with 384 additions and 11 deletions

124
src/utils/redisClient.ts Normal file
View File

@@ -0,0 +1,124 @@
import Redis, { RedisOptions } from 'ioredis';
import { sleep } from './utils';
export const getRedisClient = (
host?: string,
port?: string,
password?: string,
db?: number,
opts?: RedisOptions
): Redis => {
if (host && port) {
console.log(`Connecting to configured redis:: ${host}:${port}`);
const redisClient = new Redis({
host: host,
port: parseInt(port, 10),
password: password,
...(opts ?? {}),
retryStrategy: (times) => {
const delay = Math.min(times * 1000, 10000);
console.log(
`Reconnecting to Redis in ${delay}ms... (retries: ${times})`
);
return delay;
},
reconnectOnError: (err) => {
const targetError = 'ECONNREFUSED';
if (err.message.includes(targetError)) {
console.log(
`Redis error: ${targetError}. Attempting to reconnect...`
);
return true;
}
return false;
},
maxRetriesPerRequest: null, // unlimited retries
});
redisClient.on('connect', () => {
console.log('Connected to Redis.');
});
redisClient.on('error', (err) => {
console.error('Redis error:', err);
});
redisClient.on('reconnecting', () => {
console.log('Reconnecting to Redis...');
});
return redisClient;
}
console.log(`Using default redis`);
return new Redis({ db });
};
/**
* Wrapper around the redis client.
*
* You can hover over the underlying redis client methods for explanations of the methods, but will also include links to DOCS for some important concepts below:
*
* zRange, zRangeByScore etc.:
* - All of the "z" methods are methods that use sorted sets.
* - Sorted sets are explained here : https://redis.io/docs/data-types/sorted-sets/
*/
export class RedisClient {
public client: Redis;
connectionPromise: Promise<void>;
constructor(
host?: string,
port?: string,
password?: string,
db?: number,
opts?: RedisOptions
) {
this.client = getRedisClient(host, port, password, db, opts);
}
/**
* Should avoid using this unless necessary.
* @returns
*/
public forceGetClient() {
return this.client;
}
public get connected() {
return this?.client?.status === 'ready';
}
async connect() {
if (this.client.status === 'ready' || this.client.status === 'connect') {
return;
}
if (this.client.status === 'connecting') {
await sleep(100);
return this.connect(); // recursive call to check again
}
try {
await this.client.connect();
} catch (e) {
console.error(e);
}
}
disconnect() {
this.client.disconnect();
}
private assertConnected() {
if (!this.connected) {
throw 'Redis client not connected';
}
}
private getPrefixForMetrics(key: string) {
return key.split(':')?.[0];
}
}

View File

@@ -1,5 +1,6 @@
import {
DriftClient,
DriftEnv,
L2OrderBook,
MarketType,
PerpMarkets,
@@ -12,7 +13,6 @@ import {
} from '@drift-labs/sdk';
import { logger } from './logger';
import { NextFunction, Request, Response } from 'express';
import { driftClient, driftEnv, sdkConfig } from '..';
export const l2WithBNToStrings = (l2: L2OrderBook): any => {
for (const key of Object.keys(l2)) {
@@ -111,7 +111,8 @@ export const normalizeBatchQueryParams = (rawParams: {
};
export const validateWsSubscribeMsg = (
msg: any
msg: any,
sdkConfig: any
): { valid: boolean; msg?: string } => {
const maxPerpMarketIndex = Math.max(
...sdkConfig.PERP_MARKETS.map((m) => m.marketIndex)
@@ -158,6 +159,8 @@ export const validateWsSubscribeMsg = (
};
export const validateDlobQuery = (
driftClient: DriftClient,
driftEnv: DriftEnv,
marketType?: string,
marketIndex?: string,
marketName?: string
@@ -248,7 +251,8 @@ export function errorHandler(
export const getPhoenixSubscriber = (
driftClient: DriftClient,
marketConfig: SpotMarketConfig
marketConfig: SpotMarketConfig,
sdkConfig
): PhoenixSubscriber => {
return new PhoenixSubscriber({
connection: driftClient.connection,
@@ -262,7 +266,8 @@ export const getPhoenixSubscriber = (
export const getSerumSubscriber = (
driftClient: DriftClient,
marketConfig: SpotMarketConfig
marketConfig: SpotMarketConfig,
sdkConfig
): SerumSubscriber => {
return new SerumSubscriber({
connection: driftClient.connection,