@digitalsamba/embedded-sdk 0.0.12 → 0.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +9 -0
  2. package/dist/cjs/index.d.ts +26 -2
  3. package/dist/cjs/index.js +185 -9
  4. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  5. package/dist/cjs/types.d.ts +104 -9
  6. package/dist/cjs/types.js +0 -6
  7. package/dist/cjs/utils/PermissionManager/index.d.ts +13 -0
  8. package/dist/cjs/utils/PermissionManager/index.js +74 -0
  9. package/dist/cjs/utils/PermissionManager/types.d.ts +23 -0
  10. package/dist/cjs/utils/PermissionManager/types.js +2 -0
  11. package/dist/cjs/utils/proxy.d.ts +1 -0
  12. package/dist/cjs/utils/proxy.js +21 -0
  13. package/dist/cjs/utils/vars.d.ts +23 -0
  14. package/dist/cjs/utils/vars.js +48 -0
  15. package/dist/esm/index.d.ts +26 -2
  16. package/dist/esm/index.js +184 -8
  17. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  18. package/dist/esm/types.d.ts +104 -9
  19. package/dist/esm/types.js +1 -5
  20. package/dist/esm/utils/PermissionManager/index.d.ts +13 -0
  21. package/dist/esm/utils/PermissionManager/index.js +70 -0
  22. package/dist/esm/utils/PermissionManager/types.d.ts +23 -0
  23. package/dist/esm/utils/PermissionManager/types.js +1 -0
  24. package/dist/esm/utils/proxy.d.ts +1 -0
  25. package/dist/esm/utils/proxy.js +17 -0
  26. package/dist/esm/utils/vars.d.ts +23 -0
  27. package/dist/esm/utils/vars.js +45 -0
  28. package/dist/index.html +264 -59
  29. package/dist/initial-config-demo.html +303 -0
  30. package/dist/permissions-demo.html +289 -0
  31. package/dist/types/index.d.ts +26 -2
  32. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  33. package/dist/types/types.d.ts +104 -9
  34. package/dist/types/utils/PermissionManager/index.d.ts +13 -0
  35. package/dist/types/utils/PermissionManager/types.d.ts +23 -0
  36. package/dist/types/utils/proxy.d.ts +1 -0
  37. package/dist/types/utils/vars.d.ts +23 -0
  38. package/dist/umd/index.js +1 -1
  39. package/package.json +1 -1
