@signalwire/js 3.10.2 → 3.10.3-dev.202204201745.05bb3c3.0

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 (69) hide show
  1. package/dist/core/src/BaseComponent.d.ts.map +1 -1
  2. package/dist/core/src/BaseSession.d.ts +1 -1
  3. package/dist/core/src/BaseSession.d.ts.map +1 -1
  4. package/dist/core/src/memberPosition/workers.d.ts +1 -1
  5. package/dist/core/src/memberPosition/workers.d.ts.map +1 -1
  6. package/dist/core/src/redux/features/session/sessionSaga.d.ts.map +1 -1
  7. package/dist/core/src/redux/interfaces.d.ts +2 -2
  8. package/dist/core/src/redux/interfaces.d.ts.map +1 -1
  9. package/dist/core/src/redux/rootSaga.d.ts +3 -3
  10. package/dist/core/src/redux/rootSaga.d.ts.map +1 -1
  11. package/dist/core/src/types/cantina.d.ts +30 -28
  12. package/dist/core/src/types/cantina.d.ts.map +1 -1
  13. package/dist/core/src/types/index.d.ts +14 -2
  14. package/dist/core/src/types/index.d.ts.map +1 -1
  15. package/dist/core/src/types/messaging.d.ts +10 -0
  16. package/dist/core/src/types/messaging.d.ts.map +1 -1
  17. package/dist/core/src/types/videoRoomSession.d.ts +2 -0
  18. package/dist/core/src/types/videoRoomSession.d.ts.map +1 -1
  19. package/dist/core/src/utils/constants.d.ts +5 -2
  20. package/dist/core/src/utils/constants.d.ts.map +1 -1
  21. package/dist/core/src/utils/eventTransformUtils.d.ts +1 -15
  22. package/dist/core/src/utils/eventTransformUtils.d.ts.map +1 -1
  23. package/dist/core/src/utils/interfaces.d.ts +28 -2
  24. package/dist/core/src/utils/interfaces.d.ts.map +1 -1
  25. package/dist/core/src/utils/toExternalJSON.d.ts.map +1 -1
  26. package/dist/index.esm.js +156 -54
  27. package/dist/index.esm.js.map +3 -3
  28. package/dist/index.js +173 -71
  29. package/dist/index.js.map +3 -3
  30. package/dist/index.umd.js +2 -2
  31. package/dist/index.umd.js.map +1 -1
  32. package/dist/js/src/BaseRoomSession.d.ts.map +1 -1
  33. package/dist/js/src/Client.d.ts +4 -3
  34. package/dist/js/src/Client.d.ts.map +1 -1
  35. package/dist/js/src/JWTSession.d.ts.map +1 -1
  36. package/dist/js/src/RoomSession.d.ts.map +1 -1
  37. package/dist/js/src/RoomSession.docs.d.ts +15 -0
  38. package/dist/js/src/RoomSession.docs.d.ts.map +1 -1
  39. package/dist/js/src/cantina/VideoManager.d.ts +15 -0
  40. package/dist/js/src/cantina/VideoManager.d.ts.map +1 -0
  41. package/dist/js/src/cantina/index.d.ts +1 -1
  42. package/dist/js/src/cantina/index.d.ts.map +1 -1
  43. package/dist/js/src/cantina/workers.d.ts +4 -0
  44. package/dist/js/src/cantina/workers.d.ts.map +1 -0
  45. package/dist/js/src/createRoomObject.d.ts.map +1 -1
  46. package/dist/js/src/features/mediaElements/mediaElementsSagas.d.ts.map +1 -1
  47. package/dist/js/src/testUtils.d.ts +1 -0
  48. package/dist/js/src/testUtils.d.ts.map +1 -1
  49. package/dist/js/src/utils/videoElement.d.ts +13 -6
  50. package/dist/js/src/utils/videoElement.d.ts.map +1 -1
  51. package/dist/js/tsconfig.build.tsbuildinfo +1 -1
  52. package/package.json +3 -3
  53. package/src/BaseRoomSession.ts +46 -1
  54. package/src/Client.ts +7 -6
  55. package/src/RoomSession.docs.ts +15 -0
  56. package/src/RoomSession.test.ts +3 -0
  57. package/src/RoomSession.ts +3 -0
  58. package/src/cantina/VideoManager.test.ts +97 -0
  59. package/src/cantina/VideoManager.ts +109 -0
  60. package/src/cantina/index.ts +1 -1
  61. package/src/cantina/workers.ts +28 -0
  62. package/src/createRoomObject.ts +29 -2
  63. package/src/features/mediaElements/mediaElementsSagas.ts +43 -6
  64. package/src/testUtils.ts +1 -0
  65. package/src/utils/videoElement.ts +20 -24
  66. package/dist/js/src/cantina/Cantina.d.ts +0 -14
  67. package/dist/js/src/cantina/Cantina.d.ts.map +0 -1
  68. package/src/cantina/Cantina.test.ts +0 -92
  69. package/src/cantina/Cantina.ts +0 -93
