AnyEvent-Chromi
view release on metacpan or search on metacpan
examples/server.pl view on Meta::CPAN
my %requests;
sub start_server
{
$tcp_server = AnyEvent::Socket::tcp_server undef, 7441, sub {
my ($fh, $host, $port) = @_;
$log->info("connected (host: $host, port: $port)");
my $ws_handshake = Protocol::WebSocket::Handshake::Server->new;
my $ws_frame = Protocol::WebSocket::Frame->new;
my $handle = AnyEvent::Handle->new(fh => $fh);
$clients{$handle} = { host => $host, port => $port };
$handle->on_error(
sub {
my ($handle, $fatal, $message);
if($fatal) {
$log->error("connection error: $message");
}
examples/server.pl view on Meta::CPAN
# Handshake
if (!$ws_handshake->is_done) {
$ws_handshake->parse($chunk);
if ($ws_handshake->is_done) {
$handle->push_write($ws_handshake->to_string);
}
}
$ws_handshake->is_done() or return;
# Data
$ws_frame->append($chunk);
while (my $message = $ws_frame->next) {
if($message =~ /^Chromi (\d+) (\w+) (.*)$/) {
# Chrome to Client
my ($id, $status, $reply) = ($1, $2, $3);
if(defined $requests{$id}) {
my $c = $requests{$id};
if(defined $clients{$c}) {
my $frame = Protocol::WebSocket::Frame->new($message);
$log->debug("sending reply for $id");
$c->push_write($frame->to_bytes);
}
}
delete $requests{$id};
}
elsif($message =~ /^Chromi \S+ info connected/) {
$log->info("chrome detected (host: $host, port: $port)");
$chromi{$handle}{handle} = $handle;
delete $clients{$handle};
}
elsif($message =~ /^Chromi \S+ info heartbeat/) {
}
elsif($message =~ /^chromi (\d+) \S+ .*$/) {
# Client to Chrome
$log->info("received: $message");
# register who made the request
$requests{$1} = $handle;
# chrome isn't connected
if(not scalar keys %chromi) {
my $reply = "Chromi $1 error " . uri_escape(encode_json({ error => 'chrome not connected'}));
my $frame = Protocol::WebSocket::Frame->new($reply);
$handle->push_write($frame->to_bytes);
}
else {
for my $key (keys %chromi) {
my $c = $chromi{$key}{handle};
my $frame = Protocol::WebSocket::Frame->new($message);
$c->push_write($frame->to_bytes);
}
}
}
else {
$log->info("other: $message");
}
}
}
);
};
lib/AnyEvent/Chromi.pm view on Meta::CPAN
my ($self, $method, $args, $cb) = @_;
if(not $self->is_connected) {
$log->warning("can't call $method: not connected");
return;
}
my $id = int(rand(100000000));
my $msg = "chromi $id $method";
if($args) {
$msg .= " " . uri_escape(encode_json($args));
}
my $frame = Protocol::WebSocket::Frame->new($msg);
if($cb) {
$self->{callbacks}{$id} = $cb;
}
$self->{handle}->push_write($frame->to_bytes);
}
sub is_connected
{
my ($self) = @_;
return $self->{connected};
}
sub _setup_connection
{
my ($self, $fh) = @_;
my $ws_handshake = $self->{mode} eq 'client' ? Protocol::WebSocket::Handshake::Client->new(url => 'ws://localhost') :
Protocol::WebSocket::Handshake::Server->new;
my $ws_frame = Protocol::WebSocket::Frame->new;
$self->{handle} = AnyEvent::Handle->new(fh => $fh);
$self->{handle}->on_error(
sub {
my ($handle, $fatal, $message);
if($fatal) {
$log->error("connection fatal error: $message");
$self->{connected} = 0;
}
lib/AnyEvent/Chromi.pm view on Meta::CPAN
if($self->{on_connect}) {
my $cb = $self->{on_connect};
&$cb($self);
}
}
}
$self->{connected} or return;
# Post-Handshake
$ws_frame->append($chunk);
while (my $message = $ws_frame->next) {
if($message =~ /^Chromi (\d+) (\w+) (.*)$/) {
my ($id, $status, $reply) = ($1, $2, $3);
if($self->{callbacks}{$id}) {
$reply = uri_unescape($reply);
if($reply =~ /^\[(.*)\]$/s) {
&{$self->{callbacks}{$id}}($status, decode_json($1));
}
else {
die "error: $reply\n";
}
( run in 1.121 second using v1.01-cache-2.11-cpan-df04353d9ac )