From a45470071ce1bad2643e6b8b44b97047a8e73b79 Mon Sep 17 00:00:00 2001 From: Jorge Acereda Date: Wed, 25 Feb 2015 01:03:50 +0100 Subject: [PATCH 1/5] Binary support (ArrayBuffer messages) --- bower.json | 8 +++----- src/HTML5/WebSocket.purs | 30 ++++++++++++++++++++++++------ 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/bower.json b/bower.json index 72fe530..b665212 100644 --- a/bower.json +++ b/bower.json @@ -17,10 +17,8 @@ ], "dependencies": { "purescript-maybe": "~0.2.1", - "purescript-transformers": "~0.3.0", - "purescript-control": "~0.2.1" - }, - "resolutions": { - "purescript-arrays": "0.3.0" + "purescript-transformers": "~0.5.0", + "purescript-control": "~0.2.1", + "purescript-arraybuffer-types": "~0.1.0" } } diff --git a/src/HTML5/WebSocket.purs b/src/HTML5/WebSocket.purs index e13fd4d..a9adba7 100644 --- a/src/HTML5/WebSocket.purs +++ b/src/HTML5/WebSocket.purs @@ -1,5 +1,6 @@ module HTML5.WebSocket - ( Protocol () + ( ArrayBuffer () + , Protocol () , Socket () , URI () , WS () @@ -10,6 +11,7 @@ module HTML5.WebSocket , WithWebSocket () , defaultHandlers , send + , bsend , withWebSocket , runWebSocket ) where @@ -18,11 +20,14 @@ import Control.Monad.Eff (Eff (..)) import Data.Either import Data.Function +foreign import data ArrayBuffer :: * + import Control.Monad.Cont.Trans type WebSocketConfig = { uri :: URI , protocols :: [Protocol] + , binary :: Boolean } type URI = String @@ -39,6 +44,7 @@ foreign import data Socket :: * type WebSocketHandler eff = Socket -> { onOpen :: WithWebSocket eff Unit , onMessage :: String -> WithWebSocket eff Unit + , onBuffer :: ArrayBuffer -> WithWebSocket eff Unit } runWebSocket :: forall eff. WebSocket eff Unit -> WithWebSocket eff Unit @@ -55,14 +61,22 @@ foreign import withWebSocketImpl """ return {}; } h = handlers(socket); + if (config.binary) { + socket.binaryType = 'arraybuffer'; + socket.onmessage = function (ev) { + h.onBuffer(ev.data)(); + return {}; + }; + } else { + socket.onmessage = function (ev) { + h.onMessage(ev.data)(); + return {}; + }; + } socket.onopen = function () { h.onOpen(); return {}; }; - socket.onmessage = function (ev) { - h.onMessage(ev.data)(); - return {}; - }; socket.onclose = function () { ok({})(); return {}; @@ -84,6 +98,7 @@ defaultHandlers :: forall eff. WebSocketHandler eff defaultHandlers _ = { onOpen: return unit , onMessage: const $ return unit + , onBuffer: const $ return unit } withWebSocket :: forall eff. WebSocketConfig @@ -99,7 +114,10 @@ foreign import sendImpl """ socket.send(data); return {}; }; - }""" :: forall eff. Fn2 Socket String (WithWebSocket eff Unit) + }""" :: forall eff a. Fn2 Socket a (WithWebSocket eff Unit) send :: forall eff. Socket -> String -> WithWebSocket eff Unit send = runFn2 sendImpl + +bsend :: forall eff. Socket -> ArrayBuffer -> WithWebSocket eff Unit +bsend = runFn2 sendImpl From 2fd4097914591ed595f10f0411fc3438b50b9115 Mon Sep 17 00:00:00 2001 From: Jorge Acereda Date: Wed, 25 Feb 2015 01:11:55 +0100 Subject: [PATCH 2/5] Use Data.ArrayBuffer.Types --- src/HTML5/WebSocket.purs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/HTML5/WebSocket.purs b/src/HTML5/WebSocket.purs index a9adba7..b2a6340 100644 --- a/src/HTML5/WebSocket.purs +++ b/src/HTML5/WebSocket.purs @@ -1,6 +1,5 @@ module HTML5.WebSocket - ( ArrayBuffer () - , Protocol () + ( Protocol () , Socket () , URI () , WS () @@ -19,8 +18,7 @@ module HTML5.WebSocket import Control.Monad.Eff (Eff (..)) import Data.Either import Data.Function - -foreign import data ArrayBuffer :: * +import Data.ArrayBuffer.Types import Control.Monad.Cont.Trans From e1e83dc07b67ec43ec1ac9f15cbf2f13226bcff2 Mon Sep 17 00:00:00 2001 From: Jorge Acereda Date: Fri, 16 Sep 2016 22:53:02 +0200 Subject: [PATCH 3/5] Fix example --- example/Main.purs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/example/Main.purs b/example/Main.purs index 180080a..fff2c9c 100644 --- a/example/Main.purs +++ b/example/Main.purs @@ -1,8 +1,8 @@ module Main where -import Prelude +import Prelude (Unit, bind, (<<<), ($)) import WebSocket -import Control.Monad.Eff.Console +import Control.Monad.Eff.Console (CONSOLE, log) import Control.Monad.Eff (Eff ()) import Control.Monad.Trans (lift) import Data.Either (Either (Left, Right)) @@ -16,9 +16,11 @@ main = do Right _ -> output "DONE" Left err -> output err +config :: WebSocketConfig config = { uri: "ws://127.0.0.1:9001" , protocols: [] + , binary: false } handlers :: forall eff. WebSocketHandler (console :: CONSOLE | eff) From b7bfd742898d8a5d41c2d6775422c5d9388aae12 Mon Sep 17 00:00:00 2001 From: Jorge Acereda Date: Fri, 16 Sep 2016 23:49:37 +0200 Subject: [PATCH 4/5] Use Data.ArrayBuffer.Types --- src/HTML5/WebSocket.purs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/HTML5/WebSocket.purs b/src/HTML5/WebSocket.purs index 4e723ec..37f0233 100644 --- a/src/HTML5/WebSocket.purs +++ b/src/HTML5/WebSocket.purs @@ -1,6 +1,5 @@ module WebSocket - ( ArrayBuffer () - , Protocol () + ( Protocol () , Socket () , URI () , WS () @@ -21,8 +20,7 @@ import Control.Monad.Eff (Eff) import Data.Either (Either(..)) import Control.Monad.Cont.Trans (ContT(..), runContT) import Data.Function.Uncurried (runFn2, Fn2, Fn4, runFn4) - -foreign import data ArrayBuffer :: * +import Data.ArrayBuffer.Types (ArrayBuffer) type WebSocketConfig = From 3f0644596160b35b07da4141c6bb212cf6239678 Mon Sep 17 00:00:00 2001 From: Jorge Acereda Date: Sat, 22 Apr 2017 19:02:30 +0200 Subject: [PATCH 5/5] Updates for 0.11 --- bower.json | 12 ++++++------ src/HTML5/WebSocket.purs | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/bower.json b/bower.json index 3575241..cca4b82 100644 --- a/bower.json +++ b/bower.json @@ -16,13 +16,13 @@ "bower_components" ], "dependencies": { - "purescript-maybe": "~1.0.0", - "purescript-transformers": "~1.0.0", - "purescript-control": "~1.0.0", - "purescript-functions": "~1.0.0", - "purescript-arraybuffer-types": "~0.2.0" + "purescript-maybe": "~3.0.0", + "purescript-transformers": "~3.0.0", + "purescript-control": "~3.0.0", + "purescript-functions": "~3.0.0", + "purescript-arraybuffer-types": "~2.0.0" }, "devDependencies": { - "purescript-console": "~1.0.0" + "purescript-console": "~3.0.0" } } diff --git a/src/HTML5/WebSocket.purs b/src/HTML5/WebSocket.purs index 37f0233..6a1fe46 100644 --- a/src/HTML5/WebSocket.purs +++ b/src/HTML5/WebSocket.purs @@ -16,7 +16,7 @@ module WebSocket ) where import Prelude -import Control.Monad.Eff (Eff) +import Control.Monad.Eff (kind Effect, Eff) import Data.Either (Either(..)) import Control.Monad.Cont.Trans (ContT(..), runContT) import Data.Function.Uncurried (runFn2, Fn2, Fn4, runFn4) @@ -36,9 +36,9 @@ type WithWebSocket eff = Eff (ws :: WS | eff) type WebSocket eff = ContT Unit (WithWebSocket eff) type WebSocketError = String -foreign import data WS :: ! +foreign import data WS :: Effect -foreign import data Socket :: * +foreign import data Socket :: Type type WebSocketHandler eff = Socket -> { onOpen :: WithWebSocket eff Unit