AnyEvent-JSONRPC

 view release on metacpan or  search on metacpan

lib/AnyEvent/JSONRPC/TCP/Client.pm  view on Meta::CPAN

    my ($self, $json) = @_;

    my $response = JSON::RPC::Common::Procedure::Return->inflate( $json );
    my $d = delete $self->_callbacks->{ $response->id };
    unless ($d) {
        warn q/Invalid response from server/;
        return;
    }

    if (my $error = $response->error) {
        $d->croak($error);
    }
    else {
        $d->send($response->result);
    }
}

sub notify {
    my ($self, $method, @params) = @_;

    my $request = JSON::RPC::Common::Call->inflate (
        version => $self->version,
        method  => $method,
        params  => $self->_params( @params ),
    );

    if ($self->handler) {
        $self->handler->push_write( json => $request->deflate );
    }
    else {
        push @{ $self->_request_pool }, $request;
    }
}

sub _params {
    my $self = shift;

    my $param;
    if (scalar( @_ ) == 1) {
        $param = shift;
        
        $param = [ $param ] if (ref $param eq "HASH" and $self->version eq "1.0")
                            || not ref $param;
         
    } else {
        $param = [ @_ ];
    }

    return $param;
}

__PACKAGE__->meta->make_immutable;

__END__

=encoding utf-8

=begin stopwords

AnyEvent Coro JSONRPC Hostname Str TCP TCP-based
blockingly condvar condvars coroutine unix

=end stopwords

=head1 NAME

AnyEvent::JSONRPC::TCP::Client - Simple TCP-based JSONRPC client

=head1 SYNOPSIS

    use AnyEvent::JSONRPC::TCP::Client;
    
    my $client = AnyEvent::JSONRPC::TCP::Client->new(
        host => '127.0.0.1',
        port => 4423,
    );
    
    # blocking interface
    my $res = $client->call( echo => 'foo bar' )->recv; # => 'foo bar';
    
    # non-blocking interface
    $client->call( echo => 'foo bar' )->cb(sub {
        my $res = $_[0]->recv;  # => 'foo bar';
    });

=head1 DESCRIPTION

This module is client part of L<AnyEvent::JSONRPC>.

=head2 AnyEvent condvars

The main thing you have to remember is that all the data retrieval methods
return an AnyEvent condvar, C<$cv>.  If you want the actual data from the
request, there are a few things you can do.

You may have noticed that many of the examples in the SYNOPSIS call C<recv>
on the condvar.  You're allowed to do this under 2 circumstances:

=over 4

=item Either you're in a main program,

Main programs are "allowed to call C<recv> blockingly", according to the
author of L<AnyEvent>.

=item or you're in a Coro + AnyEvent environment.

When you call C<recv> inside a coroutine, only that coroutine is blocked
while other coroutines remain active.  Thus, the program as a whole is
still responsive.

=back

If you're not using Coro, and you don't want your whole program to block,
what you should do is call C<cb> on the condvar, and give it a coderef to
execute when the results come back.  The coderef will be given a condvar
as a parameter, and it can call C<recv> on it to get the data.  The final
example in the SYNOPSIS gives a brief example of this.

Also note that C<recv> will throw an exception if the request fails, so be
prepared to catch exceptions where appropriate.

Please read the L<AnyEvent> documentation for more information on the proper
use of condvars.

=head1 METHODS

=head2 new (%options)

Create new client object and return it.

    my $client = AnyEvent::JSONRPC::TCP::Client->new(
        host => '127.0.0.1',
        port => 4423,
        %options,
    );

Available options are:

=over 4

=item host => 'Str'

Hostname to connect. (Required)

You should set this option to "unix/" if you will set unix socket to port option.

=item port => 'Int | Str'

Port number or unix socket path to connect. (Required)

=item on_error => $cb->($handle, $fatal, $message)

Error callback code reference, which is called when some error occurred.
This has same arguments as L<AnyEvent::Handle>, and also act as handler's on_error callback.

Default is just croak.

If you want to set other options to handle object, use handler_options option showed below.

=item handler_options => 'HashRef'

This is passed to constructor of L<AnyEvent::Handle> that is used manage connection.

Default is empty.

=back

=head2 call ($method, @params)



( run in 0.320 second using v1.01-cache-2.11-cpan-501a3233654 )