@@ -15,7 +15,9 @@ module JavaScript.Web.WebSocket ( WebSocket
1515 , connect
1616 , close
1717 , send
18- , getBufferedAmount
18+ , sendArrayBuffer
19+ , sendBlob
20+ , getBufferedAmount
1921 , getExtensions
2022 , getProtocol
2123 , getReadyState
@@ -44,6 +46,8 @@ import qualified Data.JSString as JSS
4446
4547import JavaScript.Array (JSArray )
4648import qualified JavaScript.Array as JSA
49+ import JavaScript.TypedArray.ArrayBuffer (ArrayBuffer )
50+ import JavaScript.Web.Blob (Blob )
4751import JavaScript.Web.MessageEvent
4852import JavaScript.Web.MessageEvent.Internal
4953import JavaScript.Web.CloseEvent
@@ -74,29 +78,23 @@ connect :: WebSocketRequest -> IO WebSocket
7478connect req = do
7579 mcb <- maybeCallback MessageEvent (onMessage req)
7680 ccb <- maybeCallback CloseEvent (onClose req)
77- synchronously $ do
81+ withoutPreemption $ do
7882 ws <- case protocols req of
79- [] -> js_createStr (url req) JSS. empty
80- [x] -> js_createStr (url req) x
81- xs -> js_createArr (url req) (JSA. fromList $ unsafeCoerce xs) -- fixme
83+ [] -> js_createDefault (url req)
84+ [x] -> js_createStr (url req) x
8285 (js_open ws mcb ccb >>= handleOpenErr >> return ws) `onException` js_close 1000 " Haskell Exception" ws
8386
8487maybeCallback :: (JSVal -> a ) -> Maybe (a -> IO () ) -> IO JSVal
8588maybeCallback _ Nothing = return jsNull
8689maybeCallback f (Just g) = do
87- cb@ (Callback cb') <- CB. syncCallback1 CB. ContinueAsync (g . f)
88- CB. releaseCallback cb
89- return cb'
90+ Callback cb <- CB. syncCallback1 CB. ContinueAsync (g . f)
91+ return cb
9092
9193handleOpenErr :: JSVal -> IO ()
9294handleOpenErr r
9395 | isNull r = return ()
9496 | otherwise = throwIO (userError " WebSocket failed to connect" ) -- fixme
9597
96- releaseMessageCallback :: WebSocket -> IO ()
97- releaseMessageCallback ws = js_getOnmessage ws >>=
98- \ cb -> unless (isNull cb) (CB. releaseCallback $ Callback cb)
99-
10098{- | close a websocket and release the callbacks -}
10199close :: Maybe Int -> Maybe JSString -> WebSocket -> IO ()
102100close value reason ws =
@@ -107,6 +105,14 @@ send :: JSString -> WebSocket -> IO ()
107105send xs ws = js_send xs ws
108106{-# INLINE send #-}
109107
108+ sendBlob :: Blob -> WebSocket -> IO ()
109+ sendBlob = js_sendBlob
110+ {-# INLINE sendBlob #-}
111+
112+ sendArrayBuffer :: ArrayBuffer -> WebSocket -> IO ()
113+ sendArrayBuffer = js_sendArrayBuffer
114+ {-# INLINE sendArrayBuffer #-}
115+
110116getBufferedAmount :: WebSocket -> IO Int
111117getBufferedAmount ws = js_getBufferedAmount ws
112118{-# INLINE getBufferedAmount #-}
@@ -139,19 +145,25 @@ getLastError ws = do
139145
140146-- -----------------------------------------------------------------------------
141147
142-
148+ foreign import javascript safe
149+ " new WebSocket($1)" js_createDefault :: JSString -> IO WebSocket
143150foreign import javascript safe
144151 " new WebSocket($1, $2)" js_createStr :: JSString -> JSString -> IO WebSocket
145152foreign import javascript safe
146153 " new WebSocket($1, $2)" js_createArr :: JSString -> JSArray -> IO WebSocket
147-
154+
148155foreign import javascript interruptible
149156 " h$openWebSocket($1, $2, $3, $c);"
150- js_open :: WebSocket -> JSVal -> JSVal -> IO JSVal
157+ js_open :: WebSocket -> JSVal -> JSVal -> IO JSVal
151158foreign import javascript safe
152- " h$closeWebSocket($1, $2);" js_close :: Int -> JSString -> WebSocket -> IO ()
159+ " h$closeWebSocket($1, $2, $3);"
160+ js_close :: Int -> JSString -> WebSocket -> IO ()
153161foreign import javascript unsafe
154162 " $2.send($1);" js_send :: JSString -> WebSocket -> IO ()
163+ foreign import javascript unsafe
164+ " $2.send($1);" js_sendBlob :: Blob -> WebSocket -> IO ()
165+ foreign import javascript unsafe
166+ " $2.send($1);" js_sendArrayBuffer :: ArrayBuffer -> WebSocket -> IO ()
155167foreign import javascript unsafe
156168 " $1.bufferedAmount" js_getBufferedAmount :: WebSocket -> IO Int
157169foreign import javascript unsafe
@@ -165,16 +177,5 @@ foreign import javascript unsafe
165177foreign import javascript unsafe
166178 " $1.binaryType === 'blob' ? 1 : 2"
167179 js_getBinaryType :: WebSocket -> IO Int
168-
169- foreign import javascript unsafe
170- " $2.onopen = $1;" js_setOnopen :: Callback a -> WebSocket -> IO ()
171- foreign import javascript unsafe
172- " $2.onclose = $1;" js_setOnclose :: Callback a -> WebSocket -> IO ()
173- foreign import javascript unsafe
174- " $2.onopen = $1;" js_setOnerror :: Callback a -> WebSocket -> IO ()
175- foreign import javascript unsafe
176- " $2.onmessage = $1;" js_setOnmessage :: Callback a -> WebSocket -> IO ()
177- foreign import javascript unsafe
178- " $1.onmessage" js_getOnmessage :: WebSocket -> IO JSVal
179180foreign import javascript unsafe
180181 " $1.lastError" js_getLastError :: WebSocket -> IO JSVal
0 commit comments