gpt4 book ai didi

Haskell Servant 和流媒体

转载 作者:行者123 更新时间:2023-12-02 16:34:08 26 4
gpt4 key购买 nike

我正在尝试向我的 servant 服务器添加一项功能,该功能将从 Amazon S3 获取文件并将其流式传输回用户。由于文件可能很大,我不想将它们下载到本地然后将它们提供给客户端,我宁愿将它们直接从 S3 流式传输到客户端。

我使用 Amazonka 来处理 S3,我可以获取 S3 文件的流作为 Conduit 接收器。

但现在我不知道如何从 SinkEitherT ServantErr IO a

谁能解释一下如何做到这一点,或者向我展示一些如何做到这一点的示例?

最佳答案

Servant 中没有任何东西可以开箱即用地执行此操作,但是所有需要的部件都可用。

在我们开始之前,我想如果您可以流式传输到接收器,则意味着您有一个源(gorsBodyGetObjectResponseRsBody ,这是一个源)

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

要创建该实例,我们必须实现 route::Proxy 布局 -> 服务器布局 -> RoutingApplication服务器布局,在本例中,仅表示EitherT ServantErr IO布局layout是我们想要服务器的源,所以它是返回的函数源(并且可能会因 HTTP 错误而失败)。

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

幸运的是,我们不必走太远:Network.Wai.Conduit包含我们实现 route 功能所需的内容:responseSource 接受一个状态值、一些响应 header 和您的源,并为您提供一个 Response

所以,要做的工作相当多,但我们需要的一切都在那里。寻找source of the instance HasServer * (Get ...)可能有帮助。

关于Haskell Servant 和流媒体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34974257/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com