@@ -14,10 +14,14 @@ import TutorialD.Interpreter
1414import TutorialD.Interpreter.Base
1515import ProjectM36.Client
1616import Control.Exception
17+import Data.Maybe (fromMaybe)
18+import System.IO (hPutStrLn, stderr)
19+import System.Exit
1720
1821-- | Called when the project-m36-server exits.
1922failureHandler :: Either SomeException Bool -> IO ()
20−failureHandler = error "project-m36-server exited unexpectedly"
23+failureHandler (Left exc) = hPutStrLn stderr ("WebSocket server encountered exception: " ++ show exc) >> exitFailure
24+failureHandler (Right boo) = hPutStrLn stderr ("WebSocket server encountered boolean failure: " ++ show boo) >> exitFailure
2125
2226websocketProxyServer :: Port -> Hostname -> WS.ServerApp
2327websocketProxyServer port host pending = do
@@ -39,6 +43,9 @@ websocketProxyServer port host pending = do
3943 Right sessionId -> do
4044 --phase 2- accept tutoriald commands
4145 _ <- forever $ do
46+ pInfo <- promptInfo sessionId dbconn
47+ sendPromptInfo pInfo conn
48+ sendPromptInfo pInfo conn
4249 msg <- (WS.receiveData conn) :: IO T.Text
4350 let tutdprefix = "executetutd:"
4451 case msg of
@@ -50,9 +57,12 @@ websocketProxyServer port host pending = do
5057 let timeoutFilter = \exc -> if exc == RequestTimeoutException
5158 then Just exc
5259 else Nothing
53− catchJust timeoutFilter (do
54− result <- evalTutorialD sessionId dbconn SafeEvaluation parsed
55− handleOpResult conn dbconn result) (\_ -> handleOpResult conn dbconn (DisplayErrorResult "Request Timed Out."))
60+ responseHandler = do
61+ result <- evalTutorialD sessionId dbconn SafeEvaluation parsed
62+ pInfo' <- promptInfo sessionId dbconn
63+ sendPromptInfo pInfo' conn
64+ handleOpResult conn dbconn result
65+ catchJust timeoutFilter responseHandler (\_ -> handleOpResult conn dbconn (DisplayErrorResult "Request Timed Out."))
5666 _ -> unexpectedMsg
5767 pure ()
5868
@@ -76,3 +86,13 @@ handleOpResult conn _ (DisplayErrorResult err) = WS.sendTextData conn (encode (o
7686handleOpResult conn _ (DisplayParseErrorResult _ err) = WS.sendTextData conn (encode (object ["displayparseerrorresult" .= show err]))
7787handleOpResult conn _ QuietSuccessResult = WS.sendTextData conn (encode (object ["acknowledged" .= True]))
7888handleOpResult conn _ (DisplayRelationResult rel) = WS.sendTextData conn (encode (object ["displayrelation" .= rel]))
89+
90+-- get current schema and head name for client
91+promptInfo :: SessionId -> Connection -> IO (HeadName, SchemaName)
92+promptInfo sessionId conn = do
93+ mHeadName <- headName sessionId conn
94+ mSchemaName <- currentSchemaName sessionId conn
95+ pure (fromMaybe "<unknown>" mHeadName, fromMaybe "<no schema>" mSchemaName)
96+
97+sendPromptInfo :: (HeadName, SchemaName) -> WS.Connection -> IO ()
98+sendPromptInfo (hName, sName) conn = WS.sendTextData conn (encode (object ["promptInfo" .= object ["headname" .= hName, "schemaname" .= sName]]))