@@ -14,24 +14,18 @@ import Prelude hiding (all, concat, concatMap, div, mapM, mapM_, sequence, span)
1414
1515import Control.Monad.Reader
1616import Data.ByteString (ByteString)
17−import qualified Data.ByteString as BS
1817import Data.Text (Text)
1918import qualified Data.Text as T (unpack)
2019import Data.Text.Encoding
21−import GHCJS.Buffer
20+import Foreign.JavaScript.Utils (bsFromMutableArrayBuffer, bsToArrayBuffer)
2221import GHCJS.DOM.CloseEvent
2322import GHCJS.DOM.EventM (on)
2423import GHCJS.DOM.MessageEvent
2524import GHCJS.DOM.Types hiding (Text)
2625import qualified GHCJS.DOM.WebSocket as GD
2726import GHCJS.Foreign (JSType(..), jsTypeOf)
28−import GHCJS.Types
29−import JavaScript.TypedArray.ArrayBuffer as JS
3027import Language.Javascript.JSaddle.Helper (mutableArrayBufferFromJSVal)
3128import Language.Javascript.JSaddle.Types (ghcjsPure)
32−#ifndef ghcjs_HOST_OS
33−import Language.Javascript.JSaddle.Object (new, jsg)
34−#endif
3529
3630data JSWebSocket = JSWebSocket { unWebSocket :: WebSocket }
3731
@@ -42,12 +36,7 @@ class IsWebSocketMessage a where
4236-- Note: Binary websockets may not work correctly in IE 11 and below
4337instance IsWebSocketMessage ByteString where
4438 webSocketSend (JSWebSocket ws) bs = do
45− (b, off, len) <- ghcjsPure $ fromByteString 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
48− else do
49− ref <- ghcjsPure (getArrayBuffer b) >>= ghcjsPure . jsval
50− js_dataView off len ref -- new (jsg "DataView") (ref, off, len)
39+ ab <- bsToArrayBuffer bs
5140 GD.send ws $ Just ab
5241
5342-- Use plaintext websocket communication for Text, and String
@@ -82,16 +71,9 @@ newWebSocket _ url onMessage onOpen onError onClose = do
8271 liftJSM $ ghcjsPure (jsTypeOf d) >>= \case
8372 String -> onMessage $ Right d
8473 _ -> do
85− ab <- mutableArrayBufferFromJSVal d >>= unsafeFreeze
86− ghcjsPure (createFromArrayBuffer ab) >>= ghcjsPure . toByteString 0 Nothing >>= onMessage . Left
74+ ab <- mutableArrayBufferFromJSVal d
75+ bsFromMutableArrayBuffer ab >>= onMessage . Left
8776 return $ JSWebSocket ws
8877
89−#ifdef ghcjs_HOST_OS
90−foreign import javascript safe "new DataView($3,$1,$2)" js_dataView :: Int -> Int -> JSVal -> IO JSVal
91−#else
92−js_dataView :: Int -> Int -> JSVal -> JSM JSVal
93−js_dataView off len ref = new (jsg "DataView") (ref, off, len)
94−#endif
95−
9678onBSMessage :: Either ByteString JSVal -> JSM ByteString
9779onBSMessage = either return (\v -> encodeUtf8 <$> fromJSValUnchecked v)