使用带有Servant的Amazonka从S3存储桶流式传输

时间:2018-03-17 15:49:05

标签: haskell amazon-s3

我希望能够通过Servant作为响应主体来传输S3存储桶对象内容。

我遇到了因Handler而缺少MonadResource实例的问题:

src/Servant/Streaming/Example.hs:29:3: error:
    * No instance for (MonadResource Handler)
        arising from a use of `runAWS'
    * In a stmt of a 'do' block: runAWS env conduits
      In the expression:
        do env <- newEnv Discover
           runAWS env conduits
      In an equation for `server':
          server
            = do env <- newEnv Discover
                 runAWS env conduits
   |
29 |   runAWS env conduits
   |   ^^^^^^^^^^^^^^^^^^^

我创建了一个存储库来重现:https://github.com/domenkozar/servant-streaming-amazonka

servant-streaming-server处理ResourceT https://github.com/plow-technologies/servant-streaming/blob/master/servant-streaming-server/src/Servant/Streaming/Server/Internal.hs#L77-L79

Stream (Of BS.ByteString) (ResourceT IO) ()

但是因为我正在使用Amazonka,所以我还需要确保Handler的MonadResource采用该括号。我不清楚如何做到这一点。

我的理解是,使用enter / hoistServer这将无法正常工作,因为资源会很快被清理(流式传输之前)。

注意:

编辑

  1. 编辑:我已将$$替换为$$+-
  2. EDIT2:我已经解决了管道特定的错误,现在正在与MonadResource斗争

1 个答案:

答案 0 :(得分:1)

解决了

server :: Server API
server =  do
  env <- newEnv Discover
  res <- runInternalState (runAWS env conduits) st
  return (res >> liftIO (closeInternalState st))

https://github.com/domenkozar/servant-streaming-amazonka/commit/c5fad78dd7bf733cecb8790035105c819d5f5ae9