call: consume self-built Element Call fork + activate Lotus features
Switch to @lotusguild/element-call-embedded@0.20.1-lotus.1 (our self-built fork) and turn on the source-level features it adds: - #1 denoise CUTOVER: in-source ML denoise (lotusDenoiseSource=1) replaces the build-time getUserMedia shim — removed the shim injection from vite.config.js (denoise/ assets still shipped; the processor loads them). Survives reconnects (fixes A7). - #2 call-state: CallEmbed consumes io.lotus.call_state; useCallSpeakers / useRemoteAllMuted prefer it over scraping EC's DOM (DOM fallback kept; empty payloads ignored). - #4 focus: CallControl.focusCameraParticipant sends io.lotus.focus_participant (works during screenshare), replacing the DOM tile-click hack. - #5 theming: lotusTransparent=1 (native transparent background). - #6 decorations: LotusDecorationPusher sends each member's decoration URL via io.lotus.decorations -> rendered on in-call tiles. #3 soundboard / #7 quality ship dormant (EC-ready; no host UI sends them yet). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+28
-18
@@ -36,30 +36,40 @@ Implemented and gate-green; confirm each per `LOTUS_TESTING.md`, then delete the
|
||||
|
||||
---
|
||||
|
||||
## 🧩 Known Element Call iframe limitations (not fixable from our side)
|
||||
## 🧩 Element Call source-level items — now actionable via the fork
|
||||
|
||||
> 🔱 **[EC-FORK]** These are the motivating issues for the **Element Call fork
|
||||
> initiative** — see [`HANDOFF_ELEMENT_CALL_FORK.md`](./HANDOFF_ELEMENT_CALL_FORK.md).
|
||||
> Once we build EC from our own source, A5/A6/A7 below become normal code fixes.
|
||||
> (Correction: the iframe is actually **same-origin** / self-hosted — we just
|
||||
> don't own EC's compiled source today.)
|
||||
> 🔱 **[EC-FORK]** **UPDATE 2026-06-29: the fork is live.** We now own and
|
||||
> self-build Element Call (`LotusGuild/element-call` →
|
||||
> `@lotusguild/element-call-embedded`, Phase 1 done & cinny wired). A5/A6/A7
|
||||
> below are **no longer "won't fix"** — they are ordinary source changes. See
|
||||
> [`HANDOFF_ELEMENT_CALL_FORK.md`](./HANDOFF_ELEMENT_CALL_FORK.md) §10 + the Phase
|
||||
> 2 work list. (The iframe is **same-origin** / self-hosted; the old blocker was
|
||||
> that we didn't own EC's compiled source — which we now do.)
|
||||
|
||||
The in-call participant grid is rendered **inside EC's iframe** (a pre-built npm
|
||||
bundle we don't own), which we can style/place around but cannot change the logic
|
||||
of. Consequences from testing:
|
||||
The in-call participant grid is rendered **inside EC's app**. Previously a
|
||||
pre-built npm bundle we could only style/place around; now editable source.
|
||||
Items from testing, with their fork-level fix path:
|
||||
|
||||
- **A5 — "Focus camera":** EC already supports native tile-pinning (click a video
|
||||
tile). Our bottom-bar "Focus camera" is a programmatic wrapper that clicks that
|
||||
tile; it can't live inside EC's UI. During a screenshare EC spotlights the
|
||||
shared screen and a camera pin may not override it. _Decision: keep the
|
||||
shortcut, revisit with the larger call-UI/EC work._
|
||||
- **A5 — "Focus camera":** EC supports native tile-pinning. Our bottom-bar "Focus
|
||||
camera" is a programmatic wrapper that **`.click()`s the tile** today
|
||||
(`CallControl.ts` `focusCameraParticipant`), and during a screenshare EC
|
||||
spotlights the shared screen so a camera pin may not override it. **Fork fix:**
|
||||
add an `io.lotus.focus_participant` widget action that pins a participant in
|
||||
EC's layout (coexisting with / overriding the screenshare spotlight); cinny
|
||||
sends it via the widget API and the DOM-click hack is deleted. _Status: Open —
|
||||
Actionable (Phase 2)._
|
||||
- **A6 — avatar decorations in-call:** decorations render on **our** pre-join
|
||||
lobby roster (`CallMemberCard`) but cannot be drawn on EC's in-call video
|
||||
tiles. Working as designed given the iframe boundary.
|
||||
lobby roster (`CallMemberCard`) but not on EC's in-call video tiles. **Fork
|
||||
fix:** render the decoration APNG inside EC's participant-tile component, fed
|
||||
decoration slugs via widget member data. _Status: Open — Actionable (Phase 2)._
|
||||
- **A7 — mic dead after EC's "Reconnect":** the mid-call "Connection lost /
|
||||
Reconnect" screen is **EC's own** (our load watchdog only covers an initial
|
||||
hung load). After EC reconnects, the mic isn't re-published through our denoise
|
||||
`getUserMedia` shim until a clean End+rejoin. Tied to the denoise rework.
|
||||
`getUserMedia` shim until a clean End+rejoin. **Fork fix:** move denoise into
|
||||
EC's mic-capture/publish pipeline as a first-class audio stage — EC re-runs it
|
||||
on every (re)publish, so reconnects keep denoise alive natively, and the
|
||||
build-time `index.html` injection is removed. _Status: Open — Actionable
|
||||
(Phase 2); root cause is the `getUserMedia` monkeypatch, not EC itself._
|
||||
|
||||
---
|
||||
|
||||
@@ -67,7 +77,7 @@ of. Consequences from testing:
|
||||
|
||||
### Calls / Audio
|
||||
|
||||
- **N127 — ML denoise shim is never injected in `vite dev`.** The `lotusDenoise` plugin injects only on `closeBundle` (build), so ML noise suppression is silently inactive during local dev. Add a dev-mode injection (`configureServer` / `transformIndexHtml`). Dev-only impact.
|
||||
- **N127 — ML denoise shim is never injected in `vite dev`.** The `lotusDenoise` plugin injects only on `closeBundle` (build), so ML noise suppression is silently inactive during local dev. Add a dev-mode injection (`configureServer` / `transformIndexHtml`). Dev-only impact. _Note: this **dissolves entirely** once denoise moves in-source in the fork (A7 fix) — there is then no build-time injection to be missing in dev._
|
||||
|
||||
### Security & Privacy
|
||||
|
||||
|
||||
Reference in New Issue
Block a user