src/simple_bridge_handler_sample.erl

%% vim: ts=4 sw=4 et
-module(simple_bridge_handler_sample).
-behaviour(simple_bridge_handler).

-export([run/1,
        ws_init/1,
        ws_message/3,
        ws_info/3,
        ws_terminate/3]).


run(Bridge) ->
    try
        Bridge2 = sbw:set_response_data(body(Bridge), Bridge),
        sbw:build_response(Bridge2)
    catch T:E:S ->
        error_logger:error_msg("~p:~p: ~p",[T, E, S]),
        exit("Error building response")
    end.

ws_init(_Bridge) ->
    %erlang:send_after(1000, self(), "START"),
    ok.

ws_message({text, <<"frag">>}, _State, _Bridge) ->
    Reply = [{text, [Msg," "]} || Msg <- ["A","spoon","full","of","sugar"]],
    {reply, Reply};
ws_message({text, Data}, _Bridge, _State) ->
    %Reply = io_lib:format("~s", [Data]),
    {reply, {text, Data}};
ws_message({binary, Data}, _Bridge, _State) ->
    {reply, {binary, Data}}.

ws_info(Data, _Bridge, _State) ->
    Reply = {text, io_lib:format("~s", [Data])},
    {reply, Reply}.

ws_terminate(_Reason, _Bridge, _State) ->
    ok.


%%% HTML BODY AND DRAWING TESTING THE BRIDGE CAPABILITIES

body(Bridge) ->
    [
    <<"<html>
    <head>
        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">
        <title>Hello from Simple Bridge!</title>
        <script src='http://code.jquery.com/jquery-1.10.2.js'></script>
        <script src='/js/websocket.js'></script>
    </head>
    <body>
        <h1>Hello from Simple Bridge!</h1>">>,
        connection_info(Bridge),
        <<"<div id='header'>
          <div id='status'></div>
        </div>


        <div id='navigation'>
          <p id='connecting'>
            <input type='text' id='server' value='ws://localhost:8000/'></input>
            <button type='button' onclick='toggle_connection()'>(re)connect websocket</button>
          </p>
          <div id='connected'>                                
            <p>
              <input type='text' id='send_txt' value=''></input>
              <button type='button' onclick='sendTxt();'>send</button>
            </p>
          </div>

          <div id='content'>                                                
            <button id='clear' onclick='clearScreen()' >Clear text</button>
            <div id='output'></div>
          </div>

        </div>
      </body>
    </html>">>
    ].

connection_info(Bridge) ->
    Fields = [host, socket, protocol, request_method, uri, path, headers, cookies, query_params, post_params, deep_query_params, peer_ip, protocol_version],
    [
        <<"<table>">>,
        [draw_connection_info(Field, Bridge) || Field <- Fields],
        <<"</table>">>
    ].

draw_connection_info(Field, Bridge) ->
    io_lib:format("<tr><td>~p</td><td><pre>~p</pre></td></tr>",[Field, sbw:Field(Bridge)]).