\subsection{Replies to RPC requests}
A \textit{reply} to a Request packet is a Response packet with the Request ID in
the Response packet set equal to the Request ID in the Request packet. A
response is accepted if and only if it is the first received reply to a request
which was sent sufficiently recently, according to a time limit which depends on
the service.
\begin{code}
{-# LANGUAGE Safe #-}
module Network.Tox.DHT.PendingReplies where
import qualified Network.Tox.DHT.RpcPacket as RpcPacket
import Network.Tox.DHT.Stamped (Stamped)
import qualified Network.Tox.DHT.Stamped as Stamped
import Network.Tox.NodeInfo.NodeInfo (NodeInfo)
import Network.Tox.Time (Timestamp)
type PendingReplies = Stamped (NodeInfo, RpcPacket.RequestId)
expectReply :: Timestamp -> NodeInfo -> RpcPacket.RequestId ->
PendingReplies -> PendingReplies
expectReply time node requestId = Stamped.add time (node, requestId)
checkExpectedReply :: Timestamp -> NodeInfo -> RpcPacket.RequestId ->
PendingReplies -> (Bool, PendingReplies)
checkExpectedReply cutoff node requestId pendingReplies =
case filter (>= cutoff) $
Stamped.findStamps (== (node, requestId)) pendingReplies
of
[] -> (False, pendingReplies)
time:_ -> (True, Stamped.delete time (node, requestId) pendingReplies)
\end{code}