1 package Tak::JSONChannel;
3 use JSON::PP qw(encode_json decode_json);
5 use Scalar::Util qw(weaken);
8 has read_fh => (is => 'ro', required => 1);
9 has write_fh => (is => 'ro', required => 1);
11 sub BUILD { shift->write_fh->autoflush(1); }
15 if (defined(my $line = readline($self->read_fh))) {
16 if (my $unpacked = $self->_unpack_line($line)) {
20 return [ 'close', 'channel' ];
25 my ($self, $line) = @_;
26 my $data = eval { decode_json($line) };
28 $self->write_message(mistake => invalid_json => $@||'No data and no exception');
31 unless (ref($data) eq 'ARRAY') {
32 $self->write_message(mistake => message_format => "Not an ARRAY");
36 $self->write_message(mistake => message_format => "Empty request array");
43 my ($self, @msg) = @_;
44 my $json = eval { encode_json(\@msg) };
46 $self->_raw_write_message(
48 [ failure => invalid_message => $@||'No data and no exception' ]
53 $self->_raw_write_message($json);
56 sub _raw_write_message {
57 my ($self, $raw) = @_;
58 #warn "Sending: ${raw}\n";
59 print { $self->write_fh } $raw."\n";