meetkit-sdk 0.0.4 → 0.0.5
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/fesm2022/meetkit-sdk.mjs +149 -2
- package/fesm2022/meetkit-sdk.mjs.map +1 -1
- package/package.json +1 -1
- package/types/meetkit-sdk.d.ts +24 -0
package/fesm2022/meetkit-sdk.mjs
CHANGED
|
@@ -24,8 +24,13 @@ class Meeting {
|
|
|
24
24
|
socket;
|
|
25
25
|
peer;
|
|
26
26
|
localStream;
|
|
27
|
+
recorder;
|
|
28
|
+
recordedChunks = [];
|
|
27
29
|
messageSubject = new Subject();
|
|
28
30
|
messages$ = this.messageSubject.asObservable();
|
|
31
|
+
remoteStreamSubject = new Subject();
|
|
32
|
+
remoteStream$ = this.remoteStreamSubject.asObservable();
|
|
33
|
+
speakerInterval;
|
|
29
34
|
// connect to signaling server
|
|
30
35
|
connect(serverUrl) {
|
|
31
36
|
this.socket = io(serverUrl);
|
|
@@ -58,20 +63,162 @@ class Meeting {
|
|
|
58
63
|
}
|
|
59
64
|
// create peer connection
|
|
60
65
|
createPeerConnection() {
|
|
61
|
-
this.peer = new RTCPeerConnection(
|
|
66
|
+
this.peer = new RTCPeerConnection({
|
|
67
|
+
iceServers: [{ urls: 'stun:stun.l.google.com:19302' }],
|
|
68
|
+
});
|
|
62
69
|
// add local tracks
|
|
63
70
|
this.localStream.getTracks().forEach((track) => {
|
|
64
71
|
this.peer.addTrack(track, this.localStream);
|
|
65
72
|
});
|
|
66
73
|
// track remote stream
|
|
67
74
|
this.peer.ontrack = (event) => {
|
|
68
|
-
|
|
75
|
+
this.remoteStreamSubject.next(event.streams[0]);
|
|
69
76
|
};
|
|
70
77
|
}
|
|
71
78
|
// optional getter for peer if someone needs it
|
|
72
79
|
getPeerConnection() {
|
|
73
80
|
return this.peer;
|
|
74
81
|
}
|
|
82
|
+
// Mute audio
|
|
83
|
+
muteAudio() {
|
|
84
|
+
if (!this.localStream)
|
|
85
|
+
return;
|
|
86
|
+
this.localStream.getAudioTracks().forEach((track) => {
|
|
87
|
+
track.enabled = false;
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
// Unmute audio
|
|
91
|
+
unmuteAudio() {
|
|
92
|
+
if (!this.localStream)
|
|
93
|
+
return;
|
|
94
|
+
this.localStream.getAudioTracks().forEach((track) => {
|
|
95
|
+
track.enabled = true;
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
// Toggle audio
|
|
99
|
+
toggleAudio() {
|
|
100
|
+
if (!this.localStream)
|
|
101
|
+
return;
|
|
102
|
+
this.localStream.getAudioTracks().forEach((track) => {
|
|
103
|
+
track.enabled = !track.enabled;
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
// Turn off video
|
|
107
|
+
stopVideo() {
|
|
108
|
+
if (!this.localStream)
|
|
109
|
+
return;
|
|
110
|
+
this.localStream.getVideoTracks().forEach((track) => {
|
|
111
|
+
track.enabled = false;
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
// Turn on video
|
|
115
|
+
startVideo() {
|
|
116
|
+
if (!this.localStream)
|
|
117
|
+
return;
|
|
118
|
+
this.localStream.getVideoTracks().forEach((track) => {
|
|
119
|
+
track.enabled = true;
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
// Toggle video
|
|
123
|
+
toggleVideo() {
|
|
124
|
+
if (!this.localStream)
|
|
125
|
+
return;
|
|
126
|
+
this.localStream.getVideoTracks().forEach((track) => {
|
|
127
|
+
track.enabled = !track.enabled;
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
async startScreenShare() {
|
|
131
|
+
const screenStream = await navigator.mediaDevices.getDisplayMedia({
|
|
132
|
+
video: true,
|
|
133
|
+
});
|
|
134
|
+
const screenTrack = screenStream.getVideoTracks()[0];
|
|
135
|
+
const sender = this.peer.getSenders().find((s) => s.track?.kind === 'video');
|
|
136
|
+
if (sender) {
|
|
137
|
+
sender.replaceTrack(screenTrack);
|
|
138
|
+
}
|
|
139
|
+
// When user stops sharing
|
|
140
|
+
screenTrack.onended = () => {
|
|
141
|
+
this.stopScreenShare();
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
stopScreenShare() {
|
|
145
|
+
const videoTrack = this.localStream.getVideoTracks()[0];
|
|
146
|
+
const sender = this.peer.getSenders().find((s) => s.track?.kind === 'video');
|
|
147
|
+
if (sender) {
|
|
148
|
+
sender.replaceTrack(videoTrack);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
initializeListeners() {
|
|
152
|
+
this.socket.on('chat-message', (data) => {
|
|
153
|
+
this.messageSubject.next(data);
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
// Send reaction
|
|
157
|
+
sendReaction(roomId, emoji) {
|
|
158
|
+
this.socket.emit('reaction', { roomId, emoji });
|
|
159
|
+
}
|
|
160
|
+
// Listen reaction
|
|
161
|
+
onReaction(callback) {
|
|
162
|
+
this.socket.on('reaction', callback);
|
|
163
|
+
}
|
|
164
|
+
raiseHand(roomId) {
|
|
165
|
+
this.socket.emit('raise-hand', { roomId });
|
|
166
|
+
}
|
|
167
|
+
onRaiseHand(callback) {
|
|
168
|
+
this.socket.on('raise-hand', callback);
|
|
169
|
+
}
|
|
170
|
+
leaveMeeting(roomId) {
|
|
171
|
+
this.socket.emit('leave-room', roomId);
|
|
172
|
+
if (this.peer) {
|
|
173
|
+
this.peer.close();
|
|
174
|
+
}
|
|
175
|
+
if (this.localStream) {
|
|
176
|
+
this.localStream.getTracks().forEach((track) => track.stop());
|
|
177
|
+
}
|
|
178
|
+
this.socket.disconnect();
|
|
179
|
+
}
|
|
180
|
+
startRecording() {
|
|
181
|
+
if (!this.localStream)
|
|
182
|
+
return;
|
|
183
|
+
this.recordedChunks = [];
|
|
184
|
+
this.recorder = new MediaRecorder(this.localStream);
|
|
185
|
+
this.recorder.ondataavailable = (event) => {
|
|
186
|
+
if (event.data.size > 0) {
|
|
187
|
+
this.recordedChunks.push(event.data);
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
this.recorder.start();
|
|
191
|
+
}
|
|
192
|
+
stopRecording() {
|
|
193
|
+
this.recorder.stop();
|
|
194
|
+
return new Blob(this.recordedChunks, { type: 'video/webm' });
|
|
195
|
+
}
|
|
196
|
+
downloadRecording(blob) {
|
|
197
|
+
const url = URL.createObjectURL(blob);
|
|
198
|
+
const a = document.createElement('a');
|
|
199
|
+
a.href = url;
|
|
200
|
+
a.download = 'meeting-recording.webm';
|
|
201
|
+
a.click();
|
|
202
|
+
}
|
|
203
|
+
detectActiveSpeaker() {
|
|
204
|
+
if (!this.peer)
|
|
205
|
+
return;
|
|
206
|
+
this.speakerInterval = setInterval(async () => {
|
|
207
|
+
const stats = await this.peer.getStats();
|
|
208
|
+
stats.forEach((report) => {
|
|
209
|
+
if (report.type === 'inbound-rtp' &&
|
|
210
|
+
report.kind === 'audio' &&
|
|
211
|
+
report.audioLevel !== undefined) {
|
|
212
|
+
if (report.audioLevel > 0.05) {
|
|
213
|
+
console.log('User is speaking');
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
}, 1000);
|
|
218
|
+
}
|
|
219
|
+
stopActiveSpeakerDetection() {
|
|
220
|
+
clearInterval(this.speakerInterval);
|
|
221
|
+
}
|
|
75
222
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: Meeting, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
76
223
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: Meeting, providedIn: 'root' });
|
|
77
224
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meetkit-sdk.mjs","sources":["../../../projects/meeting-sdk/src/lib/meeting-sdk.ts","../../../projects/meeting-sdk/src/lib/meeting.ts","../../../projects/meeting-sdk/src/public-api.ts","../../../projects/meeting-sdk/src/meetkit-sdk.ts"],"sourcesContent":["import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-meeting-sdk',\r\n imports: [],\r\n template: `\r\n <p>\r\n meeting-sdk works!\r\n </p>\r\n `,\r\n styles: ``,\r\n})\r\nexport class MeetingSdk {\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { io, Socket } from 'socket.io-client';\r\nimport { Subject, Observable } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class Meeting {\r\n private socket!: Socket;\r\n private peer!: RTCPeerConnection;\r\n private localStream!: MediaStream;\r\n\r\n private messageSubject = new Subject<any>();\r\n public messages$: Observable<any> = this.messageSubject.asObservable();\r\n\r\n // connect to signaling server\r\n public connect(serverUrl: string) {\r\n this.socket = io(serverUrl);\r\n }\r\n\r\n // get local media stream\r\n public async initMedia(): Promise<MediaStream> {\r\n this.localStream = await navigator.mediaDevices.getUserMedia({\r\n video: true,\r\n audio: true,\r\n });\r\n return this.localStream;\r\n }\r\n\r\n // join a room\r\n public joinRoom(roomId: string) {\r\n this.socket.emit('join-room', roomId);\r\n }\r\n\r\n // send a chat message\r\n public sendMessage(roomId: string, message: string) {\r\n this.socket.emit('chat-message', { roomId, message });\r\n }\r\n\r\n // listen for chat messages\r\n public onMessage(callback: (msg: any) => void) {\r\n this.socket.on('chat-message', callback);\r\n }\r\n\r\n // observable for Angular components\r\n public listenForMessages() {\r\n this.socket.on('chat-message', (data) => {\r\n this.messageSubject.next(data);\r\n });\r\n }\r\n\r\n // create peer connection\r\n public createPeerConnection() {\r\n this.peer = new RTCPeerConnection();\r\n\r\n // add local tracks\r\n this.localStream.getTracks().forEach((track) => {\r\n this.peer.addTrack(track, this.localStream);\r\n });\r\n\r\n // track remote stream\r\n this.peer.ontrack = (event) => {\r\n console.log('Remote stream received', event.streams);\r\n };\r\n }\r\n\r\n // optional getter for peer if someone needs it\r\n public getPeerConnection(): RTCPeerConnection {\r\n return this.peer;\r\n }\r\n}\r\n","/*\r\n * Public API Surface of meeting-sdk\r\n */\r\n\r\nexport * from './lib/meeting-sdk';\r\nexport * from './lib/meeting';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"meetkit-sdk.mjs","sources":["../../../projects/meeting-sdk/src/lib/meeting-sdk.ts","../../../projects/meeting-sdk/src/lib/meeting.ts","../../../projects/meeting-sdk/src/public-api.ts","../../../projects/meeting-sdk/src/meetkit-sdk.ts"],"sourcesContent":["import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-meeting-sdk',\r\n imports: [],\r\n template: `\r\n <p>\r\n meeting-sdk works!\r\n </p>\r\n `,\r\n styles: ``,\r\n})\r\nexport class MeetingSdk {\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { io, Socket } from 'socket.io-client';\r\nimport { Subject, Observable } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class Meeting {\r\n private socket!: Socket;\r\n private peer!: RTCPeerConnection;\r\n private localStream!: MediaStream;\r\n private recorder!: MediaRecorder;\r\n private recordedChunks: Blob[] = [];\r\n private messageSubject = new Subject<any>();\r\n public messages$: Observable<any> = this.messageSubject.asObservable();\r\n private remoteStreamSubject = new Subject<MediaStream>();\r\n public remoteStream$ = this.remoteStreamSubject.asObservable();\r\n private speakerInterval: any;\r\n\r\n // connect to signaling server\r\n public connect(serverUrl: string) {\r\n this.socket = io(serverUrl);\r\n }\r\n\r\n // get local media stream\r\n public async initMedia(): Promise<MediaStream> {\r\n this.localStream = await navigator.mediaDevices.getUserMedia({\r\n video: true,\r\n audio: true,\r\n });\r\n return this.localStream;\r\n }\r\n\r\n // join a room\r\n public joinRoom(roomId: string) {\r\n this.socket.emit('join-room', roomId);\r\n }\r\n\r\n // send a chat message\r\n public sendMessage(roomId: string, message: string) {\r\n this.socket.emit('chat-message', { roomId, message });\r\n }\r\n\r\n // listen for chat messages\r\n public onMessage(callback: (msg: any) => void) {\r\n this.socket.on('chat-message', callback);\r\n }\r\n\r\n // observable for Angular components\r\n public listenForMessages() {\r\n this.socket.on('chat-message', (data) => {\r\n this.messageSubject.next(data);\r\n });\r\n }\r\n\r\n // create peer connection\r\n public createPeerConnection() {\r\n this.peer = new RTCPeerConnection({\r\n iceServers: [{ urls: 'stun:stun.l.google.com:19302' }],\r\n });\r\n\r\n // add local tracks\r\n this.localStream.getTracks().forEach((track) => {\r\n this.peer.addTrack(track, this.localStream);\r\n });\r\n\r\n // track remote stream\r\n this.peer.ontrack = (event) => {\r\n this.remoteStreamSubject.next(event.streams[0]);\r\n };\r\n }\r\n\r\n // optional getter for peer if someone needs it\r\n public getPeerConnection(): RTCPeerConnection {\r\n return this.peer;\r\n }\r\n\r\n // Mute audio\r\n public muteAudio() {\r\n if (!this.localStream) return;\r\n\r\n this.localStream.getAudioTracks().forEach((track) => {\r\n track.enabled = false;\r\n });\r\n }\r\n\r\n // Unmute audio\r\n public unmuteAudio() {\r\n if (!this.localStream) return;\r\n\r\n this.localStream.getAudioTracks().forEach((track) => {\r\n track.enabled = true;\r\n });\r\n }\r\n\r\n // Toggle audio\r\n public toggleAudio() {\r\n if (!this.localStream) return;\r\n\r\n this.localStream.getAudioTracks().forEach((track) => {\r\n track.enabled = !track.enabled;\r\n });\r\n }\r\n\r\n // Turn off video\r\n public stopVideo() {\r\n if (!this.localStream) return;\r\n\r\n this.localStream.getVideoTracks().forEach((track) => {\r\n track.enabled = false;\r\n });\r\n }\r\n\r\n // Turn on video\r\n public startVideo() {\r\n if (!this.localStream) return;\r\n\r\n this.localStream.getVideoTracks().forEach((track) => {\r\n track.enabled = true;\r\n });\r\n }\r\n\r\n // Toggle video\r\n public toggleVideo() {\r\n if (!this.localStream) return;\r\n\r\n this.localStream.getVideoTracks().forEach((track) => {\r\n track.enabled = !track.enabled;\r\n });\r\n }\r\n\r\n public async startScreenShare() {\r\n const screenStream = await navigator.mediaDevices.getDisplayMedia({\r\n video: true,\r\n });\r\n\r\n const screenTrack = screenStream.getVideoTracks()[0];\r\n const sender = this.peer.getSenders().find((s) => s.track?.kind === 'video');\r\n\r\n if (sender) {\r\n sender.replaceTrack(screenTrack);\r\n }\r\n\r\n // When user stops sharing\r\n screenTrack.onended = () => {\r\n this.stopScreenShare();\r\n };\r\n }\r\n\r\n public stopScreenShare() {\r\n const videoTrack = this.localStream.getVideoTracks()[0];\r\n const sender = this.peer.getSenders().find((s) => s.track?.kind === 'video');\r\n\r\n if (sender) {\r\n sender.replaceTrack(videoTrack);\r\n }\r\n }\r\n\r\n public initializeListeners() {\r\n this.socket.on('chat-message', (data) => {\r\n this.messageSubject.next(data);\r\n });\r\n }\r\n\r\n // Send reaction\r\n public sendReaction(roomId: string, emoji: string) {\r\n this.socket.emit('reaction', { roomId, emoji });\r\n }\r\n\r\n // Listen reaction\r\n public onReaction(callback: (data: any) => void) {\r\n this.socket.on('reaction', callback);\r\n }\r\n\r\n public raiseHand(roomId: string) {\r\n this.socket.emit('raise-hand', { roomId });\r\n }\r\n\r\n public onRaiseHand(callback: (data: any) => void) {\r\n this.socket.on('raise-hand', callback);\r\n }\r\n\r\n public leaveMeeting(roomId: string) {\r\n this.socket.emit('leave-room', roomId);\r\n\r\n if (this.peer) {\r\n this.peer.close();\r\n }\r\n\r\n if (this.localStream) {\r\n this.localStream.getTracks().forEach((track) => track.stop());\r\n }\r\n\r\n this.socket.disconnect();\r\n }\r\n\r\n public startRecording() {\r\n if (!this.localStream) return;\r\n\r\n this.recordedChunks = [];\r\n\r\n this.recorder = new MediaRecorder(this.localStream);\r\n\r\n this.recorder.ondataavailable = (event) => {\r\n if (event.data.size > 0) {\r\n this.recordedChunks.push(event.data);\r\n }\r\n };\r\n\r\n this.recorder.start();\r\n }\r\n\r\n public stopRecording(): Blob {\r\n this.recorder.stop();\r\n return new Blob(this.recordedChunks, { type: 'video/webm' });\r\n }\r\n\r\n public downloadRecording(blob: Blob) {\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = 'meeting-recording.webm';\r\n a.click();\r\n }\r\n\r\n public detectActiveSpeaker() {\r\n if (!this.peer) return;\r\n\r\n this.speakerInterval = setInterval(async () => {\r\n const stats = await this.peer.getStats();\r\n\r\n stats.forEach((report) => {\r\n if (\r\n report.type === 'inbound-rtp' &&\r\n report.kind === 'audio' &&\r\n report.audioLevel !== undefined\r\n ) {\r\n if (report.audioLevel > 0.05) {\r\n console.log('User is speaking');\r\n }\r\n }\r\n });\r\n }, 1000);\r\n }\r\n\r\n public stopActiveSpeakerDetection() {\r\n clearInterval(this.speakerInterval);\r\n }\r\n}\r\n","/*\r\n * Public API Surface of meeting-sdk\r\n */\r\n\r\nexport * from './lib/meeting-sdk';\r\nexport * from './lib/meeting';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/types/meetkit-sdk.d.ts
CHANGED
|
@@ -10,8 +10,13 @@ declare class Meeting {
|
|
|
10
10
|
private socket;
|
|
11
11
|
private peer;
|
|
12
12
|
private localStream;
|
|
13
|
+
private recorder;
|
|
14
|
+
private recordedChunks;
|
|
13
15
|
private messageSubject;
|
|
14
16
|
messages$: Observable<any>;
|
|
17
|
+
private remoteStreamSubject;
|
|
18
|
+
remoteStream$: Observable<MediaStream>;
|
|
19
|
+
private speakerInterval;
|
|
15
20
|
connect(serverUrl: string): void;
|
|
16
21
|
initMedia(): Promise<MediaStream>;
|
|
17
22
|
joinRoom(roomId: string): void;
|
|
@@ -20,6 +25,25 @@ declare class Meeting {
|
|
|
20
25
|
listenForMessages(): void;
|
|
21
26
|
createPeerConnection(): void;
|
|
22
27
|
getPeerConnection(): RTCPeerConnection;
|
|
28
|
+
muteAudio(): void;
|
|
29
|
+
unmuteAudio(): void;
|
|
30
|
+
toggleAudio(): void;
|
|
31
|
+
stopVideo(): void;
|
|
32
|
+
startVideo(): void;
|
|
33
|
+
toggleVideo(): void;
|
|
34
|
+
startScreenShare(): Promise<void>;
|
|
35
|
+
stopScreenShare(): void;
|
|
36
|
+
initializeListeners(): void;
|
|
37
|
+
sendReaction(roomId: string, emoji: string): void;
|
|
38
|
+
onReaction(callback: (data: any) => void): void;
|
|
39
|
+
raiseHand(roomId: string): void;
|
|
40
|
+
onRaiseHand(callback: (data: any) => void): void;
|
|
41
|
+
leaveMeeting(roomId: string): void;
|
|
42
|
+
startRecording(): void;
|
|
43
|
+
stopRecording(): Blob;
|
|
44
|
+
downloadRecording(blob: Blob): void;
|
|
45
|
+
detectActiveSpeaker(): void;
|
|
46
|
+
stopActiveSpeakerDetection(): void;
|
|
23
47
|
static ɵfac: i0.ɵɵFactoryDeclaration<Meeting, never>;
|
|
24
48
|
static ɵprov: i0.ɵɵInjectableDeclaration<Meeting>;
|
|
25
49
|
}
|