Skip to content

Commit de26554

Browse files
committed
Started refactoring
1 parent 407b1f5 commit de26554

File tree

1 file changed

+24
-16
lines changed

1 file changed

+24
-16
lines changed

apps/webapp/app/services/apiRateLimit.server.ts

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,35 @@
1-
import { RedisClientOptions, createClient } from "redis";
1+
import { ActionFunction, ActionFunctionArgs, LoaderFunction } from "@remix-run/server-runtime";
22
import { Ratelimit } from "@upstash/ratelimit";
3-
import {
4-
ActionFunction,
5-
ActionFunctionArgs,
6-
LoaderFunction,
7-
LoaderFunctionArgs,
8-
} from "@remix-run/server-runtime";
3+
import Redis, { RedisOptions } from "ioredis";
94
import { env } from "~/env.server";
105

116
function createRedisRateLimitClient(
12-
redisOptions: RedisClientOptions
7+
redisOptions: RedisOptions
138
): ConstructorParameters<typeof Ratelimit>[0]["redis"] {
14-
const redis = createClient(redisOptions);
9+
const redis = new Redis(redisOptions);
1510

1611
return {
1712
sadd: async <TData>(key: string, ...members: TData[]): Promise<number> => {
18-
return redis.sAdd(key as string, members as any);
13+
return redis.sadd(key, members as (string | number | Buffer)[]);
1914
},
2015
eval: <TArgs extends unknown[], TData = unknown>(
2116
...args: [script: string, keys: string[], args: TArgs]
2217
): Promise<TData> => {
23-
return redis.eval(args[0], {
24-
keys: args[1],
25-
arguments: args[2] as string[],
26-
}) as Promise<TData>;
18+
const script = args[0];
19+
const keys = args[1];
20+
const argsArray = args[2];
21+
return redis.eval(
22+
script,
23+
keys.length,
24+
...keys,
25+
...(argsArray as (string | Buffer | number)[])
26+
) as Promise<TData>;
2727
},
2828
};
2929
}
3030

3131
type Options = {
32-
redis: RedisClientOptions;
32+
redis: RedisOptions;
3333
limiter: ConstructorParameters<typeof Ratelimit>[0]["limiter"];
3434
};
3535

@@ -45,6 +45,9 @@ class RateLimitter {
4545
});
4646
}
4747

48+
//todo Express middleware
49+
//use the Authentication header with Bearer token
50+
4851
async loader(key: string, fn: LoaderFunction): Promise<ReturnType<LoaderFunction>> {
4952
const { success, pending, limit, reset, remaining } = await this.#rateLimitter.limit(
5053
`ratelimit:${key}`
@@ -80,7 +83,12 @@ class RateLimitter {
8083

8184
export const standardRateLimitter = new RateLimitter({
8285
redis: {
83-
url: `redis://${env.REDIS_USERNAME}:${env.REDIS_PASSWORD}@${env.REDIS_HOST}:${env.REDIS_PORT}`,
86+
port: env.REDIS_PORT,
87+
host: env.REDIS_HOST,
88+
username: env.REDIS_USERNAME,
89+
password: env.REDIS_PASSWORD,
90+
enableAutoPipelining: true,
91+
...(env.REDIS_TLS_DISABLED === "true" ? {} : { tls: {} }),
8492
},
8593
limiter: Ratelimit.slidingWindow(1, "60 s"),
8694
});

0 commit comments

Comments
 (0)