package Sprocket::Plugin::JSONAir; use Sprocket::Plugin; use base 'Sprocket::Plugin'; use POE::Filter::Line; use POE::Filter::JSON; use strict; use warnings; use constant BAYEUX_VERSION => '1.0'; sub new { my $class = shift; $class->SUPER::new( name => 'JSONAir', @_ ); } # --------------------------------------------------------- # Client sub remote_connected { my ( $self, $client, $con, $socket ) = @_; $self->take_connection( $con ); # POE::Filter::Stackable object: my $filter = $con->filter; $filter->push( POE::Filter::Line->new() ); $filter->shift(); # POE::Filter::Stream $con->send( "bayeux " . BAYEUX_VERSION ); $filter->push( POE::Filter::JSON->new() ); # XXX should we pop the stream filter off the top? return 1; } sub remote_receive { my ($self, $client, $con, $event) = @_; # $self->{sub_manager}->deliver($con, $event); return 1; } # --------------------------------------------------------- # server sub local_connected { my ( $self, $server, $con, $socket ) = @_; $self->take_connection( $con ); # POE::Filter::Stackable object $con->filter->push( POE::Filter::Line->new(), POE::Filter::JSON->new(), ); # XXX should we pop the stream filter off the top? $self->{clients}->{ $con->ID } = 1; $con->send([{ bayeux => BAYEUX_VERSION }]); $con->call( broadcast => [{ joined => $con->ID }] ); return 1; } sub local_receive { my ($self, $server, $con, $event) = @_; # $self->{sub_manager}->deliver($con, $event); warn "received $event from $con"; $con->call( broadcast => [{ client => $con->ID, msg => $event }] ); return 1; } sub local_disconnected { my ($self, $server, $con) = @_; delete $self->{clients}->{ $con }; $con->call( broadcast => [{ parted => $con->ID }] ); } sub broadcast { my ($self, $server, $con, $data) = @_; my $id = $con->ID; foreach ( keys %{$self->{clients}} ) { next if ( $id eq $_ ); if ( my $c = $server->get_connection( $_ ) ) { $c->send( $data ); } } } 1;