@100mslive/hms-video-store 0.2.82-alpha.1 → 0.2.82-alpha.13
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/IHMSActions.d.ts +1 -1
- package/dist/core/hmsSDKStore/HMSSDKActions.d.ts +1 -1
- package/dist/core/hmsSDKStore/sdkTypes.d.ts +3 -3
- package/dist/core/index.d.ts +2 -2
- package/dist/core/selectors/selectors.d.ts +3 -9
- package/dist/core/selectors/selectorsByID.d.ts +1 -1
- package/dist/core/selectors/selectorsByReference.d.ts +1 -1
- package/dist/hms-video-store.cjs.js +1 -1
- package/dist/hms-video-store.esm.js +1 -1
- package/package.json +5 -36
- package/src/common/ui-logger.ts +0 -88
- package/src/core/IHMSActions.ts +0 -317
- package/src/core/IHMSNotifications.ts +0 -16
- package/src/core/IHMSStore.ts +0 -59
- package/src/core/hmsSDKStore/HMSNotifications.ts +0 -170
- package/src/core/hmsSDKStore/HMSPlaylist.ts +0 -77
- package/src/core/hmsSDKStore/HMSReactiveStore.ts +0 -262
- package/src/core/hmsSDKStore/HMSSDKActions.ts +0 -1113
- package/src/core/hmsSDKStore/adapter.ts +0 -234
- package/src/core/hmsSDKStore/common/mapping.ts +0 -32
- package/src/core/hmsSDKStore/internalTypes.ts +0 -8
- package/src/core/hmsSDKStore/sdkTypes.ts +0 -51
- package/src/core/hmsSDKStore/sdkUtils/ActionBatcher.ts +0 -60
- package/src/core/hmsSDKStore/sdkUtils/sdkUtils.ts +0 -5
- package/src/core/hmsSDKStore/sdkUtils/storeMergeUtils.ts +0 -95
- package/src/core/index.ts +0 -16
- package/src/core/schema/device-change.ts +0 -14
- package/src/core/schema/error.ts +0 -13
- package/src/core/schema/index.ts +0 -11
- package/src/core/schema/message.ts +0 -35
- package/src/core/schema/notification.ts +0 -41
- package/src/core/schema/peer.ts +0 -72
- package/src/core/schema/playlist.ts +0 -114
- package/src/core/schema/requests.ts +0 -36
- package/src/core/schema/role.ts +0 -5
- package/src/core/schema/room.ts +0 -26
- package/src/core/schema/schema.ts +0 -94
- package/src/core/schema/settings.ts +0 -5
- package/src/core/selectors/derivedSelectors.ts +0 -75
- package/src/core/selectors/index.ts +0 -5
- package/src/core/selectors/playlistselectors.ts +0 -71
- package/src/core/selectors/selectorUtils.ts +0 -63
- package/src/core/selectors/selectors.ts +0 -347
- package/src/core/selectors/selectorsByID.ts +0 -370
- package/src/core/selectors/selectorsByReference.ts +0 -34
- package/src/index.ts +0 -1
- package/src/test/fakeStore.ts +0 -272
- package/src/test/fixtures.ts +0 -22
- package/src/test/integration/.gitkeep +0 -0
- package/src/test/unit/HMSNotifications.test.ts +0 -105
- package/src/test/unit/reactiveStore.test.ts +0 -129
- package/src/test/unit/roleSelectors.test.ts +0 -78
- package/src/test/unit/selectors.test.ts +0 -316
- package/src/test/unit/selectorsByReference.test.ts +0 -23
- package/src/test/unit/storeMergeUtils.test.ts +0 -165
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import { HMSNotificationSeverity, HMSPeer, HMSReactiveStore, HMSStore, HMSTrack, HMSException } from '../../core';
|
|
2
|
-
import { PEER_NOTIFICATION_TYPES, TRACK_NOTIFICATION_TYPES } from '../../core/hmsSDKStore/common/mapping';
|
|
3
|
-
import { HMSNotifications } from '../../core/hmsSDKStore/HMSNotifications';
|
|
4
|
-
import * as sdkTypes from '../../core/hmsSDKStore/sdkTypes';
|
|
5
|
-
import { makeFakeStore } from '../fakeStore';
|
|
6
|
-
import { makeFakePeer, makeFakeTrack } from '../fixtures';
|
|
7
|
-
|
|
8
|
-
let notifications: HMSNotifications;
|
|
9
|
-
let peer: HMSPeer;
|
|
10
|
-
let track: HMSTrack;
|
|
11
|
-
let fakeStore: HMSStore;
|
|
12
|
-
let cb: jest.Mock;
|
|
13
|
-
let unsub: () => void;
|
|
14
|
-
beforeEach(() => {
|
|
15
|
-
const store = HMSReactiveStore.createNewHMSStore();
|
|
16
|
-
notifications = new HMSNotifications(store);
|
|
17
|
-
cb = jest.fn(val => val);
|
|
18
|
-
unsub = notifications.onNotification(cb);
|
|
19
|
-
peer = makeFakePeer();
|
|
20
|
-
track = makeFakeTrack();
|
|
21
|
-
fakeStore = makeFakeStore();
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
function makeException(name: string): HMSException {
|
|
25
|
-
return {
|
|
26
|
-
name: name,
|
|
27
|
-
} as HMSException;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
describe('hms notifications tests', () => {
|
|
31
|
-
test('when unhandled peer event on Notification not to be called', () => {
|
|
32
|
-
notifications.sendPeerUpdate(sdkTypes.HMSPeerUpdate.BECAME_DOMINANT_SPEAKER, peer);
|
|
33
|
-
expect(cb.mock.calls.length).toBe(0);
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
test('when peer joined on Notification to be called', () => {
|
|
37
|
-
notifications.sendPeerUpdate(sdkTypes.HMSPeerUpdate.PEER_JOINED, peer);
|
|
38
|
-
expect(cb.mock.calls.length).toBe(1);
|
|
39
|
-
expect(cb.mock.results[0].value.type).toBe(PEER_NOTIFICATION_TYPES[sdkTypes.HMSPeerUpdate.PEER_JOINED]);
|
|
40
|
-
expect(cb.mock.results[0].value.data).toBe(peer);
|
|
41
|
-
expect(cb.mock.results[0].value.severity).toBe(HMSNotificationSeverity.INFO);
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
test('when peer left on Notification to be called', () => {
|
|
45
|
-
notifications.sendPeerUpdate(sdkTypes.HMSPeerUpdate.PEER_LEFT, peer);
|
|
46
|
-
expect(cb.mock.calls.length).toBe(1);
|
|
47
|
-
expect(cb.mock.results[0].value.type).toBe(PEER_NOTIFICATION_TYPES[sdkTypes.HMSPeerUpdate.PEER_LEFT]);
|
|
48
|
-
expect(cb.mock.results[0].value.data).toBe(peer);
|
|
49
|
-
expect(cb.mock.results[0].value.severity).toBe(HMSNotificationSeverity.INFO);
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
test('when unhandled track event on Notification not to be called', () => {
|
|
53
|
-
notifications.sendTrackUpdate(sdkTypes.HMSTrackUpdate.TRACK_DESCRIPTION_CHANGED, track.id);
|
|
54
|
-
expect(cb.mock.calls.length).toBe(0);
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
test('when track added on Notification to be called', () => {
|
|
58
|
-
notifications.sendTrackUpdate(sdkTypes.HMSTrackUpdate.TRACK_ADDED, track.id);
|
|
59
|
-
expect(cb.mock.calls.length).toBe(1);
|
|
60
|
-
expect(cb.mock.results[0].value.type).toBe(TRACK_NOTIFICATION_TYPES[sdkTypes.HMSTrackUpdate.TRACK_ADDED]);
|
|
61
|
-
expect(cb.mock.results[0].value.severity).toBe(HMSNotificationSeverity.INFO);
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
test('when track removed on Notification to be called', () => {
|
|
65
|
-
notifications.sendTrackUpdate(sdkTypes.HMSTrackUpdate.TRACK_REMOVED, track.id);
|
|
66
|
-
expect(cb.mock.calls.length).toBe(1);
|
|
67
|
-
expect(cb.mock.results[0].value.type).toBe(TRACK_NOTIFICATION_TYPES[sdkTypes.HMSTrackUpdate.TRACK_REMOVED]);
|
|
68
|
-
expect(cb.mock.results[0].value.severity).toBe(HMSNotificationSeverity.INFO);
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
test('when new message received on Notification to be called', () => {
|
|
72
|
-
const message = fakeStore.messages.byID['201'];
|
|
73
|
-
notifications.sendMessageReceived(message);
|
|
74
|
-
expect(cb.mock.calls.length).toBe(1);
|
|
75
|
-
expect(cb.mock.results[0].value.data).toBe(message);
|
|
76
|
-
expect(cb.mock.results[0].value.severity).toBe(HMSNotificationSeverity.INFO);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
test('when error received on Notification to be called', () => {
|
|
80
|
-
const error = makeException('Test');
|
|
81
|
-
notifications.sendError(error);
|
|
82
|
-
expect(cb.mock.calls.length).toBe(1);
|
|
83
|
-
expect(cb.mock.results[0].value.data).toBe(error);
|
|
84
|
-
expect(cb.mock.results[0].value.severity).toBe(HMSNotificationSeverity.ERROR);
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
test('when reconnected received on Notification to be called', () => {
|
|
88
|
-
notifications.sendReconnected();
|
|
89
|
-
expect(cb.mock.calls.length).toBe(1);
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
test('when reconnecting received on Notification to be called', () => {
|
|
93
|
-
const error = makeException('Test');
|
|
94
|
-
notifications.sendReconnecting(error);
|
|
95
|
-
expect(cb.mock.calls.length).toBe(1);
|
|
96
|
-
expect(cb.mock.results[0].value.data).toBe(error);
|
|
97
|
-
expect(cb.mock.results[0].value.severity).toBe(HMSNotificationSeverity.ERROR);
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
test('when unsubscribed on Notification not to be called', () => {
|
|
101
|
-
unsub();
|
|
102
|
-
notifications.sendReconnected();
|
|
103
|
-
expect(cb.mock.calls.length).toBe(0);
|
|
104
|
-
});
|
|
105
|
-
});
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
import { HMSReactiveStore, HMSStore, IHMSStore, selectLocalPeer, selectPeers } from '../../core';
|
|
2
|
-
import { localPeer, makeFakeStore } from '../fakeStore';
|
|
3
|
-
|
|
4
|
-
let store: IHMSStore;
|
|
5
|
-
let fakeData: HMSStore;
|
|
6
|
-
let cb: jest.Mock;
|
|
7
|
-
let initialState: HMSStore;
|
|
8
|
-
|
|
9
|
-
beforeEach(() => {
|
|
10
|
-
store = HMSReactiveStore.createNewHMSStore();
|
|
11
|
-
cb = jest.fn(val => val);
|
|
12
|
-
fakeData = makeFakeStore();
|
|
13
|
-
store.setState(store => {
|
|
14
|
-
Object.assign(store, fakeData);
|
|
15
|
-
});
|
|
16
|
-
initialState = store.getState();
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
const expectCalls = (n: number) => {
|
|
20
|
-
expect(cb.mock.calls.length).toBe(n);
|
|
21
|
-
};
|
|
22
|
-
const expectOneCall = () => {
|
|
23
|
-
expectCalls(1);
|
|
24
|
-
};
|
|
25
|
-
const expectTwoCalls = () => {
|
|
26
|
-
expectCalls(2);
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
const expectCallArgs = <T>(arg1: T, arg2?: T) => {
|
|
30
|
-
expect(cb.mock.calls[0][0]).toBe(arg1);
|
|
31
|
-
expect(cb.mock.calls[0][1]).toBe(arg2);
|
|
32
|
-
};
|
|
33
|
-
const expectCallArgs2 = <T>(arg1: T, arg2?: T) => {
|
|
34
|
-
expect(cb.mock.calls[1][0]).toBe(arg1);
|
|
35
|
-
expect(cb.mock.calls[1][1]).toBe(arg2);
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
const doUnrelatedChange = () => {
|
|
39
|
-
store.setState(draft => {
|
|
40
|
-
draft.room.isConnected = !draft.room.isConnected;
|
|
41
|
-
});
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
describe('test reactive store', () => {
|
|
45
|
-
const expectStoreChanged = () => {
|
|
46
|
-
expect(store.getState()).not.toBe(initialState);
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
const expectNoCalls = () => {
|
|
50
|
-
expectCalls(0);
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
test('getState works', () => {
|
|
54
|
-
expect(store.getState()).toEqual(fakeData);
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
it('sends both old and new to subscriber', () => {
|
|
58
|
-
store.subscribe(cb, selectLocalPeer);
|
|
59
|
-
const oldPeer = store.getState(selectLocalPeer);
|
|
60
|
-
store.setState(draft => {
|
|
61
|
-
draft.peers[localPeer.id].name = 'test2';
|
|
62
|
-
});
|
|
63
|
-
const newPeer = store.getState(selectLocalPeer);
|
|
64
|
-
expect(newPeer).not.toBe(oldPeer);
|
|
65
|
-
expectStoreChanged();
|
|
66
|
-
expectOneCall();
|
|
67
|
-
expectCallArgs(newPeer, oldPeer);
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
it('does not notify on no changes or unrelated changes', () => {
|
|
71
|
-
store.subscribe(cb, selectLocalPeer);
|
|
72
|
-
const oldPeer = store.getState(selectLocalPeer);
|
|
73
|
-
store.setState(draft => {
|
|
74
|
-
draft.peers[localPeer.id].name = oldPeer.name;
|
|
75
|
-
});
|
|
76
|
-
doUnrelatedChange();
|
|
77
|
-
expectStoreChanged();
|
|
78
|
-
const newPeer = store.getState(selectLocalPeer);
|
|
79
|
-
expect(newPeer).toBe(oldPeer);
|
|
80
|
-
expectNoCalls();
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
it('does not notify on unrelated changes for derived selectors', () => {
|
|
84
|
-
store.subscribe(cb, selectPeers);
|
|
85
|
-
doUnrelatedChange();
|
|
86
|
-
expectStoreChanged();
|
|
87
|
-
expectNoCalls();
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
it('triggers on listening to whole state without selector', () => {
|
|
91
|
-
store.subscribe(cb);
|
|
92
|
-
doUnrelatedChange();
|
|
93
|
-
expectStoreChanged();
|
|
94
|
-
expectOneCall();
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
describe('store with trigger on subscribe', () => {
|
|
99
|
-
beforeEach(() => {
|
|
100
|
-
HMSReactiveStore.makeStoreTriggerOnSubscribe(store);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
it('triggers on subscribe', () => {
|
|
104
|
-
store.subscribe(cb, selectLocalPeer);
|
|
105
|
-
const peer = store.getState(selectLocalPeer);
|
|
106
|
-
expectOneCall();
|
|
107
|
-
expectCallArgs(peer);
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
it('does not trigger again on unrelated change', () => {
|
|
111
|
-
store.subscribe(cb, selectLocalPeer);
|
|
112
|
-
const peer = store.getState(selectLocalPeer);
|
|
113
|
-
doUnrelatedChange();
|
|
114
|
-
expectOneCall();
|
|
115
|
-
expectCallArgs(peer);
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
it('triggers on subscribe and a change', () => {
|
|
119
|
-
store.subscribe(cb, selectLocalPeer);
|
|
120
|
-
const oldPeer = store.getState(selectLocalPeer);
|
|
121
|
-
store.setState(draft => {
|
|
122
|
-
draft.peers[localPeer.id].name = 'test2';
|
|
123
|
-
});
|
|
124
|
-
const newPeer = store.getState(selectLocalPeer);
|
|
125
|
-
expectTwoCalls();
|
|
126
|
-
expectCallArgs(oldPeer);
|
|
127
|
-
expectCallArgs2(newPeer, oldPeer);
|
|
128
|
-
});
|
|
129
|
-
});
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
HMSStore,
|
|
3
|
-
selectAvailableRoleNames,
|
|
4
|
-
selectRolesMap,
|
|
5
|
-
selectLocalPeerRole,
|
|
6
|
-
selectRoleByRoleName,
|
|
7
|
-
selectRoleChangeRequest,
|
|
8
|
-
selectIsAllowedToPublish,
|
|
9
|
-
selectIsAllowedToSubscribe,
|
|
10
|
-
} from '../../core';
|
|
11
|
-
import { hostRole, localPeer, makeFakeStore, remotePeerOne, ROLES, speakerRole } from '../fakeStore';
|
|
12
|
-
|
|
13
|
-
let fakeStore: HMSStore;
|
|
14
|
-
|
|
15
|
-
// start from a new fake store for every test
|
|
16
|
-
beforeEach(() => {
|
|
17
|
-
fakeStore = makeFakeStore();
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
describe('test role related selectors', () => {
|
|
21
|
-
test('select roles', () => {
|
|
22
|
-
const storeRoles = selectRolesMap(fakeStore);
|
|
23
|
-
expect(storeRoles.host).not.toBeUndefined();
|
|
24
|
-
expect(storeRoles.speaker).not.toBeUndefined();
|
|
25
|
-
expect(storeRoles.viewer).not.toBeUndefined();
|
|
26
|
-
expect(storeRoles.student).toBeUndefined();
|
|
27
|
-
|
|
28
|
-
const roleNames = selectAvailableRoleNames(fakeStore);
|
|
29
|
-
expect(roleNames).toContain(ROLES.SPEAKER);
|
|
30
|
-
expect(roleNames).toContain(ROLES.HOST);
|
|
31
|
-
expect(roleNames).toContain(ROLES.VIEWER);
|
|
32
|
-
expect(roleNames).not.toContain('student');
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
test('select local peer role', () => {
|
|
36
|
-
expect(selectLocalPeerRole(fakeStore)).toBe(hostRole);
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
test('selectRole change request', () => {
|
|
40
|
-
const req = selectRoleChangeRequest(fakeStore);
|
|
41
|
-
expect(req?.requestedBy).toBe(remotePeerOne);
|
|
42
|
-
expect(req?.role.name).toBe(ROLES.SPEAKER);
|
|
43
|
-
expect(req?.role).toBe(speakerRole);
|
|
44
|
-
expect(req?.token).toBe('123');
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
test('select role by name', () => {
|
|
48
|
-
const storeHost = selectRoleByRoleName(ROLES.HOST)(fakeStore);
|
|
49
|
-
expect(storeHost).not.toBeUndefined();
|
|
50
|
-
expect(storeHost).toBe(hostRole);
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
test('publish params', () => {
|
|
54
|
-
localPeer.roleName = ROLES.SPEAKER;
|
|
55
|
-
const allowed = selectIsAllowedToPublish(fakeStore);
|
|
56
|
-
expect(allowed.audio).toBe(true);
|
|
57
|
-
expect(allowed.video).toBe(false);
|
|
58
|
-
expect(allowed.screen).toBe(false);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
test('publish params viewer', () => {
|
|
62
|
-
localPeer.roleName = ROLES.VIEWER;
|
|
63
|
-
const allowed = selectIsAllowedToPublish(fakeStore);
|
|
64
|
-
expect(allowed.audio).toBe(false);
|
|
65
|
-
expect(allowed.video).toBe(false);
|
|
66
|
-
expect(allowed.screen).toBe(false);
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
test('is subscription allowed true', () => {
|
|
70
|
-
localPeer.roleName = ROLES.SPEAKER;
|
|
71
|
-
expect(selectIsAllowedToSubscribe(fakeStore)).toBe(true);
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
test('is subscription allowed false', () => {
|
|
75
|
-
localPeer.roleName = ROLES.NOSUBSCRIBE;
|
|
76
|
-
expect(selectIsAllowedToSubscribe(fakeStore)).toBe(false);
|
|
77
|
-
});
|
|
78
|
-
});
|
|
@@ -1,316 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
auxiliaryAudio,
|
|
3
|
-
hostRole,
|
|
4
|
-
localAudio,
|
|
5
|
-
localPeer,
|
|
6
|
-
localSpeaker,
|
|
7
|
-
localVideo,
|
|
8
|
-
makeFakeStore,
|
|
9
|
-
peerScreenSharing,
|
|
10
|
-
remoteVideo,
|
|
11
|
-
screenShare,
|
|
12
|
-
screenshareAudio,
|
|
13
|
-
playlist,
|
|
14
|
-
remotePeerTwo,
|
|
15
|
-
remotePeerOne,
|
|
16
|
-
} from '../fakeStore';
|
|
17
|
-
import {
|
|
18
|
-
HMSStore,
|
|
19
|
-
selectCameraStreamByPeerID,
|
|
20
|
-
selectDominantSpeaker,
|
|
21
|
-
selectHMSMessages,
|
|
22
|
-
selectHMSMessagesCount,
|
|
23
|
-
selectIsConnectedToRoom,
|
|
24
|
-
selectIsLocalAudioEnabled,
|
|
25
|
-
selectIsLocalScreenShared,
|
|
26
|
-
selectIsLocalVideoDisplayEnabled,
|
|
27
|
-
selectIsLocalVideoEnabled,
|
|
28
|
-
selectIsPeerAudioEnabled,
|
|
29
|
-
selectIsPeerVideoEnabled,
|
|
30
|
-
selectIsSomeoneScreenSharing,
|
|
31
|
-
selectLocalAudioTrackID,
|
|
32
|
-
selectLocalMediaSettings,
|
|
33
|
-
selectLocalPeer,
|
|
34
|
-
selectLocalPeerID,
|
|
35
|
-
selectLocalVideoTrackID,
|
|
36
|
-
selectPeerAudioByID,
|
|
37
|
-
selectPeerByID,
|
|
38
|
-
selectPeerScreenSharing,
|
|
39
|
-
selectPeersScreenSharing,
|
|
40
|
-
selectPeersWithAudioStatus,
|
|
41
|
-
selectRemotePeers,
|
|
42
|
-
selectRoom,
|
|
43
|
-
selectAuxiliaryAudioByPeerID,
|
|
44
|
-
selectScreenShareByPeerID,
|
|
45
|
-
selectSpeakers,
|
|
46
|
-
selectUnreadHMSMessagesCount,
|
|
47
|
-
selectScreenShareAudioByPeerID,
|
|
48
|
-
selectAudioVolumeByPeerID,
|
|
49
|
-
selectAudioTrackVolume,
|
|
50
|
-
selectIsLocallyMutedByPeerID,
|
|
51
|
-
selectIsAudioLocallyMuted,
|
|
52
|
-
selectVideoTrackByPeerID,
|
|
53
|
-
selectAudioTrackByPeerID,
|
|
54
|
-
selectTrackAudioByID,
|
|
55
|
-
selectSimulcastLayerByTrack,
|
|
56
|
-
selectDegradedTracks,
|
|
57
|
-
selectPermissions,
|
|
58
|
-
selectRoomState,
|
|
59
|
-
HMSRoomState,
|
|
60
|
-
selectIsInPreview,
|
|
61
|
-
selectRoomStarted,
|
|
62
|
-
selectMessagesByPeerID,
|
|
63
|
-
selectMessagesByRole,
|
|
64
|
-
selectBroadcastMessages,
|
|
65
|
-
selectMessagesUnreadCountByRole,
|
|
66
|
-
selectBroadcastMessagesUnreadCount,
|
|
67
|
-
selectMessagesUnreadCountByPeerID,
|
|
68
|
-
selectAudioPlaylist,
|
|
69
|
-
selectVideoPlaylist,
|
|
70
|
-
selectPeersByRole,
|
|
71
|
-
selectPeers,
|
|
72
|
-
selectPeerMetadata,
|
|
73
|
-
} from '../../core';
|
|
74
|
-
|
|
75
|
-
let fakeStore: HMSStore;
|
|
76
|
-
|
|
77
|
-
// start from a new fake store for every test
|
|
78
|
-
beforeEach(() => {
|
|
79
|
-
fakeStore = makeFakeStore();
|
|
80
|
-
});
|
|
81
|
-
describe('test primitive selectors', () => {
|
|
82
|
-
test('selectRoom', () => {
|
|
83
|
-
expect(selectRoom(fakeStore)).toBe(fakeStore.room);
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
test('selectIsConnectedToRoom false', () => {
|
|
87
|
-
fakeStore.room.isConnected = false;
|
|
88
|
-
expect(selectIsConnectedToRoom(fakeStore)).toBe(false);
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
test('selectIsConnectedToRoom true', () => {
|
|
92
|
-
fakeStore.room.isConnected = true;
|
|
93
|
-
expect(selectIsConnectedToRoom(fakeStore)).toBe(true);
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
test('room state disconnected', () => {
|
|
97
|
-
expect(selectRoomState(fakeStore)).toBe(HMSRoomState.Disconnected);
|
|
98
|
-
expect(selectIsInPreview(fakeStore)).toBe(false);
|
|
99
|
-
expect(selectRoomStarted(fakeStore)).toBe(false);
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
test('room state preview/connected', () => {
|
|
103
|
-
fakeStore.room.roomState = HMSRoomState.Preview;
|
|
104
|
-
expect(selectIsInPreview(fakeStore)).toBe(true);
|
|
105
|
-
expect(selectRoomStarted(fakeStore)).toBe(true);
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
test('selectLocal things', () => {
|
|
109
|
-
expect(selectLocalMediaSettings(fakeStore)).toBe(fakeStore.settings);
|
|
110
|
-
expect(selectLocalPeer(fakeStore)).toBe(localPeer);
|
|
111
|
-
expect(selectLocalPeerID(fakeStore)).toBe(localPeer.id);
|
|
112
|
-
expect(selectLocalVideoTrackID(fakeStore)).toBe(localPeer.videoTrack);
|
|
113
|
-
expect(selectLocalAudioTrackID(fakeStore)).toBe(localPeer.audioTrack);
|
|
114
|
-
localAudio.enabled = true;
|
|
115
|
-
expect(selectIsLocalAudioEnabled(fakeStore)).toBe(true);
|
|
116
|
-
localAudio.enabled = false;
|
|
117
|
-
expect(selectIsLocalAudioEnabled(fakeStore)).toBe(false);
|
|
118
|
-
localVideo.enabled = true;
|
|
119
|
-
expect(selectIsLocalVideoEnabled(fakeStore)).toBe(true);
|
|
120
|
-
localVideo.enabled = false;
|
|
121
|
-
expect(selectIsLocalVideoEnabled(fakeStore)).toBe(false);
|
|
122
|
-
expect(selectIsLocalScreenShared(fakeStore)).toBe(false);
|
|
123
|
-
localVideo.displayEnabled = true;
|
|
124
|
-
expect(selectIsLocalVideoDisplayEnabled(fakeStore)).toBe(true);
|
|
125
|
-
expect(selectPermissions(fakeStore)?.mute).toBe(hostRole.permissions.mute);
|
|
126
|
-
expect(selectPermissions(fakeStore)?.unmute).toBe(hostRole.permissions.unmute);
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
describe('secondary selectors', () => {
|
|
131
|
-
test('screenshare related', () => {
|
|
132
|
-
expect(selectIsSomeoneScreenSharing(fakeStore)).toBe(true);
|
|
133
|
-
expect(selectPeerScreenSharing(fakeStore)).toBe(peerScreenSharing);
|
|
134
|
-
expect(selectPeersScreenSharing(fakeStore)).toEqual([peerScreenSharing]);
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
test('messages related', () => {
|
|
138
|
-
expect(selectHMSMessagesCount(fakeStore)).toBe(3);
|
|
139
|
-
expect(selectUnreadHMSMessagesCount(fakeStore)).toBe(1);
|
|
140
|
-
expect(selectHMSMessages(fakeStore)).toEqual([
|
|
141
|
-
fakeStore.messages.byID['201'],
|
|
142
|
-
fakeStore.messages.byID['202'],
|
|
143
|
-
fakeStore.messages.byID['203'],
|
|
144
|
-
]);
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
test('speakers', () => {
|
|
148
|
-
expect(selectSpeakers(fakeStore)).toBe(fakeStore.speakers);
|
|
149
|
-
fakeStore.speakers[peerScreenSharing.audioTrack!] = {
|
|
150
|
-
audioLevel: 10,
|
|
151
|
-
peerID: peerScreenSharing.id,
|
|
152
|
-
trackID: peerScreenSharing.audioTrack!,
|
|
153
|
-
};
|
|
154
|
-
expect(selectDominantSpeaker(fakeStore)).toBe(localPeer);
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
test('remote peers', () => {
|
|
158
|
-
expect(selectRemotePeers(fakeStore)).toEqual([remotePeerOne, remotePeerTwo]);
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
test('some track degraded', () => {
|
|
162
|
-
remoteVideo.degraded = true;
|
|
163
|
-
screenShare.degraded = true;
|
|
164
|
-
expect(selectDegradedTracks(fakeStore)).toContain(remoteVideo);
|
|
165
|
-
expect(selectDegradedTracks(fakeStore)).toContain(screenShare);
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
test('audio playlist related', () => {
|
|
169
|
-
const list = Object.values(playlist.audio.list);
|
|
170
|
-
expect(selectAudioPlaylist.list(fakeStore)).toEqual(list);
|
|
171
|
-
expect(selectAudioPlaylist.progress(fakeStore)).toBe(20);
|
|
172
|
-
expect(selectAudioPlaylist.currentTime(fakeStore)).toBe(10);
|
|
173
|
-
expect(selectAudioPlaylist.playbackRate(fakeStore)).toBe(0.5);
|
|
174
|
-
expect(selectAudioPlaylist.selection(fakeStore)).toEqual({
|
|
175
|
-
id: list[0].id,
|
|
176
|
-
hasNext: true,
|
|
177
|
-
hasPrevious: false,
|
|
178
|
-
});
|
|
179
|
-
expect(selectAudioPlaylist.selectedItem(fakeStore)).toEqual(list[0]);
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
test('video playlist related', () => {
|
|
183
|
-
const list = Object.values(playlist.video.list);
|
|
184
|
-
expect(selectVideoPlaylist.list(fakeStore)).toEqual(list);
|
|
185
|
-
expect(selectVideoPlaylist.progress(fakeStore)).toBe(30);
|
|
186
|
-
expect(selectVideoPlaylist.currentTime(fakeStore)).toBe(20);
|
|
187
|
-
expect(selectVideoPlaylist.playbackRate(fakeStore)).toBe(1.0);
|
|
188
|
-
expect(selectVideoPlaylist.selection(fakeStore)).toEqual({
|
|
189
|
-
id: list[0].id,
|
|
190
|
-
hasNext: true,
|
|
191
|
-
hasPrevious: false,
|
|
192
|
-
});
|
|
193
|
-
expect(selectVideoPlaylist.selectedItem(fakeStore)).toEqual(list[0]);
|
|
194
|
-
});
|
|
195
|
-
});
|
|
196
|
-
|
|
197
|
-
describe('by ID selectors', () => {
|
|
198
|
-
test('select peer by id', () => {
|
|
199
|
-
expect(selectPeerByID(localPeer.id)(fakeStore)).toBe(localPeer);
|
|
200
|
-
expect(selectPeerByID(peerScreenSharing.id)(fakeStore)).toBe(peerScreenSharing);
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
test('select peer AV enabled', () => {
|
|
204
|
-
localAudio.enabled = false;
|
|
205
|
-
localVideo.enabled = true;
|
|
206
|
-
expect(selectIsPeerAudioEnabled(localPeer.id)(fakeStore)).toBe(false);
|
|
207
|
-
expect(selectIsPeerVideoEnabled(localPeer.id)(fakeStore)).toBe(true);
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
test('selectVideoTrack', () => {
|
|
211
|
-
expect(selectVideoTrackByPeerID(localPeer.id)(fakeStore)).toBe(localVideo);
|
|
212
|
-
expect(selectCameraStreamByPeerID(localPeer.id)(fakeStore)).toBe(localVideo);
|
|
213
|
-
expect(selectScreenShareByPeerID(peerScreenSharing.id)(fakeStore)).toBe(screenShare);
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
test('selectAudioTrack', () => {
|
|
217
|
-
expect(selectAudioTrackByPeerID(localPeer.id)(fakeStore)).toBe(localAudio);
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
test('selectAuxiliaryAudio', () => {
|
|
221
|
-
expect(selectAuxiliaryAudioByPeerID(peerScreenSharing.id)(fakeStore)).toBe(auxiliaryAudio);
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
test('selectScreenshareAudio', () => {
|
|
225
|
-
expect(selectScreenShareAudioByPeerID(peerScreenSharing.id)(fakeStore)).toBe(screenshareAudio);
|
|
226
|
-
});
|
|
227
|
-
|
|
228
|
-
test('selectTrackAudioByID', () => {
|
|
229
|
-
expect(selectTrackAudioByID(localAudio.id)(fakeStore)).toBe(localSpeaker.audioLevel);
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
test('selectPeerAudioByID', () => {
|
|
233
|
-
expect(selectPeerAudioByID(localPeer.id)(fakeStore)).toBe(localSpeaker.audioLevel);
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
test('selectAudioVolumeByPeerID', () => {
|
|
237
|
-
expect(selectAudioVolumeByPeerID(localPeer.id)(fakeStore)).toBe(localAudio.volume);
|
|
238
|
-
});
|
|
239
|
-
|
|
240
|
-
test('selectAudioVolumeByTrackID', () => {
|
|
241
|
-
expect(selectAudioTrackVolume(localPeer.audioTrack)(fakeStore)).toBe(localAudio.volume);
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
test('selectLocallyMutedByPeerID', () => {
|
|
245
|
-
expect(selectIsLocallyMutedByPeerID(localPeer.id)(fakeStore)).toBe(false);
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
test('selectLocallyMutedByTrackID', () => {
|
|
249
|
-
expect(selectIsAudioLocallyMuted(localPeer.audioTrack)(fakeStore)).toBe(false);
|
|
250
|
-
});
|
|
251
|
-
|
|
252
|
-
test('selectSimulcastLayerByTrack', () => {
|
|
253
|
-
const peer = selectRemotePeers(fakeStore);
|
|
254
|
-
const track = selectVideoTrackByPeerID(peer[0].id)(fakeStore);
|
|
255
|
-
expect(selectSimulcastLayerByTrack(track?.id)(fakeStore)).toBe(track?.layer);
|
|
256
|
-
});
|
|
257
|
-
|
|
258
|
-
test('selectMessagesByPeerID', () => {
|
|
259
|
-
const peer = selectRemotePeers(fakeStore);
|
|
260
|
-
const messages = selectMessagesByPeerID(peer[0].id)(fakeStore);
|
|
261
|
-
expect(messages).toEqual([fakeStore.messages.byID['202']]);
|
|
262
|
-
});
|
|
263
|
-
|
|
264
|
-
test('selectMessagesByRole', () => {
|
|
265
|
-
const peer = selectRemotePeers(fakeStore);
|
|
266
|
-
const messages = selectMessagesByRole(peer[0].roleName)(fakeStore);
|
|
267
|
-
expect(messages).toEqual([fakeStore.messages.byID['203']]);
|
|
268
|
-
});
|
|
269
|
-
|
|
270
|
-
test('selectBroadcastMessages', () => {
|
|
271
|
-
const messages = selectBroadcastMessages(fakeStore);
|
|
272
|
-
expect(messages).toEqual([fakeStore.messages.byID['201']]);
|
|
273
|
-
});
|
|
274
|
-
|
|
275
|
-
test('selectMessagesUnreadCountByRole', () => {
|
|
276
|
-
const peer = selectRemotePeers(fakeStore);
|
|
277
|
-
const messages = selectMessagesUnreadCountByRole(peer[0].roleName)(fakeStore);
|
|
278
|
-
expect(messages).toBe(0);
|
|
279
|
-
});
|
|
280
|
-
|
|
281
|
-
test('selectMessagesUnreadCountByPeerID', () => {
|
|
282
|
-
const peer = selectRemotePeers(fakeStore);
|
|
283
|
-
const messages = selectMessagesUnreadCountByPeerID(peer[0].id)(fakeStore);
|
|
284
|
-
expect(messages).toBe(1);
|
|
285
|
-
});
|
|
286
|
-
|
|
287
|
-
test('selectBroadcastMessagesUnreadCount', () => {
|
|
288
|
-
const messages = selectBroadcastMessagesUnreadCount(fakeStore);
|
|
289
|
-
expect(messages).toBe(0);
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
test('selectPeersByRole', () => {
|
|
293
|
-
expect(selectPeersByRole('speaker')(fakeStore)).toEqual([remotePeerTwo]);
|
|
294
|
-
// If role is not present
|
|
295
|
-
expect(selectPeersByRole('incognito')(fakeStore)).toEqual([]);
|
|
296
|
-
});
|
|
297
|
-
|
|
298
|
-
test('selectPeerMetadata', () => {
|
|
299
|
-
const peers = selectPeers(fakeStore);
|
|
300
|
-
const metadata1 = selectPeerMetadata(peers[0].id)(fakeStore);
|
|
301
|
-
expect(metadata1).toEqual({});
|
|
302
|
-
const metadata2 = selectPeerMetadata(peers[1].id)(fakeStore);
|
|
303
|
-
expect(metadata2).toEqual({ hello: 'world' });
|
|
304
|
-
});
|
|
305
|
-
});
|
|
306
|
-
|
|
307
|
-
describe('derived selectors', () => {
|
|
308
|
-
test('select peer with audio status', () => {
|
|
309
|
-
localAudio.enabled = true;
|
|
310
|
-
expect(selectPeersWithAudioStatus(fakeStore)).toEqual([
|
|
311
|
-
{ peer: localPeer, isAudioEnabled: true },
|
|
312
|
-
{ peer: peerScreenSharing, isAudioEnabled: false },
|
|
313
|
-
{ peer: remotePeerTwo, isAudioEnabled: false },
|
|
314
|
-
]);
|
|
315
|
-
});
|
|
316
|
-
});
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { localAudio, localVideo, makeFakeStore } from '../fakeStore';
|
|
2
|
-
import { HMSStore, selectIsLocalVideoPluginPresent, selectIsLocalAudioPluginPresent } from '../../core';
|
|
3
|
-
|
|
4
|
-
let fakeStore: HMSStore;
|
|
5
|
-
|
|
6
|
-
// start from a new fake store for every test
|
|
7
|
-
beforeEach(() => {
|
|
8
|
-
fakeStore = makeFakeStore();
|
|
9
|
-
});
|
|
10
|
-
describe('test selectors by reference', () => {
|
|
11
|
-
test('select is plugin present', () => {
|
|
12
|
-
localVideo.plugins = ['plugin1', 'plugin2'];
|
|
13
|
-
localAudio.plugins = ['plugin1', 'plugin2'];
|
|
14
|
-
|
|
15
|
-
expect(selectIsLocalVideoPluginPresent('plugin1')(fakeStore)).toBe(true);
|
|
16
|
-
expect(selectIsLocalVideoPluginPresent('plugin2')(fakeStore)).toBe(true);
|
|
17
|
-
expect(selectIsLocalVideoPluginPresent('plugin3')(fakeStore)).toBe(false);
|
|
18
|
-
|
|
19
|
-
expect(selectIsLocalAudioPluginPresent('plugin1')(fakeStore)).toBe(true);
|
|
20
|
-
expect(selectIsLocalAudioPluginPresent('plugin2')(fakeStore)).toBe(true);
|
|
21
|
-
expect(selectIsLocalAudioPluginPresent('plugin3')(fakeStore)).toBe(false);
|
|
22
|
-
});
|
|
23
|
-
});
|