File Coverage

blib/lib/DJabberd/Plugin/Balancer.pm
Criterion Covered Total %
statement 18 20 90.0
branch n/a
condition n/a
subroutine 6 7 85.7
pod n/a
total 24 27 88.8


line stmt bran cond sub pod time code
1             { package DJabberd::Plugin::Balancer;
2             our $VERSION = '0.1';
3 1     1   1115 use strict;
  1         2  
  1         46  
4 1     1   6 use warnings;
  1         2  
  1         41  
5 1     1   14 use base qw(DJabberd::Plugin);
  1         1  
  1         4660  
6              
7             sub register {
8 0     0     my ($self, $vhost) = @_;
9             # here we just re-bless $vhost
10 0           bless $vhost, 'DJabberd::Plugin::Balancer::VHost';
11             }
12             };
13             { package DJabberd::Plugin::Balancer::VHost;
14 1     1   9 use strict;
  1         2  
  1         50  
15 1     1   6 use warnings;
  1         3  
  1         53  
16 1     1   5 use base qw(DJabberd::VHost);
  1         2  
  1         1126  
17              
18             sub register_jid {
19             my ($self, $jid, $conn, $cb) = @_;
20             my $fullstr = $jid->as_string;
21              
22             if (exists $self->{jid2sock}{$fullstr}) {
23             $cb->error("conflict");
24              
25             } else {
26             # XXX: $jid doesn't provide a sane API, but
27             # we are going to get inside anyway.
28             my $res = $jid->resource;
29             $res .= '#'.$conn->{id};
30             $jid->[DJabberd::JID::RES()] = $res;
31             $jid->[DJabberd::JID::AS_STRING()] = undef;
32             $jid->[DJabberd::JID::AS_BSTRING()] = undef;
33             $jid->[DJabberd::JID::AS_STREXML()] = undef;
34              
35             $self->{balancejid}{$fullstr} ||= [];
36             push @{$self->{balancejid}{$fullstr}}, $jid->as_string;
37              
38             return $self->SUPER::register_jid($jid, $conn, $cb);
39             }
40             }
41              
42             sub find_jid {
43             my ($self, $jid) = @_;
44             my $fullstr = $jid;
45              
46             if (exists $self->{balancejid}{$fullstr}) {
47             my $item = int(rand(scalar(@{$self->{balancejid}{$fullstr}})));
48             return $self->SUPER::find_jid($self->{balancejid}{$fullstr}[$item]);
49             } else {
50             return $self->SUPER::find_jid($jid);
51             }
52             }
53              
54             sub unregister_jid {
55             my ($self, $jid, $conn) = @_;
56             my $fullstr = $jid->as_string;
57             my $balancejid = $fullstr;
58             if ($balancejid =~ s/#[^#]+$//) {
59             if (exists $self->{balancejid}{$balancejid}) {
60             @{$self->{balancejid}{$balancejid}} =
61             grep { $fullstr ne $_ }
62             @{$self->{balancejid}{$balancejid}};
63             }
64             }
65             return $self->SUPER::unregister_jid($jid, $conn);
66             }
67              
68             };
69              
70             __PACKAGE__
71              
72             __END__