feat(host,panel): stream a workspace's members to the windows that draw them

Merged
CH
8d ago
+639-139

A workspace's members are streamed to the windows that show them. Stacked on #3929.

  • Act-port procedure: workspace.people outputs an eventIterator, following #4175's pattern. It counts the open streams per workspace, has the host follow afresh as each stream opens, and lets go with the last.
  • Host follow: the host follows through liveRows (WORKSPACES_PEOPLE_FOLLOW, held polls with Realtime off) and tells each change as WORKSPACE_PEOPLE_CHANGED. That keeps members' names and emails out of app state, which the voice window also reads.
  • Web tab: a web tab serves the same procedure with no code of its own.
  • Panel: use-workspace-members.ts and the settings page keep the members read as the first read, then take the stream. Removed: the re-read on every memberCount change, and the re-read before Transfer ownership.

streamed is a private copy of #4175's adapter. It should be shared once both have merged.

Tests

  • Host compose-tasks follow tests.
  • Act-port stream tests: counting, filtering by workspace, and the voice window refused.
  • Settings page: a pushed admin can be handed the workspace with no second read.

Made with Luke