diff options
| -rw-r--r-- | erebos-webapp.cabal | 2 | ||||
| -rw-r--r-- | src/Main.hs | 21 | ||||
| -rw-r--r-- | src/WebSocket.hs | 24 | 
3 files changed, 41 insertions, 6 deletions
| diff --git a/erebos-webapp.cabal b/erebos-webapp.cabal index 5da31ee..7648849 100644 --- a/erebos-webapp.cabal +++ b/erebos-webapp.cabal @@ -25,8 +25,6 @@ executable erebos-webapp          -optl-Wl,--export=hs_init,--export=setup          -fdefer-typed-holes -    extra-libraries: blake2b-ref -      main-is:          Main.hs      other-modules:          JavaScript diff --git a/src/Main.hs b/src/Main.hs index 83d2d8a..183b038 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -1,18 +1,25 @@  module Main (main, setup) where +import Control.Concurrent +import Control.Monad  import Control.Monad.Reader -import Data.ByteString qualified as B  import Data.Maybe  import Data.Proxy  import Data.Text qualified as T  import GHC.Wasm.Prim +import Erebos.Chatroom +import Erebos.DirectMessage +import Erebos.Discovery  import Erebos.Identity +import Erebos.Network +import Erebos.Service  import Erebos.State  import Erebos.Storable  import Erebos.Storage +import Erebos.Sync  import System.IO.Unsafe @@ -71,8 +78,18 @@ setup = do                  , lsOther = []                  } +    server <- startServer defaultServerOptions globalHead JS.consoleLog +        [ someService @ChatroomService Proxy +        , someService @DiscoveryService Proxy +        , someService @DirectMessage Proxy +        , someService @SyncService Proxy +        ] +      startClient "localhost" 9160 "" $ \conn -> do -        sendMessage conn $ B.pack [ 98 .. 107 ] +        void $ serverPeerCustom server conn +        void $ forkIO $ forever $ do +            msg <- receiveMessage conn +            receivedFromCustomAddress server conn msg      return () diff --git a/src/WebSocket.hs b/src/WebSocket.hs index 273be85..19d30c4 100644 --- a/src/WebSocket.hs +++ b/src/WebSocket.hs @@ -9,8 +9,12 @@ import Control.Concurrent.Chan  import Data.ByteString (ByteString)  import Data.ByteString.Unsafe +import Data.Function +import Data.Unique  import Data.Word +import Erebos.Network +  import Foreign.Marshal.Alloc  import Foreign.Ptr @@ -20,13 +24,29 @@ import JavaScript qualified as JS  data Connection = Connection -    { connJS :: JSVal +    { connUnique :: Unique +    , connAddress :: String +    , connJS :: JSVal      , connInQueue :: Chan ByteString      } +instance Eq Connection where +    (==) = (==) `on` connUnique + +instance Ord Connection where +    compare = compare `on` connUnique + +instance Show Connection where +    show = connAddress + +instance PeerAddressType Connection where +    sendBytesToAddress = sendMessage +  startClient :: String -> Int -> String -> (Connection -> IO ()) -> IO ()  startClient addr port path fun = do -    connJS <- js_initWebSocket (toJSString $ "ws://" <> addr <> ":" <> show port <> "/" <> path) +    connUnique <- newUnique +    let connAddress = "ws://" <> addr <> ":" <> show port <> "/" <> path +    connJS <- js_initWebSocket (toJSString connAddress)      connInQueue <- newChan      let conn = Connection {..} |