diff options
author | Roman Smrž <roman.smrz@seznam.cz> | 2025-04-29 20:30:43 +0200 |
---|---|---|
committer | Roman Smrž <roman.smrz@seznam.cz> | 2025-04-29 22:20:38 +0200 |
commit | 46955fc2f755b6cc1328d119c085352572d76b6f (patch) | |
tree | 9e1257e8149503b2a4c4e26f614b35f538622b6c /src | |
parent | db7fa8334097903b2775c98cbb0d548c9e386fd6 (diff) |
Erebos network connection via WebSocket
Diffstat (limited to 'src')
-rw-r--r-- | src/Main.hs | 21 | ||||
-rw-r--r-- | src/WebSocket.hs | 24 |
2 files changed, 41 insertions, 4 deletions
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 {..} |