@@ -1,11 +1,28 @@
1
- export interface InitOptions {
1
+ import { PermissionsMap } from './utils/PermissionManager/types';
2
+ import { LayoutMode, PermissionTypes } from './utils/vars';
3
+ export interface InitialRoomSettings {
4
+ cameraEnabled: boolean;
5
+ micEnabled: boolean;
6
+ username: string;
7
+ layoutMode: LayoutMode;
8
+ showToolbar: boolean;
9
+ showCaptions: boolean;
10
+ virtualBackground: {
11
+ blur: 'medium' | 'strong';
12
+ image: 'office' | 'etc' | /* OR */ 'custom-xxxxxx';
13
+ imageUrl: 'https://image.url';
14
+ enforce: true;
15
+ };
16
+ }
17
+ export type InitOptions = {
2
18
  root: HTMLElement;
3
19
  frame: HTMLIFrameElement;
4
20
  url: string;
5
21
  team: string;
6
22
  room: string;
7
23
  token?: string;
8
- }
24
+ roomSettings: Partial<InitialRoomSettings>;
25
+ };
9
26
  export type FrameAttributes = {
10
27
  align: string;
11
28
  allow: string;
@@ -26,8 +43,8 @@ export interface InstanceProperties {
26
43
  frameAttributes?: Partial<FrameAttributes>;
27
44
  reportErrors?: boolean;
28
45
  }
29
- export type SendMessageType = 'connect' | 'enableVideo' | 'enableAudio' | 'disableVideo' | 'disableAudio' | 'toggleVideo' | 'toggleAudio' | 'startScreenshare' | 'stopScreenshare' | 'startRecording' | 'stopRecording' | 'showToolbar' | 'hideToolbar' | 'toggleToolbar' | 'changeLayoutMode' | 'leaveSession' | 'endSession' | 'requestToggleAudio' | 'requestMute' | 'requestUnmute';
30
- export type ReceiveMessageType = 'connected' | 'userJoined' | 'userLeft' | 'videoEnabled' | 'videoDisabled' | 'audioEnabled' | 'audioDisabled' | 'screenshareStarted' | 'screenshareStopped' | 'recordingStarted' | 'recordingStopped' | 'recordingFailed' | 'layoutModeChanged' | 'activeSpeakerChanged' | 'appError';
46
+ export type SendMessageType = 'connect' | 'enableVideo' | 'enableAudio' | 'disableVideo' | 'disableAudio' | 'toggleVideo' | 'toggleAudio' | 'startScreenshare' | 'stopScreenshare' | 'startRecording' | 'stopRecording' | 'showToolbar' | 'hideToolbar' | 'toggleToolbar' | 'changeLayoutMode' | 'leaveSession' | 'endSession' | 'requestToggleAudio' | 'requestMute' | 'requestUnmute' | 'removeUser' | 'showCaptions' | 'hideCaptions' | 'toggleCaptions' | 'configureCaptions' | 'raiseHand' | 'lowerHand' | 'allowBroadcast' | 'disallowBroadcast' | 'allowScreenshare' | 'disallowScreenshare';
47
+ export type ReceiveMessageType = 'connected' | 'userJoined' | 'userLeft' | 'roomJoined' | 'videoEnabled' | 'videoDisabled' | 'audioEnabled' | 'audioDisabled' | 'screenshareStarted' | 'screenshareStopped' | 'recordingStarted' | 'recordingStopped' | 'recordingFailed' | 'layoutModeChanged' | 'activeSpeakerChanged' | 'appError' | 'captionsSpokenLanguageChanged' | 'captionsFontSizeChanged' | 'permissionsChanged' | 'handRaised' | 'handLowered';
31
48
  export interface SendMessage<D> {
32
49
  type: SendMessageType;
33
50
  data?: D;
@@ -35,11 +52,89 @@ export interface SendMessage<D> {
35
52
  export interface ReceiveMessage {
36
53
  DSPayload: {
37
54
  type: ReceiveMessageType;
38
- payload: unknown;
55
+ data: unknown;
39
56
  };
40
57
  }
41
- export declare enum LayoutMode {
42
- tiled = "tiled",
43
- auto = "auto"
44
- }
45
58
  export type UserId = string;
59
+ export interface User {
60
+ avatarColor: string;
61
+ id: UserId;
62
+ name: string;
63
+ role: string;
64
+ kind: 'local' | 'remote';
65
+ dynamicPermissions: PermissionTypes[] | undefined;
66
+ }
67
+ export type CaptionsSpokenLanguage = 'zh' | 'zh-CN' | 'zh-TW' | 'da' | 'nl' | 'en' | 'en-AU' | 'en-GB' | 'en-IN' | 'en-NZ' | 'en-US' | 'fr' | 'fr-CA' | 'de' | 'hi' | 'hi-Latn' | 'id' | 'it' | 'ja' | 'ko' | 'no' | 'pl' | 'pt' | 'pt-BR' | 'pt-PT' | 'ru' | 'es' | 'es-419' | 'sv' | 'ta' | 'tr' | 'uk';
68
+ type CaptionsFontSize = 'small' | 'medium' | 'large';
69
+ export interface CaptionsOptions {
70
+ spokenLanguage: CaptionsSpokenLanguage;
71
+ fontSize: CaptionsFontSize;
72
+ }
73
+ export type UsersList = Record<UserId, User>;
74
+ export interface RoomState {
75
+ media: {
76
+ cameraEnabled: boolean;
77
+ micEnabled: boolean;
78
+ };
79
+ layout: {
80
+ mode: LayoutMode;
81
+ showToolbar: boolean;
82
+ toolbarPosition: 'left' | 'right' | 'bottom';
83
+ };
84
+ captionsState: {
85
+ showCaptions: boolean;
86
+ } & CaptionsOptions;
87
+ }
88
+ export interface Stored {
89
+ userId: UserId;
90
+ users: UsersList;
91
+ activeSpeaker?: UserId;
92
+ roomState: RoomState;
93
+ }
94
+ export type RoomJoinedPayload = Stored & {
95
+ permissionsMap: PermissionsMap;
96
+ };
97
+ export interface EmbeddedInstance {
98
+ initOptions: Partial<InitOptions>;
99
+ roomSettings: Partial<InitialRoomSettings>;
100
+ savedIframeSrc: string;
101
+ allowedOrigin: string;
102
+ connected: boolean;
103
+ frame: HTMLIFrameElement;
104
+ reportErrors: boolean;
105
+ stored: Stored;
106
+ enableVideo: () => void;
107
+ disableVideo: () => void;
108
+ toggleVideo: (enable?: boolean) => void;
109
+ enableAudio: () => void;
110
+ disableAudio: () => void;
111
+ toggleAudio: (enable?: boolean) => void;
112
+ startScreenshare: () => void;
113
+ stopScreenshare: () => void;
114
+ startRecording: () => void;
115
+ stopRecording: () => void;
116
+ showToolbar: () => void;
117
+ hideToolbar: () => void;
118
+ changeLayoutMode: (mode: LayoutMode) => void;
119
+ leaveSession: () => void;
120
+ endSession: () => void;
121
+ toggleToolbar: (show?: boolean) => void;
122
+ requestToggleAudio: (userId: UserId, shouldMute?: boolean) => void;
123
+ requestMute: (userId: UserId) => void;
124
+ requestUnmute: (userId: UserId) => void;
125
+ removeUser: (userId: UserId) => void;
126
+ listUsers: () => User[];
127
+ get roomState(): RoomState;
128
+ get localUser(): User;
129
+ showCaptions: () => void;
130
+ hideCaptions: () => void;
131
+ toggleCaptions: (show?: boolean) => void;
132
+ configureCaptions: (options: Partial<CaptionsOptions>) => void;
133
+ raiseHand: () => void;
134
+ lowerHand: (target?: UserId) => void;
135
+ allowBroadcast: (userId: UserId) => void;
136
+ disallowBroadcast: (userId: UserId) => void;
137
+ allowScreenshare: (userId: UserId) => void;
138
+ disallowScreenshare: (userId: UserId) => void;
139
+ }
140
+ export {};
package/dist/cjs/types.js CHANGED
@@ -1,8 +1,2 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LayoutMode = void 0;
4
- var LayoutMode;
5
- (function (LayoutMode) {
6
- LayoutMode["tiled"] = "tiled";
7
- LayoutMode["auto"] = "auto";
8
- })(LayoutMode = exports.LayoutMode || (exports.LayoutMode = {}));
@@ -0,0 +1,13 @@
1
+ import { CheckPermissionsOptions, HasPermissionsOptions, LookupPermissionOptions, PermissionsMap, RefinePermissionsOptions } from './types';
2
+ import { PermissionTypes } from '../vars';
3
+ import { EmbeddedInstance } from '../../types';
4
+ export declare class PermissionManager {
5
+ parent: EmbeddedInstance;
6
+ permissionsMap: PermissionsMap;
7
+ constructor(parent: EmbeddedInstance);
8
+ lookupDynamicPermission: (permission: PermissionTypes, dynamicPermissions: PermissionTypes[] | undefined) => boolean;
9
+ lookupPermission: (options: LookupPermissionOptions) => boolean;
10
+ checkPermissions: ({ permissions, targetRole, permissionsMap, role, dynamicPermissions, }: CheckPermissionsOptions) => boolean;
11
+ refinePermissions: (permissions: PermissionTypes | PermissionTypes[], { targetRole, role, userId, users, permissionsMap, localUser }: RefinePermissionsOptions) => boolean;
12
+ hasPermissions: (permissions: PermissionTypes | PermissionTypes[], { targetRole, role, userId }?: HasPermissionsOptions) => boolean;
13
+ }
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PermissionManager = void 0;
4
+ class PermissionManager {
5
+ constructor(parent) {
6
+ this.permissionsMap = {};
7
+ this.lookupDynamicPermission = (permission, dynamicPermissions) => {
8
+ if (!dynamicPermissions) {
9
+ return false;
10
+ }
11
+ return dynamicPermissions.includes(permission);
12
+ };
13
+ this.lookupPermission = (options) => {
14
+ const { permissionsMap, permission, targetRole, role, dynamicPermissions } = options;
15
+ if (dynamicPermissions) {
16
+ const granted = this.lookupDynamicPermission(permission, dynamicPermissions);
17
+ if (granted) {
18
+ return true;
19
+ }
20
+ }
21
+ if (permissionsMap[role][permission]) {
22
+ return true;
23
+ }
24
+ return Boolean(permissionsMap[role][`${permission}_${targetRole}`]);
25
+ };
26
+ this.checkPermissions = ({ permissions, targetRole, permissionsMap, role, dynamicPermissions, }) => {
27
+ if (Array.isArray(permissions)) {
28
+ return permissions.some((permission) => this.lookupPermission({ permission, targetRole, role, permissionsMap, dynamicPermissions }));
29
+ }
30
+ return this.lookupPermission({
31
+ permission: permissions,
32
+ targetRole,
33
+ role,
34
+ permissionsMap,
35
+ dynamicPermissions,
36
+ });
37
+ };
38
+ this.refinePermissions = (permissions, { targetRole, role, userId, users, permissionsMap, localUser }) => {
39
+ const options = {
40
+ permissionsMap,
41
+ permissions,
42
+ targetRole,
43
+ role: localUser.role,
44
+ dynamicPermissions: localUser.dynamicPermissions,
45
+ };
46
+ if (role) {
47
+ options.role = role;
48
+ options.dynamicPermissions = undefined;
49
+ }
50
+ if (userId && users) {
51
+ options.role = users[userId].role;
52
+ options.dynamicPermissions = users[userId].dynamicPermissions;
53
+ }
54
+ return this.checkPermissions(options);
55
+ };
56
+ this.hasPermissions = (permissions, { targetRole, role, userId } = {}) => {
57
+ const users = this.parent.stored.users;
58
+ const localUser = this.parent.localUser;
59
+ if (!localUser) {
60
+ return false;
61
+ }
62
+ return this.refinePermissions(permissions, {
63
+ permissionsMap: this.permissionsMap,
64
+ role,
65
+ targetRole,
66
+ users,
67
+ userId,
68
+ localUser,
69
+ });
70
+ };
71
+ this.parent = parent;
72
+ }
73
+ }
74
+ exports.PermissionManager = PermissionManager;
@@ -0,0 +1,23 @@
1
+ import { User, UserId } from '../../types';
2
+ import { PermissionTypes } from '../vars';
3
+ export type PermissionsMap = Record<string, Record<string, boolean>>;
4
+ export interface HasPermissionsOptions {
5
+ targetRole?: string;
6
+ role?: string;
7
+ userId?: UserId;
8
+ }
9
+ export interface RefinePermissionsOptions extends HasPermissionsOptions {
10
+ permissionsMap: PermissionsMap;
11
+ localUser: User;
12
+ users?: Record<UserId, User>;
13
+ }
14
+ export interface LookupPermissionOptions {
15
+ permissionsMap: PermissionsMap;
16
+ permission: PermissionTypes;
17
+ role: string;
18
+ targetRole?: string;
19
+ dynamicPermissions?: PermissionTypes[];
20
+ }
21
+ export interface CheckPermissionsOptions extends Omit<LookupPermissionOptions, 'permission'> {
22
+ permissions: PermissionTypes | PermissionTypes[];
23
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1 @@
1
+ export declare const createWatchedProxy: <G>(initialState: G, onChange: (newState: G) => void) => any;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createWatchedProxy = void 0;
4
+ const createHandler = (onChange) => {
5
+ const handler = {
6
+ get(target, key) {
7
+ if (typeof target[key] === 'object' && target[key] !== null) {
8
+ return new Proxy(target[key], handler);
9
+ }
10
+ return target[key];
11
+ },
12
+ set(target, prop, value) {
13
+ target[prop] = value;
14
+ onChange(target);
15
+ return target;
16
+ },
17
+ };
18
+ return handler;
19
+ };
20
+ const createWatchedProxy = (initialState, onChange) => new Proxy(initialState, createHandler(onChange));
21
+ exports.createWatchedProxy = createWatchedProxy;
@@ -0,0 +1,23 @@
1
+ import { Stored } from '../types';
2
+ export declare const CONNECT_TIMEOUT = 10000;
3
+ export declare const internalEvents: Record<string, boolean>;
4
+ export declare enum LayoutMode {
5
+ tiled = "tiled",
6
+ auto = "auto"
7
+ }
8
+ export declare enum PermissionTypes {
9
+ broadcast = "broadcast",
10
+ manageBroadcast = "manage_broadcast",
11
+ endSession = "end_session",
12
+ startSession = "start_session",
13
+ removeParticipant = "remove_participant",
14
+ screenshare = "screenshare",
15
+ manageScreenshare = "manage_screenshare",
16
+ recording = "recording",
17
+ generalChat = "general_chat",
18
+ remoteMuting = "remote_muting",
19
+ askRemoteUnmute = "ask_remote_unmute",
20
+ raiseHand = "raise_hand",
21
+ manageRoles = "manage_roles"
22
+ }
23
+ export declare const defaultStoredState: Stored;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultStoredState = exports.PermissionTypes = exports.LayoutMode = exports.internalEvents = exports.CONNECT_TIMEOUT = void 0;
4
+ exports.CONNECT_TIMEOUT = 10000;
5
+ exports.internalEvents = {
6
+ roomJoined: true,
7
+ };
8
+ var LayoutMode;
9
+ (function (LayoutMode) {
10
+ LayoutMode["tiled"] = "tiled";
11
+ LayoutMode["auto"] = "auto";
12
+ })(LayoutMode = exports.LayoutMode || (exports.LayoutMode = {}));
13
+ var PermissionTypes;
14
+ (function (PermissionTypes) {
15
+ PermissionTypes["broadcast"] = "broadcast";
16
+ PermissionTypes["manageBroadcast"] = "manage_broadcast";
17
+ PermissionTypes["endSession"] = "end_session";
18
+ PermissionTypes["startSession"] = "start_session";
19
+ PermissionTypes["removeParticipant"] = "remove_participant";
20
+ PermissionTypes["screenshare"] = "screenshare";
21
+ PermissionTypes["manageScreenshare"] = "manage_screenshare";
22
+ PermissionTypes["recording"] = "recording";
23
+ PermissionTypes["generalChat"] = "general_chat";
24
+ PermissionTypes["remoteMuting"] = "remote_muting";
25
+ PermissionTypes["askRemoteUnmute"] = "ask_remote_unmute";
26
+ PermissionTypes["raiseHand"] = "raise_hand";
27
+ PermissionTypes["manageRoles"] = "manage_roles";
28
+ })(PermissionTypes = exports.PermissionTypes || (exports.PermissionTypes = {}));
29
+ exports.defaultStoredState = {
30
+ userId: '',
31
+ roomState: {
32
+ media: {
33
+ micEnabled: false,
34
+ cameraEnabled: false,
35
+ },
36
+ layout: {
37
+ mode: LayoutMode.tiled,
38
+ showToolbar: true,
39
+ toolbarPosition: 'left',
40
+ },
41
+ captionsState: {
42
+ showCaptions: false,
43
+ spokenLanguage: 'en',
44
+ fontSize: 'medium',
45
+ },
46
+ },
47
+ users: {},
48
+ };
@@ -1,23 +1,35 @@
1
1
  /// <reference types="node" />
2
- import { InitOptions, InstanceProperties, LayoutMode, UserId } from './types';
3
2
  import EventEmitter from 'events';
4
- export declare class DigitalSambaEmbedded extends EventEmitter {
3
+ import { PermissionManager } from './utils/PermissionManager';
4
+ import { LayoutMode } from './utils/vars';
5
+ import { CaptionsOptions, EmbeddedInstance, InitialRoomSettings, InitOptions, InstanceProperties, Stored, UserId } from './types';
6
+ export declare class DigitalSambaEmbedded extends EventEmitter implements EmbeddedInstance {
5
7
  initOptions: Partial<InitOptions>;
8
+ roomSettings: Partial<InitialRoomSettings>;
6
9
  savedIframeSrc: string;
7
10
  allowedOrigin: string;
8
11
  connected: boolean;
9
12
  frame: HTMLIFrameElement;
10
13
  reportErrors: boolean;
14
+ stored: Stored;
15
+ permissionManager: PermissionManager;
11
16
  constructor(options?: Partial<InitOptions>, instanceProperties?: Partial<InstanceProperties>, loadImmediately?: boolean);
12
17
  static createControl: (initOptions: InitOptions) => DigitalSambaEmbedded;
13
18
  private mountFrame;
14
19
  load: (instanceProperties?: InstanceProperties) => void;
15
20
  private onMessage;
21
+ private setupInternalEventListeners;
22
+ private _emit;
23
+ private handleInternalMessage;
24
+ private emitUsersUpdated;
25
+ private emitRoomStateUpdated;
16
26
  private setFrameSrc;
17
27
  private checkTarget;
18
28
  private sendMessage;
19
29
  private logError;
20
30
  private applyFrameProperties;
31
+ get roomState(): import("./types").RoomState;
32
+ get localUser(): import("./types").User;
21
33
  enableVideo: () => void;
22
34
  disableVideo: () => void;
23
35
  toggleVideo: (enable?: boolean) => void;
@@ -37,4 +49,16 @@ export declare class DigitalSambaEmbedded extends EventEmitter {
37
49
  requestToggleAudio: (userId: UserId, shouldMute?: boolean) => void;
38
50
  requestMute: (userId: UserId) => void;
39
51
  requestUnmute: (userId: UserId) => void;
52
+ removeUser: (userId: UserId) => void;
53
+ listUsers: () => import("./types").User[];
54
+ showCaptions: () => void;
55
+ hideCaptions: () => void;
56
+ toggleCaptions: (show?: boolean) => void;
57
+ configureCaptions: (options: Partial<CaptionsOptions>) => void;
58
+ raiseHand: () => void;
59
+ lowerHand: (target?: UserId) => void;
60
+ allowBroadcast: (userId: UserId) => void;
61
+ disallowBroadcast: (userId: UserId) => void;
62
+ allowScreenshare: (userId: UserId) => void;
63
+ disallowScreenshare: (userId: UserId) => void;
40
64
  }