Server Sent Events

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Server Sent Events

Gattu shiva krishna
Hi all,

         I'm learning to use yaws web-server and I came across server
sent events which is used to send data to the client. To send data to
the client I'm using the function yaws_sse:send_events(A#arg.clisock,
Data). What is the format of arguments that need to be given to this
function. I've googled enough and didn't get any satisfactory results.  
Below is a sample application where I'm trying to experiment on
server-sent-events.

     Here in code I'm trying to create buttons dynamically in client
side based on data that comes from server side.

---------------------------------------------------------------------------------------------------------------------------------------

SERVER SIDE CODE:

  <erl>
         out(A) ->
             Data = yaws_sse:data(["Button1",
"Button2","Button3","Button4"]),

             yaws_sse:send_events(A#arg.clisock, Data).
     </erl>

---------------------------------------------------------------------------------------------------------------------------------------

CLIENT SIDE CODE:

<script type="text/javascript">
       var source = new EventSource("button.yaws");
       source.onmessage = function(event) {
             var i, buttonsToCreate,buttonContainer, newButton;

         buttonsToCreate = event.data;
             buttonContainer =
document.getElementById('this_element_contains_my_buttons');
         for (i = 0; i <= buttonsToCreate.length ; i++)
         {
               newButton = document.createElement('input');
               newButton.type = 'button';
               newButton.value = buttonsToCreate[i];
               newButton.id = buttonsToCreate[i];
               buttonContainer.appendChild(newButton);
         }
     };

     </script>

_______________________________________________
erlang-questions mailing list
[hidden email]
http://erlang.org/mailman/listinfo/erlang-questions
Reply | Threaded
Open this post in threaded view
|

Re: Server Sent Events

Jesper Louis Andersen-2
Here is what I think is going wrong, though I'm not entirely sure:

The Yaws yaws_sse:data/1,2 functions assume the data you give them are so-called iodata(). So when you write something like

["Button1", "Button2"]

and send it, it is effectively flattened into a binary

<<"Button1Button2">>

The iodata() system is really nice for doing scatter/gatter (typo intended) IO, but you have to invent some kind of framing in which you run.

For example, we could use JSON:

X = [<<"Button1">>, <<"Button"2>>],
Data = yaws_sse:data(jsx:encode(X)),
...

which encodes the data into a JSON structure which we can handle on the client side.

Also, look up the iodata() concept. It is pretty nice. There is an old post by James Hague on it:

http://prog21.dadgum.com/70.html


On Wed, Aug 23, 2017 at 12:27 PM Gattu shiva krishna <[hidden email]> wrote:
Hi all,

         I'm learning to use yaws web-server and I came across server
sent events which is used to send data to the client. To send data to
the client I'm using the function yaws_sse:send_events(A#arg.clisock,
Data). What is the format of arguments that need to be given to this
function. I've googled enough and didn't get any satisfactory results.
Below is a sample application where I'm trying to experiment on
server-sent-events.

     Here in code I'm trying to create buttons dynamically in client
side based on data that comes from server side.

---------------------------------------------------------------------------------------------------------------------------------------

SERVER SIDE CODE:

  <erl>
         out(A) ->
             Data = yaws_sse:data(["Button1",
"Button2","Button3","Button4"]),

             yaws_sse:send_events(A#arg.clisock, Data).
     </erl>

---------------------------------------------------------------------------------------------------------------------------------------

CLIENT SIDE CODE:

<script type="text/javascript">
       var source = new EventSource("button.yaws");
       source.onmessage = function(event) {
             var i, buttonsToCreate,buttonContainer, newButton;

         buttonsToCreate = event.data;
             buttonContainer =
document.getElementById('this_element_contains_my_buttons');
         for (i = 0; i <= buttonsToCreate.length ; i++)
         {
               newButton = document.createElement('input');
               newButton.type = 'button';
               newButton.value = buttonsToCreate[i];
               newButton.id = buttonsToCreate[i];
               buttonContainer.appendChild(newButton);
         }
     };

     </script>

_______________________________________________
erlang-questions mailing list
[hidden email]
http://erlang.org/mailman/listinfo/erlang-questions

_______________________________________________
erlang-questions mailing list
[hidden email]
http://erlang.org/mailman/listinfo/erlang-questions
Reply | Threaded
Open this post in threaded view
|

Re: Server Sent Events

Gattu shiva krishna

Hi,

        when i'm using below function

        Data = yaws_sse:data( [ "button1", "button2" ] ),

        the result value of that function is 

        [<<"data:">>, [ "button1", "button2" ], <<"\n">>]

        when i'm trying to send this data to client side using below function

        yaws_sse:send_events(A#arg.clisock, Data)

        but in client side iam unable to retrieve the data, Is there any solution for this.

----------------------------------------------------------------------------------------------------------------------------------------------

        when i'm trying to use this  function ( yaws_sse:send_events/2 )manually in yaws shell.

        for example :

        1> yaws_sse:send_events( '#port<0.3333>', [<<"data:">>,[ "button1", "button2" ],<<"\n">>]).
 
        It is giving some error like this :
       
        ** exception error: no function clause matching
                    gen_tcp:send('#port<0.3333>',
                                 [[<<"data:">>,
                                   [ "button1", "button2" ],
                                   <<"\n">>],
                                  <<"\n">>]) (gen_tcp.erl, line 261)

    What is the format of arguments that need to be given to this function.

On Wednesday 23 August 2017 04:08 PM, Jesper Louis Andersen wrote:
Here is what I think is going wrong, though I'm not entirely sure:

The Yaws yaws_sse:data/1,2 functions assume the data you give them are so-called iodata(). So when you write something like

["Button1", "Button2"]

and send it, it is effectively flattened into a binary

<<"Button1Button2">>

The iodata() system is really nice for doing scatter/gatter (typo intended) IO, but you have to invent some kind of framing in which you run.

For example, we could use JSON:

X = [<<"Button1">>, <<"Button"2>>],
Data = yaws_sse:data(jsx:encode(X)),
...

which encodes the data into a JSON structure which we can handle on the client side.

Also, look up the iodata() concept. It is pretty nice. There is an old post by James Hague on it:

http://prog21.dadgum.com/70.html


On Wed, Aug 23, 2017 at 12:27 PM Gattu shiva krishna <[hidden email]> wrote:
Hi all,

         I'm learning to use yaws web-server and I came across server
sent events which is used to send data to the client. To send data to
the client I'm using the function yaws_sse:send_events(A#arg.clisock,
Data). What is the format of arguments that need to be given to this
function. I've googled enough and didn't get any satisfactory results.
Below is a sample application where I'm trying to experiment on
server-sent-events.

     Here in code I'm trying to create buttons dynamically in client
side based on data that comes from server side.

---------------------------------------------------------------------------------------------------------------------------------------

SERVER SIDE CODE:

  <erl>
         out(A) ->
             Data = yaws_sse:data(["Button1",
"Button2","Button3","Button4"]),

             yaws_sse:send_events(A#arg.clisock, Data).
     </erl>

---------------------------------------------------------------------------------------------------------------------------------------

CLIENT SIDE CODE:

<script type="text/javascript">
       var source = new EventSource("button.yaws");
       source.onmessage = function(event) {
             var i, buttonsToCreate,buttonContainer, newButton;

         buttonsToCreate = event.data;
             buttonContainer =
document.getElementById('this_element_contains_my_buttons');
         for (i = 0; i <= buttonsToCreate.length ; i++)
         {
               newButton = document.createElement('input');
               newButton.type = 'button';
               newButton.value = buttonsToCreate[i];
               newButton.id = buttonsToCreate[i];
               buttonContainer.appendChild(newButton);
         }
     };

     </script>

_______________________________________________
erlang-questions mailing list
[hidden email]
http://erlang.org/mailman/listinfo/erlang-questions


_______________________________________________
erlang-questions mailing list
[hidden email]
http://erlang.org/mailman/listinfo/erlang-questions
Reply | Threaded
Open this post in threaded view
|

Re: Server Sent Events

Steve Vinoski-2


On Thu, Aug 24, 2017 at 1:53 AM, Gattu shiva krishna <[hidden email]> wrote:

Hi,

        when i'm using below function

        Data = yaws_sse:data( [ "button1", "button2" ] ),

        the result value of that function is 

        [<<"data:">>, [ "button1", "button2" ], <<"\n">>]


As Jesper already explained, what the client will receive in this case is the equivalent of

<<"data:button1button2\n">>

Is that really what you're trying to send? Parsing that seems difficult.
 

        when i'm trying to send this data to client side using below function

        yaws_sse:send_events(A#arg.clisock, Data)

        but in client side iam unable to retrieve the data, Is there any solution for this.

----------------------------------------------------------------------------------------------------------------------------------------------

        when i'm trying to use this  function ( yaws_sse:send_events/2 )manually in yaws shell.

        for example :

        1> yaws_sse:send_events( '#port<0.3333>', [<<"data:">>,[ "button1", "button2" ],<<"\n">>]).
 
        It is giving some error like this :
       
        ** exception error: no function clause matching
                    gen_tcp:send('#port<0.3333>',
                                 [[<<"data:">>,
                                   [ "button1", "button2" ],
                                   <<"\n">>],
                                  <<"\n">>]) (gen_tcp.erl, line 261)

    What is the format of arguments that need to be given to this function.

You're getting this error because you're passing the port argument as an atom, not as a port. Assuming you're using a relatively recent version of Erlang/OTP, in the shell the port you've mentioned should be specified as

#Port<0.3333>

without quotes. The whole call becomes

yaws_sse:send_events(#Port<0.3333>, [<<"data:">>,[ "button1", "button2" ],<<"\n">>]).

or more simply but equivalently

yaws_sse:send_events(#Port<0.3333>, <<"data:button1button2\n">>).

which will send the data you specify, assuming #Port<0.3333> is really the right connection. But again, the data you're sending is poorly structured and so won't be easy for your client to deal with.

--steve


On Wednesday 23 August 2017 04:08 PM, Jesper Louis Andersen wrote:
Here is what I think is going wrong, though I'm not entirely sure:

The Yaws yaws_sse:data/1,2 functions assume the data you give them are so-called iodata(). So when you write something like

["Button1", "Button2"]

and send it, it is effectively flattened into a binary

<<"Button1Button2">>

The iodata() system is really nice for doing scatter/gatter (typo intended) IO, but you have to invent some kind of framing in which you run.

For example, we could use JSON:

X = [<<"Button1">>, <<"Button"2>>],
Data = yaws_sse:data(jsx:encode(X)),
...

which encodes the data into a JSON structure which we can handle on the client side.

Also, look up the iodata() concept. It is pretty nice. There is an old post by James Hague on it:

http://prog21.dadgum.com/70.html


On Wed, Aug 23, 2017 at 12:27 PM Gattu shiva krishna <[hidden email]> wrote:
Hi all,

         I'm learning to use yaws web-server and I came across server
sent events which is used to send data to the client. To send data to
the client I'm using the function yaws_sse:send_events(A#arg.clisock,
Data). What is the format of arguments that need to be given to this
function. I've googled enough and didn't get any satisfactory results.
Below is a sample application where I'm trying to experiment on
server-sent-events.

     Here in code I'm trying to create buttons dynamically in client
side based on data that comes from server side.

---------------------------------------------------------------------------------------------------------------------------------------

SERVER SIDE CODE:

  <erl>
         out(A) ->
             Data = yaws_sse:data(["Button1",
"Button2","Button3","Button4"]),

             yaws_sse:send_events(A#arg.clisock, Data).
     </erl>

---------------------------------------------------------------------------------------------------------------------------------------

CLIENT SIDE CODE:

<script type="text/javascript">
       var source = new EventSource("button.yaws");
       source.onmessage = function(event) {
             var i, buttonsToCreate,buttonContainer, newButton;

         buttonsToCreate = event.data;
             buttonContainer =
document.getElementById('this_element_contains_my_buttons');
         for (i = 0; i <= buttonsToCreate.length ; i++)
         {
               newButton = document.createElement('input');
               newButton.type = 'button';
               newButton.value = buttonsToCreate[i];
               newButton.id = buttonsToCreate[i];
               buttonContainer.appendChild(newButton);
         }
     };

     </script>

_______________________________________________
erlang-questions mailing list
[hidden email]
http://erlang.org/mailman/listinfo/erlang-questions


_______________________________________________
erlang-questions mailing list
[hidden email]
http://erlang.org/mailman/listinfo/erlang-questions



_______________________________________________
erlang-questions mailing list
[hidden email]
http://erlang.org/mailman/listinfo/erlang-questions