11defmodule ServerSentEvents.Parser do
22 @ moduledoc """
3- Low level SSE parser.
4-
5- See [Usage Guide](guides/usage.livemd) for usage example.
3+ Incremental parser for Server Sent Events streams.
64 """
75
86 @ type t :: % __MODULE__ {
@@ -22,51 +20,43 @@ defmodule ServerSentEvents.Parser do
2220 defstruct [ :phase , :key , :value , :event ]
2321
2422 @ doc """
25- Creates new Parser state that can be then passed to `parse/2`
26-
27- ## Examples
28-
29- iex> ServerSentEvents.Parser.new()
30- %ServerSentEvents.Parser{phase: :start, key: nil, value: nil, event: nil}
23+ Returns a new parser state for `parse/2`.
3124 """
3225 @ spec new ( ) :: t ( )
3326 def new ( ) do
3427 % __MODULE__ { phase: :start }
3528 end
3629
3730 @ doc """
38- Parses binary chunk and returns complete events and an active state
31+ Parses a binary chunk with a new parser.
32+
33+ Returns complete events and the updated parser state.
3934
4035 ## Examples
4136
42- iex> ServerSentEvents.Parser.parse("id: 1\\ nevent: message\\ nretry: 5000\\ ndata: hello\\ n\\ n")
43- {[%{data: "hello", id: "1", retry: 5000, event: "message"}],
44- %ServerSentEvents.Parser{phase: :field, key: nil, value: nil, event: nil}}
37+ iex> {events, _parser} =
38+ ...> ServerSentEvents.Parser.parse("id: 1\\ nevent: message\\ nretry: 5000\\ ndata: hello\\ n\\ n")
39+ iex> events
40+ [%{data: "hello", event: "message", id: "1", retry: 5000}]
4541 """
4642 @ spec parse ( input :: binary ( ) ) :: { [ event ( ) ] , t ( ) }
4743 def parse ( input ) when is_binary ( input ) do
4844 new ( ) |> parse ( input )
4945 end
5046
5147 @ doc """
52- Parses binary chunk using existing parser state and returns complete events
53- and an updated state
48+ Parses a binary chunk using an existing parser state.
49+
50+ Returns complete events and a parser state that retains incomplete input for
51+ the next chunk.
5452
5553 ## Examples
5654
57- iex> state = ServerSentEvents.Parser.new()
58- %ServerSentEvents.Parser{phase: :start, key: nil, value: nil, event: nil}
59- iex> {_, state} = ServerSentEvents.Parser.parse(state, "id: 1\\ nevent: message\\ n")
60- {[],
61- %ServerSentEvents.Parser{
62- phase: :field,
63- key: nil,
64- value: nil,
65- event: %{id: "1", event: "message"}
66- }}
67- iex> {_, _state} = ServerSentEvents.Parser.parse(state, "retry: 5000\\ ndata: hello\\ n\\ n")
68- {[%{data: "hello", id: "1", retry: 5000, event: "message"}],
69- %ServerSentEvents.Parser{phase: :field, key: nil, value: nil, event: nil}}
55+ iex> parser = ServerSentEvents.Parser.new()
56+ iex> {[], parser} = ServerSentEvents.Parser.parse(parser, "event: message\\ n")
57+ iex> {events, _parser} = ServerSentEvents.Parser.parse(parser, "data: hello\\ n\\ n")
58+ iex> events
59+ [%{data: "hello", event: "message"}]
7060 """
7161 @ spec parse ( t ( ) , input :: binary ( ) ) :: { [ event ( ) ] , t ( ) }
7262 def parse ( % __MODULE__ { phase: phase , key: key , value: value , event: event } , input )
0 commit comments