# NAME
MsgPack::RPC - MessagePack RPC client
# VERSION
version 1.0.0
# SYNOPSIS
```perl
use MsgPack::RPC;
my $rpc = MsgPack::RPC->new( io => '127.0.0.1:6666' );
$rpc->notify( 'something' => [ 'with', 'args' ] );
$rpc->request(
request_method => [ 'some', 'args' ]
)->on_done(sub{
my $resp = @_;
print "replied with: ", @_;
});
$rpc->loop;
```
# DESCRIPTION
`MsgPack::RPC` implements a MessagePack RPC client following
the protocol described at [https://github.com/msgpack-rpc/msgpack-rpc/blob/master/spec.md](https://github.com/msgpack-rpc/msgpack-rpc/blob/master/spec.md).
# METHODS
`MsgPack::RPC` consumes the role [MooseX::Role::Loggable](https://metacpan.org/pod/MooseX::Role::Loggable), and thus has all its
exported methods.
## new( %args )
The class constructor takes all the arguments for [MooseX::Role::Loggable](https://metacpan.org/pod/MooseX::Role::Loggable), plus the following:
- io( \[ $in\_fh, $out\_fh \] )
- io( $socket )
Required. Defines which IO on which the MessagePack messages will be received and sent.
The IO can be a local socket (e.g., `/tmp/rpc.socket` ), a network socket (e.g., `127.0.0.1:6543`),
or a pair of filehandles.
## io()
Returns the IO descriptor(s) used by the object.
## request( $method, $args, $id )
Sends the request. The `$id` is optional, and will be automatically
assigned from an internal self-incrementing list if not given.
Returns a promise that will be fulfilled once a response is received. The response can be either a success
or a failure, and in both case the fulfilled promise will be given whatever values are passed in the response.
```perl
$rpc->request( 'ls', [ '/home', '/tmp' ] )
->on_done(sub{ say for @_ })
->on_fail(sub{ die "couldn't read directories: ", @_ });
```
## notify( $method, $args )
Sends a notification.
## subscribe( $event\_name, \\&callback )
```perl
# 'ping' is a request
$rpc->subscribe( ping => sub($msg) {
$msg->response->done('pong');
});
# 'log' is a notification
$rpc->subscribe( log => sub($msg) {
print {$fh} @{$msg->args};
});
```
Register a callback for the given event. If a notification or a request matching the
is received, the callback will be called. The callback will be passed either a [MsgPack::RPC::Message](https://metacpan.org/pod/MsgPack::RPC::Message) (if triggered by
a notification) or
[MsgPack::RPC::Message::Request](https://metacpan.org/pod/MsgPack::RPC::Message::Request) object.
Events can have any number of callbacks assigned to them.
The subscription system is implemented using the [Beam::Emitter](https://metacpan.org/pod/Beam::Emitter) role.
## loop( $end\_condition )
Reads and process messages from the incoming stream, endlessly if not be given an optional `$end_condition`.
The end condition can be given a number of messages to read, or a promise that will end the loop once
fulfilled.
```perl
# loop until we get a response from our request
my $response = $rpc->request('add', [1,2] );
$response->on_done(sub{ print "sum is ", @_ });
$rpc->loop($response);
# loop 100 times
$rpc->loop(100);
```
# SEE ALSO
- [MsgPack::RPC::Message](https://metacpan.org/pod/MsgPack::RPC::Message)
- [MsgPack::RPC::Message::Request](https://metacpan.org/pod/MsgPack::RPC::Message::Request)
# AUTHOR
Yanick Champoux <yanick@cpan.org> [](http://coderwall.com/yanick)
# COPYRIGHT AND LICENSE
This software is copyright (c) 2015 by Yanick Champoux.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.