on master help sign in
show current branch and schema names in websocket client
commit8d057ba8e07bf33906a1a3d864a64231cf462c85 authorAgentM <agentm@themactionfaction.com> dateThu 26 Jan 2017, 00:04 (10 years ago) parente63d6a7
5 files changed+63−16
src/bin/ProjectM36/Server/WebSocket.hs+24−4 src/bin/ProjectM36/Server/WebSocket/project-m36.js+9−1 src/bin/ProjectM36/Server/WebSocket/websocket-client.html+18−10 src/bin/ProjectM36/Server/WebSocket/websocket-client.js+9 src/lib/ProjectM36/Client.hs+3−1
src/bin/ProjectM36/Server/WebSocket.hs+24−4
@@ -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]]))
src/bin/ProjectM36/Server/WebSocket/project-m36.js+9−1
@@ -1,4 +1,4 @@
1−var ProjectM36Connection = function (host, port, dbname, openCallback, errorCallback, statusCallback, closeCallback) {
1+var ProjectM36Connection = function (host, port, dbname, openCallback, errorCallback, statusCallback, promptCallback, closeCallback) {
22 this.host = host
33 this.port = port
44 this.dbname = dbname
@@ -21,6 +21,7 @@ var ProjectM36Connection = function (host, port, dbname, openCallback, errorCall
2121 closeCallback(event);
2222 };
2323 this.statuscallback = statusCallback;
24+ this.promptcallback = promptCallback;
2425 this.socket = socket;
2526}
2627
@@ -46,6 +47,8 @@ ProjectM36Connection.prototype.handleResponse = function(message)
4647 var relation = message["displayrelation"];
4748 var acknowledged = message["acknowledged"];
4849 var error = message["displayerror"];
50+ var prompt = message["promptInfo"];
51+
4952 if(relation)
5053 {
5154 this.statuscallback(new ProjectM36Status(relation, null, null));
@@ -64,6 +67,11 @@ ProjectM36Connection.prototype.handleResponse = function(message)
6467 }
6568 this.statuscallback(new ProjectM36Status(null, null, error));
6669 }
70+
71+ if(prompt)
72+ {
73+ this.promptcallback(prompt["headname"], prompt["schemaname"]);
74+ }
6775}
6876
6977ProjectM36Connection.prototype.executeTutorialD = function(tutd)
src/bin/ProjectM36/Server/WebSocket/websocket-client.html+18−10
@@ -59,9 +59,9 @@ margin: 3px;
5959 width: 100px;
6060}
6161
62−#samples
62+#samples li
6363{
64− display:none;
64+ font-family: Courier;
6565}
6666
6767#samplesouter
@@ -77,17 +77,29 @@ margin: 3px;
7777 background-color: #d1d1e0;
7878}
7979
80+#tutd
81+{
82+ width: 300pt;
83+ height: 100pt;
84+ text-valign: top;
85+}
86+
8087</style>
8188</head>
8289<body onload="installSampleHandlers();">
83−<h1>Project:M36 WebSocket Client</h1>
90+<h1><a href="https://github.com/agentm/project-m36">Project:M36</a> WebSocket Client</h1>
8491<div id="sheet">
8592 <div id="interactor">
8693 <form onsubmit="return connectOrDisconnect(this);" id="connection">
87− <label>Connection:</label><input type="text" name="host" value="localhost" placeholder="Host"/>:<input type="number" placeholder="Port" name="port" min="0" max="32767" value="8888"/>/<input type="text" placeholder="Database Name" name="dbname" value="test"/><input type="submit" name="connect" value="Connect"/>
94+ <label id="conninfo">Connect to:</label><input type="text" name="host" value="localhost" placeholder="Host"/>:<input type="number" placeholder="Port" name="port" min="0" max="32767" value="8888"/>/<input type="text" placeholder="Database Name" name="dbname" value="test"/><input type="submit" name="connect" value="Connect"/>
8895 </form>
89− <div onmouseover="toggleSamples(this, true);" onmouseleave="toggleSamples(this, false);" id="samplesouter">
90− <span>Sample TutorialD: <a href="https://github.com/agentm/project-m36/blob/master/docs/15_minute_tutorial.markdown">15 minute TutorialD Tutorial</a>.</span>
96+ <form onsubmit="return execTutorialD();">
97+ <input type="textarea" id="tutd" placeholder="Enter a TutorialD query here."/>
98+ <label id="promptinfo"></label>
99+ <input type="submit" value="Evaluate TutorialD"/>
100+ </form>
101+ <div id="samplesouter">
102+ <span>Try our <a href="https://github.com/agentm/project-m36/blob/master/docs/15_minute_tutorial.markdown">15 minute TutorialD Tutorial</a> or click these sample queries below:</span>
91103</span>
92104 <ul id="samples">
93105 <li>:showexpr true</li>
@@ -100,10 +112,6 @@ margin: 3px;
100112 <li>:showgraph</li>
101113 </ul>
102114 </div>
103− <form onsubmit="return execTutorialD();">
104− <input type="text" id="tutd"/>
105− <input type="submit"/>
106− </form>
107115 </div>
108116 <div id="sectiontemplate">
109117 <span class="title"></span>
src/bin/ProjectM36/Server/WebSocket/websocket-client.js+9
@@ -44,6 +44,11 @@ function updateStatus(status)
4444 }
4545}
4646
47+function promptUpdate(headName, schemaName)
48+{
49+ document.getElementById("promptinfo").textContent = "Current Branch: (" + headName + ") Schema: (" + schemaName + ")";
50+}
51+
4752var conn;
4853
4954function connectOrDisconnect(form)
@@ -52,20 +57,24 @@ function connectOrDisconnect(form)
5257 var host = formin["host"].value;
5358 var port = formin["port"].value;
5459 var dbname = formin["dbname"].value;
60+ var conninfo = document.getElementById("conninfo");
5561
5662 if(window.conn && window.conn.readyState() == 1)
5763 {
5864 //disconnect
5965 window.conn.close();
66+ conninfo.textContent = "Connect to:";
6067 toggleConnectionFields(form, true, "Connect");
6168 }
6269 else
6370 {
6471 //connect
72+ conninfo.textContent = "Connected to:";
6573 window.conn = new ProjectM36Connection(host, port, dbname,
6674 connectionOpened,
6775 connectionError,
6876 updateStatus,
77+ promptUpdate,
6978 connectionClosed);
7079 toggleConnectionFields(form, false, "Connecting...");
7180 }
src/lib/ProjectM36/Client.hs+3−1
@@ -21,6 +21,8 @@ module ProjectM36.Client
2121 planForDatabaseContextExpr,
2222 processPersistence,
2323 currentSchemaName,
24+ SchemaName,
25+ HeadName,
2426 setCurrentSchemaName,
2527 transactionGraphAsRelation,
2628 relationVariablesAsRelation,
@@ -106,7 +108,7 @@ import GHC.Generics (Generic)
106108import Control.DeepSeq (force)
107109import System.IO
108110
109−import Debug.Trace
111+--import Debug.Trace
110112
111113type Hostname = String
112114