@@ -25,6 +25,7 @@ module Network.TypedProtocol.Driver.Simple
2525 -- * Connected peers
2626 , runConnectedPeers
2727 , runConnectedPeersPipelined
28+ , runConnectedPeersAsymmetric
2829 -- * Driver utilities
2930 -- | This may be useful if you want to write your own driver.
3031 , driverSimple
@@ -228,3 +229,28 @@ runConnectedPeersPipelined createChannels tracer codec client server =
228229 tracerClient = contramap ((,) AsClient ) tracer
229230 tracerServer = contramap ((,) AsServer ) tracer
230231
232+
233+ -- Run the same protocol with different codes. This is useful for testing
234+ -- 'Handshake' protocol which knows how to decode different versions.
235+ --
236+ runConnectedPeersAsymmetric
237+ :: ( MonadAsync m
238+ , MonadMask m
239+ , Exception failure
240+ )
241+ => m (Channel m bytes , Channel m bytes )
242+ -> Tracer m (Role , TraceSendRecv ps )
243+ -> Codec ps failure m bytes
244+ -> Codec ps failure m bytes
245+ -> Peer ps pr ('Pipelined c ) Z st m a
246+ -> Peer ps (FlipAgency pr ) 'NonPipelined Z st m b
247+ -> m (a , b )
248+ runConnectedPeersAsymmetric createChannels tracer codec codec' client server =
249+ createChannels >>= \ (clientChannel, serverChannel) ->
250+
251+ (fst <$> runPipelinedPeer tracerClient codec clientChannel client)
252+ `concurrently`
253+ (fst <$> runPeer tracerServer codec' serverChannel server)
254+ where
255+ tracerClient = contramap ((,) Client ) tracer
256+ tracerServer = contramap ((,) Server ) tracer
0 commit comments