AnyEvent-Chromi
view release on metacpan or search on metacpan
examples/server.pl view on Meta::CPAN
else {
$log->warning("connection error: $message");
}
}
);
$handle->on_eof(
sub {
$log->info("disconnected: $host:$port");
delete $clients{$handle};
delete $chromi{$handle};
}
);
$handle->on_read(
sub {
my $chunk = $handle->{rbuf};
$handle->{rbuf} = undef;
# 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");
}
}
}
);
};
}
sub main()
{
my $ld_log = Log::Dispatch->new(
outputs => [
[ 'Syslog', min_level => 'info', ident => 'chrome-siteshow' ],
[ 'Screen', min_level => 'debug', newline => 1 ],
]
);
Log::Any::Adapter->set( 'Dispatch', dispatcher => $ld_log );
$log->info("starting up");
my $cv = AnyEvent->condvar;
start_server();
$cv->wait();
}
main;
( run in 1.081 second using v1.01-cache-2.11-cpan-39bf76dae61 )