tricu

A lazy functional language based on Tree Calculus
Log | Files | Refs | README | LICENSE

browser.nix (2355B)


      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 ${./BrowserTrees.hs} BrowserTrees.hs
     14   cp ${./BrowserModules.hs} BrowserModules.hs
     15   wasm32-wasi-ghc -O2 -rtsopts -i${../../src} -i. -outputdir objects \
     16     ${./Reactor.hs} ${./reactor-init.c} -no-hs-main -optl-mexec-model=reactor \
     17     -optl-Wl,--max-memory=536870912 \
     18     -optl-Wl,--export=tricu_rts_init,--export=malloc,--export=free \
     19     -optl-Wl,--export=tricu_initialize,--export=tricu_compile,--export=tricu_observe \
     20     -optl-Wl,--export=tricu_request,--export=tricu_initialize_empty \
     21     -optl-Wl,--export=tricu_dump,--export=tricu_reset,--export=tricu_collect \
     22     -optl-Wl,--export=tricu_response_size,--export=tricu_response_copy \
     23     -o $out/reactor.wasm
     24   cp -r ${../demo-site/dist} $out/site
     25   chmod -R u+w $out/site
     26   rm -r $out/site/conformance
     27   cp ${./browser-bridge.mjs} $out/bridge.mjs
     28   cp ${./browser-worker.mjs} $out/worker.mjs
     29   cp ${./browser-client.mjs} $out/client.mjs
     30   node ${./prepare-parity.mjs} ${../demo-site} $out/parity ${../../test/fixtures}
     31   cp ${../demo-site/test/terminal-host.mjs} $out/terminal-host.mjs
     32   cp ${./browser-parity.mjs} $out/parity.mjs
     33   cp ${./browser-page.mjs} $out/page.mjs
     34   cp -r ${probe}/compiler-data $out/data
     35   cp ${../demo-site/test/compiler-conformance.json} $out/goldens.json
     36   python3 - "$out" <<'PY'
     37 import hashlib,json,pathlib,sys
     38 p=pathlib.Path(sys.argv[1])
     39 pins={name:hashlib.sha256((p/'data'/name).read_bytes()).hexdigest() for name in ['compiler.dag','environment.tsv','compiler-exports.tsv']}
     40 compiler=json.loads((p/'data/manifest.json').read_text())['compilerSha256']
     41 (p/'pins.mjs').write_text('export default '+json.dumps(pins)+';\nexport const compilerHash='+json.dumps(compiler)+';\n')
     42 PY
     43   echo '<!doctype html><meta charset="utf-8"><title>Haskell WASM probe</title><script type="module" src="page.mjs"></script>' > $out/index.html
     44   cp ${probe}/versions.txt $out/versions.txt
     45 ''