@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.
- package/dist/core/src/BaseClient.d.ts.map +1 -1
- package/dist/core/src/BaseComponent.d.ts +8 -114
- package/dist/core/src/BaseComponent.d.ts.map +1 -1
- package/dist/core/src/BaseConsumer.d.ts +2 -2
- package/dist/core/src/BaseConsumer.d.ts.map +1 -1
- package/dist/core/src/BaseSession.d.ts.map +1 -1
- package/dist/core/src/RPCMessages/RPCConnect.d.ts +1 -0
- package/dist/core/src/RPCMessages/RPCConnect.d.ts.map +1 -1
- package/dist/core/src/chat/BaseChat.d.ts +5 -6
- package/dist/core/src/chat/BaseChat.d.ts.map +1 -1
- package/dist/core/src/chat/workers/chatWorker.d.ts.map +1 -1
- package/dist/core/src/index.d.ts +4 -5
- package/dist/core/src/index.d.ts.map +1 -1
- package/dist/core/src/memberPosition/workers.d.ts +1 -1
- package/dist/core/src/memberPosition/workers.d.ts.map +1 -1
- package/dist/core/src/pubSub/BasePubSub.d.ts +8 -9
- package/dist/core/src/pubSub/BasePubSub.d.ts.map +1 -1
- package/dist/core/src/pubSub/workers/pubSubWorker.d.ts.map +1 -1
- package/dist/core/src/redux/actions.d.ts +0 -9
- package/dist/core/src/redux/actions.d.ts.map +1 -1
- package/dist/core/src/redux/features/session/sessionSaga.d.ts +2 -3
- package/dist/core/src/redux/features/session/sessionSaga.d.ts.map +1 -1
- package/dist/core/src/redux/index.d.ts +1 -0
- package/dist/core/src/redux/index.d.ts.map +1 -1
- package/dist/core/src/redux/interfaces.d.ts +0 -1
- package/dist/core/src/redux/interfaces.d.ts.map +1 -1
- package/dist/core/src/redux/rootSaga.d.ts +10 -10
- package/dist/core/src/redux/rootSaga.d.ts.map +1 -1
- package/dist/core/src/redux/utils/useInstanceMap.d.ts +6 -0
- package/dist/core/src/redux/utils/useInstanceMap.d.ts.map +1 -0
- package/dist/core/src/redux/utils/useSession.d.ts +16 -0
- package/dist/core/src/redux/utils/useSession.d.ts.map +1 -0
- package/dist/core/src/rooms/RoomSessionPlayback.d.ts +20 -3
- package/dist/core/src/rooms/RoomSessionPlayback.d.ts.map +1 -1
- package/dist/core/src/rooms/RoomSessionRecording.d.ts +18 -5
- package/dist/core/src/rooms/RoomSessionRecording.d.ts.map +1 -1
- package/dist/core/src/rooms/RoomSessionStream.d.ts +19 -5
- package/dist/core/src/rooms/RoomSessionStream.d.ts.map +1 -1
- package/dist/core/src/rooms/index.d.ts +0 -4
- package/dist/core/src/rooms/index.d.ts.map +1 -1
- package/dist/core/src/rooms/methods.d.ts +6 -2
- package/dist/core/src/rooms/methods.d.ts.map +1 -1
- package/dist/core/src/testUtils.d.ts +3 -2
- package/dist/core/src/testUtils.d.ts.map +1 -1
- package/dist/core/src/types/chat.d.ts +0 -1
- package/dist/core/src/types/chat.d.ts.map +1 -1
- package/dist/core/src/types/index.d.ts +2 -0
- package/dist/core/src/types/index.d.ts.map +1 -1
- package/dist/core/src/types/messaging.d.ts +0 -1
- package/dist/core/src/types/messaging.d.ts.map +1 -1
- package/dist/core/src/types/pubSub.d.ts +0 -1
- package/dist/core/src/types/pubSub.d.ts.map +1 -1
- package/dist/core/src/types/video.d.ts +8 -7
- package/dist/core/src/types/video.d.ts.map +1 -1
- package/dist/core/src/types/videoRoomDevice.d.ts +6 -4
- package/dist/core/src/types/videoRoomDevice.d.ts.map +1 -1
- package/dist/core/src/types/videoRoomSession.d.ts +9 -0
- package/dist/core/src/types/videoRoomSession.d.ts.map +1 -1
- package/dist/core/src/types/voiceCall.d.ts +16 -5
- package/dist/core/src/types/voiceCall.d.ts.map +1 -1
- package/dist/core/src/utils/eventUtils.d.ts +2 -0
- package/dist/core/src/utils/eventUtils.d.ts.map +1 -0
- package/dist/core/src/utils/eventUtils.test.d.ts +2 -0
- package/dist/core/src/utils/eventUtils.test.d.ts.map +1 -0
- package/dist/core/src/utils/index.d.ts +3 -2
- package/dist/core/src/utils/index.d.ts.map +1 -1
- package/dist/core/src/utils/interfaces.d.ts +9 -117
- package/dist/core/src/utils/interfaces.d.ts.map +1 -1
- package/dist/index.esm.js +365 -320
- package/dist/index.esm.js.map +3 -3
- package/dist/index.js +366 -342
- package/dist/index.js.map +3 -3
- package/dist/index.umd.js +3 -3
- package/dist/index.umd.js.map +1 -1
- package/dist/js/src/BaseRoomSession.d.ts +5 -15
- package/dist/js/src/BaseRoomSession.d.ts.map +1 -1
- package/dist/js/src/Client.d.ts.map +1 -1
- package/dist/js/src/RoomSession.d.ts.map +1 -1
- package/dist/js/src/cantina/VideoManager.d.ts +4 -5
- package/dist/js/src/cantina/VideoManager.d.ts.map +1 -1
- package/dist/js/src/cantina/workers/index.d.ts +2 -0
- package/dist/js/src/cantina/workers/index.d.ts.map +1 -0
- package/dist/js/src/cantina/workers/videoManagerRoomWorker.d.ts +4 -0
- package/dist/js/src/cantina/workers/videoManagerRoomWorker.d.ts.map +1 -0
- package/dist/js/src/cantina/workers/videoManagerRoomsWorker.d.ts +4 -0
- package/dist/js/src/cantina/workers/videoManagerRoomsWorker.d.ts.map +1 -0
- package/dist/js/src/cantina/workers/videoManagerWorker.d.ts +7 -0
- package/dist/js/src/cantina/workers/videoManagerWorker.d.ts.map +1 -0
- package/dist/js/src/createRoomObject.d.ts.map +1 -1
- package/dist/js/src/fabric/WSClient.d.ts.map +1 -1
- package/dist/js/src/features/mediaElements/mediaElementsSagas.d.ts.map +1 -1
- package/dist/js/src/testUtils.d.ts +2 -0
- package/dist/js/src/testUtils.d.ts.map +1 -1
- package/dist/js/src/utils/interfaces.d.ts +2 -2
- package/dist/js/src/utils/interfaces.d.ts.map +1 -1
- package/dist/js/src/utils/videoElement.d.ts.map +1 -1
- package/dist/js/src/video/childMemberJoinedWorker.d.ts.map +1 -1
- package/dist/js/src/video/memberListUpdatedWorker.d.ts.map +1 -1
- package/dist/js/src/video/videoPlaybackWorker.d.ts +4 -0
- package/dist/js/src/video/videoPlaybackWorker.d.ts.map +1 -0
- package/dist/js/src/video/videoRecordWorker.d.ts +4 -0
- package/dist/js/src/video/videoRecordWorker.d.ts.map +1 -0
- package/dist/js/src/video/videoStreamWorker.d.ts +4 -0
- package/dist/js/src/video/videoStreamWorker.d.ts.map +1 -0
- package/dist/js/src/video/videoWorker.d.ts +7 -0
- package/dist/js/src/video/videoWorker.d.ts.map +1 -0
- package/dist/js/src/video/workers.d.ts +1 -1
- package/dist/js/src/video/workers.d.ts.map +1 -1
- package/dist/js/tsconfig.build.tsbuildinfo +1 -1
- package/dist/webrtc/src/BaseConnection.d.ts +4 -5
- package/dist/webrtc/src/BaseConnection.d.ts.map +1 -1
- package/dist/webrtc/src/RTCPeer.d.ts +1 -1
- package/dist/webrtc/src/RTCPeer.d.ts.map +1 -1
- package/dist/webrtc/src/workers/roomSubscribedWorker.d.ts.map +1 -1
- package/dist/webrtc/src/workers/vertoEventWorker.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/BaseRoomSession.test.ts +4 -6
- package/src/BaseRoomSession.ts +47 -211
- package/src/Client.ts +1 -11
- package/src/RoomSession.ts +5 -5
- package/src/RoomSessionDevice.test.ts +0 -1
- package/src/RoomSessionScreenShare.test.ts +0 -1
- package/src/cantina/VideoManager.test.ts +0 -2
- package/src/cantina/VideoManager.ts +10 -51
- package/src/cantina/workers/index.ts +1 -0
- package/src/cantina/workers/videoManagerRoomWorker.ts +28 -0
- package/src/cantina/workers/videoManagerRoomsWorker.ts +33 -0
- package/src/cantina/workers/videoManagerWorker.ts +64 -0
- package/src/createRoomObject.ts +0 -1
- package/src/fabric/WSClient.ts +1 -2
- package/src/features/mediaElements/mediaElementsSagas.ts +7 -3
- package/src/utils/interfaces.ts +4 -2
- package/src/utils/videoElement.ts +1 -0
- package/src/video/childMemberJoinedWorker.test.ts +11 -12
- package/src/video/childMemberJoinedWorker.ts +0 -9
- package/src/video/memberListUpdatedWorker.ts +15 -15
- package/src/video/videoPlaybackWorker.ts +54 -0
- package/src/video/videoRecordWorker.ts +54 -0
- package/src/video/videoStreamWorker.ts +48 -0
- package/src/video/videoWorker.ts +96 -0
- package/src/video/workers.ts +1 -1
- package/dist/core/src/ApplyEventListeners.d.ts +0 -11
- package/dist/core/src/ApplyEventListeners.d.ts.map +0 -1
- package/dist/core/src/redux/features/pubSub/pubSubSaga.d.ts +0 -10
- package/dist/core/src/redux/features/pubSub/pubSubSaga.d.ts.map +0 -1
- package/dist/core/src/redux/features/pubSub/pubSubSaga.test.d.ts +0 -2
- package/dist/core/src/redux/features/pubSub/pubSubSaga.test.d.ts.map +0 -1
- package/dist/core/src/redux/features/session/sessionSaga.test.d.ts +0 -2
- package/dist/core/src/redux/features/session/sessionSaga.test.d.ts.map +0 -1
- package/dist/core/src/rooms/RoomSessionRTPlayback.d.ts +0 -47
- package/dist/core/src/rooms/RoomSessionRTPlayback.d.ts.map +0 -1
- package/dist/core/src/rooms/RoomSessionRTPlayback.test.d.ts +0 -2
- package/dist/core/src/rooms/RoomSessionRTPlayback.test.d.ts.map +0 -1
- package/dist/core/src/rooms/RoomSessionRTRecording.d.ts +0 -37
- package/dist/core/src/rooms/RoomSessionRTRecording.d.ts.map +0 -1
- package/dist/core/src/rooms/RoomSessionRTRecording.test.d.ts +0 -2
- package/dist/core/src/rooms/RoomSessionRTRecording.test.d.ts.map +0 -1
- package/dist/core/src/rooms/RoomSessionRTStream.d.ts +0 -36
- package/dist/core/src/rooms/RoomSessionRTStream.d.ts.map +0 -1
- package/dist/core/src/rooms/RoomSessionRTStream.test.d.ts +0 -2
- package/dist/core/src/rooms/RoomSessionRTStream.test.d.ts.map +0 -1
- package/dist/core/src/rooms/methodsRT.d.ts +0 -65
- package/dist/core/src/rooms/methodsRT.d.ts.map +0 -1
- package/dist/core/src/utils/eventTransformUtils.d.ts +0 -16
- package/dist/core/src/utils/eventTransformUtils.d.ts.map +0 -1
- package/dist/core/src/utils/eventTransformUtils.test.d.ts +0 -2
- package/dist/core/src/utils/eventTransformUtils.test.d.ts.map +0 -1
- package/dist/core/src/utils/proxyUtils.d.ts +0 -17
- package/dist/core/src/utils/proxyUtils.d.ts.map +0 -1
- package/dist/js/src/cantina/workers.d.ts +0 -4
- package/dist/js/src/cantina/workers.d.ts.map +0 -1
- package/dist/js/src/video/memberPositionWorker.d.ts +0 -3
- package/dist/js/src/video/memberPositionWorker.d.ts.map +0 -1
- package/src/cantina/workers.ts +0 -28
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
+
}
|
package/src/createRoomObject.ts
CHANGED
package/src/fabric/WSClient.ts
CHANGED
|
@@ -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.
|
|
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(
|
|
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
|
-
|
|
292
|
-
|
|
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,
|
package/src/utils/interfaces.ts
CHANGED
|
@@ -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
|
-
|
|
96
|
-
(params:
|
|
96
|
+
VideoRoomDeviceEventNames,
|
|
97
|
+
(params: DeviceUpdatedEventParams) => void
|
|
97
98
|
> &
|
|
99
|
+
Record<VideoLayoutEventNames, (params: { layout: VideoLayout }) => void> &
|
|
98
100
|
Record<
|
|
99
101
|
Exclude<
|
|
100
102
|
VideoMemberEventNames,
|
|
@@ -1,18 +1,20 @@
|
|
|
1
|
-
import { testUtils, componentActions
|
|
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 {
|
|
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 =
|
|
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
|
-
|
|
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 = '
|
|
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 = (
|
|
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(
|
|
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
|
-
|
|
154
|
+
swEventChannel,
|
|
155
|
+
instance,
|
|
154
156
|
}: {
|
|
155
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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: {
|
|
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
|
-
|
|
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
|
+
}
|