-
Notifications
You must be signed in to change notification settings - Fork 4
/
omegartc.ts
112 lines (96 loc) · 3.81 KB
/
omegartc.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// OmegaRTC is a class that provides a uniform interface to manage multiple WebRTC connections.
// This class can be used for both voice connections and data connections with multiple channels.
class OmegaRTC {
dataConnections: Map<string, RTCPeerConnection>
voiceConnections: Map<string, RTCPeerConnection>
iceStorage: Map<string, Array<RTCIceCandidate>>
iceGatheringDone: Map<string, boolean>
dataStorage: Map<string, Map<string, boolean | number | object>>
configuration: RTCConfiguration
constructor() {
this.dataConnections = new Map()
this.voiceConnections = new Map()
this.dataStorage = new Map()
this.configuration = {
iceServers: [
{ urls: 'stun:vpn.mikedev101.cc:3478' },
{
urls: 'turn:vpn.mikedev101.cc:3478',
username: 'free',
credential: 'free'
},
{ urls: 'stun:stun.l.google.com:19302' },
{ urls: 'stun:freeturn.net:3478' },
{ urls: 'stun:freeturn.net:5349' },
{
urls: 'turn:freeturn.net:3478',
username: 'free',
credential: 'free'
},
{
urls: 'turns:freeturn.net:5349',
username: 'free',
credential: 'free'
}
],
iceTransportPolicy: 'all'
}
}
// Changes the ICE transport policy to 'relay' or 'all' if 'mode' is true or false.
relayOnly(mode: boolean) {
this.configuration.iceTransportPolicy = mode ? 'relay' : 'all'
}
// Returns a promise that resolves when the condition function returns true. Useful for waiting for ICE gathering to complete.
until(conditionFunction: () => boolean) : Promise<void> {
const poll = (resolve: () => void) => {
if(conditionFunction()) resolve()
else setTimeout(() => poll(resolve), 100)
}
return new Promise(poll)
}
// Given a client ID as well as a specified mode (0 - data, 1 - voice),
// it will create an RTCSessionDescriptionInit object. If the client ID
// does not exist, it will create a new one.
createOffer(id: string, mode: number) : RTCSessionDescriptionInit | void {
return;
}
// Given a client ID as well as a specified mode (0 - data, 1 - voice),
// it will create a RTCPeerConnection instance and store it. If the
// client ID already exists, it will return the existing instance.
createConnection(id: string, mode: number) : RTCPeerConnection | void {
switch (mode) {
case 0: // Data
break
case 1: // Voice
// If the connection already exists, return it
if (this.voiceConnections.has(id)) {
return this.voiceConnections.get(id)
}
break
default:
console.error('Invalid mode')
return
}
return
}
createDataConnection(id: string) : RTCPeerConnection | void {
// If the connection already exists, return it
if (this.dataConnections.has(id)) {
return this.dataConnections.get(id)
}
// Create connection and properties
const conn = new RTCPeerConnection(this.configuration)
this.iceStorage[id] = new Array<RTCIceCandidate>()
this.iceGatheringDone[id] = false;
// Handle ICE gathering
conn.onicecandidate = (event : RTCPeerConnectionIceEvent ) => {
if (event.candidate) {
this.iceStorage[id].push(event.candidate)
}
if (conn.iceGatheringState === 'complete') {
this.iceGatheringDone[id] = true;
}
}
return conn;
}
}