# `ServerSentEvents.Parser`
[🔗](https://github.com/benjreinhart/server_sent_events/blob/v1.1.0/lib/server_sent_events/parser.ex#L1)

Incremental parser for Server Sent Events streams.

# `event`

```elixir
@type event() :: %{
  :data =&gt; binary(),
  optional(:event) =&gt; binary(),
  optional(:id) =&gt; binary(),
  optional(:retry) =&gt; non_neg_integer()
}
```

# `t`

```elixir
@type t() :: %ServerSentEvents.Parser{
  event: nil | map(),
  key: nil | binary() | :event | :data | :id | :retry,
  phase: :start | :field | :key | :value_start | :value | :skip_line | :cr,
  value: nil | binary() | [binary()]
}
```

# `new`

```elixir
@spec new() :: t()
```

Returns a new parser state for `parse/2`.

# `parse`

```elixir
@spec parse(input :: binary()) :: {[event()], t()}
```

Parses a binary chunk with a new parser.

Returns complete events and the updated parser state.

## Examples

    iex> {events, _parser} =
    ...>   ServerSentEvents.Parser.parse("id: 1\nevent: message\nretry: 5000\ndata: hello\n\n")
    iex> events
    [%{data: "hello", event: "message", id: "1", retry: 5000}]

# `parse`

```elixir
@spec parse(t(), input :: binary()) :: {[event()], t()}
```

Parses a binary chunk using an existing parser state.

Returns complete events and a parser state that retains incomplete input for
the next chunk.

## Examples

    iex> parser = ServerSentEvents.Parser.new()
    iex> {[], parser} = ServerSentEvents.Parser.parse(parser, "event: message\n")
    iex> {events, _parser} = ServerSentEvents.Parser.parse(parser, "data: hello\n\n")
    iex> events
    [%{data: "hello", event: "message"}]

---

*Consult [api-reference.md](api-reference.md) for complete listing*
