UNPKG

fcr-core

Version:

Core APIs for building online scenes

106 lines (104 loc) 5.16 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getLocalUserPermissionInfo = exports.addLocalUserPermissionObserver = exports.FcrPermission = void 0; require("core-js/modules/esnext.iterator.constructor.js"); require("core-js/modules/esnext.iterator.find.js"); require("core-js/modules/esnext.iterator.map.js"); var _type = require("./type"); var _user = require("../../utilities/user"); // 初始化权限策略表达式:{module}:{action}-{k1=v1|v2;k2=v3}>{role1|role2} // {module}表示模块,如房间模块room、用户模块user、发流模块stream等。 // {action}表示操作,如结束房间、静音、开启视频等。 // {k1=v1|v2;k2=v3}表示操作的个性化入参,如设置成联席主持人权限,user:setRole-role=host|co-host,入参为role=host|co-host,相同key用|隔开,多个key用;隔开。 // {role1|role2}表示操作对象所属的角色,对象可以是多个,中间用|隔开,如要表示对participant和co-host拥有静音的权限,stream:muteAudio>participant|co-host // 如果操作对象的类型是用户,则需要指定目标角色;如果操作对象的类型是房间,则不需要指定目标角色。 // 为简化表达式,*表示所有,~表示自己(要不要给这种简便的表达式?前端是否不好识别,但如果没有,配置是否有点复杂) // 举例: // stream:muteAudio>~ ,表示可以对自己静音,stream:muteAudio>participant,表示对观众禁音 // user:kickout>* ,表示可以踢所有角色 // record:* ,表示有录制模块下所有操作 // *:*>*,表示拥有对房间最大权限 // {action}分为两类:操作权限和可赋予的操作权限,可赋予的操作权限又分为授权和取消授权 class FcrPermission { constructor(module, action, conditions, targetRoles) { this.module = module; this.action = action; this.conditions = conditions; this.targetRoles = targetRoles; } static fromString(permission) { const [moduleActionParams, roles] = permission.split('>'); const [moduleAction, params] = moduleActionParams.split('-'); const [module, action] = moduleAction.split(':'); const paramsObj = {}; if (params) { for (const param of params.split(';')) { const [key, values] = param.split('='); paramsObj[key] = values.split('|'); } } return new FcrPermission(module, action, paramsObj, roles ? roles.split('|') : []); } } exports.FcrPermission = FcrPermission; const getLocalUserPermissionInfo = (scene, action) => { const permissionStringArray = scene.getUserPropertiesByKeyPath(`permission.list`, scene.localUser.getLocalUserId()); const permissionString = permissionStringArray.find(permission => permission.startsWith(action)); if (!permissionString) { return { enable: false }; } return convertPermissionInfo(FcrPermission.fromString(permissionString), _type.FcrOperatePermissionType.GET); }; exports.getLocalUserPermissionInfo = getLocalUserPermissionInfo; const convertPermissionInfo = (permission, operateType) => { if (!permission) { return { enable: false }; } const { module, action } = permission; const permissionInfo = { enable: operateType === _type.FcrOperatePermissionType.ADD || operateType === _type.FcrOperatePermissionType.GET ? true : false, info: { targetRoles: permission.targetRoles.map(role => (0, _user.convertStringPrivilegeRoleToFcrPrivilegeRole)(role)), action: `${module}:${action}`, params: permission.conditions } }; return permissionInfo; }; const addLocalUserPermissionObserver = (scene, observer, cache) => { scene.addObserver({ onUserPropertiesUpdated: (sceneId, event) => { if (event.cause?.cmd === 3200) { if (event.modifiedUser.userId === scene.localUser.getLocalUserId()) { const data = event.cause.data; const addedPermissions = data.addPermissions?.map(p => convertPermissionInfo(FcrPermission.fromString(p), _type.FcrOperatePermissionType.ADD)); const removedPermissions = data.removePermissions?.map(p => convertPermissionInfo(FcrPermission.fromString(p), _type.FcrOperatePermissionType.DELETE)); if (removedPermissions && removedPermissions.length > 0) { observer.onLocalUserPermissionInfoDeleted && observer.onLocalUserPermissionInfoDeleted(sceneId, { permissionInfo: removedPermissions, operatorUser: (0, _user.checkFcrUserRole)((0, _user.convertRteUserToFcrUser)(event.operatorUser, cache)), cause: event.cause }); } if (addedPermissions && addedPermissions.length > 0) { observer.onLocalUserPermissionInfoAdded && observer.onLocalUserPermissionInfoAdded(sceneId, { permissionInfo: addedPermissions, operatorUser: (0, _user.checkFcrUserRole)((0, _user.convertRteUserToFcrUser)(event.operatorUser, cache)), cause: event.cause }); } } } } }); }; exports.addLocalUserPermissionObserver = addLocalUserPermissionObserver;