summary refs log tree commit diff
path: root/lib/Plack/Middleware/APIRateLimit/Backend
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--lib/Plack/Middleware/APIRateLimit/Backend.pm14
-rw-r--r--lib/Plack/Middleware/APIRateLimit/Backend/Hash.pm21
-rw-r--r--lib/Plack/Middleware/APIRateLimit/Backend/Redis.pm43
3 files changed, 78 insertions, 0 deletions
diff --git a/lib/Plack/Middleware/APIRateLimit/Backend.pm b/lib/Plack/Middleware/APIRateLimit/Backend.pm
new file mode 100644
index 0000000..5628e86
--- /dev/null
+++ b/lib/Plack/Middleware/APIRateLimit/Backend.pm
@@ -0,0 +1,14 @@
+package Plack::Middleware::APIRateLimit::Backend;
+
+use Moose;
+use Carp;
+
+sub incr {
+    confess "Backend must implement an incr method";
+}
+
+sub get {
+    confess "Backend must implement a get method";
+}
+
+1;
diff --git a/lib/Plack/Middleware/APIRateLimit/Backend/Hash.pm b/lib/Plack/Middleware/APIRateLimit/Backend/Hash.pm
new file mode 100644
index 0000000..0e407d8
--- /dev/null
+++ b/lib/Plack/Middleware/APIRateLimit/Backend/Hash.pm
@@ -0,0 +1,21 @@
+package Plack::Middleware::APIRateLimit::Backend::Hash;
+
+use Moose;
+extends 'Plack::Middleware::APIRateLimit::Backend';
+
+has store => (
+    is      => 'rw',
+    isa     => 'HashRef',
+    traits  => ['Hash'],
+    lazy    => 1,
+    default => sub { {} },
+    handles => { get => 'get', set => 'set' }
+);
+
+sub incr {
+    my ( $self, $key ) = @_;
+    my $value = ($self->get($key) || 0) + 1;
+    $self->set( $key => $value );
+}
+
+1;
diff --git a/lib/Plack/Middleware/APIRateLimit/Backend/Redis.pm b/lib/Plack/Middleware/APIRateLimit/Backend/Redis.pm
new file mode 100644
index 0000000..e647f6a
--- /dev/null
+++ b/lib/Plack/Middleware/APIRateLimit/Backend/Redis.pm
@@ -0,0 +1,43 @@
+package Plack::Middleware::APIRateLimit::Backend::Redis;
+
+use Moose;
+extends 'Plack::Middleware::APIRateLimit::Backend';
+
+use AnyEvent::Redis;
+
+has store => (
+    is      => 'rw',
+    isa     => 'AnyEvent::Redis',
+    lazy    => 1,
+    default => sub {
+        return AnyEvent::Redis->new(
+            host => '127.0.0.1',
+            port => 6378,
+        );
+    }
+);
+
+sub BUILD {
+    my $self = shift;
+    if (scalar @_) {
+        $self->store(AnyEvent::Redis->new(@_));
+    }
+    return $self;
+}
+
+sub get {
+    my ( $self, $key ) = @_;
+    my $val = $self->store->get($key)->recv;
+    if ( !$val ) {
+        $self->store->set( $key => 1 )->recv;
+        $val = 1;
+    }
+    return $val;
+}
+
+sub incr {
+    my ($self, $key) = @_;
+    return $self->store->incr($key)->recv;
+}
+
+1;