logger setup, wait for node start before sending requests
[scpubgit/Tak.git] / lib / Tak / JSONChannel.pm
CommitLineData
36cf3bcb 1package Tak::JSONChannel;
2
3use JSON::PP qw(encode_json decode_json);
4use IO::Handle;
5use Scalar::Util qw(weaken);
7b71b06e 6use Log::Contextual qw(:log);
36cf3bcb 7use Moo;
8
9has read_fh => (is => 'ro', required => 1);
10has write_fh => (is => 'ro', required => 1);
11
12sub BUILD { shift->write_fh->autoflush(1); }
13
77bf1d9b 14sub read_message {
36cf3bcb 15 my ($self) = @_;
77bf1d9b 16 if (defined(my $line = readline($self->read_fh))) {
7b71b06e 17 log_trace { "Received $line" };
36cf3bcb 18 if (my $unpacked = $self->_unpack_line($line)) {
19 return $unpacked;
20 }
986f5290 21 } else {
22 return [ 'close', 'channel' ];
36cf3bcb 23 }
24}
25
26sub _unpack_line {
27 my ($self, $line) = @_;
28 my $data = eval { decode_json($line) };
29 unless ($data) {
77bf1d9b 30 $self->write_message(mistake => invalid_json => $@||'No data and no exception');
36cf3bcb 31 return;
32 }
33 unless (ref($data) eq 'ARRAY') {
77bf1d9b 34 $self->write_message(mistake => message_format => "Not an ARRAY");
36cf3bcb 35 return;
36 }
37 unless (@$data > 0) {
77bf1d9b 38 $self->write_message(mistake => message_format => "Empty request array");
36cf3bcb 39 return;
40 }
41 $data;
42}
43
77bf1d9b 44sub write_message {
36cf3bcb 45 my ($self, @msg) = @_;
46 my $json = eval { encode_json(\@msg) };
47 unless ($json) {
77bf1d9b 48 $self->_raw_write_message(
36cf3bcb 49 encode_json(
77bf1d9b 50 [ failure => invalid_message => $@||'No data and no exception' ]
36cf3bcb 51 )
52 );
857f4834 53 return;
36cf3bcb 54 }
7b71b06e 55 log_trace { "Sending: $json" };
77bf1d9b 56 $self->_raw_write_message($json);
36cf3bcb 57}
58
77bf1d9b 59sub _raw_write_message {
36cf3bcb 60 my ($self, $raw) = @_;
31a246e4 61#warn "Sending: ${raw}\n";
36cf3bcb 62 print { $self->write_fh } $raw."\n";
63}
64
651;