我想使用text/event-stream
. Network.Wai.EventSource看起来是个不错的选择。
我尝试使用此代码:
import Network.Wai
import Network.Wai.EventSource
import Network.Wai.Middleware.AddHeaders
import Network.Wai.Handler.Warp (run)
import qualified Data.ByteString.Lazy as L
import qualified Data.ByteString.Lazy.Char8 as C
import Blaze.ByteString.Builder.ByteString
toEvent :: [L.ByteString] -> ServerEvent
toEvent s = ServerEvent {
eventName = Nothing,
eventId = Nothing,
eventData = map fromLazyByteString s
}
createWaiApp :: IO L.ByteString -> Application
createWaiApp input = eventSourceAppIO $ fmap (toEvent . C.lines) input
main :: IO ()
main = run 1337 $ createWaiApp L.getContents
哪个(我认为)可以:
- 将标准输入读取为惰性字节流
- 将 ByteStream 拆分为行
- 为所有行生成一个 ServerEvent(这感觉不对 - 大概应该有多个事件?)
- 构建一个 WAI 应用程序
IO ServerEvent
- 将应用程序绑定到端口 1337
当我运行它(例如使用ping -c 5 example.com | stack exec test-exe
)时,它不会响应,直到整个 stdin 被读取。
如何构建一个每次从标准输入读取一行时刷新 HTTP 连接的 Wai 应用程序?