aboutsummaryrefslogtreecommitdiffstats
path: root/examples/eventsource/src
diff options
context:
space:
mode:
Diffstat (limited to 'examples/eventsource/src')
-rw-r--r--examples/eventsource/src/eventsource.app.src15
-rw-r--r--examples/eventsource/src/eventsource.erl14
-rw-r--r--examples/eventsource/src/eventsource_app.erl30
-rw-r--r--examples/eventsource/src/eventsource_handler.erl27
-rw-r--r--examples/eventsource/src/eventsource_sup.erl23
5 files changed, 109 insertions, 0 deletions
diff --git a/examples/eventsource/src/eventsource.app.src b/examples/eventsource/src/eventsource.app.src
new file mode 100644
index 0000000..002ea85
--- /dev/null
+++ b/examples/eventsource/src/eventsource.app.src
@@ -0,0 +1,15 @@
+%% Feel free to use, reuse and abuse the code in this file.
+
+{application, eventsource, [
+ {description, "Cowboy EventSource example."},
+ {vsn, "1"},
+ {modules, []},
+ {registered, []},
+ {applications, [
+ kernel,
+ stdlib,
+ cowboy
+ ]},
+ {mod, {eventsource_app, []}},
+ {env, []}
+]}.
diff --git a/examples/eventsource/src/eventsource.erl b/examples/eventsource/src/eventsource.erl
new file mode 100644
index 0000000..6505e62
--- /dev/null
+++ b/examples/eventsource/src/eventsource.erl
@@ -0,0 +1,14 @@
+%% Feel free to use, reuse and abuse the code in this file.
+
+-module(eventsource).
+
+%% API.
+-export([start/0]).
+
+%% API.
+
+start() ->
+ ok = application:start(crypto),
+ ok = application:start(ranch),
+ ok = application:start(cowboy),
+ ok = application:start(eventsource).
diff --git a/examples/eventsource/src/eventsource_app.erl b/examples/eventsource/src/eventsource_app.erl
new file mode 100644
index 0000000..d002676
--- /dev/null
+++ b/examples/eventsource/src/eventsource_app.erl
@@ -0,0 +1,30 @@
+%% Feel free to use, reuse and abuse the code in this file.
+
+%% @private
+-module(eventsource_app).
+-behaviour(application).
+
+%% API.
+-export([start/2]).
+-export([stop/1]).
+
+%% API.
+
+start(_Type, _Args) ->
+ Dispatch = cowboy_router:compile([
+ {'_', [
+ {"/eventsource", eventsource_handler, []},
+ {"/", cowboy_static, [
+ {directory, {priv_dir, eventsource, []}},
+ {file, <<"index.html">>},
+ {mimetypes, {fun mimetypes:path_to_mimes/2, default}}
+ ]}
+ ]}
+ ]),
+ {ok, _} = cowboy:start_http(http, 100, [{port, 8080}], [
+ {env, [{dispatch, Dispatch}]}
+ ]),
+ eventsource_sup:start_link().
+
+stop(_State) ->
+ ok.
diff --git a/examples/eventsource/src/eventsource_handler.erl b/examples/eventsource/src/eventsource_handler.erl
new file mode 100644
index 0000000..661057c
--- /dev/null
+++ b/examples/eventsource/src/eventsource_handler.erl
@@ -0,0 +1,27 @@
+%% Feel free to use, reuse and abuse the code in this file.
+
+%% @doc EventSource emitter.
+-module(eventsource_handler).
+
+-export([init/3]).
+-export([info/3]).
+-export([terminate/3]).
+
+init(_Transport, Req, []) ->
+ Headers = [{<<"content-type">>, <<"text/event-stream">>}],
+ {ok, Req2} = cowboy_req:chunked_reply(200, Headers, Req),
+ erlang:send_after(1000, self(), {message, "Tick"}),
+ {loop, Req2, undefined, 5000}.
+
+info({message, Msg}, Req, State) ->
+ ok = cowboy_req:chunk(["id: ", id(), "\ndata: ", Msg, "\n\n"], Req),
+ erlang:send_after(1000, self(), {message, "Tick"}),
+ {loop, Req, State}.
+
+terminate(_Reason, _Req, _State) ->
+ ok.
+
+id() ->
+ {Mega, Sec, Micro} = erlang:now(),
+ Id = (Mega * 1000000 + Sec) * 1000000 + Micro,
+ integer_to_list(Id, 16).
diff --git a/examples/eventsource/src/eventsource_sup.erl b/examples/eventsource/src/eventsource_sup.erl
new file mode 100644
index 0000000..611b015
--- /dev/null
+++ b/examples/eventsource/src/eventsource_sup.erl
@@ -0,0 +1,23 @@
+%% Feel free to use, reuse and abuse the code in this file.
+
+%% @private
+-module(eventsource_sup).
+-behaviour(supervisor).
+
+%% API.
+-export([start_link/0]).
+
+%% supervisor.
+-export([init/1]).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+ supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+%% supervisor.
+
+init([]) ->
+ Procs = [],
+ {ok, {{one_for_one, 10, 10}, Procs}}.