Skip to content
This repository was archived by the owner on Oct 11, 2025. It is now read-only.

Commit 14a29ad

Browse files
committed
Make examples runnable with jsaddle-warp
1 parent 29f97c9 commit 14a29ad

File tree

4 files changed

+51
-6
lines changed

4 files changed

+51
-6
lines changed

app/App.hs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
1+
{-# LANGUAGE CPP #-}
2+
13
module App (start) where
24

5+
#ifdef wasi_HOST_OS
36
import GHC.Wasm.Prim
47
import Language.Javascript.JSaddle (JSM)
8+
#else
9+
import Language.Javascript.JSaddle
10+
#endif
11+
512
import SimpleCounter qualified
613
import Snake qualified
714
import TodoMVC qualified
@@ -10,7 +17,7 @@ import XHR qualified
1017

1118
start :: JSString -> JSM ()
1219
start e =
13-
case fromJSString e of
20+
case fromJSString e :: String of
1421
"simplecounter" -> SimpleCounter.start
1522
"snake" -> Snake.start
1623
"todomvc" -> TodoMVC.start

app/Main.hs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
{-# LANGUAGE CPP #-}
2+
3+
#ifdef wasi_HOST_OS
4+
15
module MyMain (main) where
26

37
import App (start)
@@ -8,3 +12,23 @@ foreign export javascript "hs_start" main :: JSString -> IO ()
812

913
main :: JSString -> IO ()
1014
main e = JSaddle.Wasm.run $ start e
15+
16+
#else
17+
18+
module Main (main) where
19+
20+
import App (start)
21+
import Language.Javascript.JSaddle
22+
import Language.Javascript.JSaddle.Warp
23+
import Network.Wai.Handler.Warp
24+
import Network.WebSockets
25+
import System.Environment
26+
27+
main :: IO ()
28+
main = getArgs >>= \case
29+
[arg] -> runSettings (setPort 8000 defaultSettings)
30+
=<< jsaddleOr defaultConnectionOptions (start $ toJSString arg)
31+
jsaddleApp
32+
_ -> fail "bad args: specify an example, e.g. 2048"
33+
34+
#endif

app/XHR.hs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{-# LANGUAGE CPP #-}
12
{-# LANGUAGE DataKinds #-}
23
{-# LANGUAGE DeriveGeneric #-}
34
{-# LANGUAGE RecordWildCards #-}
@@ -9,13 +10,19 @@ module XHR (start) where
910

1011
-- slightly adapted from https://github.com/dmjio/miso/blob/master/examples/xhr/Main.hs
1112

13+
#ifdef wasi_HOST_OS
14+
import GHC.Wasm.Prim
15+
#else
16+
import Data.JSString (JSString)
17+
import Language.Javascript.JSaddle (fromJSString, toJSString)
18+
#endif
19+
1220
import Control.Monad.IO.Class
1321
import Data.Aeson
1422
import qualified Data.Map as M
1523
import Data.Maybe
1624
import qualified Data.Text as T
1725
import GHC.Generics
18-
import GHC.Wasm.Prim
1926

2027
import Miso hiding (defaultOptions)
2128
import Miso.String
@@ -135,14 +142,19 @@ instance FromJSON APIInfo where
135142
getGitHubAPIInfo :: JSM APIInfo
136143
getGitHubAPIInfo = do
137144
resp <- liftIO $
138-
T.pack . fromJSString <$> js_fetch (toJSString "https://api.github.com")
145+
T.pack . fromJSString <$> js_fetch (toJSString ("https://api.github.com" :: String))
139146
case eitherDecodeStrictText resp :: Either String APIInfo of
140147
Left s -> error s
141148
Right j -> pure j
142149

150+
#ifdef wasi_HOST_OS
143151
-- We use the WASM JS FFI here to access the more modern fetch API. If you want
144152
-- your code to eg also work when compiling with non-cross GHC and using
145153
-- jsaddle-warp, you can use fetch or XMLHttpRequest via JSaddle, for example
146154
-- via ghcjs-dom, servant-jsaddle or servant-client-js.
147155
foreign import javascript safe "const r = await fetch($1); return r.text();"
148156
js_fetch :: JSString -> IO JSString
157+
#else
158+
js_fetch :: JSString -> IO JSString
159+
js_fetch = error "not implemented"
160+
#endif

ghc-wasm-miso-examples.cabal

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,8 @@ executable ghc-wasm-miso-examples
88
, aeson
99
, base
1010
, containers
11-
, ghc-experimental
1211
, hs2048
1312
, jsaddle
14-
, jsaddle-wasm
1513
, miso
1614
, mtl
1715
, random
@@ -26,4 +24,8 @@ executable ghc-wasm-miso-examples
2624
Snake
2725
TodoMVC
2826
XHR
29-
ghc-options: -no-hs-main -optl-mexec-model=reactor "-optl-Wl,--export=hs_start"
27+
if arch(wasm32)
28+
build-depends: ghc-experimental, jsaddle-wasm
29+
ghc-options: -no-hs-main -optl-mexec-model=reactor "-optl-Wl,--export=hs_start"
30+
else
31+
build-depends: jsaddle-warp, warp, websockets

0 commit comments

Comments
 (0)