Provided by: libmojolicious-perl_4.63+dfsg-1_all bug

NAME

       Mojo::Transaction::WebSocket - WebSocket transaction

SYNOPSIS

         use Mojo::Transaction::WebSocket;

         # Send and receive WebSocket messages
         my $ws = Mojo::Transaction::WebSocket->new;
         $ws->send('Hello World!');
         $ws->on(message => sub {
           my ($ws, $msg) = @_;
           say "Message: $msg";
         });
         $ws->on(finish => sub {
           my ($ws, $code, $reason) = @_;
           say "WebSocket closed with status $code.";
         });

DESCRIPTION

       Mojo::Transaction::WebSocket is a container for WebSocket transactions as described in RFC
       6455. Note that 64bit frames require a Perl with support for quads or they are limited to
       32bit.

EVENTS

       Mojo::Transaction::WebSocket inherits all events from Mojo::Transaction and can emit the
       following new ones.

   binary
         $ws->on(binary => sub {
           my ($ws, $bytes) = @_;
           ...
         });

       Emitted when a complete WebSocket binary message has been received.

         $ws->on(binary => sub {
           my ($ws, $bytes) = @_;
           say "Binary: $bytes";
         });

   drain
         $ws->on(drain => sub {
           my $ws = shift;
           ...
         });

       Emitted once all data has been sent.

         $ws->on(drain => sub {
           my $ws = shift;
           $ws->send(time);
         });

   finish
         $ws->on(finish => sub {
           my ($ws, $code, $reason) = @_;
           ...
         });

       Emitted when transaction is finished.

   frame
         $ws->on(frame => sub {
           my ($ws, $frame) = @_;
           ...
         });

       Emitted when a WebSocket frame has been received.

         $ws->unsubscribe('frame');
         $ws->on(frame => sub {
           my ($ws, $frame) = @_;
           say "FIN: $frame->[0]";
           say "RSV1: $frame->[1]";
           say "RSV2: $frame->[2]";
           say "RSV3: $frame->[3]";
           say "Opcode: $frame->[4]";
           say "Payload: $frame->[5]";
         });

   json
         $ws->on(json => sub {
           my ($ws, $json) = @_;
           ...
         });

       Emitted when a complete WebSocket message has been received, all text and binary messages
       will be automatically JSON decoded. Note that this event only gets emitted when it has at
       least one subscriber.

         $ws->on(json => sub {
           my ($ws, $hash) = @_;
           say "Message: $hash->{msg}";
         });

   message
         $ws->on(message => sub {
           my ($ws, $msg) = @_;
           ...
         });

       Emitted when a complete WebSocket message has been received, text messages will be
       automatically decoded. Note that this event only gets emitted when it has at least one
       subscriber.

         $ws->on(message => sub {
           my ($ws, $msg) = @_;
           say "Message: $msg";
         });

   text
         $ws->on(text => sub {
           my ($ws, $bytes) = @_;
           ...
         });

       Emitted when a complete WebSocket text message has been received.

         $ws->on(text => sub {
           my ($ws, $bytes) = @_;
           say "Text: $bytes";
         });

ATTRIBUTES

       Mojo::Transaction::WebSocket inherits all attributes from Mojo::Transaction and implements
       the following new ones.

   compressed
         my $bool = $ws->compressed;
         $ws      = $ws->compressed($bool);

       Compress messages with "permessage-deflate" extension.

   context_takeover
         my $bool = $ws->context_takeover;
         $ws      = $ws->context_takeover($bool);

       Reuse LZ77 sliding window for "permessage-deflate" extension, defaults to true.

   handshake
         my $handshake = $ws->handshake;
         $ws           = $ws->handshake(Mojo::Transaction::HTTP->new);

       The original handshake transaction, defaults to a Mojo::Transaction::HTTP object.

   masked
         my $bool = $ws->masked;
         $ws      = $ws->masked($bool);

       Mask outgoing frames with XOR cipher and a random 32bit key.

   max_websocket_size
         my $size = $ws->max_websocket_size;
         $ws      = $ws->max_websocket_size(1024);

       Maximum WebSocket message size in bytes, defaults to the value of the
       MOJO_MAX_WEBSOCKET_SIZE environment variable or 262144.

