You can use
Any of AnyEvent::* libraries to do
asynchronous tasks (unlike Mojo)
The first and only framework
that uses psgi.streaming
package MainHandler;
use base qw(Tatsumaki::Handler);
sub get {
my $self = shift;
$self->write(“Hello World”);
}
package main;
use Tatsumaki::Application;
my $app = Tatsumaki::Application->new([
‘/’ => ‘MainHandler’,
]);
package HTTPClientHandler;
use base qw(Tatsumaki::Handler);
__PACKAGE__->asynchronous(1);
use Tatsumaki::HTTPClient;
sub get {
my $self = shift;
my $client = Tatsumaki::HTTPClient->new;
$client->get($api_url, sub {
my $res = shift;
my $body = $res->content;
$self->write(...);
$self->finish;
});
}
package AsyncHandler;
use base qw(Tatsumaki::Handler);
__PACKAGE__->asynchronous(1);
sub get {
my $self = shift;
my $t; $t = AE::timer 3, 0, sub {
undef $t;
$self->write(“Hello World”);
$self->finish;
});
}
package main;
use Tatsumaki::Application;
my $app = Tatsumaki::Application->new([
‘/’ => ‘AsyncHandler’,
]);
package LongPollHandler;
use base qw(Tatsumaki::Handler);
__PACKAGE__->asynchronous(1);
use Tatsumaki::MessageQueue;
sub get {
my $self = shift;
my $mq = Tatsumaki::MessageQueue-
>instance(‘ch-name’);
$mq->poll_once($client_id, sub {
my @events = @_;
$self->write(@events);
$self->finish;
});
}
package EventPostHandler;
use base qw(Tatsumaki::Handler);
sub post {
my $self = shift;
my $mq = Tatsumaki::MessageQueue-
>instance(‘ch-name’);
$mq->publish({
name => “NewComment”, ...
});
$self->write({ success => 1 });
}
package MXHRPollHandler;
use base qw(Tatsumaki::Handler);
__PACKAGE__->asynchronous(1);
use Tatsumaki::MessageQueue;
sub get {
my $self = shift;
$self->multipart_xhr_push(1);
my $mq = Tatsumaki::MessageQueue-
>instance(‘ch-name’);
$mq->poll($client_id, sub {
my @events = @_;
$self->stream_write(@events);
});
}
# see Tatsumaki-Service-XMPP/eg/translate.psgi
package XMPPTranslateHandler;
use base qw(Tatsumaki::Handler::XMPP);
sub post {
my $self = shift;
my $msg = $self->xmpp_message;
my $uri = “http://ajax.googleapis.com/...”;
my $client = Tatsumaki::HTTPClient->new;
$client->get($uri, $self->async_cb(sub {
my $res = shift;
my $r = JSON::decode_json($res->content);
$msg->reply($r->{translatedText});
$self->finish;
}));
}