8b5af5d496
Existing plan docs were written before the moq-lite swap, the
create-space + kind-10112 work, and the harness / submodule findings.
This refresh aligns them with what's actually live on the branch and
captures the work still ahead.
- 2026-04-26-audio-rooms-completion.md — flipped to a STATUS-FIRST
layout: implementation table for every protocol/transport/UI
surface, "pending" table for the remaining items (reconnect,
level meters, Desktop / iOS, Nests parity), pointers section
refreshed.
- 2026-04-26-moq-lite-gap.md — marked DONE with the commit range
that landed it (fb47a4c → 71cf99d → 015b0d7); "When picking up"
section now points at the shipped surface first, raw protocol
references second.
- 2026-04-22-nip-audio-rooms-draft.md — major surgery to match
today's nostrnests reality:
* status banner up top calling out the revision
* dependencies dropped IETF MoQ-transport, added moq-lite
Lite-03 + ALPN "moq-lite-03"
* HTTP control plane: GET <service>/<room-d-tag> → POST /auth
with {namespace, publish}, returning {token}; documented the
JWT claim shape (root, get, put), 600 s lifetime, regex
on `namespace`, JWKS endpoint, error matrix
* Audio transport: replaced IETF SETUP / TrackNamespace tuples
/ OBJECT_DATAGRAM with moq-lite Lite-03 (ControlType varint,
per-bidi message types, group uni streams, audio/data track,
no in-band SETUP, FIN-as-unsubscribe semantics)
* New event-kind sections: kind 4312 (admin command / kick),
kind 10112 (audio-room server list)
* Reconciliation section explaining what changed from the
original draft and why
- NEW: 2026-04-26-nostrnests-integration-audit.md — punchlist of
every nostrnests/NestsUI feature we don't yet ship, sourced from
a code-walk of the React app + moq-auth + API.md (which is
LiveKit-era and dead). Tier 1 (low-effort, visible): chat,
reactions, role parsing + promotion, hand-raise queue, kick
(kind 4312), edit/close room, scheduled rooms, listener counter.
Tier 2: participant grid, augmented presence tags
(publishing/onstage), per-avatar context menu + zap, share via
naddr. Tier 3: room theming. Tier 4: token-refresh +
Connection.Reload sanity checks.
Verified `:nestsClient:jvmTest` + `:amethyst:compilePlayDebugKotlin`
both still green after the doc changes (no code touched).
73 lines
3.9 KiB
Markdown
73 lines
3.9 KiB
Markdown
# Audio rooms — completion plan
|
|
|
|
> **STATUS (2026-04-26 PM):** Listener and speaker paths are both live
|
|
> end-to-end on moq-lite Lite-03, the create-space flow ships, and the
|
|
> kind-10112 host-server list lives in Settings. What remains is
|
|
> hardening (reconnect / leave cleanup / per-speaker level metering),
|
|
> Nests-feature parity (chat, hand-raise approval, recordings — see
|
|
> the integration audit), and Desktop / iOS targets.
|
|
> `:nestsClient:jvmTest` (~140 unit tests) is green; integration tests
|
|
> behind `-DnestsInterop=true` work against a real Docker'd nostrnests
|
|
> stack.
|
|
|
|
## Implementation state
|
|
|
|
### Transport + protocol
|
|
|
|
| Surface | Status | Notes |
|
|
|---|---|---|
|
|
| `:quic` v1 + HTTP/3 + WebTransport | ✅ done | RFC 9000 + 9220; auditor passes |
|
|
| moq-lite Lite-03 codec (announce / subscribe / group) | ✅ done | `moq/lite/`, full unit suite |
|
|
| moq-lite session (listener + publisher) | ✅ done | `MoqLiteSession.client(...)` |
|
|
| `WebTransportSession.incomingBidiStreams` + `openUniStream` | ✅ done | needed for publisher |
|
|
| IETF `draft-ietf-moq-transport-17` codec | ✅ done | reference impl, no production caller |
|
|
|
|
### `:nestsClient`
|
|
|
|
| Surface | Status | Notes |
|
|
|---|---|---|
|
|
| HTTP `/auth` JWT mint (NIP-98 → ES256 JWT) | ✅ done | `OkHttpNestsClient.mintToken` |
|
|
| `connectNestsListener` → `MoqLiteNestsListener` | ✅ done | path = `/<namespace>?jwt=<token>` |
|
|
| `connectNestsSpeaker` → `MoqLiteNestsSpeaker` | ✅ done | publishes `audio/data` track |
|
|
| `AudioRecordCapture` + `MediaCodecOpusEncoder` | ✅ done | Android actuals |
|
|
| `MediaCodecOpusDecoder` + `AudioTrackPlayer` | ✅ done | Android actuals |
|
|
| `AudioRoomMoqLiteBroadcaster` + `AudioRoomPlayer` | ✅ done | encode / decode pumps |
|
|
| Interop harness (Docker compose nostrnests stack) | ✅ done | `NostrNestsHarness`, 4 test classes |
|
|
|
|
### Amethyst (Android UI)
|
|
|
|
| Surface | Status | Notes |
|
|
|---|---|---|
|
|
| `AudioRoomsScreen` feed of kind-30312 events | ✅ done | from followed users |
|
|
| `AudioRoomJoinCard` → launches `AudioRoomActivity` | ✅ done | passes service / endpoint / hostPubkey |
|
|
| `AudioRoomActivity` (full screen + PIP) | ✅ done | lifecycle anchor |
|
|
| `AudioRoomViewModel` (listener + speaker state) | ✅ done | `commons/.../viewmodels/` |
|
|
| Foreground service (`AudioRoomForegroundService`) | ✅ done | listening + microphone variants |
|
|
| Mute / unmute / hand-raise UI | ✅ done | drives `BroadcastHandle.setMuted` + presence |
|
|
| Kind-10312 presence heartbeat | ✅ done | 30 s + debounced state-change publish |
|
|
| **"Start space" FAB → `CreateAudioRoomSheet`** | ✅ done | publishes kind-30312 with caller as host |
|
|
| **Settings → Audio-room servers (kind 10112)** | ✅ done | replaceable list, defaults to `nostrnests.com` |
|
|
|
|
### Pending
|
|
|
|
| Item | Phase | Effort |
|
|
|---|---|---|
|
|
| Reconnect / retry on listener Failed | M8 | 1 d |
|
|
| Per-speaker level meters (RMS from decoder output) | M8 | 1 d |
|
|
| Connection-failure UX copy (typed reasons → strings) | M8 | 0.5 d |
|
|
| Desktop audio capture + playback | future | gated on Compose Desktop AudioInput API |
|
|
| iOS audio capture + playback | future | new `iosMain` actuals |
|
|
| Nests-feature parity (chat, mod, recordings, …) | see integration audit | varies |
|
|
|
|
## Pointers
|
|
|
|
- moq-lite wire spec + IETF gap: `nestsClient/plans/2026-04-26-moq-lite-gap.md`
|
|
- Nostrnests integration audit (gaps + roadmap): see most recent doc in `nestsClient/plans/`
|
|
- QUIC stack status: `quic/plans/2026-04-26-quic-stack-status.md`
|
|
- Audio-rooms NIP draft (needs refresh after the moq-lite findings):
|
|
`docs/plans/2026-04-22-nip-audio-rooms-draft.md`
|
|
- Listener entry: `nestsClient/src/commonMain/kotlin/com/vitorpamplona/nestsclient/NestsConnect.kt`
|
|
- Speaker entry: same file (`connectNestsSpeaker`)
|
|
- Create-space sheet: `amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/audiorooms/create/`
|
|
- Servers settings: `amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/nestsServers/`
|