From 88687fe8c90de7c84fef7ad2eba4c465c0ff38c2 Mon Sep 17 00:00:00 2001 From: Florian <1technophile@users.noreply.github.com> Date: Sun, 17 May 2026 16:37:27 -0500 Subject: [PATCH] Add in-docs web parser page powered by browser WASM Adds a /parser page on the VitePress site that decodes BLE advertisements locally in the browser via a new BUILD_WASM_WEB Emscripten target (ENVIRONMENT=web,worker, EXPORT_ES6, SINGLE_FILE), built fresh by the docs publish workflow on each release. The Node.js WASM build shipped to npm is untouched. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/publish_docs.yml | 8 + .gitignore | 2 + CMakeLists.txt | 21 ++ docs/.vitepress/components/WebParser.vue | 311 ++++++++++++++++++++ docs/.vitepress/config.mts | 3 +- docs/.vitepress/theme/index.ts | 2 + docs/parser.md | 34 +++ nodejs/theengs-decoder/package.json | 1 + nodejs/theengs-decoder/scripts/build-web.js | 26 ++ 9 files changed, 407 insertions(+), 1 deletion(-) create mode 100644 docs/.vitepress/components/WebParser.vue create mode 100644 docs/parser.md create mode 100644 nodejs/theengs-decoder/scripts/build-web.js diff --git a/.github/workflows/publish_docs.yml b/.github/workflows/publish_docs.yml index 54171575..80bb6c23 100644 --- a/.github/workflows/publish_docs.yml +++ b/.github/workflows/publish_docs.yml @@ -22,6 +22,14 @@ jobs: python -m pip install --upgrade pip pip install requests pandas markdown pytablereader tabulate npm install + - name: Set up Emscripten + uses: mymindstorm/setup-emsdk@v14 + with: + version: 3.1.61 + actions-cache-folder: emsdk-cache + - name: Build browser WebAssembly decoder + run: npm run build:web + working-directory: nodejs/theengs-decoder - name: Build documentation run: | npm run docs:build diff --git a/.gitignore b/.gitignore index e5db5b23..e1bec7ce 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,8 @@ docs/.vitepress/dist/ docs/.vitepress/cache/ docs/.vitepress/public/commonConfig.js docs/.vitepress/public/img/ +docs/.vitepress/public/wasm/ docs/.vitepress/data/devices.json +nodejs/theengs-decoder/build-web/ docs/devices/_app_devices.md generated/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 2dca9968..1946ae4c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,6 +41,27 @@ elseif(BUILD_WASM) LINK_FLAGS "-lembind -sMODULARIZE=1 -sEXPORT_NAME=createTheengsDecoderModule -sENVIRONMENT=node -sALLOW_MEMORY_GROWTH=1 -sSINGLE_FILE=1 -sNODEJS_CATCH_EXIT=0 -sNODEJS_CATCH_REJECTION=0" ) +elseif(BUILD_WASM_WEB) + message(STATUS "Building WebAssembly module via Emscripten (browser target)") + + add_executable(theengs_decoder_web + nodejs/theengs-decoder/src/wasm_bindings.cc + src/decoder.cpp + ) + + target_include_directories(theengs_decoder_web + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src/arduino_json/src + ${CMAKE_CURRENT_SOURCE_DIR}/src + ) + + target_compile_features(theengs_decoder_web PRIVATE cxx_std_17) + + set_target_properties(theengs_decoder_web PROPERTIES + SUFFIX ".js" + LINK_FLAGS "-lembind -sMODULARIZE=1 -sEXPORT_ES6=1 -sEXPORT_NAME=createTheengsDecoderModule -sENVIRONMENT=web,worker -sALLOW_MEMORY_GROWTH=1 -sSINGLE_FILE=1" + ) + else() add_library(decoder diff --git a/docs/.vitepress/components/WebParser.vue b/docs/.vitepress/components/WebParser.vue new file mode 100644 index 00000000..5c779f76 --- /dev/null +++ b/docs/.vitepress/components/WebParser.vue @@ -0,0 +1,311 @@ + + +