Non c'è niente in Servant per fare questo fuori dalla scatola, tuttavia sono disponibili tutte le parti necessarie.
Prima di iniziare, credo che se è possibile lo streaming di un lavandino, che significa avere una fonte (il gorsBody
di GetObjectResponse
è un RsBody
, che è una fonte)
Prima di tutto, Servo ci fornisce con la possibilità di aggiungere il supporto per i nuovi tipi di resi, creando una nuova istanza di HasServer
, in modo da poter servire uno EitherT ServantErr IO (Source ...)
e farlo flusso.
Per creare tale istanza, è necessario implementare route :: Proxy layout -> Server layout -> RoutingApplication
. Server layout
, in questo caso, indica semplicemente EitherT ServantErr IO layout
, layout
come origine del server, quindi è la funzione che restituisce un'origine (e potrebbe non riuscire con un errore HTTP).
dobbiamo restituire un RoutingApplication
, che è (in stile proseguimento) una funzione che prende un Request
e restituisce un RouteResult Response
, il che significa che sia un errore percorso senza pari, o una risposta. Entrambi Request
e Response
sono standard wai, non Servant, quindi ora possiamo esaminare il resto dell'ecosistema per scoprire come implementarlo.
Fortunatamente, non abbiamo bisogno di andare lontano: Network.Wai.Conduit
contiene solo ciò che abbiamo bisogno di implementare la funzione route
: responseSource
assume un valore di stato, alcune intestazioni di risposta e la vostra sorgente e ti dà una Response
.
Quindi, c'è parecchio lavoro da fare, ma tutto ciò di cui abbiamo bisogno è lì. Guardando il numero source of the instance HasServer * (Get ...)
potrebbe essere d'aiuto.
C'è attualmente un PR in Servant per aggiungere "Supporto endpoint Stream". https://github.com/haskell-servant/servant/pull/836 – erewok