@stream-io/video-client 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/dist/index.browser.es.js +325 -421
- package/dist/index.browser.es.js.map +1 -1
- package/dist/index.cjs.js +325 -421
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +325 -421
- package/dist/index.es.js.map +1 -1
- package/dist/src/Call.d.ts +8 -10
- package/dist/src/StreamVideoClient.d.ts +3 -1
- package/dist/src/events/call-permissions.d.ts +0 -5
- package/dist/src/events/call.d.ts +0 -6
- package/dist/src/events/index.d.ts +0 -6
- package/dist/src/gen/coordinator/index.d.ts +25 -0
- package/dist/src/rtc/Dispatcher.d.ts +2 -2
- package/dist/src/rtc/Publisher.d.ts +0 -1
- package/dist/src/store/CallState.d.ts +164 -89
- package/dist/src/types.d.ts +1 -7
- package/dist/version.d.ts +1 -1
- package/package.json +1 -1
- package/src/Call.ts +37 -44
- package/src/StreamVideoClient.ts +14 -17
- package/src/events/__tests__/call-permissions.test.ts +1 -61
- package/src/events/__tests__/call.test.ts +5 -50
- package/src/events/call-permissions.ts +0 -14
- package/src/events/call.ts +5 -16
- package/src/events/callEventHandlers.ts +2 -57
- package/src/events/index.ts +0 -6
- package/src/gen/coordinator/index.ts +25 -0
- package/src/rtc/Dispatcher.ts +2 -2
- package/src/rtc/Publisher.ts +4 -6
- package/src/store/CallState.ts +475 -119
- package/src/store/__tests__/CallState.test.ts +447 -1
- package/src/types.ts +0 -8
- package/dist/src/events/__tests__/backstage.test.d.ts +0 -1
- package/dist/src/events/__tests__/members.test.d.ts +0 -1
- package/dist/src/events/__tests__/recording.test.d.ts +0 -1
- package/dist/src/events/__tests__/sessions.test.d.ts +0 -1
- package/dist/src/events/backstage.d.ts +0 -6
- package/dist/src/events/members.d.ts +0 -18
- package/dist/src/events/moderation.d.ts +0 -14
- package/dist/src/events/reactions.d.ts +0 -8
- package/dist/src/events/recording.d.ts +0 -18
- package/dist/src/events/sessions.d.ts +0 -26
- package/src/events/__tests__/backstage.test.ts +0 -15
- package/src/events/__tests__/members.test.ts +0 -135
- package/src/events/__tests__/recording.test.ts +0 -65
- package/src/events/__tests__/sessions.test.ts +0 -135
- package/src/events/backstage.ts +0 -15
- package/src/events/members.ts +0 -62
- package/src/events/moderation.ts +0 -35
- package/src/events/reactions.ts +0 -30
- package/src/events/recording.ts +0 -64
- package/src/events/sessions.ts +0 -102
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { MemberResponse } from '../../gen/coordinator';
|
|
3
|
-
import { CallState } from '../../store';
|
|
4
|
-
import {
|
|
5
|
-
watchCallMemberAdded,
|
|
6
|
-
watchCallMemberRemoved,
|
|
7
|
-
watchCallMemberUpdated,
|
|
8
|
-
watchCallMemberUpdatedPermission,
|
|
9
|
-
} from '../members';
|
|
10
|
-
import { StreamVideoEvent } from '../../coordinator/connection/types';
|
|
11
|
-
|
|
12
|
-
describe('member events', () => {
|
|
13
|
-
it('handles call.member_added events', () => {
|
|
14
|
-
const state = new CallState();
|
|
15
|
-
const initialMembers: MemberResponse[] = [
|
|
16
|
-
{
|
|
17
|
-
user_id: 'user0',
|
|
18
|
-
} as MemberResponse,
|
|
19
|
-
];
|
|
20
|
-
state.setMembers(initialMembers);
|
|
21
|
-
const handler = watchCallMemberAdded(state);
|
|
22
|
-
handler({
|
|
23
|
-
type: 'call.member_added',
|
|
24
|
-
members: [
|
|
25
|
-
{ user_id: 'user1' } as MemberResponse,
|
|
26
|
-
{ user_id: 'user2' } as MemberResponse,
|
|
27
|
-
],
|
|
28
|
-
} as StreamVideoEvent);
|
|
29
|
-
|
|
30
|
-
const updatedMembers = state.members;
|
|
31
|
-
updatedMembers.forEach((member, index) =>
|
|
32
|
-
expect(member.user_id).toBe(`user${index}`),
|
|
33
|
-
);
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
it('handles call.member_removed events', () => {
|
|
37
|
-
const state = new CallState();
|
|
38
|
-
const initialMembers: MemberResponse[] = [
|
|
39
|
-
{
|
|
40
|
-
user_id: 'user0',
|
|
41
|
-
} as MemberResponse,
|
|
42
|
-
{
|
|
43
|
-
user_id: 'user1',
|
|
44
|
-
} as MemberResponse,
|
|
45
|
-
{
|
|
46
|
-
user_id: 'user2',
|
|
47
|
-
} as MemberResponse,
|
|
48
|
-
];
|
|
49
|
-
state.setMembers(initialMembers);
|
|
50
|
-
const removedMembers = ['user1'];
|
|
51
|
-
const handler = watchCallMemberRemoved(state);
|
|
52
|
-
handler({
|
|
53
|
-
type: 'call.member_removed',
|
|
54
|
-
members: removedMembers,
|
|
55
|
-
} as StreamVideoEvent);
|
|
56
|
-
|
|
57
|
-
const updatedMembers = state.members;
|
|
58
|
-
expect(updatedMembers[0].user_id).toBe('user0');
|
|
59
|
-
expect(updatedMembers[1].user_id).toBe('user2');
|
|
60
|
-
expect(updatedMembers.length).toBe(
|
|
61
|
-
initialMembers.length - removedMembers.length,
|
|
62
|
-
);
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
it('handles call.member_updated_permission events', () => {
|
|
66
|
-
const state = new CallState();
|
|
67
|
-
const user0 = {
|
|
68
|
-
user_id: 'user0',
|
|
69
|
-
user: {
|
|
70
|
-
role: 'viewer',
|
|
71
|
-
},
|
|
72
|
-
} as MemberResponse;
|
|
73
|
-
const user1 = {
|
|
74
|
-
user_id: 'user1',
|
|
75
|
-
user: {
|
|
76
|
-
role: 'host',
|
|
77
|
-
},
|
|
78
|
-
} as MemberResponse;
|
|
79
|
-
const user2 = {
|
|
80
|
-
user_id: 'user2',
|
|
81
|
-
user: {
|
|
82
|
-
role: 'viewer',
|
|
83
|
-
},
|
|
84
|
-
} as MemberResponse;
|
|
85
|
-
const initialMembers: MemberResponse[] = [user0, user1, user2];
|
|
86
|
-
state.setMembers(initialMembers);
|
|
87
|
-
const handler = watchCallMemberUpdatedPermission(state);
|
|
88
|
-
handler({
|
|
89
|
-
type: 'call.member_updated_permission',
|
|
90
|
-
members: [
|
|
91
|
-
{ ...user1, role: 'viewer' },
|
|
92
|
-
{ ...user0, role: 'host' },
|
|
93
|
-
],
|
|
94
|
-
} as StreamVideoEvent);
|
|
95
|
-
|
|
96
|
-
const updatedMembers = state.members;
|
|
97
|
-
expect(updatedMembers[0].user.role).toBe('host');
|
|
98
|
-
expect(updatedMembers[1].user.role).toBe('viewer');
|
|
99
|
-
expect(updatedMembers[2].user.role).toBe('viewer');
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
it('handles call.member_updated events', () => {
|
|
103
|
-
const state = new CallState();
|
|
104
|
-
const user0 = {
|
|
105
|
-
user_id: 'user0',
|
|
106
|
-
user: {
|
|
107
|
-
name: 'Jane',
|
|
108
|
-
},
|
|
109
|
-
} as MemberResponse;
|
|
110
|
-
const user1 = {
|
|
111
|
-
user_id: 'user1',
|
|
112
|
-
user: {
|
|
113
|
-
name: 'Jack',
|
|
114
|
-
},
|
|
115
|
-
} as MemberResponse;
|
|
116
|
-
const user2 = {
|
|
117
|
-
user_id: 'user2',
|
|
118
|
-
user: {
|
|
119
|
-
name: 'Adam',
|
|
120
|
-
},
|
|
121
|
-
} as MemberResponse;
|
|
122
|
-
const initialMembers: MemberResponse[] = [user0, user1, user2];
|
|
123
|
-
state.setMembers(initialMembers);
|
|
124
|
-
const handler = watchCallMemberUpdated(state);
|
|
125
|
-
handler({
|
|
126
|
-
type: 'call.member_updated',
|
|
127
|
-
members: [{ ...user1, user: { name: 'John' } }],
|
|
128
|
-
} as StreamVideoEvent);
|
|
129
|
-
|
|
130
|
-
const updatedMembers = state.members;
|
|
131
|
-
expect(updatedMembers[0].user.name).toBe('Jane');
|
|
132
|
-
expect(updatedMembers[1].user.name).toBe('John');
|
|
133
|
-
expect(updatedMembers[2].user.name).toBe('Adam');
|
|
134
|
-
});
|
|
135
|
-
});
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { CallState } from '../../store';
|
|
3
|
-
import {
|
|
4
|
-
watchCallBroadcastingStarted,
|
|
5
|
-
watchCallBroadcastingStopped,
|
|
6
|
-
watchCallRecordingStarted,
|
|
7
|
-
watchCallRecordingStopped,
|
|
8
|
-
} from '../recording';
|
|
9
|
-
|
|
10
|
-
describe('recording and broadcasting events', () => {
|
|
11
|
-
it('handles call.recording_started events', () => {
|
|
12
|
-
const state = new CallState();
|
|
13
|
-
const handler = watchCallRecordingStarted(state);
|
|
14
|
-
// @ts-ignore
|
|
15
|
-
handler({
|
|
16
|
-
type: 'call.recording_started',
|
|
17
|
-
});
|
|
18
|
-
expect(state.metadata?.recording).toBe(true);
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it('handles call.recording_stopped events', () => {
|
|
22
|
-
const state = new CallState();
|
|
23
|
-
const handler = watchCallRecordingStopped(state);
|
|
24
|
-
// @ts-ignore
|
|
25
|
-
handler({
|
|
26
|
-
type: 'call.recording_stopped',
|
|
27
|
-
});
|
|
28
|
-
expect(state.metadata?.recording).toBe(false);
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
it('handles call.broadcasting_started events', () => {
|
|
32
|
-
const state = new CallState();
|
|
33
|
-
state.setMetadata({
|
|
34
|
-
// @ts-ignore
|
|
35
|
-
egress: {
|
|
36
|
-
broadcasting: false,
|
|
37
|
-
hls: {
|
|
38
|
-
playlist_url: '',
|
|
39
|
-
},
|
|
40
|
-
},
|
|
41
|
-
});
|
|
42
|
-
const handler = watchCallBroadcastingStarted(state);
|
|
43
|
-
// @ts-ignore
|
|
44
|
-
handler({
|
|
45
|
-
type: 'call.broadcasting_started',
|
|
46
|
-
hls_playlist_url: 'https://example.com/playlist.m3u8',
|
|
47
|
-
});
|
|
48
|
-
expect(state.metadata?.egress.broadcasting).toBe(true);
|
|
49
|
-
expect(state.metadata?.egress.hls?.playlist_url).toBe(
|
|
50
|
-
'https://example.com/playlist.m3u8',
|
|
51
|
-
);
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it('handles call.broadcasting_stopped events', () => {
|
|
55
|
-
const state = new CallState();
|
|
56
|
-
// @ts-ignore
|
|
57
|
-
state.setMetadata({});
|
|
58
|
-
const handler = watchCallBroadcastingStopped(state);
|
|
59
|
-
// @ts-ignore
|
|
60
|
-
handler({
|
|
61
|
-
type: 'call.broadcasting_stopped',
|
|
62
|
-
});
|
|
63
|
-
expect(state.metadata?.egress.broadcasting).toBe(false);
|
|
64
|
-
});
|
|
65
|
-
});
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import {
|
|
3
|
-
watchCallSessionEnded,
|
|
4
|
-
watchCallSessionParticipantJoined,
|
|
5
|
-
watchCallSessionParticipantLeft,
|
|
6
|
-
watchCallSessionStarted,
|
|
7
|
-
} from '../sessions';
|
|
8
|
-
import { CallState } from '../../store';
|
|
9
|
-
|
|
10
|
-
describe('call.session events', () => {
|
|
11
|
-
it('should update the call metadata when a session starts', () => {
|
|
12
|
-
const state = new CallState();
|
|
13
|
-
const handler = watchCallSessionStarted(state);
|
|
14
|
-
handler({
|
|
15
|
-
type: 'call.session_started',
|
|
16
|
-
call: {
|
|
17
|
-
cid: 'cid',
|
|
18
|
-
// @ts-ignore
|
|
19
|
-
session: {
|
|
20
|
-
id: 'session-id',
|
|
21
|
-
},
|
|
22
|
-
},
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
expect(state.metadata).toEqual({
|
|
26
|
-
cid: 'cid',
|
|
27
|
-
session: {
|
|
28
|
-
id: 'session-id',
|
|
29
|
-
},
|
|
30
|
-
});
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
it('should update the call metadata when a session ends', () => {
|
|
34
|
-
const state = new CallState();
|
|
35
|
-
const handler = watchCallSessionEnded(state);
|
|
36
|
-
handler({
|
|
37
|
-
type: 'call.session_ended',
|
|
38
|
-
call: {
|
|
39
|
-
cid: 'cid',
|
|
40
|
-
// @ts-ignore
|
|
41
|
-
session: {
|
|
42
|
-
id: 'session-id',
|
|
43
|
-
},
|
|
44
|
-
},
|
|
45
|
-
});
|
|
46
|
-
expect(state.metadata).toEqual({
|
|
47
|
-
cid: 'cid',
|
|
48
|
-
session: {
|
|
49
|
-
id: 'session-id',
|
|
50
|
-
},
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it('should update the call metadata when a participant joins', () => {
|
|
55
|
-
const state = new CallState();
|
|
56
|
-
state.setMetadata({
|
|
57
|
-
// @ts-ignore
|
|
58
|
-
session: {
|
|
59
|
-
participants: [],
|
|
60
|
-
participants_count_by_role: {},
|
|
61
|
-
},
|
|
62
|
-
});
|
|
63
|
-
const handler = watchCallSessionParticipantJoined(state);
|
|
64
|
-
handler({
|
|
65
|
-
type: 'call.session_participant_joined',
|
|
66
|
-
participant: {
|
|
67
|
-
// @ts-ignore
|
|
68
|
-
user: {
|
|
69
|
-
id: 'user-id',
|
|
70
|
-
role: 'user',
|
|
71
|
-
},
|
|
72
|
-
user_session_id: '123',
|
|
73
|
-
},
|
|
74
|
-
});
|
|
75
|
-
expect(state.metadata).toEqual({
|
|
76
|
-
session: {
|
|
77
|
-
participants: [
|
|
78
|
-
{
|
|
79
|
-
user: {
|
|
80
|
-
id: 'user-id',
|
|
81
|
-
role: 'user',
|
|
82
|
-
},
|
|
83
|
-
user_session_id: '123',
|
|
84
|
-
},
|
|
85
|
-
],
|
|
86
|
-
participants_count_by_role: {
|
|
87
|
-
user: 1,
|
|
88
|
-
},
|
|
89
|
-
},
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
it('should update the call metadata when a participant leaves', () => {
|
|
94
|
-
const state = new CallState();
|
|
95
|
-
state.setMetadata({
|
|
96
|
-
// @ts-ignore
|
|
97
|
-
session: {
|
|
98
|
-
participants: [
|
|
99
|
-
{
|
|
100
|
-
joined_at: '2021-01-01T00:00:00.000Z',
|
|
101
|
-
// @ts-ignore
|
|
102
|
-
user: {
|
|
103
|
-
id: 'user-id',
|
|
104
|
-
role: 'user',
|
|
105
|
-
},
|
|
106
|
-
user_session_id: '123',
|
|
107
|
-
},
|
|
108
|
-
],
|
|
109
|
-
participants_count_by_role: {
|
|
110
|
-
user: 1,
|
|
111
|
-
},
|
|
112
|
-
},
|
|
113
|
-
});
|
|
114
|
-
const handler = watchCallSessionParticipantLeft(state);
|
|
115
|
-
handler({
|
|
116
|
-
type: 'call.session_participant_left',
|
|
117
|
-
participant: {
|
|
118
|
-
// @ts-ignore
|
|
119
|
-
user: {
|
|
120
|
-
id: 'user-id',
|
|
121
|
-
role: 'user',
|
|
122
|
-
},
|
|
123
|
-
user_session_id: '123',
|
|
124
|
-
},
|
|
125
|
-
});
|
|
126
|
-
expect(state.metadata).toEqual({
|
|
127
|
-
session: {
|
|
128
|
-
participants: [],
|
|
129
|
-
participants_count_by_role: {
|
|
130
|
-
user: 0,
|
|
131
|
-
},
|
|
132
|
-
},
|
|
133
|
-
});
|
|
134
|
-
});
|
|
135
|
-
});
|
package/src/events/backstage.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { StreamVideoEvent } from '../coordinator/connection/types';
|
|
2
|
-
import { CallState } from '../store';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Watches for `call.live_started` events.
|
|
6
|
-
*/
|
|
7
|
-
export const watchCallLiveStarted = (state: CallState) => {
|
|
8
|
-
return function onCallLiveStarted(event: StreamVideoEvent) {
|
|
9
|
-
if (event.type !== 'call.live_started') return;
|
|
10
|
-
state.setMetadata((metadata) => ({
|
|
11
|
-
...metadata!,
|
|
12
|
-
backstage: false,
|
|
13
|
-
}));
|
|
14
|
-
};
|
|
15
|
-
};
|
package/src/events/members.ts
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import { StreamVideoEvent } from '../coordinator/connection/types';
|
|
2
|
-
import { CallState } from '../store';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Watches for `call.member_added` events.
|
|
6
|
-
*/
|
|
7
|
-
export const watchCallMemberAdded = (state: CallState) => {
|
|
8
|
-
return function onCallMemberAdded(event: StreamVideoEvent) {
|
|
9
|
-
if (event.type !== 'call.member_added') return;
|
|
10
|
-
state.setMembers((members) => [...members, ...event.members]);
|
|
11
|
-
};
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Watches for `call.member_removed` events.
|
|
16
|
-
*/
|
|
17
|
-
export const watchCallMemberRemoved = (state: CallState) => {
|
|
18
|
-
return function onCallMemberRemoved(event: StreamVideoEvent) {
|
|
19
|
-
if (event.type !== 'call.member_removed') return;
|
|
20
|
-
state.setMembers((members) =>
|
|
21
|
-
members.filter((m) => event.members.indexOf(m.user_id) === -1),
|
|
22
|
-
);
|
|
23
|
-
};
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Watches for `call.member_updated_permission` events.
|
|
28
|
-
*/
|
|
29
|
-
export const watchCallMemberUpdatedPermission = (state: CallState) => {
|
|
30
|
-
return function onCallMemberUpdated(event: StreamVideoEvent) {
|
|
31
|
-
if (event.type !== 'call.member_updated_permission') return;
|
|
32
|
-
state.setMembers((members) =>
|
|
33
|
-
members.map((member) => {
|
|
34
|
-
const memberUpdate = event.members.find(
|
|
35
|
-
(m) => m.user_id === member.user_id,
|
|
36
|
-
);
|
|
37
|
-
if (memberUpdate) {
|
|
38
|
-
member.user.role = memberUpdate.role!;
|
|
39
|
-
member = { ...member };
|
|
40
|
-
}
|
|
41
|
-
return member;
|
|
42
|
-
}),
|
|
43
|
-
);
|
|
44
|
-
};
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Watches for `call.member_updated` events.
|
|
49
|
-
*/
|
|
50
|
-
export const watchCallMemberUpdated = (state: CallState) => {
|
|
51
|
-
return function onCallMemberUpdated(event: StreamVideoEvent) {
|
|
52
|
-
if (event.type !== 'call.member_updated') return;
|
|
53
|
-
state.setMembers((members) =>
|
|
54
|
-
members.map((member) => {
|
|
55
|
-
const memberUpdate = event.members.find(
|
|
56
|
-
(m) => m.user_id === member.user_id,
|
|
57
|
-
);
|
|
58
|
-
return memberUpdate ? memberUpdate : member;
|
|
59
|
-
}),
|
|
60
|
-
);
|
|
61
|
-
};
|
|
62
|
-
};
|
package/src/events/moderation.ts
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { StreamVideoEvent } from '../coordinator/connection/types';
|
|
2
|
-
import { CallState } from '../store';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Event handler that watches for `call.blocked_user` events,
|
|
6
|
-
* updates the call store `blocked_user_ids` property by adding
|
|
7
|
-
* `event.user_id` to the list
|
|
8
|
-
*/
|
|
9
|
-
export const watchBlockedUser =
|
|
10
|
-
(state: CallState) => (event: StreamVideoEvent) => {
|
|
11
|
-
if (event.type !== 'call.blocked_user') return;
|
|
12
|
-
state.setMetadata((metadata) => ({
|
|
13
|
-
...metadata!,
|
|
14
|
-
blocked_user_ids: [...(metadata?.blocked_user_ids || []), event.user.id],
|
|
15
|
-
}));
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Event handler that watches for `call.unblocked_user` events,
|
|
20
|
-
* updates the call store `blocked_user_ids` property by
|
|
21
|
-
* removing `event.user_id` from the list
|
|
22
|
-
*/
|
|
23
|
-
export const watchUnblockedUser =
|
|
24
|
-
(state: CallState) => (event: StreamVideoEvent) => {
|
|
25
|
-
if (event.type !== 'call.unblocked_user') return;
|
|
26
|
-
state.setMetadata((metadata) => {
|
|
27
|
-
const blocked_user_ids = (metadata?.blocked_user_ids || []).filter(
|
|
28
|
-
(userId) => event.user.id !== userId,
|
|
29
|
-
);
|
|
30
|
-
return {
|
|
31
|
-
...metadata!,
|
|
32
|
-
blocked_user_ids,
|
|
33
|
-
};
|
|
34
|
-
});
|
|
35
|
-
};
|
package/src/events/reactions.ts
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { StreamVideoEvent } from '../coordinator/connection/types';
|
|
2
|
-
import { CallState } from '../store';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Watches the delivery of CallReactionEvent.
|
|
6
|
-
*
|
|
7
|
-
* @param state the state store to update.
|
|
8
|
-
*/
|
|
9
|
-
export const watchNewReactions = (state: CallState) => {
|
|
10
|
-
return function onNewReactions(event: StreamVideoEvent) {
|
|
11
|
-
if (event.type !== 'call.reaction_new') return;
|
|
12
|
-
const { reaction } = event;
|
|
13
|
-
const { user, custom, type, emoji_code } = reaction;
|
|
14
|
-
state.setParticipants((participants) => {
|
|
15
|
-
return participants.map((p) => {
|
|
16
|
-
// skip if the reaction is not for this participant
|
|
17
|
-
if (p.userId !== user.id) return p;
|
|
18
|
-
// update the participant with the new reaction
|
|
19
|
-
return {
|
|
20
|
-
...p,
|
|
21
|
-
reaction: {
|
|
22
|
-
type,
|
|
23
|
-
emoji_code,
|
|
24
|
-
custom,
|
|
25
|
-
},
|
|
26
|
-
};
|
|
27
|
-
});
|
|
28
|
-
});
|
|
29
|
-
};
|
|
30
|
-
};
|
package/src/events/recording.ts
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { CallState } from '../store';
|
|
2
|
-
import { StreamVideoEvent } from '../coordinator/connection/types';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Watches for `call.recording_started` events.
|
|
6
|
-
*/
|
|
7
|
-
export const watchCallRecordingStarted = (state: CallState) => {
|
|
8
|
-
return function onCallRecordingStarted(event: StreamVideoEvent) {
|
|
9
|
-
if (event.type !== 'call.recording_started') return;
|
|
10
|
-
state.setMetadata((metadata) => ({
|
|
11
|
-
...metadata!,
|
|
12
|
-
recording: true,
|
|
13
|
-
}));
|
|
14
|
-
};
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Watches for `call.recording_stopped` events.
|
|
19
|
-
*/
|
|
20
|
-
export const watchCallRecordingStopped = (state: CallState) => {
|
|
21
|
-
return function onCallRecordingStopped(event: StreamVideoEvent) {
|
|
22
|
-
if (event.type !== 'call.recording_stopped') return;
|
|
23
|
-
state.setMetadata((metadata) => ({
|
|
24
|
-
...metadata!,
|
|
25
|
-
recording: false,
|
|
26
|
-
}));
|
|
27
|
-
};
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Watches for `call.broadcasting_started` events.
|
|
32
|
-
*/
|
|
33
|
-
export const watchCallBroadcastingStarted = (state: CallState) => {
|
|
34
|
-
return function onCallBroadcastingStarted(event: StreamVideoEvent) {
|
|
35
|
-
if (event.type !== 'call.broadcasting_started') return;
|
|
36
|
-
state.setMetadata((metadata) => ({
|
|
37
|
-
...metadata!,
|
|
38
|
-
egress: {
|
|
39
|
-
...metadata!.egress,
|
|
40
|
-
broadcasting: true,
|
|
41
|
-
hls: {
|
|
42
|
-
...metadata!.egress.hls,
|
|
43
|
-
playlist_url: event.hls_playlist_url,
|
|
44
|
-
},
|
|
45
|
-
},
|
|
46
|
-
}));
|
|
47
|
-
};
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Watches for `call.broadcasting_stopped` events.
|
|
52
|
-
*/
|
|
53
|
-
export const watchCallBroadcastingStopped = (state: CallState) => {
|
|
54
|
-
return function onCallBroadcastingStopped(event: StreamVideoEvent) {
|
|
55
|
-
if (event.type !== 'call.broadcasting_stopped') return;
|
|
56
|
-
state.setMetadata((metadata) => ({
|
|
57
|
-
...metadata!,
|
|
58
|
-
egress: {
|
|
59
|
-
...metadata!.egress,
|
|
60
|
-
broadcasting: false,
|
|
61
|
-
},
|
|
62
|
-
}));
|
|
63
|
-
};
|
|
64
|
-
};
|
package/src/events/sessions.ts
DELETED
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import { CallState } from '../store';
|
|
2
|
-
import { StreamVideoEvent } from '../coordinator/connection/types';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Watch for call.session_started events and update the call metadata.
|
|
6
|
-
*
|
|
7
|
-
* @param state the call state.
|
|
8
|
-
*/
|
|
9
|
-
export const watchCallSessionStarted = (state: CallState) => {
|
|
10
|
-
return function onCallSessionStarted(event: StreamVideoEvent) {
|
|
11
|
-
if (event.type !== 'call.session_started') return;
|
|
12
|
-
state.setMetadata(event.call);
|
|
13
|
-
};
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Watch for call.session_ended events and update the call metadata.
|
|
18
|
-
*
|
|
19
|
-
* @param state the call state.
|
|
20
|
-
*/
|
|
21
|
-
export const watchCallSessionEnded = (state: CallState) => {
|
|
22
|
-
return function onCallSessionEnded(event: StreamVideoEvent) {
|
|
23
|
-
if (event.type !== 'call.session_ended') return;
|
|
24
|
-
state.setMetadata(event.call);
|
|
25
|
-
};
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Watch for call.session_participant_joined events and update the call metadata.
|
|
30
|
-
*
|
|
31
|
-
* @param state the call state.
|
|
32
|
-
*/
|
|
33
|
-
export const watchCallSessionParticipantJoined = (state: CallState) => {
|
|
34
|
-
return function onCallParticipantJoined(event: StreamVideoEvent) {
|
|
35
|
-
if (event.type !== 'call.session_participant_joined') return;
|
|
36
|
-
const { participant } = event;
|
|
37
|
-
state.setMetadata((metadata) => {
|
|
38
|
-
if (!metadata || !metadata.session) {
|
|
39
|
-
state.logger(
|
|
40
|
-
'warn',
|
|
41
|
-
`Received call.session_participant_joined event but the metadata structure is invalid.`,
|
|
42
|
-
event,
|
|
43
|
-
);
|
|
44
|
-
return metadata;
|
|
45
|
-
}
|
|
46
|
-
const { session } = metadata;
|
|
47
|
-
const { participants, participants_count_by_role } = session;
|
|
48
|
-
const { user } = participant;
|
|
49
|
-
return {
|
|
50
|
-
...metadata,
|
|
51
|
-
session: {
|
|
52
|
-
...session,
|
|
53
|
-
participants: [...participants, participant],
|
|
54
|
-
participants_count_by_role: {
|
|
55
|
-
...participants_count_by_role,
|
|
56
|
-
[user.role]: (participants_count_by_role[user.role] || 0) + 1,
|
|
57
|
-
},
|
|
58
|
-
},
|
|
59
|
-
};
|
|
60
|
-
});
|
|
61
|
-
};
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Watch for call.session_participant_left events and update the call metadata.
|
|
66
|
-
*
|
|
67
|
-
* @param state the call state.
|
|
68
|
-
*/
|
|
69
|
-
export const watchCallSessionParticipantLeft = (state: CallState) => {
|
|
70
|
-
return function onCallParticipantLeft(event: StreamVideoEvent) {
|
|
71
|
-
if (event.type !== 'call.session_participant_left') return;
|
|
72
|
-
const { user, user_session_id } = event.participant;
|
|
73
|
-
state.setMetadata((metadata) => {
|
|
74
|
-
if (!metadata || !metadata.session) {
|
|
75
|
-
state.logger(
|
|
76
|
-
'warn',
|
|
77
|
-
`Received call.session_participant_left event but the metadata structure is invalid.`,
|
|
78
|
-
event,
|
|
79
|
-
);
|
|
80
|
-
return metadata;
|
|
81
|
-
}
|
|
82
|
-
const { session } = metadata;
|
|
83
|
-
const { participants, participants_count_by_role } = session;
|
|
84
|
-
return {
|
|
85
|
-
...metadata,
|
|
86
|
-
session: {
|
|
87
|
-
...session,
|
|
88
|
-
participants: participants.filter(
|
|
89
|
-
(p) => p.user_session_id !== user_session_id,
|
|
90
|
-
),
|
|
91
|
-
participants_count_by_role: {
|
|
92
|
-
...participants_count_by_role,
|
|
93
|
-
[user.role]: Math.max(
|
|
94
|
-
0,
|
|
95
|
-
(participants_count_by_role[user.role] || 0) - 1,
|
|
96
|
-
),
|
|
97
|
-
},
|
|
98
|
-
},
|
|
99
|
-
};
|
|
100
|
-
});
|
|
101
|
-
};
|
|
102
|
-
};
|