proxy dies() when a method is invoked and the handle is not valid; add 2 more exclusi...
[scpubgit/Object-Remote.git] / lib / Object / Remote / Role / Connector.pm
CommitLineData
47c83a13 1package Object::Remote::Role::Connector;
2
84b04178 3use Module::Runtime qw(use_module);
12fb4a80 4use Object::Remote::Future;
29d4ad76 5use Object::Remote::Logging qw(:log :dlog router);
47c83a13 6use Moo::Role;
7
8requires '_open2_for';
9
2dc23780 10has timeout => (is => 'ro', default => sub { 10 });
498c4ad5 11
29d4ad76 12BEGIN { router()->exclude_forwarding; }
13
47c83a13 14sub connect {
15 my $self = shift;
bd20b1bf 16 Dlog_debug { "Preparing to create connection with args of: $_" } @_;
12fb4a80 17 my ($send_to_fh, $receive_from_fh, $child_pid) = $self->_open2_for(@_);
18 my $channel = use_module('Object::Remote::ReadChannel')->new(
19 fh => $receive_from_fh
20 );
21 return future {
0511910e 22 log_trace { "Initializing connection for child pid '$child_pid'" };
12fb4a80 23 my $f = shift;
24 $channel->on_line_call(sub {
25 if ($_[0] eq "Shere") {
0511910e 26 log_trace { "Received 'Shere' from child pid '$child_pid'; setting done handler to create connection" };
12fb4a80 27 $f->done(
28 use_module('Object::Remote::Connection')->new(
29 send_to_fh => $send_to_fh,
30 read_channel => $channel,
31 child_pid => $child_pid,
32 )
33 );
34 } else {
0511910e 35 log_warn { "'Shere' was not found in connection data for child pid '$child_pid'" };
12fb4a80 36 $f->fail("Expected Shere from remote but received: $_[0]");
37 }
38 undef($channel);
39 });
40 $channel->on_close_call(sub {
8ed52376 41 log_trace { "Connection has been closed" };
12fb4a80 42 $f->fail("Channel closed without seeing Shere: $_[0]");
43 undef($channel);
44 });
0511910e 45 log_trace { "initialized events on channel for child pid '$child_pid'; creating timeout" };
12fb4a80 46 Object::Remote->current_loop
47 ->watch_time(
2dc23780 48 after => $self->timeout,
12fb4a80 49 code => sub {
7985ed9e 50 Dlog_trace {"Connection timeout timer has fired for child pid '$child_pid'; is_ready: $_" } $f->is_ready;
0511910e 51 unless($f->is_ready) {
52 log_warn { "Connection with child pid '$child_pid' has timed out" };
7985ed9e 53 $f->fail("Connection timed out") unless $f->is_ready;
0511910e 54 }
12fb4a80 55 undef($channel);
07105aca 56
12fb4a80 57 }
58 );
0511910e 59 log_trace { "connection for child pid '$child_pid' has been initialized" };
12fb4a80 60 $f;
61 }
47c83a13 62}
63
641;