Add redis-rate-limiter and tests.

This commit is contained in:
Seth Westphal
2016-08-16 15:55:10 -05:00
parent b7802eae32
commit be6fac9f8c
2 changed files with 85 additions and 0 deletions

View File

@@ -0,0 +1,41 @@
/// <reference path="../express/express.d.ts" />
/// <reference path="../redis/redis.d.ts" />
/// <reference path="redis-rate-limiter.d.ts" />
import * as express from 'express';
import * as redis from 'redis';
import * as rateLimiter from 'redis-rate-limiter';
var num: number;
var str: string;
var options: redis.ClientOpts;
var redisClient = redis.createClient(num, str, options);
var limit = rateLimiter.create({
redis: redisClient,
key: function(x) { return x.ip },
rate: '100/minute'
});
var request = {} as express.Request;
limit(request, function(err, rate) {
if (err) {
console.warn('Rate limiting not available');
} else {
console.log('Rate window: ' + rate.window); // 60
console.log('Rate limit: ' + rate.limit); // 100
console.log('Rate current: ' + rate.current); // 74
if (rate.over) {
console.error('Over the limit!');
}
}
});
var middleware = rateLimiter.middleware({
redis: redisClient,
key: 'ip',
rate: '100/minute'
});
var app = express();
app.use(middleware);

View File

@@ -0,0 +1,44 @@
// Type definitions for redis-rate-limiter 1.0.3
// Project: https://github.com/TabDigital/redis-rate-limiter
// Definitions by: Seth Westphal <https://github.com/westy92>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
/// <reference path="../express/express.d.ts" />
/// <reference path="../redis/redis.d.ts" />
declare module "redis-rate-limiter" {
import * as express from 'express';
import * as redis from 'redis';
class RedisRateLimiter {
public static create(options: RedisRateLimiter.Options):
(req: express.Request, callback: (err: Error, res: RedisRateLimiter.Response) => void) => void;
public static middleware(options: RedisRateLimiter.Options): express.RequestHandler;
}
namespace RedisRateLimiter {
export interface Options {
redis: redis.RedisClient;
key: 'ip' | ((req: express.Request) => string);
window?: number;
limit?: number;
rate?: string;
}
export interface Response {
key: string;
current: number;
limit: number;
window: number;
over: boolean;
}
}
export = RedisRateLimiter;
}