AnyEvent-WebSocket-Client
view release on metacpan or search on metacpan
example/jobserver view on Meta::CPAN
#!/usr/bin/perl
use autodie;
use strict;
use warnings;
use Mojo::Redis2;
use Mojo::JSON qw/encode_json decode_json/;
use Mojolicious::Lite;
helper redis => sub { state $redis = Mojo::Redis2->new; };
my $jobnumber = 0;
sub get_job_hash
{
my ($c, $cb) = @_;
my $redis = $c->redis;
my %redis_jobs = @{$redis->hgetall('jobs')};
my %jobs;
foreach my $key (keys %redis_jobs){
my ($server, $id) = split /\./, $key;
$jobs{$server}->{$id} = decode_json($redis_jobs{$key});
}
$c->stash(jobs => \%jobs);
$cb->();
$c->render_later;
}
get '/' => sub {
shift->redirect_to('index');
};
get '/server.json' => sub {
my $self = shift;
get_job_hash($self, sub {
$self->render(json => $self->stash('jobs'));
});
};
get '/server' => sub {
my $self = shift;
get_job_hash($self, sub {
$self->render('index');
});
} => 'index';
get '/server/:server' => sub {
my $self = shift;
get_job_hash($self, sub {
my $server = $self->param('server');
if(defined $self->stash->{jobs}->{$server})
{
$self->stash(server => $server);
$self->render('server');
}
else
{
$self->reply->not_found;
}
});
} => 'server';
sub get_old_events
{
my ($c, $cb) = @_;
my $redis = $c->redis;
my $id = $c->param('id');
my $server = $c->param('server');
my $key = join('.', $server, $id);
my $list = join('.', qw( job event ), $key);
my $command = decode_json($redis->hget('jobs',$key));
my $json_events = $redis->lrange($list, 0, -1);
my @events;
foreach my $event (@$json_events){
push @events, decode_json($event);
}
my $url = $c->req->url->to_abs;
$url->path($c->url_for('events', server => $server, id => $id));
$url->scheme($url->scheme eq 'https' ? 'wss' : 'ws');
$c->stash({
command => $command,
url => $url,
events => \@events,
encoded_events => encode_json(\@events),
});
$cb->();
$c->render_later;
}
get '/job/:server/:id/json' => sub {
my $self = shift;
get_old_events($self, sub {
$self->render(json => {
command => $self->stash->{command},
events => $self->stash->{events},
event_url => $self->stash->{url},
});
});
};
get '/job/:server/:id' => sub {
my $self = shift;
get_old_events($self, sub {
$self->render('job');
});
} => 'job';
websocket '/events/:server/:id' => sub {
my $c = shift;
my $redis = $c->redis;
my $id = $c->param('id');
my $server = $c->param('server');
example/jobserver view on Meta::CPAN
@@ job.html.ep
% layout 'default';
% title 'job';
<input id="starter_events" value="<%= $encoded_events %>" type="hidden" />
<pre id="output"></pre>
<script language="javascript">
function append_event(event)
{
if(event.type == 'out')
{
$('#output').append(event.data + "\n");
}
else if(event.type == 'err')
{
$('#output').append(event.data + "\n");
}
else if(event.type == 'error')
{
$('#output').append("ERROR: " + event.data + "\n");
}
else if(event.type == 'exit')
{
$('#output').append("EXIT: " + event.exit);
if(event.signal > 0)
{ $('#output').append(" SIGNAL: " + event.signal) }
$('#output').append("\n");
}
else if(event.type == 'closed')
{
$('#output').append("CONNECTION CLOSED\n");
}
}
$(document).ready(function() {
var ws = new WebSocket('<%= $url %>');
var events = $.parseJSON($('#starter_events').attr('value'));
$.each(events, function(index, event) {
append_event(event);
ws.onmessage = function(event) {
append_event($.parseJSON(event.data));
};
});
});
</script>
@@ layouts/default.html.ep
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
</head>
<body><%= content %></body>
</html>
@@ not_found.html.ep
Not found
( run in 2.357 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )