Haskell仆人和流媒体

我试图将功能添加到我的servant服务器将获得来自亚马逊S3文件和流回给用户。 由于文件可能很大,我不想在本地下载它们,然后将它们提供给客户端,我宁愿将它们直接从S3传输到客户端。

我使用Amazonka来处理S3所做的事情,并且我可以为S3文件作为Conduit器获取流。

但现在我不知道怎么去从SinkEitherT ServantErr IO a

任何人都可以解释我如何去做,或者告诉我一些如何做到的例子?


仆人中没有任何东西可以做到这一点,但所有需要的部件都可用。

在我们开始之前,我想,如果你可以流至水槽,这意味着你有一个源( gorsBodyGetObjectResponseRsBody ,这是一个Source)

首先,Servant通过创建HasServer一个新实例,为我们提供了添加对新返回类型的支持的可能性,因此我们可以为EitherT ServantErr IO (Source ...)并使其流式传输。

要创建该实例,我们必须实现route :: Proxy layout -> Server layout -> RoutingApplication 。 在这种情况下, Server layout只意味着EitherT ServantErr IO layoutlayout是我们想要服务的源,所以它是返回源的函数(并且可能会因为HTTP错误而失败)。

我们必须返回一个RoutingApplication ,它是(继续式)一个接受Request并返回RouteResult Response的函数,这意味着不匹配的路由错误或响应。 RequestResponse都是标准wai,而不是Servant,所以我们现在可以查看生态系统的其他部分,以了解如何实施它。

幸运的是,我们不必走得太远: Network.Wai.Conduit包含我们需要实现的route函数: responseSource接受一个状态值,一些响应头文件和源文件,并为您提供Response

所以,这是相当多的工作要做,但我们需要的是在那里。 查看实例HasServer * (Get ...)可能会有所帮助。

链接地址: http://www.djcxy.com/p/89867.html

上一篇: Haskell Servant and streaming

下一篇: Interval doesn't clear immediately after repeating for a while