This release adds microphone processing controls and local chat controls, expands platform packages, and synchronizes the website and guides. It also fixes native H.264 input/format handling, signaling recovery, fresh STUN discovery, and UDP ownership during overlapping connections. This is **v1.8.0**. Browser/Server v23, Native control v9 and capture v7 remain unchanged, with the existing 1440p ceiling. Additional resolutions, capability negotiation and Magicsock are separate follow-up work. ## Validation - Full local Web check: 79 files / 1,317 tests, TypeScript and production build. - Full Go checks, platform builds and Windows native capture regressions/probe. - Native H.264 Host lifecycle, Browser-to-App fanout and App-exit recovery, and Native H.264 through embedded SFU: all passed with owned process/port/profile cleanup. - Website build, documentation and repository hygiene passed. Existing UI acceptance covers narrow screens, both languages/themes, architecture downloads and all 23 film checks; final packaging and Go race checks run on the merged revision in CI. - Physical macOS/Linux capture, representative public networks and unmatched field reports retain their documented evidence limits. No claim that every blur/disconnection report is resolved. ## Release notes ### 中文 这是一次功能与兼容性更新:麦克风和聊天增加了实用的小选项,App 与 Server 支持更多设备,同时修复了原生分享和连接恢复中的若干问题。现有 1.x 协议保持不变。 #### 新增与改进 - 浏览器麦克风新增「降噪与回声消除」开关,默认开启回声消除、降噪和自动增益;分享音乐或使用虚拟音频输入时,可按需关闭。 - 可调整弹幕字号和透明度,并将当前保留的聊天记录导出为 TXT。当前会话最多保留 1,000 条文字消息,刷新页面后清空;需要保存时请先导出。 - 新增 Intel Mac、Linux ARM64 App,以及 Linux ARM64 Server 和容器镜像。官网下载区可直接选择对应架构,并显示最新版本和发布时间。 - 更新官网演示、README 截图和中英文教程,明确浏览器分享也可选择窗口或屏幕;开始分享前显示房间号占位,保持底栏控件位置稳定。 - 官网新增直达问题排查的入口,补充浏览器 WebRTC 限制、校园网和 Windows 显卡相关的排查步骤。 - App 模式选择页显示免费开源说明、作者与贡献者署名,以及官方网站和源码链接。 #### 修复 - 修正部分 H.264 原生分享的格式兼容性校验,以及 Windows 编码器输入长度和输出缓冲区对齐问题。 - 清理已失效的重连任务和 Native 接收信令,避免旧连接继续影响当前会话。 - 修复 App 重连时可能复用过期公网地址的问题;重新探测使用当前地址,并处理探测丢包和过期响应,保留其他正常连接。 - 修复 App 新旧媒体连接重叠时共用端口造成的冲突,避免准备或撤销新连接打断仍在使用的画面;关闭连接时及时取消未完成的端口映射请求。 - 无站点密码时,连接恢复不再误引导用户输入站点密码。 - 房间失效或会话终止时,开播前后的原因提示统一显示在电视状态图标中,避免额外提示条。 - 修正 Linux 原生采集的时间戳与关键帧时间基准。感谢 Pedro Antonio 在 [#449](https://github.com/TNTcraftHIM/Piik/pull/449) 的贡献。 #### 使用说明 下载对应平台的完整压缩包,退出旧 App 后解压使用。Windows 继续提供 x64;macOS 提供 Apple 芯片与 Intel 版本,原生采集需要 macOS 13 或更新版本。Linux 提供 x64 与 ARM64,原生采集还需安装[系统组件](https://github.com/TNTcraftHIM/Piik/blob/main/native/capture/linux/README.md)。macOS 和 Linux 的实机覆盖仍有限,欢迎反馈。 ### English This update adds useful microphone and chat controls, brings Piik to more devices, and fixes several native-sharing and connection-recovery issues. The existing 1.x protocols remain unchanged. #### New and improved - Browser microphones now have a “Noise & echo reduction” toggle. Echo cancellation, noise suppression and automatic gain control are on by default; turn them off when appropriate for music or virtual audio inputs. - Adjust chat-overlay text size and opacity, and export retained messages as TXT. The current session keeps up to 1,000 text messages and clears on page refresh; export first if you want to keep them. - Added Intel Mac and Linux ARM64 App packages, plus Linux ARM64 Server and container images. The website provides architecture selectors and shows the latest release and publication date. - Updated the website demonstration, README screenshots and bilingual guides, clarifying that browser capture can also select windows or screens. A room-code placeholder keeps the bottom bar stable before sharing starts. - Added direct website links to troubleshooting, with steps for browser WebRTC restrictions, campus networks and Windows graphics issues. - The App mode-selection page now shows its free and open-source status, author and contributor credit, and links to the official website and source. #### Fixes - Corrected H.264 format compatibility checks and Windows encoder input-length and output-buffer alignment handling. - Retired stale reconnect tasks and Native receive signals so they cannot continue affecting the current session. - Fixed App reconnection reusing an expired public address. Fresh discovery handles lost probes and stale responses while preserving other working connections. - Fixed UDP socket conflicts between overlapping App media connections so preparing or canceling a replacement preserves the active picture. Closing a connection now cancels unfinished gateway mapping requests. - Connection recovery on passwordless sites no longer incorrectly asks for a site passphrase. - Expired-room and session-termination reasons now use the same TV status indicator before and during sharing, without an extra notice strip. - Corrected Linux native capture timestamps and keyframe time bases. Thanks to Pedro Antonio for [#449](https://github.com/TNTcraftHIM/Piik/pull/449). #### Updating Download the complete archive for your platform, quit the old App, and extract the new package. Windows remains x64-only. macOS packages support Apple silicon and Intel; native capture requires macOS 13 or newer. Linux supports x64 and ARM64 and requires additional [system components](https://github.com/TNTcraftHIM/Piik/blob/main/native/capture/linux/README.md) for native capture. Physical-device coverage on macOS and Linux remains limited; feedback is welcome. ## Attribution Co-authored-by: Pedro Antonio <wrenchwastaken@gmail.com>
153 lines
8.8 KiB
Markdown
153 lines
8.8 KiB
Markdown
# Rooms And Access
|
|
|
|
This file owns the current room, admission, invitation, interaction, and persistence
|
|
contract. [ADR-0002](../adr/0002-memory-resident-protected-rooms.md) explains
|
|
the storage decision; implementation detail belongs in code and tests.
|
|
|
|
## Room Authority
|
|
|
|
- A room has one Host and at most 20 authenticated Viewers.
|
|
- Room codes are random free four-digit values from `1000..9999`. A code locates
|
|
a room within its site authority; it is not globally unique, a secret or a
|
|
permanent identity. App public-link rooms belong to that App's local authority.
|
|
- Every room has a 256-bit Host token. The server stores only its digest; the
|
|
owning Browser keeps the raw token locally.
|
|
- Each Host tab retains its current room in session storage. The origin keeps
|
|
one persistent resume hint and a separate preferred code; a new tab may resume
|
|
that room only when no other tab claims it. Secure Browser origins use Web
|
|
Locks, including protection against copied tab storage. Without Web Locks,
|
|
fresh tabs create independent rooms and same-tab reload can retain authority,
|
|
but duplicated-tab exclusion is not guaranteed. Closing the tab releases its
|
|
claim; losing Host authority clears that tab without erasing another tab's
|
|
resume hint.
|
|
- Room identity and credentials do not expire with inactivity. The exact Host
|
|
token resumes the room until explicit replacement or deletion. Grant rotation
|
|
or revocation ends an invitation without changing the room code. No presence
|
|
event renews or shortens room authority.
|
|
- The Host may replace its room code. Replacement atomically creates a different
|
|
room and invalidates the old ownership, invitations, password, sessions,
|
|
routes, and media resources. It ends an active share and stops its capture
|
|
tracks; it does not migrate or automatically restart capture.
|
|
- A locally remembered preferred code is only a request. The server remains the
|
|
authority and allocates another code when that code is unavailable. The store
|
|
remains bounded by 9,000 codes; it rejects new rooms when full.
|
|
|
|
## Admission Paths
|
|
|
|
Three independent authorities exist:
|
|
|
|
1. **Site access.** `SITE_ACCESS_PASSWORD` is optional in every environment,
|
|
including production. Unset or empty makes site access immediate without a
|
|
cookie; room ownership and Viewer admission still apply. When configured,
|
|
successful password entry creates a stateless, HttpOnly,
|
|
`SameSite=Strict` cookie with a 24-hour rolling idle lifetime. An already
|
|
authorized page renews it through the site-access check while it remains
|
|
active. It authorizes room creation, Host role, and code-only Viewer
|
|
attempts; it is not a room credential, and Viewer-grant admission cannot
|
|
create or renew it. Cookie transport attributes follow the configured
|
|
destination: public HTTPS retains the Secure host-prefixed cookie, while a
|
|
separately configured HTTP LAN origin can use its HTTP cookie. Login,
|
|
renewal, room creation and WebSocket admission use that same selection.
|
|
Cookie signatures use a random process key independent of the password;
|
|
restarting the Server/App requires site-password entry again. This does not
|
|
revoke persisted room ownership or Viewer invitations. The application
|
|
rejects framing through its own HTTP headers, including without a proxy.
|
|
A signaling authentication failure alone does not establish site-access
|
|
loss: its existing error also covers an incomplete or timed-out room
|
|
handshake. The Host checks the site-access authority before entering the
|
|
password gate; an allowed or unavailable check retains ordinary connection
|
|
recovery. Explicit room credential rejection remains terminal.
|
|
2. **Host ownership.** The exact Host token authorizes that room's Host and
|
|
access-management operations. It cannot authorize another room.
|
|
3. **Viewer invitation.** Every room creates a 128-bit, 22-character base64url
|
|
Viewer grant. It authorizes only the Viewer role for that exact room
|
|
incarnation and bypasses site access and code-entry policy.
|
|
|
|
The invitation grant is carried in the URL fragment, removed from the address
|
|
bar on first read, and retained only in room-scoped `sessionStorage`. Refreshing
|
|
the same tab preserves it. It is not intentionally persisted across independent
|
|
tabs or Browser sessions; tab duplication and opener initialization remain
|
|
Browser behavior. The grant has no independent TTL and ends with the room or
|
|
when the Host rotates or revokes it.
|
|
|
|
The Host can omit the grant from the displayed/copied link. This page-local
|
|
choice defaults to including it and does not change admission policy, revoke
|
|
existing invitations or clear a recipient's valid authorization. The ordinary
|
|
room address retains the server-provided site and room path; it follows site
|
|
access and code-entry rules. An invite-only room has no ordinary-address entry.
|
|
|
|
Code-only admission is independent of invitations:
|
|
|
|
- `open` admits a site-authorized Viewer by room code;
|
|
- `private` without a password is invitation-only;
|
|
- `private` with a password additionally admits a site-authorized matching
|
|
code-and-password attempt.
|
|
|
|
An unknown or deleted code returns `ROOM_NOT_FOUND`. A current room
|
|
that refuses a code-only attempt returns the generic `ROOM_ACCESS_DENIED` result
|
|
without exposing its exact policy. Invalid grants and Host ownership failures
|
|
remain separate.
|
|
|
|
Rotating or revoking the Viewer grant is a strong authorization change. The new
|
|
generation is committed before old Viewers, signaling grace, routes, and sender
|
|
edges are closed. An affected SFU Viewer's exact embedded subscription is closed
|
|
before its egress reservation is released. Room-authenticated signaling cannot
|
|
recreate a revoked subscription; no separate media token survives revocation.
|
|
Changing code-entry policy or password affects later
|
|
code-only attempts and does not silently revoke invitations.
|
|
|
|
## Room Interactions
|
|
|
|
Text and reactions reuse the authenticated room signaling connection. The server
|
|
derives sender identity from that session and accepts targeted reactions only
|
|
for participants still connected to the same room. Interaction subscriptions
|
|
inherit existing membership, replacement and revocation checks; they grant no
|
|
additional authority and do not modify media routes.
|
|
|
|
Delivery is transient and bounded. The server keeps no message history; each
|
|
page keeps only a bounded set of received messages and effects, without writing
|
|
them to storage or diagnostics. Re-admission to the same room may retain that
|
|
page's conversation, but refresh, leaving or authority loss clears it. There is
|
|
no history replay or offline outbox. HTTPS/WSS protects transport; chat is not
|
|
end-to-end encrypted, and the site operator can access live message contents.
|
|
|
|
[Presentation and lifecycle](./presentation-lifecycle.md#product-surface) owns
|
|
the distinction between a room session and its current media publication.
|
|
[Interaction research](../research/room-interactions.md) records delivery bounds,
|
|
compatibility and design rationale.
|
|
|
|
## Persistence Modes
|
|
|
|
- **Stable mode (Hosted default):** one exact-schema SQLite owner persists room
|
|
authority across application restart. `ROOM_DATABASE_PATH` selects an absolute
|
|
file path; absent or empty uses `rooms.sqlite` in the working directory.
|
|
- **Lightweight mode:** explicit `ROOM_DATABASE_PATH=:memory:` keeps room authority
|
|
in process memory and all rooms disappear on restart.
|
|
- **App Local mode:** the packaged App composes the same memory RoomStore
|
|
and ends every room when its local authority exits. Saved Site/password and
|
|
last-confirmed mode preferences follow [App configuration](./configuration.md#piik-app-configuration);
|
|
rooms and media state remain process-only. A blank password leaves that site open.
|
|
|
|
Persistence evidence, limits and the earlier cross-restart evaluation live in
|
|
[cross-restart recovery research](../research/cross-restart-room-recovery.md).
|
|
|
|
The App opens its own localhost Host page with the configured password, when
|
|
present, in a fragment. The page removes the fragment and uses the existing
|
|
SiteAccess endpoint; this does not create a fourth admission authority. LAN and
|
|
one-link Internet Viewers use the same room-scoped invitation grant; its
|
|
fragment never enters the public tunnel request, and the Host's Local RoomStore
|
|
remains the only authority.
|
|
Selecting a Site moves room authority wholly to that Site rather than
|
|
synchronizing two stores.
|
|
|
|
Stable mode does not persist participants, signaling sessions, sharing state,
|
|
routes, codec decisions, quality evidence, or SFU state. After restart, clients
|
|
reauthenticate and rebuild media. No restored room is considered online until
|
|
fresh sessions connect. [Status](../status.md) owns the selected deployment mode and
|
|
ADR-0002 owns storage validation.
|
|
|
|
The Host Browser may persist its creation preferences, including policy and an
|
|
optional room password. Raw Viewer grants never enter `localStorage`, cookies,
|
|
queries, server logs, or SQLite. Credentials, passwords, and invitation URLs are
|
|
never committed to the repository.
|