# NAME
PocketIO - Socket.IO PSGI application
# SYNOPSIS
use Plack::Builder;
builder {
mount '/socket.io' => PocketIO->new(
handler => sub {
my $self = shift;
$self->on(
'message' => sub {
my $self = shift;
my ($message) = @_;
...;
}
);
$self->send({buffer => []});
}
);
$app;
};
# or
builder {
mount '/socket.io' =>
PocketIO->new(class => 'MyApp::Handler', method => 'run');
$app;
};
# DESCRIPTION
[PocketIO](
http://search.cpan.org/perldoc?PocketIO) is a server implementation of SocketIO in Perl, you still need
`socket.io` javascript library on the client.
[PocketIO](
http://search.cpan.org/perldoc?PocketIO) aims to have API as close as possible to the Node.js implementation
and sometimes it might look not very perlish.
## How to use
First you mount [PocketIO](
http://search.cpan.org/perldoc?PocketIO) as a normal [Plack](
http://search.cpan.org/perldoc?Plack) application. It is recommended
to mount it to the `/socket.io` path since that will not require any changes on
the client side.
When the client is connected your handler is called with a [PocketIO::Socket](
http://search.cpan.org/perldoc?PocketIO::Socket)
object as a first parameter.
## Sending and receiving messages
A simple echo handler can look like this:
sub {
my $self = shift;
$self->on('message' => sub {
my $self = shift;
my ($message) = @_;
$self->send($message);
});
}
## Sending and receiving events
Events are special messages that behave like rpc calls.
sub {
my $self = shift;
$self->on('username' => sub {
my $self = shift;
my ($nick) = @_;
...
});
$self->emit('username', 'vti');
}
## Broadcasting and sending messages/events to everybody
Broadcasting is sending messages to everybody except you:
$self->broadcast->send('foo');
$self->broadcast->emit('foo');
Method `sockets` represents all connected clients:
$self->sockets->send('foo');
$self->sockets->emit('foo');
## Acknowlegements
Sometimes you want to know when the client received a message or event. In order
to achieve this just pass a callback as the last parameter:
$self->send('foo', sub {'client got message'});
$self->emit('foo', sub {'client got event'});
## Storing data in the socket object
Often it is required to store some data in the client object. Instead of using
global variables there are two handy methods:
sub {
my $self = shift;
$self->set(foo => 'bar', sub { 'ready' });
$self->get('foo' => sub {
my $self = shift;
my ($err, $foo) = @_;
});
}
## Namespacing
Not implemented yet.
## Volatile messages
Not implemented yet.
## Rooms
A room is a named group of connections for more fine-grained
broadcasts. You can subscribe or unsubscribe a socket to/from a room:
sub {
my $self = shift;
$self->join('a room');
$self->sockets->in('a room')->emit('message', data);
$self->broadcast->to('a room')->emit("other message");
}
# CONFIGURATIONS
- handler
PocketIO->new(
handler => sub {
my $socket = shift;
$socket->on(
'message' => sub {
my $socket = shift;
}
);
$socket->send('hello');
}
);
- class or instance, method
PocketIO->new(class => 'MyHandler', method => 'run');
# or
PocketIO->new(instance => MyHandler->new(foo => 'bar'), method => 'run');
package MyHandler;
sub new { ... } # or use Moose, Boose, Goose, Doose
sub run {
my $self = shift;
return sub {
# same code as above
}
}
Loads `class`, creates a new object or uses a passed `instance` and runs
`run` method expecting it to return an anonymous subroutine.
# TLS/SSL
For TLS/SSL a secure proxy is needed. `stunnel` or [App::TLSMe](
http://search.cpan.org/perldoc?App::TLSMe) are
recommended.
# SCALING
See [PocketIO::Pool::Redis](
http://search.cpan.org/perldoc?PocketIO::Pool::Redis).
# DEBUGGING
Use `POCKETIO_DEBUG` and `POCKETIO_CONNECTION_DEBUG` variables for debugging.
# METHODS
## `new`
Create a new [PocketIO](
http://search.cpan.org/perldoc?PocketIO) instance.
## `pool`
Holds [PocketIO::Pool](
http://search.cpan.org/perldoc?PocketIO::Pool) object by default.
## `call`
For Plack apps compatibility.
## `to_app`
Returns PSGI code reference.
# SEE ALSO
More information about SocketIO you can find on the website [
http://socket.io/](
http://socket.io/), or
on the GitHub [
https://github.com/LearnBoost/Socket.IO](
https://github.com/LearnBoost/Socket.IO).
[Protocol::SocketIO](
http://search.cpan.org/perldoc?Protocol::SocketIO), [PSGI](
http://search.cpan.org/perldoc?PSGI)
# DEVELOPMENT
## Repository
http://github.com/vti/pocketio
# CREDITS
Socket.IO author(s) and contributors.
Jens Gassmann
Uwe Voelker
Oskari Okko Ojala
Jason May
Michael FiG
Peter Stuifzand
tokubass
mvgrimes
# AUTHOR
Viacheslav Tykhanovskyi, `
[email protected]`.
# COPYRIGHT AND LICENSE
Copyright (C) 2011-2013, Viacheslav Tykhanovskyi
This program is free software, you can redistribute it and/or modify it under
the terms of the Artistic License version 2.0.