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 )