From cc7ed497e8d51fe0cadf25998afb29ecd71058d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Thu, 12 Sep 2024 09:32:46 +0200 Subject: [PATCH] :tada: Enable conditional use of wasm module --- frontend/package.json | 2 +- frontend/renderer/Cargo.lock | 200 ++++++++++++++++++++++ frontend/renderer/Cargo.toml | 3 + frontend/renderer/src/lib.rs | 9 + frontend/scripts/build | 1 + frontend/scripts/build-renderer.sh | 11 ++ frontend/shadow-cljs.edn | 5 + frontend/src/app/main/data/workspace.cljs | 2 + frontend/src/app/util/wasm.cljs | 23 +++ 9 files changed, 255 insertions(+), 1 deletion(-) create mode 100755 frontend/scripts/build-renderer.sh create mode 100644 frontend/src/app/util/wasm.cljs diff --git a/frontend/package.json b/frontend/package.json index 6e56d7f2d..338f89c0b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -21,7 +21,7 @@ "build:storybook": "yarn run build:storybook:assets && yarn run build:storybook:cljs && storybook build", "build:storybook:assets": "node ./scripts/build-storybook-assets.js", "build:storybook:cljs": "clojure -M:dev:shadow-cljs release storybook", - "build:renderer": "yarn wasm-pack build ./renderer --target web --out-dir ../resources/public/js/renderer/ --release", + "build:renderer": "./scripts/build-renderer.sh", "e2e:server": "node ./scripts/e2e-server.js", "e2e:test": "playwright test --project default", "fmt:clj": "cljfmt fix --parallel=true src/ test/", diff --git a/frontend/renderer/Cargo.lock b/frontend/renderer/Cargo.lock index 48581574f..c14faa4ad 100644 --- a/frontend/renderer/Cargo.lock +++ b/frontend/renderer/Cargo.lock @@ -8,18 +8,56 @@ version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +[[package]] +name = "cc" +version = "1.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62ac837cdb5cb22e10a256099b4fc502b1dfe560cb282963a974d7abd80e476" +dependencies = [ + "shlex", +] + [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "js-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "log" version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +[[package]] +name = "minicov" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c71e683cd655513b99affab7d317deb690528255a0d5f717f1024093c12b169" +dependencies = [ + "cc", + "walkdir", +] + [[package]] name = "once_cell" version = "1.19.0" @@ -49,8 +87,30 @@ name = "renderer" version = "0.1.0" dependencies = [ "wasm-bindgen", + "wasm-bindgen-test", ] +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "syn" version = "2.0.77" @@ -68,6 +128,16 @@ version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "wasm-bindgen" version = "0.2.93" @@ -94,6 +164,18 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.93" @@ -122,3 +204,121 @@ name = "wasm-bindgen-shared" version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" + +[[package]] +name = "wasm-bindgen-test" +version = "0.3.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68497a05fb21143a08a7d24fc81763384a3072ee43c44e86aad1744d6adef9d9" +dependencies = [ + "console_error_panic_hook", + "js-sys", + "minicov", + "scoped-tls", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test-macro", +] + +[[package]] +name = "wasm-bindgen-test-macro" +version = "0.3.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b8220be1fa9e4c889b30fd207d4906657e7e90b12e0e6b0c8b8d8709f5de021" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "web-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/frontend/renderer/Cargo.toml b/frontend/renderer/Cargo.toml index 5faf7d71b..56724cc1a 100644 --- a/frontend/renderer/Cargo.toml +++ b/frontend/renderer/Cargo.toml @@ -14,3 +14,6 @@ wasm-bindgen = "0.2.93" [profile.release] opt-level = "s" + +[dev-dependencies] +wasm-bindgen-test = "0.3.43" diff --git a/frontend/renderer/src/lib.rs b/frontend/renderer/src/lib.rs index 532267bf7..e4b08cfb0 100644 --- a/frontend/renderer/src/lib.rs +++ b/frontend/renderer/src/lib.rs @@ -18,10 +18,19 @@ pub fn print(msg: &str) { #[cfg(test)] mod tests { use super::*; + use wasm_bindgen_test::*; + + wasm_bindgen_test_configure!(run_in_browser); #[test] fn it_works() { let result = add(2, 2); assert_eq!(result, 4); } + + #[wasm_bindgen_test] + fn it_works_in_wasm() { + let result = add(2, 2); + assert_eq!(result, 4); + } } diff --git a/frontend/scripts/build b/frontend/scripts/build index 97199d20d..07b71bff2 100755 --- a/frontend/scripts/build +++ b/frontend/scripts/build @@ -20,6 +20,7 @@ yarn install || exit 1; rm -rf resources/public; rm -rf target/dist; +yarn run build:renderer clojure -M:dev:shadow-cljs release main --config-merge "{:release-version \"${CURRENT_HASH}-${TS}\"}" $EXTRA_PARAMS || exit 1 yarn run build:app:assets || exit 1; diff --git a/frontend/scripts/build-renderer.sh b/frontend/scripts/build-renderer.sh new file mode 100755 index 000000000..ec9aff447 --- /dev/null +++ b/frontend/scripts/build-renderer.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +# NOTE: this script should be called from the parent directory to +# properly work + +yarn run wasm-pack build ./renderer --target web --out-dir ../src/app/util/renderer/ --release +mkdir -p ./resources/public/js/renderer +mv ./src/app/util/renderer/renderer_bg.wasm ./resources/public/js/renderer/ +echo "Patching renderer.js…" +sed -i 's/renderer_bg\.wasm/\/js\/renderer\/renderer_bg\.wasm/g' ./src/app/util/renderer/renderer.js +sed -i 's/, import\.meta\.url/, new URL(document\.baseURI)\.origin/g' ./src/app/util/renderer/renderer.js +echo "Done." diff --git a/frontend/shadow-cljs.edn b/frontend/shadow-cljs.edn index 0c0b91b57..5dd9dd880 100644 --- a/frontend/shadow-cljs.edn +++ b/frontend/shadow-cljs.edn @@ -67,6 +67,11 @@ :output-wrapper false :warnings {:fn-deprecated false}} + :js-options + {:entry-keys ["module" "browser" "main"] + :resolve {"renderer" {:target :file + :file "resources/public/js/renderer/renderer.js"}}} + :release {:closure-defines {goog.DEBUG false goog.debug.LOGGING_ENABLED true} diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index dd62ff70d..3ff539b3a 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -81,6 +81,7 @@ [app.util.router :as rt] [app.util.storage :refer [storage]] [app.util.timers :as tm] + [app.util.wasm :as wasm] [app.util.webapi :as wapi] [beicon.v2.core :as rx] [cljs.spec.alpha :as s] @@ -349,6 +350,7 @@ (rx/merge (rx/of (ntf/hide) (features/initialize) + (when (contains? cf/flags :renderer-v2) (wasm/init)) (dcm/retrieve-comment-threads file-id) (fetch-bundle project-id file-id)) diff --git a/frontend/src/app/util/wasm.cljs b/frontend/src/app/util/wasm.cljs new file mode 100644 index 000000000..71b39fe0f --- /dev/null +++ b/frontend/src/app/util/wasm.cljs @@ -0,0 +1,23 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.util.wasm + (:require + ["./renderer/renderer" :as renderer] + ["./renderer/renderer.js$default" :as renderer-init] + [beicon.v2.core :as rx] + [potok.v2.core :as ptk])) + +(defn foo [] (renderer/print "Lorem ipsum")) + +(defn init + [] + (ptk/reify ::init + ptk/WatchEvent + (watch [_ _ _] ;; TODO: mirar la docu de potok + (->> (rx/from (renderer-init)) + (rx/tap foo) + (rx/ignore))))) \ No newline at end of file