package SockJS::Transport::EventSource; use strict; use warnings; use base 'SockJS::Transport::Base'; sub new { my $self = shift->SUPER::new(@_); my (%params) = @_; $self->{response_limit} = $params{response_limit} || 128 * 1024; push @{$self->{allowed_methods}}, 'GET'; return $self; } sub dispatch_GET { my $self = shift; my ($env, $conn) = @_; my $limit = $self->{response_limit}; return sub { my $respond = shift; my $writer = $respond->( [ 200, [ 'Content-Type' => 'text/event-stream', ] ] ); if ($conn->is_connected && !$conn->is_reconnecting) { $writer->write("\x0d\x0a"); $writer->write( qq{data: c[2010,"Another connection still open"]\x0d\x0a\x0d\x0a\n} ); $writer->close; return; } $conn->write_cb( sub { my $conn = shift; my ($message) = @_; $limit -= length($message) - 1; $writer->write("data: $message\x0d\x0a\x0d\x0a"); if ($limit <= 0) { $writer->close; $conn->reconnecting; } } ); $conn->on(close => sub { $writer->close }); $writer->write("\x0d\x0a"); $conn->write('o'); if ($conn->is_closed) { $conn->connected; $conn->close; } elsif ($conn->is_connected) { $conn->reconnected; } else { $conn->connected; } }; } 1;