@flashphoner/sfusdk 1.0.43 → 2.0.50
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/client.version +1 -0
- package/dist/examples/sfu.d.ts +13 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/sdk/connection.d.ts +25 -0
- package/dist/sdk/connection.js +101 -0
- package/dist/sdk/connection.js.map +1 -0
- package/dist/sdk/constants.d.ts +358 -0
- package/dist/sdk/constants.js +192 -0
- package/dist/sdk/constants.js.map +1 -0
- package/dist/sdk/logger.d.ts +10 -0
- package/dist/sdk/logger.js +22 -0
- package/dist/sdk/logger.js.map +1 -0
- package/dist/sdk/notifier.d.ts +7 -0
- package/dist/sdk/notifier.js +52 -0
- package/dist/sdk/notifier.js.map +1 -0
- package/dist/sdk/promises.d.ts +11 -0
- package/{src/sdk/promise.js → dist/sdk/promises.js} +14 -13
- package/dist/sdk/promises.js.map +1 -0
- package/dist/sdk/room-extended.d.ts +13 -0
- package/dist/sdk/room-extended.js +112 -0
- package/dist/sdk/room-extended.js.map +1 -0
- package/dist/sdk/room.d.ts +30 -0
- package/dist/sdk/room.js +384 -0
- package/dist/sdk/room.js.map +1 -0
- package/dist/sdk/sfu-extended.d.ts +132 -0
- package/dist/sdk/sfu-extended.js +525 -0
- package/dist/sdk/sfu-extended.js.map +1 -0
- package/dist/sdk/sfu.d.ts +22 -0
- package/dist/sdk/sfu.js +136 -0
- package/dist/sdk/sfu.js.map +1 -0
- package/dist/src/index.d.ts +6 -0
- package/dist/src/sdk/connection.d.ts +25 -0
- package/dist/src/sdk/constants.d.ts +358 -0
- package/dist/src/sdk/logger.d.ts +10 -0
- package/dist/src/sdk/notifier.d.ts +7 -0
- package/dist/src/sdk/promises.d.ts +11 -0
- package/dist/src/sdk/room-extended.d.ts +13 -0
- package/dist/src/sdk/room.d.ts +30 -0
- package/dist/src/sdk/sfu-extended.d.ts +132 -0
- package/dist/src/sdk/sfu.d.ts +22 -0
- package/package.json +27 -27
- package/Gruntfile.js +0 -79
- package/README.md +0 -95
- package/dependencies/bootstrap/css/bootstrap-theme.css +0 -587
- package/dependencies/bootstrap/css/bootstrap-theme.css.map +0 -1
- package/dependencies/bootstrap/css/bootstrap-theme.min.css +0 -5
- package/dependencies/bootstrap/css/bootstrap.css +0 -6853
- package/dependencies/bootstrap/css/bootstrap.css.map +0 -1
- package/dependencies/bootstrap/css/bootstrap.min.css +0 -5
- package/dependencies/bootstrap/font-awesome/HELP-US-OUT.txt +0 -7
- package/dependencies/bootstrap/font-awesome/css/font-awesome.css +0 -2178
- package/dependencies/bootstrap/font-awesome/css/font-awesome.min.css +0 -4
- package/dependencies/bootstrap/font-awesome/fonts/FontAwesome.otf +0 -0
- package/dependencies/bootstrap/font-awesome/fonts/fontawesome-webfont.eot +0 -0
- package/dependencies/bootstrap/font-awesome/fonts/fontawesome-webfont.svg +0 -685
- package/dependencies/bootstrap/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
- package/dependencies/bootstrap/font-awesome/fonts/fontawesome-webfont.woff +0 -0
- package/dependencies/bootstrap/font-awesome/fonts/fontawesome-webfont.woff2 +0 -0
- package/dependencies/bootstrap/font-awesome/less/animated.less +0 -34
- package/dependencies/bootstrap/font-awesome/less/bordered-pulled.less +0 -25
- package/dependencies/bootstrap/font-awesome/less/core.less +0 -12
- package/dependencies/bootstrap/font-awesome/less/fixed-width.less +0 -6
- package/dependencies/bootstrap/font-awesome/less/font-awesome.less +0 -18
- package/dependencies/bootstrap/font-awesome/less/icons.less +0 -724
- package/dependencies/bootstrap/font-awesome/less/larger.less +0 -13
- package/dependencies/bootstrap/font-awesome/less/list.less +0 -19
- package/dependencies/bootstrap/font-awesome/less/mixins.less +0 -60
- package/dependencies/bootstrap/font-awesome/less/path.less +0 -15
- package/dependencies/bootstrap/font-awesome/less/rotated-flipped.less +0 -20
- package/dependencies/bootstrap/font-awesome/less/screen-reader.less +0 -5
- package/dependencies/bootstrap/font-awesome/less/stacked.less +0 -20
- package/dependencies/bootstrap/font-awesome/less/variables.less +0 -735
- package/dependencies/bootstrap/font-awesome/scss/_animated.scss +0 -34
- package/dependencies/bootstrap/font-awesome/scss/_bordered-pulled.scss +0 -25
- package/dependencies/bootstrap/font-awesome/scss/_core.scss +0 -12
- package/dependencies/bootstrap/font-awesome/scss/_fixed-width.scss +0 -6
- package/dependencies/bootstrap/font-awesome/scss/_icons.scss +0 -724
- package/dependencies/bootstrap/font-awesome/scss/_larger.scss +0 -13
- package/dependencies/bootstrap/font-awesome/scss/_list.scss +0 -19
- package/dependencies/bootstrap/font-awesome/scss/_mixins.scss +0 -60
- package/dependencies/bootstrap/font-awesome/scss/_path.scss +0 -15
- package/dependencies/bootstrap/font-awesome/scss/_rotated-flipped.scss +0 -20
- package/dependencies/bootstrap/font-awesome/scss/_screen-reader.scss +0 -5
- package/dependencies/bootstrap/font-awesome/scss/_stacked.scss +0 -20
- package/dependencies/bootstrap/font-awesome/scss/_variables.scss +0 -735
- package/dependencies/bootstrap/font-awesome/scss/font-awesome.scss +0 -18
- package/dependencies/bootstrap/fonts/FontAwesome.otf +0 -0
- package/dependencies/bootstrap/fonts/fontawesome-webfont.eot +0 -0
- package/dependencies/bootstrap/fonts/fontawesome-webfont.svg +0 -655
- package/dependencies/bootstrap/fonts/fontawesome-webfont.ttf +0 -0
- package/dependencies/bootstrap/fonts/fontawesome-webfont.woff +0 -0
- package/dependencies/bootstrap/fonts/fontawesome-webfont.woff2 +0 -0
- package/dependencies/bootstrap/fonts/glyphicons-halflings-regular.eot +0 -0
- package/dependencies/bootstrap/fonts/glyphicons-halflings-regular.svg +0 -288
- package/dependencies/bootstrap/fonts/glyphicons-halflings-regular.ttf +0 -0
- package/dependencies/bootstrap/fonts/glyphicons-halflings-regular.woff +0 -0
- package/dependencies/bootstrap/fonts/glyphicons-halflings-regular.woff2 +0 -0
- package/dependencies/bootstrap/icons/font-awesome.min.css +0 -4
- package/dependencies/bootstrap/js/bootstrap.js +0 -2363
- package/dependencies/bootstrap/js/bootstrap.min.js +0 -7
- package/dependencies/bootstrap/js/npm.js +0 -13
- package/dependencies/bootstrap/js/switch.js +0 -85
- package/dependencies/jquery/jquery-1.12.0.js +0 -11027
- package/dependencies/jquery/jquery-ui.js +0 -16617
- package/dependencies/jquery/jquery.js +0 -8981
- package/dependencies/jquery/jquery.json.js +0 -199
- package/dependencies/jquery/jquery.websocket.js +0 -61
- package/dependencies/sigma/sigma.layout.forceAtlas2.min.js +0 -1
- package/dependencies/sigma/sigma.layout.noverlap.min.js +0 -1
- package/dependencies/sigma/sigma.min.js +0 -2
- package/dependencies/sigma/sigma.plugins.relativeSize.min.js +0 -1
- package/dependencies/sigma/sigma.renderers.edgeLabels.min.js +0 -1
- package/dependencies/sigma/sigma.renderers.parallelEdges.min.js +0 -1
- package/dependencies/sigma/sigma.require.js +0 -12076
- package/docTemplate/README.md +0 -5
- package/docTemplate/publish.js +0 -654
- package/docTemplate/static/fonts/OpenSans-Bold-webfont.eot +0 -0
- package/docTemplate/static/fonts/OpenSans-Bold-webfont.svg +0 -1830
- package/docTemplate/static/fonts/OpenSans-Bold-webfont.woff +0 -0
- package/docTemplate/static/fonts/OpenSans-BoldItalic-webfont.eot +0 -0
- package/docTemplate/static/fonts/OpenSans-BoldItalic-webfont.svg +0 -1830
- package/docTemplate/static/fonts/OpenSans-BoldItalic-webfont.woff +0 -0
- package/docTemplate/static/fonts/OpenSans-Italic-webfont.eot +0 -0
- package/docTemplate/static/fonts/OpenSans-Italic-webfont.svg +0 -1830
- package/docTemplate/static/fonts/OpenSans-Italic-webfont.woff +0 -0
- package/docTemplate/static/fonts/OpenSans-Light-webfont.eot +0 -0
- package/docTemplate/static/fonts/OpenSans-Light-webfont.svg +0 -1831
- package/docTemplate/static/fonts/OpenSans-Light-webfont.woff +0 -0
- package/docTemplate/static/fonts/OpenSans-LightItalic-webfont.eot +0 -0
- package/docTemplate/static/fonts/OpenSans-LightItalic-webfont.svg +0 -1835
- package/docTemplate/static/fonts/OpenSans-LightItalic-webfont.woff +0 -0
- package/docTemplate/static/fonts/OpenSans-Regular-webfont.eot +0 -0
- package/docTemplate/static/fonts/OpenSans-Regular-webfont.svg +0 -1831
- package/docTemplate/static/fonts/OpenSans-Regular-webfont.woff +0 -0
- package/docTemplate/static/scripts/linenumber.js +0 -25
- package/docTemplate/static/scripts/prettify/Apache-License-2.0.txt +0 -202
- package/docTemplate/static/scripts/prettify/lang-css.js +0 -2
- package/docTemplate/static/scripts/prettify/prettify.js +0 -28
- package/docTemplate/static/styles/jsdoc-default.css +0 -354
- package/docTemplate/static/styles/prettify-jsdoc.css +0 -111
- package/docTemplate/static/styles/prettify-tomorrow.css +0 -132
- package/docTemplate/tmpl/augments.tmpl +0 -10
- package/docTemplate/tmpl/container.tmpl +0 -183
- package/docTemplate/tmpl/details.tmpl +0 -143
- package/docTemplate/tmpl/example.tmpl +0 -2
- package/docTemplate/tmpl/examples.tmpl +0 -13
- package/docTemplate/tmpl/exceptions.tmpl +0 -32
- package/docTemplate/tmpl/layout.tmpl +0 -38
- package/docTemplate/tmpl/mainpage.tmpl +0 -14
- package/docTemplate/tmpl/members.tmpl +0 -38
- package/docTemplate/tmpl/method.tmpl +0 -105
- package/docTemplate/tmpl/params.tmpl +0 -124
- package/docTemplate/tmpl/properties.tmpl +0 -108
- package/docTemplate/tmpl/returns.tmpl +0 -19
- package/docTemplate/tmpl/source.tmpl +0 -8
- package/docTemplate/tmpl/tutorial.tmpl +0 -19
- package/docTemplate/tmpl/type.tmpl +0 -7
- package/src/examples/client/chat.js +0 -67
- package/src/examples/client/config.json +0 -26
- package/src/examples/client/controls.js +0 -314
- package/src/examples/client/display.js +0 -502
- package/src/examples/client/main.css +0 -45
- package/src/examples/client/main.html +0 -220
- package/src/examples/client/main.js +0 -156
- package/src/examples/client/resources/details_close.png +0 -0
- package/src/examples/client/resources/details_open.png +0 -0
- package/src/examples/client/util.js +0 -67
- package/src/examples/commons/js/config.js +0 -81
- package/src/examples/commons/js/display.js +0 -484
- package/src/examples/commons/js/util.js +0 -202
- package/src/examples/commons/media/silence.mp3 +0 -0
- package/src/examples/controller/dependencies/sigma/sigma.renderers.edgeLabels.min.js +0 -1
- package/src/examples/controller/dependencies/sigma/sigma.renderers.parallelEdges.min.js +0 -1
- package/src/examples/controller/dependencies/sigma/sigma.require.js +0 -12076
- package/src/examples/controller/graph-view.js +0 -32
- package/src/examples/controller/main.css +0 -45
- package/src/examples/controller/main.html +0 -79
- package/src/examples/controller/main.js +0 -65
- package/src/examples/controller/parser.js +0 -202
- package/src/examples/controller/resources/details_close.png +0 -0
- package/src/examples/controller/resources/details_open.png +0 -0
- package/src/examples/controller/rest.js +0 -56
- package/src/examples/controller/table-view.js +0 -64
- package/src/examples/controller/test-data.js +0 -382
- package/src/examples/player/config.json +0 -8
- package/src/examples/player/player.css +0 -19
- package/src/examples/player/player.html +0 -54
- package/src/examples/player/player.js +0 -209
- package/src/examples/two-way-streaming/config.json +0 -34
- package/src/examples/two-way-streaming/two-way-streaming.css +0 -26
- package/src/examples/two-way-streaming/two-way-streaming.html +0 -72
- package/src/examples/two-way-streaming/two-way-streaming.js +0 -375
- package/src/sdk/constants.js +0 -513
- package/src/sdk/logger.js +0 -16
- package/src/sdk/room.js +0 -592
- package/src/sdk/sfu-extended.js +0 -842
- package/src/sdk/sfu.js +0 -208
- package/src/sdk/ws.js +0 -113
- package/src/tests/assets/1.jpeg +0 -0
- package/src/tests/lib/rtcaudiosourcesinewave.js +0 -109
- package/src/tests/lib/rtcvideosourcewrapper.js +0 -28
- package/src/tests/sdk/room.test.js +0 -229
- package/src/tests/sdk/sfu-extended.test.js +0 -265
- package/src/tests/util.js +0 -48
package/src/sdk/room.js
DELETED
|
@@ -1,592 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @namespace Room
|
|
3
|
-
* @memberOf FlashphonerSFU
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
const { v4: uuidv4 } = require("uuid");
|
|
7
|
-
const constants = require("./constants");
|
|
8
|
-
const promises = require("./promise");
|
|
9
|
-
const logger = require("./logger");
|
|
10
|
-
|
|
11
|
-
const room = function(options) {
|
|
12
|
-
if (!options) {
|
|
13
|
-
throw new TypeError("No options provided");
|
|
14
|
-
}
|
|
15
|
-
const room = {};
|
|
16
|
-
let state = constants.SFU_ROOM_STATE.NEW;
|
|
17
|
-
let role = constants.SFU_PARTICIPANT_ROLE.PARTICIPANT;
|
|
18
|
-
let inviteId;
|
|
19
|
-
const callbacks = {};
|
|
20
|
-
const connection = options.connection;
|
|
21
|
-
const pc = options.pc;
|
|
22
|
-
const name = options.name;
|
|
23
|
-
const pin = options.pin;
|
|
24
|
-
|
|
25
|
-
let incomingMessageQueue = {};
|
|
26
|
-
|
|
27
|
-
//data channel
|
|
28
|
-
const dChannel = options.pc.createDataChannel("control");
|
|
29
|
-
dChannel.onopen = function() {
|
|
30
|
-
logger.log("DataChannel opened");
|
|
31
|
-
};
|
|
32
|
-
dChannel.onclose = function() {
|
|
33
|
-
logger.log("DataChannel closed");
|
|
34
|
-
};
|
|
35
|
-
dChannel.onerror = function(e) {
|
|
36
|
-
//console.error("Got error in data channel ", e);
|
|
37
|
-
};
|
|
38
|
-
dChannel.onmessage = function(msg) {
|
|
39
|
-
logger.log("dchannel ", "<==", msg);
|
|
40
|
-
const message = JSON.parse(msg.data);
|
|
41
|
-
if (message.type === constants.SFU_ROOM_EVENT.MESSAGE && message.message.message.indexOf("\"payload\":") !== -1) {
|
|
42
|
-
try {
|
|
43
|
-
let innerMessage = JSON.parse(message.message.message);
|
|
44
|
-
if (!incomingMessageQueue[innerMessage.id]) {
|
|
45
|
-
incomingMessageQueue[innerMessage.id] = [];
|
|
46
|
-
}
|
|
47
|
-
incomingMessageQueue[innerMessage.id].push(innerMessage);
|
|
48
|
-
if (innerMessage.last) {
|
|
49
|
-
let wholeMessage = "";
|
|
50
|
-
for (let i = 0; i < incomingMessageQueue[innerMessage.id].length; i++) {
|
|
51
|
-
wholeMessage += incomingMessageQueue[innerMessage.id][i].payload;
|
|
52
|
-
}
|
|
53
|
-
delete incomingMessageQueue[innerMessage.id];
|
|
54
|
-
message.message.message = wholeMessage;
|
|
55
|
-
notify(message.type, message.message);
|
|
56
|
-
}
|
|
57
|
-
} catch (e) {
|
|
58
|
-
window.log.info("Failed to process inner message: " + message.message);
|
|
59
|
-
notify(message.type, message.message);
|
|
60
|
-
}
|
|
61
|
-
} else if (message.type === constants.SFU_EVENT.ACK && promises.promised(message.internalMessageId)) {
|
|
62
|
-
promises.resolve(message.internalMessageId);
|
|
63
|
-
} else {
|
|
64
|
-
notify(message.type, message.message);
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
const dChannelSend = (msg) => {
|
|
69
|
-
logger.log("dchannel ", "==>", msg);
|
|
70
|
-
dChannel.send(msg);
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
const processEvent = function(e) {
|
|
74
|
-
logger.log("<==", e);
|
|
75
|
-
if (e.type === constants.SFU_ROOM_EVENT.REMOTE_SDP) {
|
|
76
|
-
if (state !== constants.SFU_ROOM_STATE.FAILED && state !== constants.SFU_ROOM_STATE.DISPOSED) {
|
|
77
|
-
switch (e.info.type) {
|
|
78
|
-
case "offer":
|
|
79
|
-
pc.setRemoteDescription(e.info).then(() => pc.createAnswer())
|
|
80
|
-
.then(answer => pc.setLocalDescription(answer))
|
|
81
|
-
.then(() => {
|
|
82
|
-
connection.send(constants.SFU_INTERNAL_API.UPDATE_ROOM_STATE, {
|
|
83
|
-
name: name,
|
|
84
|
-
pin: pin,
|
|
85
|
-
sdp: pc.localDescription.sdp
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
break;
|
|
89
|
-
case "answer":
|
|
90
|
-
pc.setRemoteDescription(e.info);
|
|
91
|
-
break;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
} else if (e.type === constants.SFU_ROOM_EVENT.ROLE_ASSIGNED) {
|
|
95
|
-
role = e.role;
|
|
96
|
-
notify(e.type, e);
|
|
97
|
-
} else if (e.type === constants.SFU_ROOM_EVENT.CREATED) {
|
|
98
|
-
inviteId = e.inviteId;
|
|
99
|
-
if (!promises.resolve(e.internalMessageId, e)) {
|
|
100
|
-
notify(e.type, e);
|
|
101
|
-
}
|
|
102
|
-
} else if (e.type === constants.SFU_ROOM_EVENT.OPERATION_FAILED && promises.promised(e.internalMessageId)) {
|
|
103
|
-
promises.reject(e.internalMessageId, e);
|
|
104
|
-
} else if (e.type === constants.SFU_ROOM_EVENT.JOINED) {
|
|
105
|
-
if (!promises.resolve(e.internalMessageId, e)) {
|
|
106
|
-
notify(e.type, e);
|
|
107
|
-
}
|
|
108
|
-
} else if (e.type === constants.SFU_ROOM_EVENT.LEFT) {
|
|
109
|
-
if (!promises.resolve(e.internalMessageId, e)) {
|
|
110
|
-
notify(e.type, e);
|
|
111
|
-
}
|
|
112
|
-
} else if (e.type === constants.SFU_ROOM_EVENT.ADD_TRACKS) {
|
|
113
|
-
if (!promises.resolve(e.internalMessageId, e.info)) {
|
|
114
|
-
notify(e.type, e);
|
|
115
|
-
}
|
|
116
|
-
} else if (e.type === constants.SFU_ROOM_EVENT.REMOVE_TRACKS) {
|
|
117
|
-
if (!promises.resolve(e.internalMessageId, e)) {
|
|
118
|
-
notify(e.type, e);
|
|
119
|
-
}
|
|
120
|
-
} else if (e.type === constants.SFU_EVENT.ACK && promises.promised(e.internalMessageId)) {
|
|
121
|
-
promises.resolve(e.internalMessageId);
|
|
122
|
-
} else {
|
|
123
|
-
notify(e.type, e);
|
|
124
|
-
}
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Create room at server side.
|
|
129
|
-
*/
|
|
130
|
-
const createRoom = function() {
|
|
131
|
-
return new Promise((resolve, reject) => {
|
|
132
|
-
const id = uuidv4();
|
|
133
|
-
promises.add(id, resolve, reject);
|
|
134
|
-
connection.send(constants.SFU_INTERNAL_API.CREATE_ROOM, {
|
|
135
|
-
name: name,
|
|
136
|
-
pin: pin,
|
|
137
|
-
internalMessageId: id
|
|
138
|
-
});
|
|
139
|
-
});
|
|
140
|
-
};
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Join room.
|
|
144
|
-
* @param {Object=} config Config for track marking. Key is a track id and value is a String (e.g. screen_sharing, camera, front_camera).
|
|
145
|
-
* The specified value will be available for other participants as contentType in {@link FlashphonerSFU.Room.TrackInfo}
|
|
146
|
-
* @memberOf FlashphonerSFU.Room
|
|
147
|
-
*/
|
|
148
|
-
const join = function(config) {
|
|
149
|
-
return new Promise((resolve, reject) => {
|
|
150
|
-
if (state === constants.SFU_ROOM_STATE.NEW) {
|
|
151
|
-
state = constants.SFU_ROOM_STATE.JOINED;
|
|
152
|
-
pc.createOffer().then(function (offer) {
|
|
153
|
-
if (config) {
|
|
154
|
-
offer.sdp = applyContentTypeConfig(offer.sdp, config);
|
|
155
|
-
}
|
|
156
|
-
pc.setLocalDescription(offer).then(function () {
|
|
157
|
-
const id = uuidv4();
|
|
158
|
-
promises.add(id, resolve, reject);
|
|
159
|
-
connection.send(constants.SFU_INTERNAL_API.JOIN_ROOM, {
|
|
160
|
-
name: name,
|
|
161
|
-
pin: pin,
|
|
162
|
-
sdp: offer.sdp,
|
|
163
|
-
internalMessageId: id
|
|
164
|
-
});
|
|
165
|
-
}, reject);
|
|
166
|
-
}, reject);
|
|
167
|
-
} else {
|
|
168
|
-
reject("Can't joined room with state " + state);
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
|
-
};
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Update state after adding tracks to PeerConnection.
|
|
175
|
-
* This method kicks off sdp renegotiation.
|
|
176
|
-
* @param {Object=} config Config for track marking. Key is a track id and value is a String (e.g. screen_sharing, camera, front_camera).
|
|
177
|
-
* The specified value will be available for other participants as contentType in {@link FlashphonerSFU.Room.TrackInfo}
|
|
178
|
-
* @throws {Error} Error if peer connection is being negotiated
|
|
179
|
-
* @memberOf FlashphonerSFU.Room
|
|
180
|
-
*/
|
|
181
|
-
const updateState = function(config) {
|
|
182
|
-
return new Promise((resolve, reject) => {
|
|
183
|
-
if (pc.signalingState !== "stable") {
|
|
184
|
-
reject("Peer connection signaling state is " + pc.signalingState + ". Can't update room while negotiation is in progress");
|
|
185
|
-
}
|
|
186
|
-
pc.createOffer().then(function(offer) {
|
|
187
|
-
pc.setLocalDescription(offer).then(function() {
|
|
188
|
-
if (config) {
|
|
189
|
-
offer.sdp = applyContentTypeConfig(offer.sdp, config);
|
|
190
|
-
}
|
|
191
|
-
const id = uuidv4();
|
|
192
|
-
promises.add(id, resolve, reject);
|
|
193
|
-
connection.send(constants.SFU_INTERNAL_API.UPDATE_ROOM_STATE, {
|
|
194
|
-
name: name,
|
|
195
|
-
pin: pin,
|
|
196
|
-
sdp: offer.sdp,
|
|
197
|
-
internalMessageId: id
|
|
198
|
-
});
|
|
199
|
-
}, reject);
|
|
200
|
-
}, reject);
|
|
201
|
-
})
|
|
202
|
-
|
|
203
|
-
};
|
|
204
|
-
|
|
205
|
-
const applyContentTypeConfig = function(sdp, config) {
|
|
206
|
-
let ret = "";
|
|
207
|
-
for (const str of sdp.split("\n")) {
|
|
208
|
-
if (str && str.length > 0) {
|
|
209
|
-
ret += str + "\n";
|
|
210
|
-
if (str.indexOf("a=msid:") > -1) {
|
|
211
|
-
const msid = str.substring(str.indexOf(" ") + 1).trim();
|
|
212
|
-
if (config[msid]) {
|
|
213
|
-
ret += constants.SFU_INTERNAL_API.TRACK_CONTENT_HEADER + config[msid] + "\r\n";
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
return ret;
|
|
219
|
-
};
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* Destroys room instance at server side.
|
|
223
|
-
* @memberOf FlashphonerSFU.Room
|
|
224
|
-
*/
|
|
225
|
-
const destroyRoom = function() {
|
|
226
|
-
return new Promise((resolve, reject) => {
|
|
227
|
-
state = constants.SFU_ROOM_STATE.DISPOSED;
|
|
228
|
-
const id = uuidv4();
|
|
229
|
-
promises.add(id, resolve, reject);
|
|
230
|
-
connection.send(constants.SFU_INTERNAL_API.DESTROY_ROOM, {
|
|
231
|
-
name: name,
|
|
232
|
-
pin: pin,
|
|
233
|
-
internalMessageId: id
|
|
234
|
-
});
|
|
235
|
-
});
|
|
236
|
-
};
|
|
237
|
-
|
|
238
|
-
/**
|
|
239
|
-
* Leave room.
|
|
240
|
-
* @memberOf FlashphonerSFU.Room
|
|
241
|
-
*/
|
|
242
|
-
const leaveRoom = function() {
|
|
243
|
-
return new Promise((resolve, reject) => {
|
|
244
|
-
state = constants.SFU_ROOM_STATE.DISPOSED;
|
|
245
|
-
const id = uuidv4();
|
|
246
|
-
promises.add(id, resolve, reject);
|
|
247
|
-
connection.send(constants.SFU_INTERNAL_API.LEAVE_ROOM, {
|
|
248
|
-
name: name,
|
|
249
|
-
pin: pin,
|
|
250
|
-
internalMessageId: id
|
|
251
|
-
});
|
|
252
|
-
pc.close();
|
|
253
|
-
pc.dispatchEvent(new Event("connectionstatechange"));
|
|
254
|
-
})
|
|
255
|
-
|
|
256
|
-
};
|
|
257
|
-
|
|
258
|
-
/**
|
|
259
|
-
* Broadcast message to participants currently in the Room.
|
|
260
|
-
* This method will use DataChannels.
|
|
261
|
-
* @param {String} msg
|
|
262
|
-
* @memberOf FlashphonerSFU.Room
|
|
263
|
-
*/
|
|
264
|
-
const sendMessage = function(msg) {
|
|
265
|
-
return new Promise((resolve, reject) => {
|
|
266
|
-
//throttle messages
|
|
267
|
-
const id = uuidv4();
|
|
268
|
-
/**
|
|
269
|
-
* Note that in case of chunked message promise will be resolved only after sending last message (last: true)
|
|
270
|
-
*/
|
|
271
|
-
promises.add(id, resolve, reject);
|
|
272
|
-
const chunkSize = 16384;
|
|
273
|
-
if (msg.length > chunkSize) {
|
|
274
|
-
const chunks = msg.match(new RegExp("(.|[\r\n]){1,"+chunkSize+"}", "g"));
|
|
275
|
-
for (let i = 0; i < chunks.length; i++) {
|
|
276
|
-
dChannelSend(JSON.stringify({
|
|
277
|
-
id: id,
|
|
278
|
-
last: i === chunks.length - 1,
|
|
279
|
-
payload: chunks[i]
|
|
280
|
-
}));
|
|
281
|
-
}
|
|
282
|
-
} else {
|
|
283
|
-
dChannelSend(JSON.stringify({
|
|
284
|
-
id: id,
|
|
285
|
-
payload: msg
|
|
286
|
-
}));
|
|
287
|
-
}
|
|
288
|
-
})
|
|
289
|
-
|
|
290
|
-
};
|
|
291
|
-
|
|
292
|
-
/**
|
|
293
|
-
* Send control message.
|
|
294
|
-
* This method will use WSS to send the message.
|
|
295
|
-
* @param {String} to recipient's nickname
|
|
296
|
-
* @param {String} msg message
|
|
297
|
-
* @param {Boolean} broadcast ignore 'to' and broadcast the message (send it to all participants)
|
|
298
|
-
*/
|
|
299
|
-
const sendControlMessage = function(to, msg, broadcast) {
|
|
300
|
-
return new Promise((resolve, reject) => {
|
|
301
|
-
const id = uuidv4();
|
|
302
|
-
promises.add(id, resolve, reject);
|
|
303
|
-
connection.send(constants.SFU_INTERNAL_API.SEND_CONTROL_MESSAGE, {
|
|
304
|
-
broadcast: broadcast,
|
|
305
|
-
from: "",
|
|
306
|
-
to: to,
|
|
307
|
-
body: msg,
|
|
308
|
-
internalMessageId: id
|
|
309
|
-
});
|
|
310
|
-
})
|
|
311
|
-
};
|
|
312
|
-
|
|
313
|
-
/**
|
|
314
|
-
* Change receiving quality of the simulcast track.
|
|
315
|
-
* @param {String} trackId Id of the track
|
|
316
|
-
* @param {String} quality one of qualities advertised in {@link FlashphonerSFU.Room.TrackInfo}
|
|
317
|
-
* @param {String} tid In some tracks (Such as WebRTC simulcast VP8 track) there is an option of changing FPS of the
|
|
318
|
-
* track by changing TID. At the time of writing there were 3 TIDs (lower TID = lower FPS) 0|1|2
|
|
319
|
-
* @memberOf FlashphonerSFU.Room
|
|
320
|
-
*/
|
|
321
|
-
const changeQuality = function(trackId, quality, tid) {
|
|
322
|
-
return new Promise((resolve, reject) => {
|
|
323
|
-
const id = uuidv4();
|
|
324
|
-
promises.add(id, resolve, reject);
|
|
325
|
-
connection.send("changeQuality", {
|
|
326
|
-
roomName: name,
|
|
327
|
-
id: trackId,
|
|
328
|
-
quality: quality,
|
|
329
|
-
tid: tid,
|
|
330
|
-
internalMessageId: id
|
|
331
|
-
});
|
|
332
|
-
})
|
|
333
|
-
};
|
|
334
|
-
|
|
335
|
-
/**
|
|
336
|
-
* Authorize user that is currently resides in waiting room. Note that this will only work with {@link FlashphonerSFUExtended}
|
|
337
|
-
* @param {String} userId User id
|
|
338
|
-
* @param {Boolean} authorized If true participant will move to the main room otherwise participant will be evicted.
|
|
339
|
-
* @memberOf FlashphonerSFU.Room
|
|
340
|
-
*/
|
|
341
|
-
const authorizeWaitingList = function(userId, authorized) {
|
|
342
|
-
return new Promise((resolve, reject) => {
|
|
343
|
-
const id = uuidv4();
|
|
344
|
-
promises.add(id, resolve, reject);
|
|
345
|
-
connection.send(constants.SFU_INTERNAL_API.AUTHORIZE_WAITING_LIST, {
|
|
346
|
-
name: name,
|
|
347
|
-
userId: userId,
|
|
348
|
-
authorized: authorized,
|
|
349
|
-
internalMessageId: id
|
|
350
|
-
});
|
|
351
|
-
})
|
|
352
|
-
|
|
353
|
-
};
|
|
354
|
-
|
|
355
|
-
/**
|
|
356
|
-
* Move user from room into waiting room. Note that this will only work with {@link FlashphonerSFUExtended}
|
|
357
|
-
* @param {String} nickname Participant nickname
|
|
358
|
-
* @memberOf FlashphonerSFU.Room
|
|
359
|
-
*/
|
|
360
|
-
const moveToWaitingRoom = function(nickname) {
|
|
361
|
-
return new Promise((resolve, reject) => {
|
|
362
|
-
const id = uuidv4();
|
|
363
|
-
promises.add(id, resolve, reject);
|
|
364
|
-
connection.send(constants.SFU_INTERNAL_API.MOVE_TO_WAITING_ROOM, {
|
|
365
|
-
roomName: name,
|
|
366
|
-
nickname: nickname,
|
|
367
|
-
internalMessageId: id
|
|
368
|
-
});
|
|
369
|
-
});
|
|
370
|
-
};
|
|
371
|
-
|
|
372
|
-
/**
|
|
373
|
-
* Turn waiting room on/off
|
|
374
|
-
* @param {Boolean} enabled Boolean flag
|
|
375
|
-
* @memberOf FlashphonerSFU.Room
|
|
376
|
-
*/
|
|
377
|
-
const configureWaitingRoom = function(enabled) {
|
|
378
|
-
return new Promise((resolve, reject) => {
|
|
379
|
-
const id = uuidv4();
|
|
380
|
-
promises.add(id, resolve, reject);
|
|
381
|
-
connection.send(constants.SFU_INTERNAL_API.CONFIGURE_WAITING_ROOM, {
|
|
382
|
-
name: name,
|
|
383
|
-
enabled: enabled,
|
|
384
|
-
internalMessageId: id
|
|
385
|
-
});
|
|
386
|
-
});
|
|
387
|
-
};
|
|
388
|
-
|
|
389
|
-
/**
|
|
390
|
-
* Mute track. Mute takes place at server side - server stops forwarding this track.
|
|
391
|
-
* @param {String} trackId Id of the track
|
|
392
|
-
* @param {Boolean} mute Mute flag
|
|
393
|
-
* @memberOf FlashphonerSFU.Room
|
|
394
|
-
*/
|
|
395
|
-
const muteTrack = function(trackId, mute) {
|
|
396
|
-
return new Promise((resolve, reject) => {
|
|
397
|
-
const id = uuidv4();
|
|
398
|
-
promises.add(id, resolve, reject);
|
|
399
|
-
connection.send(constants.SFU_INTERNAL_API.MUTE_TRACK, {
|
|
400
|
-
roomName: name,
|
|
401
|
-
id: trackId,
|
|
402
|
-
mute: mute
|
|
403
|
-
});
|
|
404
|
-
})
|
|
405
|
-
};
|
|
406
|
-
|
|
407
|
-
/**
|
|
408
|
-
* Assign user a role. Note that this will only work with {@link FlashphonerSFUExtended}
|
|
409
|
-
* @param {String} nickname Nickname of the participant
|
|
410
|
-
* @param {FlashphonerSFU.SFU_PARTICIPANT_ROLE} role Role to assign
|
|
411
|
-
* @memberOf FlashphonerSFU.Room
|
|
412
|
-
*/
|
|
413
|
-
const assignRole = function(nickname, role) {
|
|
414
|
-
return new Promise((resolve, reject) => {
|
|
415
|
-
const id = uuidv4();
|
|
416
|
-
promises.add(id, resolve, reject);
|
|
417
|
-
connection.send(constants.SFU_INTERNAL_API.ASSIGN_ROLE, {
|
|
418
|
-
roomName: name,
|
|
419
|
-
nickname: nickname,
|
|
420
|
-
role: role,
|
|
421
|
-
internalMessageId: id
|
|
422
|
-
});
|
|
423
|
-
})
|
|
424
|
-
};
|
|
425
|
-
|
|
426
|
-
/**
|
|
427
|
-
* Subscribe to tracks of participant that is currently resides in waiting room.
|
|
428
|
-
* New tracks will have `info.waitingRoom` flag set to true, see {@link FlashphonerSFU.Room.TracksInfo}.
|
|
429
|
-
* Note that this will only work with {@link FlashphonerSFUExtended}
|
|
430
|
-
* @param {String} nickname Nickname of the participant
|
|
431
|
-
* @memberOf FlashphonerSFU.Room
|
|
432
|
-
*/
|
|
433
|
-
const subscribeToWaitingParticipant = function(nickname) {
|
|
434
|
-
return new Promise((resolve, reject) => {
|
|
435
|
-
const id = uuidv4();
|
|
436
|
-
promises.add(id, resolve, reject);
|
|
437
|
-
connection.send(constants.SFU_INTERNAL_API.SUBSCRIBE_TO_WAITING_PARTICIPANT, {
|
|
438
|
-
roomName: name,
|
|
439
|
-
nickname: nickname,
|
|
440
|
-
internalMessageId: id
|
|
441
|
-
});
|
|
442
|
-
})
|
|
443
|
-
};
|
|
444
|
-
|
|
445
|
-
/**
|
|
446
|
-
* Unsubscribe from tracks of participant that is currently resides in waiting room.
|
|
447
|
-
* Note that this will only work with {@link FlashphonerSFUExtended}
|
|
448
|
-
* @param {String} nickname Nickname of the participant
|
|
449
|
-
* @memberOf FlashphonerSFU.Room
|
|
450
|
-
*/
|
|
451
|
-
const unsubscribeFromWaitingParticipant = function(nickname) {
|
|
452
|
-
return new Promise((resolve, reject) => {
|
|
453
|
-
const id = uuidv4();
|
|
454
|
-
promises.add(id, resolve, reject);
|
|
455
|
-
connection.send(constants.SFU_INTERNAL_API.UNSUBSCRIBE_FROM_WAITING_PARTICIPANT, {
|
|
456
|
-
roomName: name,
|
|
457
|
-
nickname: nickname,
|
|
458
|
-
internalMessageId: id
|
|
459
|
-
});
|
|
460
|
-
})
|
|
461
|
-
|
|
462
|
-
};
|
|
463
|
-
|
|
464
|
-
/**
|
|
465
|
-
* Room event callback.
|
|
466
|
-
*
|
|
467
|
-
* @callback FlashphonerSFU.Room~eventCallback
|
|
468
|
-
* @param {FlashphonerSFU.Room} sdk instance FlashphonerSFU.Room
|
|
469
|
-
*/
|
|
470
|
-
|
|
471
|
-
/**
|
|
472
|
-
* Add room event callback.
|
|
473
|
-
*
|
|
474
|
-
* @param {String} event One of {@link FlashphonerSFU.SFU_ROOM_EVENT} events
|
|
475
|
-
* @param {FlashphonerSFU.Room~eventCallback} callback Callback function
|
|
476
|
-
* @returns {FlashphonerSFU.Room} SDK instance callback was attached to
|
|
477
|
-
* @throws {TypeError} Error if event is not specified
|
|
478
|
-
* @throws {Error} Error if callback is not a valid function
|
|
479
|
-
* @memberOf FlashphonerSFU.Room
|
|
480
|
-
*/
|
|
481
|
-
const on = function (event, callback) {
|
|
482
|
-
if (!event) {
|
|
483
|
-
throw new TypeError("Event can't be null");
|
|
484
|
-
}
|
|
485
|
-
if (!callback || typeof callback !== "function") {
|
|
486
|
-
throw new Error("Callback needs to be a valid function");
|
|
487
|
-
}
|
|
488
|
-
if (!callbacks[event]) {
|
|
489
|
-
callbacks[event] = [];
|
|
490
|
-
}
|
|
491
|
-
callbacks[event].push(callback);
|
|
492
|
-
return room;
|
|
493
|
-
};
|
|
494
|
-
|
|
495
|
-
/**
|
|
496
|
-
* Remove room event callback.
|
|
497
|
-
*
|
|
498
|
-
* @param {String} event One of {@link FlashphonerSFU.SFU_ROOM_EVENT} events
|
|
499
|
-
* @param {FlashphonerSFU.Room~eventCallback} callback Callback function
|
|
500
|
-
* @returns {FlashphonerSFU.Room} SDK instance callback was removed from
|
|
501
|
-
* @throws {TypeError} Error if event is not specified
|
|
502
|
-
* @throws {Error} Error if callback is not a valid function
|
|
503
|
-
* @memberOf FlashphonerSFU.Room
|
|
504
|
-
*/
|
|
505
|
-
const off = function (event, callback) {
|
|
506
|
-
if (!event) {
|
|
507
|
-
throw new TypeError("Event can't be null");
|
|
508
|
-
}
|
|
509
|
-
if (!callback || typeof callback !== "function") {
|
|
510
|
-
throw new Error("Callback needs to be a valid function");
|
|
511
|
-
}
|
|
512
|
-
if (!callbacks[event]) {
|
|
513
|
-
callbacks[event] = [];
|
|
514
|
-
}
|
|
515
|
-
let index = callbacks[event].findIndex(element => element === callback);
|
|
516
|
-
if (index !== -1) {
|
|
517
|
-
console.log("off ", event);
|
|
518
|
-
callbacks[event] = callbacks[event].slice(index, 1);
|
|
519
|
-
}
|
|
520
|
-
return room;
|
|
521
|
-
};
|
|
522
|
-
|
|
523
|
-
const notify = function(event, msg) {
|
|
524
|
-
if (callbacks[event]) {
|
|
525
|
-
for (const callback of callbacks[event]) {
|
|
526
|
-
callback(msg);
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
};
|
|
530
|
-
|
|
531
|
-
room.processEvent = processEvent;
|
|
532
|
-
room.createRoom = createRoom;//done
|
|
533
|
-
room.join = join;//done
|
|
534
|
-
room.updateState = updateState;//done
|
|
535
|
-
room.destroyRoom = destroyRoom;//done
|
|
536
|
-
room.leaveRoom = leaveRoom;//done
|
|
537
|
-
room.sendMessage = sendMessage;//done
|
|
538
|
-
room.sendControlMessage = sendControlMessage;//done
|
|
539
|
-
room.changeQuality = changeQuality;//done
|
|
540
|
-
room.authorizeWaitingList = authorizeWaitingList;//done
|
|
541
|
-
room.muteTrack = muteTrack;//done
|
|
542
|
-
room.assignRole = assignRole;//done
|
|
543
|
-
room.subscribeToWaitingParticipant = subscribeToWaitingParticipant;//done
|
|
544
|
-
room.unsubscribeFromWaitingParticipant = unsubscribeFromWaitingParticipant;//done
|
|
545
|
-
room.moveToWaitingRoom = moveToWaitingRoom;//done
|
|
546
|
-
room.configureWaitingRoom = configureWaitingRoom;//done
|
|
547
|
-
/**
|
|
548
|
-
* Room name
|
|
549
|
-
* @returns {String} room name
|
|
550
|
-
*/
|
|
551
|
-
room.name = function() {
|
|
552
|
-
return name;
|
|
553
|
-
};
|
|
554
|
-
/**
|
|
555
|
-
* Room pin
|
|
556
|
-
* @returns {String} room pin
|
|
557
|
-
*/
|
|
558
|
-
room.pin = function() {
|
|
559
|
-
return pin;
|
|
560
|
-
};
|
|
561
|
-
|
|
562
|
-
/**
|
|
563
|
-
* Room underlying PeerConnection
|
|
564
|
-
* @returns {RTCPeerConnection} peer connection
|
|
565
|
-
*/
|
|
566
|
-
room.pc = function() {
|
|
567
|
-
return pc;
|
|
568
|
-
};
|
|
569
|
-
/**
|
|
570
|
-
* Local user role
|
|
571
|
-
* @returns {FlashphonerSFU.SFU_PARTICIPANT_ROLE}
|
|
572
|
-
*/
|
|
573
|
-
room.role = function() {
|
|
574
|
-
return role;
|
|
575
|
-
};
|
|
576
|
-
/**
|
|
577
|
-
* HTTP address of the invite. Note that this will only work with {@link FlashphonerSFUExtended}
|
|
578
|
-
* @returns {String}
|
|
579
|
-
*/
|
|
580
|
-
room.invite = function() {
|
|
581
|
-
return inviteId;
|
|
582
|
-
};
|
|
583
|
-
room.on = on;
|
|
584
|
-
room.off = off;
|
|
585
|
-
|
|
586
|
-
return room;
|
|
587
|
-
};
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
module.exports = {
|
|
591
|
-
room: room
|
|
592
|
-
};
|