@whereby.com/core 0.26.0 → 0.27.1

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.
package/dist/index.cjs CHANGED
@@ -23,6 +23,37 @@ function createAppAuthorizedThunk(authorizationSelector, thunk) {
23
23
  return thunk(payload)(dispatch, getState, extra);
24
24
  });
25
25
  }
26
+ function createRoomConnectedThunk(thunk) {
27
+ return createAppThunk((payload) => (dispatch, getState, extra) => {
28
+ const connectionStatus = getState().roomConnection.status;
29
+ if (connectionStatus !== "connected") {
30
+ console.warn("Action cannot be performed outside of a connected room");
31
+ return false;
32
+ }
33
+ return thunk(payload)(dispatch, getState, extra);
34
+ });
35
+ }
36
+ function createAsyncRoomConnectedThunk(typePrefix, payloadCreator) {
37
+ return createAppAsyncThunk(typePrefix, (arg, thunkApi) => {
38
+ const { getState } = thunkApi;
39
+ const connectionStatus = getState().roomConnection.status;
40
+ if (connectionStatus !== "connected") {
41
+ console.warn("Action cannot be performed outside of a connected room");
42
+ return Promise.reject("Action cannot be performed outside of a connected room");
43
+ }
44
+ return payloadCreator(arg, thunkApi);
45
+ });
46
+ }
47
+ function createAuthorizedRoomConnectedThunk(authorizationSelector, thunk) {
48
+ return createAppThunk((payload) => (dispatch, getState, extra) => {
49
+ const connectionStatus = getState().roomConnection.status;
50
+ if (connectionStatus !== "connected") {
51
+ console.warn("Action cannot be performed outside of a connected room");
52
+ return false;
53
+ }
54
+ return createAppAuthorizedThunk(authorizationSelector, thunk)(payload)(dispatch, getState, extra);
55
+ });
56
+ }
26
57
 
27
58
  const listenerMiddleware = toolkit.createListenerMiddleware();
28
59
  const startAppListening = listenerMiddleware.startListening;
@@ -45,7 +76,7 @@ const createReactor = (selectors, callback) => {
45
76
  });
46
77
  };
47
78
 
48
- const coreVersion = "0.26.0";
79
+ const coreVersion = "0.27.1";
49
80
 
