AnyEvent-Handle-ZeroMQ

 view release on metacpan or  search on metacpan

lib/AnyEvent/Handle/ZeroMQ/Dealer.pm  view on Meta::CPAN

=head1 METHODS

=head2 new( socket => ..., on_drain => ... )

Get an AnyEvent::Handle::ZeroMQ::Dealer instance

=cut

sub new {
    my $class = shift;
    my $self = $class->SUPER::new(@_);

    $self->[DEALER] = [];
    $self->[DEALER][SLOT] = [];
    return $self;
}

sub _dealer_read_cb {
    my($self, $msgs) = @_;

    my $n = unpack 'V', shift(@$msgs)->data;

    my $cb = delete $self->[DEALER][SLOT][$n];
    if( !$cb ) {
	$self->SUPER::push_read(\&_dealer_read_cb);
	return;
    }

    0 while( @$msgs && shift(@$msgs)->size );
    $cb->($self, $msgs);
}

=head2 push_write( request_data(array_ref), cb(hdl, reply_data(array_ref) )

=cut

sub push_write {
    my($self, $msgs, $cb) = @_;

    my $n = 0;
    ++$n while $self->[DEALER][SLOT][$n];
    $self->[DEALER][SLOT][$n] = $cb;

    unshift @$msgs, pack('V', $n), '';

    $self->SUPER::push_write($msgs);
    $self->SUPER::push_read(\&_dealer_read_cb);
}

=head2 push_read

Don't use this.

=cut

sub push_read {
    use Carp;

lib/AnyEvent/Handle/ZeroMQ/Router.pm  view on Meta::CPAN

=head1 METHODS

=head2 new( socket => ..., on_drain => ... )

get an AnyEvent::Handle::ZeroMQ::Dealer instance

=cut

#sub new {
#    my $class = shift;
#    my $self = $class->SUPER::new(@_);
#}

=head2 push_read( cb(hdl, request_data(array_ref), reply_cb( reply_data(array_ref) ) ) )

=cut

sub push_read {
    my($self, $cb) = @_;

    $self->SUPER::push_read( sub {
	my($self, $msgs) = @_;

	my $i = 0;
	++$i while( $msgs->[$i]->size );
	my @header = splice @$msgs, 0, $i;
	shift @$msgs;

	$cb->($self, $msgs, sub {
	    my($msgs) = @_;
	    unshift @$msgs, @header, '';
	    $self->SUPER::push_write($msgs);
	});
    } );
}

=head2 push_write

Don't use this.

=cut



( run in 0.588 second using v1.01-cache-2.11-cpan-49f99fa48dc )