我希望能够通过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
这将无法正常工作,因为资源会很快被清理(流式传输之前)。
注意:
$$
替换为$$+-
答案 0 :(得分:1)
解决了
server :: Server API
server = do
env <- newEnv Discover
res <- runInternalState (runAWS env conduits) st
return (res >> liftIO (closeInternalState st))