@digitalsamba/embedded-sdk 0.0.13 → 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 +1 -0
  2. package/dist/cjs/index.d.ts +16 -3
  3. package/dist/cjs/index.js +120 -14
  4. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  5. package/dist/cjs/types.d.ts +89 -15
  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 +16 -3
  16. package/dist/esm/index.js +118 -12
  17. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  18. package/dist/esm/types.d.ts +89 -15
  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 +98 -3
  29. package/dist/initial-config-demo.html +303 -0
  30. package/dist/permissions-demo.html +289 -0
  31. package/dist/types/index.d.ts +16 -3
  32. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  33. package/dist/types/types.d.ts +89 -15
  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
@@ -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,14 +1,18 @@
1
1
  /// <reference types="node" />
2
- import { InitOptions, InstanceProperties, LayoutMode, UserId, CaptionsOptions } 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;
11
- private stored;
14
+ stored: Stored;
15
+ permissionManager: PermissionManager;
12
16
  constructor(options?: Partial<InitOptions>, instanceProperties?: Partial<InstanceProperties>, loadImmediately?: boolean);
13
17
  static createControl: (initOptions: InitOptions) => DigitalSambaEmbedded;
14
18
  private mountFrame;
@@ -18,11 +22,14 @@ export declare class DigitalSambaEmbedded extends EventEmitter {
18
22
  private _emit;
19
23
  private handleInternalMessage;
20
24
  private emitUsersUpdated;
25
+ private emitRoomStateUpdated;
21
26
  private setFrameSrc;
22
27
  private checkTarget;
23
28
  private sendMessage;
24
29
  private logError;
25
30
  private applyFrameProperties;
31
+ get roomState(): import("./types").RoomState;
32
+ get localUser(): import("./types").User;
26
33
  enableVideo: () => void;
27
34
  disableVideo: () => void;
28
35
  toggleVideo: (enable?: boolean) => void;
@@ -48,4 +55,10 @@ export declare class DigitalSambaEmbedded extends EventEmitter {
48
55
  hideCaptions: () => void;
49
56
  toggleCaptions: (show?: boolean) => void;
50
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;
51
64
  }
package/dist/esm/index.js CHANGED
@@ -1,22 +1,20 @@
1
1
  var _a;
2
- import { ALLOW_ATTRIBUTE_MISSING, INVALID_CONFIG, INVALID_URL, UNKNOWN_TARGET, } from './utils/errors';
3
2
  import EventEmitter from 'events';
4
- const CONNECT_TIMEOUT = 10000;
5
- const internalEvents = {
6
- roomJoined: true,
7
- };
3
+ import { PermissionManager } from './utils/PermissionManager';
4
+ import { CONNECT_TIMEOUT, defaultStoredState, internalEvents, } from './utils/vars';
5
+ import { createWatchedProxy } from './utils/proxy';
6
+ import { ALLOW_ATTRIBUTE_MISSING, INVALID_CONFIG, INVALID_URL, UNKNOWN_TARGET, } from './utils/errors';
8
7
  export class DigitalSambaEmbedded extends EventEmitter {
9
8
  constructor(options = {}, instanceProperties = {}, loadImmediately = true) {
10
9
  super();
10
+ this.roomSettings = {};
11
11
  this.savedIframeSrc = '';
12
12
  this.allowedOrigin = '*';
13
13
  this.connected = false;
14
14
  this.frame = document.createElement('iframe');
15
15
  this.reportErrors = false;
16
- this.stored = {
17
- users: {},
18
- localUserPermissions: {},
19
- };
16
+ this.stored = Object.assign({}, defaultStoredState);
17
+ this.permissionManager = new PermissionManager(this);
20
18
  this.mountFrame = (loadImmediately) => {
21
19
  const { url, frame, root } = this.initOptions;
22
20
  if (root) {
@@ -74,6 +72,9 @@ export class DigitalSambaEmbedded extends EventEmitter {
74
72
  this.on('userJoined', (event) => {
75
73
  const { user, type } = event.data;
76
74
  this.stored.users[user.id] = Object.assign(Object.assign({}, user), { kind: type });
75
+ if (type === 'local') {
76
+ this.stored.userId = user.id;
77
+ }
77
78
  this.emitUsersUpdated();
78
79
  });
79
80
  this.on('userLeft', (event) => {
@@ -84,7 +85,58 @@ export class DigitalSambaEmbedded extends EventEmitter {
84
85
  this.emitUsersUpdated();
85
86
  });
86
87
  this.on('permissionsChanged', (event) => {
87
- this.stored.localUserPermissions = Object.assign(Object.assign({}, this.stored.localUserPermissions), (event.data || {}));
88
+ if (this.stored.users[this.stored.userId]) {
89
+ let modifiedPermissions = [
90
+ ...(this.stored.users[this.stored.userId].dynamicPermissions || []),
91
+ ];
92
+ Object.entries(event.data).forEach(([permission, enabled]) => {
93
+ if (enabled && !modifiedPermissions.includes(permission)) {
94
+ modifiedPermissions.push(permission);
95
+ }
96
+ if (!enabled) {
97
+ modifiedPermissions = modifiedPermissions.filter((userPermission) => userPermission !== permission);
98
+ }
99
+ });
100
+ this.stored.users[this.stored.userId].dynamicPermissions =
101
+ modifiedPermissions;
102
+ }
103
+ });
104
+ this.on('activeSpeakerChanged', (event) => {
105
+ var _b, _c;
106
+ this.stored.activeSpeaker = (_c = (_b = event.data) === null || _b === void 0 ? void 0 : _b.user) === null || _c === void 0 ? void 0 : _c.id;
107
+ });
108
+ this.on('videoEnabled', (event) => {
109
+ var _b;
110
+ if (((_b = event.data) === null || _b === void 0 ? void 0 : _b.type) === 'local') {
111
+ this.stored.roomState.media.cameraEnabled = true;
112
+ }
113
+ });
114
+ this.on('videoDisabled', (event) => {
115
+ var _b;
116
+ if (((_b = event.data) === null || _b === void 0 ? void 0 : _b.type) === 'local') {
117
+ this.stored.roomState.media.cameraEnabled = false;
118
+ }
119
+ });
120
+ this.on('audioEnabled', (event) => {
121
+ var _b;
122
+ if (((_b = event.data) === null || _b === void 0 ? void 0 : _b.type) === 'local') {
123
+ this.stored.roomState.media.micEnabled = true;
124
+ }
125
+ });
126
+ this.on('audioDisabled', (event) => {
127
+ var _b;
128
+ if (((_b = event.data) === null || _b === void 0 ? void 0 : _b.type) === 'local') {
129
+ this.stored.roomState.media.micEnabled = false;
130
+ }
131
+ });
132
+ this.on('layoutModeChanged', (event) => {
133
+ this.stored.roomState.layout.mode = event.data.mode;
134
+ });
135
+ this.on('captionsSpokenLanguageChanged', (event) => {
136
+ this.stored.roomState.captionsState.spokenLanguage = event.data.language;
137
+ });
138
+ this.on('captionsFontSizeChanged', (event) => {
139
+ this.stored.roomState.captionsState.fontSize = event.data.fontSize;
88
140
  });
89
141
  };
90
142
  this._emit = (eventName, ...args) => {
@@ -95,8 +147,14 @@ export class DigitalSambaEmbedded extends EventEmitter {
95
147
  const message = event.DSPayload;
96
148
  switch (message.type) {
97
149
  case 'roomJoined': {
98
- this.stored.users = message.data.users;
150
+ const { users, roomState, activeSpeaker, permissionsMap } = message.data;
151
+ this.stored.users = Object.assign(Object.assign({}, this.stored.users), users);
152
+ this.stored.roomState = createWatchedProxy(Object.assign({}, roomState), this.emitRoomStateUpdated);
153
+ this.stored.activeSpeaker = activeSpeaker;
154
+ this.permissionManager.permissionsMap = permissionsMap;
99
155
  this.emitUsersUpdated();
156
+ this.emitRoomStateUpdated();
157
+ this._emit('roomJoined', { type: 'roomJoined' });
100
158
  break;
101
159
  }
102
160
  default: {
@@ -107,6 +165,9 @@ export class DigitalSambaEmbedded extends EventEmitter {
107
165
  this.emitUsersUpdated = () => {
108
166
  this._emit('usersUpdated', { type: 'usersUpdated', data: { users: this.listUsers() } });
109
167
  };
168
+ this.emitRoomStateUpdated = () => {
169
+ this._emit('roomStateUpdated', { type: 'roomStateUpdated', data: { state: this.roomState } });
170
+ };
110
171
  this.setFrameSrc = () => {
111
172
  let url = this.savedIframeSrc;
112
173
  const { team, room, token } = this.initOptions;
@@ -152,9 +213,11 @@ export class DigitalSambaEmbedded extends EventEmitter {
152
213
  };
153
214
  // commands
154
215
  this.enableVideo = () => {
216
+ this.roomSettings.cameraEnabled = true;
155
217
  this.sendMessage({ type: 'enableVideo' });
156
218
  };
157
219
  this.disableVideo = () => {
220
+ this.roomSettings.cameraEnabled = false;
158
221
  this.sendMessage({ type: 'disableVideo' });
159
222
  };
160
223
  this.toggleVideo = (enable) => {
@@ -169,9 +232,11 @@ export class DigitalSambaEmbedded extends EventEmitter {
169
232
  }
170
233
  };
171
234
  this.enableAudio = () => {
235
+ this.roomSettings.micEnabled = true;
172
236
  this.sendMessage({ type: 'enableAudio' });
173
237
  };
174
238
  this.disableAudio = () => {
239
+ this.roomSettings.micEnabled = false;
175
240
  this.sendMessage({ type: 'disableAudio' });
176
241
  };
177
242
  this.toggleAudio = (enable) => {
@@ -198,12 +263,17 @@ export class DigitalSambaEmbedded extends EventEmitter {
198
263
  this.sendMessage({ type: 'stopRecording' });
199
264
  };
200
265
  this.showToolbar = () => {
266
+ this.roomSettings.showToolbar = true;
267
+ this.stored.roomState.layout.showToolbar = true;
201
268
  this.sendMessage({ type: 'showToolbar' });
202
269
  };
203
270
  this.hideToolbar = () => {
271
+ this.roomSettings.showToolbar = false;
272
+ this.stored.roomState.layout.showToolbar = false;
204
273
  this.sendMessage({ type: 'hideToolbar' });
205
274
  };
206
275
  this.changeLayoutMode = (mode) => {
276
+ this.roomSettings.layoutMode = mode;
207
277
  this.sendMessage({ type: 'changeLayoutMode', data: mode });
208
278
  };
209
279
  this.leaveSession = () => {
@@ -214,6 +284,7 @@ export class DigitalSambaEmbedded extends EventEmitter {
214
284
  };
215
285
  this.toggleToolbar = (show) => {
216
286
  if (typeof show === 'undefined') {
287
+ this.stored.roomState.layout.showToolbar = !this.stored.roomState.layout.showToolbar;
217
288
  this.sendMessage({ type: 'toggleToolbar' });
218
289
  }
219
290
  else if (show) {
@@ -245,13 +316,19 @@ export class DigitalSambaEmbedded extends EventEmitter {
245
316
  };
246
317
  this.listUsers = () => Object.values(this.stored.users);
247
318
  this.showCaptions = () => {
319
+ this.roomSettings.showCaptions = true;
320
+ this.stored.roomState.captionsState.showCaptions = true;
248
321
  this.sendMessage({ type: 'showCaptions' });
249
322
  };
250
323
  this.hideCaptions = () => {
324
+ this.roomSettings.showCaptions = false;
325
+ this.stored.roomState.captionsState.showCaptions = false;
251
326
  this.sendMessage({ type: 'hideCaptions' });
252
327
  };
253
328
  this.toggleCaptions = (show) => {
254
329
  if (typeof show === 'undefined') {
330
+ this.stored.roomState.captionsState.showCaptions =
331
+ !this.stored.roomState.captionsState.showCaptions;
255
332
  this.sendMessage({ type: 'toggleCaptions' });
256
333
  }
257
334
  else if (show) {
@@ -264,7 +341,26 @@ export class DigitalSambaEmbedded extends EventEmitter {
264
341
  this.configureCaptions = (options) => {
265
342
  this.sendMessage({ type: 'configureCaptions', data: options || {} });
266
343
  };
344
+ this.raiseHand = () => {
345
+ this.sendMessage({ type: 'raiseHand' });
346
+ };
347
+ this.lowerHand = (target) => {
348
+ this.sendMessage({ type: 'lowerHand', data: target });
349
+ };
350
+ this.allowBroadcast = (userId) => {
351
+ this.sendMessage({ type: 'allowBroadcast', data: userId });
352
+ };
353
+ this.disallowBroadcast = (userId) => {
354
+ this.sendMessage({ type: 'disallowBroadcast', data: userId });
355
+ };
356
+ this.allowScreenshare = (userId) => {
357
+ this.sendMessage({ type: 'allowScreenshare', data: userId });
358
+ };
359
+ this.disallowScreenshare = (userId) => {
360
+ this.sendMessage({ type: 'disallowScreenshare', data: userId });
361
+ };
267
362
  this.initOptions = options;
363
+ this.roomSettings = options.roomSettings || {};
268
364
  this.reportErrors = instanceProperties.reportErrors || false;
269
365
  this.frame.allow = 'camera; microphone; display-capture; autoplay;';
270
366
  this.frame.setAttribute('allowFullscreen', 'true');
@@ -279,7 +375,7 @@ export class DigitalSambaEmbedded extends EventEmitter {
279
375
  this.setupInternalEventListeners();
280
376
  }
281
377
  checkTarget() {
282
- this.sendMessage({ type: 'connect' });
378
+ this.sendMessage({ type: 'connect', data: this.roomSettings || {} });
283
379
  const confirmationTimeout = window.setTimeout(() => {
284
380
  this.logError(UNKNOWN_TARGET);
285
381
  }, CONNECT_TIMEOUT);
@@ -290,11 +386,21 @@ export class DigitalSambaEmbedded extends EventEmitter {
290
386
  }
291
387
  sendMessage(message) {
292
388
  if (this.frame.contentWindow) {
389
+ if (!this.connected && message.type !== 'connect') {
390
+ return;
391
+ }
293
392
  this.frame.contentWindow.postMessage(message, {
294
393
  targetOrigin: this.allowedOrigin,
295
394
  });
296
395
  }
297
396
  }
397
+ // getters
398
+ get roomState() {
399
+ return this.stored.roomState;
400
+ }
401
+ get localUser() {
402
+ return this.stored.users[this.stored.userId];
403
+ }
298
404
  }
299
405
  _a = DigitalSambaEmbedded;
300
406
  DigitalSambaEmbedded.createControl = (initOptions) => new _a(initOptions, {}, false);