Juju

 view release on metacpan or  search on metacpan

lib/Juju/RPC.pm  view on Meta::CPAN

package Juju::RPC;
BEGIN {
  $Juju::RPC::AUTHORITY = 'cpan:ADAMJS';
}
$Juju::RPC::VERSION = '2.002';
# ABSTRACT: RPC Class


use Moose::Role;
use AnyEvent;
use AnyEvent::WebSocket::Client;
use JSON::PP;
use Function::Parameters;

has conn         => (is => 'rw');
has result       => (is => 'rw');
has is_connected => (is => 'rw');
has done         => (is => 'rw');
has request_id   => (is => 'rw', isa => 'Int', default => 1);

method BUILD {
    my $client = AnyEvent::WebSocket::Client->new(ssl_no_verify => 1);
    $self->conn($client->connect($self->endpoint)->recv);
    $self->is_connected(1);

    $self->conn->on(
        each_message => sub {
            my ($conn, $message) = @_;
            my $body = decode_json($message->decoded_body);
            if (defined($body->{Response})) {
                $self->done->send($body);
            }
        }
    );
}

method close {
    $self->conn->close;
}


method call($params, $cb = undef) {
    $self->done(AnyEvent->condvar);

    # Increment request id
    $self->request_id($self->request_id + 1);
    $params->{RequestId} = $self->request_id;
    $self->conn->send(encode_json($params));

    # non-blocking
    return $cb->($self->done->recv) if $cb;

    # blocking
    return $self->done->recv;
}

1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Juju::RPC - RPC Class

=head1 VERSION

version 2.002

=head1 DESCRIPTION

Contains methods and attributes not meant to be accessed directly but
utilized by the exposed API.

=head1 ATTRIBUTES

=head2 conn

Connection object



( run in 0.325 second using v1.01-cache-2.11-cpan-524268b4103 )