cro-websocket-handler
Cro::WebSocket::Handler
This is a Cro::Transform that consumes Cro::WebSocket::Message and
produces Cro::WebSocket::Message. It takes care of automatically
responding to ping messages with a pong message. The only requirement
is that it is passed a code block. That block may taking a single
parameter, which will be a Supply of incoming messages. It is expect
to return a Supply that, when tapped, will process
messages. Anything it emits will be considered a response message.
my $uc-ws = Cro::WebSocket::Handler.new(
-> $incoming {
supply {
whenever $incoming -> $message {
my $body = await $message.body-text();
emit Cro::WebSocket::Message.new($body.uc);
}
}
}
)The incoming Supply will be done when a Close frame is
received. In some cases, the content of the closing frame may be of
interest. In this case, an arity two block may be passed, which will
receive a Promise that is kept with the close message.
my $uc-ws = Cro::WebSocket::Handler.new(
-> $incoming, $close {
supply {
whenever $incoming -> $message {
my $body = await $message.body-text();
emit Cro::WebSocket::Message.new($body.uc);
}
whenever $close -> $message {
say "Close body: " ~ await($message.body-blob).gist;
}
}
}
)If a message of type Close is emitted, then it will be sent and the
tap on the Supply will be closed. Otherwise, when the returned
Supply is done, then a Close message will be sent automatically
with the close reason of 1000 (normal closure). Alternatively, if
the Supply is terminated with a quit (due to an unhandled
exception), a Close message will be sent with the close reason of
1011 (unexpected condition). In any event, it will be ensured that
only one Close frame is ever sent (for example, it a Close frame
was emitted explicitly and then the Supply was done or quit, a
further Close frame would never be emitted).
As a convenience, a Str, Blob, or Supply may be emitted instead
of a Cro::WebSocket::Message. In this case, it will be passed to the
new method of Cro::WebSocket::Message and the resulting message
sent. Therefore, the previous example could be written as simply:
my $uc-ws = Cro::WebSocket::Handler.new(
-> $incoming {
supply {
whenever $incoming -> $message {
my $body = await $message.body-text();
emit $body.uc;
}
}
}
)