aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregor Kleen <gkleen@yggdrasil.li>2016-02-23 17:05:59 +0100
committerGregor Kleen <gkleen@yggdrasil.li>2016-02-23 17:05:59 +0100
commitdb80fcad9ffe47cc0349a01eb38093b3c4ad6862 (patch)
treecea0e212fc9f141d4e1e7b3005bfb3a5aba4c3f2
parent2c55c6f2afabde93a3579d1042f189f34e821753 (diff)
downloadthermoprint-db80fcad9ffe47cc0349a01eb38093b3c4ad6862.tar
thermoprint-db80fcad9ffe47cc0349a01eb38093b3c4ad6862.tar.gz
thermoprint-db80fcad9ffe47cc0349a01eb38093b3c4ad6862.tar.bz2
thermoprint-db80fcad9ffe47cc0349a01eb38093b3c4ad6862.tar.xz
thermoprint-db80fcad9ffe47cc0349a01eb38093b3c4ad6862.zip
Added stability to websockets
-rw-r--r--server/src/Thermoprint/Server/Push.hs1
-rw-r--r--webgui/src/Main.hs21
2 files changed, 11 insertions, 11 deletions
diff --git a/server/src/Thermoprint/Server/Push.hs b/server/src/Thermoprint/Server/Push.hs
index b2eca6b..07b81fb 100644
--- a/server/src/Thermoprint/Server/Push.hs
+++ b/server/src/Thermoprint/Server/Push.hs
@@ -40,6 +40,7 @@ protocolSpec = CBS.pack $ "thermoprint-server.notification." ++ showVersion vers
40handleClient :: TChan Notification -> Connection -> IO () 40handleClient :: TChan Notification -> Connection -> IO ()
41handleClient chan conn = do 41handleClient chan conn = do
42 cChan <- atomically $ dupTChan chan 42 cChan <- atomically $ dupTChan chan
43 forkPingThread conn 10
43 forever . void $ atomically (readTChan cChan) >>= sendTextData conn . packNotification 44 forever . void $ atomically (readTChan cChan) >>= sendTextData conn . packNotification
44 45
45packNotification :: Notification -> Text 46packNotification :: Notification -> Text
diff --git a/webgui/src/Main.hs b/webgui/src/Main.hs
index 7ead572..92aba0e 100644
--- a/webgui/src/Main.hs
+++ b/webgui/src/Main.hs
@@ -87,11 +87,11 @@ setup Config{..} window (split -> (socketErr, dataUpdate)) = void $ do
87 prntBtn <- UI.button #+ [string "Print"] 87 prntBtn <- UI.button #+ [string "Print"]
88 88
89 getBody window #+ [ row [ column [ UI.h1 #+ [string "Current draft"] 89 getBody window #+ [ row [ column [ UI.h1 #+ [string "Current draft"]
90 , row [UI.label # set text "Title" # set UI.for "title", element title # set style [("width", "100%")]] 90 , row [UI.label # set text "Title" # set UI.for "title", element title]
91 , element content # set style [("width", "100%")] 91 , element content
92 , row [ element saveBtn # set style [("width", "100%")] 92 , row [ element saveBtn
93 , element prntBtn # set style [("width", "100%")] 93 , element prntBtn
94 , element discBtn # set style [("width", "100%")] 94 , element discBtn
95 ] 95 ]
96 ] 96 ]
97 , column [ UI.h1 #+ [string "Saved drafts"] 97 , column [ UI.h1 #+ [string "Saved drafts"]
@@ -102,11 +102,10 @@ setup Config{..} window (split -> (socketErr, dataUpdate)) = void $ do
102 102
103 where 103 where
104 handleSocketErr InvalidMessage = debug "Received unparseable message from websocket" 104 handleSocketErr InvalidMessage = debug "Received unparseable message from websocket"
105 handleSocketErr e@(UnknownException e') = void $ do 105 handleSocketErr e@(Unhandled e') = void $ fatalError (show e') >> liftIO (throwIO e)
106 getBody window #+ [UI.p # set text (show e') # set UI.id_ "error"] 106 fatalError str = (getBody window #) . set children =<< sequence [UI.p # set text str # set UI.id_ "fatal-error"]
107 liftIO $ throwIO e
108 107
109data WebSocketException = InvalidMessage | UnknownException SomeException 108data WebSocketException = ProcessDied | InvalidMessage | Unhandled SomeException
110 deriving (Show) 109 deriving (Show)
111 110
112instance Exception WebSocketException 111instance Exception WebSocketException
@@ -115,7 +114,7 @@ withWebSocket :: (Config -> Window -> Event (Either WebSocketException URI) -> U
115withWebSocket setup c@(Config{..}) w = do 114withWebSocket setup c@(Config{..}) w = do
116 (dataUpdate, triggerData) <- liftIO newEvent 115 (dataUpdate, triggerData) <- liftIO newEvent
117 let 116 let
118 rcvEvents = runClient (baseUrlHost server) (baseUrlPort server) "" $ forever . (triggerData . maybe (Left InvalidMessage) Right . parseURI . T.unpack <=< receiveData) 117 rcvEvents = runClient (baseUrlHost server) (baseUrlPort server) "/" $ forever . (triggerData . maybe (Left InvalidMessage) Right . parseURI . T.unpack <=< receiveData)
119 liftIO . forkIO $ rcvEvents `catchAll` (triggerData . Left . UnknownException) 118 liftIOLater . void $ forkFinally (rcvEvents `catchAll` (triggerData . Left . Unhandled)) (triggerData $ Left ProcessDied)
120 void $ setup c w dataUpdate 119 void $ setup c w dataUpdate
121 120