From edb6d2b5b4164d50791342494f577047ffcc33c0 Mon Sep 17 00:00:00 2001 From: felis Date: Wed, 15 Jul 2026 23:54:53 -0700 Subject: [PATCH] proper productionize project --- Dockerfile | 2 +- README.md | 135 +- apps/overlay/index.html | 22 +- .../public/control/manifest.webmanifest | 35 + apps/overlay/public/pwa/apple-touch-icon.png | Bin 0 -> 24391 bytes apps/overlay/public/pwa/icon-192.png | Bin 0 -> 26519 bytes apps/overlay/public/pwa/icon-512.png | Bin 0 -> 101836 bytes apps/overlay/public/pwa/icon-maskable-512.png | Bin 0 -> 78860 bytes apps/overlay/public/pwa/icon-maskable.svg | 24 + apps/overlay/public/pwa/icon.svg | 33 + apps/overlay/pwa/control-sw.js | 102 + apps/overlay/src/api.ts | 225 ++ apps/overlay/src/auth.tsx | 358 ++++ apps/overlay/src/control.css | 1047 +++++++++- apps/overlay/src/control.tsx | 784 +++++++ apps/overlay/src/main.tsx | 201 +- apps/overlay/src/overlay.tsx | 383 ++++ apps/overlay/src/pwa.tsx | 214 ++ apps/overlay/src/style.css | 2 +- apps/overlay/src/types.ts | 100 + apps/overlay/src/vite-env.d.ts | 3 + apps/overlay/vite.config.ts | 26 +- apps/server-rust/Cargo.lock | 215 +- apps/server-rust/Cargo.toml | 14 +- .../migrations/003_multitenancy.sql | 339 +++ .../migrations/004_auth_hardening.sql | 12 + apps/server-rust/src/app.rs | 280 +++ apps/server-rust/src/auth.rs | 1818 +++++++++++++++++ apps/server-rust/src/components.rs | 488 +++++ apps/server-rust/src/config.rs | 360 ++++ apps/server-rust/src/credentials.rs | 193 ++ apps/server-rust/src/db.rs | 175 ++ apps/server-rust/src/domain.rs | 341 ++++ apps/server-rust/src/http_api.rs | 1258 ++++++++++++ apps/server-rust/src/lib.rs | 20 + apps/server-rust/src/live/bilibili.rs | 756 +++++++ apps/server-rust/src/live/mod.rs | 56 + apps/server-rust/src/live/supervisor.rs | 128 ++ apps/server-rust/src/main.rs | 1411 +------------ apps/server-rust/src/overlay.rs | 64 +- apps/server-rust/src/rate_limit.rs | 154 ++ apps/server-rust/src/realtime.rs | 559 +++++ apps/server-rust/src/repository.rs | 452 ++++ compose.yaml | 14 + config.toml.example | 80 +- vendor/blivedm/src/client/websocket.rs | 23 + 46 files changed, 11346 insertions(+), 1560 deletions(-) create mode 100644 apps/overlay/public/control/manifest.webmanifest create mode 100644 apps/overlay/public/pwa/apple-touch-icon.png create mode 100644 apps/overlay/public/pwa/icon-192.png create mode 100644 apps/overlay/public/pwa/icon-512.png create mode 100644 apps/overlay/public/pwa/icon-maskable-512.png create mode 100644 apps/overlay/public/pwa/icon-maskable.svg create mode 100644 apps/overlay/public/pwa/icon.svg create mode 100644 apps/overlay/pwa/control-sw.js create mode 100644 apps/overlay/src/api.ts create mode 100644 apps/overlay/src/auth.tsx create mode 100644 apps/overlay/src/control.tsx create mode 100644 apps/overlay/src/overlay.tsx create mode 100644 apps/overlay/src/pwa.tsx create mode 100644 apps/overlay/src/types.ts create mode 100644 apps/overlay/src/vite-env.d.ts create mode 100644 apps/server-rust/migrations/003_multitenancy.sql create mode 100644 apps/server-rust/migrations/004_auth_hardening.sql create mode 100644 apps/server-rust/src/app.rs create mode 100644 apps/server-rust/src/auth.rs create mode 100644 apps/server-rust/src/components.rs create mode 100644 apps/server-rust/src/config.rs create mode 100644 apps/server-rust/src/credentials.rs create mode 100644 apps/server-rust/src/db.rs create mode 100644 apps/server-rust/src/domain.rs create mode 100644 apps/server-rust/src/http_api.rs create mode 100644 apps/server-rust/src/lib.rs create mode 100644 apps/server-rust/src/live/bilibili.rs create mode 100644 apps/server-rust/src/live/mod.rs create mode 100644 apps/server-rust/src/live/supervisor.rs create mode 100644 apps/server-rust/src/rate_limit.rs create mode 100644 apps/server-rust/src/realtime.rs create mode 100644 apps/server-rust/src/repository.rs diff --git a/Dockerfile b/Dockerfile index b1f86b3..de7f2ea 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,7 +18,7 @@ RUN --mount=type=cache,target=/usr/local/cargo/registry \ cp /app/target-cache/release/lxc-stream-server /app/lxc-stream-server FROM debian:bookworm-slim -RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates libasound2 libssl3 && rm -rf /var/lib/apt/lists/* +RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates curl libasound2 libssl3 && rm -rf /var/lib/apt/lists/* WORKDIR /app # The upstream client logs full upstream HTTP responses at INFO, which can include # account metadata and short-lived connection tokens. Keep application lifecycle diff --git a/README.md b/README.md index 6f9cae5..cfda4da 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,138 @@ -# 洛星瓷直播弹幕姬 +# 洛星瓷直播组件服务 -运行前复制带注释的 `config.toml.example` 为 `config.toml`,填入 CookieCloud、设置数据库和访问密钥,然后执行: +这是一个多用户 Rust/Axum 直播组件后端。目前内建 `danmaku_overlay` 弹幕姬,后端已经按“直播源 → 强类型事件 → 组件实例”的方式拆分,后续可以继续增加礼物展示、点歌姬等组件。镜像构建阶段会编译 React 前端,运行时由 Rust 同域托管控制台和 OBS 页面。 + +直播连接使用 [`blivedm_rs`](https://github.com/isomoes/blivedm_rs) 的 `blivedm` crate。项目在 `vendor/blivedm` 固定了保留原始 JSON 的小补丁,避免 UID、礼物价格和上游事件 ID 被简化消息结构丢弃。 + +## 后端结构 + +`src/main.rs` 只负责配置、组装、监听和优雅退出,可复用核心由 `src/lib.rs` 导出: + +- `live/` 中的 provider adapter 把 Bilibili 消息归一化为 `domain.rs` 的强类型事件;`SourceSupervisor` 保证每个用户的固定直播源只有一个 listener。 +- `components.rs` 注册组件定义、设置 schema/迁移、事件订阅、纯投影和独立副作用 handler;新礼物展示或点歌姬不需要修改弹幕姬队列核心。 +- `realtime.rs` 按 component UUID 建立独立广播通道,路由时同时校验 owner 与 source;副作用 handler 不依赖 OBS WebSocket 是否在线。 +- `auth.rs`、`repository.rs` 和 PostgreSQL RLS 共同实现身份、凭据、直播源、组件与 token 的用户隔离;`http_api.rs` 从服务端会话推导 owner,不接受客户端自报 owner ID。 + +## 部署 + +先复制配置并生成独立密钥: ```sh cp config.toml.example config.toml +openssl rand -base64 32 # 填入 security.data_encryption_key +openssl rand -hex 32 # 可作为一次性 admin.password +openssl rand -hex 32 # 填入兼容字段 admin.session_secret docker compose up --build -d ``` -应用配置遵循 `blivedm_rs` 的 TOML/`--config` 形式;Compose 会以只读方式将 `config.toml` 挂载到容器并传入 `--config /app/config.toml`。配置段及字段说明直接写在 [config.toml.example](config.toml.example) 的注释中。 +Compose 将 `config.toml` 只读挂载到 `/app/config.toml`,应用通过 `--config` 读取它。容器使用 host 网络,默认只在 `127.0.0.1:9719` 监听,供同机 Nginx 访问;不要把 `9719` 直接暴露到公网。 -应用容器使用 host 网络并监听 `9719`。它通过 `[database].url` 连接 PostgreSQL,仅用于持久化 OBS 弹幕姬设置。应用会自动创建所需表;`[connection].room_id`、CookieCloud Key/UUID 与密码均为必填配置。 +容器默认以 `1000:1000` 非 root 身份、只读根文件系统运行,并丢弃全部 Linux capabilities。请将 `config.toml` 设为 `chmod 600`,并确保容器用户可读;如宿主机用户不是 `1000:1000`,启动前设置 `APP_UID` 与 `APP_GID`。 -服务端已迁移为 Rust/Axum,并使用 [`blivedm_rs`](https://github.com/isomoes/blivedm_rs) 发布的 `blivedm` crate 建立 Bilibili 认证弹幕连接;不再使用 Node 服务端或 `@laplace.live/ws`。为确保 UID、礼物价格和上游事件 ID 不会被库的简化消息结构丢弃,项目在 `vendor/blivedm` 固定了一个仅保留原始 JSON 的小补丁。应用从 CookieCloud 获取 Bilibili Cookie(必须包含 `SESSDATA`),用于获取认证 UID、直播间网关与 WebSocket 鉴权包。 +`[database].url` 指向 PostgreSQL。应用启动时自动执行版本化迁移,数据库保存账户、一次性邀请码、TOTP 注册状态、可撤销会话、恢复码摘要、用户直播源、组件设置、OBS 令牌摘要和审计记录。租户表同时使用 owner 复合外键与 PostgreSQL RLS 约束,HTTP API 也始终从当前会话取得 owner,客户端不能自行指定其他用户。 -## OBS 弹幕姬 +`security.data_encryption_key` 必须是独立生成并妥善备份的 32 字节 Base64 密钥。TOTP Secret 与每个用户的 CookieCloud Key/密码会在写入 PostgreSQL 前用它加密;丢失或擅自更换该密钥会导致已有账户和 CookieCloud 凭据无法解密。 -镜像会在构建阶段编译 `apps/overlay`,最终由 Rust/Axum **同域托管**: +## 首次初始化与登录 -- `/obs?token=你的_OBS_访问令牌`:透明背景的 OBS 浏览器源。它没有固定画布,按浏览器源的实际宽高自动在窄侧栏、常规卡片和低高度模式之间切换。 -- `/control`:管理员控制台。使用 `admin.password` 登录后可改标题、字号、事件类别、最大条数、自动收缩、卷轴展开时长、动效、每卡粒子数量与速度、低性能模式和礼物高亮阈值;保存会实时广播给已打开的 OBS 源。 +首次部署且数据库中尚无账户时,打开: -控制台的“复制 OBS 地址”会生成含只读令牌的完整地址。该令牌仅能订阅 `/ws`,不能访问管理或写入接口。常用 OBS 浏览器源尺寸可从 `360×600`、`440×760` 或 `600×1080` 开始;可按实际版面自由拖拽缩放,不会出现 1920×1080 的固定画布留白。 +```text +https://danmaku.luoxingci.com/control/setup +``` -每张消息卡片都会从六套花纹组合中稳定选取一套,轮换使用对称花枝、横向自然藤纹和雏菊花簇,并改变上下、左右、镜像、配色与局部背景;连续的新卡会主动避开相同款式,礼物连击更新则保持原样式不跳动。透明消息墙本身不铺设全局装饰背景。粒子数量与速度可在控制台调整;窄尺寸会自动减少粒子,低性能模式会关闭动态粒子。花边 SVG 已本地打包,来源和公版/CC0 许可记录在 `apps/overlay/public/assets/NOTICE.md`,OBS 运行时不会访问素材站点。 +填写系统管理员用户名和 `config.toml` 中的 `admin.password`,扫描页面生成的 TOTP 二维码,再输入验证器中的 6 位动态码完成初始化。页面只显示一次恢复码,请立即离线保存。 -后端会在启动时、之后每十分钟调用 Bilibili 的无需 Cookie 礼物面板接口缓存礼物图片、GIF、币种和价格。目录刷新失败时保留上一次成功缓存;缺失目录条目会安全降级为直播事件自带的名称与价格。 +`admin.password` 只是“允许创建第一个系统管理员”的一次性 bootstrap proof: -直播弹幕中的普通混排表情和整条大表情会作为安全的文字/图片分段通过 WebSocket 推送。消息自带的图片地址优先;服务还会使用 CookieCloud 的 `SESSDATA` 刷新直播间表情目录,在消息只提供表情唯一标识时补齐图片。图片加载失败时前端会退回原始表情文字。 +- 它不会保存为账户密码,也不能用于日常登录。 +- 第一个账户创建后,bootstrap 接口永久拒绝再次初始化。 +- 所有账户都是 passwordless 账户,以“用户名 + TOTP”登录;丢失验证器时可使用一次性恢复码。 +- 会话使用随机令牌,数据库只保存摘要,可在服务端到期或撤销。 -刷新间隔和请求超时可通过 `[gifts]` 调整。`[overlay]` 与 `[overlay.events]` 是某个直播间第一次运行时的展示默认值;在 `/control` 保存后,数据库中的设置优先,因此更新 TOML 不会覆盖管理员已经调好的 OBS 样式。若希望重新采用 TOML 默认值,可删除该房间在 `overlay_settings` 表中的记录后重启。 +系统管理员可在 `/control/invitations` 创建和撤销邀请码。每个邀请码只能使用一次,并在创建时固定绑定一个尚未占用的 Bilibili `room_id`;注册者不能修改该房间,账户创建后房间绑定也不可更改。受邀用户打开注册链接,选择用户名、扫描自己的 TOTP 二维码并确认动态码即可完成注册。普通用户不能创建邀请码。 + +每个用户在 `/control/` 配置自己的 CookieCloud 同步 UUID/Key 和密码,地址必须位于部署管理员配置的 `security.cookiecloud_allowed_hosts` 白名单。服务禁止 HTTP 重定向并安全编码 Key 路径,避免用户凭据导致服务端任意请求。服务会先验证凭据,再将敏感字段按用户独立加密保存;Cookie、Key 和明文密码不会返回浏览器,也不会与其他账户共享。CookieCloud 中需要存在 Bilibili `SESSDATA`。 + +### 旧单用户配置迁移 + +以下 TOML 段现在只用于第一次系统管理员初始化时的一次性兼容迁移: + +- `[connection].room_id`:绑定首个系统管理员的房间。 +- `[cookiecloud]`:导入首个系统管理员的用户级加密凭据。 +- `[obs].access_token`:导入首个默认弹幕组件的旧 OBS 令牌。 +- `[overlay]` 与 `[overlay.events]`:迁移旧 `overlay_settings`,没有旧记录时作为首个组件的回退值。 + +迁移完成后,运行时以 PostgreSQL 中的用户、直播源、组件和凭据为准。以后修改这些旧段不会改变现有账户,也不会成为其他受邀用户的默认值;新用户使用邀请中绑定的房间,并在控制台填写自己的 CookieCloud。 + +## 必须使用 HTTPS + +公开部署账号、TOTP 和会话功能时必须在 Nginx(或可信反向代理)终止 HTTPS,并保持 `security.secure_cookies = true`。下面是核心反代设置;证书路径按实际 Certbot 配置填写: + +```nginx +map $http_upgrade $connection_upgrade { + default upgrade; + '' close; +} + +server { + listen 80; + server_name danmaku.luoxingci.com; + return 301 https://$host$request_uri; +} + +server { + listen 443 ssl; + http2 on; + server_name danmaku.luoxingci.com; + + ssl_certificate /etc/letsencrypt/live/danmaku.luoxingci.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/danmaku.luoxingci.com/privkey.pem; + + location / { + proxy_pass http://127.0.0.1:9719; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto https; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + } +} +``` + +只有在本机、无敏感数据的纯 HTTP 开发环境中才能临时设置 `secure_cookies = false`。不要用该选项把登录页面直接发布到公网。 + +## 控制台 PWA + +通过 HTTPS 打开 `/control/` 后,受支持的浏览器会在控制台顶部显示“安装到设备”。`/control` 会由服务端永久重定向到这个规范地址。安装后的应用使用独立窗口,并继续采用“用户名 + TOTP”登录;登录、注册与首次初始化在 PWA 内分别使用 `/control/login`、`/control/register` 和 `/control/setup`。原有 `/login`、`/register`、`/setup` 地址仍兼容普通浏览器书签。 + +PWA 只控制 `/control/`,不会控制、缓存或刷新 `/obs/*` 浏览器源。离线缓存仅包含 React 应用外壳、本地图标和构建后带哈希的静态资源;账户、TOTP、邀请码、CookieCloud、组件设置、OBS 令牌、直播事件和所有 `/api/*` 响应始终在线直连且由服务端返回 `Cache-Control: no-store`。离线时写操作会在浏览器端直接拒绝,不会排队或在恢复网络后重放。 + +部署新版本后,已打开的控制台会显示“更新可用”。更新不会自动接管或刷新页面,必须由用户点击确认;确认前请先保存设置以及只显示一次的邀请码、恢复码或刚轮换的 OBS 令牌。 + +## 组件与 OBS 地址 + +登录 `/control/` 后可以配置当前账户的直播源、管理组件、测试事件、调整弹幕样式,以及为每个组件单独生成或轮换只读 OBS 令牌。新的浏览器源地址格式是: + +```text +https://danmaku.luoxingci.com/obs/#token= +``` + +`publicId` 是组件 UUID。`#token=...` 位于 URL fragment,不会随最初的 HTTP 请求发送到 Nginx;OBS 页面随后通过 WebSocket 的第一帧向 `/api/v1/components//stream` 完成认证。令牌只带 `events:subscribe` 权限,不能调用管理或写入接口;轮换后旧令牌立即失效。 + +旧格式 `/obs?token=...` 与 `/ws?token=...` 已移除,避免 bearer token 进入 Nginx 访问日志。升级后请在控制台为组件轮换令牌,并把旧 OBS 源替换为上述新地址;旧令牌一旦轮换便立即失效。 + +OBS 页面保持透明根背景,不使用固定 1920×1080 画布,并根据浏览器源的实际宽高自动适配。常用尺寸可从 `360×600`、`440×760` 或 `600×1080` 开始,也可以在 OBS 中自由拖拽缩放。 + +## 弹幕姬展示 + +每张消息卡片会从六套花纹组合中稳定选择一套,轮换使用对称花枝、横向自然藤纹和雏菊花簇,并改变上下、左右、镜像、配色与局部背景。连续的新卡避免使用相同款式,礼物连击更新保持原样式;透明消息墙本身不铺设全局装饰背景。粒子数量与速度、字号、事件类别、最大条数、自动收缩、卷轴展开时长、动效强度、低性能模式和礼物高亮阈值均可按组件在控制台调整,并实时推送给对应 OBS 源。 + +花边 SVG 已本地打包,来源及公版/CC0 许可记录在 `apps/overlay/public/assets/NOTICE.md`,OBS 运行时不会访问素材站点。 + +后端会为每个活动直播源缓存 Bilibili 礼物图片、GIF、币种和价格。目录刷新失败时保留上一次成功缓存;缺失条目会降级为直播事件自带的名称与价格。刷新间隔和请求超时可通过 `[gifts]` 调整。 + +普通混排表情和整条大表情会作为安全的文字/图片分段推送。消息自带图片地址优先;服务还会使用该用户 CookieCloud 中的 `SESSDATA` 刷新对应直播间的表情目录,在消息只提供唯一标识时补齐图片。加载失败时前端退回原始表情文字,刷新参数可通过 `[emoticons]` 调整。 diff --git a/apps/overlay/index.html b/apps/overlay/index.html index 71a27a5..45d4ac8 100644 --- a/apps/overlay/index.html +++ b/apps/overlay/index.html @@ -1 +1,21 @@ -洛星瓷弹幕猪
+ + + + + + + + + + + + + + + 洛星瓷直播云台 + + +
+ + + diff --git a/apps/overlay/public/control/manifest.webmanifest b/apps/overlay/public/control/manifest.webmanifest new file mode 100644 index 0000000..d0ef263 --- /dev/null +++ b/apps/overlay/public/control/manifest.webmanifest @@ -0,0 +1,35 @@ +{ + "id": "/control", + "name": "洛星瓷直播云台", + "short_name": "直播云台", + "description": "洛星瓷直播组件与 OBS 浏览器源控制台", + "lang": "zh-CN", + "dir": "auto", + "start_url": "/control/?source=pwa", + "scope": "/control/", + "display": "standalone", + "orientation": "any", + "background_color": "#03121a", + "theme_color": "#0a302f", + "categories": ["utilities", "productivity"], + "icons": [ + { + "src": "/pwa/icon-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/pwa/icon-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/pwa/icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/apps/overlay/public/pwa/apple-touch-icon.png b/apps/overlay/public/pwa/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a7495a45348da753fedf0716392410a0f1d7a6d7 GIT binary patch literal 24391 zcmeAS@N?(olHy`uVBq!ia0y~yVAuk}9Bd2>47O+4j2IXg*pj^6T^Rm@;DWu&Co?c8 zFnGE+hE&XXv$t}Cu4mo#?>iecBDu3f`Jg5qJejZ@1bL6 zZf0ys1qs$oAIvN`k`Em#yYY}A(&EO(8wc6AlQXX{ZCTKGQODNy^4(W|*M8r-`~K#z z&}IKmtg+fUzxe*{{4|k=Jr>`?!q$cUJe&Xb)AX79MQT>xNw<6a^E;pYG8O%VBcItm zuW^WR-PC7jD`49a;qjO|@&D8RKI>hp)O)S1=k67lnQi1Ls3g5MB<)*R@~xn`mnM0a zo>XU2Wci;=}m)=D2ig<;42FLa!E~)r?!Dru@)$85-10E&s zRw6xQH*dPnTCr`5Owy~H8(-8j6)qN>l78r1aaoJWE6IjR zJ%#g3KQ&_om+&SoQ{p|5$zC(BPh@?W*%ev^Pvd=zg+SE6ao z-y4sP32!VGemwnhS681!Z`c}VML)yZjqi3o()yIO=YGZROINw%uZGOo9nYC{`Wi#j zf&14B|HRAx`8@yMC(TtRm*>hZSYMm7bm^D*4xic?Qj7E1GIbZ6ce#_1_EpC3T*ut! zLZ+YiW9RRSSZ`7#`}rF4&P~PVUY`+}`ZcIy<&NosPN$SS9+}MAFUI=J-s<1V`L}Fq zpPqW>!ys$(`J%kohjfP=)7q}js@FFpT&$n==-A4eJ7eyxw04Se*{OVv_gPN6MoR2Y zo-2DMtC#ZKSc-*8iGZ|JQT%j}-svmzU>;{r*wU_VNAAJF_G$ zrN32tDrUA$KW)vsTKv*e$6~WLHB|=Um&0wHzuHdpH@Thq`0T<5GmaUX9+)S5MQ#2q z31+uHqVcZ(A07^mx1G6JP4)YY2EKWfFI^L#+;{je(PVYo`ImP-70XUO&-5(wNN?q< zQn5ENHw8asx*n|8GMMhUXWm5Dmq~o#szxHszMVDmS*|#JXzTp?zAENs)VaQ(vbWOu z_3I5Di7!i7R}kuBWc}!lwYe>hL>FR9R{X6iFqSFmmNIOS2d zyil)K;OfcPdrz0Gdz1O}`05`9l81{uer{fU|Le{7_Nl3j#~Dfr9xt{}Y5B(~(A^)L zaPllu?qS`FBKmu6)0M@f)52_xUTU3QowI{2a4{3dRik3w8LL;#VcMycbBle`{;E6T z2j+4Maje=Gbo5vFmyTEZ;pa6z)~~Dip8kLCs#zwMrL#_~eXajjQKdevA!~(CuTm^f%VOzHpMnr~ZhF z@4ljf`#09UJyyN=`~A7z%jS7M$+%zf@b`f~t-pS3j=PZTlG_vhQAzvq`N)XmGEtrx zF=i`{_^BVbav}2CeU@iarfx1heMGk@>t4KKV3d!q`)RQ_?yPd-`rR8hbNBq*Seg22 zW&_{4`X{Nqe||d{__ulf&9d#}L3 znX3=P96V(iVkT7VoS?aa;ms~9N81(I_fsG5{@VK_e_h=(ggF%zskJR`DEc+S3EVG@l0gpRF4|JGCh+oYwCjkt~^)rRz^Fx`7)2!=3Ct|f5RH~ zu)MK!h)r7XXZPB=c~2s}=GGlN^67m}&Gm9qEoCW2S)C*GVu!h(P6#&0-dw(I^`Dfh zsS%7zqrz5wIO`SjL&$8G)dBN!cS1LWt^1hGFo}EBs|ltI>sCAI`LS*=7L<03ZT%RO z==(3|#^!}Ne=~ynwl?tP?fG$7;@{cGP>Z?NzR7lHH*LD;$9N`kVp_?(Tk304p0gQ< zf1b;lHj#hU_vzjNQ#(JKG*?|)61;Gqv4``4_mO|!o&Ps4$icGmnC<5?K?2+NH9n}> zxMc!V|y|QL;u9?kha-%>R)YkjWm{x@;0K<(@l=hu6T zVjp+wv|ruqzVc|6blx|qzT=*g*XOToTkOdDwc=Cp!gV`8I{%#Oqc45Qbc^RqRjIg{VUTm9TwzlmAWtgq*%Vvxc7iL<|R+gQI8 zR<(KB{);C`RQT-dtiFn=^FM0^E~wEhs%N?Sbmwo^qIDOV%{P_!%4RJ(FS_>F&!D#b z)*qKNn9Vq&;uU<&UpXf({Fho?am-)y61N|7Zl1gO;PUA<7E>vSzz@sKSJ&N~^r|6p z*SycFXKW{i3a@vW#B{KPDS(M3Jg$cGM@8_V<*(6|XZo@we|R4-X7m2erRNtIEkCnJW`W^;F^5kx&sRv)eVsi0pZ59M*VY+# zm;Zb7Y27p(m!(UB^tsL(md*StIMe>&o{gX47ruX3{)bQXFaNt*o`_l6*YmZ%uWf(4 z{n*@3JJa3#Gpe2yd_Kuled}y$MBKjpzq^i{5T9QZ=>Me3o15cj#5J*h_0xB?9gGpZ zP}f@2dhr*lros8z)!ISNt?u&GznlL@{?9)9Z_4*yt@^`Np6YF=`Z{)*)`#$ElRKWP zoXC%M*j^oLwU=-8b2BZc`qq74)ytOGyqkHkclOEE8>7ot8A(5?6`pnaK(SErI{Uwi z_SxPQ-uu`%bAeUymj1}JO4Yinx|1?fo#!oBzWJ1>+5x%6d7t+#Qtt@eSLvMeOkUt$ z*V7~UT-I}96?vHs{n1>ltNH9N-%(A+={@H|m*#0LUb*LZ!PdwtY&xFG7SfaB{2%Rm z`(*p_n-c!&do*{gtlhutQFu?f)U9+kRsX*|{@?Dg>UcTwE|AxLf9!hIs}1je968N! zXIE+S(x=DYmKWQcFyAUXx6vl5$DIE`*CLnLZ#xZwPwabnJ5X`il`D^R;hhv>C2H_GdtYyWxq|D}IX^bs8ei;CB^ zbx*$k4@}A}@^)lbXYRRX^ONmnn@Q`J%Bj;GygKh^3zyvbv6t`E_laIgQ=BS=R=!bk zlRcgxo1E0#XIdyC#CyD@S@2;-&$VU$Y|~$1pS}O%bN$+|ck5!gtiEr$T=S6kwEO0#Qi3tn2bb{wn8Fy#y5ODDbosx3?l0PX z;c4L=`(N4h{ri91|9jJ|!0E2tk>e5kx~gyE+P|Grx_ec%DNbDfgTXC@9>;9kzsF{~ z_+8bLp1Ee;##HY{flIG$PF3ntQv0iTcyaPE_TxS6k2B*U6T(Vv*{F-&uhvUCD#YVB z(Y*Wg{LSY7uKfRY|MKh7pUU=M*kdDpEoYk1dZwsh-gaS;#%T78&of@n=S^Q$BhTwz z^Y8t?`)l%ZpS`m$e$5u1ACuT{(D{PV2mktK&u91?%2Z+8|7CM%o96rlO`@Jlmq*-) zS-N|lS9K+$zh{X|^R<@0jECnkK1?{V#6HDHLa5*Qk;X9>!zlL|H};h*WC^O`@Ly=t zn)Q?AuAbxi-urJayt?`N+BdaNm(18CWWT{JuK*Z2XV>|JN@)FU_o+DF3_rKli=0r?>F@ z`TGB%`%mrqm-#`bxA_Nkt`bmuq4z!F&aH%pcXstkA9wj{$IkA~Q^qf8cS~KS_w{D~ z$oq_*&TE`GoRu1qB_^2bKHOSkrG2{O`t+CU)(Yr+&4|C5_V}188@u})n>*<{$}Lzk zesQq%%(!Qy_TP_tfnT0!@=~TV%h=A$oL!n!GxOVPrJ#4luJOKMl@9Y2KijRewz7G~ z|DXLoXZ^e7b#ub&f2GULm_6rUK*VRW*OjYoL}*UapPT&jk=d!q5^HD5$Q6}*S3Le* zUWm`_>{X4Ld)mrN4yGP(c|74Ud%s292M&h)x6=x%Cokomy=9u%i+g)|_7!$6{@rh} z@4rUs+swL|e^xup6^V#G&vwAVVcYH8n)}WiffI5yW6nDs7Mdh#*}Zz zH)`r!+qO|{^2y7q5?%%GJAP_u?lip|Mb#sV4S&nODJc1_xcKnnpPTZedM4)fvz*|o z;XNbD=k{jrXT|FGH6GQK6PI$&)`_z?{%NOanBJVnFAnOpmzS^Mm~z%maAR-dD*c-| zRc;&yzyDhnfBe?5sH*or)AKj&+t}v#LH+-k=RZDW-}gA&$Ith(bN}c56>mhAbzHYh z?Q6?Wy}SP;^e*BarVO?6*wPEX$^cu0WX&8F%O!pQ}JI~;HJn90e?8C%(;eP7ETv2V}WS691r*6D8CviIP{zwR=3 zcJ^Pa3{;uAak1;4Vt*<0Vf`1W`1`5z_MB?M|- zbx0{&mo9lrom(2|QR41`)$i{;d(gaFC-zp_+h3~F%)&rse7`5l#_qnZ zXQfYW_SCl~ybsEFtSnxBKK}ney-)eZ>G$d%-kkmCgZ#g8L#BV<`u~OQ`*ZdBWEP%Z z&g^NQByvNpp4H5oA{1i%{x;i+$V&ah>1%#zN6(mf&_tAZ!J5xejI+@ z-%sps_I^(Mx7oJ;bc%lJp$mr?cQ0Tn5%oTv|4!Y2LvanC)yd*>>o@k9vcJFo^u;&k zYx!}BUw^5dvn_6Y=sEvxd7iNEp`JGrS<8Ytf9;vPVD4}0g83q)@ArP?oBuQSzJK|` z)Am1h2Y*}?=4*c0G;~o}O2p|q%cm_&PyYVq$mHg|%>ORN|J_~lasK~DcQUiT#acfyTA;U(IOP%k^a)&L&R(+K}p6!;ov-AAU=lL57>Lz=yw>f^e{N087cgtO; zH`-ply5U(!d<^3=p-+A%&wZ81TQ`4q9z%(+uo?5_%@>a5Z|zvbA)EQgLWL{2=i29f zNyf#(Q{}!2K0gz{aq!q$?KLrXocxd3{J3Q;bFVTWzGAX)Q<(OGtrr&GeXUgEnqpEY zA((mgWJ-%9-||O=zn&UqBtH*p5z#oW9Krcwg{sX;gTyl{?x)unCD_cHGwG$m8~&Z2 z*Y7)aX=(1cy#>u@XHU=2FTGj)KJQs}`7Hm;y*ab*X*E^K1uoV+d@JjWnE3S@*qHLUqf}TJT8ryMN*5Gmuy!z@ho}&HNA!%?VCQDr@rd7xpIpKgj3QY$&ys zx6mZXX3OU8V-cG68I>jH)^2+Av!&VaZ?p3;-(Byx%1eIREpApmxBrjL-m{@m`d@EU zzP4TTvE}k6`ze!;6#B>srFH=%9Rg7jH3KLr5qG>%>cc}}sFS6LQTPi`y+U4%8UX$mu`U2QW zp2c%MD8A*tnrpJxqn~#B_A-OVhgLD>>ZjdY{d$dF;lruv zg2y&|{#tJF=Y!m5tCcF3+E4nkql9B^%~OcyxXcnHS>WuQ-ME z*Z2Rw_ls|Nre61EeR9vX?#YX0X!Kp&D17vhL@vYHxmNn|VdV=?C*?O@JZN~FoqhSM zDcaM|7r$GY9f8R&B#fvY`;k94uu9`V5=iW{Gt&7~uYUIlF7;c4>^ypmRRywY; zaGPRaCcQ*R8u|Z{ucb^hkdH-Qy8 zZt2xI^-m-_lHcwBCU*S0yjhAtsS}6T^{^K@-z}`(6<5@!yVVFd-RfJSa;h=1QZC4| zMFr=eosAAC$#-#Jp8ZW-X*5! z>-xnN{}m5E+z_zSD0|+UH-*2u*B3r~tiPf1v(d4PU)AkbTTQ-AlzMn0WbMNhOvQ$^ zcAJ+iI=yMLW~}DcO+PIcxSd%c?zl$ef=-%AtLQ^fcf-jSXM8MZxu}+EvH$9#yP3&7 zihYlA9!@PPNiXf>*0*o(Q@itXdVF$4!JO5nuZVpLiPxE$^7jwhy`=uTdzp_tE-Yp* zn0cddzAOV5d&<+w69*1|e{(Kda#R4ojv3pM_bXnf8-k{_cX11PjTS?`kEz&`rONvfA z+44Wt4tY@cZ|3Wa*lGzGj|f!P4R!_ z(%bdp^9JK9k+0`BE1uH`bT#YS+LL%iJ}O~8kHN7A>~g1PXK$&V8)UTp?xRb`=eslV z$5l^0sJvU}auo0AvEB`y`?%7AbHJ&O?aq_aBu_bFi%jzVr4V|YMEO{qyi#zw_%bu0=WOuKnhBKXz04%^Ny zzlB0=-*mn8*Q~t|9qr3__jb(U?fY_W-YhSiTJkF^v)bJ%SRhROU!WFEiS`Y*E_tYa(LD4c&MD{xVlWa7&cVdi}*qk{;h&y+v%7%-za>fU}mY zi6i4<|=D9RZ6xlUJESCG{H#dgnu z+G}q z=&f&TUa1ZIOZh549E|0&-_ibF``WtLH5Fggm>)?gn0H95JToWxT9bxh@?nR`v-H*` zt9hi^UVZl_qViu!=zQJRZhslwcmK{<8#wRywYAx6Vs{>R@}s3azTR54AT4|!=XcBL zK^qD`+H4Gxk)0pW+p;NPn%B~z4HM4kyZ$>)#(wdwV81p$25-3okqX?6lbHOqrc9AoYT%V*!+Gjo&m@`oa|{9}^>W{? zxM`zs`H|Qa>-hhvZT#OOZ^bO$zAfe8>_00e+7vmgV=i|6ZEjd>*KB#DFKcJiv|yV~ zYwfT+uOtq2#diMh0$!Uwz6mX{czAF6{SBLQET_w|cwIY}Z*wFk<@BClt{d}UIir_q_ zs&&p58&xIGu5@uLvsY!Ew`q1}@9jW6oA1F~nz_#f@}_OFmoPACyZW|RLo=ZB#-!-e ziWfFMyBB^>!NxN2@iWm7qlcki-wAJA%ynYxr%j*FFcq_Aq_6z3>e7{Nne;<9&aSap zFB2=eBH4GtMlTDgO`m_={<&3hr{Nsd2cMo<-3l(LvNbzDzx>lW)=lC&=D&Yj$vE$Q z#I^6b9-)VBoZ7gB>1j&dOSTrT$e*{TYs6oSj99RJSJJ^AMYC_$qhptC-qG;IHvN&q zQmdRh;VxQhVsw`G^b|ene7-Q`lW0I@`V_t!UX>cEkvC%0^D2+*OR3D=y5!{PT_-)~ z&&}V{%cp#8ef+tG=~V*3dqP!{c6bywR!+M!=lpWNkd=&IYTj5z_u2Jo+m>pcNcs2W zT6jc6{Ie$yn*ZA;|D?M9Isb$0LLb;F>JrlRqV4Ju zmOsm#5#9Z$a@t>^vMG|ht-`S_$u%o&!q&%>B(3O7}WxQe{8D!kE<>1$7N(?7mM90nJ%XL`nGs* zRd~C+UBZV4f_JB~?#k|dA{d*oj7uTBW512zjO-`R)I{e6X-m)FJYDH~zSX4lpSqpC zyxQPZpLodiN}K4PnWZXDo_ckUT$g|=Yz(A~YA=}#E&I|rSBI<+12fCz0UXHmTq3%tK=VZ&1SjOsqHlj+VuI^?jwageUD1M&b`Z@ zac8=!u}A5mi68b(nYr}2Wp2;kq@3F4-ZtN>_szfd%jo@|z2}R+{FA-#ZK_1F1h4y= z+;tc2Z5HM&QkmD{aendkja?JEE+&=)*_sMPFb#aEhWe;Wke(ccbnVX|E@zSYz{O|9k zzrN*ark7Xz^k@2xUlY?oC8yfsLN2kXfh!j-I}p}q>bhvrXWJ0#4N5+{UDFF2U(c^P zx;I7JI+`bPnwTyqk2u@(U9fUHek&@b$amH%2HV@2E=B=g*T(4EycVD5UY*=3ZU3V- zr}mR-i@=+`ALZo#JUJho?0c+XWA@rk(~W&Eb#;uaUS9X=T6{QJY`b~HjflrT4myYH zKc96h)bwHRnmOK4%+IWL?v%Ls^ftqbMf>gE%vLWuaO-RLmuu5*{(Z_Xp*Gu*`(x_{ z>uGNS zeABuRp(*C9#R&&^08*Y>vo@H zq?m&?)qd8R9=Ge{z2^3o!-c0Vscde%RL1u5Ol4(be^%v>wPKs@DrK|T+{C3+i$?)3mrXQBQ(P!en`YEt6_2s#1Qs(uS(B^PgIaOU$oX?E1dq!@SowZ`@ly z^Ln+AK{&6E@yktzCIp?9o?jfF^?V;|((ySud#m0uanD};X8&)+=Dp6Z?p*rCmArPQ zkD6cZ^9cX6X%$u%-q=>0*eN|dA}0E%h2{3EuZ#XZ)_+tQ_2zDUM@f(7T)BuHGhJW) zu4wG%VcHYMy*`({CEWg>P~7gRT@suNeAzB|9K2Uu{zl75ebR#ibLK9Xs4M@H{aR3< z_Jcd>@lQUj|84Tm={VEbJ`2kqALPE*J>xDr?7;NmMuVBeT0tw#;|&wGF!i6@P?bI1 zkWEpQd-iIHp4ca$+IdSlpD`C5vzDL1{V?=r>Zh58Uu|D&ZrUhiXTNmKDbXw*Hi4$8 zr=MR;JaLfydv^CkuS=0}3+gYaU!5;?eZxtf8QbQ6Uoxlu+xGv4iw_FqmT)-;-1!wM z|JeBdxBT?SuUw<<@;RqV9*E2U3Bu-ARyZwFR-;@0}7H-^je#us~IX*u= zEdSS+&3&whvd4f#zab=^$AMP}t$t&YgJloe)Y zIz#$G?x~*|Tlf6iY2$3CyK(Ug`@0V|Y~Oh5)KT5O_jV6b(x+Q(-?GokevUw^pc6;W zWmomhHPdqEay*Ls=;$u^Q038|;_I^Cd{3>b+kN)v^m&Rewpre}xi$EX-@2)d?eY~B zYZ zVRzhadw1T{rmF@2)9X7Y^RHR4aPf(aB|V)cZpZuPmh#EmlGwG@>~Z4OwRVe59hbY7 zCr|x&vO!~a;P$>=#pdmoH*DHnm}M}%d)1Avxi>Sft<7BLdf@!zbxIoy^>pUmcSx|< z6~2F}mxpKd%F_><-4$4*CU9nFHkZu~C|wh{@$T*P@1G>^{abo{$B#?8=VEtvl-b&+ zW-IRa^Xc=N*nKBn|NjzS@TI_HXJQ}t;wBkD$Tj!af@N^!o3^4>eJ<) zhE)C#bdp|T{NP?xWXkVg{mW5t49=2gZW-*@fB2vIJywV8-Lqpdwm%f>HH`RO=DFB9 zf#)~#v~6aV_w3JP8yUTO@y>bL`q-qx;&x);37`|s&^ntMjisz@uT-bkD6e(ANXi>vviO?X9XY=uv}b2B_`d8MZ9 z&|aSg<}J-%E(=(nODNc}W$(#L*R0s(?@c69W*VBvEWCc0gvif!{JYw&rvn%Y6NHkBE6v?}@XHK17va?=o-2{$9 z-zDC?*=6PVLFC{mrrGy@28!v=+pNwc5^;0M^$#Dq;}`!wSgXXIc1S?jZH9*0H9qs07r$1!2Gzlp{j+}nK_JC=6%bEO4y&EVtu9BKM} z$F8o>?{k*boZ71+pHsWnH~ZYy%;#mR?-clEAjSC;fG`FGa{NN&rD8#eb}N}UMcXdYV+eq z+U9MZOE_;izOA<1^h+mMlExB(!Av?#v)r~d>71p z999}}booP(gB*_OrJWfjc_wD}q9d2p2W@D35*K8oVcfY*`PvJMP3+%~7zU=SwRBB% zk#O7d?ecyHiMEhTtxeru4{j(ZobA2d#=SguYC>uuSDJBbV!F|P0)$=UjEJX?HA8I=|u%A%j@(m?c3O!@$+(Hwwr4B(M!MMt7pH+XzFPf2- z;!8O`T<%b;tS`@HZFpGsS7Y~8E{X8QokjEKc*ZZgc#F|G@zsr+x!pVd{)(2lci;D> z1!Dozn>&*Nk~{DO9oAp=5Y-MlM-oDLC9jyd>%v;m88QhHC6fkdc?_4kaYh_=fWsdIo+8w{; zlWDL()YLiWP9ECm8B(-MMc-ZWrZxAoCw6{YRs@}VdXzVMxqE!&=}uA4+St3XhnM?L zlURLn<$9y{s*l?i7e4j-Wm5BAK=|mEaIs})LpdM$B#2I!Ie+T%1ifj&{AnHxwNe`w zbAH&_S7N3kt5df2?~}q_3q_W^6J1SVcw6QrK`~?}WRoaW~dm$n{IVDR!`s66ST^vTN?FG#>#A<`c!6ix|%w zJ>c^xX`b<$qBD)pmY=xf&|ZDpFReaY4HlJ_>xoAbTQkM7!$ zl~rngu-kCM=X32}zVioH?$js~aqV8CG3kzem!#@9-@{vl4Y?AowLSdU@UPvPL-~M2 zi)YEVv{mz_1b^V#UV7SNcj2{nz9q|qE@gjTwsqrdRxMYP*J{m*ai_Qc`mJMoy}=^$ zVwHmUEgR=Ise;U16)TyH)0RD5lJlyPNh{))$vT0%?@I(6EKc0WJ6-3*$}(@h-ZxJl zh8wIN^Njr`{3(}Cu-(4()ZdodhfMA!JvE!9)i{w!`N2Qw_d>@jr>zS=>B~6tvbD6W zZR$3!BOdGKRyeZ#C|o1Czx;Y>O3|CyZ`OUh6Q+Cq^Br4$o7VT9HL4%)^c5_AGG(jr z8QIL<=hah{I3pYu^TzGIs*txM&19L>iA-tpjh`MjOK!U6?%O2n{I6lINyD<}t$O0u zC(PGc{~_IoZ%&N)OKXSp>63OD`|c@okceV73Gzt46s)**t)8{;jGU!GWzDNYm}I=w z4@_&^TBg#(a_92a3lCEceZ2d-M1Nj!@byly<}b5)IvN|rtF&v9GUrC$O`T@5d-5*> zuFB6T^W*Q_f4Ft=-L}SrZ*nfXf45BbJh!bQjH{-z!*)uv=W>=KN=}}gWt&@$?FcP* zdz`E=uSwTzU3#3)8!k&1AeJ z+wvJhF58Et4N?2hnbwb zb>HLL)5y=Pc5$cul2;#Kl8ImHmhr2aoh94*0vFfj`k#NBUdMIcuYM?*S8{6CUDN$X zmxpctdF7Q^{=7Gz#qU+mZC{+II^%NVLlu=<_Qxi7-H<$JIM4l!`-&Uw4#LUXMUMqN z@^qAuZn55F*=6b^wcF#Qgn(4~U$(~wbe5>}IRBZ(U#orThAH#qUG25e{`)U`&0aaF zu{(F>{u7nn@gF1C#0UkSE?r^i`R#V|(y93~*Jj*}w~~zFa9n-)VTMh?{K$!n8|Gd* z*A%g%^{e{7@syk6e5-C}{oQxAI`& z#0Zy9bM~g?@7fshu{47PyPdXyZ z&b}zq&OklyAomaD?RMwp|9Ex2&|=%O0&k@bhKsxbZ$rhdhrc*B>%)tdkM{&8?`3A& z-F_tKk+!Rdo5s=$fjt)u)w%>XwnQXPIo6%L=!RiQN^g)9k6qa(_sYBjD^yQ@oW;4J zBCB9mU6ZdPh&J{b6IfYG7dH$J{^O`!%InQq1>_2Qj(>p?RN=W2ye!US8JDozeG`AKp-A`RdQ!D%~HuHaRPJDs_`00UGRKa% zyYqbSlXxp_mzhv(x@zioDg>bi(LWZXVH~*Y2xl1ggSfN17+nk4C^&hb{OtMF3PGC7>l={-; z@3bz_bB_XzZUoP}+y8tk)3oj8k-MuVPW65sVX?jQLx`XIoHM_krv1KTP_!%MF~i<> z{E4KPRQZhx1Hkgqw|^(4MENV$;PU_f$1nTOy zHT82&%-$ocxT+`e?0SciCZ$@-XtSZOtPbso7lMmKLJ@7U~ZA(OnsQL=fO;fy0M zmWVFwVs=uvyIf;$8uuAhvvnWLm@4JMmPwrnPq`}U+IKg|19$E z)uEzOds4%e$(>mm>H6uRMAK2dtcA?xdQNL3ue&!#Fm`$^KN+K>PaQ( zjXUhlYnr8RE($!N5m%+Dk?j~Aynb`i%eFIXS3E4sUCuvyDgVJw-^BF)J$wK3P`7#H z&J9!j($mvlUdqhWXxQm=WI>$j^mS{`-8n8HcJ=Z6_*pwd_lN2yrQFzc=1l1)v#GKy z3K4M%5wA8De4cdo*w%WNivNO--pO4(UNG_2z3#;uX0>MLJ!P85a^l=@_stZ~RP4Mw6lt`N^eKb(+%+1_jRl#PX3EUr-XRbJ_ZY5<<@nOQp zb8^kr{E^?HwtfxvQWSV$v8Ye>^Ex{}uqYWD_ z@6cSp`%*|G*+4C=!sx-__^P?L<7UgTcQ zQ^qIx{*BOAc9*>W3lAJ<^55mP{y|H+Xp&V{)T~=PUyd_=(h*eVPCI<3>c#Pdms0;T zH+lGZPxXqt(CHI%Js?mb^6E-6joj(MeZQFB?fxS^Ki~wZGpsd{{DH^YYio+zvP4lm#7XiW|jN zXt*hNxK3fZ^o4hFdH&}A4{PoIG_}kBDA{%`a@P*m>gu_zy`~>hmU`(~&(PsN@aAiF zd%wkuo=DDD_BVa=@=cy-_scDjUE-Ir;!4SmA8KYT>dbEK?mhCdMmMbw_&7cCNPcwU z)xxc97xLz*Uh6nArP;8;OR(=)*>Z2zAA78N9yj`)Tr01uf5yk$>68DV$$o* zz8}`*_a1$Z|9>Lc_G|zCuTqawn)8=(IKJx^kZ$fwJ~UZz@nPXJ4;2^hRbEv13#4+^eEZy`oKD zRYTVIs)x$mXx%Dqzq`17_FYxG&816kF!jDmf4Aqj{qEm&rZbG=S%kA6J)Cj!BIn}A z!i)YUFZy`o*24}ZpC@O;UGo0A$s{KwtGgueR=wJOds`3l7G3p#Nf$G68gov$h<>qp zp^;Q$w83%SqP=?@s#m(3%rcPd>vT)r&bsDMXrt*)WBm!I|9izZ{QTm(Rp+n8zn`xC zp7+1i?Vo*9?n%V0jK&FV1x9Y1>bG|ueSgg2wc|#XRP%$2mVGmCNq_1XQq>y4JM}HEwq)q*3e1T4& zUXO}CY-*Tz=s=KQyYP3uuTw1MaPN|Rq>=Xh@9rOK8x~wY$gNYeX5x2-2o*l%N1die z#rof_`!eM%_d1~ys`Sg>_PMv4LDrQ+ zc}=9gZq8!Q&aiJ&mOl~EUOP#6xrkS!aGX`h1MQF}$w~5Sw@OFc_~cZ6EncLpVqa0( zRxV*VNwvSx@9XAX|1STjIeh-(Uyr<=Ufx@~<2Wcmu2(JEtofpUv+U8}7EX&pGc0&I z)f9b{7J0hZaOzsOPZTzOByuKjQ=r1RE0Md8dS*D~o_)jh@X8|28I#jaH>kZReIu^e zHaI(z_PKUNB`mm^=hl{MGfqgBl}k@Nd{83!QPAe;g#m&ws?&G>I%lt3 z;I<~_%k?g~bG`j+I(h3KZf835QHA}L%RITcUpS+>9wzjN2))g@xscWE#mki&j4Y#^ z7EN_=Gu*g5U}OGPm17D9Er;H{nh@vm#IG$kcm3^`<*_nz0+U{?fA{vo)w}FDTX);+ z-*Yf4;W)$Z#e(s-s}KDB$C;{-?lPmv%THHdNM7zHW30$+#(OG9ToluU5*JOd*z&1J zB(tS&`L~6=dJ&)7Pgp1<-w$5>*w|9;$-y~{y|!74Q**u2V?^9s*wuOX{Q~wCrJrG0 zabWxVo0giY$EKesc{@#UUdszl8{PFB+q_;bZkl@X`qoJPyARffJihwtq^R-QJ2@AV zH`E_EbWLjR*3?7Q{KY=Kh8c{9A2aSfYs!|^a?DgkXd!D9hrqN`$tO!L*6UpKQr>DR z{J_#}T986W%crT*KCUdY#V5QiW1YdB6U(vxw*A9*Ckr`0L~b~@bW(P8g*SJPf7^=_ zo91?!ZVcXkl<&nvX@OZ5jO%N~7oK*vaOluU=v{a@>*D>Jx*Llg?aDr_pnCZ4N1dOfedXwc;M;TWJ)Jyn+M(5-w3@3v zoVXSHdd*rN-F_=etCzfwFU}D4ztOmWSkYtc+m=CW(k9B(+kU#(emtHU!x#&YLA zrM?N5%C>EJDy{dNp~!63^!`$-Y4gq=a;-PzHZNWA@g(O*jV(HXzXRF|3=}`qrrT;( zZvGbY?xiqyi&2J(SF@W!3Qttj=G`~Xt~^$@VXJuljkBAgmM5$YzVF-Uu~xIGGNkCJ zzQdavTdP0HOm1GxqYzs=$0N}(sVKoM`?}xEU+Hm40xah^l5GR5v$b6UkEmp4t?hEn zekYPIS?&;In4_k=e4|LFb#=bHkiQl!&s!z? z$FKY0y+T9H%dxj^#xLvT-d<#GoVYW?lTkExPT3QmE1HYm)<*h;K1_RT^2|8|ZpfzcIU5&E*;J}nm&0>#sc*>c)(L4@(avh|JDV(%6qXxl@2OH`*%##F z_SKA0e7m_}(53r#my7K&VGV8g;o0b8mbFjV^OMJ;!ar)y^`{4Oeqy^I?pRw?Ki#4$ zVpjlvM#I5}oOju{9W0)0-Ths7v5u1I8KofQ7hPxl_jP=6Y4cqE;FMIWr)$$e2}7RZ zk3rA$8ccWVx%8>cNSx8RzEk^#)kki{$Q^~O$|3I@mZU^SU0TR1d0RSwbJ{tl>5h*# z=58pd6JEUVe?k2%3*I9!T_MbmGNtX=CUCErvv*EmM!;O{#oM_i`Llg`X)AmDi~O61 z+i!1~E}orTT2yc(Np?Z7am3{|v2$A*J^Z#8RlRx|9sXjCez;L);mI@+H=lR*Nd>Nw9#A56z24w zGY{Kq7x~VbwW#miyMzT3m-b%k;rm@uv|wIcpCFTJLD=uNk~dG?+~v{mR{vW>_0MY} z4UuWOO&=f3XkNeH`Tsp-wZ($Xf1B!dGPtZ=p5WVHXCY-I*(>o@w&2gX_7?YMAIYk! z8~zWk?<~4^YWuq4s&idJP69jTepLH>$JM30O174-CSU9S?_x=bU{AL*00~o`8(P`^Uncse`_v$Jjm$H zZTs5uw!z_ZoQpN9C!`%ZH*d>xvA7>!+&@k^bu-iL`Pqurz%vh{-*5hWbvp;Ye@C10 zp@$uX^$s?2{*qgrj?C!dm$H>x%wDUum~-;QmJcZ>F3x^m^yi&y+ryHLLDSY=Jf^27 z)O7FcX@#kx);a#AZ*-RZZ%xSREcvx)x|p~{ra|DEn*P?ezKc9lboXC-V0nAe&)Y}+ zB7!gYC^)A&M*2USKdC!=zPG22qk|YnZ{2gvAFj!>ety#UYpgIOA+cCi_W0G~O3cS3 zrc9~0EA~+36l0`kc4J88CE0nIxwlo1rJ2Q5v|W9^Zn_K4WX4Ai9y0dt`%-$W|J%jH z9=^j@3apM)%#~a9c6o0^l&0z-FTTJ+crZZt;R^9Zbv_7&7ZId$F{3g zc>Y}_D$wVA=&|sHZ%5WY(O%Fq^(bTZ1H;cw;?u-B`r5a;?_yjNxBJAQou%LI??3(G zLB+4S>|m3IZAw|8PyXZv3r57onRz@roVK|j^;vJ~br(CJGfhUQPyNNkmJAa`x!y#R#1f+iFTR#rR6Vv; zn{2RIqJEWS=az-#kC`0(%YLRaFvvXtoeOYb)0^2g%LOvk+3wW-7F#;$OVnGpn~_>4 zUrqh&vhm@AZ+dsHoN4`}j|V>nEQ+y7hcgw37eYfS2cEOn!8G zrf)3BopVQ}ck9)Qw_}w1l-$~nU)fn9v}woALj@L_jFw$a(y%mLt!;Du)~5iu>Hoj_ zUyO_NQ4ig8K<>`{r|-_!cOLxf{-QJ1Jh4A;^YN$&I!9TO)<)jAw_;w7=7z5a+rM|P zD{o(?sKn>IUBqNtTWpC>g^|LYo9@5m9GA~c&hCj-Q>&JB`~KY_`}8G-TMITAPg05$ z;#!ltrszw;b*a=fh1%EkF5SMB@c(Z$&o`+)rp%&JpV@n(U6Zz+T;-w1IqTQ5)o(r4 zEvqvspFOvGvYYO@uPaWiQoElt=Zw!H#&7rcA3pW9drj=_6BpmI2OB4{noIS(=uN(L z*KF}cmdP@&)r3W-dmQ&ZeLgn%9cMe{d}@p>v6d}x z_m{F?+1Jdyt1e5~EFP1av|qQizw4KKD7e<})_-eWl9ud<)q8%qQC8J*T~dL^grm5=|)Ti$6l zYlVGEMg4RKuaHeku5H}9|4wqvd%>28)qN>5SH#YIQ7M=0-Tmg?-Hq>;vz1G4Uw83t zMC$v$yRRN^IKy}+=u2?3MRBp8g1X-_!B?O3?rGQsti4}#>Qa!U-{e0rqR)TabDr{i zW7S`!wMXMN9#fG$AYrlV`-HDoP16-@E_=^m*!I`G+pfYo4@Dy!|?klMpDZcwTE;aeZDTKM`J&)W<-2^ z;`@7x-ArRQTuAxJ3o0!=H?ms*=o-8u7rcH8xnuTMHe>aD3; z*X8KH^y>`4J9lmB;vXK1_k>eD>m_$2w;f+wzH5)rri##FccaP#`TXO}$m@z`{7_KnhW zx6kIhd3R;0>Cc8k^A7n`O`N#=@&~E$~B?%Q8K-FxsP=c>n>w`_6veV3?)Jc0EG=7#?lJ^ubK>kPe^ zuI1|I)jn;WTA2HH$^?~Xo09|;mncj!T)en(>yGzNw`Z#+%xh6xX1`&L%uxZ?JkAx? zi>+6;h;CDsUg>#`rGH67gmC+Y|G#$s_+I|fw!By2!%N$0-o2asUz~d%7ZsIqN#5Az z)%AVy4Np(sF1a?%vTDO|&#<1^nvrKZ47iWXJbjsQr&VispQ_jN%KthO!l%b^zS7EG z(rOW;X|>vWrD^>JZ&&u;?L2a_1#frTAAGj?x`eFE)9L17a<4PKH-y$tzLzxpV8W55 z?|+-D5-s>}Z1iP4H3t+Cl_RK6Yf9igc~&GRg;`D{@XY+z2zwYZ)9vPV?&QgOhWU%e;K$vu3h zcz5>n%=z~2zkjZ7+5d&@Zk+g1-s9E3dk_D*mejxYdH$tWWtRIs_htze#F_Iq7~czS zwCD|zKiDPHX}$JE;N)eu@@3&kIv>W?zo^SncW~gtQEZ{AE zZsUfHS<8?2o(zdmnE3L{`wELi+jpEeb$WY5?Mt=ye-DT6{Qfz9o0iVpIX{;xZhEyN zhhwkyQXaV6!NCw-(UBZ>UM#fj>|etkG-{< zDY1Q}$>u}nW*IQ2_C#}KE!*uUr0XRj{PvCTJNe7|3i=$l_8e^aTg`vb^G`~`L_y0X zK{0=hcy9@xW?A#yOsywiUb^{1Glq1#InyI|*uCUYxNh*t>^?#o`%2d7+E z!yqbs_*nU#1LyvK{wz~daGm#(jP~(kvRN;;S!Qm3d1WS(z_ABBH=7He3v)KQ++eP4 zapBH%6bWytzWo7yCY$rh8QVJ!?+DY4 zDickp4ia!KUcQRsyg`ZWiq+~dM&kVk??kpX7d-bUzdr578oh^GmpRPqIrc?fc9~mx z*U^TA4dou?xl>!uhL*?}p3?2yvS1qD6R8`&PtC4yx)k@qP^MoeVs4gB;N+WUc0R&zXk7R##nKE)Sv6lIg$B`N{>b5Yi1vb#mU+J&c~&aeowtn zShl?LZO+T0o+Tf7R-U|nqp>Q9CrUyrJgnoF^SAn+wbjSE%Az-Hy2Z%;V(Mz~h`nW< z4-4nB$5+oT0Bx`P;mEyIWNn`G)5z5!X{$D^D7z};T6(1N#@{Ipesd=6&C+$hsQ-y^ zxtM8JVauc~yK--7cb9}u=d6;o?(k}`k-2!^Hl^l@{)$;zpUe$z*d{#uW91z!-Ew&2 z)a93tZZu+TE&TK*#lT4_A}%)3M$Rf)Ow8jY;|H~yyVH%Dt#uCdm>$yeJXbwY(_5NV z$TL4zaO%vvhb7#8yZ5}e+hX=isrp%G$J%QuJzH;QK9bV@`Tj;|1Fyf_t*e@BHcKO- zqf@t3d;C8j`)BdSxrbfPcS(ESmY!4nQF76T|Eu3cCBNOV?$h??h4a4ODW3mr@Aba7 zI}|rM%U+(eM9{^RcSV+CXhT@YiVN}{j3J7O3l&->I0UTXs{61w@F%liVArBWi@NMr ztX$y{*s1j?=gp0CUzO`(ZeQQ0f4};Cb=++E>SuE*-`H;cK4<5)-HTqIS@U)6*5_w_ zrp-02{`ThWgJ-*+-)NToks7o9{53lhUWsLmUVFI~34RmMuoWzJnRLLxtTWia(beeG z1))fbdRyL%U5uN99CrpvPuvle*d71t<&EN4o-*qfIeCY(zTY^%_X;ahMPK*3V`fs^ zpEGpMC0%&sGOc;B!Uv88?au->vNPY9YnPUm{$Q7!%;|5QJQot)d@?X@+b8jV*@V5G z@A#`eZ7vCLu4d7=dP>8$KaWS&EAeiG^YwV^**`vqu*|&D`aC`9M+)CPc9$g~AM!bC ziiAT}tNNHq-Pln0atg zrWMCU82>oBi%4BGG&Sb6+OT2ow$2~P zYc6hyTkI1*bIyUr{{K1)GI#ttXZdB@(Z`8QnxUsw_+7c_wRzu-X{@WSA6}5Y)Nai~ zuWP*XSoHj!I2cu1CP@eNANv}_`E{q-7opv|PG0D=eNn(B_QsEY@7vgt?a>8Q%{R`v z*9BScwR`HN#E$l znm5K*q)UB#{TA%q*81&So{)d-e1VzS#*-tgDrJtCY^ZwW^y|Rl0E_E|1~0xnxMjw1 z@kW!+uD+n9Jzjg+7N=~AS9`@9f64b)u*Yr92*HWW6JI^;$o06Z5+-H3gKzesQ!jZF zezLr~n|binmj^s+F2o!*@)v$u8n*m&T1?cOqfZ{$-MDMFdnHd@U1P?1=MNVSZ@hRn zci|H08S`>CJ^hmtJwYX68ebk?``u=R4-7Br<_65mJ+xwj)vdd?9MhkQJ?Q&2zxn6$ zoL3uHy0mRIT<`mB*~vFwMCO$7m*=hDta^v3=7)YwRY&{DpOHE?-#8XX?;uO`OM=iZSJ!LIdEDT9sR`B8DV*@YMHTv-fznxljK)mzwl9vvPEnB^c znbzis-z_r_W18^rgzc;SG0~smpEm7pTATS|#*dkYXVm;Kkny@0yRYlp(d-R>XFL4( zzr7}D^23}3dID0D9XT9J7qz*q?Yrm4{npz0k5m}9?0oZI3xeCl4C~)$$Q(a>w*2WS zo=8I;;k221I})aO$MAf;F=gMn)4Lc~zCI)sQINasiN~xHLY5oaIe1g99$Wd<Kx2Kq`Ijq0lvDm-;)?L|)96Xm( z>Q$313X@Irx?fuHZM$xE)VF9&uJY??yN}uxY0e~+Ktm2Rxdwy z_+5AUU2)H?aYxnbo=&d#TfKhc^7bw#fioVfes?e4G+p~mV{2WyNl2rc*_BS24nf9N z_Glh+XR9OMG+CNwRD76nLva6;gFc-F|Iv^=qbS9?o4+t;Hoy3flgIjR_wH!&&pPrg^~B7=LXQbj zA`9cDE>Jn4R=^@{^1L$Q_X8oT=<*F;ZYa;NFB3W2{Ci{ByP!8G7tM*N<(_8BU>5l| zX9~}Yr$#+qoM}sYHa+xT;>Y1J+xL#0@zG;t0mly>D2$BHU)}yM;XvLy8-4}32Pdzv zcxsxzx>5c|L+h;Pj=t{O%k>wi{)n6|dN^gVwD08(8rX!`qYiXzAq1 ze4XJsD;bSyc1-n6*vWG*^7f&p|7)c`AD27ypfZH+hkWe#0g$jZR7d%O9@ ze+QqQ;5c+g=w)}fvXSo_k6)(+;u;K>c=4(RDJ%Q6=~?WXpm%SN(aPki<@t$U)zddt z*Gm1CtK~S$E_NYe#^JfE%{Oi?@=kQTc%OUThOj9!rYJXsGvEDcCv9 zDXZmGCZpPXzDcE}QIV6bl$*VKaO!n_;g zJ0J2Zd3o(qQq$@@kvvVIb(-8h&E$stRb{<*R8IX$eRZSn(%D5z=Is)hExtbK_bXl> zS-Xarhr4Ik{bE?gufMRgnt8YR^^5*94>z%Xte?k}WK`DF!0@sBkB38A)5QdJh0Wbu zIqP;FyJREv`?({J?7GzCzmH6F;$xrs>&g9o@{ciPoA5U-wf$?ZtqMA>A!t-&a`OgH z4UhAepNAI*%jt&ww3>9|K@x}f;zitVkCf~={3QA6*I9W9uP!hx>z8Q=)O5bgG3Ot{ z?$xhv?A^+@TRDPlCd1*CHI0G1XGNuCJ;mj2Nlp&h+ji`bjGFlK#1QQT3~%Qj7xkO|CmzB#uhTs38wau4zvaNLex8LU7<;)H2d8*y)?)o-EEBg+ zl`g%Kwk%-o+?2ywt3?HTAIrG!d41?UUnzTU)lrQ(_Za?$vF}|gYxdSb`^%;Lb38iA zZJCRLeD%J6oN8akxBr{<{NrjdZ<_n2$5#lh-}7fK%eu>b`&$HsLz&zYK7BQ2RW^}U zl{+OyoDt-6dDG zTlPztwPD4zqk@M$6E({x&ks2!?4{|qznsnA_IKu-s`ot$?uMkgF?0Qs$vM=#D48LH zaRsknVNgHM#vpT#dp4l~teSSlK*^WS#2){G@yiA*Hj)=}%*|>&h&c79RzW290 zO0=x-+s4-Wy``h((yi%R+YK4?rH}9bmGP~QHRRO3pzxL{b7~*Q?)iG_wZ;E?H~$pw z^mI&kBo%avcQ!|?+OIbY@3X!*t^D-E{0nxs6=Y=jr@Oni>`?mZBly4Lrkzn)WRHzr z<}UwJJQF$U*BU9rBp*BKEG*5S7;j|Kw0WXq+{Yg2Q!{SPwA$Zyo4Lv4zfP@&pU!5l z)NGZ%m)>rgVZi6X7x!pUn^fIo$u)XiUq0oWX)9*jq$0NE`K4l(hK1+l?yz`#x%qtW zi7O68_xf3u+{m&0Q$D9h_sEGOC#B8#b@(@LKF#ye$z|#RPLHUUj%91K)6+~D_%!N{ z=x!1=mA&neR&D1O$)0jY=h@ZEN75o3|CT-dd+3yj50Crgyp4*!|+H0?4i-nTQv^u9cq&B?@H{(Z)kiOq5^cP{bk6}0pm{ zCOpSAKHe>wIq}+LMa@$zp?r%3EU%igN(Tu%Fg-9|=PdKjdl$A{Um~_`;*m=$gxR%~ zGUW~#FMS~;Jjw8*dx5V0 z#1&7k7FlM!x>E6IMq$n(ah1(`xBU2I7ASo4-y!Bx;ojcA@1`s5nGyQ;Qq7Cm*QWB% zV{tOpXug#1TB~Zbb-lOR0iOFO*2R32)sODpl(j84!hKoVlM88SX6Fuls$q$Yv6_9K z)zjAOBy-rwTZ+OTwvC?Bk|Q9`PRAp1nEsE$2hE zYs&2t2G33%>hjxE@U+|YqN8c`=gr$p?;8J=wHIA80V z6*y;0MC7(DGXhhqER`<%vBll;5Bs+4cHW)z$!yfg- z`kO*ZW>2?yt#nkDo>?Wuc=TgaM9qREO`{;b`mbEtrY!q!woa8?v`gXb`U7b@j`7s* zQxf2x_w9RPtDNEYThdXbpHvziYehyb(SDO==xiUiP4AFg=(6c5OpAj)O<{R|)pv== zc~QN#IZN4Df0kE2y<>h@&9=|<)a2756?`nW?kaCxV%NOn<<`<^YdNZ~Oo*M7!cZh! zw0?%nbVH*ZSvpegf$bGPChgw6QLIgs{B z2qgabHQhbyssvY6{83$JAuZP=?vTopvNwa(p8lP(>2v9A)xDQqr!)PUQ~mZ*w2krn z3k(_c-?xO#wc&c8(hvg*p*<`oKTJG*4U~}&OgLrBc+mK7h>HJ$rd@AcWc?y@RjOyi zZ3;hE@5|!%6BcCNmv(&$uVPG|ukCbcL6NKdScWnr|#l{*-Xp(Wt%9Uv=t^ zq+GKWrUR9`-Q|uS+f;CM@tMnkv+ODkvHmq|_;teDR{Qgpqf-=KnJI4ET*JC*xmBE z+`Dnp*BRUPDwcI6-U+GNKUGpma{Kq@U;l&t%qy<_x!cIsOHhg-WB*sXm1brfC(;8| zRwn;S+O&1i+3<-wlny_AH&v>OXP}?mTi2{@nrxsY_^HnO`r~V7of}*^_T{Xf^Iv@Gwc@$Fiz^>Uu6k(C zV6y1qr_|Jmb!&3Y@++isuMFWh$T@v=;khgXe+g?GM=H&&mQ55Kl^vWlBpH*x&Adc{9aUA`!i(T z;Q%d5rAyiQ7j{1Lp5^E2#x_j=vD zz4NvobvoB)xA)6!hJTC-+!s%{PF2Whp6~O$Z--O0$K1$COJ=F~?f+z6V$K=wvt5=k z%<<&>2=nvx)pwLn&0py3^n301%+i1JOCMcf_+)WNpHJiZ)y!>sZtmjP%^)1)o%$~1 zvVY`EMWM=h)eQem>h0eDE^haaGC^PQx+t&9?DEB$f4v3%urVdQciiTu@NLqKm{P|l z(+r;foAs^fOY&W1zPYwsHQ~zl?nhj=x3T@_*qicx-RGID?xm~#TQ=x38B9GnJMFZN z^QJ#Vw|2gI<1@!aB+y%%@%^GDM)%l0GIbF@1EvQ%R8q#_e;!M3&k%It=|kB`Wuqiq|_LU7!#BpDNZdtuKI0;#6r)t?u!j3 zz3<(^d10A@v`DnV4kry;{zY>aFL?fDwzxmzjoqfRgP;6o^kTZOX+s+u9|HpegQu&X J%Q~loCIIGGmw5mH literal 0 HcmV?d00001 diff --git a/apps/overlay/public/pwa/icon-192.png b/apps/overlay/public/pwa/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..e6adbae7fec1ca271c8384d32188c5993561b352 GIT binary patch literal 26519 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

oLgTKW+%mKXZ3pQjL0BSkWw{ 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

6=}nXQ%NZQ^5^M0*teCSfoAl7_3k3oXfdYn2pEb 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 fqn9!V{<-C@Gfq^Z_+ueoXKL{?^yL>VOg93x6 zi(^Q|oHu(N7xh>EIV`R%=Gt9rQg@QH}5xW-@WmJ<(;(h{*L$i-tVdS z-d$j9U3TZr-|yDXXY8~NldoanusQf*{*m~)m3wrTheRw1)zX{3oz)@o@{*&U@@K}s z^twEkgWWJsag%qd!SaX%iTC1NU5|YC{0ls7=J+_o`d_B%pR?ON?Dizi%u!k7dug+K z&bE~HmguMITHCo@g>!SiRdoq0+v*t{x@@VJ=>C{x$5!O*T6W1!?dlv{F0LRY2;hA8W$ZydKTYR&6btGr;ppLOYi{TrsUy8c&MaQ{vdiT#;g7Z?nmF(fTX zh>HGrHpDCRVdK&cy=hE((!Af}Z(OmNquJv<<=y_3PN5THek`^~|8jiNMfrB z2k#dP337{y>}i%9-});R3jd3X{(YP;^SIJ_g~fJZt=@(6+kap83z|0FpV=x}IDMv| z{Sw{auWL>-e#)JBHfgzv)$ScE3JXPTXNm`$wwl_X?`YO}WlF=RS#rxm^)oRgm|Cw^6jPwAT{`-G_5qK4rTfWfap? zP_*i>(ph0*-IKP~)U_&i_P149Q~fheo6Y`W{a5?G$I9n*yxk&q3!}vgH;A+TeVm`s zP^xIO&vVCoQJ;AqZv8&FoUu^cD*E&@hMzYz+?UF@-`|)Y)pmoqrZT)i?1#odmGt?> zIZ7%Ocf0*JUOn=6y7uYE|HS+MeY?P)7PnvR(Gy{3dyRR0TVgLNPd?F7aV%o7G>gyL z3PJNH(-qRcgpJ@Cyi(Ovt*fau_tGq5 zrabz$x_a6a54H$qx1Ya@doR`>T(Do_xoeVix@pQfKc5T+!`(g}og3!-TlVVAZ00Ao zjbpZ$n4L^7b@)H=>zvl;Ri zUeJHHmNMXC{n70r-o~ubrX~IHh!$%|m-u}42cIQECZy>ex)7}W ziSzmUf2XrK%C4UKyPahPt3&T~?6w2nJfsuOl@k&sW$W;JGKsSoTnzRcTR zE{H5>*pRugQ-P6jN=ep~s$-niqTjXHyKDApo#uX>_wL>PCJC0QCJ#F5YqsnX{yKsA z?^L!^SE4Qc?ObSo`EtxU`@HuuMhRgd34YAm7CLN{Ss+qat@`P;2B+%r-h>#z`EfGWNekxs%GOWOA1oZ+{Z~TzIBH%4NYb%eoD- zdbomvE^jQ{oSCb7j(vq%i)ycGR8W{L}Aezq+$+l|;1fE3MsU+?kmo{6n0dzFM%!(!p+$ z+G;1(&{nBAC8`Jc-?cG$zqPHoeaS>mBF^cl!6dHqsTS&Crp4dyugJcs_B22{{Y%k; z{WTKLTmN;2^e>H&$v*unv*StbwfD#7v6(nEo_V!E$ig9a$%4if=86;R?>%;zn8;GF zcTOR9wyXH`6K73dJ6)H(db39MPQ9?cQ&Y>Wk1diPKWd4#{*!usEN9{UiWKgNntyvX zM@pZ1o9Uo0qA{7dMeDJVtCELKm4m*KsWE5FCC!P>YilbE*blDUzo;mBuT(4dlYggO z5AQZ#dEj=wv9`GQUqgrbEd`d#ZYz|(_G!7kb)jzOuD0MKQg2qy6ML5Pc)qk%^zyG7 zGP2F59qU85cJdz(b1Ct9`!Ig{l@C@L&o>3${TuBf{;c%*%YWMIXUd54oIi2sLOgG} z+Kc`PF*jFgUtVG5enH&xn2Ip-@=S;Q=a0w-&aEtJSR#K?Q^7EJkr1O0i^AL8S3WOO zxvRC~HMeW%PPJNFTZVwc)0OI$jcwH zQC(ZRj#{ib?s{u0_lKz^dO2rTN6G*Fx={X1k=^Bhc)oYZzkz~l7XeY5fK;!bwdC3f+?-x(cGrkvS{5?MKcF%&6 zo#8M3F^hEk<2)X}-spe(x`b!J3q%%J3JYXhyT-$MMQ+opGVZ;rTj~#G?Y0X$9=csu zoi(MvHM2A@>9x?6XU`mBORl}Spz?q6`e|XY#wAb19$X1OeA@Zd$E?_pPx&^wmKWoN z84VliOYhoTh!?su{lQ(Z4Dqu!Ix&H{{Q}Eh(NjG?Lfe*9#_bI1S#k0}4_i?E zQQKely`C}5&el6_nXf)m_+DTv3peMbZ*HQ!SBx{(EH=_l%(xP|TI%oH|M9Bby|%a3Wdus~&RP(r%e$B9 znz@3q>#O|&U-|>j^ZnX-e@SZl*I!ACl29FJ11o6TGM?9A0x z!8}_fZ4)#1)e0KAk6V6k?6`Mhrch^Vy7qpd9l3?Cwr^Uy<<1kP3-1H2D473J)_5LU z+8)C6*UQ+;`H#}Cr{@JkM7Sgh8bT)i{as=4eE+WPHSFGQtd&X)mX14Ww^v4Jwa1bLKJ?j&N`|->y=099Us##=efUcUX;kmmYn6qe6+CP z)uQQ^-zF(E?9a?|Y*5yncl%^e&GAJa%}OVW*X}-hA~PnK`}M!qW?~Ynd;eAK?O46y zLVU5o&$#`2vMUP{bA^(AOcF2T{$De59-HgY+k2UMA7v$WmUNk}Qx8xvPu^wnG5S(K z#1f;cA&2@*lp6Nb6>sEyI{kRkO{?>5%UqK3&d<49FMM1*f8v@chcjntr7qlm=(YKW z?}mR*YCgNQMAWjFdDg;)9a3(lMMoH0)tU-ktv?}hkpJga1(OoJ$p@xQzf~%HHB~=9 zvPN55-|YRx8D;;^Zh8JHwz5=fYkTb9&Yk~*1e!g5eJu2|P+`}_sc)2&D5+X=tSb;8Hzeb{n0xldoGyuZ8b|JqkKh36hQF@;G~X}KB4h5J%j zpOyCoiNwCRC{$m}DYHQAV4laEQ#`G!r=09wvyOXWP>37D=3~cfwm01T8Zl`_f7_CU zrTwZ~9_~E;t!1I^&X80+_m826@9uxl|3~S{2d$9sjr&e3?Q=fG^y@TR?M_QE6}3D4 zC5=Aqa_kvzzf&Y1JG z@=krHahihE2R%()p}(np`+Zp7FPhK&F5NYwvy1J=ZIknBm@E%$@CYis=jb5G62R2_ zG$-TArjqYv-+t$p`mNsnTyEmchKW;u>+k-P*8T5~)h0fc3;B90{%#ZrmJ)b(hsV<4 z&OH@Dlh~9;a*@3|4k#Ue^`g)xE=G_yH}1Fh&3fylOSev9NRd+x@#{L{taa|M`1?73 zt!Cd`u-`8^G+e4ww=ZK4*U<;dRG*kV$mjL4$WJ-BhHsMo62TCMr@s#_F;#h+qm{LK zbKa%`{^rfCS1nsai{@_An_k<$Id{d{uqV1A506Tio!q%uYrlJ3-m|b-c4BAmz4ov8 z`19_s9hG0UNyfS!%5Vsnxq0mj3x~*MHtav9E;B!|exlGEmAIA3OPy4g9+>!6aijRs z!^?7Zaok?IA!YyGEesd#{SCi1`Fg;v|6Y5o*6lr~_rb@Ysc!0tV-fz%K0&K5FSh3? zsR{18ug}5C)yb@q`e{1*f`YrXi{`d6=ci=Gg|6se@Y;P$e2G1?A*)xi>o?xDv8LTx z$J`{U|5-__iamVi@Amg`&m;3w7w>P|KezDPW!7u!>bLc0hOXS;aQW01wYgabBBfN` zIF~x)s55U_JzbdP#hlKCXDnE!Jbtn%|J3JwpO~s<3LZamYwFP*QrGhmTcS4n*3Vv} z6|}Hq_Am3=8|JV*V{(kYTKMbM7J+WDEHLS>W^|uJi+!%{r%j-}2^cUzg|27um z<9%U!sH#eMy;Qn$9N&cPQ^Eu0^6$AX=GbtJe`bV0L(z#hPkRd*mtJ4=^jlMTfb-nO z>v@~vUHNyk+9l8TdwE%-zvAQz{daTt|9+n8|Zr!RGT)ceVT&vdz2WCm#N=w2*B&!>6y?0^U_98VMg>=l>=6 zQh|uLWn^j6?E_jr7neMmI(v)E|10lVMSb|DOkrDg`i!MR-HJDRGnX1(i&=2dVM~2d znpcx?Ts&XtdP4QZeLl;U&)ogr>r&8r-Q(V8+y804(02%N?_K)u z$xD?z2f0$X4Gedm3Hi8h!zlOmtWRy@yS4MUc#l@;t#os4o_pf?i5X>q4$Pber!LxWUEaFzzsalUzL`INAKz@f zdi$gK>$PGW`-OBb2b^fE(dN6b;q;cUr2dk4h0LD6&;CrlVRzfILDF5c>s{LG6Su#s z@yDd=a0{&9jLJx5saU$Lye^X0wev-PaQ)dcPUpJCby*d!q~&?tVM=v(dzpE{J?PNw zolJIH_X($GcP4_3d$d-Wp@HS+IDq%e{Gbjy_wpK|=jxu>6-h z^}H{xy8M61;GipY`kl9kiHXC@PD!>j+%%EX)Dr(fTpO4I2#T<03U zE^>S5T9}j@=E?h6X!+Le`Rspr*9Tbs$~Ni0eMa=xa+muvDnd%*dKMdRvt&Q0#$k{b zwC83`^z+vrb<7yFWC#xPh^6l}_kBBcFQ#`xjWuR^{bZY1o-=P>yH((*EC*4J^9DI>hzICzFF@BLY7=^XeXI4Dhr;>%)I3FOIhXqjcAc~pMQ5sIBe&CddA?`*CR{k z$Zv`lik%j&$iLlpy^*v2!7FkGJq%vE&v^&hB!>u^Za!EQfBA5Y(2GIqulwj$DKvt%-`dKuCn|M zeWqfh{dsRd^WDJU36q!)RjmrnyY<%p|D_j;c33Rz(3$YAOm=ye*=dL3IR)L$S`$Sw zgDS7YwL~yJmDb>@Fx9+z&TmGC-2|y`i6M7WuBtOI82y+3*;Sh`Bl+Uqg)=l*xJmUy#^) zQC?VH*)UJEooQ9nBdtj;0f~+ce*|Lkcg(pejzGs>jFj(LTJ!vCL| z>dCs347IP^`YsdXzz`+D_~e#wYD4%skqey`K6AZa1Q#r?dUfhcaF>wfH0f-zx?cNvU)DJn7-_%jZ}ja<31g9m|DNYA?)-Oozqi$tqBCc&Y~Lkr9T*ZI zprECHd*cQ#)2D*9Oc6ZC&&P<}e0S;LY8Ktr?yxUw!}oXut@^!Q=OVk1@QdR|jyqi9 z{Z!OY^*r>LNSL-i^X9g+mc)cJca$5lC)sJciX9emmN#F2uW3tk$KAeL4}E7|S?BZ5 z!`JNLZIMTdw|MMT{w2e(DrUl-y`BOFi**7d7g;+MeNOvf*D&*BO^~f|P~QD|!HUp; z<(s`^GQ(zi{#h5S-~U_R{hyDs?vD%hemarS71M=|9o1Ob`LB3J>-Ua@JGeb3wylVY z&VFukCVl1Flqy|4rWu!AW8LbxAI#Km;B;H$v{tC1-#q=85}r4d2~zfA=&+;>x0u|Ew29{~w&Q>>$H( zJFOF*CmEyGu1)!Ne8ra2rt=^1FzSe{i{lpLzqy9JxRCE&&f^H#-pyQdiY(@Ra-6*T z|F#$UEp^!sFEm6fb(2|8acAPeXO}iRwEcaykB@7|sWc(RDUIH)FJolR#Hj2%ws_Np zWz!Sph*(YKHJ-OYBuBJUKJoslk_qeN79YB_$>FH!T<`LJq^J)_Qt z!V6-nZJy5F@YvogP~Q0U;;52KK9l}jbgb{TnJ|IPr8dP&$A)d<^mrxJ=?|};;pO2{ zY?!oWzvGFU9y?c_*wf`@!`)MSTD7xwnbIHo_DZBo2eL1f$!xdQ6V8s#fL|A9q zYq8J!C$b2fR^r>~VUjcV=esi-oL$4Ozx2>r@`aQ6?>cXX|2My<&SJf^BJj`6wA{se zi*)aPR%+sP%cj?VE!8xL(0;g?z z*WYwaa$>libKPr#Wbc9g)CJtP&Ih%fc6eFJC~{g|TjM#)648Jk%He6JmrTrCy;J7X zo>`x^%`ay$$gaG+v9#>>_6f?7s{$>9xQ>>uy0^|HH`R5{IXbq~ _v(@qtu{`~4+u5_@BkN3&@Dz(ds-`vi`acyu} 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

+aN!jFTb@S=QXY)f)XT*CNlHZ~vdPeTviC{%Q6; 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 literal 0 HcmV?d00001 diff --git a/apps/overlay/public/pwa/icon-maskable.svg b/apps/overlay/public/pwa/icon-maskable.svg new file mode 100644 index 0000000..8d52c22 --- /dev/null +++ b/apps/overlay/public/pwa/icon-maskable.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/overlay/public/pwa/icon.svg b/apps/overlay/public/pwa/icon.svg new file mode 100644 index 0000000..269ca69 --- /dev/null +++ b/apps/overlay/public/pwa/icon.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/overlay/pwa/control-sw.js b/apps/overlay/pwa/control-sw.js new file mode 100644 index 0000000..99a5099 --- /dev/null +++ b/apps/overlay/pwa/control-sw.js @@ -0,0 +1,102 @@ +/* __PWA_BUILD_ID__ is replaced by the Vite build before this file is emitted. */ +const buildId = '__PWA_BUILD_ID__' +const cacheName = `lxc-control-v2-shell-${buildId}` +const shellPath = '/control/' +const shellRoutes = [ + '/control/', + '/control/invitations', + '/control/login', + '/control/register', + '/control/setup', +] +const stableAssets = [ + '/control/manifest.webmanifest', + '/pwa/icon-192.png', + '/pwa/icon-512.png', + '/pwa/icon-maskable-512.png', + '/pwa/apple-touch-icon.png', +] + +async function precacheShell() { + const cache = await caches.open(cacheName) + const response = await fetch(shellPath, { cache: 'reload', credentials: 'same-origin' }) + if (!response.ok) throw new Error(`Cannot precache control shell: ${response.status}`) + + const html = await response.clone().text() + await Promise.all(shellRoutes.map(route => cache.put(route, response.clone()))) + const generatedAssets = [...html.matchAll(/(?:src|href)="(\/assets\/[^"?#]+)"/g)] + .map(match => match[1]) + await cache.addAll([...new Set([...stableAssets, ...generatedAssets])]) +} + +self.addEventListener('install', event => { + event.waitUntil(precacheShell()) +}) + +self.addEventListener('activate', event => { + event.waitUntil((async () => { + const names = await caches.keys() + await Promise.all(names + .filter(name => name.startsWith('lxc-control-v2-shell-') && name !== cacheName) + .map(name => caches.delete(name))) + await self.clients.claim() + })()) +}) + +self.addEventListener('message', event => { + if (event.data?.type === 'SKIP_WAITING') event.waitUntil(self.skipWaiting()) +}) + +function isControlShell(pathname) { + return pathname.startsWith('/control/') +} + +function isStaticAsset(pathname) { + return pathname.startsWith('/assets/') + || pathname.startsWith('/pwa/') + || pathname === '/control/manifest.webmanifest' +} + +async function navigationResponse(request) { + const cache = await caches.open(cacheName) + const pathname = new URL(request.url).pathname + try { + const response = await fetch(request) + if (shellRoutes.includes(pathname) + && response.ok + && response.headers.get('content-type')?.includes('text/html')) { + await cache.put(pathname, response.clone()) + } + return response + } catch { + return (await cache.match(request, { ignoreSearch: true })) + || (await cache.match(shellPath)) + || Response.error() + } +} + +async function staticResponse(request) { + const cached = await caches.match(request, { ignoreSearch: false }) + if (cached) return cached + const response = await fetch(request) + if (response.ok) { + const cache = await caches.open(cacheName) + await cache.put(request, response.clone()) + } + return response +} + +self.addEventListener('fetch', event => { + const request = event.request + if (request.method !== 'GET') return + const url = new URL(request.url) + if (url.origin !== self.location.origin) return + + // Authentication, component data, WebSockets and OBS are outside this + // worker's scope and are never cached. Keep the path check as defence in depth. + if (request.mode === 'navigate' && isControlShell(url.pathname)) { + event.respondWith(navigationResponse(request)) + return + } + if (isStaticAsset(url.pathname)) event.respondWith(staticResponse(request)) +}) diff --git a/apps/overlay/src/api.ts b/apps/overlay/src/api.ts new file mode 100644 index 0000000..c568932 --- /dev/null +++ b/apps/overlay/src/api.ts @@ -0,0 +1,225 @@ +import type { + AuthUser, + ComponentSummary, + CookieCloudSource, + Invitation, + OverlaySettings, + Session, + TotpEnrollment, +} from './types' + +export class ApiError extends Error { + readonly status: number + readonly code?: string + readonly fieldErrors?: Record + + constructor(status: number, message: string, code?: string, fieldErrors?: Record) { + super(message) + this.name = 'ApiError' + this.status = status + this.code = code + this.fieldErrors = fieldErrors + } +} + +async function parseResponse(response: Response): Promise { + if (response.status === 204) return undefined + const contentType = response.headers.get('content-type') ?? '' + if (contentType.includes('application/json')) return response.json() + const text = await response.text() + return text ? { message: text } : undefined +} + +export async function api(path: string, init: RequestInit = {}): Promise { + const method = (init.method ?? 'GET').toUpperCase() + if (!navigator.onLine && !['GET', 'HEAD'].includes(method)) { + throw new ApiError(0, '当前处于离线状态,操作没有提交;联网后请重试。', 'offline') + } + const headers = new Headers(init.headers) + if (init.body != null && !headers.has('content-type')) headers.set('content-type', 'application/json') + headers.set('accept', 'application/json') + + const response = await fetch(path, { + ...init, + headers, + credentials: 'same-origin', + }) + const payload = await parseResponse(response) + if (!response.ok) { + if (response.status === 401 && !path.startsWith('/api/v1/auth/')) { + window.dispatchEvent(new Event('lxc:session-expired')) + } + const error = payload && typeof payload === 'object' ? payload as Record : {} + throw new ApiError( + response.status, + String(error.message ?? error.error ?? `请求失败(HTTP ${response.status})`), + typeof error.code === 'string' ? error.code : undefined, + error.fieldErrors && typeof error.fieldErrors === 'object' + ? error.fieldErrors as Record + : undefined, + ) + } + return payload as T +} + +export function json(method: string, body?: unknown): RequestInit { + return { + method, + body: body === undefined ? undefined : JSON.stringify(body), + } +} + +function object(value: unknown): Record { + return value != null && typeof value === 'object' && !Array.isArray(value) + ? value as Record + : {} +} + +export function normalizeSession(value: unknown): Session { + const root = object(value) + const candidate = root.user + ?? (root.authenticated === true || typeof root.id === 'string' || typeof root.username === 'string' ? root : null) + const raw = object(candidate) + const hasUser = typeof raw.id === 'string' || typeof raw.username === 'string' + const user: AuthUser | null = hasUser ? { + id: String(raw.id ?? ''), + username: String(raw.username ?? ''), + roomId: typeof raw.roomId === 'string' ? raw.roomId : undefined, + displayName: typeof raw.displayName === 'string' ? raw.displayName : undefined, + role: typeof raw.role === 'string' ? raw.role : 'user', + totpEnabled: typeof raw.totpEnabled === 'boolean' ? raw.totpEnabled : undefined, + } : null + return { user, setupRequired: root.setupRequired === true } +} + +export function normalizeEnrollment(value: unknown): TotpEnrollment { + const root = object(value) + const totp = object(root.totp ?? root.enrollment) + const enrollmentToken = root.enrollmentToken ?? totp.enrollmentToken ?? root.flowId ?? root.id + return { + enrollmentToken: String(enrollmentToken ?? ''), + qrSvg: typeof totp.qrSvg === 'string' ? totp.qrSvg : typeof root.qrSvg === 'string' ? root.qrSvg : undefined, + qrDataUrl: typeof totp.qrDataUrl === 'string' + ? totp.qrDataUrl + : typeof totp.qrCodeDataUrl === 'string' + ? totp.qrCodeDataUrl + : typeof root.qrDataUrl === 'string' + ? root.qrDataUrl + : undefined, + otpauthUri: typeof totp.otpauthUri === 'string' + ? totp.otpauthUri + : typeof root.otpauthUri === 'string' + ? root.otpauthUri + : undefined, + manualKey: String(totp.manualKey ?? totp.secret ?? root.manualKey ?? root.secret ?? ''), + expiresAt: typeof root.expiresAt === 'string' ? root.expiresAt : undefined, + } +} + +export function normalizeRecoveryCodes(value: unknown): string[] { + const root = object(value) + const codes = root.recoveryCodes ?? object(root.recovery).codes + return Array.isArray(codes) ? codes.filter((code): code is string => typeof code === 'string') : [] +} + +export function normalizeComponents(value: unknown): ComponentSummary[] { + const root = object(value) + const list = Array.isArray(value) ? value : Array.isArray(root.components) ? root.components : [] + return list.map((entry) => { + const item = object(entry) + return { + id: String(item.id ?? ''), + publicId: String(item.publicId ?? item.public_id ?? item.id ?? ''), + kind: String(item.kind ?? item.type ?? 'danmaku'), + name: String(item.name ?? '弹幕姬'), + enabled: typeof item.enabled === 'boolean' ? item.enabled : undefined, + settings: item.settings as OverlaySettings | undefined, + updatedAt: typeof item.updatedAt === 'string' ? item.updatedAt : undefined, + } + }).filter(item => item.id) +} + +export function normalizeSettings(value: unknown): OverlaySettings { + const root = object(value) + return (root.settings ?? value) as OverlaySettings +} + +export function normalizeSource(value: unknown): CookieCloudSource { + const root = object(value) + const source = object(root.source ?? root) + const cookieCloud = object(source.cookieCloud ?? source.cookiecloud ?? root.cookieCloud ?? root.cookiecloud) + const status = object(source.status) + return { + roomId: String(source.roomId ?? root.roomId ?? ''), + cookieCloud: { + host: String(cookieCloud.host ?? ''), + key: '', + keyConfigured: cookieCloud.keyConfigured === true + || (typeof cookieCloud.key === 'string' && cookieCloud.key.length > 0), + passwordConfigured: cookieCloud.passwordConfigured === true + || cookieCloud.configured === true + || (typeof cookieCloud.password === 'string' && cookieCloud.password.length > 0), + }, + connected: typeof source.connected === 'boolean' + ? source.connected + : typeof status.connected === 'boolean' + ? status.connected + : undefined, + detail: typeof source.detail === 'string' + ? source.detail + : typeof status.detail === 'string' + ? status.detail + : undefined, + updatedAt: typeof source.updatedAt === 'string' ? source.updatedAt : undefined, + } +} + +export function normalizeInvitations(value: unknown): Invitation[] { + const root = object(value) + const list = Array.isArray(value) ? value : Array.isArray(root.invitations) ? root.invitations : [] + return list.map((entry) => { + const item = object(entry) + return { + id: String(item.id ?? ''), + code: typeof item.code === 'string' ? item.code : undefined, + codePrefix: typeof item.codePrefix === 'string' ? item.codePrefix : undefined, + roomId: String(item.roomId ?? ''), + createdBy: typeof item.createdBy === 'string' ? item.createdBy : undefined, + createdAt: typeof item.createdAt === 'string' ? item.createdAt : undefined, + expiresAt: typeof item.expiresAt === 'string' ? item.expiresAt : undefined, + consumedAt: typeof item.consumedAt === 'string' || item.consumedAt === null ? item.consumedAt : undefined, + revokedAt: typeof item.revokedAt === 'string' || item.revokedAt === null ? item.revokedAt : undefined, + } + }).filter(item => item.id) +} + +export function errorMessage(error: unknown, fallback = '操作失败,请稍后再试'): string { + return error instanceof Error && error.message ? error.message : fallback +} + +export async function copyToClipboard(text: string): Promise { + if (window.isSecureContext && navigator.clipboard?.writeText) { + try { + await navigator.clipboard.writeText(text) + return true + } catch { + // Fall through to the compatibility path used by OBS' embedded browser. + } + } + const input = document.createElement('textarea') + input.value = text + input.readOnly = true + input.style.position = 'fixed' + input.style.left = '-9999px' + input.style.opacity = '0' + document.body.appendChild(input) + input.focus() + input.select() + let copied = false + try { + copied = document.execCommand('copy') + } finally { + input.remove() + } + return copied +} diff --git a/apps/overlay/src/auth.tsx b/apps/overlay/src/auth.tsx new file mode 100644 index 0000000..27f2b4f --- /dev/null +++ b/apps/overlay/src/auth.tsx @@ -0,0 +1,358 @@ +import { useMemo, useState } from 'react' +import type { FormEvent, ReactNode } from 'react' +import { + api, + copyToClipboard, + errorMessage, + json, + normalizeEnrollment, + normalizeRecoveryCodes, +} from './api' +import { PwaControls, authRoute, usePwaUpdateBlocker } from './pwa' +import type { TotpEnrollment } from './types' + +function AuthShell({ eyebrow, title, children, footer }: { + eyebrow: string + title: string + children: ReactNode + footer?: ReactNode +}) { + return ( +

+
+ + +

{eyebrow}

+

{title}

+ {children} + {footer &&
{footer}
} +
+
+ ) +} + +function TotpQr({ enrollment }: { enrollment: TotpEnrollment }) { + const source = useMemo(() => { + if (enrollment.qrDataUrl) return enrollment.qrDataUrl + if (enrollment.qrSvg) return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(enrollment.qrSvg)}` + return undefined + }, [enrollment.qrDataUrl, enrollment.qrSvg]) + + return ( +
+
+ {source + ? TOTP 验证器绑定二维码 + : 二维码暂不可用,请使用右侧密钥手工添加。} +
+
+

绑定动态验证器

+
    +
  1. 使用 1Password、Aegis、Microsoft Authenticator 等应用扫描二维码。
  2. +
  3. 若无法扫码,选择“输入设置密钥”。
  4. +
  5. 输入应用中出现的 6 位动态码完成绑定。
  6. +
+ +
+
+ ) +} + +function RecoveryCodes({ codes, onContinue }: { codes: string[]; onContinue: () => void }) { + const [copied, setCopied] = useState(false) + const text = codes.join('\n') + const download = () => { + const blob = new Blob([ + '洛星瓷直播组件恢复码\n', + '每个恢复码只能使用一次,请离线妥善保存。\n\n', + text, + '\n', + ], { type: 'text/plain;charset=utf-8' }) + const url = URL.createObjectURL(blob) + const anchor = document.createElement('a') + anchor.href = url + anchor.download = 'luoxingci-recovery-codes.txt' + anchor.click() + URL.revokeObjectURL(url) + } + + return ( + +

手机丢失或验证器不可用时,可用恢复码登录。服务端不会再次显示这些明文恢复码。

+ {codes.length > 0 + ?
{codes.map(code => {code})}
+ :
服务端没有返回恢复码,请先联系管理员确认恢复策略。
} +
+ {codes.length > 0 && ( + <> + + + + )} + +
+
+ ) +} + +export function LoginPage({ onAuthenticated, setupRequired }: { + onAuthenticated: () => Promise + setupRequired: boolean +}) { + const [username, setUsername] = useState('') + const [totpCode, setTotpCode] = useState('') + const [useRecoveryCode, setUseRecoveryCode] = useState(false) + const [error, setError] = useState('') + const [busy, setBusy] = useState(false) + usePwaUpdateBlocker( + 'login-form', + '完成或清空正在填写的登录表单', + busy || Boolean(username || totpCode), + ) + + const submit = async (event: FormEvent) => { + event.preventDefault() + setBusy(true) + setError('') + try { + await api('/api/v1/auth/login', json('POST', { username: username.trim(), code: totpCode })) + setTotpCode('') + await onAuthenticated() + location.assign('/control/') + } catch (reason) { + setError(errorMessage(reason, '用户名或动态验证码不正确')) + } finally { + setBusy(false) + } + } + + return ( + + {setupRequired + ? <>首次部署?创建系统管理员 + : <>持有邀请码?注册新账户} +

+ )} + > +

这是无密码账户。输入用户名与验证器中的动态验证码即可登录。

+
+ + + + {error &&
{error}
} + +
+
+ ) +} + +export function EnrollmentPage({ mode, onAuthenticated }: { + mode: 'setup' | 'register' + onAuthenticated: () => Promise +}) { + const inviteFromFragment = new URLSearchParams(location.hash.slice(1)).get('invite') ?? '' + const [inviteCode, setInviteCode] = useState(inviteFromFragment) + const [username, setUsername] = useState('') + const [bootstrapPassword, setBootstrapPassword] = useState('') + const [enrollment, setEnrollment] = useState() + const [totpCode, setTotpCode] = useState('') + const [recoveryCodes, setRecoveryCodes] = useState() + const [error, setError] = useState('') + const [busy, setBusy] = useState(false) + const isSetup = mode === 'setup' + usePwaUpdateBlocker( + 'totp-enrollment', + enrollment || recoveryCodes + ? '完成 TOTP 绑定并保存一次性恢复码' + : '完成或清空正在填写的注册表单', + busy || Boolean(inviteCode || username || bootstrapPassword || totpCode || enrollment || recoveryCodes), + ) + + const start = async (event: FormEvent) => { + event.preventDefault() + setBusy(true) + setError('') + try { + const payload = await api( + `/api/v1/auth/${isSetup ? 'setup' : 'register'}/start`, + json('POST', { + ...(isSetup ? {} : { inviteCode: inviteCode.trim() }), + username: username.trim(), + ...(isSetup ? { bootstrapPassword } : {}), + }), + ) + const next = normalizeEnrollment(payload) + if (!next.enrollmentToken) throw new Error('服务端未返回注册流程标识') + setEnrollment(next) + setBootstrapPassword('') + if (!isSetup) { + setInviteCode('') + history.replaceState(null, '', authRoute('register')) + } + } catch (reason) { + setError(errorMessage(reason, '无法开始安全注册流程')) + } finally { + setBusy(false) + } + } + + const confirm = async (event: FormEvent) => { + event.preventDefault() + if (!enrollment) return + setBusy(true) + setError('') + try { + const payload = await api( + `/api/v1/auth/${isSetup ? 'setup' : 'register'}/confirm`, + json('POST', { enrollmentToken: enrollment.enrollmentToken, code: totpCode }), + ) + setTotpCode('') + // Drop QR/manual-key material from React state as soon as enrollment is + // committed; only the one-time recovery codes remain on screen. + setEnrollment(undefined) + setRecoveryCodes(normalizeRecoveryCodes(payload)) + } catch (reason) { + setError(errorMessage(reason, '动态验证码无效或注册流程已过期')) + } finally { + setBusy(false) + } + } + + const finish = async () => { + await onAuthenticated() + location.assign('/control/') + } + + if (recoveryCodes) return void finish()} /> + + if (enrollment) { + return ( + + +
+ + {error &&
{error}
} + +
+
+ ) + } + + return ( + 已有账户?返回登录

} + > +

+ {isSetup + ? '首位账户将拥有邀请码管理权限。旧管理员口令只授权这一次初始化,不会成为账户密码。' + : '邀请码只用于注册;这是无密码账户,创建后每次登录都必须验证 TOTP。'} +

+
+ {!isSetup && ( + + )} + + {isSetup && ( + + )} + {error &&
{error}
} + +
+
+ ) +} diff --git a/apps/overlay/src/control.css b/apps/overlay/src/control.css index 907ac44..7d32e34 100644 --- a/apps/overlay/src/control.css +++ b/apps/overlay/src/control.css @@ -250,22 +250,6 @@ body, display: none; } -.wall header { - max-width: 100%; - padding: 9px 14px; - font-size: var(--font-title, 25px); -} - -.wall header span { - min-width: 0; - overflow: visible; - overflow-wrap: anywhere; - text-overflow: clip; - white-space: normal; -} - -.wall:not(.awake) header, -.wall header span, .copy, .copy b, .copy span, @@ -533,3 +517,1034 @@ body, @media (max-width: 720px) { .preview-viewport { max-height: 560px; } } + +/* Multi-user application shell ------------------------------------------------ */ + +:root { + color-scheme: dark; + --app-bg: #041219; + --app-panel: rgba(7, 32, 42, .88); + --app-panel-strong: rgba(7, 39, 48, .96); + --app-line: rgba(110, 224, 205, .22); + --app-line-strong: rgba(117, 244, 218, .48); + --app-text: #dcfff7; + --app-muted: #83b8b0; + --app-accent: #67e6c5; + --app-accent-deep: #1c766c; + --app-danger: #ff9aa8; +} + +button, +input, +select { + font: inherit; +} + +.jade-panel { + position: relative; + border: 1px solid var(--app-line); + background: + radial-gradient(ellipse at 100% 0, rgba(94, 220, 194, .08), transparent 48%), + linear-gradient(135deg, rgba(8, 39, 50, .94), rgba(5, 25, 35, .91)); + box-shadow: + inset 0 1px rgba(210, 255, 245, .055), + 0 18px 48px rgba(0, 8, 15, .22); + backdrop-filter: blur(18px); +} + +.jade-panel::after { + content: ""; + position: absolute; + inset: 5px; + z-index: 0; + border: 1px solid rgba(122, 237, 216, .06); + border-radius: inherit; + pointer-events: none; +} + +.jade-panel > * { + position: relative; + z-index: 1; +} + +.eyebrow { + margin: 0 0 6px; + color: #6bd9c1; + font-family: ui-sans-serif, system-ui, sans-serif; + font-size: 11px; + font-weight: 700; + letter-spacing: .19em; + text-transform: uppercase; +} + +.auth-page, +.route-loading { + min-height: 100%; + padding: clamp(20px, 6vw, 72px); + display: grid; + place-items: center; + overflow: auto; + background: + radial-gradient(circle at 12% 12%, rgba(50, 145, 139, .2), transparent 30%), + radial-gradient(circle at 86% 82%, rgba(67, 105, 143, .18), transparent 33%), + linear-gradient(145deg, #04131b, #082b31 55%, #041119); + color: var(--app-text); +} + +.route-loading { + color: #93cfc4; + letter-spacing: .12em; +} + +.auth-card { + width: min(100%, 760px); + padding: clamp(26px, 5vw, 52px); + border-radius: 24px; +} + +.auth-card h1 { + margin: 0 0 8px; + color: #dffff7; + font-size: clamp(28px, 5vw, 44px); + font-weight: 600; + letter-spacing: .04em; +} + +.auth-card footer { + margin-top: 24px; + padding-top: 16px; + border-top: 1px solid rgba(109, 212, 196, .14); +} + +.auth-card footer p { + margin: 0; +} + +.auth-page a, +.dashboard-shell a { + color: #82efda; + text-underline-offset: 3px; +} + +.auth-mark { + position: absolute !important; + top: 24px; + right: 28px; + width: 54px; + height: 54px; + display: grid; + place-items: center; + border: 1px solid rgba(124, 239, 216, .32); + border-radius: 50%; + color: rgba(190, 255, 241, .8); + background: radial-gradient(circle, rgba(62, 173, 155, .23), transparent 72%); + box-shadow: 0 0 30px rgba(80, 216, 191, .14); +} + +.auth-lead { + margin: 8px 0 26px; + color: var(--app-muted); + line-height: 1.7; +} + +.stack-form, +.field-grid { + display: grid; + gap: 17px; +} + +.stack-form label, +.field-grid label, +.secret-address { + display: grid; + gap: 7px; + color: #bde9df; + font-size: 14px; +} + +.stack-form label small, +.field-grid label small { + color: #719f99; + line-height: 1.45; +} + +.stack-form input, +.field-grid input, +.field-grid select, +.secret-address input, +.one-time-secret input { + width: 100%; + min-height: 44px; + padding: 10px 12px; + border: 1px solid rgba(75, 157, 151, .55); + border-radius: 10px; + outline: none; + color: #edfffb; + background: rgba(3, 18, 26, .82); + transition: border-color .18s ease, box-shadow .18s ease; +} + +.stack-form input:focus, +.field-grid input:focus, +.field-grid select:focus, +.secret-address input:focus, +.one-time-secret input:focus { + border-color: #6ee8ce; + box-shadow: 0 0 0 3px rgba(92, 225, 198, .12); +} + +.otp-input { + font-family: ui-monospace, SFMono-Regular, Consolas, monospace !important; + font-size: 22px !important; + font-weight: 700; + letter-spacing: .35em; + text-align: center; +} + +.auth-page button, +.dashboard-shell button, +.button-link { + min-height: 40px; + padding: 9px 15px; + border: 1px solid transparent; + border-radius: 9px; + color: #05241f; + background: linear-gradient(135deg, #86f2d8, #50cdb2); + box-shadow: 0 5px 18px rgba(40, 168, 145, .16); + font-weight: 700; + text-align: center; + text-decoration: none; + cursor: pointer; + transition: filter .16s ease, transform .16s ease, border-color .16s ease; +} + +.auth-page button:hover:not(:disabled), +.dashboard-shell button:hover:not(:disabled), +.button-link:hover { + filter: brightness(1.08); + transform: translateY(-1px); +} + +.auth-page button:disabled, +.dashboard-shell button:disabled { + cursor: wait; + filter: saturate(.45); + opacity: .65; +} + +.auth-page button.secondary, +.dashboard-shell button.secondary, +.dashboard-shell .ghost-button { + border-color: rgba(91, 189, 176, .26); + color: #cffff4; + background: rgba(16, 67, 76, .62); + box-shadow: none; +} + +.dashboard-shell button.danger { + border-color: rgba(255, 138, 156, .3); + color: #ffd7dd; + background: rgba(102, 32, 48, .58); + box-shadow: none; +} + +.dashboard-shell button.small { + min-height: 30px; + padding: 5px 10px; + font-size: 12px; +} + +.text-button { + min-height: 30px !important; + padding: 4px 9px !important; + box-shadow: none !important; +} + +.auth-page .inline-link { + width: max-content; + min-height: 0; + padding: 0; + border: 0; + color: #79d7c5; + background: transparent; + box-shadow: none; + font-weight: 500; +} + +.recovery-input { + font-family: ui-monospace, SFMono-Regular, Consolas, monospace !important; + letter-spacing: .08em; +} + +.notice { + padding: 11px 13px; + border: 1px solid rgba(121, 222, 205, .24); + border-radius: 10px; + color: #c9f8ee; + background: rgba(17, 73, 76, .42); + line-height: 1.45; +} + +.notice.error { + border-color: rgba(255, 133, 151, .36); + color: #ffd6dc; + background: rgba(103, 31, 47, .45); +} + +.notice.warning { + border-color: rgba(255, 213, 127, .34); + color: #ffe4aa; + background: rgba(93, 67, 24, .4); +} + +.notice.success { + border-color: rgba(105, 239, 196, .34); + color: #baffea; +} + +.totp-enrollment { + margin: 26px 0; + display: grid; + grid-template-columns: minmax(180px, 240px) 1fr; + gap: clamp(20px, 5vw, 42px); + align-items: center; +} + +.totp-qr { + aspect-ratio: 1; + padding: 12px; + display: grid; + place-items: center; + border-radius: 16px; + color: #47736e; + background: #f4fffc; + text-align: center; +} + +.totp-qr img { + width: 100%; + height: 100%; + object-fit: contain; +} + +.totp-copy h2 { + margin: 0 0 10px; +} + +.totp-copy ol { + margin: 0 0 18px; + padding-left: 20px; + color: #91c1b9; + line-height: 1.65; +} + +.secret-row { + min-width: 0; + display: flex; + gap: 8px; + align-items: center; +} + +.secret-row code { + min-width: 0; + padding: 8px 10px; + overflow-wrap: anywhere; + border: 1px solid rgba(106, 216, 199, .2); + border-radius: 8px; + color: #e8fff9; + background: rgba(0, 12, 19, .66); +} + +.compact-form { + max-width: 420px; + margin-inline: auto; +} + +.recovery-grid { + margin: 22px 0; + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 9px; +} + +.recovery-grid code { + padding: 11px; + border: 1px solid rgba(104, 219, 200, .2); + border-radius: 8px; + color: #e8fff9; + background: rgba(0, 13, 20, .7); + text-align: center; + letter-spacing: .08em; +} + +.form-actions { + display: flex; + flex-wrap: wrap; + gap: 10px; + align-items: center; +} + +.form-actions.align-end { + justify-content: flex-end; +} + +.not-found { + text-align: center; +} + +/* Dashboard */ + +.dashboard-shell { + min-height: 100%; + overflow: auto; + color: var(--app-text); + background: + radial-gradient(circle at 88% 8%, rgba(30, 119, 114, .17), transparent 28%), + radial-gradient(circle at 8% 80%, rgba(58, 83, 126, .12), transparent 32%), + var(--app-bg); +} + +.dashboard-topbar { + position: sticky; + top: 0; + z-index: 20; + min-height: 72px; + padding: 10px clamp(16px, 4vw, 48px); + display: grid; + grid-template-columns: minmax(210px, 1fr) auto minmax(210px, 1fr); + gap: 20px; + align-items: center; + border-bottom: 1px solid rgba(84, 178, 166, .16); + background: rgba(3, 18, 26, .84); + backdrop-filter: blur(18px); +} + +.brand { + width: max-content; + display: flex; + gap: 11px; + align-items: center; + color: #dffff8 !important; + text-decoration: none; +} + +.brand > span { + width: 38px; + height: 38px; + display: grid; + place-items: center; + border: 1px solid rgba(111, 232, 210, .35); + border-radius: 50%; + background: rgba(34, 116, 107, .22); +} + +.brand div, +.account-menu div { + display: grid; + gap: 2px; +} + +.brand small, +.account-menu small { + color: #689b94; + font-family: ui-sans-serif, system-ui, sans-serif; + font-size: 9px; + letter-spacing: .12em; +} + +.dashboard-topbar nav { + display: flex; + gap: 5px; + padding: 4px; + border: 1px solid rgba(89, 181, 169, .14); + border-radius: 11px; + background: rgba(3, 20, 28, .54); +} + +.dashboard-topbar nav a { + padding: 8px 14px; + border-radius: 8px; + color: #8ebdb6; + text-decoration: none; +} + +.dashboard-topbar nav a.active { + color: #e4fff9; + background: rgba(49, 132, 120, .35); +} + +.account-menu { + display: flex; + justify-content: flex-end; + gap: 12px; + align-items: center; + text-align: right; +} + +.pwa-controls { + display: flex; + gap: 7px; + align-items: center; +} + +.account-menu .pwa-controls { + justify-content: flex-end; +} + +.auth-card > .pwa-controls { + margin: -4px 64px 18px 0; + justify-content: flex-start; +} + +.auth-page .pwa-action { + min-height: 34px; + padding: 6px 11px; + border-color: rgba(95, 215, 193, .28); + color: #cffff4; + background: rgba(16, 67, 76, .72); + box-shadow: none; + font-size: 12px; +} + +.pwa-state { + min-height: 30px; + padding: 5px 10px; + display: inline-flex; + gap: 6px; + align-items: center; + border: 1px solid rgba(255, 202, 112, .3); + border-radius: 999px; + color: #ffe2a7; + background: rgba(83, 55, 20, .48); + font-family: ui-sans-serif, system-ui, sans-serif; + font-size: 12px; + white-space: nowrap; +} + +.pwa-state i { + width: 7px; + height: 7px; + border-radius: 50%; + background: #ffca70; + box-shadow: 0 0 9px rgba(255, 202, 112, .68); +} + +.dashboard-shell .pwa-action { + min-height: 30px; + padding: 5px 10px; + border-color: rgba(95, 215, 193, .28); + color: #cffff4; + background: rgba(16, 67, 76, .72); + box-shadow: none; + font-size: 12px; + white-space: nowrap; +} + +.dashboard-shell .pwa-action.update { + border-color: rgba(255, 222, 143, .4); + color: #ffe8b7; + background: rgba(91, 65, 25, .58); + animation: pwa-update-glow 2.2s ease-in-out infinite; +} + +@keyframes pwa-update-glow { + 50% { box-shadow: 0 0 15px rgba(255, 215, 123, .16); } +} + +@media (display-mode: standalone) { + .dashboard-topbar { + padding-top: max(10px, env(safe-area-inset-top)); + padding-right: max(clamp(16px, 4vw, 48px), env(safe-area-inset-right)); + padding-left: max(clamp(16px, 4vw, 48px), env(safe-area-inset-left)); + } +} + +.dashboard-grid { + width: min(100%, 1580px); + margin: 0 auto; + padding: clamp(18px, 3vw, 38px); + display: grid; + grid-template-columns: 260px minmax(0, 1fr); + gap: clamp(18px, 3vw, 30px); + align-items: start; +} + +.component-sidebar { + position: sticky; + top: 98px; + min-height: 400px; + padding: 20px 13px; + border-radius: 17px; +} + +.component-sidebar-heading { + padding: 0 8px 13px; +} + +.component-sidebar h2, +.panel-header h2 { + margin: 0; + color: #dffff8; + font-size: 20px; + font-weight: 600; +} + +.component-list { + display: grid; + gap: 7px; +} + +.component-list button { + width: 100%; + min-height: 64px; + padding: 9px 10px; + display: grid; + grid-template-columns: 38px minmax(0, 1fr) 8px; + gap: 10px; + align-items: center; + border-color: transparent; + color: #beeae2; + background: transparent; + box-shadow: none; + text-align: left; +} + +.component-list button.selected { + border-color: rgba(91, 211, 190, .23); + background: linear-gradient(110deg, rgba(38, 126, 114, .35), rgba(17, 69, 76, .3)); +} + +.component-list button > span:nth-child(2) { + min-width: 0; + display: grid; + gap: 3px; +} + +.component-list button b, +.component-list button small { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.component-list button small { + color: #719e98; + font-weight: 400; +} + +.component-icon { + width: 38px; + height: 38px; + display: grid; + place-items: center; + border: 1px solid rgba(106, 225, 203, .2); + border-radius: 10px; + color: #a8f0df; + background: rgba(45, 135, 121, .2); +} + +.component-list i { + width: 7px; + height: 7px; + border-radius: 50%; + background: #536d6d; +} + +.component-list i.enabled { + background: #72ebc9; + box-shadow: 0 0 9px rgba(86, 232, 197, .7); +} + +.future-components { + margin: 18px 8px 0; + padding-top: 15px; + display: grid; + gap: 4px; + border-top: 1px solid rgba(94, 187, 173, .12); + color: #567d78; +} + +.dashboard-content { + min-width: 0; + display: grid; + gap: 20px; +} + +.page-heading { + min-height: 64px; + display: flex; + justify-content: space-between; + gap: 20px; + align-items: center; +} + +.page-heading h1 { + margin: 0; + color: #e2fff9; + font-size: clamp(27px, 4vw, 40px); + font-weight: 600; +} + +.status-chip { + width: max-content; + padding: 5px 9px; + border: 1px solid rgba(112, 197, 186, .2); + border-radius: 99px; + color: #91bcb6; + background: rgba(17, 60, 66, .44); + font-size: 12px; + white-space: nowrap; +} + +.status-chip.online { + border-color: rgba(99, 236, 199, .3); + color: #99f3d8; + background: rgba(31, 105, 87, .35); +} + +.status-chip.offline { + border-color: rgba(240, 151, 159, .25); + color: #e9aeb4; + background: rgba(91, 39, 48, .34); +} + +.dashboard-panel { + padding: clamp(18px, 3vw, 28px); + border-radius: 17px; +} + +.panel-header { + margin-bottom: 22px; + display: flex; + justify-content: space-between; + gap: 18px; + align-items: flex-start; +} + +.panel-header p, +.source-detail { + margin: 6px 0 0; + color: #78aaa3; + line-height: 1.55; +} + +.slider-grid { + display: grid; + grid-template-columns: repeat(2, minmax(220px, 1fr)); + gap: 19px 30px; +} + +.slider-grid label { + display: grid; + gap: 9px; + color: #a9dad1; +} + +.slider-grid label > span { + display: flex; + justify-content: space-between; + gap: 10px; +} + +.slider-grid output { + color: #8aebd5; + font-family: ui-monospace, SFMono-Regular, Consolas, monospace; +} + +.slider-grid input[type="range"] { + width: 100%; + accent-color: #63ddc1; +} + +.toggle-grid { + margin: 25px 0; + padding: 14px; + display: flex; + flex-wrap: wrap; + gap: 9px; + border: 1px solid rgba(89, 179, 167, .18); + border-radius: 12px; +} + +.toggle-grid legend { + padding: 0 7px; + color: #77a9a2; +} + +.toggle-grid label { + margin: 0; + display: flex; + gap: 7px; + align-items: center; + color: #bae6de; +} + +.toggle-grid input { + accent-color: #5ee0c1; +} + +.two-columns { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.span-all { + grid-column: 1 / -1; +} + +.field-grid > .notice { + grid-column: 1 / -1; +} + +.preview-panel { + overflow: hidden; +} + +.preview-panel .preset-buttons { + margin-top: 0; +} + +.preview-panel .preset-buttons button { + color: #d2f8f0; +} + +.preview-panel .preview-viewport { + border-radius: 10px; + background: #021017; +} + +.preview-panel .preview-frame { + max-width: none; + min-width: 280px; + min-height: 240px; +} + +.token-summary { + margin-bottom: 19px; + display: flex; + flex-wrap: wrap; + gap: 14px 30px; +} + +.token-summary > div { + display: grid; + gap: 4px; +} + +.token-summary small { + color: #719e97; +} + +.token-summary code { + color: #b7eade; + overflow-wrap: anywhere; +} + +.secret-address { + margin: 16px 0; +} + +.secret-address input, +.one-time-secret input { + font-family: ui-monospace, SFMono-Regular, Consolas, monospace; + font-size: 12px; +} + +.empty-state { + padding: 28px 12px; + color: #709d97; + text-align: center; +} + +.empty-state p { + margin: 7px 0 0; +} + +.loading-panel { + min-height: 180px; + padding: 30px; + display: grid; + place-items: center; + border-radius: 17px; + color: #79b2aa; +} + +.admin-content { + width: min(1120px, 100%); + margin: 0 auto; + padding: clamp(20px, 4vw, 46px); + display: grid; + gap: 22px; +} + +.one-time-secret { + margin-top: 22px; + padding: 17px; + display: grid; + gap: 11px; + border: 1px solid rgba(255, 215, 127, .28); + border-radius: 12px; + background: rgba(86, 64, 24, .24); +} + +.one-time-secret > b { + color: #ffe3a7; +} + +.one-time-secret > code { + color: #fff3d1; + font-size: 17px; + overflow-wrap: anywhere; +} + +.table-wrap { + overflow-x: auto; +} + +table { + width: 100%; + border-collapse: collapse; +} + +th, +td { + padding: 12px 10px; + border-bottom: 1px solid rgba(85, 169, 158, .12); + color: #a9d3cc; + text-align: left; + white-space: nowrap; +} + +th { + color: #719e97; + font-size: 12px; + font-weight: 500; +} + +td:last-child { + text-align: right; +} + +.obs-configuration-error { + padding: 10px 12px; + border: 1px solid rgba(255, 143, 157, .42); + border-radius: 10px; + color: #ffe1e5; + background: rgba(72, 24, 37, .82); + font-size: clamp(13px, 3vw, 17px); +} + +@media (max-width: 980px) { + .dashboard-topbar { + grid-template-columns: 1fr auto; + } + + .dashboard-topbar nav { + grid-row: 2; + grid-column: 1 / -1; + justify-self: center; + } + + .dashboard-grid { + grid-template-columns: 1fr; + } + + .component-sidebar { + position: static; + min-height: 0; + } + + .component-list { + grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); + } + + .future-components { + display: none; + } +} + +@media (max-width: 680px) { + .auth-page { + padding: 12px; + } + + .auth-card { + padding: 25px 18px; + border-radius: 17px; + } + + .auth-mark { + display: none; + } + + .totp-enrollment, + .slider-grid, + .two-columns { + grid-template-columns: 1fr; + } + + .totp-qr { + width: min(230px, 100%); + justify-self: center; + } + + .recovery-grid { + grid-template-columns: 1fr; + } + + .dashboard-topbar { + position: static; + grid-template-columns: 1fr; + } + + .dashboard-topbar nav, + .dashboard-topbar .account-menu { + grid-row: auto; + grid-column: auto; + justify-self: stretch; + } + + .dashboard-topbar nav { + justify-content: center; + } + + .account-menu { + justify-content: space-between; + flex-wrap: wrap; + text-align: left; + } + + .account-menu .pwa-controls { + order: 3; + width: 100%; + } + + .dashboard-grid { + padding: 12px; + } + + .component-list { + grid-template-columns: 1fr; + } + + .panel-header, + .page-heading { + align-items: flex-start; + flex-direction: column; + } + + .token-summary { + display: grid; + } +} + +@media (prefers-reduced-motion: reduce) { + .auth-page *, + .dashboard-shell * { + scroll-behavior: auto !important; + transition: none !important; + } + + .dashboard-shell .pwa-action.update { + animation: none !important; + } +} diff --git a/apps/overlay/src/control.tsx b/apps/overlay/src/control.tsx new file mode 100644 index 0000000..145eaf1 --- /dev/null +++ b/apps/overlay/src/control.tsx @@ -0,0 +1,784 @@ +import { useCallback, useEffect, useMemo, useRef, useState } from 'react' +import type { FormEvent, ReactNode } from 'react' +import { + ApiError, + api, + copyToClipboard, + errorMessage, + json, + normalizeComponents, + normalizeInvitations, + normalizeSettings, + normalizeSource, +} from './api' +import { Overlay } from './overlay' +import { PwaControls, usePwaUpdateBlocker } from './pwa' +import { defaultOverlaySettings } from './types' +import type { + AuthUser, + ComponentSummary, + CookieCloudSource, + Invitation, + OverlaySettings, +} from './types' + +const previewPresets = [ + { label: '窄侧栏', width: 360, height: 600 }, + { label: '竖屏', width: 440, height: 760 }, + { label: '高清竖栏', width: 600, height: 1080 }, + { label: '横向条', width: 720, height: 320 }, +] + +function isDanmakuKind(kind: string): boolean { + return kind === 'danmaku_overlay' || kind === 'danmaku' +} + +type Flash = { kind: 'success' | 'error'; text: string } | undefined + +function Panel({ title, description, aside, children, className = '' }: { + title: string + description?: string + aside?: ReactNode + children: ReactNode + className?: string +}) { + return ( +
+
+
+

{title}

+ {description &&

{description}

} +
+ {aside} +
+ {children} +
+ ) +} + +function FlashMessage({ flash }: { flash: Flash }) { + if (!flash) return null + return
{flash.text}
+} + +function ControlLayout({ user, active, onLogout, children }: { + user: AuthUser + active: 'components' | 'invitations' + onLogout: () => Promise + children: ReactNode +}) { + const isAdmin = user.role === 'system_admin' + return ( +
+
+ + +
洛星瓷直播云台OBS COMPONENT STUDIO
+
+ +
+ +
{user.displayName || user.username}{isAdmin ? '系统管理员' : '用户'}
+ +
+
+ {children} +
+ ) +} + +function SettingsEditor({ settings, onChange, onSave, saving }: { + settings: OverlaySettings + onChange: (settings: OverlaySettings) => void + onSave: () => Promise + saving: boolean +}) { + const edit = (key: K, value: OverlaySettings[K]) => { + onChange({ ...settings, [key]: value }) + } + const eventToggles: Array<[keyof OverlaySettings, string]> = [ + ['showDanmaku', '弹幕'], + ['showEnter', '进房'], + ['showGift', '礼物'], + ['showSuperchat', '醒目留言'], + ['showGuard', '舰长'], + ['showLike', '点赞'], + ['showShare', '分享'], + ] + + return ( +
+
+ + + + + + + +
+ +
+ 显示事件 + {eventToggles.map(([key, label]) => ( + + ))} + +
+ +
+ + +
+
+ +
+
+ ) +} + +function OverlayPreview({ settings }: { settings: OverlaySettings }) { + const [preset, setPreset] = useState(previewPresets[1]) + return ( + +
+ {previewPresets.map(size => ( + + ))} +
+
+
+ +
+
+
+ ) +} + +function SourceEditor({ source, onSaved }: { + source: CookieCloudSource + onSaved: (source: CookieCloudSource) => void +}) { + const [roomId, setRoomId] = useState(source.roomId) + const [host, setHost] = useState(source.cookieCloud.host) + const [key, setKey] = useState(source.cookieCloud.key) + const [password, setPassword] = useState('') + const [busy, setBusy] = useState(false) + const [flash, setFlash] = useState() + const sourceDirty = roomId !== source.roomId + || host.trim() !== source.cookieCloud.host + || key !== source.cookieCloud.key + || Boolean(password) + usePwaUpdateBlocker('live-source', '保存或还原直播源与 CookieCloud 设置', busy || sourceDirty) + + useEffect(() => { + setRoomId(source.roomId) + setHost(source.cookieCloud.host) + setKey(source.cookieCloud.key) + setPassword('') + }, [source]) + + const submit = async (event: FormEvent) => { + event.preventDefault() + setBusy(true) + setFlash(undefined) + try { + const payload = await api('/api/v1/source', json('PUT', { + roomId: roomId.trim(), + cookieCloud: { + host: host.trim(), + key: key.trim(), + ...(password ? { password } : {}), + }, + })) + const next = normalizeSource(payload) + onSaved(next) + setPassword('') + setFlash({ kind: 'success', text: '直播源已保存,连接会使用新的隔离配置。' }) + } catch (reason) { + setFlash({ kind: 'error', text: errorMessage(reason, '直播源保存失败') }) + } finally { + setBusy(false) + } + } + + return ( + + {source.connected ? '已连接' : '未连接'} + + )} + > + {source.detail &&

{source.detail}

} +
+ + + + + +
+ +
+ +
+ ) +} + +type TokenState = { + publicId: string + configured: boolean + updatedAt?: string + address?: string +} + +function tokenState(value: unknown, fallbackPublicId: string): TokenState { + const root = value && typeof value === 'object' ? value as Record : {} + const token = typeof root.token === 'string' ? root.token : undefined + const publicId = String(root.publicId ?? fallbackPublicId) + let address = typeof root.url === 'string' + ? root.url + : typeof root.path === 'string' + ? root.path + : undefined + if (address) address = new URL(address, location.origin).toString() + if (!address && token) { + const url = new URL(`/obs/${encodeURIComponent(publicId)}`, location.origin) + url.hash = new URLSearchParams({ token }).toString() + address = url.toString() + } + return { + publicId, + configured: root.configured === true || root.hasToken === true || root.tokenConfigured === true || Boolean(token || address), + updatedAt: typeof root.updatedAt === 'string' ? root.updatedAt : undefined, + address, + } +} + +function ObsAccessPanel({ component }: { component: ComponentSummary }) { + const [state, setState] = useState({ publicId: component.publicId, configured: false }) + const [busy, setBusy] = useState(false) + const [flash, setFlash] = useState() + usePwaUpdateBlocker( + `obs-token:${component.id}`, + '复制并妥善保存本次生成的 OBS 地址', + busy || Boolean(state.address), + ) + + useEffect(() => { + let cancelled = false + setState({ publicId: component.publicId, configured: false }) + setFlash(undefined) + api(`/api/v1/components/${encodeURIComponent(component.id)}/token`) + .then(payload => { if (!cancelled) setState(tokenState(payload, component.publicId)) }) + .catch(reason => { + if (cancelled) return + setState({ publicId: component.publicId, configured: false }) + setFlash({ kind: 'error', text: errorMessage(reason, '无法读取当前组件的 OBS 令牌状态') }) + }) + return () => { cancelled = true } + }, [component.id, component.publicId]) + + const rotate = async () => { + if (state.configured && !window.confirm('轮换后,所有使用旧地址的 OBS 浏览器源会立即失效。确定继续吗?')) return + setBusy(true) + setFlash(undefined) + try { + const payload = await api(`/api/v1/components/${encodeURIComponent(component.id)}/token`, json('POST')) + const next = tokenState(payload, component.publicId) + setState(next) + setFlash({ kind: 'success', text: '新 OBS 令牌已生成。请立即复制,离开本页后不会再次显示明文令牌。' }) + } catch (reason) { + setFlash({ kind: 'error', text: errorMessage(reason, '无法轮换 OBS 令牌') }) + } finally { + setBusy(false) + } + } + + const copy = async () => { + if (!state.address) return + const copied = await copyToClipboard(state.address) + setFlash(copied + ? { kind: 'success', text: 'OBS 浏览器源地址已复制。' } + : { kind: 'error', text: '浏览器阻止了复制,请手工选择下方地址。' }) + } + + return ( + +
+
+ 访问状态 + {state.configured ? '已生成令牌' : '尚未生成'} +
+
+ 组件公开标识 + {state.publicId} +
+ {state.updatedAt &&
最近轮换{formatDate(state.updatedAt)}
} +
+ + {state.address && ( + + )} +
+ + {state.address && } +
+
+ ) +} + +function TestEvents({ componentId }: { componentId: string }) { + const [kind, setKind] = useState<'danmaku' | 'enter' | 'gift'>('danmaku') + const [uid, setUid] = useState('test-viewer') + const [name, setName] = useState('测试观众') + const [text, setText] = useState('今天也要闪闪发光!') + const [giftName, setGiftName] = useState('小花花') + const [quantity, setQuantity] = useState(1) + const [battery, setBattery] = useState(100) + const [flash, setFlash] = useState() + const [busy, setBusy] = useState(false) + + const submit = async (event: FormEvent) => { + event.preventDefault() + setBusy(true) + setFlash(undefined) + try { + await api(`/api/v1/components/${encodeURIComponent(componentId)}/test-events`, json('POST', { + kind, + uid, + name, + ...(kind === 'danmaku' ? { text } : {}), + ...(kind === 'gift' ? { giftName, quantity, battery } : {}), + })) + setFlash({ kind: 'success', text: '测试事件已发送到当前组件。' }) + } catch (reason) { + setFlash({ kind: 'error', text: errorMessage(reason, '测试事件发送失败') }) + } finally { + setBusy(false) + } + } + + return ( + +
+ + + + {kind === 'danmaku' && } + {kind === 'gift' && ( + <> + + + + + )} + +
+ +
+ ) +} + +function ComponentList({ components, selectedId, onSelect }: { + components: ComponentSummary[] + selectedId?: string + onSelect: (component: ComponentSummary) => void +}) { + return ( + + ) +} + +export function ComponentsPage({ user, onLogout }: { user: AuthUser; onLogout: () => Promise }) { + const [components, setComponents] = useState([]) + const [selectedId, setSelectedId] = useState() + const [settings, setSettings] = useState() + const [source, setSource] = useState() + const [loading, setLoading] = useState(true) + const [saving, setSaving] = useState(false) + const [flash, setFlash] = useState() + const selectedIdRef = useRef(undefined) + const settingsRequestRef = useRef(0) + const savedSettingsRef = useRef(undefined) + + const selected = useMemo(() => components.find(component => component.id === selectedId), [components, selectedId]) + const settingsDirty = Boolean(settings) + && JSON.stringify(settings) !== savedSettingsRef.current + usePwaUpdateBlocker('component-settings', '保存或还原当前组件设置', saving || settingsDirty) + + const loadComponentSettings = useCallback(async (component: ComponentSummary) => { + const requestId = ++settingsRequestRef.current + setSaving(false) + setSettings(undefined) + savedSettingsRef.current = undefined + setFlash(undefined) + try { + const payload = await api(`/api/v1/components/${encodeURIComponent(component.id)}/settings`) + if (requestId !== settingsRequestRef.current || selectedIdRef.current !== component.id) return + const next = { ...defaultOverlaySettings, ...normalizeSettings(payload) } + savedSettingsRef.current = JSON.stringify(next) + setSettings(next) + } catch (reason) { + if (requestId !== settingsRequestRef.current || selectedIdRef.current !== component.id) return + setFlash({ kind: 'error', text: errorMessage(reason, '无法读取组件设置') }) + } + }, []) + + useEffect(() => { + let cancelled = false + const load = async () => { + setLoading(true) + try { + const [componentPayload, sourcePayload] = await Promise.all([ + api('/api/v1/components'), + api('/api/v1/source'), + ]) + if (cancelled) return + const nextComponents = normalizeComponents(componentPayload) + setComponents(nextComponents) + setSource(normalizeSource(sourcePayload)) + const requested = new URLSearchParams(location.search).get('component') + const first = nextComponents.find(component => component.id === requested) + ?? nextComponents.find(component => isDanmakuKind(component.kind)) + ?? nextComponents[0] + if (first) { + selectedIdRef.current = first.id + setSelectedId(first.id) + await loadComponentSettings(first) + } + } catch (reason) { + if (!cancelled) setFlash({ kind: 'error', text: errorMessage(reason, '控制台数据加载失败') }) + } finally { + if (!cancelled) setLoading(false) + } + } + void load() + return () => { + cancelled = true + settingsRequestRef.current += 1 + } + }, [loadComponentSettings]) + + const choose = (component: ComponentSummary) => { + selectedIdRef.current = component.id + setSelectedId(component.id) + const url = new URL(location.href) + url.searchParams.set('component', component.id) + history.replaceState(null, '', url) + void loadComponentSettings(component) + } + + const saveSettings = async () => { + if (!selected || !settings) return + const componentId = selected.id + const requestId = settingsRequestRef.current + setSaving(true) + setFlash(undefined) + try { + const payload = await api( + `/api/v1/components/${encodeURIComponent(componentId)}/settings`, + json('PUT', settings), + ) + if (requestId !== settingsRequestRef.current || selectedIdRef.current !== componentId) return + const next = { ...defaultOverlaySettings, ...normalizeSettings(payload) } + savedSettingsRef.current = JSON.stringify(next) + setSettings(next) + setFlash({ kind: 'success', text: '组件设置已保存,并实时同步到已连接的 OBS。' }) + } catch (reason) { + if (requestId !== settingsRequestRef.current || selectedIdRef.current !== componentId) return + setFlash({ kind: 'error', text: errorMessage(reason, '组件设置保存失败') }) + } finally { + if (requestId === settingsRequestRef.current && selectedIdRef.current === componentId) setSaving(false) + } + } + + return ( + +
+ +
+ {loading &&
正在展开云台…
} + + {!loading && selected && ( + <> +
+

{selected.kind.toUpperCase()}

{selected.name}

+ + {selected.enabled === false ? '已停用' : '运行中'} + +
+ {isDanmakuKind(selected.kind) && settings + ? ( + <> + + + + + + ) + :
该组件类型的设置编辑器尚未安装。
} + + + + )} + {!loading && !selected &&
当前账户还没有可配置的组件。
} + {source && } +
+
+
+ ) +} + +function formatDate(value?: string): string { + if (!value) return '永久' + const date = new Date(value) + if (Number.isNaN(date.getTime())) return value + return new Intl.DateTimeFormat('zh-CN', { dateStyle: 'medium', timeStyle: 'short' }).format(date) +} + +function invitationStatus(invitation: Invitation): { label: string; className: string } { + if (invitation.revokedAt) return { label: '已撤销', className: 'offline' } + if (invitation.expiresAt && new Date(invitation.expiresAt).getTime() <= Date.now()) return { label: '已过期', className: 'offline' } + if (invitation.consumedAt) return { label: '已使用', className: 'offline' } + return { label: '可使用', className: 'online' } +} + +export function InvitationsPage({ user, onLogout }: { user: AuthUser; onLogout: () => Promise }) { + const [invitations, setInvitations] = useState([]) + const [roomId, setRoomId] = useState('') + const [expiresInHours, setExpiresInHours] = useState(24) + const [newCode, setNewCode] = useState('') + const [busy, setBusy] = useState(false) + const [flash, setFlash] = useState() + usePwaUpdateBlocker('invitation-code', '复制并妥善保存本次生成的一次性邀请码', busy || Boolean(newCode)) + + const load = useCallback(async () => { + const payload = await api('/api/v1/invitations') + setInvitations(normalizeInvitations(payload)) + }, []) + + useEffect(() => { + void load().catch(reason => setFlash({ kind: 'error', text: errorMessage(reason, '邀请码读取失败') })) + }, [load]) + + const create = async (event: FormEvent) => { + event.preventDefault() + setBusy(true) + setFlash(undefined) + setNewCode('') + try { + const payload = await api('/api/v1/invitations', json('POST', { roomId: roomId.trim(), expiresInHours })) + const root = payload && typeof payload === 'object' ? payload as Record : {} + const invitation = root.invitation && typeof root.invitation === 'object' + ? root.invitation as Record + : root + const code = String(invitation.code ?? root.code ?? '') + setNewCode(code) + setFlash({ kind: 'success', text: '邀请码已创建。明文只显示这一次。' }) + await load() + } catch (reason) { + setFlash({ kind: 'error', text: errorMessage(reason, '邀请码创建失败') }) + } finally { + setBusy(false) + } + } + + const revoke = async (invitation: Invitation) => { + if (!window.confirm('确定撤销这个邀请码吗?尚未完成的注册会立即失效。')) return + setFlash(undefined) + try { + await api(`/api/v1/invitations/${encodeURIComponent(invitation.id)}`, json('DELETE')) + setFlash({ kind: 'success', text: '邀请码已撤销。' }) + await load() + } catch (reason) { + setFlash({ kind: 'error', text: errorMessage(reason, '邀请码撤销失败') }) + } + } + + const registerAddress = useMemo(() => { + if (!newCode) return '' + const url = new URL('/control/register', location.origin) + url.hash = new URLSearchParams({ invite: newCode }).toString() + return url.toString() + }, [newCode]) + + return ( + +
+
+

SYSTEM ADMIN

邀请码管理

+ 仅系统管理员 +
+ + +
+ + +
+
+ {newCode && ( +
+ 仅显示一次 + {newCode} + event.currentTarget.select()} /> +
+ + +
+
+ )} +
+ +
+ + + + {invitations.map(invitation => { + const status = invitationStatus(invitation) + return ( + + + + + + + + + ) + })} + {invitations.length === 0 && } + +
直播间邀请码前缀创建时间有效期状态
{invitation.roomId}{invitation.codePrefix || '—'}{formatDate(invitation.createdAt)}{formatDate(invitation.expiresAt)}{status.label}{status.className === 'online' && }
尚未创建邀请码。
+
+
+
+
+ ) +} + +export function ForbiddenPage({ user, onLogout }: { user: AuthUser; onLogout: () => Promise }) { + return ( + +

邀请码管理仅对系统管理员开放。

返回我的组件
+
+ ) +} + +export function isUnauthorized(error: unknown): boolean { + return error instanceof ApiError && error.status === 401 +} diff --git a/apps/overlay/src/main.tsx b/apps/overlay/src/main.tsx index 90ee944..d582dae 100644 --- a/apps/overlay/src/main.tsx +++ b/apps/overlay/src/main.tsx @@ -1,68 +1,149 @@ -import { useCallback, useEffect, useRef, useState } from 'react' +import { useCallback, useEffect, useState } from 'react' import { createRoot } from 'react-dom/client' +import { ApiError, api, errorMessage, json, normalizeSession } from './api' +import { EnrollmentPage, LoginPage } from './auth' +import { ComponentsPage, ForbiddenPage, InvitationsPage } from './control' +import { Overlay, tokenFromFragment } from './overlay' +import { PwaControls, authRoute, cleanupLegacyPwa, initializePwa } from './pwa' +import type { Session } from './types' import './style.css' import './control.css' -type Settings = { title:string; fontScale:number; showDanmaku:boolean; showEnter:boolean; showGift:boolean; showSuperchat:boolean; showGuard:boolean; showLike:boolean; showShare:boolean; maxVisible:number; collapseAfterSeconds:number; unfoldDurationMs:number; motionIntensity:number; particleCount:number; particleSpeed:number; lowPerformanceMode:boolean; highValueThreshold:number; featuredValueThreshold:number } -type Envelope = { id:string; type:string; payload:any } -type Item = Envelope & { key:string; received:number; decorVariant:number } -type DanmakuSegment = { type:'text'; text:string } | { type:'emoticon'; text:string; unique?:string; url:string; width?:number; height?:number; isDynamic?:boolean; standalone?:boolean } -const defaults: Settings = { title:'洛星瓷专用弹幕猪!', fontScale:140, showDanmaku:true, showEnter:true, showGift:true, showSuperchat:true, showGuard:true, showLike:false, showShare:false, maxVisible:5, collapseAfterSeconds:12, unfoldDurationMs:1000, motionIntensity:70, particleCount:8, particleSpeed:100, lowPerformanceMode:false, highValueThreshold:10000, featuredValueThreshold:100000 } -const cardParticles=['star','floret','star','star','floret','star','floret','star','star','floret','star','floret'] as const -const decorVariantCount=6 +function Redirect({ to }: { to: string }) { + useEffect(() => { + location.replace(to) + }, [to]) + return
正在前往云台…
+} -function stableHash(value:string) { let hash=2166136261; for(let index=0;index>>0 } -function chooseDecorVariant(seed:string,previous?:number) { const hash=stableHash(seed); const base=hash%decorVariantCount; if(previous===undefined||base!==previous)return base; return (base+1+((hash>>>8)%(decorVariantCount-1)))%decorVariantCount } -function CardDecor({count,variant}:{count:number;variant:number}) { const visible=Math.min(cardParticles.length,Math.max(0,Math.round(count||0))); const normalized=((variant%decorVariantCount)+decorVariantCount)%decorVariantCount; return } +function NotFoundPage() { + return ( +
+
+ +

404 · LOST IN THE CLOUDS

+

这里没有组件

+

地址可能已经失效,或者组件已被所属用户删除。

+ 返回控制台 +
+
+ ) +} -function wsUrl() { const p = new URLSearchParams(location.search); const protocol = location.protocol === 'https:' ? 'wss:' : 'ws:'; return `${protocol}//${location.host}/ws?token=${encodeURIComponent(p.get('token') || '')}` } -function enabled(type:string, s:Settings) { return (type==='live.danmaku'&&s.showDanmaku)||(type==='live.enter'&&s.showEnter)||(type.startsWith('live.gift')&&s.showGift)||(type==='live.superchat'&&s.showSuperchat)||(type==='live.guard.buy'&&s.showGuard)||(type==='live.like'&&s.showLike)||(type==='live.share'&&s.showShare) } -function useEvents(disabled=false) { - const [settings,setSettings]=useState(defaults); const [items,setItems]=useState([]); const [connected,setConnected]=useState(false); const settingsRef=useRef(settings) - useEffect(()=>{settingsRef.current=settings},[settings]) - useEffect(()=>{ if(disabled)return; let dead=false; let socket:WebSocket|undefined; let timer=0 - const open=()=>{ socket=new WebSocket(wsUrl()); socket.onopen=()=>setConnected(true); socket.onclose=()=>{setConnected(false); if(!dead) timer=window.setTimeout(open,1500)}; socket.onmessage=e=>{ try { const x:Envelope=JSON.parse(e.data); if(x.type==='overlay.settings.snapshot'||x.type==='overlay.settings.updated'){setSettings(x.payload.settings);return} setItems(old=>{ const current=settingsRef.current; if(!enabled(x.type,current))return old; const combo=x.type==='live.gift.combo'&&x.payload.comboId; const key=combo?`combo:${combo}`:x.id; const existing=old.find(v=>v.key===key); const decorVariant=existing?.decorVariant??chooseDecorVariant(`${x.type}:${key}`,old[0]?.decorVariant); const next=[{...x,key,received:Date.now(),decorVariant},...old.filter(v=>v.key!==key)].slice(0,current.maxVisible); return next }) }catch{} } } - open(); return()=>{dead=true;window.clearTimeout(timer);socket?.close()} - },[disabled]) - useEffect(()=>{setItems(items=>items.slice(0,settings.maxVisible))},[settings.maxVisible]) - return {settings,items,connected,setItems} +function App() { + const [session, setSession] = useState() + const [loadError, setLoadError] = useState('') + const [online, setOnline] = useState(navigator.onLine) + const path = location.pathname.replace(/\/+$/, '') || '/' + + const refreshSession = useCallback(async () => { + setLoadError('') + try { + const payload = await api('/api/v1/auth/me') + setSession(normalizeSession(payload)) + } catch (error) { + if (error instanceof ApiError && error.status === 401) { + setSession({ user: null, setupRequired: false }) + return + } + setLoadError(errorMessage(error, '无法连接认证服务')) + } + }, []) + + useEffect(() => { + void refreshSession() + }, [refreshSession]) + + useEffect(() => { + const wentOnline = () => { + setOnline(true) + if (loadError) void refreshSession() + } + const wentOffline = () => setOnline(false) + window.addEventListener('online', wentOnline) + window.addEventListener('offline', wentOffline) + return () => { + window.removeEventListener('online', wentOnline) + window.removeEventListener('offline', wentOffline) + } + }, [loadError, refreshSession]) + + useEffect(() => { + const expired = () => { + setSession({ user: null, setupRequired: false }) + if (location.pathname.startsWith('/control')) location.assign('/control/login') + } + window.addEventListener('lxc:session-expired', expired) + return () => window.removeEventListener('lxc:session-expired', expired) + }, []) + + if (loadError) { + const offline = !online + return ( +
+
+ +

{offline ? 'OFFLINE SHELL' : 'CONNECTION ERROR'}

+

{offline ? '控制台目前处于离线状态' : '云台暂时无法连接'}

+ {offline &&

应用外壳已离线打开,但账户、直播源和组件数据不会缓存。联网后即可重新验证会话。

} +
{loadError}
+ +
+
+ ) + } + if (!session) return
正在验证安全会话…
+ + const logout = async () => { + try { + await api('/api/v1/auth/logout', json('POST')) + } finally { + setSession({ user: null, setupRequired: false }) + location.assign(authRoute('login')) + } + } + + if (path === '/') return + if (path === '/login' || path === '/control/login') { + if (session.user) return + return + } + if (path === '/setup' || path === '/control/setup') { + if (session.user) return + if (!session.setupRequired) return + return + } + if (path === '/register' || path === '/control/register') { + if (session.user) return + return + } + if (path === '/control') { + if (location.pathname === '/control') return + if (!session.user) return + return + } + if (path === '/control/invitations') { + if (!session.user) return + if (session.user.role !== 'system_admin') return + return + } + return } -function giftTier(item:Item,s:Settings){const price=item.payload?.gift?.totalPrice||0;return price>=s.featuredValueThreshold?'featured':price>=s.highValueThreshold?'high':'normal'} -const eventRenderers:Recordstring>={ - 'live.enter':()=> '踏入了云台','live.superchat':p=>p.message, - 'live.guard.buy':p=>`开通 ${p.guardName||'舰长'}`,'live.like':()=> '点亮了一颗星','live.share':()=> '分享了直播间' + +const obsMatch = location.pathname.match(/^\/obs\/([^/]+)\/?$/) +const root = createRoot(document.getElementById('root')!) +if (obsMatch) { + // A short-lived migration only: remove the root-scoped worker from early + // development builds so it cannot keep controlling an OBS browser source. + cleanupLegacyPwa() + let publicId = '' + try { + publicId = decodeURIComponent(obsMatch[1]) + } catch { + publicId = '' + } + root.render() +} else { + initializePwa() + root.render() } -function DanmakuEmoticon({segment}:{segment:Extract}) { const [failed,setFailed]=useState(false); if(failed)return <>{segment.text}; return {segment.text}setFailed(true)}/> } -function DanmakuBody({payload}:{payload:any}) { const segments=Array.isArray(payload.segments)?payload.segments as DanmakuSegment[]:undefined; if(!segments?.length)return <>{payload.text||''}; return <>{segments.map((segment,index)=>segment.type==='emoticon'&&segment.url?:{segment.text})} } -function Card({item,settings,expanded}:{item:Item;settings:Settings;expanded:boolean}) { const p=item.payload||{}; const v=p.viewer||{}; const gift=p.gift; const isDanmaku=item.type==='live.danmaku'; const tier=gift?giftTier(item,settings):''; const body=gift?`献上 ${gift.name} ×${p.quantity||1}`:isDanmaku?:eventRenderers[item.type]?.(p)||'送来了一份互动'; - return
- - {gift&&
{gift.animationUrl||gift.imageUrl?{const image=e.currentTarget;if(gift.imageUrl&&!image.src.endsWith(gift.imageUrl))image.src=gift.imageUrl;else image.style.display='none'}}/>:✦}
} -
{v.name||'直播间观众'}{body}{gift?.priceCny>0&&¥ {Number(gift.priceCny).toFixed(2)}}
{tier==='featured'&&
✦ ✧ ✦
} -
} -function Overlay({preview=false,previewSettings}:{preview?:boolean;previewSettings?:Settings}) { const root=useRef(null); const events=useEvents(preview); const {items,connected,setItems}=events; const settings=previewSettings||events.settings; const [shape,setShape]=useState('standard'); const [expandedKey,setExpandedKey]=useState(); const fontFactor=settings.fontScale/100 - useEffect(()=>{if(!root.current)return;const ob=new ResizeObserver(([entry])=>{const {width,height}=entry.contentRect;setShape(width<380?'narrow':height<420?'short':'standard')});ob.observe(root.current);return()=>ob.disconnect()},[]) - useEffect(()=>{if(preview&&!items.length)setItems([{id:'text-preview',key:'text-preview',received:Date.now(),decorVariant:0,type:'live.danmaku',payload:{viewer:{name:'青玉观众'},text:'今天也要闪闪发光!'}},{id:'gift-preview',key:'gift-preview',received:Date.now()-1000,decorVariant:3,type:'live.gift',payload:{viewer:{name:'星光旅人'},quantity:1,gift:{name:'甜蜜告白',totalPrice:12000,priceCny:12,imageUrl:'',animationUrl:''}}}])},[preview,items.length,setItems]) - useEffect(()=>{const newest=items[0];if(!newest){setExpandedKey(undefined);return}setExpandedKey(newest.key);const densityFactor=shape==='short'?.6:1;const timer=window.setTimeout(()=>setExpandedKey(key=>key===newest.key?undefined:key),settings.collapseAfterSeconds*1000*densityFactor);return()=>window.clearTimeout(timer)},[items[0]?.key,items[0]?.received,settings.collapseAfterSeconds,shape]) - return
{settings.title}
{items.map(item=>)}
} -function api(url:string, init?:RequestInit){return fetch(url,{credentials:'same-origin',headers:{'content-type':'application/json',...(init?.headers||{})},...init})} -async function copyToClipboard(text:string){ - if(window.isSecureContext&&navigator.clipboard?.writeText){try{await navigator.clipboard.writeText(text);return true}catch{}} - const input=document.createElement('textarea');input.value=text;input.readOnly=true;input.style.position='fixed';input.style.left='-9999px';input.style.opacity='0';document.body.appendChild(input);input.focus();input.select() - let copied=false;try{copied=document.execCommand('copy')}finally{input.remove()} - return copied -} -const previewPresets=[{label:'窄侧栏',width:360,height:600},{label:'竖屏',width:440,height:760},{label:'高清竖栏',width:600,height:1080},{label:'横向条',width:720,height:320}] -function Control(){ - const [password,setPassword]=useState(''); const [settings,setSettings]=useState(); const [error,setError]=useState(''); const [message,setMessage]=useState(''); const [obsAddress,setObsAddress]=useState(''); const [previewSize,setPreviewSize]=useState(previewPresets[1]) - const load=useCallback(async()=>{const r=await api('/api/admin/overlay-settings');if(!r.ok)throw new Error(r.status===401?'请输入管理员密码':'无法读取设置');setSettings(await r.json())},[]) - useEffect(()=>{load().catch(()=>{})},[load]) - const login=async(e:React.FormEvent)=>{e.preventDefault();const r=await api('/api/auth/login',{method:'POST',body:JSON.stringify({password})});if(!r.ok){setError('密码不正确');return}setError('');await load()} - const save=async()=>{if(!settings)return;const r=await api('/api/admin/overlay-settings',{method:'PUT',body:JSON.stringify(settings)});if(!r.ok)setError('保存失败');else setSettings((await r.json()).settings)} - const copy=async()=>{setMessage('');const r=await api('/api/admin/obs-url');if(!r.ok){setError('无法获取 OBS 地址,请重新登录');return}const {path}=await r.json();const address=new URL(path,location.origin).toString();setObsAddress(address);if(await copyToClipboard(address)){setError('');setMessage('OBS 地址已复制到剪贴板')}else{setError('浏览器阻止了自动复制,请在下方地址框中手动复制')}} - if(!settings)return

弹幕猪控制台

setPassword(e.target.value)}/>{error&&

{error}

}
- const edit=(key:keyof Settings,value:any)=>setSettings({...settings,[key]:value}) - const labels={showDanmaku:'弹幕',showEnter:'进房',showGift:'礼物',showSuperchat:'醒目留言',showGuard:'舰长',showLike:'点赞',showShare:'分享',lowPerformanceMode:'低性能模式'} - return

青玉弹幕姬

改动会立即同步到所有 OBS 浏览器源。

{(Object.keys(labels) as (keyof typeof labels)[]).map(k=>)}
{obsAddress&&}{message&&

{message}

}{error&&

{error}

}

自适应预览

选择常用尺寸后仍可拖拽预览框右下角;OBS 中也可使用任意宽高。

{previewPresets.map(size=>)}
-} -const isControl=location.pathname.startsWith('/control');createRoot(document.getElementById('root')!).render(isControl?:); diff --git a/apps/overlay/src/overlay.tsx b/apps/overlay/src/overlay.tsx new file mode 100644 index 0000000..3381e21 --- /dev/null +++ b/apps/overlay/src/overlay.tsx @@ -0,0 +1,383 @@ +import { useEffect, useRef, useState } from 'react' +import type { Dispatch, SetStateAction } from 'react' +import { defaultOverlaySettings } from './types' +import type { OverlaySettings } from './types' + +type Envelope = { + id: string + type: string + payload: LivePayload & { + code?: string + settings?: Partial + } +} + +type LivePayload = { + viewer?: { uid?: string; name?: string } + text?: string + message?: string + guardName?: string + quantity?: number + comboId?: string + segments?: DanmakuSegment[] + gift?: { + name?: string + totalPrice?: number + priceCny?: number + imageUrl?: string + animationUrl?: string + } +} + +type Item = Envelope & { + key: string + received: number + decorVariant: number +} + +type DanmakuSegment = + | { type: 'text'; text: string } + | { + type: 'emoticon' + text: string + unique?: string + url: string + width?: number + height?: number + isDynamic?: boolean + standalone?: boolean + } + +type OverlayProps = { + preview?: boolean + previewSettings?: OverlaySettings + publicId?: string + accessToken?: string +} + +const cardParticles = ['star', 'floret', 'star', 'star', 'floret', 'star', 'floret', 'star', 'star', 'floret', 'star', 'floret'] as const +const decorVariantCount = 6 + +function stableHash(value: string) { + let hash = 2166136261 + for (let index = 0; index < value.length; index += 1) { + hash ^= value.charCodeAt(index) + hash = Math.imul(hash, 16777619) + } + return hash >>> 0 +} + +function chooseDecorVariant(seed: string, previous?: number) { + const hash = stableHash(seed) + const base = hash % decorVariantCount + if (previous === undefined || base !== previous) return base + return (base + 1 + ((hash >>> 8) % (decorVariantCount - 1))) % decorVariantCount +} + +function CardDecor({ count, variant }: { count: number; variant: number }) { + const visible = Math.min(cardParticles.length, Math.max(0, Math.round(count || 0))) + const normalized = ((variant % decorVariantCount) + decorVariantCount) % decorVariantCount + return ( + + ) +} + +function streamUrl(publicId: string) { + const protocol = location.protocol === 'https:' ? 'wss:' : 'ws:' + return `${protocol}//${location.host}/api/v1/components/${encodeURIComponent(publicId)}/stream` +} + +function enabled(type: string, settings: OverlaySettings) { + return (type === 'live.danmaku' && settings.showDanmaku) + || (type === 'live.enter' && settings.showEnter) + || (type.startsWith('live.gift') && settings.showGift) + || (type === 'live.superchat' && settings.showSuperchat) + || (type === 'live.guard.buy' && settings.showGuard) + || (type === 'live.like' && settings.showLike) + || (type === 'live.share' && settings.showShare) +} + +function parseSettings(value: unknown): OverlaySettings { + if (!value || typeof value !== 'object') return defaultOverlaySettings + return { ...defaultOverlaySettings, ...value as Partial } +} + +function useEvents(disabled: boolean, publicId?: string, accessToken?: string): { + settings: OverlaySettings + items: Item[] + setItems: Dispatch> + connection: 'idle' | 'connecting' | 'connected' | 'denied' +} { + const [settings, setSettings] = useState(defaultOverlaySettings) + const [items, setItems] = useState([]) + const [connection, setConnection] = useState<'idle' | 'connecting' | 'connected' | 'denied'>('idle') + const settingsRef = useRef(settings) + + useEffect(() => { + settingsRef.current = settings + }, [settings]) + + useEffect(() => { + if (disabled || !publicId || !accessToken) { + setConnection('idle') + return + } + + let dead = false + let socket: WebSocket | undefined + let timer = 0 + let retries = 0 + + const open = () => { + setConnection('connecting') + socket = new WebSocket(streamUrl(publicId)) + socket.onopen = () => { + retries = 0 + socket?.send(JSON.stringify({ type: 'authenticate', token: accessToken })) + } + socket.onclose = (event) => { + if (dead) return + if (event.code === 1008 || event.code === 4401 || event.code === 4403) { + setConnection('denied') + return + } + setConnection('connecting') + const delay = Math.min(12_000, 1200 * 2 ** Math.min(retries, 3)) + retries += 1 + timer = window.setTimeout(open, delay) + } + socket.onmessage = event => { + try { + const envelope = JSON.parse(event.data) as Envelope + if (envelope.type === 'authenticated' || envelope.type === 'stream.authenticated') { + setConnection('connected') + return + } + if (envelope.type === 'error' && envelope.payload?.code === 'UNAUTHORIZED') { + setConnection('denied') + socket?.close(1008, 'Unauthorized') + return + } + setConnection('connected') + if (envelope.type === 'overlay.settings.snapshot' || envelope.type === 'overlay.settings.updated') { + setSettings(parseSettings(envelope.payload?.settings)) + return + } + setItems(old => { + const current = settingsRef.current + if (!enabled(envelope.type, current)) return old + const combo = envelope.type === 'live.gift.combo' && envelope.payload?.comboId + const key = combo ? `combo:${combo}` : envelope.id + const existing = old.find(item => item.key === key) + const decorVariant = existing?.decorVariant + ?? chooseDecorVariant(`${envelope.type}:${key}`, old[0]?.decorVariant) + return [{ ...envelope, key, received: Date.now(), decorVariant }, ...old.filter(item => item.key !== key)] + .slice(0, current.maxVisible) + }) + } catch { + // A malformed upstream event must not break a long-running OBS source. + } + } + } + + open() + return () => { + dead = true + window.clearTimeout(timer) + socket?.close() + } + }, [accessToken, disabled, publicId]) + + useEffect(() => { + setItems(current => current.slice(0, settings.maxVisible)) + }, [settings.maxVisible]) + + return { settings, items, setItems, connection } +} + +function giftTier(item: Item, settings: OverlaySettings) { + const price = item.payload?.gift?.totalPrice || 0 + return price >= settings.featuredValueThreshold + ? 'featured' + : price >= settings.highValueThreshold + ? 'high' + : 'normal' +} + +const eventRenderers: Record string> = { + 'live.enter': () => '踏入了云台', + 'live.superchat': payload => payload.message || '', + 'live.guard.buy': payload => `开通 ${payload.guardName || '舰长'}`, + 'live.like': () => '点亮了一颗星', + 'live.share': () => '分享了直播间', +} + +function DanmakuEmoticon({ segment }: { segment: Extract }) { + const [failed, setFailed] = useState(false) + if (failed) return <>{segment.text} + return ( + {segment.text} setFailed(true)} + /> + ) +} + +function DanmakuBody({ payload }: { payload: LivePayload }) { + const segments = Array.isArray(payload.segments) ? payload.segments as DanmakuSegment[] : undefined + if (!segments?.length) return <>{payload.text || ''} + return <>{segments.map((segment, index) => segment.type === 'emoticon' && segment.url + ? + : {segment.text})} +} + +function Card({ item, settings, expanded }: { item: Item; settings: OverlaySettings; expanded: boolean }) { + const payload = item.payload || {} + const viewer = payload.viewer || {} + const gift = payload.gift + const isDanmaku = item.type === 'live.danmaku' + const tier = gift ? giftTier(item, settings) : '' + const body = gift + ? `献上 ${gift.name || '礼物'} ×${payload.quantity || 1}` + : isDanmaku + ? + : eventRenderers[item.type]?.(payload) || '送来了一份互动' + + return ( +
+ + {gift && ( +
+ {gift.animationUrl || gift.imageUrl + ? ( + {gift.name { + const image = event.currentTarget + if (gift.imageUrl && image.src !== gift.imageUrl) image.src = gift.imageUrl + else image.style.display = 'none' + }} + /> + ) + : ✦} +
+ )} +
+ {viewer.name || '直播间观众'} + {body} + {typeof gift?.priceCny === 'number' && gift.priceCny > 0 && ¥ {gift.priceCny.toFixed(2)}} +
+ {tier === 'featured' &&
✦ ✧ ✦
} +
+ ) +} + +export function Overlay({ preview = false, previewSettings, publicId, accessToken }: OverlayProps) { + const root = useRef(null) + const events = useEvents(preview, publicId, accessToken) + const { items, setItems } = events + const settings = previewSettings || events.settings + const [shape, setShape] = useState('standard') + const [expandedKey, setExpandedKey] = useState() + const fontFactor = settings.fontScale / 100 + + useEffect(() => { + if (!root.current) return + const observer = new ResizeObserver(([entry]) => { + const { width, height } = entry.contentRect + setShape(width < 380 ? 'narrow' : height < 420 ? 'short' : 'standard') + }) + observer.observe(root.current) + return () => observer.disconnect() + }, []) + + useEffect(() => { + if (preview && !items.length) { + setItems([ + { + id: 'text-preview', + key: 'text-preview', + received: Date.now(), + decorVariant: 0, + type: 'live.danmaku', + payload: { viewer: { name: '青玉观众' }, text: '今天也要闪闪发光!' }, + }, + { + id: 'gift-preview', + key: 'gift-preview', + received: Date.now() - 1000, + decorVariant: 3, + type: 'live.gift', + payload: { + viewer: { name: '星光旅人' }, + quantity: 1, + gift: { name: '甜蜜告白', totalPrice: 12_000, priceCny: 12, imageUrl: '', animationUrl: '' }, + }, + }, + ]) + } + }, [items.length, preview, setItems]) + + useEffect(() => { + const newest = items[0] + if (!newest) { + setExpandedKey(undefined) + return + } + setExpandedKey(newest.key) + const densityFactor = shape === 'short' ? 0.6 : 1 + const timer = window.setTimeout( + () => setExpandedKey(key => key === newest.key ? undefined : key), + settings.collapseAfterSeconds * 1000 * densityFactor, + ) + return () => window.clearTimeout(timer) + }, [items, settings.collapseAfterSeconds, shape]) + + const missingAccess = !preview && (!publicId || !accessToken) + return ( +
+
+ {missingAccess &&
OBS 地址不完整,请从控制台重新复制。
} + {!missingAccess && events.connection === 'denied' &&
OBS 访问令牌已失效。
} +
+ {items.map(item => ( + + ))} +
+
+
+ ) +} + +export function tokenFromFragment(): string { + const hash = location.hash.startsWith('#') ? location.hash.slice(1) : location.hash + return new URLSearchParams(hash).get('token') ?? '' +} diff --git a/apps/overlay/src/pwa.tsx b/apps/overlay/src/pwa.tsx new file mode 100644 index 0000000..85cc537 --- /dev/null +++ b/apps/overlay/src/pwa.tsx @@ -0,0 +1,214 @@ +import { useEffect, useSyncExternalStore } from 'react' + +interface InstallChoice { + outcome: 'accepted' | 'dismissed' + platform: string +} + +interface BeforeInstallPromptEvent extends Event { + readonly platforms: string[] + readonly userChoice: Promise + prompt(): Promise +} + +interface PwaSnapshot { + online: boolean + standalone: boolean + installPrompt?: BeforeInstallPromptEvent + registration?: ServiceWorkerRegistration + waitingWorker?: ServiceWorker +} + +const listeners = new Set<() => void>() +const updateBlockers = new Map() +let snapshot: PwaSnapshot = { + online: navigator.onLine, + standalone: isStandalone(), +} +let initialized = false +let reloadForUpdate = false + +function isStandalone(): boolean { + const iosNavigator = navigator as Navigator & { standalone?: boolean } + return window.matchMedia('(display-mode: standalone)').matches || iosNavigator.standalone === true +} + +function emit(patch: Partial) { + snapshot = { ...snapshot, ...patch } + listeners.forEach(listener => listener()) +} + +function subscribe(listener: () => void) { + listeners.add(listener) + return () => listeners.delete(listener) +} + +function getSnapshot() { + return snapshot +} + +function addManifest() { + if (document.head.querySelector('link[rel="manifest"]')) return + const manifest = document.createElement('link') + manifest.rel = 'manifest' + manifest.href = '/control/manifest.webmanifest' + document.head.append(manifest) +} + +function observeRegistration(registration: ServiceWorkerRegistration) { + emit({ + registration, + waitingWorker: registration.waiting && navigator.serviceWorker.controller + ? registration.waiting + : snapshot.waitingWorker, + }) + + registration.addEventListener('updatefound', () => { + const worker = registration.installing + if (!worker) return + worker.addEventListener('statechange', () => { + if (worker.state === 'installed' && navigator.serviceWorker.controller) { + emit({ waitingWorker: worker }) + } + }) + }) +} + +async function removeLegacyRootWorker() { + const registrations = await navigator.serviceWorker.getRegistrations() + await Promise.all(registrations.map(async registration => { + const scopePath = new URL(registration.scope).pathname + const workers = [registration.installing, registration.waiting, registration.active] + const isLegacy = scopePath === '/' + && workers.some(worker => worker && new URL(worker.scriptURL).pathname === '/sw.js') + if (isLegacy) await registration.unregister() + })) + + const cacheNames = await caches.keys() + await Promise.all(cacheNames + .filter(name => name.startsWith('lxc-control-shell-')) + .map(name => caches.delete(name))) +} + +export function cleanupLegacyPwa() { + if (!import.meta.env.PROD || !('serviceWorker' in navigator)) return + void removeLegacyRootWorker().catch(error => { + console.warn('旧版 PWA 清理失败', error) + }) +} + +async function registerWorker() { + try { + await removeLegacyRootWorker() + const registration = await navigator.serviceWorker.register( + `/control/sw.js?v=${encodeURIComponent(__PWA_BUILD_ID__)}`, + { scope: '/control/', updateViaCache: 'none' }, + ) + observeRegistration(registration) + } catch (error) { + // A failed PWA registration must never stop the online control console. + console.warn('控制台 PWA 注册失败', error) + } +} + +export function initializePwa() { + if (initialized || location.pathname === '/obs' || location.pathname.startsWith('/obs/')) return + initialized = true + addManifest() + + const displayMode = window.matchMedia('(display-mode: standalone)') + const updateConnection = () => emit({ online: navigator.onLine }) + const updateDisplayMode = () => emit({ standalone: isStandalone() }) + window.addEventListener('online', updateConnection) + window.addEventListener('offline', updateConnection) + const modernListener = (displayMode as unknown as { + addEventListener?: (type: 'change', listener: () => void) => void + }).addEventListener + if (modernListener) modernListener.call(displayMode, 'change', updateDisplayMode) + else (displayMode as unknown as { addListener?: (listener: () => void) => void }) + .addListener?.call(displayMode, updateDisplayMode) + + window.addEventListener('beforeinstallprompt', event => { + event.preventDefault() + emit({ installPrompt: event as BeforeInstallPromptEvent }) + }) + window.addEventListener('appinstalled', () => emit({ installPrompt: undefined, standalone: true })) + + if (!import.meta.env.PROD || !('serviceWorker' in navigator)) return + + navigator.serviceWorker.addEventListener('controllerchange', () => { + if (!reloadForUpdate) return + reloadForUpdate = false + location.reload() + }) + + const start = () => void registerWorker() + if (document.readyState === 'complete') start() + else window.addEventListener('load', start, { once: true }) + + document.addEventListener('visibilitychange', () => { + if (document.visibilityState === 'visible' && navigator.onLine) { + void snapshot.registration?.update() + } + }) + window.setInterval(() => { + if (navigator.onLine) void snapshot.registration?.update() + }, 60 * 60 * 1000) +} + +export function authRoute(name: 'login' | 'register' | 'setup'): string { + const inControlScope = location.pathname === '/control' || location.pathname.startsWith('/control/') + return inControlScope ? `/control/${name}` : `/${name}` +} + +export function usePwaUpdateBlocker(key: string, reason: string, active: boolean) { + useEffect(() => { + if (active) updateBlockers.set(key, reason) + else updateBlockers.delete(key) + return () => { updateBlockers.delete(key) } + }, [active, key, reason]) +} + +async function requestInstall() { + const prompt = snapshot.installPrompt + if (!prompt) return + await prompt.prompt() + await prompt.userChoice + emit({ installPrompt: undefined, standalone: isStandalone() }) +} + +function applyUpdate() { + const worker = snapshot.waitingWorker + if (!worker) return + const reasons = [...new Set(updateBlockers.values())] + if (reasons.length > 0) { + window.alert(`暂时不能更新,请先处理以下内容:\n\n${reasons.map(reason => `• ${reason}`).join('\n')}`) + return + } + const confirmed = window.confirm('更新会刷新控制台。请先保存设置、邀请码、恢复码或刚轮换的 OBS 令牌,确定现在更新吗?') + if (!confirmed) return + reloadForUpdate = true + worker.postMessage({ type: 'SKIP_WAITING' }) +} + +export function PwaControls() { + const state = useSyncExternalStore(subscribe, getSnapshot, getSnapshot) + const canInstall = Boolean(state.installPrompt) && !state.standalone + if (state.online && !state.waitingWorker && !canInstall) return null + + return ( +
+ {!state.online &&