@@ -22,7 +22,7 @@ import Prelude hiding ((.), id)
2222import Control.Category
2323import Control.Concurrent
2424import Control.Exception
25−import Control.Lens ((^?), _Just, _Right)
25+import Control.Lens ((%~), (^?), _Just, _Right)
2626import qualified Data.Attoparsec.ByteString.Char8 as A
2727import Data.ByteString (ByteString)
2828import qualified Data.ByteString.Char8 as BSC
@@ -112,40 +112,37 @@ runWidget conf frontend validFullEncoder = do
112112 close
113113 (\skt -> do
114114 man <- newManager defaultManagerSettings
115− app <- obeliskApp defaultConnectionOptions frontend validFullEncoder $ fallbackProxy redirectHost redirectPort man
115+ app <- obeliskApp defaultConnectionOptions frontend validFullEncoder uri $ fallbackProxy redirectHost redirectPort man
116116 runSettingsSocket settings skt app)
117117
118−obeliskApp :: forall route backendRoute. ConnectionOptions -> Frontend (R route) -> ValidEncoder (Either Text) (R (Sum backendRoute (ObeliskRoute route))) PageName -> Application -> IO Application
119−obeliskApp opts frontend validFullEncoder backend = do
118+obeliskApp
119+ :: forall route backendRoute. ConnectionOptions
120+ -> Frontend (R route)
121+ -> ValidEncoder (Either Text) (R (Sum backendRoute (ObeliskRoute route))) PageName
122+ -> URI
123+ -> Application
124+ -> IO Application
125+obeliskApp opts frontend validFullEncoder uri backend = do
120126 let entryPoint = do
121127 runFrontend validFullEncoder frontend
122128 syncPoint
129+ jsaddlePath <- URI.mkPathPiece "jsaddle"
130+ let jsaddleUri = BSLC.fromStrict $ URI.renderBs $ uri & uriPath %~ (<>[jsaddlePath])
123131 Right (jsaddleWarpRouteValidEncoder :: ValidEncoder (Either Text) (R JSaddleWarpRoute) PageName) <- return $ checkEncoder jsaddleWarpRouteEncoder
124132 jsaddle <- jsaddleWithAppOr opts entryPoint $ \_ sendResponse -> sendResponse $ W.responseLBS H.status500 [("Content-Type", "text/plain")] "obeliskApp: jsaddle got a bad URL"
125133 return $ \req sendResponse -> case _validEncoder_decode validFullEncoder (W.pathInfo req, mempty) of --TODO: Query strings
126134 Left e -> sendResponse $ W.responseLBS H.status404 [("Content-Type", "text/plain")] $ LBS.fromStrict $ encodeUtf8 e
127135 Right r -> case r of
128136 InR (ObeliskRoute_Resource ResourceRoute_JSaddleWarp) :=> Identity jsaddleRoute -> case jsaddleRoute of
129− JSaddleWarpRoute_JavaScript :/ () -> sendResponse $ W.responseLBS H.status200 [("Content-Type", "application/javascript")] $ jsaddleJs' (Just "http://localhost:8000/jsaddle") False
137+ JSaddleWarpRoute_JavaScript :/ () -> sendResponse $ W.responseLBS H.status200 [("Content-Type", "application/javascript")] $ jsaddleJs' (Just jsaddleUri) False
130138 _ -> flip jsaddle sendResponse $ req
131139 { W.pathInfo = fst $ _validEncoder_encode jsaddleWarpRouteValidEncoder jsaddleRoute
132140 }
133141 InR (ObeliskRoute_App appRouteComponent) :=> Identity appRouteRest -> do
134− html <- renderStaticHtml $ fmap fst $ runEventWriterT $ flip runRoutedT (pure $ appRouteComponent :/ appRouteRest) $ indexHtml (_frontend_head frontend) (_frontend_body frontend)
142+ html <- renderFrontendHtml (appRouteComponent :/ appRouteRest) $ jsaddleFrontend frontend
135143 sendResponse $ W.responseLBS H.status200 [("Content-Type", "text/html")] $ BSLC.fromStrict html
136144 _ -> backend req sendResponse
137145
138−renderStaticHtml :: StaticWidget () () -> IO ByteString
139−renderStaticHtml w = do
140− (_, bs) <- renderStatic w
141− return $ "<!DOCTYPE html>" <> bs
142−
143−indexHtml :: DomBuilder t m => m () -> m () -> m ()
144−indexHtml h b = el "html" $ do
145− el "head" $ h
146− el "body" $ b
147− elAttr "script" ("src" =: "/jsaddle/jsaddle.js") $ return ()
148−
149146-- | like 'bindPortTCP' but reconnects on exception
150147bindPortTCPRetry :: Settings
151148 -> (IOError -> IO ()) -- ^ Action to run the first time an exception is caught