@@ -10,30 +10,35 @@ import Data.Text.Encoding
1010import qualified Data.ByteString as BS
1111import Foreign.Ptr
1212import GHCJS.Foreign
13+import GHCJS.Marshal
1314import GHCJS.Types
15+import GHCJS.DOM.EventM
16+import GHCJS.DOM.Types
1417
1518#define JS(name, js, type) foreign import javascript unsafe js name :: type
1619
17−newtype JSWebSocket = JSWebSocket { unWebSocket :: JSRef JSWebSocket }
20+newtype JSWebSocket = JSWebSocket { unJSWebSocket :: JSRef JSWebSocket }
1821
1922data JSByteArray
2023JS(extractByteArray, "new Uint8Array($1_1.buf, $1_2, $2)", Ptr a -> Int -> IO (JSRef JSByteArray))
2124
22−JS(newWebSocket_, "(function() { var ws = new WebSocket($1); ws['binaryType'] = 'arraybuffer'; ws['onmessage'] = function(e){ $2(e['data']); }; ws['onclose'] = function(e){ $3(); }; return ws; })()", JSString -> JSFun (JSString -> IO ()) -> JSFun (IO ()) -> IO (JSRef JSWebSocket))
25+JS(newWebSocket_, "(function() { var ws = new WebSocket($1); ws['binaryType'] = 'arraybuffer'; ws['onmessage'] = function(e){ $2(e['data']); }; ws['onopen'] = function(e){ $3(); }; ws['onclose'] = function(e){ $4(); }; return ws; })()", JSString -> JSFun (JSString -> IO ()) -> JSFun (IO ()) -> JSFun (IO ()) -> IO (JSRef JSWebSocket))
2326
2427JS(webSocketSend_, "$1['send'](String.fromCharCode.apply(null, $2))", JSRef JSWebSocket -> JSRef JSByteArray -> IO ())
2528
2629webSocketSend :: JSWebSocket -> ByteString -> IO ()
2730webSocketSend ws bs = BS.useAsCString bs $ \cStr -> do
2831 ba <- extractByteArray cStr $ BS.length bs
29− webSocketSend_ (unWebSocket ws) ba
32+ webSocketSend_ (unJSWebSocket ws) ba
3033
31−newWebSocket :: a -> String -> (ByteString -> IO ()) -> IO () -> IO JSWebSocket
32−newWebSocket _ url onMessage onClose = do
34+newWebSocket :: a -> String -> (ByteString -> IO ()) -> IO () -> IO () -> IO JSWebSocket
35+newWebSocket _ url onMessage onOpen onClose = do
3336 onMessageFun <- syncCallback1 AlwaysRetain True $ onMessage <=< return . encodeUtf8 . fromJSString
3437 rec onCloseFun <- syncCallback AlwaysRetain True $ do
3538 release onMessageFun
3639 release onCloseFun
3740 onClose
38− liftM JSWebSocket $ newWebSocket_ (toJSString url) onMessageFun onCloseFun
39−
41+ onOpenFun <- syncCallback AlwaysRetain True $ do
42+ release onOpenFun
43+ onOpen
44+ liftM JSWebSocket $ newWebSocket_ (toJSString url) onMessageFun onOpenFun onCloseFun