使用eventsource时检测客户端断开连接
我正在尝试为Yesod中的网站构建聊天功能,并且我希望它具有所有已连接用户的列表。我想最好的方法是将用户添加到连接上的用户列表中,并在离开时将其删除。看来,如果它保持连接打开的响应应该阻止,所以我写了天真使用eventsource时检测客户端断开连接
getReceiveR :: Handler()
getReceiveR = do
App chan <- getYesod
req <- waiRequest
res <- lift $ eventSourceAppChan chan req
sendWaiResponse res
liftIO $ putStrLn "client disconnected" <-- Note this
但是,这并不当然的工作,因为sendWaiResponse短路。
有什么方法可以检测客户端何时断开连接?
编辑:我使用一个非常微小的修改版本this tutorial来测试这个概念。
我不能确实运行代码,但会工作吗?
import Control.Monad.Trans.Resource
getReceiveR :: Handler()
getReceiveR = do
App chan <- getYesod
req <- waiRequest
res <- lift $ eventSourceAppChan chan req
register . liftIO $ putStrLn "client disconnected"
sendWaiResponse res
注册函数来自哪里?我无法在Google上找到它。 – 2013-04-07 04:19:25
我想你是指在资源包中找到的那个,但是只有在我停止该应用后才显示该事件。它可能在脚手架工作方面有所不同,我会测试一下。 – 2013-04-07 04:26:00
我知道有一个yesod版本,其中资源直到某个特定时间才能发布,可能会跨越多个请求,但随后发生了一个更改,应该在更新版本的yesod的每个请求结束时进行更改。不幸的是,我不能再比这个更具体。 – 2013-04-07 05:38:56
如果您曾经找到解决方案,您是否介意发布它? – Fyrn 2018-01-08 05:15:42