:- use_module(library(http/websocket)). http_upgrade_to_websocket(:Goal, 
+Options, +Request)
http_upgrade_to_websocket(:Goal, 
+Options, +Request)call(Goal, WebSocket), 
where WebSocket is a socket-pair. Options:
true (default), guard the execution of Goal 
and close the websocket on both normal and abnormal termination of Goal. 
If false, Goal itself is responsible for the 
created websocket if Goal succeeds. The websocket is closed 
if Goal fails or raises an exception. This can be used to 
create a single thread that manages multiple websockets using I/O 
multiplexing. See library(http/hub).infinite.Note that the Request argument is the last for cooperation with http_handler/3. A simple echo server that can be accessed at =/ws/= can be implemented as:
:- use_module(library(http/websocket)).
:- use_module(library(http/thread_httpd)).
:- use_module(library(http/http_dispatch)).
:- http_handler(root(ws),
                http_upgrade_to_websocket(echo, []),
                [spawn([])]).
echo(WebSocket) :-
    ws_receive(WebSocket, Message),
    (   Message.opcode == close
    ->  true
    ;   ws_send(WebSocket, Message),
        echo(WebSocket)
    ).
switching_protocols(Goal, Options). The recovery from this 
exception causes the HTTP infrastructure to call
call(Goal, WebSocket).