From c3a66fe663254856e441ef320facac4f4956594a Mon Sep 17 00:00:00 2001 From: Divam Date: Thu, 16 Jan 2020 11:47:24 +0900 Subject: [PATCH 1/2] wip: read one message, starting with size --- src/Language/Javascript/JSaddle/Wasm.hs | 38 +++++++++++++++---------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/src/Language/Javascript/JSaddle/Wasm.hs b/src/Language/Javascript/JSaddle/Wasm.hs index 0fe316f..fa504b8 100644 --- a/src/Language/Javascript/JSaddle/Wasm.hs +++ b/src/Language/Javascript/JSaddle/Wasm.hs @@ -54,11 +54,15 @@ run _ entryPoint = do receiveDataMessage = loop where loop = do - threadDelay (100) - try (BSIO.hGetLine jsInOut) + threadDelay 1 + try (BSIO.hGetNonBlocking jsInOut 4) >>= \case (Left (ex :: IOException)) -> loop - (Right v) -> return $ BS.fromStrict v + (Right v) + | BSIO.null v -> loop + | otherwise -> do + let size = Binary.decode (BS.fromStrict v) :: Word32 + BS.fromStrict <$> BSIO.hGetNonBlocking jsInOut (fromIntegral size) -- When to exit? never? waitTillClosed = forever $ do @@ -69,20 +73,24 @@ run _ entryPoint = do (processResult, _, start) <- runJavaScript sendBatch entryPoint forkIO . forever $ do - msgs <- receiveDataMessage - processIncomingMsgs processResult msgs + thisMsg <- receiveDataMessage + case decode thisMsg of + Nothing -> error $ "jsaddle Results decode failed : " <> show thisMsg + Just r -> processResult r start waitTillClosed processIncomingMsgs :: (Results -> IO ()) -> ByteString -> IO () -processIncomingMsgs cont msgs = do - let - size = Binary.decode (BS.take 4 msgs) :: Word32 - (thisMsg, rest) = BS.splitAt (fromIntegral $ 4 + size) msgs - case decode (BS.drop 4 thisMsg) of - Nothing -> error $ "jsaddle Results decode failed : " <> show thisMsg - Just r -> cont r - case BS.length rest of - 0 -> return () - _ -> processIncomingMsgs cont rest +processIncomingMsgs cont msgs = if (BS.length msgs < 5) + then error $ "no data loop: " <> show msgs + else do + let + size = Binary.decode (BS.take 4 msgs) :: Word32 + (thisMsg, rest) = BS.splitAt (fromIntegral $ 4 + size) msgs + case decode (BS.drop 4 thisMsg) of + Nothing -> error $ "jsaddle Results decode failed : " <> show thisMsg + Just r -> cont r + case BS.length rest of + 0 -> return () + _ -> processIncomingMsgs cont rest From 01334b7fd88e62489557be77e9bad832b8243b4a Mon Sep 17 00:00:00 2001 From: Divam Date: Thu, 16 Jan 2020 14:05:57 +0900 Subject: [PATCH 2/2] Process messages in chunks --- src/Language/Javascript/JSaddle/Wasm.hs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/Language/Javascript/JSaddle/Wasm.hs b/src/Language/Javascript/JSaddle/Wasm.hs index fa504b8..e43cf92 100644 --- a/src/Language/Javascript/JSaddle/Wasm.hs +++ b/src/Language/Javascript/JSaddle/Wasm.hs @@ -61,7 +61,8 @@ run _ entryPoint = do (Right v) | BSIO.null v -> loop | otherwise -> do - let size = Binary.decode (BS.fromStrict v) :: Word32 + -- Somehow we get this size in reverse!! + let size = Binary.decode (BS.reverse $ BS.fromStrict v) :: Word32 BS.fromStrict <$> BSIO.hGetNonBlocking jsInOut (fromIntegral size) -- When to exit? never? @@ -73,17 +74,15 @@ run _ entryPoint = do (processResult, _, start) <- runJavaScript sendBatch entryPoint forkIO . forever $ do - thisMsg <- receiveDataMessage - case decode thisMsg of - Nothing -> error $ "jsaddle Results decode failed : " <> show thisMsg - Just r -> processResult r + msgs <- receiveDataMessage + processIncomingMsgs processResult msgs start waitTillClosed processIncomingMsgs :: (Results -> IO ()) -> ByteString -> IO () processIncomingMsgs cont msgs = if (BS.length msgs < 5) - then error $ "no data loop: " <> show msgs + then error $ "processIncomingMsgs: no more data while looping: " <> show msgs else do let size = Binary.decode (BS.take 4 msgs) :: Word32