package PiTube::Controller::Websockets; use Mojo::Base 'Mojolicious::Controller'; use Mojo::JSON qw(encode_json); use feature 'signatures'; no warnings qw{ experimental::signatures }; use constant SOCKET_INACTIVITY_TIMEOUT => 300; sub main { my $c = shift; # my $ip = $c->tx->remote_address; my $key = $c->req->headers->header('Sec-WebSocket-Key'); $c->inactivity_timeout(SOCKET_INACTIVITY_TIMEOUT); if ($c->req->headers->header('Sec-WebSocket-Extensions') =~ /permessage-deflate/) { $c->tx->compressed(1); $c->res->headers->add('Sec-WebSocket-Extensions' => 'permessage-deflate'); } $c->redis->pubsub->json('streams')->listen( streams => sub($pubsub, $payload) { $c->send({json => $payload}); } ); $c->on(json => sub( $c, $message ) { if ( $message->{stream} ) { $c->redis->db->set( join (':', ('live', $message->{stream}, $key)), 'live', 'EX', 16 ); $c->redis->db->keys( 'live:' . $message->{stream} . ':*', sub { my ($db, $err, $res) = @_ ; $c->send(encode_json({ watchers => scalar @{ $res} })); }); } }); $c->on(finish => sub ($c, $code, $reason = undef) { $c->redis->pubsub->unlisten('streams'); $c->app->log->debug("WebSocket closed with status $code"); }); } 1;