package DJabberd::Delivery::Local;
use strict;
use warnings;
use base 'DJabberd::Delivery';
sub run_before { ("DJabberd::Delivery::S2S") }
sub deliver {
my ($self, $vhost, $cb, $stanza) = @_;
my $to = $stanza->to_jid or return $cb->declined;
my @dconns;
my $find_bares = sub {
@dconns = grep { $_->is_available || $stanza->deliver_when_unavailable } $vhost->find_conns_of_bare($to)
};
if ($to->is_bare) {
$find_bares->();
} else {
my $dest;
if (($dest = $vhost->find_jid($to)) && ($dest->is_available || $stanza->deliver_when_unavailable)) {
push @dconns, $dest;
} else {
$find_bares->();
}
}
return $cb->declined unless @dconns;
$DJabberd::Stats::counter{deliver_local}++;
foreach my $c (@dconns) {
$c->send_stanza($stanza);
}
$cb->delivered;
}
1;