Commit | Line | Data |
36cf3bcb |
1 | package Tak::Router; |
2 | |
77bf1d9b |
3 | use Tak::MetaService; |
2791fd73 |
4 | use Scalar::Util qw(weaken); |
e56859c3 |
5 | use Log::Contextual qw(:log); |
36cf3bcb |
6 | use Moo; |
7 | |
31a246e4 |
8 | has services => (is => 'ro', default => sub { {} }); |
36cf3bcb |
9 | |
77bf1d9b |
10 | sub BUILD { |
11 | my ($self) = @_; |
12 | $self->register(meta => Tak::MetaService->new(router => $self)); |
13 | } |
14 | |
31a246e4 |
15 | sub start_request { |
16 | my ($self, $req, $target, @payload) = @_; |
2791fd73 |
17 | return $req->mistake("Reached router with no target") |
31a246e4 |
18 | unless $target; |
2791fd73 |
19 | return $req->failure("Reached router with invalid target ${target}") |
31a246e4 |
20 | unless my $next = $self->services->{$target}; |
21 | $next->start_request($req, @payload); |
36cf3bcb |
22 | } |
23 | |
24 | sub receive { |
31a246e4 |
25 | my ($self, $target, @payload) = @_; |
26 | return unless $target; |
e56859c3 |
27 | log_debug { "Message received for ${target}" }; |
28 | return log_info { "Discarded message to ${target}" } |
29 | unless my $next = $self->services->{$target}; |
31a246e4 |
30 | $next->receive(@payload); |
36cf3bcb |
31 | } |
32 | |
8b6c1f59 |
33 | sub register { |
34 | my ($self, $name, $service) = @_; |
31a246e4 |
35 | $self->services->{$name} = $service; |
36 | } |
37 | |
2791fd73 |
38 | sub register_weak { |
39 | my ($self, $name, $service) = @_; |
40 | weaken($self->services->{$name} = $service); |
41 | } |
42 | |
31a246e4 |
43 | sub deregister { |
44 | my ($self, $name) = @_; |
45 | delete $self->services->{$name} |
8b6c1f59 |
46 | } |
47 | |
542ab416 |
48 | sub clone_or_self { |
fe725d6e |
49 | my ($self) = @_; |
542ab416 |
50 | (ref $self)->new(services => { %{$self->services} }); |
fe725d6e |
51 | } |
52 | |
36cf3bcb |
53 | 1; |