Async-Selector
view release on metacpan or search on metacpan
get '/' => sub {
my $self = shift;
$self->render('index');
};
get '/comet' => sub {
my $self = shift;
my $client_sequence = $self->param('seq');
my $watcher = $selector->watch(res => $client_sequence, sub {
my ($w, %resources) = @_;
my ($resource, $sequence)
= ($resources{res}{resource}, $resources{res}{sequence});
$self->render_data("$sequence $resource");
$w->cancel();
});
$self->on(finish => sub {
$watcher->cancel();
});
};
websocket '/websocket' => sub {
my $self = shift;
Mojo::IOLoop->stream($self->tx->connection)->timeout(0);
my $watcher = $selector->watch(res => 0, sub {
my ($w, %resources) = @_;
my ($resource, $sequence)
= ($resources{res}{resource}, $resources{res}{sequence});
$self->send("$sequence $resource");
});
$self->on(finish => sub {
$watcher->cancel();
});
};
app->start;
}
__DATA__
@@ index.html.ep
<!DOCTYPE html>
<html>
<head>
<title>Async::Selector test</title>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script><!--
$(function() {
var RECONNECT_BACKOFF = 2000;
// Setup Comet (long-polling)
var my_sequence = 0;
var sendCometRequest = function() {
$.get("<%= url_for('comet') %>?seq=" + my_sequence)
.done(function(data) {
data = data.split(" ");
my_sequence = data[0];
$('#comet_sequence').text(data[0]);
$('#comet_resource').text(data[1]);
sendCometRequest();
})
.fail(function() {
setTimeout(sendCometRequest, RECONNECT_BACKOFF);
});
};
sendCometRequest();
// Setup WebSocket
var connectWebsocket = function() {
var ws = new WebSocket("<%= url_for('websocket')->to_abs %>");
ws.onmessage = function(event) {
var data = event.data.split(" ");
$('#websocket_sequence').text(data[0]);
$('#websocket_resource').text(data[1]);
};
ws.onclose = function() {
setTimeout(connectWebsocket, RECONNECT_BACKOFF);
};
};
connectWebsocket();
});
//--></script>
</head>
<body>
<div>
<h1>Comet (long-polling)</h1>
<p>Sequence number: <span id="comet_sequence"></span></p>
<textarea id="comet_resource" rows="10" cols="100" readonly="true"></textarea>
</div>
<div>
<h1>WebSocket</h1>
<p>Sequence number: <span id="websocket_sequence"></span></p>
<textarea id="websocket_resource" rows="10" cols="100" readonly="true"></textarea>
</div>
</body>
</html>
( run in 1.401 second using v1.01-cache-2.11-cpan-39bf76dae61 )