@signalwire/js 3.23.3 → 3.23.4

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 (175) hide show
  1. package/dist/core/src/BaseClient.d.ts.map +1 -1
  2. package/dist/core/src/BaseComponent.d.ts +8 -114
  3. package/dist/core/src/BaseComponent.d.ts.map +1 -1
  4. package/dist/core/src/BaseConsumer.d.ts +2 -2
  5. package/dist/core/src/BaseConsumer.d.ts.map +1 -1
  6. package/dist/core/src/BaseSession.d.ts.map +1 -1
  7. package/dist/core/src/RPCMessages/RPCConnect.d.ts +1 -0
  8. package/dist/core/src/RPCMessages/RPCConnect.d.ts.map +1 -1
  9. package/dist/core/src/chat/BaseChat.d.ts +5 -6
  10. package/dist/core/src/chat/BaseChat.d.ts.map +1 -1
  11. package/dist/core/src/chat/workers/chatWorker.d.ts.map +1 -1
  12. package/dist/core/src/index.d.ts +4 -5
  13. package/dist/core/src/index.d.ts.map +1 -1
  14. package/dist/core/src/memberPosition/workers.d.ts +1 -1
  15. package/dist/core/src/memberPosition/workers.d.ts.map +1 -1
  16. package/dist/core/src/pubSub/BasePubSub.d.ts +8 -9
  17. package/dist/core/src/pubSub/BasePubSub.d.ts.map +1 -1
  18. package/dist/core/src/pubSub/workers/pubSubWorker.d.ts.map +1 -1
  19. package/dist/core/src/redux/actions.d.ts +0 -9
  20. package/dist/core/src/redux/actions.d.ts.map +1 -1
  21. package/dist/core/src/redux/features/session/sessionSaga.d.ts +2 -3
  22. package/dist/core/src/redux/features/session/sessionSaga.d.ts.map +1 -1
  23. package/dist/core/src/redux/index.d.ts +1 -0
  24. package/dist/core/src/redux/index.d.ts.map +1 -1
  25. package/dist/core/src/redux/interfaces.d.ts +0 -1
  26. package/dist/core/src/redux/interfaces.d.ts.map +1 -1
  27. package/dist/core/src/redux/rootSaga.d.ts +10 -10
  28. package/dist/core/src/redux/rootSaga.d.ts.map +1 -1
  29. package/dist/core/src/redux/utils/useInstanceMap.d.ts +6 -0
  30. package/dist/core/src/redux/utils/useInstanceMap.d.ts.map +1 -0
  31. package/dist/core/src/redux/utils/useSession.d.ts +16 -0
  32. package/dist/core/src/redux/utils/useSession.d.ts.map +1 -0
  33. package/dist/core/src/rooms/RoomSessionPlayback.d.ts +20 -3
  34. package/dist/core/src/rooms/RoomSessionPlayback.d.ts.map +1 -1
  35. package/dist/core/src/rooms/RoomSessionRecording.d.ts +18 -5
  36. package/dist/core/src/rooms/RoomSessionRecording.d.ts.map +1 -1
  37. package/dist/core/src/rooms/RoomSessionStream.d.ts +19 -5
  38. package/dist/core/src/rooms/RoomSessionStream.d.ts.map +1 -1
  39. package/dist/core/src/rooms/index.d.ts +0 -4
  40. package/dist/core/src/rooms/index.d.ts.map +1 -1
  41. package/dist/core/src/rooms/methods.d.ts +6 -2
  42. package/dist/core/src/rooms/methods.d.ts.map +1 -1
  43. package/dist/core/src/testUtils.d.ts +3 -2
  44. package/dist/core/src/testUtils.d.ts.map +1 -1
  45. package/dist/core/src/types/chat.d.ts +0 -1
  46. package/dist/core/src/types/chat.d.ts.map +1 -1
  47. package/dist/core/src/types/index.d.ts +2 -0
  48. package/dist/core/src/types/index.d.ts.map +1 -1
  49. package/dist/core/src/types/messaging.d.ts +0 -1
  50. package/dist/core/src/types/messaging.d.ts.map +1 -1
  51. package/dist/core/src/types/pubSub.d.ts +0 -1
  52. package/dist/core/src/types/pubSub.d.ts.map +1 -1
  53. package/dist/core/src/types/video.d.ts +8 -7
  54. package/dist/core/src/types/video.d.ts.map +1 -1
  55. package/dist/core/src/types/videoRoomDevice.d.ts +6 -4
  56. package/dist/core/src/types/videoRoomDevice.d.ts.map +1 -1
  57. package/dist/core/src/types/videoRoomSession.d.ts +9 -0
  58. package/dist/core/src/types/videoRoomSession.d.ts.map +1 -1
  59. package/dist/core/src/types/voiceCall.d.ts +16 -5
  60. package/dist/core/src/types/voiceCall.d.ts.map +1 -1
  61. package/dist/core/src/utils/eventUtils.d.ts +2 -0
  62. package/dist/core/src/utils/eventUtils.d.ts.map +1 -0
  63. package/dist/core/src/utils/eventUtils.test.d.ts +2 -0
  64. package/dist/core/src/utils/eventUtils.test.d.ts.map +1 -0
  65. package/dist/core/src/utils/index.d.ts +3 -2
  66. package/dist/core/src/utils/index.d.ts.map +1 -1
  67. package/dist/core/src/utils/interfaces.d.ts +9 -117
  68. package/dist/core/src/utils/interfaces.d.ts.map +1 -1
  69. package/dist/index.esm.js +365 -320
  70. package/dist/index.esm.js.map +3 -3
  71. package/dist/index.js +366 -342
  72. package/dist/index.js.map +3 -3
  73. package/dist/index.umd.js +3 -3
  74. package/dist/index.umd.js.map +1 -1
  75. package/dist/js/src/BaseRoomSession.d.ts +5 -15
  76. package/dist/js/src/BaseRoomSession.d.ts.map +1 -1
  77. package/dist/js/src/Client.d.ts.map +1 -1
  78. package/dist/js/src/RoomSession.d.ts.map +1 -1
  79. package/dist/js/src/cantina/VideoManager.d.ts +4 -5
  80. package/dist/js/src/cantina/VideoManager.d.ts.map +1 -1
  81. package/dist/js/src/cantina/workers/index.d.ts +2 -0
  82. package/dist/js/src/cantina/workers/index.d.ts.map +1 -0
  83. package/dist/js/src/cantina/workers/videoManagerRoomWorker.d.ts +4 -0
  84. package/dist/js/src/cantina/workers/videoManagerRoomWorker.d.ts.map +1 -0
  85. package/dist/js/src/cantina/workers/videoManagerRoomsWorker.d.ts +4 -0
  86. package/dist/js/src/cantina/workers/videoManagerRoomsWorker.d.ts.map +1 -0
  87. package/dist/js/src/cantina/workers/videoManagerWorker.d.ts +7 -0
  88. package/dist/js/src/cantina/workers/videoManagerWorker.d.ts.map +1 -0
  89. package/dist/js/src/createRoomObject.d.ts.map +1 -1
  90. package/dist/js/src/fabric/WSClient.d.ts.map +1 -1
  91. package/dist/js/src/features/mediaElements/mediaElementsSagas.d.ts.map +1 -1
  92. package/dist/js/src/testUtils.d.ts +2 -0
  93. package/dist/js/src/testUtils.d.ts.map +1 -1
  94. package/dist/js/src/utils/interfaces.d.ts +2 -2
  95. package/dist/js/src/utils/interfaces.d.ts.map +1 -1
  96. package/dist/js/src/utils/videoElement.d.ts.map +1 -1
  97. package/dist/js/src/video/childMemberJoinedWorker.d.ts.map +1 -1
  98. package/dist/js/src/video/memberListUpdatedWorker.d.ts.map +1 -1
  99. package/dist/js/src/video/videoPlaybackWorker.d.ts +4 -0
  100. package/dist/js/src/video/videoPlaybackWorker.d.ts.map +1 -0
  101. package/dist/js/src/video/videoRecordWorker.d.ts +4 -0
  102. package/dist/js/src/video/videoRecordWorker.d.ts.map +1 -0
  103. package/dist/js/src/video/videoStreamWorker.d.ts +4 -0
  104. package/dist/js/src/video/videoStreamWorker.d.ts.map +1 -0
  105. package/dist/js/src/video/videoWorker.d.ts +7 -0
  106. package/dist/js/src/video/videoWorker.d.ts.map +1 -0
  107. package/dist/js/src/video/workers.d.ts +1 -1
  108. package/dist/js/src/video/workers.d.ts.map +1 -1
  109. package/dist/js/tsconfig.build.tsbuildinfo +1 -1
  110. package/dist/webrtc/src/BaseConnection.d.ts +4 -5
  111. package/dist/webrtc/src/BaseConnection.d.ts.map +1 -1
  112. package/dist/webrtc/src/RTCPeer.d.ts +1 -1
  113. package/dist/webrtc/src/RTCPeer.d.ts.map +1 -1
  114. package/dist/webrtc/src/workers/roomSubscribedWorker.d.ts.map +1 -1
  115. package/dist/webrtc/src/workers/vertoEventWorker.d.ts.map +1 -1
  116. package/package.json +4 -4
  117. package/src/BaseRoomSession.test.ts +4 -6
  118. package/src/BaseRoomSession.ts +47 -211
  119. package/src/Client.ts +1 -11
  120. package/src/RoomSession.ts +5 -5
  121. package/src/RoomSessionDevice.test.ts +0 -1
  122. package/src/RoomSessionScreenShare.test.ts +0 -1
  123. package/src/cantina/VideoManager.test.ts +0 -2
  124. package/src/cantina/VideoManager.ts +10 -51
  125. package/src/cantina/workers/index.ts +1 -0
  126. package/src/cantina/workers/videoManagerRoomWorker.ts +28 -0
  127. package/src/cantina/workers/videoManagerRoomsWorker.ts +33 -0
  128. package/src/cantina/workers/videoManagerWorker.ts +64 -0
  129. package/src/createRoomObject.ts +0 -1
  130. package/src/fabric/WSClient.ts +1 -2
  131. package/src/features/mediaElements/mediaElementsSagas.ts +7 -3
  132. package/src/utils/interfaces.ts +4 -2
  133. package/src/utils/videoElement.ts +1 -0
  134. package/src/video/childMemberJoinedWorker.test.ts +11 -12
  135. package/src/video/childMemberJoinedWorker.ts +0 -9
  136. package/src/video/memberListUpdatedWorker.ts +15 -15
  137. package/src/video/videoPlaybackWorker.ts +54 -0
  138. package/src/video/videoRecordWorker.ts +54 -0
  139. package/src/video/videoStreamWorker.ts +48 -0
  140. package/src/video/videoWorker.ts +96 -0
  141. package/src/video/workers.ts +1 -1
  142. package/dist/core/src/ApplyEventListeners.d.ts +0 -11
  143. package/dist/core/src/ApplyEventListeners.d.ts.map +0 -1
  144. package/dist/core/src/redux/features/pubSub/pubSubSaga.d.ts +0 -10
  145. package/dist/core/src/redux/features/pubSub/pubSubSaga.d.ts.map +0 -1
  146. package/dist/core/src/redux/features/pubSub/pubSubSaga.test.d.ts +0 -2
  147. package/dist/core/src/redux/features/pubSub/pubSubSaga.test.d.ts.map +0 -1
  148. package/dist/core/src/redux/features/session/sessionSaga.test.d.ts +0 -2
  149. package/dist/core/src/redux/features/session/sessionSaga.test.d.ts.map +0 -1
  150. package/dist/core/src/rooms/RoomSessionRTPlayback.d.ts +0 -47
  151. package/dist/core/src/rooms/RoomSessionRTPlayback.d.ts.map +0 -1
  152. package/dist/core/src/rooms/RoomSessionRTPlayback.test.d.ts +0 -2
  153. package/dist/core/src/rooms/RoomSessionRTPlayback.test.d.ts.map +0 -1
  154. package/dist/core/src/rooms/RoomSessionRTRecording.d.ts +0 -37
  155. package/dist/core/src/rooms/RoomSessionRTRecording.d.ts.map +0 -1
  156. package/dist/core/src/rooms/RoomSessionRTRecording.test.d.ts +0 -2
  157. package/dist/core/src/rooms/RoomSessionRTRecording.test.d.ts.map +0 -1
  158. package/dist/core/src/rooms/RoomSessionRTStream.d.ts +0 -36
  159. package/dist/core/src/rooms/RoomSessionRTStream.d.ts.map +0 -1
  160. package/dist/core/src/rooms/RoomSessionRTStream.test.d.ts +0 -2
  161. package/dist/core/src/rooms/RoomSessionRTStream.test.d.ts.map +0 -1
  162. package/dist/core/src/rooms/methodsRT.d.ts +0 -65
  163. package/dist/core/src/rooms/methodsRT.d.ts.map +0 -1
  164. package/dist/core/src/utils/eventTransformUtils.d.ts +0 -16
  165. package/dist/core/src/utils/eventTransformUtils.d.ts.map +0 -1
  166. package/dist/core/src/utils/eventTransformUtils.test.d.ts +0 -2
  167. package/dist/core/src/utils/eventTransformUtils.test.d.ts.map +0 -1
  168. package/dist/core/src/utils/proxyUtils.d.ts +0 -17
  169. package/dist/core/src/utils/proxyUtils.d.ts.map +0 -1
  170. package/dist/js/src/cantina/workers.d.ts +0 -4
  171. package/dist/js/src/cantina/workers.d.ts.map +0 -1
  172. package/dist/js/src/video/memberPositionWorker.d.ts +0 -3
  173. package/dist/js/src/video/memberPositionWorker.d.ts.map +0 -1
  174. package/src/cantina/workers.ts +0 -28
  175. package/src/video/memberPositionWorker.ts +0 -15
