2016-01-24 6 views
6

servantサーバにAmazon S3からファイルを取得し、それをユーザにストリームする機能を追加しようとしています。 ファイルが大きくなる可能性があるので、ローカルでダウンロードしてクライアントに配信するのではなく、S3からクライアントに直接ストリームする方が好きです。Haskellサーバントとストリーミング

私はS3と何をするためにAmazonkaを使用して、ConduitシンクとしてS3ファイルのストリームを取得できます。

しかし、今私はSinkからEitherT ServantErr IO aに到達する方法がわかりません。

どのようにすればいいのか誰に教えてもらえますか?

+0

「ストリームエンドポイントのサポート」を追加するためのServantが現在あります。 https://github.com/haskell-servant/servant/pull/836 – erewok

答えて

4

これを箱から出しては何もありませんが、必要な部分はすべて利用できます。

始める前に、私は使用人たちを提供し、すべての

まず(GetObjectResponsegorsBodyが出典であるRsBody、である)あなたがシンクにストリーミングすることができた場合、それはあなたがソースを持っていることを意味していることを推測HasServerという新しいインスタンスを作成することで、新しい戻り値型のサポートを追加できる可能性があるので、EitherT ServantErr IO (Source ...)を提供し、それをストリームにすることができます。

このインスタンスを作成するには、route :: Proxy layout -> Server layout -> RoutingApplicationを実装する必要があります。 Server layoutは、この場合、サーバーにしたいソースであるEitherT ServantErr IO layoutlayoutを意味するので、ソースを返す関数です(HTTPエラーで失敗する可能性があります)。

我々は(継続スタイルで)Requestを取り、比類のない経路エラー、または応答のいずれかを意味し、RouteResult Responseを返す関数である、RoutingApplicationを返却する必要があります。 RequestResponseは両方ともServantではなく標準であるため、残りのエコシステムを見て、その実装方法を調べることができます。

幸いなことに、私たちは遠くに行く必要はありません:responseSourceは、ステータス値、いくつかのレスポンスヘッダとソースを取り、あなたにResponseを与える:Network.Wai.Conduit我々はroute機能を実装する必要があるだけで何が含まれています。

これはかなりの作業ですが、必要なものはすべてそこにあります。 source of the instance HasServer * (Get ...)を探していると助けになるかもしれません。

+0

WAIレベルでこれを行う方法の説明/参照を追加すると、これがサーバントレベルにどのように適合するかを理解することができます。私にとっては、「ルート」が何を返すのか、そしてここでどのようにコンティニュイションスタイルの設定を考えるのかははっきりしていません。 – user239558

関連する問題