From 626bb8f312c1f5ede893f179233e91bec7804248 Mon Sep 17 00:00:00 2001 From: Vamshi Surabhi Date: Tue, 26 Mar 2019 13:46:56 +0530 Subject: [PATCH] add user information to transactions in ws protocol, fixes #1867 --- .../Hasura/GraphQL/Resolve/LiveQuery.hs | 1 + .../Hasura/GraphQL/Transport/WebSocket.hs | 20 +++++++++---------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/server/src-lib/Hasura/GraphQL/Resolve/LiveQuery.hs b/server/src-lib/Hasura/GraphQL/Resolve/LiveQuery.hs index 08296339c6a2c..59a5081e62209 100644 --- a/server/src-lib/Hasura/GraphQL/Resolve/LiveQuery.hs +++ b/server/src-lib/Hasura/GraphQL/Resolve/LiveQuery.hs @@ -3,6 +3,7 @@ module Hasura.GraphQL.Resolve.LiveQuery , LiveQueryMap , newLiveQueryMap , addLiveQuery + , TxRunner , removeLiveQuery ) where diff --git a/server/src-lib/Hasura/GraphQL/Transport/WebSocket.hs b/server/src-lib/Hasura/GraphQL/Transport/WebSocket.hs index 074bd6d475f57..4a6dcf736f6d6 100644 --- a/server/src-lib/Hasura/GraphQL/Transport/WebSocket.hs +++ b/server/src-lib/Hasura/GraphQL/Transport/WebSocket.hs @@ -30,7 +30,6 @@ import Hasura.EncJSON import Hasura.GraphQL.Context (GCtx) import qualified Hasura.GraphQL.Execute as E import qualified Hasura.GraphQL.Resolve as R -import Hasura.GraphQL.Resolve.Context (LazyRespTx) import qualified Hasura.GraphQL.Resolve.LiveQuery as LQ import Hasura.GraphQL.Transport.HTTP.Protocol import Hasura.GraphQL.Transport.WebSocket.Protocol @@ -47,8 +46,6 @@ import Hasura.Server.Utils (bsToTxt) -- uniquely identifies an operation type GOperationId = (WS.WSId, OperationId) -type TxRunner = LazyRespTx -> IO (Either QErr EncJSON) - type OperationMap = STMMap.Map OperationId LQ.LiveQuery @@ -124,7 +121,7 @@ data WSServerEnv = WSServerEnv { _wseLogger :: !L.Logger , _wseServer :: !WSServer - , _wseRunTx :: !TxRunner + , _wseRunTx :: !LQ.TxRunner , _wseLiveQMap :: !LiveQueryMap , _wseGCtxMap :: !(IORef.IORef SchemaCache) , _wseHManager :: !H.Manager @@ -233,11 +230,14 @@ onStart serverEnv wsConn (StartMsg opId q) msgRaw = catchAndIgnore $ do runHasuraGQ userInfo gCtx rootSelSet = case rootSelSet of V.RQuery selSet -> - execQueryOrMut $ R.resolveQuerySelSet userInfo gCtx sqlGenCtx selSet + execQueryOrMut $ withUserInfo userInfo $ + R.resolveQuerySelSet userInfo gCtx sqlGenCtx selSet V.RMutation selSet -> - execQueryOrMut $ R.resolveMutSelSet userInfo gCtx sqlGenCtx selSet + execQueryOrMut $ withUserInfo userInfo $ + R.resolveMutSelSet userInfo gCtx sqlGenCtx selSet V.RSubscription fld -> do - let tx = R.resolveSubsFld userInfo gCtx sqlGenCtx fld + let tx = withUserInfo userInfo $ + R.resolveSubsFld userInfo gCtx sqlGenCtx fld let lq = LQ.LiveQuery userInfo q liftIO $ STM.atomically $ STMMap.insert lq opId opMap liftIO $ LQ.addLiveQuery runTx lqMap lq @@ -271,7 +271,6 @@ onStart serverEnv wsConn (StartMsg opId q) msgRaw = catchAndIgnore $ do either postExecErr sendSuccResp resp sendCompleted - WSServerEnv logger _ runTx lqMap gCtxMapRef httpMgr _ sqlGenCtx = serverEnv wsId = WS.getWSId wsConn @@ -416,11 +415,12 @@ onClose logger lqMap _ wsConn = do createWSServerEnv :: L.Logger -> H.Manager -> SQLGenCtx -> IORef.IORef SchemaCache - -> TxRunner -> CorsPolicy -> IO WSServerEnv + -> LQ.TxRunner -> CorsPolicy -> IO WSServerEnv createWSServerEnv logger httpManager sqlGenCtx cacheRef runTx corsPolicy = do (wsServer, lqMap) <- STM.atomically $ (,) <$> WS.createWSServer logger <*> LQ.newLiveQueryMap - return $ WSServerEnv logger wsServer runTx lqMap cacheRef httpManager corsPolicy sqlGenCtx + return $ WSServerEnv logger wsServer runTx lqMap cacheRef + httpManager corsPolicy sqlGenCtx createWSServerApp :: AuthMode -> WSServerEnv -> WS.ServerApp createWSServerApp authMode serverEnv =