fcr-core
Version:
Core APIs for building online scenes
106 lines (104 loc) • 5.16 kB
JavaScript
;
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;