AnyEvent-Chromi
view release on metacpan or search on metacpan
examples/server.pl view on Meta::CPAN
#!/usr/bin/perl -w
use 5.014;
use Log::Any qw($log);
use Log::Any::Adapter;
use Log::Dispatch;
use AnyEvent;
use AnyEvent::Socket;
use AnyEvent::Handle;
use Protocol::WebSocket::Handshake::Server;
use Protocol::WebSocket::Frame;
use JSON::XS;
use URI::Escape;
my $tcp_server;
my %clients;
my %chromi;
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");
}
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
( run in 2.499 seconds using v1.01-cache-2.11-cpan-bbb979687b5 )