X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=scpubgit%2FObject-Remote.git;a=blobdiff_plain;f=lib%2FObject%2FRemote%2FRole%2FConnector.pm;h=6da4a9c5331a2f1497f8bea7088c00d8534bb138;hp=16f0d5236eb0643c855931130cb4342d3ee82865;hb=cc670b3044ce1fc9389d9845ee5ea91459f2612e;hpb=8ba4f2e3adb9a1fda64b463b34a4306c9034359a diff --git a/lib/Object/Remote/Role/Connector.pm b/lib/Object/Remote/Role/Connector.pm index 16f0d52..6da4a9c 100644 --- a/lib/Object/Remote/Role/Connector.pm +++ b/lib/Object/Remote/Role/Connector.pm @@ -1,15 +1,49 @@ package Object::Remote::Role::Connector; use Module::Runtime qw(use_module); +use Object::Remote::Future; use Moo::Role; requires '_open2_for'; +has timeout => (is => 'ro', default => sub { { after => 10 } }); + sub connect { my $self = shift; - my %args; - @args{qw(send_to_fh receive_from_fh child_pid)} = $self->_open2_for(@_); - return use_module('Object::Remote::Connection')->new(\%args); + my ($send_to_fh, $receive_from_fh, $child_pid) = $self->_open2_for(@_); + my $channel = use_module('Object::Remote::ReadChannel')->new( + fh => $receive_from_fh + ); + return future { + my $f = shift; + $channel->on_line_call(sub { + if ($_[0] eq "Shere") { + $f->done( + use_module('Object::Remote::Connection')->new( + send_to_fh => $send_to_fh, + read_channel => $channel, + child_pid => $child_pid, + ) + ); + } else { + $f->fail("Expected Shere from remote but received: $_[0]"); + } + undef($channel); + }); + $channel->on_close_call(sub { + $f->fail("Channel closed without seeing Shere: $_[0]"); + undef($channel); + }); + Object::Remote->current_loop + ->watch_time( + %{$self->timeout}, + code => sub { + $f->fail("Connection timed out") unless $f->is_ready; + undef($channel); + } + ); + $f; + } } 1;