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); |
6 | use Moo; |
7 | |
8 | has read_fh => (is => 'ro', required => 1); |
9 | has write_fh => (is => 'ro', required => 1); |
10 | |
11 | sub BUILD { shift->write_fh->autoflush(1); } |
12 | |
77bf1d9b |
13 | sub read_message { |
36cf3bcb |
14 | my ($self) = @_; |
77bf1d9b |
15 | if (defined(my $line = readline($self->read_fh))) { |
36cf3bcb |
16 | if (my $unpacked = $self->_unpack_line($line)) { |
17 | return $unpacked; |
18 | } |
19 | } |
20 | } |
21 | |
22 | sub _unpack_line { |
23 | my ($self, $line) = @_; |
24 | my $data = eval { decode_json($line) }; |
25 | unless ($data) { |
77bf1d9b |
26 | $self->write_message(mistake => invalid_json => $@||'No data and no exception'); |
36cf3bcb |
27 | return; |
28 | } |
29 | unless (ref($data) eq 'ARRAY') { |
77bf1d9b |
30 | $self->write_message(mistake => message_format => "Not an ARRAY"); |
36cf3bcb |
31 | return; |
32 | } |
33 | unless (@$data > 0) { |
77bf1d9b |
34 | $self->write_message(mistake => message_format => "Empty request array"); |
36cf3bcb |
35 | return; |
36 | } |
37 | $data; |
38 | } |
39 | |
77bf1d9b |
40 | sub write_message { |
36cf3bcb |
41 | my ($self, @msg) = @_; |
42 | my $json = eval { encode_json(\@msg) }; |
43 | unless ($json) { |
77bf1d9b |
44 | $self->_raw_write_message( |
36cf3bcb |
45 | encode_json( |
77bf1d9b |
46 | [ failure => invalid_message => $@||'No data and no exception' ] |
36cf3bcb |
47 | ) |
48 | ); |
857f4834 |
49 | return; |
36cf3bcb |
50 | } |
77bf1d9b |
51 | $self->_raw_write_message($json); |
36cf3bcb |
52 | } |
53 | |
77bf1d9b |
54 | sub _raw_write_message { |
36cf3bcb |
55 | my ($self, $raw) = @_; |
31a246e4 |
56 | #warn "Sending: ${raw}\n"; |
36cf3bcb |
57 | print { $self->write_fh } $raw."\n"; |
58 | } |
59 | |
60 | 1; |