METHODS

       Mojo::Transaction::WebSocket inherits all methods from Mojo::Transaction and implements
       the following new ones.

   new
         my $ws = Mojo::Transaction::WebSocket->new;

       Construct a new Mojo::Transaction::WebSocket object and subscribe to "frame" event with
       default message parser, which also handles "PING" and "CLOSE" frames automatically.

   build_frame
         my $bytes = $ws->build_frame($fin, $rsv1, $rsv2, $rsv3, $op, $payload);

       Build WebSocket frame.

         # Binary frame with FIN bit and payload
         say $ws->build_frame(1, 0, 0, 0, 2, 'Hello World!');

         # Text frame with payload but without FIN bit
         say $ws->build_frame(0, 0, 0, 0, 1, 'Hello ');

         # Continuation frame with FIN bit and payload
         say $ws->build_frame(1, 0, 0, 0, 0, 'World!');

         # Close frame with FIN bit and without payload
         say $ws->build_frame(1, 0, 0, 0, 8, '');

         # Ping frame with FIN bit and payload
         say $ws->build_frame(1, 0, 0, 0, 9, 'Test 123');

         # Pong frame with FIN bit and payload
         say $ws->build_frame(1, 0, 0, 0, 10, 'Test 123');

   build_message
         my $bytes = $ws->build_message({binary => $bytes});
         my $bytes = $ws->build_message({text   => $bytes});
         my $bytes = $ws->build_message({json   => {test => [1, 2, 3]}});
         my $bytes = $ws->build_message($chars);

       Build WebSocket message.

   client_challenge
         my $bool = $ws->client_challenge;

       Check WebSocket handshake challenge client-side, used to implement user agents.

   client_handshake
         $ws->client_handshake;

       Perform WebSocket handshake client-side, used to implement user agents.

   client_read
         $ws->client_read($data);

       Read data client-side, used to implement user agents.

   client_write
         my $bytes = $ws->client_write;

       Write data client-side, used to implement user agents.

   connection
         my $connection = $ws->connection;

       Connection identifier or socket.

   finish
         $ws = $ws->finish;
         $ws = $ws->finish(1000);
         $ws = $ws->finish(1003 => 'Cannot accept data!');

       Close WebSocket connection gracefully.

   is_websocket
         my $true = $ws->is_websocket;

       True.

   kept_alive
         my $kept_alive = $ws->kept_alive;

       Connection has been kept alive.

   local_address
         my $address = $ws->local_address;

       Local interface address.

   local_port
         my $port = $ws->local_port;

       Local interface port.

   parse_frame
         my $frame = $ws->parse_frame(\$bytes);

       Parse WebSocket frame.

         # Parse single frame and remove it from buffer
         my $frame = $ws->parse_frame(\$buffer);
         say "FIN: $frame->[0]";
         say "RSV1: $frame->[1]";
         say "RSV2: $frame->[2]";
         say "RSV3: $frame->[3]";
         say "Opcode: $frame->[4]";
         say "Payload: $frame->[5]";

   remote_address
         my $address = $ws->remote_address;

       Remote interface address.

   remote_port
         my $port = $ws->remote_port;

       Remote interface port.

   req
         my $req = $ws->req;

       Handshake request, usually a Mojo::Message::Request object.

   res
         my $res = $ws->res;

       Handshake response, usually a Mojo::Message::Response object.

   resume
         $ws = $ws->resume;

       Resume "handshake" transaction.

   send
         $ws = $ws->send({binary => $bytes});
         $ws = $ws->send({text   => $bytes});
         $ws = $ws->send({json   => {test => [1, 2, 3]}});
         $ws = $ws->send([$fin, $rsv1, $rsv2, $rsv3, $op, $payload]);
         $ws = $ws->send($chars);
         $ws = $ws->send($chars => sub {...});

       Send message or frame non-blocking via WebSocket, the optional drain callback will be
       invoked once all data has been written.

         # Send "Ping" frame
         $ws->send([1, 0, 0, 0, 9, 'Hello World!']);

   server_close
         $ws->server_close;

       Transaction closed server-side, used to implement web servers.

   server_handshake
         $ws->server_handshake;

       Perform WebSocket handshake server-side, used to implement web servers.

   server_read
         $ws->server_read($data);

       Read data server-side, used to implement web servers.

   server_write
         my $bytes = $ws->server_write;

       Write data server-side, used to implement web servers.

DEBUGGING

       You can set the MOJO_WEBSOCKET_DEBUG environment variable to get some advanced diagnostics
       information printed to "STDERR".

         MOJO_WEBSOCKET_DEBUG=1

SEE ALSO

       Mojolicious, Mojolicious::Guides, <http://mojolicio.us>.