import{B as e,C as t,E as n,H as r,K as i,M as a,P as o,R as s,S as c,W as l,_ as u,a as d,d as f,h as p,k as m,l as h,m as g,n as _,o as v,r as y,t as b,u as x,v as S,w as C,x as w}from"./ui-CzB-gjVP.js";import{n as ee,t as te}from"./eye-DaP7VxYZ.js";import{i as T,n as ne,r as re,t as E}from"./users-D7ZZ6mzL.js";import{t as ie}from"./hash-ORiZzY9V.js";import{t as D}from"./log-out-BSFDyM4m.js";import{t as ae}from"./message-square-1ZGuav88.js";import{t as O}from"./radio-tower-UMy9OSpZ.js";import{n as oe,t as se}from"./user-round-BkRPX9Ri.js";import{t as k}from"./shield-check-PAk2q1NC.js";import{t as A}from"./video-C1co3G53.js";import{n as ce}from"./index-BTRwyDO1.js";var j=[[`path`,{d:`M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z`,key:`1s6t7t`}],[`circle`,{cx:`16.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`w0ekpg`}]],M=e=>s(S,i(e,{iconNode:j,name:`key-round`})),N=[[`path`,{d:`M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z`,key:`zw3jo`}],[`path`,{d:`M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12`,key:`1wduqc`}],[`path`,{d:`M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17`,key:`kqbvx6`}]],P=e=>s(S,i(e,{iconNode:N,name:`layers`})),F=[[`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`,key:`v9h5vc`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}],[`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`,key:`3uifl3`}],[`path`,{d:`M8 16H3v5`,key:`1cv678`}]],le=e=>s(S,i(e,{iconNode:F,name:`refresh-cw`})),ue=[[`path`,{d:`M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z`,key:`1c8476`}],[`path`,{d:`M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7`,key:`1ydtos`}],[`path`,{d:`M7 3v4a1 1 0 0 0 1 1h7`,key:`t51u73`}]],de=e=>s(S,i(e,{iconNode:ue,name:`save`})),I=[[`path`,{d:`M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915`,key:`1i5ecw`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]],fe=e=>s(S,i(e,{iconNode:I,name:`settings`})),L=[[`path`,{d:`M10 5H3`,key:`1qgfaw`}],[`path`,{d:`M12 19H3`,key:`yhmn1j`}],[`path`,{d:`M14 3v4`,key:`1sua03`}],[`path`,{d:`M16 17v4`,key:`1q0r14`}],[`path`,{d:`M21 12h-9`,key:`1o4lsq`}],[`path`,{d:`M21 19h-5`,key:`1rlt1p`}],[`path`,{d:`M21 5h-7`,key:`1oszz2`}],[`path`,{d:`M8 10v4`,key:`tgpxqk`}],[`path`,{d:`M8 12H3`,key:`a7s4jb`}]],pe=e=>s(S,i(e,{iconNode:L,name:`sliders-horizontal`})),R=[[`path`,{d:`M10 11v6`,key:`nco0om`}],[`path`,{d:`M14 11v6`,key:`outv1u`}],[`path`,{d:`M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6`,key:`miytrc`}],[`path`,{d:`M3 6h18`,key:`d0wm0j`}],[`path`,{d:`M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2`,key:`e791ji`}]],me=e=>s(S,i(e,{iconNode:R,name:`trash-2`})),z=m(`

`),B=m(`

`),he=m(`

manage / console

管理控制台

统一管理房间、角色与权限。参考 SyncTV 的位掩码与 Allow/Deny 覆盖模型, 房主拥有全部权限,管理员/成员/访客基于角色默认值 + 个人覆盖计算生效权限。

`),ge=m(``),_e=m(`

房间列表

`),Oe=m(`

该房间暂无成员`),ke=m(`

`),Ae=m(`

点击格子切换该成员的 added/removed 覆盖位。房主始终拥有全部权限,不可修改。`),je=m(`

角色默认权限(参考 SyncTV)

Creator = 全部 · Admin 缺 delete_room · Member 为发布订阅开箱即用 · Guest 仅只读,额外仅可被授予 send_chat。

成员 / 角色
permission

成员生效权限 · `),Me=m(`

系统用户与全局角色

users`),Ne=m(`全局角色(viewer/publisher/admin)由 Casbin 控制接口准入;房间内角色(creator/admin/member/guest)由房间位掩码控制具体动作。二者正交:全局 admin 可管理所有房间,但房间内权限仍以 effective 计算结果为准。`),Pe=m(`

系统与 SFU

HTTP 端口
gRPC9090

安全与默认策略

JWT_SECRET 必须显式配置;推流 token 使用 HS256 签发,TTL 默认 2h。

私密房间支持密码;公开房间受 is_public 与 allow_guest_join 联动控制访客可见性。

权限存储为 u64 bits(兼容 Postgres BIGINT), 访客可分配集合受 guest_assignable 约束。

设计参考

本系统在 internal/room 实现 SyncTV 风格的四角色(creator/admin/member/guest)与四列覆盖位 (added/removed/admin_added/admin_removed),并通过 RoomSettings 维护角色默认值,可平滑扩展至更多权限位而不改表结构。`),Fe=m(`

快捷操作

`),Ie=m(`
`),Le=m(`
targets`),Re=m(`
`),ze=m(`