File Coverage

blib/lib/SignalWire/Agents/Relay/Message.pm
Criterion Covered Total %
statement 32 49 65.3
branch 10 20 50.0
condition 1 8 12.5
subroutine 7 9 77.7
pod 0 5 0.0
total 50 91 54.9


line stmt bran cond sub pod time code
1             package SignalWire::Agents::Relay::Message;
2 3     3   138052 use strict;
  3         6  
  3         148  
3 3     3   16 use warnings;
  3         6  
  3         234  
4 3     3   647 use Moo;
  3         10345  
  3         19  
5              
6 3     3   3373 use SignalWire::Agents::Relay::Constants qw(MESSAGE_TERMINAL_STATES);
  3         8  
  3         2688  
7              
8             has 'message_id' => ( is => 'ro', required => 1 );
9             has 'context' => ( is => 'rw', default => sub { '' } );
10             has 'direction' => ( is => 'rw', default => sub { '' } );
11             has 'from_number' => ( is => 'rw', default => sub { '' } );
12             has 'to_number' => ( is => 'rw', default => sub { '' } );
13             has 'body' => ( is => 'rw', default => sub { '' } );
14             has 'media' => ( is => 'rw', default => sub { [] } );
15             has 'segments' => ( is => 'rw', default => sub { 0 } );
16             has 'state' => ( is => 'rw', default => sub { '' } );
17             has 'reason' => ( is => 'rw', default => sub { '' } );
18             has 'tags' => ( is => 'rw', default => sub { [] } );
19              
20             has 'completed' => ( is => 'rw', default => sub { 0 } );
21             has 'result' => ( is => 'rw', default => sub { undef } );
22              
23             has '_on_completed' => ( is => 'rw', default => sub { undef } );
24             has '_on_event' => ( is => 'rw', default => sub { [] } );
25              
26             # Check if message has reached a terminal state
27             sub is_done {
28 10     10 0 5070 my ($self) = @_;
29 10         79 return $self->completed;
30             }
31              
32             # Register on_completed callback
33             sub on_completed {
34 2     2 0 16 my ($self, $cb) = @_;
35 2 50       8 if ($cb) {
36 2         6 $self->_on_completed($cb);
37 2 50       8 if ($self->completed) {
38 0         0 eval { $cb->($self) };
  0         0  
39 0 0       0 warn "Message on_completed callback error: $@" if $@;
40             }
41 2         5 return $self;
42             }
43 0         0 return $self->_on_completed;
44             }
45              
46             # Register event listener
47             sub on {
48 0     0 0 0 my ($self, $cb) = @_;
49 0         0 push @{$self->_on_event}, $cb;
  0         0  
50 0         0 return $self;
51             }
52              
53             # Blocking wait
54             sub wait {
55 0     0 0 0 my ($self, %opts) = @_;
56 0   0     0 my $timeout = $opts{timeout} || 30;
57 0         0 my $start = time();
58 0   0     0 while (!$self->completed && (time() - $start) < $timeout) {
59 0         0 select(undef, undef, undef, 0.1);
60             }
61 0         0 return $self->result;
62             }
63              
64             # Handle a messaging.state event
65             sub dispatch_event {
66 9     9 0 29 my ($self, $event) = @_;
67              
68 9 50       54 my $message_state = $event->can('message_state') ? $event->message_state : '';
69 9 50       37 $self->state($message_state) if $message_state;
70              
71             # Update fields from event
72 9 50 33     51 $self->reason($event->reason) if $event->can('reason') && $event->reason;
73              
74             # Fire event callbacks
75 9         14 for my $cb (@{$self->_on_event}) {
  9         26  
76 0         0 eval { $cb->($self, $event) };
  0         0  
77 0 0       0 warn "Message event callback error: $@" if $@;
78             }
79              
80             # Check for terminal state
81 9 100       30 if (MESSAGE_TERMINAL_STATES->{$message_state}) {
82 5         11 $self->completed(1);
83 5         14 $self->result($event);
84 5 100       16 if (my $cb = $self->_on_completed) {
85 2         3 eval { $cb->($self) };
  2         5  
86 2 50       8 warn "Message on_completed callback error: $@" if $@;
87             }
88             }
89             }
90              
91             1;