@@ -30,6 +30,7 @@ import Prelude hiding (all, concat, concatMap, div, mapM, mapM_, sequence, span)
30import Reflex.Class
30import Reflex.Class
31import Reflex.Dom.Class
31import Reflex.Dom.Class
32import Reflex.Dom.WebSocket.Foreign
32import Reflex.Dom.WebSocket.Foreign
33+import Reflex.Dom.WebSocket.Internal
33import Reflex.PerformEvent.Class
34import Reflex.PerformEvent.Class
34import Reflex.PostBuild.Class
35import Reflex.PostBuild.Class
35import Reflex.TriggerEvent.Class
36import Reflex.TriggerEvent.Class
@@ -41,9 +42,11 @@ import Control.Lens
41import Control.Monad hiding (forM, forM_, mapM, mapM_, sequence)
42import Control.Monad hiding (forM, forM_, mapM, mapM_, sequence)
42import Control.Monad.IO.Class
43import Control.Monad.IO.Class
43import Control.Monad.State
44import Control.Monad.State
44import Data.ByteString (ByteString)
46import Data.ByteString (ByteString)
45import Data.Default
47import Data.Default
46import Data.IORef
48import Data.IORef
49+import Data.JSString.Text
47import Data.Maybe (isJust)
50import Data.Maybe (isJust)
48import Data.Text
51import Data.Text
49import Data.Text.Encoding
52import Data.Text.Encoding
@@ -128,6 +131,11 @@ webSocket' url config onRawMessage = do
128textWebSocket :: (IsWebSocketMessage a, MonadJSM m, MonadJSM (Performable m), HasJSContext m, PostBuild t m, TriggerEvent t m, PerformEvent t m, MonadHold t m, Reflex t) => Text -> WebSocketConfig t a -> m (RawWebSocket t Text)
131textWebSocket :: (IsWebSocketMessage a, MonadJSM m, MonadJSM (Performable m), HasJSContext m, PostBuild t m, TriggerEvent t m, PerformEvent t m, MonadHold t m, Reflex t) => Text -> WebSocketConfig t a -> m (RawWebSocket t Text)
129textWebSocket url cfg = webSocket' url cfg (either (return . decodeUtf8) fromJSValUnchecked)
132textWebSocket url cfg = webSocket' url cfg (either (return . decodeUtf8) fromJSValUnchecked)
134+jsonWebSocket :: (ToJSON a, FromJSON b, MonadJSM m, MonadJSM (Performable m), HasJSContext m, PostBuild t m, TriggerEvent t m, PerformEvent t m, MonadHold t m, Reflex t) => Text -> WebSocketConfig t a -> m (RawWebSocket t (Maybe b))
135+jsonWebSocket url cfg = do
136+ ws <- textWebSocket url $ cfg { _webSocketConfig_send = fmap encode <$> _webSocketConfig_send cfg }
137+ return ws { _webSocket_recv = jsonDecode . textToJSString <$> _webSocket_recv ws }
131#ifdef USE_TEMPLATE_HASKELL
139#ifdef USE_TEMPLATE_HASKELL
132makeLensesWith (lensRules & simpleLenses .~ True) ''WebSocketConfig
140makeLensesWith (lensRules & simpleLenses .~ True) ''WebSocketConfig
133makeLensesWith (lensRules & simpleLenses .~ True) ''RawWebSocket
141makeLensesWith (lensRules & simpleLenses .~ True) ''RawWebSocket