@@ -1,19 +1,15 @@
1
1
  import {
2
2
  BaseComponentOptions,
3
- BaseConsumer,
4
3
  VideoManagerRoomEventNames,
5
- InternalVideoManagerRoomEventNames,
6
4
  connect,
7
5
  ConsumerContract,
8
- EventTransform,
9
- toExternalJSON,
10
6
  VideoManagerRoomEntity,
11
- VideoManagerRoomsSubscribedEventParams,
7
+ validateEventsToSubscribe,
8
+ EventEmitter,
9
+ BaseConsumer,
12
10
  } from '@signalwire/core'
13
11
  import { videoManagerWorker } from './workers'
14
12
 
15
- type EmitterTransformsEvents = InternalVideoManagerRoomEventNames
16
-
17
13
  /** @internal */
18
14
  export type VideoManagerEvents = Record<
19
15
  VideoManagerRoomEventNames,
@@ -25,9 +21,7 @@ export interface VideoManager extends ConsumerContract<VideoManagerEvents> {}
25
21
 
26
22
  /** @internal */
27
23
  export class VideoManagerAPI extends BaseConsumer<VideoManagerEvents> {
28
- protected _eventsPrefix = 'video-manager' as const
29
-
30
- constructor(options: BaseComponentOptions<VideoManagerEvents>) {
24
+ constructor(options: BaseComponentOptions) {
31
25
  super(options)
32
26
 
33
27
  this.runWorker('videoManagerWorker', {
@@ -36,50 +30,15 @@ export class VideoManagerAPI extends BaseConsumer<VideoManagerEvents> {
36
30
  }
37
31
 
38
32
  /** @internal */
39
- getEmitterTransforms() {
40
- return new Map<
41
- EmitterTransformsEvents | EmitterTransformsEvents[],
42
- EventTransform
43
- >([
44
- [
45
- ['video-manager.rooms.subscribed'],
46
- {
47
- type: 'roomSession',
48
- // For now we expose the transformed payload and not a RoomSession
49
- instanceFactory: ({
50
- rooms,
51
- }: VideoManagerRoomsSubscribedEventParams) => ({
52
- rooms: rooms.map((row) => toExternalJSON(row)),
53
- }),
54
- payloadTransform: ({
55
- rooms,
56
- }: VideoManagerRoomsSubscribedEventParams) => ({
57
- rooms: rooms.map((row) => toExternalJSON(row)),
58
- }),
59
- },
60
- ],
61
- [
62
- [
63
- 'video-manager.room.started',
64
- 'video-manager.room.added',
65
- 'video-manager.room.updated',
66
- 'video-manager.room.ended',
67
- 'video-manager.room.deleted',
68
- ],
69
- {
70
- type: 'roomSession',
71
- // For now we expose the transformed payload and not a RoomSession
72
- instanceFactory: (payload) => toExternalJSON(payload),
73
- payloadTransform: (payload) => toExternalJSON(payload),
74
- },
75
- ],
76
- ])
33
+ protected override getSubscriptions() {
34
+ const eventNamesWithPrefix = this.eventNames().map(
35
+ (event) => `video-manager.${event}`
36
+ ) as EventEmitter.EventNames<VideoManagerEvents>[]
37
+ return validateEventsToSubscribe(eventNamesWithPrefix)
77
38
  }
78
39
  }
79
40
 
80
- export const createVideoManagerObject = (
81
- params: BaseComponentOptions<VideoManagerEvents>
82
- ) => {
41
+ export const createVideoManagerObject = (params: BaseComponentOptions) => {
83
42
  const manager = connect<VideoManagerEvents, VideoManagerAPI, VideoManager>({
84
43
  store: params.store,
85
44
  Component: VideoManagerAPI,
@@ -0,0 +1 @@
1
+ export * from './videoManagerWorker'
@@ -0,0 +1,28 @@
1
+ import {
2
+ getLogger,
3
+ SagaIterator,
4
+ MapToPubSubShape,
5
+ VideoManagerRoomEvent,
6
+ toExternalJSON,
7
+ VideoManagerRoomEventNames,
8
+ stripNamespacePrefix,
9
+ } from '@signalwire/core'
10
+ import { VideoManagerWorkerParams } from './videoManagerWorker'
11
+
12
+ export const videoManagerRoomWorker = function* (
13
+ options: VideoManagerWorkerParams<MapToPubSubShape<VideoManagerRoomEvent>>
14
+ ): SagaIterator {
15
+ getLogger().trace('videoManagerRoomWorker started')
16
+ const {
17
+ instance: client,
18
+ action: { type, payload },
19
+ } = options
20
+
21
+ // For now we expose the transformed payload and not a RoomSession
22
+ client.emit(
23
+ stripNamespacePrefix(type) as VideoManagerRoomEventNames,
24
+ toExternalJSON(payload)
25
+ )
26
+
27
+ getLogger().trace('videoManagerRoomWorker ended')
28
+ }
@@ -0,0 +1,33 @@
1
+ import {
2
+ getLogger,
3
+ SagaIterator,
4
+ MapToPubSubShape,
5
+ VideoManagerRoomsSubscribedEvent,
6
+ toExternalJSON,
7
+ VideoManagerRoomEventNames,
8
+ stripNamespacePrefix,
9
+ } from '@signalwire/core'
10
+ import { VideoManagerWorkerParams } from './videoManagerWorker'
11
+
12
+ export const videoManagerRoomsWorker = function* (
13
+ options: VideoManagerWorkerParams<
14
+ MapToPubSubShape<VideoManagerRoomsSubscribedEvent>
15
+ >
16
+ ): SagaIterator {
17
+ getLogger().trace('videoManagerRoomsWorker started')
18
+ const {
19
+ instance: client,
20
+ action: { type, payload },
21
+ } = options
22
+
23
+ // For now we expose the transformed payload and not a RoomSession
24
+ const modPayload = {
25
+ rooms: payload.rooms.map((row) => toExternalJSON(row)),
26
+ }
27
+ client.emit(
28
+ stripNamespacePrefix(type) as VideoManagerRoomEventNames,
29
+ modPayload
30
+ )
31
+
32
+ getLogger().trace('videoManagerRoomsWorker ended')
33
+ }
@@ -0,0 +1,64 @@
1
+ import { getLogger, sagaEffects } from '@signalwire/core'
2
+ import type {
3
+ SagaIterator,
4
+ MapToPubSubShape,
5
+ VideoManagerEvent,
6
+ SDKWorker,
7
+ SDKActions,
8
+ SDKWorkerParams,
9
+ } from '@signalwire/core'
10
+ import type { VideoManager } from '../VideoManager'
11
+ import { videoManagerRoomsWorker } from './videoManagerRoomsWorker'
12
+ import { videoManagerRoomWorker } from './videoManagerRoomWorker'
13
+
14
+ export type VideoManagerWorkerParams<T> = SDKWorkerParams<VideoManager> & {
15
+ action: T
16
+ }
17
+
18
+ export const videoManagerWorker: SDKWorker<VideoManager> = function* (
19
+ options
20
+ ): SagaIterator {
21
+ getLogger().trace('videoManagerWorker started')
22
+ const {
23
+ channels: { swEventChannel },
24
+ } = options
25
+
26
+ function* worker(action: MapToPubSubShape<VideoManagerEvent>) {
27
+ const { type } = action
28
+
29
+ switch (type) {
30
+ case 'video-manager.rooms.subscribed':
31
+ yield sagaEffects.fork(videoManagerRoomsWorker, {
32
+ action,
33
+ ...options,
34
+ })
35
+ break
36
+ case 'video-manager.room.added':
37
+ case 'video-manager.room.deleted':
38
+ case 'video-manager.room.ended':
39
+ case 'video-manager.room.started':
40
+ case 'video-manager.room.updated':
41
+ yield sagaEffects.fork(videoManagerRoomWorker, {
42
+ action,
43
+ ...options,
44
+ })
45
+ break
46
+ default:
47
+ getLogger().warn(`Unknown video-manager event: "${type}"`)
48
+ break
49
+ }
50
+ }
51
+
52
+ while (true) {
53
+ const action: MapToPubSubShape<VideoManagerEvent> = yield sagaEffects.take(
54
+ swEventChannel,
55
+ (action: SDKActions) => {
56
+ return action.type.startsWith('video-manager.')
57
+ }
58
+ )
59
+
60
+ yield sagaEffects.fork(worker, action)
61
+ }
62
+
63
+ getLogger().trace('videoManagerWorker ended')
64
+ }
@@ -104,7 +104,6 @@ export const createRoomObject = (
104
104
 
105
105
  // WebRTC connection left the room.
106
106
  roomObject.once('destroy', () => {
107
- // @ts-expect-error
108
107
  roomObject.emit('room.left')
109
108
  client.disconnect()
110
109
  })
@@ -104,7 +104,7 @@ export class WSClient {
104
104
  return new Promise(async (resolve, reject) => {
105
105
  try {
106
106
  // @ts-expect-error
107
- call.emitter.once('verto.display', () => resolve(call))
107
+ call.once('verto.display', () => resolve(call))
108
108
  call.once('room.subscribed', () => resolve(call))
109
109
 
110
110
  await call.join()
@@ -241,7 +241,6 @@ export class WSClient {
241
241
 
242
242
  updateToken(token: string): Promise<void> {
243
243
  return new Promise((resolve, reject) => {
244
- // @ts-expect-error
245
244
  this.wsClient.once('session.auth_error', (error) => {
246
245
  reject(error)
247
246
  })
@@ -3,6 +3,7 @@ import {
3
3
  CustomSagaParams,
4
4
  actions,
5
5
  sagaEffects,
6
+ LOCAL_EVENT_PREFIX,
6
7
  } from '@signalwire/core'
7
8
  import type { SagaIterator, Task } from '@signalwire/core'
8
9
  import { setMediaElementSinkId } from '@signalwire/webrtc'
@@ -124,7 +125,7 @@ export const makeVideoElementSaga = ({
124
125
  }
125
126
 
126
127
  // @ts-expect-error
127
- room.on('_internal.mirror.video', (value: boolean) => {
128
+ room.on(`${LOCAL_EVENT_PREFIX}.mirror.video`, (value: boolean) => {
128
129
  localOverlay.setLocalOverlayMirror(value)
129
130
  })
130
131
 
@@ -288,8 +289,11 @@ function* audioElementActionsWatcher({
288
289
  action.payload
289
290
  )
290
291
 
291
- // @ts-expect-error
292
- room.emit('_internal.speaker.updated', action.payload)
292
+ room.emit(
293
+ // @ts-expect-error
294
+ `${LOCAL_EVENT_PREFIX}.speaker.updated`,
295
+ action.payload
296
+ )
293
297
 
294
298
  room.settleCustomSagaTrigger({
295
299
  dispatchId: action.dispatchId,
@@ -36,6 +36,7 @@ import type {
36
36
  DeviceUpdatedEventParams,
37
37
  VideoRoomDeviceDisconnectedEventNames,
38
38
  DeviceDisconnectedEventParams,
39
+ VideoRoomDeviceEventNames,
39
40
  } from '@signalwire/core'
40
41
  import { INTERNAL_MEMBER_UPDATABLE_PROPS } from '@signalwire/core'
41
42
  import type { MediaEvent } from '@signalwire/webrtc'
@@ -92,9 +93,10 @@ export type RoomEventNames =
92
93
  | RTCTrackEventName
93
94
 
94
95
  export type RoomSessionObjectEventsHandlerMap = Record<
95
- VideoLayoutEventNames,
96
- (params: { layout: VideoLayout }) => void
96
+ VideoRoomDeviceEventNames,
97
+ (params: DeviceUpdatedEventParams) => void
97
98
  > &
99
+ Record<VideoLayoutEventNames, (params: { layout: VideoLayout }) => void> &
98
100
  Record<
99
101
  Exclude<
100
102
  VideoMemberEventNames,
@@ -122,6 +122,7 @@ const makeLayoutChangedHandler =
122
122
  localVideo.style.width = '100%'
123
123
  localVideo.style.height = '100%'
124
124
  localVideo.style.pointerEvents = 'none'
125
+ localVideo.style.objectFit = 'cover'
125
126
 
126
127
  myLayer.appendChild(localVideo)
127
128
 
@@ -1,18 +1,20 @@
1
- import { testUtils, componentActions, sagaHelpers } from '@signalwire/core'
1
+ import { testUtils, componentActions } from '@signalwire/core'
2
2
  import { expectSaga } from 'redux-saga-test-plan'
3
3
  import { childMemberJoinedWorker } from './childMemberJoinedWorker'
4
4
 
5
- const { createPubSubChannel, createSwEventChannel } = testUtils
5
+ const { createSwEventChannel, createSessionChannel } = testUtils
6
6
 
7
7
  describe('childMemberJoinedWorker', () => {
8
8
  it('should handle video.member.joined with parent_id', () => {
9
9
  const parentId = 'd815d293-f8d0-49e8-aec2-3a4cc3729af8'
10
10
  const memberId = 'b8912cc5-4248-4345-b53c-d53b2761748d'
11
11
  let runSaga = true
12
- const session = {} as any
13
- const pubSubChannel = createPubSubChannel()
14
12
  const swEventChannel = createSwEventChannel()
15
- const sessionChannel = sagaHelpers.eventChannel(() => () => {})
13
+ const sessionChannel = createSessionChannel()
14
+ const session = {
15
+ connect: jest.fn(),
16
+ } as any
17
+ const getSession = jest.fn().mockImplementation(() => session)
16
18
  const dispatchedActions: unknown[] = []
17
19
  const defaultState = {
18
20
  components: {
@@ -32,21 +34,19 @@ describe('childMemberJoinedWorker', () => {
32
34
  }
33
35
 
34
36
  return expectSaga(childMemberJoinedWorker, {
35
- // @ts-expect-error
36
- session,
37
37
  channels: {
38
- pubSubChannel,
39
38
  swEventChannel,
39
+ sessionChannel,
40
40
  },
41
- sessionChannel,
42
41
  instance: {
43
42
  callId: 'callId',
44
- _attachListeners: jest.fn(),
45
- applyEmitterTransforms: jest.fn(),
46
43
  } as any,
47
44
  initialState: {
48
45
  parentId,
49
46
  },
47
+ instanceMap: { get: jest.fn(), set: jest.fn(), remove: jest.fn() },
48
+ getSession,
49
+ runSaga: jest.fn(),
50
50
  })
51
51
  .withState(defaultState)
52
52
  .provide([
@@ -68,7 +68,6 @@ describe('childMemberJoinedWorker', () => {
68
68
  }
69
69
  } else if (runSaga === false) {
70
70
  sessionChannel.close()
71
- pubSubChannel.close()
72
71
  }
73
72
  return next()
74
73
  },
@@ -57,15 +57,6 @@ export const childMemberJoinedWorker: SDKWorker<
57
57
  return 'memberId' in row && row.memberId === member.parent_id
58
58
  })
59
59
  if (parent) {
60
- /**
61
- * For screenShare/additionalDevice we're using the `memberId` to
62
- * namespace the object.
63
- **/
64
- // @ts-expect-error
65
- instance._attachListeners(member.id)
66
- // @ts-expect-error
67
- instance.applyEmitterTransforms()
68
-
69
60
  yield sagaEffects.put(
70
61
  componentActions.upsert({
71
62
  id: instance.callId,
@@ -5,7 +5,7 @@ import {
5
5
  toSyntheticEvent,
6
6
  validateEventsToSubscribe,
7
7
  toInternalEventName,
8
- PubSubChannel,
8
+ SwEventChannel,
9
9
  InternalVideoMemberEntity,
10
10
  InternalVideoMemberUpdatedEvent,
11
11
  VideoMemberJoinedEvent,
@@ -19,7 +19,7 @@ import type { VideoMemberListUpdatedParams } from '../utils/interfaces'
19
19
 
20
20
  const noop = () => {}
21
21
 
22
- const EXTERNAL_MEMBER_LIST_UPDATED_EVENT = 'video.memberList.updated'
22
+ const EXTERNAL_MEMBER_LIST_UPDATED_EVENT = 'memberList.updated'
23
23
 
24
24
  const INTERNAL_MEMBER_LIST_UPDATED_EVENT = toInternalEventName({
25
25
  event: EXTERNAL_MEMBER_LIST_UPDATED_EVENT,
@@ -57,7 +57,9 @@ const isMemberListEvent = (
57
57
  return MEMBER_LIST_EVENTS.includes(event)
58
58
  }
59
59
 
60
- const getMemberListEventsToSubscribe = (subscriptions: MemberListUpdatedTargetActions['type'][]) => {
60
+ const getMemberListEventsToSubscribe = (
61
+ subscriptions: MemberListUpdatedTargetActions['type'][]
62
+ ) => {
61
63
  return validateEventsToSubscribe(MEMBER_LIST_EVENTS).filter((event) => {
62
64
  return !subscriptions.includes(event)
63
65
  })
@@ -65,7 +67,7 @@ const getMemberListEventsToSubscribe = (subscriptions: MemberListUpdatedTargetAc
65
67
 
66
68
  const shouldHandleMemberList = (subscriptions: string[]) => {
67
69
  return subscriptions.some((event) =>
68
- event.includes(INTERNAL_MEMBER_LIST_UPDATED_EVENT)
70
+ event.includes(EXTERNAL_MEMBER_LIST_UPDATED_EVENT)
69
71
  )
70
72
  }
71
73
 
@@ -128,7 +130,6 @@ const initMemberListSubscriptions = (
128
130
  * synthetic events and external events.
129
131
  */
130
132
  const eventBridgeHandler = ({ members }: VideoMemberListUpdatedParams) => {
131
- // @ts-expect-error
132
133
  room.emit(EXTERNAL_MEMBER_LIST_UPDATED_EVENT, { members })
133
134
  }
134
135
 
@@ -150,9 +151,11 @@ const initMemberListSubscriptions = (
150
151
  }
151
152
 
152
153
  function* membersListUpdatedWatcher({
153
- pubSubChannel,
154
+ swEventChannel,
155
+ instance,
154
156
  }: {
155
- pubSubChannel: PubSubChannel
157
+ swEventChannel: SwEventChannel
158
+ instance: any
156
159
  }): SagaIterator {
157
160
  const memberList: MemberList = new Map()
158
161
 
@@ -174,16 +177,12 @@ function* membersListUpdatedWatcher({
174
177
  members,
175
178
  }
176
179
 
177
- // TODO: add typings
178
- yield sagaEffects.put(pubSubChannel, {
179
- type: SYNTHETIC_MEMBER_LIST_UPDATED_EVENT as any,
180
- payload: memberListPayload as any,
181
- })
180
+ instance.emit(SYNTHETIC_MEMBER_LIST_UPDATED_EVENT, memberListPayload)
182
181
  }
183
182
 
184
183
  while (true) {
185
184
  const pubSubAction: MemberListUpdatedTargetActions = yield sagaEffects.take(
186
- pubSubChannel,
185
+ swEventChannel,
187
186
  ({ type }: any) => {
188
187
  return isMemberListEvent(type)
189
188
  }
@@ -195,7 +194,7 @@ function* membersListUpdatedWatcher({
195
194
 
196
195
  export const memberListUpdatedWorker: SDKWorker<RoomSession> =
197
196
  function* membersChangedWorker({
198
- channels: { pubSubChannel },
197
+ channels: { swEventChannel },
199
198
  instance,
200
199
  }): SagaIterator {
201
200
  // @ts-expect-error
@@ -208,7 +207,8 @@ export const memberListUpdatedWorker: SDKWorker<RoomSession> =
208
207
  const { cleanup } = initMemberListSubscriptions(instance, subscriptions)
209
208
 
210
209
  yield sagaEffects.fork(membersListUpdatedWatcher, {
211
- pubSubChannel,
210
+ swEventChannel,
211
+ instance,
212
212
  })
213
213
 
214
214
  instance.once('destroy', () => {
@@ -0,0 +1,54 @@
1
+ import {
2
+ getLogger,
3
+ SagaIterator,
4
+ MapToPubSubShape,
5
+ RoomSessionPlayback,
6
+ Rooms,
7
+ VideoPlaybackEvent,
8
+ VideoPlaybackEventNames,
9
+ stripNamespacePrefix,
10
+ } from '@signalwire/core'
11
+ import { VideoWorkerParams } from './videoWorker'
12
+
13
+ export const videoPlaybackWorker = function* (
14
+ options: VideoWorkerParams<MapToPubSubShape<VideoPlaybackEvent>>
15
+ ): SagaIterator {
16
+ getLogger().trace('videoPlaybackWorker started')
17
+ const {
18
+ instance: roomSession,
19
+ action: { type, payload },
20
+ instanceMap: { get, set, remove },
21
+ } = options
22
+
23
+ // For now, we are not storing the RoomSession object in the instance map
24
+
25
+ let playbackInstance = get<RoomSessionPlayback>(payload.playback.id)
26
+ if (!playbackInstance) {
27
+ playbackInstance = Rooms.createRoomSessionPlaybackObject({
28
+ store: roomSession.store,
29
+ payload,
30
+ })
31
+ } else {
32
+ playbackInstance.setPayload(payload)
33
+ }
34
+ set<RoomSessionPlayback>(payload.playback.id, playbackInstance)
35
+
36
+ const event = stripNamespacePrefix(type) as VideoPlaybackEventNames
37
+
38
+ switch (type) {
39
+ case 'video.playback.started':
40
+ case 'video.playback.updated': {
41
+ roomSession.emit(event, playbackInstance)
42
+ break
43
+ }
44
+ case 'video.playback.ended':
45
+ roomSession.emit(event, playbackInstance)
46
+ remove<RoomSessionPlayback>(payload.playback.id)
47
+ break
48
+ default:
49
+ getLogger().warn(`Unknown video.stream event: "${type}"`)
50
+ break
51
+ }
52
+
53
+ getLogger().trace('videoPlaybackWorker ended')
54
+ }
@@ -0,0 +1,54 @@
1
+ import {
2
+ getLogger,
3
+ SagaIterator,
4
+ MapToPubSubShape,
5
+ RoomSessionRecording,
6
+ Rooms,
7
+ VideoRecordingEvent,
8
+ VideoRecordingEventNames,
9
+ stripNamespacePrefix,
10
+ } from '@signalwire/core'
11
+ import { VideoWorkerParams } from './videoWorker'
12
+
13
+ export const videoRecordWorker = function* (
14
+ options: VideoWorkerParams<MapToPubSubShape<VideoRecordingEvent>>
15
+ ): SagaIterator {
16
+ getLogger().trace('videoRecordWorker started')
17
+ const {
18
+ instance: roomSession,
19
+ action: { type, payload },
20
+ instanceMap: { get, set, remove },
21
+ } = options
22
+
23
+ // For now, we are not storing the RoomSession object in the instance map
24
+
25
+ let recordingInstance = get<RoomSessionRecording>(payload.recording.id)
26
+ if (!recordingInstance) {
27
+ recordingInstance = Rooms.createRoomSessionRecordingObject({
28
+ store: roomSession.store,
29
+ payload,
30
+ })
31
+ } else {
32
+ recordingInstance.setPayload(payload)
33
+ }
34
+ set<RoomSessionRecording>(payload.recording.id, recordingInstance)
35
+
36
+ const event = stripNamespacePrefix(type) as VideoRecordingEventNames
37
+
38
+ switch (type) {
39
+ case 'video.recording.started':
40
+ case 'video.recording.updated': {
41
+ roomSession.emit(event, recordingInstance)
42
+ break
43
+ }
44
+ case 'video.recording.ended':
45
+ roomSession.emit(event, recordingInstance)
46
+ remove<RoomSessionRecording>(payload.recording.id)
47
+ break
48
+ default:
49
+ getLogger().warn(`Unknown video.stream event: "${type}"`)
50
+ break
51
+ }
52
+
53
+ getLogger().trace('videoRecordWorker ended')
54
+ }
@@ -0,0 +1,48 @@
1
+ import {
2
+ getLogger,
3
+ SagaIterator,
4
+ MapToPubSubShape,
5
+ VideoStreamEvent,
6
+ RoomSessionStream,
7
+ Rooms,
8
+ } from '@signalwire/core'
9
+ import { VideoWorkerParams } from './videoWorker'
10
+
11
+ export const videoStreamWorker = function* (
12
+ options: VideoWorkerParams<MapToPubSubShape<VideoStreamEvent>>
13
+ ): SagaIterator {
14
+ getLogger().trace('videoStreamWorker started')
15
+ const {
16
+ instance: roomSession,
17
+ action: { type, payload },
18
+ instanceMap: { get, set, remove },
19
+ } = options
20
+
21
+ // For now, we are not storing the RoomSession object in the instance map
22
+
23
+ let streamInstance = get<RoomSessionStream>(payload.stream.id)
24
+ if (!streamInstance) {
25
+ streamInstance = Rooms.createRoomSessionStreamObject({
26
+ store: roomSession.store,
27
+ payload,
28
+ })
29
+ } else {
30
+ streamInstance.setPayload(payload)
31
+ }
32
+ set<RoomSessionStream>(payload.stream.id, streamInstance)
33
+
34
+ switch (type) {
35
+ case 'video.stream.started':
36
+ roomSession.emit('stream.started', streamInstance)
37
+ break
38
+ case 'video.stream.ended':
39
+ roomSession.emit('stream.ended', streamInstance)
40
+ remove<RoomSessionStream>(payload.stream.id)
41
+ break
42
+ default:
43
+ getLogger().warn(`Unknown video.stream event: "${type}"`)
44
+ break
45
+ }
46
+
47
+ getLogger().trace('videoStreamWorker ended')
48
+ }