@@ -14,24 +14,18 @@ import Prelude hiding (all, concat, concatMap, div, mapM, mapM_, sequence, span)
15import Control.Monad.Reader
15import Control.Monad.Reader
16import Data.ByteString (ByteString)
16import Data.ByteString (ByteString)
17−import qualified Data.ByteString as BS
18import Data.Text (Text)
17import Data.Text (Text)
19import qualified Data.Text as T (unpack)
18import qualified Data.Text as T (unpack)
20import Data.Text.Encoding
19import Data.Text.Encoding
21−import GHCJS.Buffer
20+import Foreign.JavaScript.Utils (bsFromMutableArrayBuffer, bsToArrayBuffer)
22import GHCJS.DOM.CloseEvent
21import GHCJS.DOM.CloseEvent
23import GHCJS.DOM.EventM (on)
22import GHCJS.DOM.EventM (on)
24import GHCJS.DOM.MessageEvent
23import GHCJS.DOM.MessageEvent
25import GHCJS.DOM.Types hiding (Text)
24import GHCJS.DOM.Types hiding (Text)
26import qualified GHCJS.DOM.WebSocket as GD
25import qualified GHCJS.DOM.WebSocket as GD
27import GHCJS.Foreign (JSType(..), jsTypeOf)
26import GHCJS.Foreign (JSType(..), jsTypeOf)
29−import JavaScript.TypedArray.ArrayBuffer as JS
30import Language.Javascript.JSaddle.Helper (mutableArrayBufferFromJSVal)
27import Language.Javascript.JSaddle.Helper (mutableArrayBufferFromJSVal)
31import Language.Javascript.JSaddle.Types (ghcjsPure)
28import Language.Javascript.JSaddle.Types (ghcjsPure)
33−import Language.Javascript.JSaddle.Object (new, jsg)
36data JSWebSocket = JSWebSocket { unWebSocket :: WebSocket }
30data JSWebSocket = JSWebSocket { unWebSocket :: WebSocket }
@@ -42,12 +36,7 @@ class IsWebSocketMessage a where
42-- Note: Binary websockets may not work correctly in IE 11 and below
36-- Note: Binary websockets may not work correctly in IE 11 and below
43instance IsWebSocketMessage ByteString where
37instance IsWebSocketMessage ByteString where
44 webSocketSend (JSWebSocket ws) bs = do
38 webSocketSend (JSWebSocket ws) bs = do
45− (b, off, len) <- ghcjsPure $ fromByteString bs
39+ ab <- bsToArrayBuffer bs
46− ab <- ArrayBuffer <$> if BS.length bs == 0 --TODO: remove this logic when https://github.com/ghcjs/ghcjs-base/issues/49 is fixed
47− then create 0 >>= ghcjsPure . getArrayBuffer >>= ghcjsPure . jsval
49− ref <- ghcjsPure (getArrayBuffer b) >>= ghcjsPure . jsval
50− js_dataView off len ref -- new (jsg "DataView") (ref, off, len)
51 GD.send ws $ Just ab
40 GD.send ws $ Just ab
53-- Use plaintext websocket communication for Text, and String
42-- Use plaintext websocket communication for Text, and String
@@ -82,16 +71,9 @@ newWebSocket _ url onMessage onOpen onError onClose = do
82 liftJSM $ ghcjsPure (jsTypeOf d) >>= \case
71 liftJSM $ ghcjsPure (jsTypeOf d) >>= \case
83 String -> onMessage $ Right d
72 String -> onMessage $ Right d
85− ab <- mutableArrayBufferFromJSVal d >>= unsafeFreeze
74+ ab <- mutableArrayBufferFromJSVal d
86− ghcjsPure (createFromArrayBuffer ab) >>= ghcjsPure . toByteString 0 Nothing >>= onMessage . Left
75+ bsFromMutableArrayBuffer ab >>= onMessage . Left
87 return $ JSWebSocket ws
76 return $ JSWebSocket ws
90−foreign import javascript safe "new DataView($3,$1,$2)" js_dataView :: Int -> Int -> JSVal -> IO JSVal
92−js_dataView :: Int -> Int -> JSVal -> JSM JSVal
93−js_dataView off len ref = new (jsg "DataView") (ref, off, len)
96onBSMessage :: Either ByteString JSVal -> JSM ByteString
78onBSMessage :: Either ByteString JSVal -> JSM ByteString
97onBSMessage = either return (\v -> encodeUtf8 <$> fromJSValUnchecked v)
79onBSMessage = either return (\v -> encodeUtf8 <$> fromJSValUnchecked v)