@@ -40,23 +40,32 @@ foreign import ccall safe "wrapper"
40foreign import ccall safe "wrapper"
40foreign import ccall safe "wrapper"
41 wrapMessageCallback :: (CString -> IO ()) -> IO (FunPtr (CString -> IO ()))
41 wrapMessageCallback :: (CString -> IO ()) -> IO (FunPtr (CString -> IO ()))
43+foreign import ccall safe "wrapper"
44+ wrapSyncCallback :: (CString -> IO CString) -> IO (FunPtr (CString -> IO CString))
43jsaddleInit :: JSM () -> FunPtr (CString -> IO ()) -> IO (Ptr NativeCallbacks)
46jsaddleInit :: JSM () -> FunPtr (CString -> IO ()) -> IO (Ptr NativeCallbacks)
44jsaddleInit jsm evaluateJavascriptAsyncPtr = do
47jsaddleInit jsm evaluateJavascriptAsyncPtr = do
45 let evaluateJavascriptAsync = mkCallback evaluateJavascriptAsyncPtr
48 let evaluateJavascriptAsync = mkCallback evaluateJavascriptAsyncPtr
46− (processResult, _, start) <- runJavaScript (\batch ->
49+ (processResult, processSyncResult, start) <- runJavaScript (\batch ->
47− useAsCString (toStrict $ "runJSaddleBatch(" <> encode batch <> ");") $
50+ useAsCString (toStrict $ "runJSaddleBatch(" <> encode batch <> ");")
48 evaluateJavascriptAsync) jsm
51 evaluateJavascriptAsync) jsm
49− jsaddleStartPtr <- wrapStartCallback $ void $ forkIO $ start
52+ jsaddleStartPtr <- wrapStartCallback $ void $ forkIO start
50 jsaddleResultPtr <- wrapMessageCallback $ \s -> do
53 jsaddleResultPtr <- wrapMessageCallback $ \s -> do
51 result <- decode . fromStrict <$> packCString s
54 result <- decode . fromStrict <$> packCString s
52 case result of
55 case result of
53 Nothing -> error $ "jsaddle message decode failed: " <> show result
56 Nothing -> error $ "jsaddle message decode failed: " <> show result
54 Just r -> processResult r
57 Just r -> processResult r
58+ jsaddleSyncResultPtr <- wrapSyncCallback $ \s -> do
59+ result <- decode . fromStrict <$> packCString s
61+ Nothing -> error $ "jsaddle message decode failed: " <> show result
62+ Just r -> newCString =<< unpack . toStrict . encode <$> processSyncResult r
55 jsaddleJsPtr <- newCString $ unpack $ toStrict jsaddleJs
63 jsaddleJsPtr <- newCString $ unpack $ toStrict jsaddleJs
56 jsaddleHtmlPtr <- newCString $ unpack $ toStrict indexHtml
64 jsaddleHtmlPtr <- newCString $ unpack $ toStrict indexHtml
57− new $ NativeCallbacks
65+ new NativeCallbacks
58 { _nativeCallbacks_jsaddleStart = jsaddleStartPtr
66 { _nativeCallbacks_jsaddleStart = jsaddleStartPtr
59 , _nativeCallbacks_jsaddleResult = jsaddleResultPtr
67 , _nativeCallbacks_jsaddleResult = jsaddleResultPtr
68+ , _nativeCallbacks_jsaddleSyncResult = jsaddleSyncResultPtr
60 , _nativeCallbacks_jsaddleJsData = jsaddleJsPtr
69 , _nativeCallbacks_jsaddleJsData = jsaddleJsPtr
61 , _nativeCallbacks_jsaddleHtmlData = jsaddleHtmlPtr
70 , _nativeCallbacks_jsaddleHtmlData = jsaddleHtmlPtr
@@ -115,7 +124,8 @@ jsaddleJs = ghcjsHelpers <> "\
115 \runJSaddleBatch = (function() {\n\
124 \runJSaddleBatch = (function() {\n\
116 \ " <> initState <> "\n\
125 \ " <> initState <> "\n\
117 \ return function(batch) {\n\
126 \ 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 <> ")))")) <> "\
120 \})();\n\
130 \})();\n\
121 \jsaddle.postReady();\n"
131 \jsaddle.postReady();\n"