browser.nix (2246B)
1 { pkgs, toolchain, shimSource, probe }: 2 pkgs.runCommand "tricu-haskell-wasm-browser" { 3 nativeBuildInputs = [ toolchain pkgs.typescript pkgs.python3 ]; 4 } '' 5 export HOME=$TMPDIR 6 mkdir -p $out/shim objects 7 cp -r ${shimSource}/src shim-src 8 tsc --target es2022 --module es2022 --lib esnext,dom --skipLibCheck \ 9 --outDir $out/shim shim-src/*.ts 10 cp ${shimSource}/LICENSE-* $out/shim/ 11 cp ${./CompilerProbe.hs} CompilerProbe.hs 12 cp ${./BrowserRuntime.hs} BrowserRuntime.hs 13 cp ${./BrowserModules.hs} BrowserModules.hs 14 wasm32-wasi-ghc -O2 -rtsopts -i${../../src} -i. -outputdir objects \ 15 ${./Reactor.hs} ${./reactor-init.c} -no-hs-main -optl-mexec-model=reactor \ 16 -optl-Wl,--max-memory=536870912 \ 17 -optl-Wl,--export=tricu_rts_init,--export=malloc,--export=free \ 18 -optl-Wl,--export=tricu_initialize,--export=tricu_compile,--export=tricu_observe \ 19 -optl-Wl,--export=tricu_request,--export=tricu_initialize_empty \ 20 -optl-Wl,--export=tricu_dump,--export=tricu_reset,--export=tricu_collect \ 21 -optl-Wl,--export=tricu_response_size,--export=tricu_response_copy \ 22 -o $out/reactor.wasm 23 cp -r ${../demo-site/dist} $out/site 24 chmod -R u+w $out/site 25 rm -r $out/site/conformance 26 cp ${./browser-bridge.mjs} $out/bridge.mjs 27 cp ${./browser-worker.mjs} $out/worker.mjs 28 cp ${./browser-client.mjs} $out/client.mjs 29 node ${./prepare-parity.mjs} ${../demo-site} $out/parity ${../../test/fixtures} 30 cp ${./browser-parity.mjs} $out/parity.mjs 31 cp ${./browser-page.mjs} $out/page.mjs 32 cp -r ${probe}/compiler-data $out/data 33 cp ${../demo-site/test/compiler-conformance.json} $out/goldens.json 34 python3 - "$out" <<'PY' 35 import hashlib,json,pathlib,sys 36 p=pathlib.Path(sys.argv[1]) 37 pins={name:hashlib.sha256((p/'data'/name).read_bytes()).hexdigest() for name in ['compiler.dag','environment.tsv','compiler-exports.tsv']} 38 compiler=json.loads((p/'data/manifest.json').read_text())['compilerSha256'] 39 (p/'pins.mjs').write_text('export default '+json.dumps(pins)+';\nexport const compilerHash='+json.dumps(compiler)+';\n') 40 PY 41 echo '<!doctype html><meta charset="utf-8"><title>Haskell WASM probe</title><script type="module" src="page.mjs"></script>' > $out/index.html 42 cp ${probe}/versions.txt $out/versions.txt 43 ''