package/dist/index.js CHANGED
@@ -89,13 +89,13 @@ __export(chat_exports, {
89
89
  ChatMessage: () => ChatMessage,
90
90
  Client: () => Client2
91
91
  });
92
- var import_core13 = require("@signalwire/core");
92
+ var import_core14 = require("@signalwire/core");
93
93
 
94
94
  // src/createClient.ts
95
- var import_core12 = require("@signalwire/core");
95
+ var import_core13 = require("@signalwire/core");
96
96
 
97
97
  // src/Client.ts
98
- var import_core10 = require("@signalwire/core");
98
+ var import_core11 = require("@signalwire/core");
99
99
 
100
100
  // src/features/mediaElements/mediaElementsSagas.ts
101
101
  var import_core3 = require("@signalwire/core");
@@ -103,7 +103,7 @@ var import_webrtc = require("@signalwire/webrtc");
103
103
 
104
104
  // src/utils/videoElement.ts
105
105
  var import_core = require("@signalwire/core");
106
- var _addSDKPrefix = (input) => {
106
+ var addSDKPrefix = (input) => {
107
107
  return `sw-sdk-${input}`;
108
108
  };
109
109
  var buildVideo = () => {
@@ -149,38 +149,34 @@ var _buildLayer = ({ location }) => {
149
149
  layer.style.height = height;
150
150
  return layer;
151
151
  };
152
- var makeLayoutChangedHandler = ({
153
- layerMap,
154
- rootElement
155
- }) => (_0) => __async(void 0, [_0], function* ({ layout, myMemberId, localStream }) {
152
+ var makeLayoutChangedHandler = ({ localOverlay, rootElement }) => (_0) => __async(void 0, [_0], function* ({ layout, myMemberId, localStream }) {
156
153
  (0, import_core.getLogger)().debug("Process layout.changed");
157
154
  try {
158
155
  const { layers = [] } = layout;
159
156
  const location = layers.find(({ member_id }) => member_id === myMemberId);
160
- const myLayerKey = _addSDKPrefix(myMemberId);
161
- let myLayer = layerMap.get(myLayerKey);
157
+ let myLayer = localOverlay.domElement;
162
158
  if (!location) {
163
159
  (0, import_core.getLogger)().debug("Location not found");
164
160
  if (myLayer) {
165
161
  (0, import_core.getLogger)().debug("Current layer not visible");
166
- myLayer.style.display = "none";
162
+ localOverlay.hide();
167
163
  }
168
164
  return;
169
165
  }
170
166
  if (!myLayer) {
171
167
  (0, import_core.getLogger)().debug("Build myLayer");
172
168
  myLayer = _buildLayer({ location });
173
- myLayer.id = myLayerKey;
169
+ myLayer.id = localOverlay.id;
174
170
  const localVideo = buildVideo();
175
171
  localVideo.srcObject = localStream;
176
172
  localVideo.style.width = "100%";
177
173
  localVideo.style.height = "100%";
178
174
  myLayer.appendChild(localVideo);
179
175
  const mcuLayers = rootElement.querySelector(".mcuLayers");
180
- const exists = document.getElementById(myLayerKey);
176
+ const exists = mcuLayers == null ? void 0 : mcuLayers.querySelector(`#${myLayer.id}`);
181
177
  if (mcuLayers && !exists) {
182
178
  mcuLayers.appendChild(myLayer);
183
- layerMap.set(myLayerKey, myLayer);
179
+ localOverlay.domElement = myLayer;
184
180
  }
185
181
  return;
186
182
  }
@@ -197,14 +193,6 @@ var makeLayoutChangedHandler = ({
197
193
  (0, import_core.getLogger)().error("Layout Changed Error", error);
198
194
  }
199
195
  });
200
- var makeDisplayChangeFn = (display) => {
201
- return (domId) => {
202
- const el = document.getElementById(_addSDKPrefix(domId));
203
- if (el) {
204
- el.style.display = display;
205
- }
206
- };
207
- };
208
196
  var cleanupElement = (rootElement) => {
209
197
  while (rootElement.firstChild) {
210
198
  rootElement.removeChild(rootElement.firstChild);
@@ -252,12 +240,39 @@ var makeVideoElementSaga = ({
252
240
  try {
253
241
  const layerMap = /* @__PURE__ */ new Map();
254
242
  const videoEl = buildVideo();
243
+ const localOverlay = {
244
+ get id() {
245
+ return addSDKPrefix(room.memberId);
246
+ },
247
+ get domElement() {
248
+ return layerMap.get(this.id);
249
+ },
250
+ set domElement(element) {
251
+ if (element) {
252
+ (0, import_core3.getLogger)().debug("Set localOverlay", element);
253
+ layerMap.set(this.id, element);
254
+ } else {
255
+ (0, import_core3.getLogger)().debug("Remove localOverlay");
256
+ layerMap.delete(this.id);
257
+ }
258
+ },
259
+ hide() {
260
+ if (!this.domElement) {
261
+ return (0, import_core3.getLogger)().warn("Missing localOverlay to hide");
262
+ }
263
+ this.domElement.style.display = "none";
264
+ },
265
+ show() {
266
+ if (!this.domElement) {
267
+ return (0, import_core3.getLogger)().warn("Missing localOverlay to show");
268
+ }
269
+ this.domElement.style.display = "block";
270
+ }
271
+ };
255
272
  const layoutChangedHandler = makeLayoutChangedHandler({
256
273
  rootElement,
257
- layerMap
274
+ localOverlay
258
275
  });
259
- const hideOverlay = makeDisplayChangeFn("none");
260
- const showOverlay = makeDisplayChangeFn("block");
261
276
  room.on("layout.changed", (params) => {
262
277
  (0, import_core3.getLogger)().debug("Received layout.changed");
263
278
  if (room.peer.hasVideoSender && room.localStream) {
@@ -272,7 +287,7 @@ var makeVideoElementSaga = ({
272
287
  try {
273
288
  const { member } = params;
274
289
  if (member.id === room.memberId && "video_muted" in member) {
275
- member.video_muted ? hideOverlay(member.id) : showOverlay(member.id);
290
+ member.video_muted ? localOverlay.hide() : localOverlay.show();
276
291
  }
277
292
  } catch (error) {
278
293
  (0, import_core3.getLogger)().error("Error handling video_muted", error);
@@ -621,6 +636,44 @@ var RoomSessionConnection = class extends import_webrtc4.BaseConnection {
621
636
  }
622
637
  getEmitterTransforms() {
623
638
  return /* @__PURE__ */ new Map([
639
+ [
640
+ ["video.room.joined"],
641
+ {
642
+ type: "roomSession",
643
+ instanceFactory: (payload) => {
644
+ return payload;
645
+ },
646
+ payloadTransform: (payload) => {
647
+ return payload;
648
+ },
649
+ nestedFieldsToProcess: () => {
650
+ return [
651
+ {
652
+ eventTransformType: "roomSessionPlayback",
653
+ process: (transformedPayload, instanceFactory) => {
654
+ var _a, _b;
655
+ if ((_b = (_a = transformedPayload.room_session) == null ? void 0 : _a.playbacks) == null ? void 0 : _b.length) {
656
+ transformedPayload.room_session.playbacks = transformedPayload.room_session.playbacks.map(instanceFactory);
657
+ }
658
+ return transformedPayload;
659
+ },
660
+ processInstancePayload: (payload) => ({ member: payload })
661
+ },
662
+ {
663
+ eventTransformType: "roomSessionRecording",
664
+ process: (transformedPayload, instanceFactory) => {
665
+ var _a, _b;
666
+ if ((_b = (_a = transformedPayload.room_session) == null ? void 0 : _a.recordings) == null ? void 0 : _b.length) {
667
+ transformedPayload.room_session.recordings = transformedPayload.room_session.recordings.map(instanceFactory);
668
+ }
669
+ return transformedPayload;
670
+ },
671
+ processInstancePayload: (payload) => ({ recording: payload })
672
+ }
673
+ ];
674
+ }
675
+ }
676
+ ],
624
677
  [
625
678
  [
626
679
  (0, import_core8.toLocalEvent)("video.recording.start"),
@@ -668,7 +721,9 @@ var RoomSessionConnection = class extends import_webrtc4.BaseConnection {
668
721
  ]);
669
722
  }
670
723
  getCompoundEvents() {
671
- return new Map([...import_core8.MemberPosition.MEMBER_POSITION_COMPOUND_EVENTS]);
724
+ return new Map([
725
+ ...import_core8.MemberPosition.MEMBER_POSITION_COMPOUND_EVENTS
726
+ ]);
672
727
  }
673
728
  attachPreConnectWorkers() {
674
729
  this.setWorker("memberListUpdated", {
@@ -864,59 +919,83 @@ var createBaseRoomSessionObject = (params) => {
864
919
  return room;
865
920
  };
866
921
 
867
- // src/cantina/Cantina.ts
922
+ // src/cantina/VideoManager.ts
923
+ var import_core10 = require("@signalwire/core");
924
+
925
+ // src/cantina/workers.ts
868
926
  var import_core9 = require("@signalwire/core");
869
- var CantinaAPI = class extends import_core9.BaseConsumer {
870
- constructor() {
871
- super(...arguments);
872
- __publicField(this, "_eventsPrefix", "cantina-manager");
927
+ var videoManagerWorker = function* (options) {
928
+ (0, import_core9.getLogger)().trace("videoManagerWorker started");
929
+ const { channels } = options;
930
+ const { swEventChannel, pubSubChannel } = channels;
931
+ while (true) {
932
+ const action = yield import_core9.sagaEffects.take(swEventChannel, (action2) => {
933
+ return action2.type.startsWith("video-manager.");
934
+ });
935
+ yield import_core9.sagaEffects.put(pubSubChannel, action);
936
+ }
937
+ };
938
+
939
+ // src/cantina/VideoManager.ts
940
+ var VideoManagerAPI = class extends import_core10.BaseConsumer {
941
+ constructor(options) {
942
+ super(options);
943
+ __publicField(this, "_eventsPrefix", "video-manager");
944
+ this.setWorker("videoManagerWorker", {
945
+ worker: videoManagerWorker
946
+ });
947
+ this.attachWorkers();
873
948
  }
874
949
  getEmitterTransforms() {
875
950
  return /* @__PURE__ */ new Map([
876
951
  [
877
- ["cantina-manager.rooms.subscribed"],
952
+ ["video-manager.rooms.subscribed"],
878
953
  {
879
954
  type: "roomSession",
880
- instanceFactory: ({ rooms }) => ({
881
- rooms: rooms.map((row) => (0, import_core9.toExternalJSON)(row))
955
+ instanceFactory: ({
956
+ rooms
957
+ }) => ({
958
+ rooms: rooms.map((row) => (0, import_core10.toExternalJSON)(row))
882
959
  }),
883
- payloadTransform: ({ rooms }) => ({
884
- rooms: rooms.map((row) => (0, import_core9.toExternalJSON)(row))
960
+ payloadTransform: ({
961
+ rooms
962
+ }) => ({
963
+ rooms: rooms.map((row) => (0, import_core10.toExternalJSON)(row))
885
964
  })
886
965
  }
887
966
  ],
888
967
  [
889
968
  [
890
- "cantina-manager.room.started",
891
- "cantina-manager.room.added",
892
- "cantina-manager.room.updated",
893
- "cantina-manager.room.ended",
894
- "cantina-manager.room.deleted"
969
+ "video-manager.room.started",
970
+ "video-manager.room.added",
971
+ "video-manager.room.updated",
972
+ "video-manager.room.ended",
973
+ "video-manager.room.deleted"
895
974
  ],
896
975
  {
897
976
  type: "roomSession",
898
- instanceFactory: (payload) => (0, import_core9.toExternalJSON)(payload),
899
- payloadTransform: (payload) => (0, import_core9.toExternalJSON)(payload)
977
+ instanceFactory: (payload) => (0, import_core10.toExternalJSON)(payload),
978
+ payloadTransform: (payload) => (0, import_core10.toExternalJSON)(payload)
900
979
  }
901
980
  ]
902
981
  ]);
903
982
  }
904
983
  };
905
- var createCantinaObject = (params) => {
906
- const cantina = (0, import_core9.connect)({
984
+ var createVideoManagerObject = (params) => {
985
+ const manager = (0, import_core10.connect)({
907
986
  store: params.store,
908
- Component: CantinaAPI,
987
+ Component: VideoManagerAPI,
909
988
  componentListeners: {
910
989
  errors: "onError",
911
990
  responses: "onSuccess"
912
991
  }
913
992
  })(params);
914
- const proxy = new Proxy(cantina, {
993
+ const proxy = new Proxy(manager, {
915
994
  get(target, property, receiver) {
916
995
  if (property === "_eventsNamespace") {
917
996
  return "";
918
997
  } else if (property === "eventChannel") {
919
- return "cantina-manager.rooms";
998
+ return "video-manager.rooms";
920
999
  }
921
1000
  return Reflect.get(target, property, receiver);
922
1001
  }
@@ -925,10 +1004,10 @@ var createCantinaObject = (params) => {
925
1004
  };
926
1005
 
927
1006
  // src/Client.ts
928
- var ClientAPI = class extends import_core10.BaseClient {
1007
+ var ClientAPI = class extends import_core11.BaseClient {
929
1008
  constructor() {
930
1009
  super(...arguments);
931
- __publicField(this, "_cantina");
1010
+ __publicField(this, "_videoManager");
932
1011
  __publicField(this, "_chat");
933
1012
  }
934
1013
  get rooms() {
@@ -988,44 +1067,44 @@ var ClientAPI = class extends import_core10.BaseClient {
988
1067
  }
989
1068
  get chat() {
990
1069
  if (!this._chat) {
991
- this._chat = import_core10.Chat.createBaseChatObject({
1070
+ this._chat = import_core11.Chat.createBaseChatObject({
992
1071
  store: this.store,
993
1072
  emitter: this.options.emitter
994
1073
  });
995
1074
  }
996
1075
  return this._chat;
997
1076
  }
998
- get cantina() {
999
- if (!this._cantina) {
1000
- this._cantina = createCantinaObject(this.options);
1077
+ get videoManager() {
1078
+ if (!this._videoManager) {
1079
+ this._videoManager = createVideoManagerObject(this.options);
1001
1080
  }
1002
- return this._cantina;
1081
+ return this._videoManager;
1003
1082
  }
1004
1083
  reauthenticate(token) {
1005
- this.store.dispatch(import_core10.actions.reauthAction({ token }));
1084
+ this.store.dispatch(import_core11.actions.reauthAction({ token }));
1006
1085
  }
1007
1086
  };
1008
1087
 
1009
1088
  // src/JWTSession.ts
1010
- var import_core11 = require("@signalwire/core");
1011
- var JWTSession = class extends import_core11.BaseJWTSession {
1089
+ var import_core12 = require("@signalwire/core");
1090
+ var JWTSession = class extends import_core12.BaseJWTSession {
1012
1091
  constructor() {
1013
1092
  super(...arguments);
1014
1093
  __publicField(this, "WebSocketConstructor", WebSocket);
1015
- __publicField(this, "agent", "@signalwire/js/3.10.2");
1094
+ __publicField(this, "agent", "@signalwire/js/3.10.3-dev.202204201745.05bb3c3.0");
1016
1095
  }
1017
1096
  };
1018
1097
 
1019
1098
  // src/createClient.ts
1020
1099
  var createClient = (userOptions) => {
1021
1100
  const baseUserOptions = __spreadProps(__spreadValues({}, userOptions), {
1022
- emitter: (0, import_core12.getEventEmitter)()
1101
+ emitter: (0, import_core13.getEventEmitter)()
1023
1102
  });
1024
- const store = (0, import_core12.configureStore)({
1103
+ const store = (0, import_core13.configureStore)({
1025
1104
  userOptions: baseUserOptions,
1026
1105
  SessionConstructor: JWTSession
1027
1106
  });
1028
- const client = (0, import_core12.connect)({
1107
+ const client = (0, import_core13.connect)({
1029
1108
  store,
1030
1109
  Component: ClientAPI,
1031
1110
  componentListeners: {
@@ -1065,8 +1144,8 @@ var Client2 = function(chatOptions) {
1065
1144
  };
1066
1145
 
1067
1146
  // src/chat/index.ts
1068
- var ChatMember = import_core13.Chat.ChatMember;
1069
- var ChatMessage = import_core13.Chat.ChatMessage;
1147
+ var ChatMember = import_core14.Chat.ChatMember;
1148
+ var ChatMessage = import_core14.Chat.ChatMessage;
1070
1149
 
1071
1150
  // src/video.ts
1072
1151
  var video_exports = {};
@@ -1078,7 +1157,7 @@ __export(video_exports, {
1078
1157
  });
1079
1158
 
1080
1159
  // src/createRoomObject.ts
1081
- var import_core14 = require("@signalwire/core");
1160
+ var import_core15 = require("@signalwire/core");
1082
1161
  var VIDEO_CONSTRAINTS = {
1083
1162
  aspectRatio: { ideal: 16 / 9 }
1084
1163
  };
@@ -1117,10 +1196,10 @@ var createRoomObject = (roomOptions) => {
1117
1196
  rootElement = el;
1118
1197
  } else {
1119
1198
  rootElement = document.body;
1120
- (0, import_core14.getLogger)().warn(`We couldn't find an element with id: ${rootElementId}: using 'document.body' instead.`);
1199
+ (0, import_core15.getLogger)().warn(`We couldn't find an element with id: ${rootElementId}: using 'document.body' instead.`);
1121
1200
  }
1122
1201
  }
1123
- const room = client.rooms.makeRoomObject({
1202
+ const roomObject = client.rooms.makeRoomObject({
1124
1203
  audio,
1125
1204
  video: video === true ? VIDEO_CONSTRAINTS : video,
1126
1205
  negotiateAudio: true,
@@ -1132,9 +1211,31 @@ var createRoomObject = (roomOptions) => {
1132
1211
  stopMicrophoneWhileMuted,
1133
1212
  speakerId
1134
1213
  });
1135
- room.once("destroy", () => {
1214
+ roomObject.once("destroy", () => {
1136
1215
  client.disconnect();
1137
1216
  });
1217
+ const join = () => {
1218
+ return new Promise((resolve2, reject2) => __async(void 0, null, function* () {
1219
+ try {
1220
+ roomObject.once("room.subscribed", (_payload) => {
1221
+ resolve2(roomObject);
1222
+ });
1223
+ yield roomObject.join();
1224
+ } catch (error) {
1225
+ (0, import_core15.getLogger)().error("Join", error);
1226
+ client.disconnect();
1227
+ reject2(error);
1228
+ }
1229
+ }));
1230
+ };
1231
+ const room = new Proxy(roomObject, {
1232
+ get(target, prop, receiver) {
1233
+ if (prop === "join") {
1234
+ return join;
1235
+ }
1236
+ return Reflect.get(target, prop, receiver);
1237
+ }
1238
+ });
1138
1239
  if (autoJoin) {
1139
1240
  try {
1140
1241
  yield room.join();
@@ -1156,7 +1257,7 @@ var joinRoom = (roomOptions) => {
1156
1257
  };
1157
1258
 
1158
1259
  // src/RoomSession.ts
1159
- var import_core15 = require("@signalwire/core");
1260
+ var import_core16 = require("@signalwire/core");
1160
1261
  var VIDEO_CONSTRAINTS2 = {
1161
1262
  aspectRatio: { ideal: 16 / 9 }
1162
1263
  };
@@ -1237,7 +1338,8 @@ var RoomSession = function(roomOptions) {
1237
1338
  });
1238
1339
  yield room.join();
1239
1340
  } catch (error) {
1240
- (0, import_core15.getLogger)().error("RoomSession Join", error);
1341
+ (0, import_core16.getLogger)().error("RoomSession Join", error);
1342
+ client.disconnect();
1241
1343
  reject(error);
1242
1344
  }
1243
1345
  }));