@@ -30,6 +30,7 @@ import Prelude hiding (all, concat, concatMap, div, mapM, mapM_, sequence, span)
3030import Reflex.Class
3131import Reflex.Dom.Class
3232import Reflex.Dom.WebSocket.Foreign
33+import Reflex.Dom.WebSocket.Internal
3334import Reflex.PerformEvent.Class
3435import Reflex.PostBuild.Class
3536import Reflex.TriggerEvent.Class
@@ -41,9 +42,11 @@ import Control.Lens
4142import Control.Monad hiding (forM, forM_, mapM, mapM_, sequence)
4243import Control.Monad.IO.Class
4344import Control.Monad.State
45+import Data.Aeson
4446import Data.ByteString (ByteString)
4547import Data.Default
4648import Data.IORef
49+import Data.JSString.Text
4750import Data.Maybe (isJust)
4851import Data.Text
4952import Data.Text.Encoding
@@ -128,6 +131,11 @@ webSocket' url config onRawMessage = do
128131textWebSocket :: (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)
129132textWebSocket url cfg = webSocket' url cfg (either (return . decodeUtf8) fromJSValUnchecked)
130133
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 }
138+
131139#ifdef USE_TEMPLATE_HASKELL
132140makeLensesWith (lensRules & simpleLenses .~ True) ''WebSocketConfig
133141makeLensesWith (lensRules & simpleLenses .~ True) ''RawWebSocket