Haskell仆人和流媒体
我试图将功能添加到我的servant
服务器将获得来自亚马逊S3文件和流回给用户。 由于文件可能很大,我不想在本地下载它们,然后将它们提供给客户端,我宁愿将它们直接从S3传输到客户端。
我使用Amazonka
来处理S3所做的事情,并且我可以为S3文件作为Conduit
器获取流。
但现在我不知道怎么去从Sink
到EitherT ServantErr IO a
。
任何人都可以解释我如何去做,或者告诉我一些如何做到的例子?
仆人中没有任何东西可以做到这一点,但所有需要的部件都可用。
在我们开始之前,我想,如果你可以流至水槽,这意味着你有一个源( gorsBody
的GetObjectResponse
是RsBody
,这是一个Source)
首先,Servant通过创建HasServer
一个新实例,为我们提供了添加对新返回类型的支持的可能性,因此我们可以为EitherT ServantErr IO (Source ...)
并使其流式传输。
要创建该实例,我们必须实现route :: Proxy layout -> Server layout -> RoutingApplication
。 在这种情况下, Server layout
只意味着EitherT ServantErr IO layout
, layout
是我们想要服务的源,所以它是返回源的函数(并且可能会因为HTTP错误而失败)。
我们必须返回一个RoutingApplication
,它是(继续式)一个接受Request
并返回RouteResult Response
的函数,这意味着不匹配的路由错误或响应。 Request
和Response
都是标准wai,而不是Servant,所以我们现在可以查看生态系统的其他部分,以了解如何实施它。
幸运的是,我们不必走得太远: Network.Wai.Conduit
包含我们需要实现的route
函数: responseSource
接受一个状态值,一些响应头文件和源文件,并为您提供Response
。
所以,这是相当多的工作要做,但我们需要的是在那里。 查看实例HasServer * (Get ...)
可能会有所帮助。
上一篇: Haskell Servant and streaming
下一篇: Interval doesn't clear immediately after repeating for a while