File Coverage

blib/lib/Plack/Middleware/SocketIO/WebSocket.pm
Criterion Covered Total %
statement 18 57 31.5
branch 0 6 0.0
condition n/a
subroutine 6 10 60.0
pod 0 2 0.0
total 24 75 32.0


line stmt bran cond sub pod time code
1             package Plack::Middleware::SocketIO::WebSocket;
2              
3 1     1   5 use strict;
  1         2  
  1         25  
4 1     1   5 use warnings;
  1         1  
  1         30  
5              
6 1     1   4 use base 'Plack::Middleware::SocketIO::Base';
  1         1  
  1         70  
7              
8 1     1   699 use Protocol::WebSocket::Frame;
  1         2196  
  1         30  
9 1     1   749 use Protocol::WebSocket::Handshake::Server;
  1         19441  
  1         25  
10              
11 1     1   8 use Plack::Middleware::SocketIO::Handle;
  1         2  
  1         419  
12              
13 0     0 0   sub name {'websocket'}
14              
15             sub finalize {
16 0     0 0   my $self = shift;
17 0           my ($cb) = @_;
18              
19 0           my $fh = $self->req->env->{'psgix.io'};
20 0 0         return unless $fh;
21              
22 0           my $hs = Protocol::WebSocket::Handshake::Server->new_from_psgi($self->req->env);
23 0 0         return unless $hs->parse($fh);
24              
25 0 0         return unless $hs->is_done;
26              
27 0           my $handle = $self->_build_handle($fh);
28 0           my $frame = Protocol::WebSocket::Frame->new;
29              
30             return sub {
31 0     0     my $respond = shift;
32              
33             $handle->write(
34             $hs->to_string => sub {
35 0           my $handle = shift;
36              
37 0           my $conn = $self->add_connection(on_connect => $cb);
38              
39 0           $handle->heartbeat_timeout(10);
40 0           $handle->on_heartbeat(sub { $conn->send_heartbeat });
  0            
41              
42             $handle->on_read(
43             sub {
44 0           my $handle = shift;
45              
46 0           $frame->append($_[0]);
47              
48 0           while (my $message = $frame->next) {
49 0           $conn->read($message);
50             }
51             }
52 0           );
53              
54             $handle->on_eof(
55             sub {
56 0           $handle->close;
57              
58 0           $self->client_disconnected($conn);
59             }
60 0           );
61              
62             $handle->on_error(
63             sub {
64 0           $self->client_disconnected($conn);
65              
66 0           $handle->close;
67             }
68 0           );
69              
70             $conn->on_write(
71             sub {
72 0           my $conn = shift;
73 0           my ($message) = @_;
74              
75 0           $message = $self->_build_frame($message);
76              
77 0           $handle->write($message);
78             }
79 0           );
80              
81 0           $conn->send_id_message($conn->id);
82              
83 0           $self->client_connected($conn);
84             }
85 0           );
86 0           };
87             }
88              
89             sub _build_frame {
90 0     0     my $self = shift;
91 0           my ($message) = @_;
92              
93 0           return Protocol::WebSocket::Frame->new($message)->to_string;
94             }
95              
96             1;
97             __END__