Advertisement
Guest User

Untitled

a guest
Mar 15th, 2012
21
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package Mojolicious::Plugin::EventSource;
  2. use Mojo::Base 'Mojolicious::Plugin';
  3.  
  4. sub register {
  5.    my $self = shift;
  6.    my $app  = shift;
  7.    my $conf = shift;
  8.  
  9.    $conf->{ timeout } ||= 300;
  10.  
  11.    $app->routes->add_shortcut('event_source' => sub {
  12.  
  13.       my $self = shift;
  14.       my @pars = map {
  15.  
  16.          if(ref $_ eq "CODE") {
  17.             my $copy = $_;
  18.             $_ = sub {
  19.                my $self = shift;
  20.                Mojo::IOLoop->stream($self->tx->connection)->timeout($conf->{ timeout });
  21.                $self->res->headers->content_type('text/event-stream');
  22.                $self->$copy(@_);
  23.             };
  24.          }
  25.          $_;
  26.       } @_;
  27.  
  28.       $app->routes->get( @_, "" );
  29.  
  30.    });
  31.  
  32.    $app->helper( 'event_source' => sub { $app->routes->event_source( @_ ) } );
  33.  
  34.    $app->helper( 'emit' => sub {
  35.       my $self  = shift;
  36.       my $event = shift;
  37.       my $data  = shift;
  38.       $self->write("event:$event\ndata: $data\n\n");
  39.    });
  40.  
  41. }
  42.  
  43. 42;
  44.  
  45.  
  46.  
  47. #### app.pl
  48.  
  49. #!/usr/bin/env perl
  50. use Mojolicious::Lite;
  51. plugin 'Mojolicious::Plugin::EventSource';
  52.  
  53. get '/' => 'index';
  54.  
  55. event_source('/events' => sub {
  56.   my $self = shift;
  57.   print $self->tx, $/;
  58.  
  59.   my $id = Mojo::IOLoop->recurring(1 => sub {
  60.     my $pips = int(rand 6) + 1;
  61.     $self->emit("dice", $pips);
  62.   });
  63.  
  64.   $self->on(finish => sub { print $/ x 3, "finish!!!", $/ x 3, Mojo::IOLoop->drop($id) });
  65.  
  66. });
  67.  
  68. app->start;
  69. __DATA__
  70.  
  71. @@ index.html.ep
  72. <!doctype html><html>
  73.   <head><title>Roll The Dice</title></head>
  74.   <body>
  75.     <script>
  76.       var events = new EventSource('<%= url_for 'events' %>');
  77.  
  78.       // Subscribe to "dice" event
  79.       events.addEventListener('dice', function(event) {
  80.         document.body.innerHTML += event.data + '<br/>';
  81.       }, false);
  82.     </script>
  83.   </body>
  84. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement