Skip to content

Release v0.3.1

Choose a tag to compare

@github-actions github-actions released this 26 Oct 17:08
· 4 commits to main since this release
cc101c6

Added / 新增

  • Added LiveKitSubscriber.publication: exposes the wrapped RemoteTrackPublication so callers can read the real track kind.
    • 新增 LiveKitSubscriber.publication:暴露被封装的 RemoteTrackPublication,便于调用方读取真实轨道类型。
  • Added DeviceProvisioning.readNfcCredential(): reads a credential tag and returns the credentials without provisioning anything, so the "tap a tag to learn the Wi-Fi password" flow no longer has to misuse provisionViaNfc().
    • 新增 DeviceProvisioning.readNfcCredential():只读取凭据标签并返回凭据、不做任何配网,使"碰一碰拿到 Wi-Fi 密码"的流程不必再误用 provisionViaNfc()。
  • Added ProvisionDevice.dppUri: carries the Wi-Fi Easy Connect bootstrap URI (DPP:…) scanned from the device QR code, which is what DPP actually needs.
    • 新增 ProvisionDevice.dppUri:承载从设备二维码扫到的 Wi-Fi Easy Connect 引导 URI(DPP:…),这才是 DPP 真正需要的内容。

Changed / 优化

  • provisionViaNfc({ProvisionDevice? device}) now delivers the tag credentials to that device over BLE / SoftAP / SmartConfig, so NFC can actually provision instead of just reading. The extra parameter is optional, so existing calls keep compiling.
    • provisionViaNfc({ProvisionDevice? device}) 现在会把标签凭据经 BLE / SoftAP / SmartConfig 下发给该设备,NFC 由此能真正完成配网而不只是读取。该参数为可选,既有调用无需改动。

Fixed / 修复

  • Fixed provisionViaNfc() reporting success after merely reading a tag: nothing was ever sent to a device (and the credentials were dropped), so the status now fails with an explicit message unless a ProvisionDevice is supplied.

    • 修复 provisionViaNfc() 仅读到标签就上报 success 的问题:凭据从未下发给任何设备(且被丢弃),现在未传入 ProvisionDevice 时会以明确信息失败。
  • Fixed DPP being handed device.id (a BLE address or SoftAP SSID) as the QR content: provisionViaDpp() now requires a DPP: bootstrap URI and rejects anything else as protocolMismatch with a readable message, instead of failing opaquely inside the system configurator.

    • 修复把 device.id(BLE 地址或 SoftAP SSID)当作 DPP 二维码内容的问题:provisionViaDpp() 现在要求 DPP: 引导 URI,其余一律按 protocolMismatch 并给出可读信息拒绝,而不是在系统配置器里不明原因地失败。
  • Fixed protocomm's AES-CTR dropping the intra-block remainder, so every message after a non-16-byte payload was garbled; the counter now follows one continuous keystream.

    • 修复 protocomm 的 AES-CTR 丢弃块内余数,导致非 16 字节整数倍载荷之后的所有消息错位;计数器现遵循一条连续 keystream。
  • Fixed protocomm's setup1 failing open, so a device omitting SessionResp1 skipped Proof-of-Possession authentication; it now raises.

    • 修复 protocomm 的 setup1 失败开放,省略 SessionResp1 的设备会跳过所有权证明鉴权;现在改为抛错。
  • Fixed PbReader / PbWriter: bounds checks, malformed-field tolerance and a negative varint guard.

    • 修复 PbReader / PbWriter:补充边界检查、畸形字段容错与负数 varint 防护。
  • Fixed OTA: verify the server's resume start offset, reuse a single http.Client, and release the BLE link on failure (try/finally).

    • 修复 OTA:校验服务端续传起始偏移、复用单个 http.Client,并在失败时(try/finally)释放 BLE 连接。
  • Fixed the log collector: verify the MQTT connection (batches were silently dropped), disconnect stale clients, guard concurrent flushes and tolerate corrupt cache lines.

    • 修复日志采集器:校验 MQTT 连接(此前批次被静默丢弃)、释放旧 client、防并发 flush 并容忍损坏的缓存行。
  • Fixed provisioning: poll for a terminal Wi-Fi state instead of reading it once, and release the scan subscription when scanning throws.

    • 修复配网:轮询终态 Wi-Fi 状态而非只读一次,并在扫描抛错时释放扫描订阅。
  • Fixed BLE: BleTeleopChannel.dispose() now stops the transport (a failed connect left the auto-reconnect timer running), and the link clears stale characteristic handles on reconnect, resets its retry budget, guards concurrent connects and closes its controllers.

    • 修复 BLE:BleTeleopChannel.dispose() 现在停止传输层(连接失败后自动重连定时器仍在运行),链路在重连时清除陈旧特征句柄、重置重试预算、防并发连接并关闭控制器。
  • Fixed DualTeleopChannel crashing when disconnect() runs before connect(); it can be reconnected afterwards.

    • 修复 DualTeleopChannel 在 connect() 之前调用 disconnect() 会崩溃的问题;之后可重新连接。
  • Fixed MQTT teleop: guard concurrent connects, release the previous client and subscription, verify the connection state and tolerate non-JSON telemetry.

    • 修复 MQTT 遥操作:防并发连接、释放旧 client 与订阅、校验连接状态并容忍非 JSON 遥测。
  • Fixed resilience: dispose the previous session on reconnect (it was only left), serialise attaches, re-check disposed after awaits, rate-limit recovery actions, re-enable video after reconnect, only stop the robot on a background pause, require a session in confirmResume() and clear orphan resume tickets.

    • 修复韧性层:重连时释放前一个会话(此前仅 leave)、串行化 attach、await 后复检 disposed、恢复动作限流、重连后重新开启视频、仅在后台暂停时停车、confirmResume() 要求会话存在并清除孤儿恢复票据。
  • Fixed WHIP/WHEP: drain responses, close the HTTP client, resolve relative Location headers, buffer trickle ICE candidates until the resource exists, guard concurrent peer-connection creation and clean up on failure.

    • 修复 WHIP/WHEP:排空响应、关闭 HTTP 客户端、解析相对 Location 头、缓存 trickle ICE 候选直到资源就绪、防并发建连并在失败时清理。
  • Fixed simulcast: every case now breaks — falling through made all layers end up at full ~/ 4.

    • 修复 simulcast:每个 case 现在都 break——直通会让所有层最终变成 full ~/ 4。
  • Fixed emits after dispose() throwing "Cannot add event after closing": they are now ignored.

    • 修复 dispose() 之后的 emit 抛 "Cannot add event after closing" 的问题:现在改为忽略。
  • Fixed LAN discovery: stop a discovery cancelled before it started, and surface errors instead of losing them.

    • 修复 LAN 发现:停止启动前被取消的 discovery,并上报错误而非将其丢失。
  • Fixed the scanners: drop the previous scan's replayed results and handle stream errors.

    • 修复扫描器:丢弃上一次扫描的回放结果并处理流错误。
  • Fixed stream_relay.stop() catching only RtcException: it now catches every error so cleanup always finishes, and releases the Egress HTTP client.

    • 修复 stream_relay.stop() 只捕获 RtcException 的问题:现在捕获所有异常以保证清理完成,并释放 Egress HTTP 客户端。
  • Fixed LiveKit: dispose() is now idempotent on both the engine and the session, joining a disposed engine is rejected, and unsubscribe() reports the real track kind instead of always claiming video.

    • 修复 LiveKit:引擎与会话的 dispose() 现在幂等、已释放的引擎拒绝入会、unsubscribe() 上报真实轨道类型而非一律声称视频。
  • Fixed NetworkPath.isSameLinkAs(): a metered flip now counts as a different link, so a hotspot that starts charging triggers a policy re-evaluation.

    • 修复 NetworkPath.isSameLinkAs():计费状态翻转现在算作另一条链路,开始计费的热点会触发策略重算。
  • Fixed VideoGridController accumulating stale clarity overrides: overrides of removed streams are now pruned, so long-running rooms no longer leak entries.

    • 修复 VideoGridController 累积失效清晰度覆盖的问题:已移除流的覆盖会被清理,长时间运行的房间不再泄漏条目。
  • Fixed switchCamera() leaving a stale "camera active" status when the capture fails: the old device is already released, so the camera is now reported as off.

    • 修复采集失败时 switchCamera() 留下"摄像头已开启"失效状态的问题:旧采集设备已释放,现如实上报为已关闭。
  • Fixed switchToVariantStream(): it now registers the replacement before dropping the old subscriber (never hands out a disposed object) and releases the new server resource when the session is disposed mid-switch.

    • 修复 switchToVariantStream():先登记替代者再丢弃旧订阅器(绝不交出已销毁对象),并在切换期间会话被释放时清理新建的服务端资源。
  • Fixed RoleTransfer.handover() leaving two anchors publishing at once: when revoking the previous anchor fails, the first grant is rolled back.

    • 修复 RoleTransfer.handover() 可能留下两个牵头同时推流的问题:收回原牵头失败时回滚第一次授权。
  • Fixed LiveKit leaking a Room on every reconnect: the session now calls room.dispose() after disconnect(), so long-running sessions no longer accumulate rooms (a source of connection/handle leaks during 7×24 operation).

    • 修复 LiveKit 每次重连泄漏 Room 的问题:会话在 disconnect() 之后现在调用 room.dispose(),长时间运行的会话不再累积 Room(7×24 运行期间连接 / 句柄泄漏的来源之一)。
  • Fixed LiveKitPublisher leaks and false "active" status: dispose() now releases the ValueNotifier (UI listeners no longer leak), and startCamera / startMic / startScreenShare no longer report the track as active when the room is not connected or permission is denied (they now report it off).

    • 修复 LiveKitPublisher 的泄漏与"已开启"假状态:dispose() 现在释放 ValueNotifier(UI 监听者不再泄漏);房间未连或权限被拒时,startCamera / startMic / startScreenShare 不再谎报轨道已开启(现如实上报为关闭)。
  • Fixed Diagnostics leaking a socket on a failed TLS handshake and aborting on one bad log line: the probe now destroys the underlying socket in finally, and crash-log parsing guards the type and skips corrupt lines instead of throwing.

    • 修复 Diagnostics 在 TLS 握手失败时泄漏 socket、且一条坏日志就中止整个诊断的问题:探测现在在 finally 销毁底层 socket,崩溃日志解析增加类型防护并跳过损坏行而非抛异常。
  • Fixed AppLifecycleGate tearing the link down after the app returned to the foreground: lifecycle transitions are now serialised, so a rapid background→foreground toggle ends in the foreground.

    • 修复 AppLifecycleGate 在应用回到前台后错误拆除链路的问题:生命周期切换现已串行化,快速的"后台→前台"切换最终落在前台。
  • Fixed ControlLinkRouter mislabeling a multi-path selection as onlyOption: when several reachable paths tie on RTT it now reports lowestRtt instead of falsely claiming there was only one path.

    • 修复 ControlLinkRouter 把多路径选择误标为 onlyOption 的问题:多条可达路径 RTT 恰好相等时,现改为上报 lowestRtt,而非谎称只有一条路径。