Commit | Line | Data |
---|---|---|
36cf3bcb | 1 | package Tak::JSONChannel; |
2 | ||
3 | use JSON::PP qw(encode_json decode_json); | |
4 | use IO::Handle; | |
5 | use Scalar::Util qw(weaken); | |
7b71b06e | 6 | use Log::Contextual qw(:log); |
36cf3bcb | 7 | use Moo; |
8 | ||
9 | has read_fh => (is => 'ro', required => 1); | |
10 | has write_fh => (is => 'ro', required => 1); | |
11 | ||
12 | sub BUILD { shift->write_fh->autoflush(1); } | |
13 | ||
77bf1d9b | 14 | sub 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 | ||
26 | sub _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 | 44 | sub 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 | 59 | sub _raw_write_message { |
36cf3bcb | 60 | my ($self, $raw) = @_; |
31a246e4 | 61 | #warn "Sending: ${raw}\n"; |
36cf3bcb | 62 | print { $self->write_fh } $raw."\n"; |
63 | } | |
64 | ||
65 | 1; |