Amon2

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN

    - fixed testing issue
      (karupanerura)
    - added micro-location.js

3.52 2012-08-09

    - upgrade jQuery 1.7.2 to 1.8.0

3.51 2012-08-08

    - streaming support

3.50 2012-08-06

    - websocket support

3.39 2012-08-05

    - Bundled es5shim.js, sprintf.js, strftime.js, micro_template.js

3.38 2012-08-01

MANIFEST  view on Meta::CPAN

t/300_setup/08_installable.t
t/300_setup/09_minil_migrate.t
t/600_plugins/005_fillin_form_lite.t
t/600_plugins/007_json.t
t/600_plugins/007_json_default_encoding.t
t/600_plugins/007_json_hijacking.t
t/600_plugins/007_json_keysort.t
t/600_plugins/007_json_x_api_status.t
t/600_plugins/008_no_cache.t
t/600_plugins/010_plack_session.t
t/600_plugins/012_streaming.t
t/600_plugins/013_websocket.t
t/600_plugins/014_streaming_header_splitting.t
t/800_dispatcher/002_router_simple.t
t/800_dispatcher/003_lite.t
t/800_dispatcher/004_router_boom.t
t/800_dispatcher/004_router_boom_sinatraish.t
t/TestFlavor.pm
t/Util.pm
t/tmpl/foo.mt
xt/02_perlcritic.t
xt/06_dependencies.t
xt/skelton/01_basic.t

eg/LongPoll/chat.psgi  view on Meta::CPAN

        }
    );
    return $c->render_json({ok => 1});
};

any '/poll' => sub {
    my ($c) = @_;

    my $client_id = $c->req->param('client_id')
        or die;
    return $c->streaming_json(sub {
        my $writer = shift;

        $mq->poll_once($client_id, sub {
            $writer->write_json(\@_);
            $writer->close;
        });
    });
};

# load plugins

lib/Amon2/Plugin/Web/Streaming.pm  view on Meta::CPAN

use strict;
use warnings;
use utf8;

use Amon2::Util;
use Amon2::Web::Response::Callback;

sub init {
    my ($class, $c, $conf) = @_;

    Amon2::Util::add_method(ref $c || $c, 'streaming', \&_streaming);
    Amon2::Util::add_method(ref $c || $c, 'streaming_json', \&_streaming_json);
}

sub _streaming {
    my ($self, $code) = @_;
    
    return Amon2::Web::Response::Callback->new(
        code => sub {
            $code->(@_);
        }
    );
}

sub _streaming_json {
    my ($self, $code) = @_;

    return Amon2::Web::Response::Callback->new(
        code => sub {
            my $respond = shift;
            my $writer = $respond->([200, ['Content-Type' => 'application/json;charset=utf-8']]);

            my $longpoll_ctx = Amon2::Plugin::Web::Streaming::Writer->new(
                $self,
                $writer

lib/Amon2/Plugin/Web/Streaming.pm  view on Meta::CPAN

sub close {
    my ($self) = @_;
    $self->{writer}->close();
}

1;
__END__

=head1 NAME

Amon2::Plugin::Web::Streaming - streaming support for Amon2

=head1 SYNOPSIS

    use Amon2::Lite;

    __PACKAGE__->load_plugin(qw/Web::Streaming/);

    any '/poll' => sub {
        my $c = shift;
        return $c->streaming(sub {
            my $respond = shift;
            ...;
            $respond->write([200, [], ['OK']]);
        });
    };

    any '/poll_json' => sub {
        my $c = shift;
        return $c->streaming_json(sub {
            my $writer = shift;
            ...;
            $writer->write_json(+{ });
            $writer->close;
        });
    };


=head1 DESCRIPTION

This is an Amon2 plugin to support streaming.

You MUST use the HTTP server supporting psgi.streaming.

=head1 EXPORTED METHODS

=over 4

=item $c->streaming($code);

You can return delayed response for PSGI spec.

Argument for $code is C<< $respond >>. It's same as a argument for PSGI callback.

=item $c->streaming_json($code);

It's a short hand utility to publish streaming JSON.

The argument is instance of Amon2::Plugin::Web::Streaming::Writer.

=back

=head1 Amon2::Plugin::Streaming::Writer METHODS

=over 4

=item new

lib/Amon2/Web/Response/Callback.pm  view on Meta::CPAN

        Amon2::Web::Response::Callback->new(
            code => sub {
                my $respond = shift;
                $respond->([200, [], []]);
            }
        );
    };

=head1 DESCRIPTION

This module provides a response object for delayed response/streaming body.

You can embed the AE support, streaming support, etc on Amon2 with this module.

=head1 SEE ALSO

L<Tatsumaki>

t/600_plugins/012_streaming.t  view on Meta::CPAN

$Plack::Test::Impl = "Server";

use Amon2;

{
    package MyApp::Web;
    use parent -norequire, qw/MyApp/;
    use parent qw/Amon2::Web/;
    sub dispatch {
        my $c = shift;
        $c->streaming(sub {
            my ($respond) = @_;
            my $writer = $respond->(
                [200, ['Content-Type', 'text/html']]);
            $writer->write("<html>\n");
            for my $i (1..5) {
                $writer->write("<div>$i</div>\n");
            }
            $writer->write("</html>\n");
            $writer->close;
        });

t/600_plugins/014_streaming_header_splitting.t  view on Meta::CPAN

$Plack::Test::Impl = "Server";

use Amon2;

{
    package MyApp::Web;
    use parent -norequire, qw/MyApp/;
    use parent qw/Amon2::Web/;
    sub dispatch {
        my $c = shift;
        $c->streaming(sub {
            my ($respond) = @_;
            my $writer = $respond->(
                [200, ['Content-Type', "text/html\015\012hogehoge"]]);
            $writer->write("<html>\n");
            for my $i (1..5) {
                $writer->write("<div>$i</div>\n");
            }
            $writer->write("</html>\n");
            $writer->close;
        });



( run in 0.282 second using v1.01-cache-2.11-cpan-4d50c553e7e )