@@ -49,10 +49,12 @@ data WebSocketConfig t a
49instance Reflex t => Default (WebSocketConfig t a) where
49instance Reflex t => Default (WebSocketConfig t a) where
50 def = WebSocketConfig never
50 def = WebSocketConfig never
52−data WebSocket t
52+type WebSocket t = RawWebSocket t ByteString
53− = WebSocket { _webSocket_recv :: Event t ByteString
55+ = RawWebSocket { _webSocket_recv :: Event t a
54− , _webSocket_open :: Event t ()
56+ , _webSocket_open :: Event t ()
57-- This can be used to send either binary or text messages for the same websocket connection
59-- This can be used to send either binary or text messages for the same websocket connection
58instance (IsWebSocketMessage a, IsWebSocketMessage b) => IsWebSocketMessage (Either a b) where
60instance (IsWebSocketMessage a, IsWebSocketMessage b) => IsWebSocketMessage (Either a b) where
@@ -61,7 +63,10 @@ instance (IsWebSocketMessage a, IsWebSocketMessage b) => IsWebSocketMessage (Eit
63webSocket :: (MonadIO m, MonadIO (Performable m), HasWebView m, PerformEvent t m, TriggerEvent t m, PostBuild t m, IsWebSocketMessage a) => Text -> WebSocketConfig t a -> m (WebSocket t)
65webSocket :: (MonadIO m, MonadIO (Performable m), HasWebView m, PerformEvent t m, TriggerEvent t m, PostBuild t m, IsWebSocketMessage a) => Text -> WebSocketConfig t a -> m (WebSocket t)
64−webSocket url config = do
66+webSocket url config = webSocket' url config onBSMessage
68+webSocket' :: (MonadIO m, MonadIO (Performable m), HasWebView m, PerformEvent t m, TriggerEvent t m, PostBuild t m, IsWebSocketMessage a) => Text -> WebSocketConfig t a -> (Either ByteString JSVal -> b) -> m (RawWebSocket t b)
69+webSocket' url config onRawMessage = do
65 wv <- fmap unWebViewSingleton askWebView
70 wv <- fmap unWebViewSingleton askWebView
66 (eRecv, onMessage) <- newTriggerEvent
71 (eRecv, onMessage) <- newTriggerEvent
67 currentSocketRef <- liftIO $ newIORef Nothing
72 currentSocketRef <- liftIO $ newIORef Nothing
@@ -78,7 +83,7 @@ webSocket url config = do
78 liftIO $ threadDelay 1000000
83 liftIO $ threadDelay 1000000
80 start = do
85 start = do
81− ws <- liftIO $ newWebSocket wv url onMessage onOpen onClose
86+ ws <- liftIO $ newWebSocket wv url (onMessage . onRawMessage) onOpen onClose
82 liftIO $ writeIORef currentSocketRef $ Just ws
87 liftIO $ writeIORef currentSocketRef $ Just ws
84 performEvent_ . (liftIO start <$) =<< getPostBuild
89 performEvent_ . (liftIO start <$) =<< getPostBuild
@@ -98,6 +103,6 @@ webSocket url config = do
99 (\(_ :: SomeException) -> return False))
104 (\(_ :: SomeException) -> return False))
100 unless success $ atomically $ unGetTQueue payloadQueue payload
105 unless success $ atomically $ unGetTQueue payloadQueue payload
101− return $ WebSocket eRecv eOpen
106+ return $ RawWebSocket eRecv eOpen
103makeLensesWith (lensRules & simpleLenses .~ True) ''WebSocketConfig
108makeLensesWith (lensRules & simpleLenses .~ True) ''WebSocketConfig