名前

Mojo::Transaction::WebSocket - WebSocketトランザクション

使い方

use Mojo::Transaction::WebSocket;

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

説明

Mojo::Transaction::WebSocketはRFC 6455 で説明されているWebSocketのトランザクションのコンテナです。 64bitフレームは64bit整数をサポートしたPerlが必要で、 もしもしなければ32bitに制限されることに注意してください。

イベント

Mojo::Transaction::WebSocketMojo::Transactionからすべてのイベントを継承しており、 次の新しいイベントを発生します。

binary

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

完全なWebSocketバイナリメッセージを受け取ったときに発生します。

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

drain

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

すべてのデータが送信されたときに一度だけ、発生します。

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

finish

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

Webソケット接続が閉じられたときに発生します。

frame

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

WebSocketのフレームが到達したときに発生します。

$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) = @_;
  ...
});

完全なWebSocketメッセージを受け取ったときに発生します。 すべてのテキストとバイナリのメッセージは 自動的にJSONにデコードされます。 このイベントは少なくとも一人の購読者が いるときだけ発生することに注意してください。

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

message

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

WebSocketのメッセージが到達したときに発行されます。 このイベントは少なくとも一人の購読者が いるときだけ発生することに注意してください。

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

text

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

完全なテキストメッセージを受け取ったときに発生します。

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

属性

Mojo::Transaction::WebSocketMojo::Transactionからすべての属性 を継承しており、次の新しい属性を実装しています。

compressed

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

permessage-deflate拡張でメッセージを圧縮します。

established

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

WebSocket接続の確立。

handshake

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

オリジナルのハンドシェイクのトランザクション。デフォルトはMojo::Transaction::HTTPオブジェクトです。

masked

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

XOR暗号文とランダムな32ビットのキーを持った外に出てゆくフレームのマスク。

max_websocket_size

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

WebSocketメッセージの最大バイトサイズ。 デフォルトは262144(256KB)。

メソッド

Mojo::Transaction::WebSocketMojo::Transaction のすべてのメソッドを継承しており、 次の新しいメソッドを実装しています。

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);z

WebSocketメッセージを構築します。

client_read

$ws = $ws->client_read($data);

クライアント側のWebSocketのデータを読み込みます。 ユーザーエージェントの実装に利用されます。

client_write

my $chunk = $ws->client_write;

クライアント側のデータを書き込みます。 ユーザーエージェントの実装に利用されます。

closed

$tx = $tx->closed;

Mojo::Transactionの"completed"と同じですが、すべてのトランザクションが送信されたことを示します。

connection

my $id = $ws->connection;

接続の識別子。

finish

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

WebSocketの接続を緩やかに終了する。

is_websocket

my $is_websocket = $ws->is_websocket;

真。

kept_alive

my $kept_alive = $ws->kept_alive;

ケプトアライブされている接続。

local_address

my $local_address = $ws->local_address;

ローカルインターフェースのアドレス。

local_port

my $local_port = $ws->local_port;

ローカルインターフェースのポート。

parse_message

$ws->parse_message([$fin, $rsv1, $rsv2, $rsv3, $op, $payload]);

WebSocketのメッセージを解析。

remote_address

my $remote_address = $ws->remote_address;

リモートインターフェースのアドレス。

remote_port

my $remote_port = $ws->remote_port;

リモートインターフェースのポート。

req

my $req = $ws->req;

ハンドシェイクリクエスト。通常はMojo::Message::Requestオブジェクト。

res

my $req = $ws->res;

ハンドシェイクのレスポンス。通所は[Mojo::Message::Responseオブジェクト。

resume

$ws = $ws->resume;

ハンドシェイクトランザクションを再開します。

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 {...});

WebSocketを通してメッセージあるいはフレームを送信します。 オプションの排出コールバックはすべてのデータが書き込まれたときに一度だけ実行されます。

# "Ping"フレームの送信
# "Ping"フレームを送信
use Mojo::WebSocket 'WS_PING';
$ws->send([1, 0, 0, 0, WS_PING, 'Hello World!']);

server_read

$ws = $ws->server_read($data);

サーバー側のWebSocketデータを読み込みます。 Webサーバーの実装に利用されます。

server_write

my $chunk = $ws->server_write;

サーバー側でWebSocketデータを書き込みます。 Webサーバーの実装に利用されます。

with_compression

$ws->with_compression;

Negotiate このWebSocket接続のためにpermessage-deflate拡張をネゴーシエイトします。

with_protocols

my $proto = $ws->with_protocols('v2.proto', 'v1.proto');

このWebSocketの接続のための交渉サブプロトコル

デバッグ

MOJO_WEBSOCKET_DEBUG環境変数を設定すれば、さらなる詳細な情報をSTDERR に出力することができます。

MOJO_WEBSOCKET_DEBUG=1

参考

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

(Mojolicious 8.12を反映。2019年5月29日更新)