Chapter 7. Streaming
Sometimes you want to stream data from a server to a client, for example, for an Internet radio station or a service like Pandora or Ustream. Yaws can do this quite well and with minimal effort on the part of the programmer.
The difference between streamed data and a standard HTTP connection is that a stream can remain open for a long period of time (oftentimes hours or days) and send data to the client for that entire time. However, unlike WebSockets (see Chapter 6) a stream is a one-way data connection and will normally be binary data like music or video as opposed to textual data in a WebSocket.
Simple Streaming
To set up streaming in Yaws, the out/1
function should return the tuple {streamcontent, MimeType, FirstChunk}
as in
Example 7-1.
Example 7-1. Setting up streaming (stream.yaws)
<
erl
>
out
(
A
)
->
io
:
format
(
"
~n
Starting audio stream
~n
"
),
spawn
(
streaming
,
stream_data
,
[
self
()]),
{
streamcontent
,
"audio/mp3"
,
<<>>
}.
</
erl
>
You must also spawn a new process to actually send the data to the
client. This is done in Example 7-1 with the call to
spawn/3
. This will create a new process
and pass the process ID of the creating process, as shown in Example 7-2. When creating that process, the out/1
function passes its own PID via the
self/0
function to the function
streaming:stream_data/1
.
To actually send the data to the stream, call the function yaws_api:stream_chunk_deliver/2
with the Yaws
creating PID and the data to be sent. When the stream is finished, call
yaws_api:stream_chunk_end/1 ...
Get Building Web Applications with Erlang now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.