ghcjs-websockets: GHCJS interface for the Javascript Websocket API

This is a package candidate release! Here you can preview how this package release will appear once published to the main package index (which can be accomplished via the 'maintain' link below). Please note that once a package has been published to the main package index it cannot be undone! Please consult the package uploading documentation for more information.

[maintain] [Publish]


'ghcjs-websockets' aims to provide an clean, idiomatic Haskell interface abstracting over the Javascript Websockets API, targeting ghcjs for receiving serialized tagged and untagged data.

The interface abstracts websockets as raw data streams and is designed to allow multiple styles of usage; in particular, is adapted for 'io-stream'-style usage and 'distributed-process'-style usage. It is designed to fit in unintrusively in larger frameworks, and adaptable for other interfaces (like pipes).

This library provides both tagged and untagged communication channels, using 'tagged-binary'

Tagged channels mimic the behavior of Cloud Haskell and 'distributed-process', with their dynamic communication channels. You can use the same channel to send in polymorphic, typed data and deal with it at the time you wish.

Some examples:

-- Echoes input from the server.
main :: IO ()
main = do
    c <- openConnection "ws://"
    forever $ do
        d <- withConn c expectText
        putStrLn d
        withConn c (sendText d)
    closeConnection c
-- Echoes input from the server.
main :: IO ()
main = withUrl "ws://" . forever $ do
    d <- expectText
    liftIO $ putStrLn d
    sendText d
-- Keep on printing all `Just` values, and stop at the
-- first `Nothing`.
whileJust :: ConnectionProcess ()
whileJust = do
    d <- expect
    case d of
      Just d' -> do
          liftIO $ putStrLn d'
      Nothing ->
          return ()
-- Server emits `Int`s or `String`s randomly; launch
-- two parallel threads to catch the data as it comes
-- in, one watching for `Int`s and one watching for
-- `String`s.
main :: IO ()
main = do
   c <- openTaggedConnection "ws://"
   t1 <- forkIO . withConn c . forever $ do
       n <- expectTagged
       replicateM n . liftIO . putStrLn $ "got a number! " ++ show n
   t2 <- forkIO . withConn c . forever $ do
       s <- expectTagged
       liftIO $ putStrN s
   await t1
   await t2
   closeConnection c

See the JavaScript.WebSockets module for a more detailed introduction.

There is still some functionality left to be desired; feel free to open a ticket and send in suggestions or bugs, and all pull requests are welcomed!


Change log None available
Dependencies base (>=4.7 && <4.8), binary, bytestring, containers, ghcjs-base, spoon, tagged-binary, text, transformers [details]
License MIT
Copyright Copyright (c) Justin Le 2014
Author Justin Le <>
Maintainer Justin Le <>
Category Web
Home page
Source repo head: git clone
Uploaded by jle at 2014-03-13T07:13:55Z



Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees