@@ -40,23 +40,32 @@ foreign import ccall safe "wrapper"
4040foreign import ccall safe "wrapper"
4141 wrapMessageCallback :: (CString -> IO ()) -> IO (FunPtr (CString -> IO ()))
4242
43+foreign import ccall safe "wrapper"
44+ wrapSyncCallback :: (CString -> IO CString) -> IO (FunPtr (CString -> IO CString))
45+
4346jsaddleInit :: JSM () -> FunPtr (CString -> IO ()) -> IO (Ptr NativeCallbacks)
4447jsaddleInit jsm evaluateJavascriptAsyncPtr = do
4548 let evaluateJavascriptAsync = mkCallback evaluateJavascriptAsyncPtr
46− (processResult, _, start) <- runJavaScript (\batch ->
47− useAsCString (toStrict $ "runJSaddleBatch(" <> encode batch <> ");") $
49+ (processResult, processSyncResult, start) <- runJavaScript (\batch ->
50+ useAsCString (toStrict $ "runJSaddleBatch(" <> encode batch <> ");")
4851 evaluateJavascriptAsync) jsm
49− jsaddleStartPtr <- wrapStartCallback $ void $ forkIO $ start
52+ jsaddleStartPtr <- wrapStartCallback $ void $ forkIO start
5053 jsaddleResultPtr <- wrapMessageCallback $ \s -> do
5154 result <- decode . fromStrict <$> packCString s
5255 case result of
5356 Nothing -> error $ "jsaddle message decode failed: " <> show result
5457 Just r -> processResult r
58+ jsaddleSyncResultPtr <- wrapSyncCallback $ \s -> do
59+ result <- decode . fromStrict <$> packCString s
60+ case result of
61+ Nothing -> error $ "jsaddle message decode failed: " <> show result
62+ Just r -> newCString =<< unpack . toStrict . encode <$> processSyncResult r
5563 jsaddleJsPtr <- newCString $ unpack $ toStrict jsaddleJs
5664 jsaddleHtmlPtr <- newCString $ unpack $ toStrict indexHtml
57− new $ NativeCallbacks
65+ new NativeCallbacks
5866 { _nativeCallbacks_jsaddleStart = jsaddleStartPtr
5967 , _nativeCallbacks_jsaddleResult = jsaddleResultPtr
68+ , _nativeCallbacks_jsaddleSyncResult = jsaddleSyncResultPtr
6069 , _nativeCallbacks_jsaddleJsData = jsaddleJsPtr
6170 , _nativeCallbacks_jsaddleHtmlData = jsaddleHtmlPtr
6271 }
@@ -115,7 +124,8 @@ jsaddleJs = ghcjsHelpers <> "\
115124 \runJSaddleBatch = (function() {\n\
116125 \ " <> initState <> "\n\
117126 \ return function(batch) {\n\
118− \ " <> runBatch (\a -> "jsaddle.postMessage(JSON.stringify(" <> a <> "));") Nothing <> "\
127+ \ " <> runBatch (\a -> "jsaddle.postMessage(JSON.stringify(" <> a <> "));")
128+ (Just (\a -> "JSON.parse(jsaddle.syncMessage(JSON.stringify(" <> a <> ")))")) <> "\
119129 \ };\n\
120130 \})();\n\
121131 \jsaddle.postReady();\n"