commit 730d00d12603dba428f098430277caae1e38c076
parent 04616d6600ad08202cfb3cf07abd64c7e66ce0f1
Author: triesap <tyson@radroots.org>
Date: Wed, 24 Dec 2025 20:34:08 +0000
wasm: add `radroots-events-codec` WASM crate and build target
- Add `radroots-events-codec-wasm` crate to workspace
- Expose listing_tags and listing_tags_full via wasm-bindgen exports
- Add wasm-pack Makefile target to build web bundle into pkg/dist
- Register new package in Cargo.lock with required dependencies
Diffstat:
6 files changed, 87 insertions(+), 1 deletion(-)
diff --git a/Cargo.lock b/Cargo.lock
@@ -1723,6 +1723,16 @@ dependencies = [
]
[[package]]
+name = "radroots-events-codec-wasm"
+version = "0.1.0"
+dependencies = [
+ "radroots-events",
+ "radroots-events-codec",
+ "serde_json",
+ "wasm-bindgen",
+]
+
+[[package]]
name = "radroots-events-indexed"
version = "0.1.0"
dependencies = [
diff --git a/Cargo.toml b/Cargo.toml
@@ -3,6 +3,7 @@ members = [
"core",
"events",
"events-codec",
+ "events-codec-wasm",
"events-indexed",
"identity",
"log",
diff --git a/Makefile b/Makefile
@@ -1,6 +1,6 @@
.PHONY: all bindings clean help \
bindings-events bindings-tangle-schema bindings-trade bindings-types \
- build build-tangle-sql-wasm
+ build build-events-codec-wasm build-tangle-sql-wasm
SHELL := /bin/bash
.SHELLFLAGS := -e -o pipefail -c
@@ -13,6 +13,7 @@ BINDINGS_TARGETS := \
bindings-types
BUILD_TARGETS := \
+ build-events-codec-wasm \
build-tangle-sql-wasm
all: bindings build
@@ -54,3 +55,7 @@ bindings-types:
build-tangle-sql-wasm:
wasm-pack build tangle-sql-wasm --release --target web \
--out-dir ../tangle-sql-wasm/pkg/dist --scope radroots
+
+build-events-codec-wasm:
+ wasm-pack build events-codec-wasm --release --target web \
+ --out-dir ../events-codec-wasm/pkg/dist --scope radroots
diff --git a/events-codec-wasm/Cargo.toml b/events-codec-wasm/Cargo.toml
@@ -0,0 +1,16 @@
+[package]
+name = "radroots-events-codec-wasm"
+version.workspace = true
+edition.workspace = true
+authors = ["Radroots Authors"]
+rust-version.workspace = true
+license.workspace = true
+
+[lib]
+crate-type = ["cdylib", "rlib"]
+
+[dependencies]
+radroots-events = { workspace = true, default-features = false, features = ["std", "serde"] }
+radroots-events-codec = { workspace = true, default-features = false, features = ["std", "serde_json"] }
+serde_json = { workspace = true }
+wasm-bindgen = { workspace = true }
diff --git a/events-codec-wasm/pkg/package.json b/events-codec-wasm/pkg/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "@radroots/events-codec-wasm",
+ "version": "0.1.0",
+ "private": true,
+ "type": "module",
+ "files": [
+ "dist"
+ ],
+ "main": "./dist/radroots_events_codec_wasm.js",
+ "types": "./dist/radroots_events_codec_wasm.d.ts",
+ "exports": {
+ ".": {
+ "types": "./dist/radroots_events_codec_wasm.d.ts",
+ "import": "./dist/radroots_events_codec_wasm.js",
+ "default": "./dist/radroots_events_codec_wasm.js"
+ }
+ },
+ "sideEffects": false
+}
diff --git a/events-codec-wasm/src/lib.rs b/events-codec-wasm/src/lib.rs
@@ -0,0 +1,35 @@
+#![cfg(target_arch = "wasm32")]
+#![forbid(unsafe_code)]
+
+use radroots_events::listing::RadrootsListing;
+use radroots_events_codec::listing::tags::{
+ listing_tags as listing_tags_impl,
+ listing_tags_full as listing_tags_full_impl,
+};
+use wasm_bindgen::prelude::*;
+
+fn err_js<E: ToString>(err: E) -> JsValue {
+ JsValue::from_str(&err.to_string())
+}
+
+fn parse_listing(listing_json: &str) -> Result<RadrootsListing, JsValue> {
+ serde_json::from_str(listing_json).map_err(err_js)
+}
+
+fn tags_to_json(tags: Vec<Vec<String>>) -> Result<String, JsValue> {
+ serde_json::to_string(&tags).map_err(err_js)
+}
+
+#[wasm_bindgen(js_name = listing_tags)]
+pub fn listing_tags(listing_json: &str) -> Result<String, JsValue> {
+ let listing = parse_listing(listing_json)?;
+ let tags = listing_tags_impl(&listing).map_err(err_js)?;
+ tags_to_json(tags)
+}
+
+#[wasm_bindgen(js_name = listing_tags_full)]
+pub fn listing_tags_full(listing_json: &str) -> Result<String, JsValue> {
+ let listing = parse_listing(listing_json)?;
+ let tags = listing_tags_full_impl(&listing).map_err(err_js)?;
+ tags_to_json(tags)
+}