improve clientKeepLocked

This commit is contained in:
Joey Hess 2024-07-22 16:56:44 -04:00
parent 10682eb882
commit d5eaf0f567
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
2 changed files with 22 additions and 22 deletions

View file

@ -133,18 +133,15 @@ getAuthEnv = do
testKeepLocked = do testKeepLocked = do
mgr <- httpManager <$> getUrlOptions mgr <- httpManager <$> getUrlOptions
burl <- liftIO $ parseBaseUrl "http://localhost:8080/" burl <- liftIO $ parseBaseUrl "http://localhost:8080/"
keeplocked <- liftIO newEmptyTMVarIO
_ <- liftIO $ forkIO $ do
print "running, press enter to drop lock"
_ <- getLine
atomically $ writeTMVar keeplocked False
liftIO $ clientKeepLocked (mkClientEnv mgr burl) liftIO $ clientKeepLocked (mkClientEnv mgr burl)
(P2P.ProtocolVersion 3) (P2P.ProtocolVersion 3)
(B64UUID (toUUID ("lck" :: String))) (B64UUID (toUUID ("lck" :: String)))
(B64UUID (toUUID ("cu" :: String))) (B64UUID (toUUID ("cu" :: String)))
(B64UUID (toUUID ("su" :: String))) (B64UUID (toUUID ("su" :: String)))
[] [] $ \keeplocked -> do
keeplocked print "running, press enter to drop lock"
_ <- getLine
atomically $ writeTMVar keeplocked False
testCheckPresent = do testCheckPresent = do
mgr <- httpManager <$> getUrlOptions mgr <- httpManager <$> getUrlOptions

View file

@ -873,28 +873,31 @@ clientKeepLocked
-> B64UUID ClientSide -> B64UUID ClientSide
-> B64UUID ServerSide -> B64UUID ServerSide
-> [B64UUID Bypass] -> [B64UUID Bypass]
-> TMVar Bool -> (TMVar Bool -> IO ())
-- ^ The TMVar can be filled any number of times with True to send
-- repeated keep locked requests, eg to keep a connection alive.
-- Once filled with False, the lock will be dropped.
-> IO () -> IO ()
clientKeepLocked clientenv (ProtocolVersion ver) lckid cu su bypass keeplocked = do clientKeepLocked clientenv (ProtocolVersion ver) lckid cu su bypass a = do
keeplocked <- newEmptyTMVarIO
tid <- async $ a keeplocked
let cli' = cli lckid cu bypass
(Just connectionKeepAlive) (Just keepAlive)
(S.fromStepT (unlocksender keeplocked))
withClientM cli' clientenv $ \case withClientM cli' clientenv $ \case
Left err -> throwM err
Right (LockResult _ _) -> Right (LockResult _ _) ->
liftIO $ print "end of lock connection to server" wait tid
Left err -> do
wait tid
throwM err
where where
unlocksender = unlocksender keeplocked =
S.Yield (UnlockRequest False) $ S.Effect $ do S.Yield (UnlockRequest False) $ S.Effect $ do
liftIO $ print "sent keep locked request"
return $ S.Effect $ do return $ S.Effect $ do
stilllocked <- liftIO $ atomically $ takeTMVar keeplocked stilllocked <- liftIO $ atomically $ takeTMVar keeplocked
if stilllocked return $ if stilllocked
then return unlocksender then unlocksender keeplocked
else do else S.Yield (UnlockRequest True) S.Stop
liftIO $ print "sending unlock request"
return $ S.Yield (UnlockRequest True) S.Stop
cli' = cli lckid cu bypass
(Just connectionKeepAlive) (Just keepAlive)
(S.fromStepT unlocksender)
cli = case ver of cli = case ver of
3 -> v3 su V3 3 -> v3 su V3