Preliminary streaming mode support (client streaming, server streaming, bidirectional) (#37)
* Tweak runOps param order, inline common op sequences, clean up serverHandleNormalCall
* More ops sequence inlining for clarity, experimenting with Managed
* Checkpoint: preliminary support for all streaming modes; much cleanup/refactoring and api design still needed
* Use mempty for default StatusDetails; tweak bad status matching mechanism
* Preliminary user-facing, server-streaming, low-level api and test
* renaming wibbles
* Preliminary user-facing, client-streaming, low-level api and test
* Move sendMsgs comb to Network.GRPC.LowLevel.Op; misc cleanup/DCR
* Modify bidi streaming to omit request payload
* Add transformers dep
* Preliminary user-facing low-level bidirectional streaming api and test
* Fix missing peek import
* Remove TimeoutSeconds params on streaming mode functions
* Fix serverHandleNormalCall rebase wart
* Fix rebase warts; minor hlint fixes and wibbles
* Post-rebase tweaks to optional payload use in serverRequestCall (i.e., now respects payloadHandling again)
* Cleanup/refactor serverRequestCall
* Fix comment
* Change ServerRWHandler type so that handler does not have to invoke a finalizer
* Change ServerReaderHandler type so that handler does not have to invoke a finalizer
* Simplify serverWriter interface and ServerWriterHandler structure
* Simplify serverRW (get rid of exec param), improve bidi streaming tests
* Use ExceptT in serverRW impl
* Change ServerRWHandler type to pass recv/send operations.
* Renaming
* Define ClientRWHandler, pass recv/send ops
* wibbles
* Use ExceptT in clientRW impl
* Add DataKinded phantom typing to RegisteredMethod; misc cleanup
* Simplify sendMsgs interface; add SingleSend type and related helpers
* Rename SingleSend to SendSingle, use ExceptT to clean up {client,server}Writer and sendMsgs
* More ExceptT cleanup in clientWriter
* Factor out reusable bits of clientWriter
* Shrink ServerReaderHandler
* Delete stale comments
* Use common machinery for all streaming modes; make handler types more consistent
* wibbles
2016-07-06 15:59:38 +02:00
|
|
|
{-# LANGUAGE LambdaCase #-}
|
2016-06-08 18:18:43 +02:00
|
|
|
{-# LANGUAGE RecordWildCards #-}
|
|
|
|
|
|
|
|
module Network.GRPC.LowLevel.Server.Unregistered where
|
|
|
|
|
2019-08-22 17:55:33 +02:00
|
|
|
import Control.Exception (bracket, finally, mask)
|
2016-08-09 18:30:47 +02:00
|
|
|
import Control.Monad
|
2016-07-14 18:53:28 +02:00
|
|
|
import Control.Monad.Trans.Except
|
2016-06-08 19:45:47 +02:00
|
|
|
import Data.ByteString (ByteString)
|
2016-06-08 18:18:43 +02:00
|
|
|
import Network.GRPC.LowLevel.Call.Unregistered
|
2016-06-08 22:53:09 +02:00
|
|
|
import Network.GRPC.LowLevel.CompletionQueue.Unregistered (serverRequestCall)
|
2016-06-08 18:18:43 +02:00
|
|
|
import Network.GRPC.LowLevel.GRPC
|
2016-08-09 18:30:47 +02:00
|
|
|
import Network.GRPC.LowLevel.Op
|
|
|
|
import Network.GRPC.LowLevel.Server (Server (..),
|
|
|
|
ServerRWHandlerLL,
|
|
|
|
ServerReaderHandlerLL,
|
|
|
|
ServerWriterHandlerLL,
|
2016-08-10 23:38:58 +02:00
|
|
|
forkServer,
|
|
|
|
serverReader',
|
|
|
|
serverWriter',
|
|
|
|
serverRW')
|
2016-06-08 19:45:47 +02:00
|
|
|
import qualified Network.GRPC.Unsafe.Op as C
|
2016-06-08 18:18:43 +02:00
|
|
|
|
Joel/highlevelv2 (#40)
* Tweak runOps param order, inline common op sequences, clean up serverHandleNormalCall
* More ops sequence inlining for clarity, experimenting with Managed
* Checkpoint: preliminary support for all streaming modes; much cleanup/refactoring and api design still needed
* Use mempty for default StatusDetails; tweak bad status matching mechanism
* Preliminary user-facing, server-streaming, low-level api and test
* renaming wibbles
* Preliminary user-facing, client-streaming, low-level api and test
* Move sendMsgs comb to Network.GRPC.LowLevel.Op; misc cleanup/DCR
* Modify bidi streaming to omit request payload
* Add transformers dep
* Preliminary user-facing low-level bidirectional streaming api and test
* Fix missing peek import
* Remove TimeoutSeconds params on streaming mode functions
* Fix serverHandleNormalCall rebase wart
* Fix rebase warts; minor hlint fixes and wibbles
* Post-rebase tweaks to optional payload use in serverRequestCall (i.e., now respects payloadHandling again)
* Cleanup/refactor serverRequestCall
* Fix comment
* Change ServerRWHandler type so that handler does not have to invoke a finalizer
* Change ServerReaderHandler type so that handler does not have to invoke a finalizer
* Simplify serverWriter interface and ServerWriterHandler structure
* Simplify serverRW (get rid of exec param), improve bidi streaming tests
* Use ExceptT in serverRW impl
* Change ServerRWHandler type to pass recv/send operations.
* Renaming
* Define ClientRWHandler, pass recv/send ops
* wibbles
* Use ExceptT in clientRW impl
* Add DataKinded phantom typing to RegisteredMethod; misc cleanup
* Simplify sendMsgs interface; add SingleSend type and related helpers
* Rename SingleSend to SendSingle, use ExceptT to clean up {client,server}Writer and sendMsgs
* More ExceptT cleanup in clientWriter
* Factor out reusable bits of clientWriter
* Shrink ServerReaderHandler
* Delete stale comments
* begin high-level server interface
* update to datakind representation
* clean up
* move method type info to type level, parametrize ServerCall by payload
* convert for writer handler
* start switching over to Message-based handlers
* begin work on highlevel example
* comment out old code
* parametrize StreamSend
* parametrize StreamRecv
* conversion for ServerReaderHandler
* finish handler conversions
* Add high level version and payload checking to echo-client
* Decouple server CQs from call-bound CQs (registered methods); use more consistent naming conventions
* Decouple server/call-bound CQs for unregistered methods; refactor U.serverRequestCall; misc cleanup
* Make convertRecv total; formatting wibbles
2016-07-12 20:28:21 +02:00
|
|
|
serverCreateCall :: Server
|
|
|
|
-> IO (Either GRPCIOError ServerCall)
|
2016-07-27 00:21:35 +02:00
|
|
|
serverCreateCall Server{..} =
|
2016-07-21 21:55:16 +02:00
|
|
|
serverRequestCall unsafeServer serverCQ serverCallCQ
|
2016-06-08 18:18:43 +02:00
|
|
|
|
2016-06-22 19:41:14 +02:00
|
|
|
withServerCall :: Server
|
Joel/highlevelv2 (#40)
* Tweak runOps param order, inline common op sequences, clean up serverHandleNormalCall
* More ops sequence inlining for clarity, experimenting with Managed
* Checkpoint: preliminary support for all streaming modes; much cleanup/refactoring and api design still needed
* Use mempty for default StatusDetails; tweak bad status matching mechanism
* Preliminary user-facing, server-streaming, low-level api and test
* renaming wibbles
* Preliminary user-facing, client-streaming, low-level api and test
* Move sendMsgs comb to Network.GRPC.LowLevel.Op; misc cleanup/DCR
* Modify bidi streaming to omit request payload
* Add transformers dep
* Preliminary user-facing low-level bidirectional streaming api and test
* Fix missing peek import
* Remove TimeoutSeconds params on streaming mode functions
* Fix serverHandleNormalCall rebase wart
* Fix rebase warts; minor hlint fixes and wibbles
* Post-rebase tweaks to optional payload use in serverRequestCall (i.e., now respects payloadHandling again)
* Cleanup/refactor serverRequestCall
* Fix comment
* Change ServerRWHandler type so that handler does not have to invoke a finalizer
* Change ServerReaderHandler type so that handler does not have to invoke a finalizer
* Simplify serverWriter interface and ServerWriterHandler structure
* Simplify serverRW (get rid of exec param), improve bidi streaming tests
* Use ExceptT in serverRW impl
* Change ServerRWHandler type to pass recv/send operations.
* Renaming
* Define ClientRWHandler, pass recv/send ops
* wibbles
* Use ExceptT in clientRW impl
* Add DataKinded phantom typing to RegisteredMethod; misc cleanup
* Simplify sendMsgs interface; add SingleSend type and related helpers
* Rename SingleSend to SendSingle, use ExceptT to clean up {client,server}Writer and sendMsgs
* More ExceptT cleanup in clientWriter
* Factor out reusable bits of clientWriter
* Shrink ServerReaderHandler
* Delete stale comments
* begin high-level server interface
* update to datakind representation
* clean up
* move method type info to type level, parametrize ServerCall by payload
* convert for writer handler
* start switching over to Message-based handlers
* begin work on highlevel example
* comment out old code
* parametrize StreamSend
* parametrize StreamRecv
* conversion for ServerReaderHandler
* finish handler conversions
* Add high level version and payload checking to echo-client
* Decouple server CQs from call-bound CQs (registered methods); use more consistent naming conventions
* Decouple server/call-bound CQs for unregistered methods; refactor U.serverRequestCall; misc cleanup
* Make convertRecv total; formatting wibbles
2016-07-12 20:28:21 +02:00
|
|
|
-> (ServerCall -> IO (Either GRPCIOError a))
|
|
|
|
-> IO (Either GRPCIOError a)
|
|
|
|
withServerCall s f =
|
2019-08-22 17:55:33 +02:00
|
|
|
bracket (serverCreateCall s) cleanup $ \case
|
|
|
|
Left e -> return (Left e)
|
|
|
|
Right c -> f c
|
|
|
|
where
|
|
|
|
cleanup (Left _) = pure ()
|
|
|
|
cleanup (Right c) = do
|
2016-07-14 18:53:28 +02:00
|
|
|
grpcDebug "withServerCall: destroying."
|
|
|
|
destroyServerCall c
|
|
|
|
|
|
|
|
-- | Gets a call and then forks the given function on a new thread, with the
|
|
|
|
-- new call as input. Blocks until a call is received, then returns immediately.
|
|
|
|
-- Handles cleaning up the call safely.
|
|
|
|
-- Because this function doesn't wait for the handler to return, it cannot
|
|
|
|
-- return errors.
|
|
|
|
withServerCallAsync :: Server
|
2016-08-09 18:30:47 +02:00
|
|
|
-> (ServerCall -> IO ())
|
|
|
|
-> IO ()
|
2019-08-22 17:55:33 +02:00
|
|
|
withServerCallAsync s f = mask $ \unmask ->
|
2016-07-14 18:53:28 +02:00
|
|
|
serverCreateCall s >>= \case
|
2016-07-18 18:04:01 +02:00
|
|
|
Left e -> do grpcDebug $ "withServerCallAsync: call error: " ++ show e
|
|
|
|
return ()
|
|
|
|
Right c -> do wasForkSuccess <- forkServer s handler
|
2016-08-09 18:30:47 +02:00
|
|
|
unless wasForkSuccess destroy
|
2019-08-22 17:55:33 +02:00
|
|
|
where handler = unmask (f c) `finally` destroy
|
2016-08-09 18:30:47 +02:00
|
|
|
-- TODO: We sometimes never finish cleanup if the server
|
|
|
|
-- is shutting down and calls killThread. This causes gRPC
|
|
|
|
-- core to complain about leaks. I think the cause of
|
|
|
|
-- this is that killThread gets called after we are
|
|
|
|
-- already in destroyServerCall, and wrapping
|
|
|
|
-- uninterruptibleMask doesn't seem to help. Doesn't
|
|
|
|
-- crash, but does emit annoying log messages.
|
2016-07-18 18:04:01 +02:00
|
|
|
destroy = do
|
|
|
|
grpcDebug "withServerCallAsync: destroying."
|
|
|
|
destroyServerCall c
|
|
|
|
grpcDebug "withServerCallAsync: cleanup finished."
|
2016-06-08 18:18:43 +02:00
|
|
|
|
2016-06-08 18:50:57 +02:00
|
|
|
-- | A handler for an unregistered server call; bytestring arguments are the
|
|
|
|
-- request body and response body respectively.
|
|
|
|
type ServerHandler
|
Joel/highlevelv2 (#40)
* Tweak runOps param order, inline common op sequences, clean up serverHandleNormalCall
* More ops sequence inlining for clarity, experimenting with Managed
* Checkpoint: preliminary support for all streaming modes; much cleanup/refactoring and api design still needed
* Use mempty for default StatusDetails; tweak bad status matching mechanism
* Preliminary user-facing, server-streaming, low-level api and test
* renaming wibbles
* Preliminary user-facing, client-streaming, low-level api and test
* Move sendMsgs comb to Network.GRPC.LowLevel.Op; misc cleanup/DCR
* Modify bidi streaming to omit request payload
* Add transformers dep
* Preliminary user-facing low-level bidirectional streaming api and test
* Fix missing peek import
* Remove TimeoutSeconds params on streaming mode functions
* Fix serverHandleNormalCall rebase wart
* Fix rebase warts; minor hlint fixes and wibbles
* Post-rebase tweaks to optional payload use in serverRequestCall (i.e., now respects payloadHandling again)
* Cleanup/refactor serverRequestCall
* Fix comment
* Change ServerRWHandler type so that handler does not have to invoke a finalizer
* Change ServerReaderHandler type so that handler does not have to invoke a finalizer
* Simplify serverWriter interface and ServerWriterHandler structure
* Simplify serverRW (get rid of exec param), improve bidi streaming tests
* Use ExceptT in serverRW impl
* Change ServerRWHandler type to pass recv/send operations.
* Renaming
* Define ClientRWHandler, pass recv/send ops
* wibbles
* Use ExceptT in clientRW impl
* Add DataKinded phantom typing to RegisteredMethod; misc cleanup
* Simplify sendMsgs interface; add SingleSend type and related helpers
* Rename SingleSend to SendSingle, use ExceptT to clean up {client,server}Writer and sendMsgs
* More ExceptT cleanup in clientWriter
* Factor out reusable bits of clientWriter
* Shrink ServerReaderHandler
* Delete stale comments
* begin high-level server interface
* update to datakind representation
* clean up
* move method type info to type level, parametrize ServerCall by payload
* convert for writer handler
* start switching over to Message-based handlers
* begin work on highlevel example
* comment out old code
* parametrize StreamSend
* parametrize StreamRecv
* conversion for ServerReaderHandler
* finish handler conversions
* Add high level version and payload checking to echo-client
* Decouple server CQs from call-bound CQs (registered methods); use more consistent naming conventions
* Decouple server/call-bound CQs for unregistered methods; refactor U.serverRequestCall; misc cleanup
* Make convertRecv total; formatting wibbles
2016-07-12 20:28:21 +02:00
|
|
|
= ServerCall
|
|
|
|
-> ByteString
|
2016-06-16 17:23:54 +02:00
|
|
|
-> IO (ByteString, MetadataMap, C.StatusCode, StatusDetails)
|
2016-06-08 18:50:57 +02:00
|
|
|
|
2016-06-08 18:18:43 +02:00
|
|
|
-- | Handle one unregistered call.
|
2016-06-08 18:50:57 +02:00
|
|
|
serverHandleNormalCall :: Server
|
|
|
|
-> MetadataMap -- ^ Initial server metadata.
|
|
|
|
-> ServerHandler
|
|
|
|
-> IO (Either GRPCIOError ())
|
2016-07-14 18:53:28 +02:00
|
|
|
serverHandleNormalCall s initMeta f =
|
|
|
|
withServerCall s $ \c -> serverHandleNormalCall' s c initMeta f
|
|
|
|
|
|
|
|
serverHandleNormalCall' :: Server
|
|
|
|
-> ServerCall
|
|
|
|
-> MetadataMap -- ^ Initial server metadata.
|
|
|
|
-> ServerHandler
|
|
|
|
-> IO (Either GRPCIOError ())
|
|
|
|
serverHandleNormalCall'
|
2016-07-15 01:33:56 +02:00
|
|
|
_ sc@ServerCall{ unsafeSC = c, callCQ = cq, .. } initMeta f = do
|
Joel/highlevelv2 (#40)
* Tweak runOps param order, inline common op sequences, clean up serverHandleNormalCall
* More ops sequence inlining for clarity, experimenting with Managed
* Checkpoint: preliminary support for all streaming modes; much cleanup/refactoring and api design still needed
* Use mempty for default StatusDetails; tweak bad status matching mechanism
* Preliminary user-facing, server-streaming, low-level api and test
* renaming wibbles
* Preliminary user-facing, client-streaming, low-level api and test
* Move sendMsgs comb to Network.GRPC.LowLevel.Op; misc cleanup/DCR
* Modify bidi streaming to omit request payload
* Add transformers dep
* Preliminary user-facing low-level bidirectional streaming api and test
* Fix missing peek import
* Remove TimeoutSeconds params on streaming mode functions
* Fix serverHandleNormalCall rebase wart
* Fix rebase warts; minor hlint fixes and wibbles
* Post-rebase tweaks to optional payload use in serverRequestCall (i.e., now respects payloadHandling again)
* Cleanup/refactor serverRequestCall
* Fix comment
* Change ServerRWHandler type so that handler does not have to invoke a finalizer
* Change ServerReaderHandler type so that handler does not have to invoke a finalizer
* Simplify serverWriter interface and ServerWriterHandler structure
* Simplify serverRW (get rid of exec param), improve bidi streaming tests
* Use ExceptT in serverRW impl
* Change ServerRWHandler type to pass recv/send operations.
* Renaming
* Define ClientRWHandler, pass recv/send ops
* wibbles
* Use ExceptT in clientRW impl
* Add DataKinded phantom typing to RegisteredMethod; misc cleanup
* Simplify sendMsgs interface; add SingleSend type and related helpers
* Rename SingleSend to SendSingle, use ExceptT to clean up {client,server}Writer and sendMsgs
* More ExceptT cleanup in clientWriter
* Factor out reusable bits of clientWriter
* Shrink ServerReaderHandler
* Delete stale comments
* begin high-level server interface
* update to datakind representation
* clean up
* move method type info to type level, parametrize ServerCall by payload
* convert for writer handler
* start switching over to Message-based handlers
* begin work on highlevel example
* comment out old code
* parametrize StreamSend
* parametrize StreamRecv
* conversion for ServerReaderHandler
* finish handler conversions
* Add high level version and payload checking to echo-client
* Decouple server CQs from call-bound CQs (registered methods); use more consistent naming conventions
* Decouple server/call-bound CQs for unregistered methods; refactor U.serverRequestCall; misc cleanup
* Make convertRecv total; formatting wibbles
2016-07-12 20:28:21 +02:00
|
|
|
grpcDebug "serverHandleNormalCall(U): starting batch."
|
|
|
|
runOps c cq
|
|
|
|
[ OpSendInitialMetadata initMeta
|
|
|
|
, OpRecvMessage
|
|
|
|
]
|
|
|
|
>>= \case
|
|
|
|
Left x -> do
|
|
|
|
grpcDebug "serverHandleNormalCall(U): ops failed; aborting"
|
|
|
|
return $ Left x
|
|
|
|
Right [OpRecvMessageResult (Just body)] -> do
|
2016-07-15 01:33:56 +02:00
|
|
|
grpcDebug $ "got client metadata: " ++ show metadata
|
Joel/highlevelv2 (#40)
* Tweak runOps param order, inline common op sequences, clean up serverHandleNormalCall
* More ops sequence inlining for clarity, experimenting with Managed
* Checkpoint: preliminary support for all streaming modes; much cleanup/refactoring and api design still needed
* Use mempty for default StatusDetails; tweak bad status matching mechanism
* Preliminary user-facing, server-streaming, low-level api and test
* renaming wibbles
* Preliminary user-facing, client-streaming, low-level api and test
* Move sendMsgs comb to Network.GRPC.LowLevel.Op; misc cleanup/DCR
* Modify bidi streaming to omit request payload
* Add transformers dep
* Preliminary user-facing low-level bidirectional streaming api and test
* Fix missing peek import
* Remove TimeoutSeconds params on streaming mode functions
* Fix serverHandleNormalCall rebase wart
* Fix rebase warts; minor hlint fixes and wibbles
* Post-rebase tweaks to optional payload use in serverRequestCall (i.e., now respects payloadHandling again)
* Cleanup/refactor serverRequestCall
* Fix comment
* Change ServerRWHandler type so that handler does not have to invoke a finalizer
* Change ServerReaderHandler type so that handler does not have to invoke a finalizer
* Simplify serverWriter interface and ServerWriterHandler structure
* Simplify serverRW (get rid of exec param), improve bidi streaming tests
* Use ExceptT in serverRW impl
* Change ServerRWHandler type to pass recv/send operations.
* Renaming
* Define ClientRWHandler, pass recv/send ops
* wibbles
* Use ExceptT in clientRW impl
* Add DataKinded phantom typing to RegisteredMethod; misc cleanup
* Simplify sendMsgs interface; add SingleSend type and related helpers
* Rename SingleSend to SendSingle, use ExceptT to clean up {client,server}Writer and sendMsgs
* More ExceptT cleanup in clientWriter
* Factor out reusable bits of clientWriter
* Shrink ServerReaderHandler
* Delete stale comments
* begin high-level server interface
* update to datakind representation
* clean up
* move method type info to type level, parametrize ServerCall by payload
* convert for writer handler
* start switching over to Message-based handlers
* begin work on highlevel example
* comment out old code
* parametrize StreamSend
* parametrize StreamRecv
* conversion for ServerReaderHandler
* finish handler conversions
* Add high level version and payload checking to echo-client
* Decouple server CQs from call-bound CQs (registered methods); use more consistent naming conventions
* Decouple server/call-bound CQs for unregistered methods; refactor U.serverRequestCall; misc cleanup
* Make convertRecv total; formatting wibbles
2016-07-12 20:28:21 +02:00
|
|
|
grpcDebug $ "call_details host is: " ++ show callHost
|
|
|
|
(rsp, trailMeta, st, ds) <- f sc body
|
2016-08-09 18:30:47 +02:00
|
|
|
-- TODO: We have to put 'OpRecvCloseOnServer' in the response ops,
|
|
|
|
-- or else the client times out. Given this, I have no idea how to
|
|
|
|
-- check for cancellation on the server.
|
Joel/highlevelv2 (#40)
* Tweak runOps param order, inline common op sequences, clean up serverHandleNormalCall
* More ops sequence inlining for clarity, experimenting with Managed
* Checkpoint: preliminary support for all streaming modes; much cleanup/refactoring and api design still needed
* Use mempty for default StatusDetails; tweak bad status matching mechanism
* Preliminary user-facing, server-streaming, low-level api and test
* renaming wibbles
* Preliminary user-facing, client-streaming, low-level api and test
* Move sendMsgs comb to Network.GRPC.LowLevel.Op; misc cleanup/DCR
* Modify bidi streaming to omit request payload
* Add transformers dep
* Preliminary user-facing low-level bidirectional streaming api and test
* Fix missing peek import
* Remove TimeoutSeconds params on streaming mode functions
* Fix serverHandleNormalCall rebase wart
* Fix rebase warts; minor hlint fixes and wibbles
* Post-rebase tweaks to optional payload use in serverRequestCall (i.e., now respects payloadHandling again)
* Cleanup/refactor serverRequestCall
* Fix comment
* Change ServerRWHandler type so that handler does not have to invoke a finalizer
* Change ServerReaderHandler type so that handler does not have to invoke a finalizer
* Simplify serverWriter interface and ServerWriterHandler structure
* Simplify serverRW (get rid of exec param), improve bidi streaming tests
* Use ExceptT in serverRW impl
* Change ServerRWHandler type to pass recv/send operations.
* Renaming
* Define ClientRWHandler, pass recv/send ops
* wibbles
* Use ExceptT in clientRW impl
* Add DataKinded phantom typing to RegisteredMethod; misc cleanup
* Simplify sendMsgs interface; add SingleSend type and related helpers
* Rename SingleSend to SendSingle, use ExceptT to clean up {client,server}Writer and sendMsgs
* More ExceptT cleanup in clientWriter
* Factor out reusable bits of clientWriter
* Shrink ServerReaderHandler
* Delete stale comments
* begin high-level server interface
* update to datakind representation
* clean up
* move method type info to type level, parametrize ServerCall by payload
* convert for writer handler
* start switching over to Message-based handlers
* begin work on highlevel example
* comment out old code
* parametrize StreamSend
* parametrize StreamRecv
* conversion for ServerReaderHandler
* finish handler conversions
* Add high level version and payload checking to echo-client
* Decouple server CQs from call-bound CQs (registered methods); use more consistent naming conventions
* Decouple server/call-bound CQs for unregistered methods; refactor U.serverRequestCall; misc cleanup
* Make convertRecv total; formatting wibbles
2016-07-12 20:28:21 +02:00
|
|
|
runOps c cq
|
|
|
|
[ OpRecvCloseOnServer
|
|
|
|
, OpSendMessage rsp,
|
|
|
|
OpSendStatusFromServer trailMeta st ds
|
|
|
|
]
|
|
|
|
>>= \case
|
|
|
|
Left x -> do
|
|
|
|
grpcDebug "serverHandleNormalCall(U): resp failed."
|
|
|
|
return $ Left x
|
|
|
|
Right _ -> do
|
|
|
|
grpcDebug "serverHandleNormalCall(U): ops done."
|
|
|
|
return $ Right ()
|
|
|
|
x -> error $ "impossible pattern match: " ++ show x
|
2016-07-14 18:53:28 +02:00
|
|
|
|
|
|
|
serverReader :: Server
|
|
|
|
-> ServerCall
|
2016-08-09 18:30:47 +02:00
|
|
|
-> MetadataMap -- ^ Initial server metadata
|
2016-07-15 01:33:56 +02:00
|
|
|
-> ServerReaderHandlerLL
|
2016-07-14 18:53:28 +02:00
|
|
|
-> IO (Either GRPCIOError ())
|
2016-08-10 23:38:58 +02:00
|
|
|
serverReader s = serverReader' s . convertCall
|
2016-07-14 18:53:28 +02:00
|
|
|
|
|
|
|
serverWriter :: Server
|
|
|
|
-> ServerCall
|
2016-08-09 18:30:47 +02:00
|
|
|
-> MetadataMap -- ^ Initial server metadata
|
2016-07-15 01:33:56 +02:00
|
|
|
-> ServerWriterHandlerLL
|
2016-07-14 18:53:28 +02:00
|
|
|
-> IO (Either GRPCIOError ())
|
2016-08-10 23:38:58 +02:00
|
|
|
serverWriter s sc@ServerCall{ unsafeSC = c, callCQ = ccq } initMeta f =
|
2016-07-14 18:53:28 +02:00
|
|
|
runExceptT $ do
|
|
|
|
bs <- recvInitialMessage c ccq
|
2016-08-10 23:38:58 +02:00
|
|
|
ExceptT (serverWriter' s (const bs <$> convertCall sc) initMeta f)
|
2016-07-14 18:53:28 +02:00
|
|
|
|
|
|
|
serverRW :: Server
|
|
|
|
-> ServerCall
|
2016-08-09 18:30:47 +02:00
|
|
|
-> MetadataMap -- ^ Initial server metadata
|
2016-07-15 01:33:56 +02:00
|
|
|
-> ServerRWHandlerLL
|
2016-07-14 18:53:28 +02:00
|
|
|
-> IO (Either GRPCIOError ())
|
2016-08-10 23:38:58 +02:00
|
|
|
serverRW s = serverRW' s . convertCall
|