50
81
  const initialState$g = {
51
82
  isNodeSdk: false,
@@ -110,6 +141,7 @@ const signalEvents = {
110
141
  spotlightRemoved: createSignalEventAction("spotlightRemoved"),
111
142
  streamingStopped: createSignalEventAction("streamingStopped"),
112
143
  videoEnabled: createSignalEventAction("videoEnabled"),
144
+ videoEnableRequested: createSignalEventAction("videoEnableRequested"),
113
145
  liveTranscriptionStarted: createSignalEventAction("liveTranscriptionStarted"),
114
146
  liveTranscriptionStopped: createSignalEventAction("liveTranscriptionStopped"),
115
147
  };
@@ -117,6 +149,7 @@ const signalEvents = {
117
149
  const ROOM_ACTION_PERMISSIONS_BY_ROLE = {
118
150
  canLockRoom: ["host"],
119
151
  canRequestAudioEnable: ["host"],
152
+ canRequestVideoEnable: ["host"],
120
153
  canKickClient: ["host"],
121
154
  canEndMeeting: ["host"],
122
155
  canAskToSpeak: ["host"],
@@ -150,6 +183,7 @@ const selectRoomKey = (state) => state.authorization.roomKey;
150
183
  const selectAuthorizationRoleName = (state) => state.authorization.roleName;
151
184
  const selectIsAuthorizedToLockRoom = toolkit.createSelector(selectAuthorizationRoleName, (localParticipantRole) => ROOM_ACTION_PERMISSIONS_BY_ROLE.canLockRoom.includes(localParticipantRole));
152
185
  const selectIsAuthorizedToRequestAudioEnable = toolkit.createSelector(selectAuthorizationRoleName, (localParticipantRole) => ROOM_ACTION_PERMISSIONS_BY_ROLE.canRequestAudioEnable.includes(localParticipantRole));
186
+ const selectIsAuthorizedToRequestVideoEnable = toolkit.createSelector(selectAuthorizationRoleName, (localParticipantRole) => ROOM_ACTION_PERMISSIONS_BY_ROLE.canRequestVideoEnable.includes(localParticipantRole));
153
187
  const selectIsAuthorizedToKickClient = toolkit.createSelector(selectAuthorizationRoleName, (localParticipantRole) => ROOM_ACTION_PERMISSIONS_BY_ROLE.canKickClient.includes(localParticipantRole));
154
188
  const selectIsAuthorizedToEndMeeting = toolkit.createSelector(selectAuthorizationRoleName, (localParticipantRole) => ROOM_ACTION_PERMISSIONS_BY_ROLE.canEndMeeting.includes(localParticipantRole));
155
189
  const selectIsAuthorizedToAskToSpeak = toolkit.createSelector(selectAuthorizationRoleName, (localParticipantRole) => ROOM_ACTION_PERMISSIONS_BY_ROLE.canAskToSpeak.includes(localParticipantRole));
@@ -270,6 +304,7 @@ function forwardSocketEvents(socket, dispatch) {
270
304
  socket.on("spotlight_removed", (payload) => dispatch(signalEvents.spotlightRemoved(payload)));
271
305
  socket.on("live_transcription_started", (payload) => dispatch(signalEvents.liveTranscriptionStarted(payload)));
272
306
  socket.on("live_transcription_stopped", (payload) => dispatch(signalEvents.liveTranscriptionStopped(payload)));
307
+ socket.on("video_enable_requested", (payload) => dispatch(signalEvents.videoEnableRequested(payload)));
273
308
  }
274
309
  const SIGNAL_BASE_URL = "wss://signal.appearin.net" ;
275
310
  function createSocket() {
@@ -410,7 +445,7 @@ const chatSlice = toolkit.createSlice({
410
445
  });
411
446
  },
412
447
  });
413
- const doSendChatMessage = createAppThunk((payload) => (_, getState) => {
448
+ const doSendChatMessage = createRoomConnectedThunk((payload) => (_, getState) => {
414
449
  const state = getState();
415
450
  const socket = selectSignalConnectionRaw(state).socket;
416
451
  socket === null || socket === void 0 ? void 0 : socket.emit("chat_message", { text: payload.text });
@@ -455,7 +490,7 @@ const cloudRecordingSlice = toolkit.createSlice({
455
490
  },
456
491
  });
457
492
  const { recordingRequestStarted } = cloudRecordingSlice.actions;
458
- const doStartCloudRecording = createAppThunk(() => (dispatch, getState) => {
493
+ const doStartCloudRecording = createRoomConnectedThunk(() => (dispatch, getState) => {
459
494
  const state = getState();
460
495
  const socket = selectSignalConnectionRaw(state).socket;
461
496
  const status = selectCloudRecordingStatus(state);
@@ -467,7 +502,7 @@ const doStartCloudRecording = createAppThunk(() => (dispatch, getState) => {
467
502
  });
468
503
  dispatch(recordingRequestStarted());
469
504
  });
470
- const doStopCloudRecording = createAppThunk(() => (dispatch, getState) => {
505
+ const doStopCloudRecording = createRoomConnectedThunk(() => (dispatch, getState) => {
471
506
  const state = getState();
472
507
  const socket = selectSignalConnectionRaw(state).socket;
473
508
  socket === null || socket === void 0 ? void 0 : socket.emit("stop_recording");
@@ -1111,6 +1146,15 @@ startAppListening({
1111
1146
  }
1112
1147
  },
1113
1148
  });
1149
+ startAppListening({
1150
+ actionCreator: signalEvents.videoEnableRequested,
1151
+ effect: ({ payload }, { dispatch }) => {
1152
+ const { enable } = payload;
1153
+ if (!enable) {
1154
+ dispatch(toggleCameraEnabled({ enabled: false }));
1155
+ }
1156
+ },
1157
+ });
1114
1158
 
1115
1159
  const NON_PERSON_ROLES = ["recorder", "streamer"];
1116
1160
 
@@ -1131,7 +1175,7 @@ const localParticipantSlice = toolkit.createSlice({
1131
1175
  name: "localParticipant",
1132
1176
  initialState: initialState$a,
1133
1177
  reducers: {
1134
- doSetDisplayName: (state, action) => {
1178
+ setDisplayName: (state, action) => {
1135
1179
  return Object.assign(Object.assign({}, state), { displayName: action.payload.displayName });
1136
1180
  },
1137
1181
  },
@@ -1155,8 +1199,17 @@ const localParticipantSlice = toolkit.createSlice({
1155
1199
  });
1156
1200
  },
1157
1201
  });
1158
- const { doSetDisplayName } = localParticipantSlice.actions;
1159
- const doEnableAudio = createAppAsyncThunk("localParticipant/doEnableAudio", (payload, { dispatch, getState }) => __awaiter(void 0, void 0, void 0, function* () {
1202
+ const { setDisplayName } = localParticipantSlice.actions;
1203
+ const doSetDisplayName = createRoomConnectedThunk((payload) => (dispatch, getState) => {
1204
+ const state = getState();
1205
+ const socket = selectSignalConnectionRaw(state).socket;
1206
+ socket === null || socket === void 0 ? void 0 : socket.emit("send_client_metadata", {
1207
+ type: "UserData",
1208
+ payload: { displayName: payload.displayName },
1209
+ });
1210
+ dispatch(setDisplayName({ displayName: payload.displayName }));
1211
+ });
1212
+ const doEnableAudio = createAsyncRoomConnectedThunk("localParticipant/doEnableAudio", (payload, { dispatch, getState }) => __awaiter(void 0, void 0, void 0, function* () {
1160
1213
  const state = getState();
1161
1214
  const socket = selectSignalConnectionRaw(state).socket;
1162
1215
  socket === null || socket === void 0 ? void 0 : socket.emit("enable_audio", { enabled: payload.enabled });
@@ -1165,13 +1218,13 @@ const doEnableAudio = createAppAsyncThunk("localParticipant/doEnableAudio", (pay
1165
1218
  }
1166
1219
  return payload.enabled;
1167
1220
  }));
1168
- const doEnableVideo = createAppAsyncThunk("localParticipant/doEnableVideo", (payload, { getState }) => __awaiter(void 0, void 0, void 0, function* () {
1221
+ const doEnableVideo = createAsyncRoomConnectedThunk("localParticipant/doEnableVideo", (payload, { getState }) => __awaiter(void 0, void 0, void 0, function* () {
1169
1222
  const state = getState();
1170
1223
  const socket = selectSignalConnectionRaw(state).socket;
1171
1224
  socket === null || socket === void 0 ? void 0 : socket.emit("enable_video", { enabled: payload.enabled });
1172
1225
  return payload.enabled;
1173
1226
  }));
1174
- const doSetLocalStickyReaction = createAppAsyncThunk("localParticipant/doSetLocalStickyReaction", (payload, { getState, rejectWithValue }) => __awaiter(void 0, void 0, void 0, function* () {
1227
+ const doSetLocalStickyReaction = createAsyncRoomConnectedThunk("localParticipant/doSetLocalStickyReaction", (payload, { getState, rejectWithValue }) => __awaiter(void 0, void 0, void 0, function* () {
1175
1228
  var _a;
1176
1229
  const state = getState();
1177
1230
  const currentStickyReaction = selectLocalParticipantStickyReaction(state);
@@ -1183,7 +1236,7 @@ const doSetLocalStickyReaction = createAppAsyncThunk("localParticipant/doSetLoca
1183
1236
  const stickyReaction = enabled ? { reaction: "✋", timestamp: new Date().toISOString() } : null;
1184
1237
  return stickyReaction;
1185
1238
  }));
1186
- const doSendClientMetadata = createAppThunk(() => (_, getState) => {
1239
+ const doSendClientMetadata = createRoomConnectedThunk(() => (_, getState) => {
1187
1240
  const state = getState();
1188
1241
  const socket = selectSignalConnectionRaw(state).socket;
1189
1242
  const payload = {
@@ -1585,7 +1638,7 @@ const remoteParticipantsSlice = toolkit.createSlice({
1585
1638
  },
1586
1639
  });
1587
1640
  const { participantStreamAdded, participantStreamIdAdded, streamStatusUpdated } = remoteParticipantsSlice.actions;
1588
- const doRequestAudioEnable = createAppAuthorizedThunk((state) => selectIsAuthorizedToRequestAudioEnable(state), (payload) => (_, getState) => {
1641
+ const doRequestAudioEnable = createAuthorizedRoomConnectedThunk((state) => selectIsAuthorizedToRequestAudioEnable(state), (payload) => (_, getState) => {
1589
1642
  const state = getState();
1590
1643
  const canEnableRemoteAudio = selectIsAuthorizedToAskToSpeak(state);
1591
1644
  if (payload.enable && !canEnableRemoteAudio) {
@@ -1595,6 +1648,11 @@ const doRequestAudioEnable = createAppAuthorizedThunk((state) => selectIsAuthori
1595
1648
  const socket = selectSignalConnectionRaw(state).socket;
1596
1649
  socket === null || socket === void 0 ? void 0 : socket.emit("request_audio_enable", payload);
1597
1650
  });
1651
+ const doRequestVideoEnable = createAuthorizedRoomConnectedThunk((state) => selectIsAuthorizedToRequestVideoEnable(state), (payload) => (_, getState) => {
1652
+ const state = getState();
1653
+ const socket = selectSignalConnectionRaw(state).socket;
1654
+ socket === null || socket === void 0 ? void 0 : socket.emit("request_video_enable", payload);
1655
+ });
1598
1656
  const selectRemoteParticipantsRaw = (state) => state.remoteParticipants;
1599
1657
  const selectRemoteClients = (state) => state.remoteParticipants.remoteParticipants;
1600
1658
  const selectRemoteParticipants = toolkit.createSelector(selectRemoteClients, (clients) => clients.filter((c) => !NON_PERSON_ROLES.includes(c.roleName)));
@@ -1632,7 +1690,7 @@ const localScreenshareSlice = toolkit.createSlice({
1632
1690
  },
1633
1691
  });
1634
1692
  const { stopScreenshare } = localScreenshareSlice.actions;
1635
- const doStartScreenshare = createAppAsyncThunk("localScreenshare/doStartScreenshare", (_, { dispatch, getState, rejectWithValue }) => __awaiter(void 0, void 0, void 0, function* () {
1693
+ const doStartScreenshare = createAsyncRoomConnectedThunk("localScreenshare/doStartScreenshare", (_, { dispatch, getState, rejectWithValue }) => __awaiter(void 0, void 0, void 0, function* () {
1636
1694
  var _a;
1637
1695
  try {
1638
1696
  const state = getState();
@@ -1656,7 +1714,7 @@ const doStartScreenshare = createAppAsyncThunk("localScreenshare/doStartScreensh
1656
1714
  return rejectWithValue(error);
1657
1715
  }
1658
1716
  }));
1659
- const doStopScreenshare = createAppThunk(() => (dispatch, getState) => {
1717
+ const doStopScreenshare = createRoomConnectedThunk(() => (dispatch, getState) => {
1660
1718
  const state = getState();
1661
1719
  const screenshareStream = selectLocalScreenshareStream(state);
1662
1720
  if (!screenshareStream) {
@@ -2282,6 +2340,28 @@ startAppListening({
2282
2340
  })));
2283
2341
  },
2284
2342
  });
2343
+ startAppListening({
2344
+ actionCreator: signalEvents.videoEnableRequested,
2345
+ effect: ({ payload }, { dispatch, getState }) => {
2346
+ const { enable, requestedByClientId } = payload;
2347
+ const state = getState();
2348
+ const client = selectRemoteParticipants(state).find(({ id }) => id === requestedByClientId);
2349
+ if (!client) {
2350
+ console.warn("Could not find remote client that requested a local video change");
2351
+ return;
2352
+ }
2353
+ dispatch(doSetNotification(createNotificationEvent({
2354
+ type: enable ? "requestVideoEnable" : "requestVideoDisable",
2355
+ message: enable
2356
+ ? `${client.displayName} has requested for you to start video`
2357
+ : `${client.displayName} has stopped your video`,
2358
+ props: {
2359
+ client,
2360
+ enable,
2361
+ },
2362
+ })));
2363
+ },
2364
+ });
2285
2365
  startAppListening({
2286
2366
  actionCreator: signalEvents.clientMetadataReceived,
2287
2367
  effect: (action, { dispatch, getOriginalState, getState }) => {
@@ -2390,7 +2470,7 @@ const rtcAnalyticsCustomEvents = {
2390
2470
  getOutput: () => ({}),
2391
2471
  },
2392
2472
  displayName: {
2393
- actions: [doSetDisplayName],
2473
+ actions: [setDisplayName],
2394
2474
  rtcEventName: "displayName",
2395
2475
  getValue: (state) => selectAppDisplayName(state),
2396
2476
  getOutput: (value) => ({ displayName: value }),
@@ -2691,7 +2771,7 @@ const waitingParticipantsSlice = toolkit.createSlice({
2691
2771
  });
2692
2772
  },
2693
2773
  });
2694
- const doAcceptWaitingParticipant = createAppThunk((payload) => (dispatch, getState) => {
2774
+ const doAcceptWaitingParticipant = createRoomConnectedThunk((payload) => (dispatch, getState) => {
2695
2775
  const { participantId } = payload;
2696
2776
  const state = getState();
2697
2777
  const socket = selectSignalConnectionSocket(state);
@@ -2701,7 +2781,7 @@ const doAcceptWaitingParticipant = createAppThunk((payload) => (dispatch, getSta
2701
2781
  response: {},
2702
2782
  });
2703
2783
  });
2704
- const doRejectWaitingParticipant = createAppThunk((payload) => (dispatch, getState) => {
2784
+ const doRejectWaitingParticipant = createRoomConnectedThunk((payload) => (dispatch, getState) => {
2705
2785
  const { participantId } = payload;
2706
2786
  const state = getState();
2707
2787
  const socket = selectSignalConnectionSocket(state);
@@ -3805,7 +3885,10 @@ exports.connectionMonitorStopped = connectionMonitorStopped;
3805
3885
  exports.createAppAsyncThunk = createAppAsyncThunk;
3806
3886
  exports.createAppAuthorizedThunk = createAppAuthorizedThunk;
3807
3887
  exports.createAppThunk = createAppThunk;
3888
+ exports.createAsyncRoomConnectedThunk = createAsyncRoomConnectedThunk;
3889
+ exports.createAuthorizedRoomConnectedThunk = createAuthorizedRoomConnectedThunk;
3808
3890
  exports.createReactor = createReactor;
3891
+ exports.createRoomConnectedThunk = createRoomConnectedThunk;
3809
3892
  exports.createServices = createServices;
3810
3893
  exports.createStore = createStore;
3811
3894
  exports.createWebRtcEmitter = createWebRtcEmitter;
@@ -3835,6 +3918,7 @@ exports.doOrganizationFetch = doOrganizationFetch;
3835
3918
  exports.doRejectWaitingParticipant = doRejectWaitingParticipant;
3836
3919
  exports.doRemoveSpotlight = doRemoveSpotlight;
3837
3920
  exports.doRequestAudioEnable = doRequestAudioEnable;
3921
+ exports.doRequestVideoEnable = doRequestVideoEnable;
3838
3922
  exports.doRtcAnalyticsCustomEventsInitialize = doRtcAnalyticsCustomEventsInitialize;
3839
3923
  exports.doRtcManagerCreated = doRtcManagerCreated;
3840
3924
  exports.doRtcManagerInitialize = doRtcManagerInitialize;
@@ -3933,6 +4017,7 @@ exports.selectIsAuthorizedToEndMeeting = selectIsAuthorizedToEndMeeting;
3933
4017
  exports.selectIsAuthorizedToKickClient = selectIsAuthorizedToKickClient;
3934
4018
  exports.selectIsAuthorizedToLockRoom = selectIsAuthorizedToLockRoom;
3935
4019
  exports.selectIsAuthorizedToRequestAudioEnable = selectIsAuthorizedToRequestAudioEnable;
4020
+ exports.selectIsAuthorizedToRequestVideoEnable = selectIsAuthorizedToRequestVideoEnable;
3936
4021
  exports.selectIsAuthorizedToSpotlight = selectIsAuthorizedToSpotlight;
3937
4022
  exports.selectIsCameraEnabled = selectIsCameraEnabled;
3938
4023
  exports.selectIsCloudRecording = selectIsCloudRecording;
@@ -4018,6 +4103,7 @@ exports.selectWaitingParticipantsRaw = selectWaitingParticipantsRaw;
4018
4103
  exports.setCurrentCameraDeviceId = setCurrentCameraDeviceId;
4019
4104
  exports.setCurrentMicrophoneDeviceId = setCurrentMicrophoneDeviceId;
4020
4105
  exports.setCurrentSpeakerDeviceId = setCurrentSpeakerDeviceId;
4106
+ exports.setDisplayName = setDisplayName;
4021
4107
  exports.setLocalMediaOptions = setLocalMediaOptions;
4022
4108
  exports.setLocalMediaStream = setLocalMediaStream;
4023
4109
  exports.setRoomKey = setRoomKey;