servant-event-stream-0.3.0.1: Servant support for Server-Sent events
Copyright(c) 2024 Shaun Sharples
LicenseBSD3
Stabilityalpha
Safe HaskellSafe-Inferred
LanguageHaskell2010

Servant.API.EventStream

Description

 
Synopsis

Server-Sent Events

Event streams are implemented using servant's Stream endpoint. You should provide a handler that returns a stream of events that implements ToSourceIO where events have a ToServerEvent instance.

Example:

type MyApi = "books" :> ServerSentEvents (SourceIO Book)

instance ToServerEvent Book where
  toServerEvent book = ...

server :: Server MyApi
server = streamBooks
  where streamBooks :: Handler (SourceIO Book)
        streamBooks = pure $ source [book1, ...]

data ServerEvent Source #

Represents an event sent from the server to the client in Server-Sent Events (SSE).

Constructors

ServerEvent 

Fields

  • eventType :: !(Maybe ByteString)

    Optional field specifying the type of event. Can be used to distinguish between different kinds of events.

  • eventId :: !(Maybe ByteString)

    Optional field providing an identifier for the event. Useful for clients to keep track of the last received event.

  • eventData :: !ByteString

    The payload or content of the event. This is the main data sent to the client.

Instances

Instances details
Generic ServerEvent Source # 
Instance details

Defined in Servant.API.EventStream

Associated Types

type Rep ServerEvent :: Type -> Type #

Show ServerEvent Source # 
Instance details

Defined in Servant.API.EventStream

Eq ServerEvent Source # 
Instance details

Defined in Servant.API.EventStream

ToServerEvent ServerEvent Source # 
Instance details

Defined in Servant.API.EventStream

type Rep ServerEvent Source # 
Instance details

Defined in Servant.API.EventStream

type Rep ServerEvent = D1 ('MetaData "ServerEvent" "Servant.API.EventStream" "servant-event-stream-0.3.0.1-Ew4vICvJTra6nuiDFTspbH" 'False) (C1 ('MetaCons "ServerEvent" 'PrefixI 'True) (S1 ('MetaSel ('Just "eventType") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe ByteString)) :*: (S1 ('MetaSel ('Just "eventId") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe ByteString)) :*: S1 ('MetaSel ('Just "eventData") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 ByteString))))

class ToServerEvent a where Source #

This typeclass allows you to define custom event types that can be transformed into the ServerEvent type, which is used to represent events in the Server-Sent Events (SSE) protocol.

Instances

Instances details
ToServerEvent ServerEvent Source # 
Instance details

Defined in Servant.API.EventStream

data ServerSentEvents (a :: Type) Source #

A ServerSentEvents endpoint emits an event stream using the format described at https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#event_stream_format

Instances

Instances details
HasForeignType lang ftype a => HasForeign (lang :: k) ftype (ServerSentEvents a) Source #

a helper instance for servant-foreign

Instance details

Defined in Servant.API.EventStream

Associated Types

type Foreign ftype (ServerSentEvents a) #

Methods

foreignFor :: Proxy lang -> Proxy ftype -> Proxy (ServerSentEvents a) -> Req ftype -> Foreign ftype (ServerSentEvents a) #

HasLink (ServerSentEvents a :: Type) Source # 
Instance details

Defined in Servant.API.EventStream

Associated Types

type MkLink (ServerSentEvents a) a #

Methods

toLink :: (Link -> a0) -> Proxy (ServerSentEvents a) -> Link -> MkLink (ServerSentEvents a) a0 #

(ToServerEvent chunk, ToSourceIO chunk a, GetHeaders (Headers h a)) => HasServer (ServerSentEvents (Headers h a) :: Type) context Source # 
Instance details

Defined in Servant.API.EventStream

Associated Types

type ServerT (ServerSentEvents (Headers h a)) m #

Methods

route :: Proxy (ServerSentEvents (Headers h a)) -> Context context -> Delayed env (Server (ServerSentEvents (Headers h a))) -> Router env #

hoistServerWithContext :: Proxy (ServerSentEvents (Headers h a)) -> Proxy context -> (forall x. m x -> n x) -> ServerT (ServerSentEvents (Headers h a)) m -> ServerT (ServerSentEvents (Headers h a)) n #

(ToServerEvent chunk, ToSourceIO chunk a) => HasServer (ServerSentEvents a :: Type) context Source # 
Instance details

Defined in Servant.API.EventStream

Associated Types

type ServerT (ServerSentEvents a) m #

Methods

route :: Proxy (ServerSentEvents a) -> Context context -> Delayed env (Server (ServerSentEvents a)) -> Router env #

hoistServerWithContext :: Proxy (ServerSentEvents a) -> Proxy context -> (forall x. m x -> n x) -> ServerT (ServerSentEvents a) m -> ServerT (ServerSentEvents a) n #

Generic (ServerSentEvents a) Source # 
Instance details

Defined in Servant.API.EventStream

Associated Types

type Rep (ServerSentEvents a) :: Type -> Type #

type Foreign ftype (ServerSentEvents a) Source # 
Instance details

Defined in Servant.API.EventStream

type Foreign ftype (ServerSentEvents a) = Req ftype
type MkLink (ServerSentEvents a :: Type) r Source # 
Instance details

Defined in Servant.API.EventStream

type MkLink (ServerSentEvents a :: Type) r = r
type ServerT (ServerSentEvents (Headers h a) :: Type) m Source # 
Instance details

Defined in Servant.API.EventStream

type ServerT (ServerSentEvents a :: Type) m Source # 
Instance details

Defined in Servant.API.EventStream

type Rep (ServerSentEvents a) Source # 
Instance details

Defined in Servant.API.EventStream

type Rep (ServerSentEvents a) = D1 ('MetaData "ServerSentEvents" "Servant.API.EventStream" "servant-event-stream-0.3.0.1-Ew4vICvJTra6nuiDFTspbH" 'False) (V1 :: Type -> Type)

data EventStream Source #

A type representation of an event stream. It's responsible for setting proper content-type and buffering headers, as well as for providing parser implementations for the streams. Read more on Servant Streaming Docs

Recommended headers for Server-Sent Events

This is mostly to guide reverse-proxies like nginx.

Example:

type MyApi = "books" :> ServerSentEvents (RecommendedEventSourceHeaders (SourceIO Book))

server :: Server MyApi
server = streamBooks
  where streamBooks :: Handler (RecommendedEventSourceHeaders (SourceIO Book))
        streamBooks = pure $ recommendedEventSourceHeaders $ source [book1, ...]

type RecommendedEventSourceHeaders (a :: Type) = Headers '[Header "X-Accel-Buffering" Text, Header "Cache-Control" Text] a Source #

Recommended headers for Server-Sent Events.

recommendedEventSourceHeaders :: a -> RecommendedEventSourceHeaders a Source #

Add the recommended headers for Server-Sent Events to the response.