X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FTak%2FJSONChannel.pm;h=fc307417b3cc2548d9f4ef89843cef7f88f13269;hb=fe725d6e99834f26f20ce3f78eda9591c0d4a7d1;hp=fd3e7b53ab1f08934c2e16360e868743fbcd0d96;hpb=857f4834b4de8b02ca9c0af4a3fabfbf21938e79;p=scpubgit%2FTak.git diff --git a/lib/Tak/JSONChannel.pm b/lib/Tak/JSONChannel.pm index fd3e7b5..fc30741 100644 --- a/lib/Tak/JSONChannel.pm +++ b/lib/Tak/JSONChannel.pm @@ -3,19 +3,30 @@ package Tak::JSONChannel; use JSON::PP qw(encode_json decode_json); use IO::Handle; use Scalar::Util qw(weaken); +use Log::Contextual qw(:log); use Moo; has read_fh => (is => 'ro', required => 1); has write_fh => (is => 'ro', required => 1); +has _read_buf => (is => 'ro', default => sub { my $x = ''; \$x }); + sub BUILD { shift->write_fh->autoflush(1); } -sub receive { - my ($self) = @_; - while (my $line = readline($self->read_fh)) { - if (my $unpacked = $self->_unpack_line($line)) { - return $unpacked; +sub read_messages { + my ($self, $cb) = @_; + my $rb = $self->_read_buf; + if (sysread($self->read_fh, $$rb, 1024, length($$rb)) > 0) { + while ($$rb =~ s/^(.*)\n//) { + my $line = $1; + log_trace { "Received $line" }; + if (my $unpacked = $self->_unpack_line($line)) { + $cb->(@$unpacked); + } } + } else { + log_trace { "Closing" }; + $cb->('close', 'channel'); } } @@ -23,37 +34,40 @@ sub _unpack_line { my ($self, $line) = @_; my $data = eval { decode_json($line) }; unless ($data) { - $self->send(MISTAKE => invalid_json => $@||'No data and no exception'); + $self->write_message(mistake => invalid_json => $@||'No data and no exception'); return; } unless (ref($data) eq 'ARRAY') { - $self->send(MISTAKE => message_format => "Not an ARRAY"); + $self->write_message(mistake => message_format => "Not an ARRAY"); return; } unless (@$data > 0) { - $self->send(MISTAKE => message_format => "Empty request array"); + $self->write_message(mistake => message_format => "Empty request array"); return; } $data; } -sub send { +sub write_message { my ($self, @msg) = @_; my $json = eval { encode_json(\@msg) }; unless ($json) { - $self->_raw_send( + $self->_raw_write_message( encode_json( - [ FAILURE => invalid_message => $@||'No data and no exception' ] + [ failure => invalid_message => $@||'No data and no exception' ] ) ); return; } - $self->_raw_send($json); + log_trace { "Sending: $json" }; + $self->_raw_write_message($json); } -sub _raw_send { +sub _raw_write_message { my ($self, $raw) = @_; - print { $self->write_fh } $raw."\n"; +#warn "Sending: ${raw}\n"; + print { $self->write_fh } $raw."\n" + or log_error { "Error writing: $!" }; } 1;