我有一个servant
服务器,它实现了一个用于授权的Web Socket票证系统。我使用servant-websockets
和a Conduit endpoint。我定义了一个输入消息:
data WSInput
= Auth {token :: String}
| InMessage {inValue :: Value}
deriving (Show, Generic)
并且由于票证只会持续几秒钟,因此我的管道管道只会检查Auth消息中的第一条入站消息。出站消息如下所示:
data WSOutput
= PoisonPill
| AuthOK
| OutMessage {outValue :: Value}
deriving (Show, Generic)
管道可能类似于:
wsConduit =
mapMC checkTokenExists
.| takeWhileC
( \case
PoisonPill -> False
otherwise -> True
)
管道只是身份验证后的回应。checkTokenExists
只是第一条消息所需要的,实际上它阻塞了所有的InMessage
,所以我不能把它留在那里。
我可以在checkTokenExists
中有一些状态,让InMessage
在授权后通过,但对我来说,似乎最好的方法是用filterC
完全取代mapMC checkTokenExists
,只是让应用程序消息进入。
如何根据流入的单个元素动态更改管道流的形状?
1条答案
按热度按时间krugob8w1#
“根据输入改变程序的形状”=
Monad
。因此,ConduitT
是一个Monad
,具有操作await
和yield
。只需说出你的意思: