File: nginx-engine.pl

package info (click to toggle)
libprotocol-websocket-perl 0.26-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, sid, trixie
  • size: 428 kB
  • sloc: perl: 3,579; makefile: 10
file content (71 lines) | stat: -rw-r--r-- 1,636 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#!/usr/bin/env perl

use strict;
use warnings;

use Nginx::Engine;

use Protocol::WebSocket::Handshake::Server;
use Protocol::WebSocket::Frame;

ngxe_init("", 0, 64);

ngxe_server(
    "*" => 3000 => sub {
        my $id = shift;

        my $hs    = Protocol::WebSocket::Handshake::Server->new;
        my $frame = Protocol::WebSocket::Frame->new;

        ngxe_reader(
            $id => 0 => 5000 => sub {
                my ($id, $error, $recv, $send) = @_;

                return if $error;

                if (!$hs->is_done) {
                    $hs->parse($recv);

                    if (my $e = $hs->error) {
                        warn "Websocket error '$e'";
                        return;
                    }

                    if ($hs->is_done) {
                        $send .= $hs->to_string;
                    }
                }
                else {
                    $frame->append($recv);

                    while (my $message = $frame->next) {
                        $send .= $frame->new($message)->to_bytes;
                    }
                }

                $_[2] = $recv;
                $_[3] = $send;

                # switching to writer
                ngxe_reader_stop($id);
                ngxe_writer_start($id);
            }
        );

        ngxe_writer(
            $id => 0 => 1000 => "" => sub {
                my ($id, $error) = @_;

                return if $error;

                # switching back to reader
                ngxe_writer_stop($id);
                ngxe_reader_start($id);
            }
        );

        ngxe_reader_start($id);
    }
);

ngxe_loop;