1 import {ConnexionInterface} from "../Connexion";
2 import {MediaManager} from "./MediaManager";
3 let Peer = require('simple-peer');
10 export class SimplePeerInterface {}
11 export class SimplePeer implements SimplePeerInterface{
12 private Connexion: ConnexionInterface;
13 private WebRtcRoomId: string;
14 private Users: Array<UserSimplePear> = new Array<UserSimplePear>();
16 private MediaManager: MediaManager;
18 private PeerConnexionArray: Map<string, any> = new Map<string, any>();
20 constructor(Connexion: ConnexionInterface, WebRtcRoomId: string = "test-webrtc") {
21 this.Connexion = Connexion;
22 this.WebRtcRoomId = WebRtcRoomId;
23 this.MediaManager = new MediaManager((stream : MediaStream) => {
24 this.updatedLocalStream();
30 * permit to listen when user could start visio
32 private initialise() {
34 //receive signal by gemer
35 this.Connexion.receiveWebrtcSignal((message: string) => {
36 this.receiveWebrtcSignal(message);
39 this.MediaManager.activeVisio();
40 this.MediaManager.getCamera().then(() => {
42 //receive message start
43 this.Connexion.receiveWebrtcStart((message: string) => {
44 this.receiveWebrtcStart(message);
48 console.error("err", err);
51 //receive signal by gemer
52 this.Connexion.disconnectMessage((message: string) => {
53 let data = JSON.parse(message);
54 this.closeConnexion(data.userId);
62 private receiveWebrtcStart(message: string) {
63 let data = JSON.parse(message);
64 this.WebRtcRoomId = data.roomId;
65 this.Users = data.clients;
72 * server has two person connected, start the meet
74 private startWebRtc() {
75 this.Users.forEach((user: UserSimplePear) => {
76 //if it's not an initiator, peer connexion will be created when gamer will receive offer signal
80 this.createPeerConnexion(user);
85 * create peer connexion to bind users
87 private createPeerConnexion(user : UserSimplePear) {
88 if(this.PeerConnexionArray.has(user.userId)) {
94 let userSearch = this.Users.find((userSearch: UserSimplePear) => userSearch.userId === user.userId);
96 name = userSearch.name;
99 this.MediaManager.removeActiveVideo(user.userId);
100 this.MediaManager.addActiveVideo(user.userId, name);
102 let peer : any = new Peer({
103 initiator: user.initiator ? user.initiator : false,
104 reconnectTimer: 10000,
108 urls: 'stun:stun.l.google.com:19302'
111 urls: 'turn:numb.viagenie.ca',
112 username: 'g.parant@thecodingmachine.com',
113 credential: 'itcugcOHxle9Acqi$'
118 this.PeerConnexionArray.set(user.userId, peer);
120 //start listen signal for the peer connexion
121 this.PeerConnexionArray.get(user.userId).on('signal', (data: any) => {
122 this.sendWebrtcSignal(data, user.userId);
125 this.PeerConnexionArray.get(user.userId).on('stream', (stream: MediaStream) => {
126 let videoActive = false;
127 let microphoneActive = false;
128 stream.getTracks().forEach((track : MediaStreamTrack) => {
129 if(track.kind === "audio"){
130 microphoneActive = true;
132 if(track.kind === "video"){
136 if(microphoneActive){
137 this.MediaManager.enabledMicrophoneByUserId(user.userId);
139 this.MediaManager.disabledMicrophoneByUserId(user.userId);
143 this.MediaManager.enabledVideoByUserId(user.userId);
145 this.MediaManager.disabledVideoByUserId(user.userId);
147 this.stream(user.userId, stream);
150 this.PeerConnexionArray.get(user.userId).on('track', (track: MediaStreamTrack, stream: MediaStream) => {
151 this.stream(user.userId, stream);
154 this.PeerConnexionArray.get(user.userId).on('close', () => {
155 this.closeConnexion(user.userId);
158 this.PeerConnexionArray.get(user.userId).on('error', (err: any) => {
159 console.error(`error => ${user.userId} => ${err.code}`, err);
162 this.PeerConnexionArray.get(user.userId).on('connect', () => {
163 console.info(`connect => ${user.userId}`);
166 this.addMedia(user.userId);
169 private closeConnexion(userId : string) {
171 this.MediaManager.removeActiveVideo(userId);
172 if (!this.PeerConnexionArray.get(userId)) {
176 this.PeerConnexionArray.get(userId).destroy();
177 this.PeerConnexionArray.delete(userId)
179 console.error("closeConnexion", err)
188 private sendWebrtcSignal(data: any, userId : string) {
190 this.Connexion.sendWebrtcSignal(data, this.WebRtcRoomId, null, userId);
192 console.error(`sendWebrtcSignal => ${userId}`, e);
200 private receiveWebrtcSignal(message: string) {
201 let data = JSON.parse(message);
203 //if offer type, create peer connexion
204 if(data.signal.type === "offer"){
205 this.createPeerConnexion(data);
207 this.PeerConnexionArray.get(data.userId).signal(data.signal);
209 console.error(`receiveWebrtcSignal => ${data.userId}`, e);
218 private stream(userId : any, stream: MediaStream) {
219 this.MediaManager.addStreamRemoteVideo(userId, stream);
226 private addMedia (userId : any = null) {
228 let transceiver : any = null;
229 if(!this.MediaManager.localStream){
232 this.MediaManager.localStream.getTracks().forEach(
233 transceiver = (track: MediaStreamTrack) => this.PeerConnexionArray.get(userId).addTrack(track, this.MediaManager.localStream)
236 console.error(`addMedia => addMedia => ${userId}`, e);
240 updatedLocalStream(){
241 this.Users.forEach((user: UserSimplePear) => {
242 this.addMedia(user.userId);