jsaddle-wasm-0.0.1.0: src-js/Language/Javascript/JSaddle/Wasm/JS.hs
-- | The JSaddle command interpreter. This lives in a sublibrary as it does not
-- depend on JSFFI as the rest of jsaddle-wasm, and hence does not induce this
-- property on downstream packages.
module Language.Javascript.JSaddle.Wasm.JS (jsaddleScript) where
import Data.ByteString.Lazy.Char8 qualified as BLC8
import Language.Javascript.JSaddle.Run.Files qualified as JSaddle.Files
-- | A chunk of JavaScript that defines a function @runJSaddle@, a function that
-- takes a message port (e.g. a web worker) as its single argument, and then
-- processes incoming JSaddle commands.
jsaddleScript :: BLC8.ByteString
jsaddleScript =
BLC8.unlines
[ JSaddle.Files.ghcjsHelpers,
JSaddle.Files.initState,
"function runJSaddle(worker) {",
" worker.addEventListener('message', e => {",
" const d = e.data;",
" if (d && typeof d === 'object' && d.tag === 'jsaddle') {",
" const batch = JSON.parse(d.msg);",
JSaddle.Files.runBatch
(\r -> "worker.postMessage({tag: 'jsaddle', msg: JSON.stringify(" <> r <> ")});")
-- not clear how to support synchronous dispatch here
Nothing,
" }",
" });",
"}"
]