Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
223ea96
feat(recordstore): fenced, sealed record storage for Signal state
purpshell Oct 8, 2026
39320ae
refactor(pair): pair crypto from the identity key and ADV secret alone
purpshell Oct 8, 2026
e25c07a
feat(signal-ops): Signal operations for externally held device keys
purpshell Oct 8, 2026
1ea1879
feat(signal-wasm): browser and edge bindings for Signal operations
purpshell Oct 9, 2026
196a859
feat(signal-ops): atomic, idempotent receive for the Signal service
purpshell Oct 10, 2026
f174381
feat(signal-ops): build outbound DM stanzas inside the Signal service
purpshell Oct 10, 2026
fa84418
feat(signal-ops): group sends with tracked sender-key distribution
purpshell Oct 10, 2026
4ea92bc
feat(signal-ops): re-encrypt sent messages for retry receipts
purpshell Oct 10, 2026
8177428
feat(signal-wasm): build direct and group sends in the page
purpshell Oct 10, 2026
e3cc9ac
fix: address review findings on the Signal service crates
purpshell Oct 10, 2026
7614b60
fix(signal-ops): redistribute the sender key after a group retry
purpshell Oct 10, 2026
33a440e
Forget a user's sessions and identities on identity change
purpshell Oct 10, 2026
b69bc85
Migrate PN sessions to LID and forget hosted devices
purpshell Oct 10, 2026
673bd4c
Persist fenced prekey upload batches and exact acknowledgments
purpshell Oct 15, 2026
47fa2ee
Simplify equivalent sender-key target predicates for Clippy
purpshell Oct 15, 2026
7389145
feat(signal-wasm): expose durable uploads and complete receive retries
purpshell Oct 15, 2026
4b3b13c
fix(signal): protect pending batches from legacy prekey marks
purpshell Oct 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions .github/workflows/wasm.yml
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,46 @@ jobs:
# r2d2's pool and tokio's `spawn_blocking` both panic on a page, and both
# compile there, so nothing but this check keeps them from creeping back into
# the store once the shim exists.
# The fenced, sealed record store backs a browser-held Signal store, so
# it must keep building for the page as well as the server.
- name: Build wacore-recordstore for wasm32 (release)
env:
RUSTFLAGS: '--cfg getrandom_backend="wasm_js"'
run: >
cargo build -p wacore-recordstore --lib --release
--target wasm32-unknown-unknown
--features wacore/js
- name: Build wacore-signal-ops for wasm32 (release)
env:
RUSTFLAGS: '--cfg getrandom_backend="wasm_js"'
run: >
cargo build -p wacore-signal-ops --lib --release
--target wasm32-unknown-unknown
--features wacore/js
# The JS bindings are only proven by running them: build, generate the
# Node glue with the wasm-bindgen CLI matching Cargo.lock, and drive two
# devices end to end from JavaScript.
- name: Install wasm-bindgen CLI
uses: taiki-e/install-action@v2
with:
tool: wasm-bindgen@0.2.128
- name: Use Node 24 for JavaScript binding tests
uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7
with:
node-version: "24"
package-manager-cache: false
- name: Test wacore-signal-wasm bindings from Node
# Build the native fixture without the WASM-only randomness override.
env:
RUSTFLAGS: '--cfg getrandom_backend="wasm_js"'
SIGNAL_WASM_FIXTURE: ${{ github.workspace }}/target/debug/examples/fixture
run: |
RUSTFLAGS='' cargo build --locked -p wacore-signal-wasm --example fixture
cargo build -p wacore-signal-wasm --lib --release --target wasm32-unknown-unknown
wasm-bindgen --target nodejs --out-dir target/signal-wasm-node \
target/wasm32-unknown-unknown/release/wacore_signal_wasm.wasm
node --test wacore/signal-wasm/tests/node.test.mjs
npm exec --yes --package=typescript@6.0.3 -- tsc --noEmit --target es2022 --module esnext --moduleResolution bundler --lib esnext,dom --strict wacore/signal-wasm/tests/types.ts
- name: Guard sqlite-storage's platform shim
run: cargo xt ci workflow guard-sqlite-shim
# The sans-IO VoIP core (wacore::voip: the CallEngine, the portable run_call driver,
Expand Down
68 changes: 68 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ members = [
"wacore/derive",
"wacore/libsignal",
"wacore/noise",
"wacore/recordstore",
"wacore/signal-ops",
"wacore/signal-wasm",
"waproto",
]
default-members = [
Expand All @@ -55,6 +58,8 @@ default-members = [
"wacore/derive",
"wacore/libsignal",
"wacore/noise",
"wacore/recordstore",
"wacore/signal-ops",
"waproto",
]

Expand Down
26 changes: 26 additions & 0 deletions wacore/recordstore/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
[package]
name = "wacore-recordstore"
version = "0.1.0"
edition = "2024"
rust-version.workspace = true
authors = ["Polymorfa"]
license = "MIT"
repository = "https://github.com/polymorfa/whatsapp-rust"
description = "Fenced, sealed record storage for wacore Signal state"
publish = false

[features]
# Reusable checks every RecordStore implementation must pass. Adapter crates
# enable it in their dev-dependencies and call `conformance::run_all`.
conformance = []

[dependencies]
aes-gcm = { workspace = true }
async-trait = { workspace = true }
bytes = { workspace = true }
rand = { workspace = true }
thiserror = { workspace = true }
wacore = { workspace = true }

[dev-dependencies]
futures = { workspace = true, features = ["executor"] }
Loading
Loading