on master help sign in
Add obelisk-run-frontend

Will be used to run an reflex-dom widget during development

commit57b4e41de25c6fb06ea5b9379a475a9dedbf7163 authorLuigy Leon <luigy@outlook.com> dateTue 24 Apr 2018, 17:37 (8 years ago) parentcbd7277
3 files changed+59−2
default.nix+4−2 lib/run-frontend/obelisk-run-frontend.cabal+23 lib/run-frontend/src/Obelisk/Widget/Run.hs+32
default.nix+4−2
@@ -62,6 +62,7 @@ let #TODO: Upstream
6262 obelisk-asset-serve-snap = self.callCabal2nix "obelisk-asset-serve-snap" (hackGet ./lib/asset + "/serve-snap") {};
6363 obelisk-backend = self.callCabal2nix "obelisk-backend" ./lib/backend {};
6464 obelisk-command = self.callCabal2nix "obelisk-command" ./lib/command {};
65+ obelisk-run-frontend = self.callCabal2nix "obelisk-run-frontend" ./lib/run-frontend {};
6566 obelisk-selftest = self.callCabal2nix "obelisk-selftest" ./lib/selftest {};
6667 obelisk-snap = self.callCabal2nix "obelisk-snap" ./lib/snap {};
6768 obelisk-snap-extras = self.callCabal2nix "obelisk-snap-extras" ./lib/snap-extras {};
@@ -124,15 +125,16 @@ rec {
124125 ${staticName} = dontHaddock (self.callCabal2nix "static" assets.haskellManifest {});
125126 };
126127 overrides = composeExtensions defaultHaskellOverrides projectOverrides;
128+ ghcDevPackages = ["obelisk-run-frontend"];
127129 in {
128130 inherit overrides;
129131 packages = combinedPackages;
130132 shells = {
131− ghc = filter (x: hasAttr x combinedPackages) [
133+ ghc = (filter (x: hasAttr x combinedPackages) [
132134 backendName
133135 commonName
134136 frontendName
135− ];
137+ ]) ++ ghcDevPackages;
136138 ghcjs = filter (x: hasAttr x combinedPackages) [
137139 frontendName
138140 commonName
lib/run-frontend/obelisk-run-frontend.cabalnew file+23
@@ -0,0 +1,23 @@
1+name: obelisk-run-frontend
2+version: 0.1
3+license: BSD3
4+build-type: Simple
5+cabal-version: >=1.2
6+
7+library
8+ hs-source-dirs: src
9+ build-depends:
10+ base
11+ , bytestring
12+ , http-client
13+ , http-reverse-proxy
14+ , jsaddle
15+ , jsaddle-warp
16+ , reflex-dom
17+ , text
18+ , wai
19+ , warp
20+ , websockets
21+ exposed-modules:
22+ Obelisk.Widget.Run
23+ ghc-options: -Wall
lib/run-frontend/src/Obelisk/Widget/Run.hsnew file+32
@@ -0,0 +1,32 @@
1+{-# LANGUAGE OverloadedStrings #-}
2+module Obelisk.Widget.Run where
3+
4+import Data.ByteString (ByteString)
5+import Language.Javascript.JSaddle.WebSockets
6+import Language.Javascript.JSaddle.Run (syncPoint)
7+import Network.HTTP.Client (defaultManagerSettings, newManager, Manager)
8+import qualified Network.HTTP.ReverseProxy as RP
9+import Network.Wai (Application)
10+import Network.Wai.Handler.Warp (defaultSettings, setTimeout, setPort, runSettings)
11+import Network.WebSockets.Connection (defaultConnectionOptions)
12+import Reflex.Dom.Core
13+
14+test :: IO ()
15+test = do
16+ runWidget $ do
17+ text "hello world"
18+ elAttr "img" ("src" =: "/obelisk.jpg") $ return ()
19+
20+runWidget :: Widget () () -> IO ()
21+runWidget w = do
22+ man <- newManager defaultManagerSettings
23+ let port = 3003 -- TODO
24+ redirectHost = "0.0.0.0"
25+ redirectPort = 38383
26+ runSettings (setPort port (setTimeout 3600 defaultSettings)) =<<
27+ jsaddleWithAppOr defaultConnectionOptions (mainWidget' w >> syncPoint) (fallbackProxy redirectHost redirectPort man)
28+
29+fallbackProxy :: ByteString -> Int -> Manager -> Application
30+fallbackProxy host port = RP.waiProxyTo handleRequest RP.defaultOnExc
31+ where handleRequest _req = return $ RP.WPRProxyDest $ RP.ProxyDest host port
32+