use warnings; use strict; package AnyEvent::MessagePack; use AnyEvent::Handle; { package # hide from pause AnyEvent::Handle; use Data::MessagePack; register_write_type(msgpack => sub { my ($self, $data) = @_; Data::MessagePack->pack($data); }); register_read_type(msgpack => sub { my ($self, $cb) = @_; my $unpacker = Data::MessagePack::Unpacker->new(); sub { my $buffer = delete $_[0]{rbuf} or return; my $complete = 0; my $nread = 0; while(1) { $nread = $unpacker->execute($buffer, $nread); if ($unpacker->is_finished) { my $ret = $unpacker->data; $cb->( $_[0], $ret ); $unpacker->reset; $complete++; if( $nread >= length($buffer) ) { last; } } else { last; } } return $complete; } }); } 1; __END__ =head1 NAME AnyEvent::MessagePack - MessagePack stream serializer/deserializer for AnyEvent =head1 SYNOPSIS use AnyEvent::MessagePack; use AnyEvent::Handle; my $hdl = AnyEvent::Handle->new( # settings... ); $hdl->push_write(msgpack => [ 1,2,3 ]); $hdl->push_read(msgpack => sub { my ($hdl, $data) = @_; # your code here }); =head1 DESCRIPTION AE::MessagePack is MessagePack stream serializer/deserializer for AnyEvent. =head1 THANKS TO kazeburo++ =head1 SEE ALSO L, L