1package DJabberd::Delivery::Local;
2use strict;
3use warnings;
4use base 'DJabberd::Delivery';
5
6sub run_before { ("DJabberd::Delivery::S2S") }
7
8sub deliver {
9    my ($self, $vhost, $cb, $stanza) = @_;
10    my $to = $stanza->to_jid                or return $cb->declined;
11
12    my @dconns;
13    my $find_bares = sub {
14        @dconns = grep { $_->is_available || $stanza->deliver_when_unavailable } $vhost->find_conns_of_bare($to)
15    };
16
17    if ($to->is_bare) {
18        $find_bares->();
19    } else {
20        my $dest;
21        if (($dest = $vhost->find_jid($to)) && ($dest->is_available || $stanza->deliver_when_unavailable)) {
22            push @dconns, $dest;
23        } else {
24            $find_bares->();
25        }
26    }
27
28    return $cb->declined unless @dconns;
29
30    $DJabberd::Stats::counter{deliver_local}++;
31
32    foreach my $c (@dconns) {
33        $c->send_stanza($stanza);
34    }
35
36    $cb->delivered;
37}
38
391;
40