| Filename | Latest commit message | Latest commit date |
|---|---|---|
Review of b01681570, the example's test. It had replaced the example's own run with the hold: Ada's play always went through take-for-gone and re-entry, never the path a present viewer's control takes. And it passed defects the old test failed: it let either page re-enter any number of times uncounted (only Ada's `rejoins >= 1` was read, Ben's never), a `not_present` refusal went nowhere, and "the room refused no page's event" held while the test had Ada's events refused. Moving app.js's statements back after `begin()` passed (Ada was held either way; a Ben slow past 4 s just re-entered), as did a page that stopped stating, or a room whose silence limit shrank. And it checked the play against the instant Ada first signed it for, not the one the room carried after re-signing moved it. Now: 1. As before, both pages enter; Ada plays and Ben pauses, each while present; both apply each control at its instant within a quarter second of the room and pause at one position. 2. Ben's page is held until the room's log carries his `leave`; Ada seeks back to 2 s meanwhile; Ben's play is signed as the hold ends, before his page can enter again. The test reads the room's log until Ben's play is carried after his second `join`, takes the instant the room carried (at least that join's `t` plus the lead, and no earlier than first asked), and both pages must play from the seek at it within the bound, then pause at one position again when Ada pauses 3 s later. 3. The room's log, read once and every record verified (`roomTest.watchLog`): exactly one `leave`, Ben's, after his hold began; Ada joined once, Ben twice, the second after the `leave`; every slot wholly within each stretch of each page's presence holds a statement of it (co-watch §7.3), but Ben's hold; and each page's first statement comes before the instant it began to follow the log, which it does only once it has its relay session. That last is ordering, not timing: with the statements started after `begin()` it cannot hold. 4. Each page's own counts: Ada never taken for gone and never entering again, Ben taken for gone once (`stats.gone`), entering again once with his play signed again; no other event of either refused, and no page stopped. A wait still ends at once when a page stops and says each page's counts. Verified on the build host, the room client and the archive built as wai-examples.yml builds them (load 62-73): watch-together through run-examples.sh passed 5 of 5, every check held. Falsified, each built and run the same way: statements started after `begin()` again fails the first-statement check; a page that stops stating once it has entered again fails the slot and `leave` checks; a room silence limit of 400 ms fails the `leave` count and the pages' counts. Co-Authored-By: Claude Opus 5.5 <[email protected]> |
||
| .. | ||
| android-app | ||
| apple-app | ||
| encoder-ingest | ||
| messaging | ||
| package-and-deliver | ||
| remote-desktop | ||
| verify-receipts | ||
| video-room | ||
| watch-together | ||
| README.md | ||
WAI examples
Small projects that each do one thing with WAI, and each run on your own machine with the open
reference software alone. Every one is a template of wai create:
wai create my-room --template video-room
cd my-room
wai dev
| Template | What it shows | Runs with |
|---|---|---|
video-room |
Your own page with a live room in it: camera, microphone, every object checked against its receipt | wai dev, a browser |
watch-together |
Everyone in a room watching one file in sync: play, pause and seek at one instant for all | wai dev, a browser |
messaging |
An end-to-end encrypted conversation, and a call placed, rung and answered | wai dev, a browser |
encoder-ingest |
An SRT encoder's stream published into a room, each group signed at the first hop and checked at the relay and the subscriber | cargo |
package-and-deliver |
A title packed by policy, its package verified, its standard floor played in a page | wai-pack, wai dev, a browser |
verify-receipts |
The receipts beside an object checked offline by the reference implementation (Rust) and by a second one (Python, standard library only) | wai hello, cargo, python3 |
apple-app |
The native sink in a SwiftUI app, and a recorded playback session replayed through it | Xcode, the wai-sink-swift package |
android-app |
The native sink's Kotlin API, the one an Android app's player session calls | a JDK 17, the wai-sink-android project |
remote-desktop |
One machine's screen shared into a room, with control handed over and every input signed | wai dev, wai-remote-host, a browser |
Every example is Apache-2.0, and carries the license's text as LICENSE, which a project
wai create makes from it receives with the rest.
Each example's test/ directory holds the check that it works; it is not part of the project
wai create writes. bash ../quickstart/test/run-examples.sh portable|browser|apple|android
runs them, as .github/workflows/wai-examples.yml does.