@@ -41,33 +41,16 @@ import Control.Lens
41import Control.Monad hiding (forM, forM_, mapM, mapM_, sequence)
41import Control.Monad hiding (forM, forM_, mapM, mapM_, sequence)
42import Control.Monad.IO.Class
42import Control.Monad.IO.Class
43import Control.Monad.State
43import Control.Monad.State
44−import Data.Aeson hiding (json)
45import Data.ByteString (ByteString)
44import Data.ByteString (ByteString)
46import Data.Default
45import Data.Default
47import Data.IORef
46import Data.IORef
48−import Data.JSString (JSString)
49import Data.Maybe (isJust)
47import Data.Maybe (isJust)
50import Data.Text
48import Data.Text
51import Data.Text.Encoding
49import Data.Text.Encoding
52import GHCJS.DOM.Types (runJSM, askJSM, MonadJSM, liftJSM, JSM)
50import GHCJS.DOM.Types (runJSM, askJSM, MonadJSM, liftJSM, JSM)
53import GHCJS.Marshal
51import GHCJS.Marshal
54−import qualified Language.Javascript.JSaddle as JS (jsg, js1)
55import qualified Language.Javascript.JSaddle.Monad as JS (catch)
52import qualified Language.Javascript.JSaddle.Monad as JS (catch)
58−import GHCJS.DOM.Types ()
59−import System.IO.Unsafe
61−import Data.JSString.Text
62−import qualified Data.ByteString.Lazy as LBS
64−-- When on ghcjs and using packages with jsstring patches it removes the FromJSVal
65−-- instance for Value from ghcjs-base. This makes it so that if the patches
66−-- are used then the instance comes from ghcjs-json
67−#if defined(ghcjs_HOST_OS) && defined(USE_TEXT_JSSTRING)
68−import JavaScript.JSON.Types.FromJSVal ()
71data WebSocketConfig t a
54data WebSocketConfig t a
72 = WebSocketConfig { _webSocketConfig_send :: Event t [a]
55 = WebSocketConfig { _webSocketConfig_send :: Event t [a]
73 , _webSocketConfig_close :: Event t (Word, Text)
56 , _webSocketConfig_close :: Event t (Word, Text)
@@ -145,29 +128,6 @@ webSocket' url config onRawMessage = do
145textWebSocket :: (MonadJSM m, MonadJSM (Performable m), HasJSContext m, PostBuild t m, TriggerEvent t m, PerformEvent t m, MonadHold t m, Reflex t) => Text -> WebSocketConfig t Text -> m (RawWebSocket t Text)
128textWebSocket :: (MonadJSM m, MonadJSM (Performable m), HasJSContext m, PostBuild t m, TriggerEvent t m, PerformEvent t m, MonadHold t m, Reflex t) => Text -> WebSocketConfig t Text -> m (RawWebSocket t Text)
146textWebSocket url cfg = webSocket' url cfg (either (return . decodeUtf8) fromJSValUnchecked)
129textWebSocket url cfg = webSocket' url cfg (either (return . decodeUtf8) fromJSValUnchecked)
148−-- | Deserialize a JSON value from a JSString.
149−-- When on ghcjs it uses JSON.parse which is usually faster than using aeson's decode to get a Value
150−-- When on ghc the JSString is converted to Text and then to ByteString in order to use aeson's decode
151−jsonDecode :: FromJSON a => JSString -> Maybe a
154− result <- unsafePerformIO $ handle (\(_ :: SomeException) -> pure Nothing) $ do
155− safeJsonParse t >>= \case
156− Nothing -> pure Nothing
157− Just a -> fromJSVal a
158− case fromJSON result of
162− decode $ LBS.fromStrict $ encodeUtf8 $ textFromJSString t
165−safeJsonParse :: JSString -> JSM (Maybe JSVal)
166−safeJsonParse a = (Just <$> jsonParse a) `JS.catch` \(_ :: SomeException) -> return Nothing
168−jsonParse :: JSString -> JSM JSVal
169−jsonParse a = JS.jsg "JSON" ^. JS.js1 "parse" a
171#ifdef USE_TEMPLATE_HASKELL
131#ifdef USE_TEMPLATE_HASKELL
172makeLensesWith (lensRules & simpleLenses .~ True) ''WebSocketConfig
132makeLensesWith (lensRules & simpleLenses .~ True) ''WebSocketConfig
173makeLensesWith (lensRules & simpleLenses .~ True) ''RawWebSocket
133makeLensesWith (lensRules & simpleLenses .~ True) ''RawWebSocket