@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.
Files changed (206) hide show
  1. package/dist/client.version +1 -0
  2. package/dist/examples/sfu.d.ts +13 -0
  3. package/dist/index.d.ts +6 -0
  4. package/dist/index.js +15 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/sdk/connection.d.ts +25 -0
  7. package/dist/sdk/connection.js +101 -0
  8. package/dist/sdk/connection.js.map +1 -0
  9. package/dist/sdk/constants.d.ts +358 -0
  10. package/dist/sdk/constants.js +192 -0
  11. package/dist/sdk/constants.js.map +1 -0
  12. package/dist/sdk/logger.d.ts +10 -0
  13. package/dist/sdk/logger.js +22 -0
  14. package/dist/sdk/logger.js.map +1 -0
  15. package/dist/sdk/notifier.d.ts +7 -0
  16. package/dist/sdk/notifier.js +52 -0
  17. package/dist/sdk/notifier.js.map +1 -0
  18. package/dist/sdk/promises.d.ts +11 -0
  19. package/{src/sdk/promise.js → dist/sdk/promises.js} +14 -13
  20. package/dist/sdk/promises.js.map +1 -0
  21. package/dist/sdk/room-extended.d.ts +13 -0
  22. package/dist/sdk/room-extended.js +112 -0
  23. package/dist/sdk/room-extended.js.map +1 -0
  24. package/dist/sdk/room.d.ts +30 -0
  25. package/dist/sdk/room.js +384 -0
  26. package/dist/sdk/room.js.map +1 -0
  27. package/dist/sdk/sfu-extended.d.ts +132 -0
  28. package/dist/sdk/sfu-extended.js +525 -0
  29. package/dist/sdk/sfu-extended.js.map +1 -0
  30. package/dist/sdk/sfu.d.ts +22 -0
  31. package/dist/sdk/sfu.js +136 -0
  32. package/dist/sdk/sfu.js.map +1 -0
  33. package/dist/src/index.d.ts +6 -0
  34. package/dist/src/sdk/connection.d.ts +25 -0
  35. package/dist/src/sdk/constants.d.ts +358 -0
  36. package/dist/src/sdk/logger.d.ts +10 -0
  37. package/dist/src/sdk/notifier.d.ts +7 -0
  38. package/dist/src/sdk/promises.d.ts +11 -0
  39. package/dist/src/sdk/room-extended.d.ts +13 -0
  40. package/dist/src/sdk/room.d.ts +30 -0
  41. package/dist/src/sdk/sfu-extended.d.ts +132 -0
  42. package/dist/src/sdk/sfu.d.ts +22 -0
  43. package/package.json +27 -27
  44. package/Gruntfile.js +0 -79
  45. package/README.md +0 -95
  46. package/dependencies/bootstrap/css/bootstrap-theme.css +0 -587
  47. package/dependencies/bootstrap/css/bootstrap-theme.css.map +0 -1
  48. package/dependencies/bootstrap/css/bootstrap-theme.min.css +0 -5
  49. package/dependencies/bootstrap/css/bootstrap.css +0 -6853
  50. package/dependencies/bootstrap/css/bootstrap.css.map +0 -1
  51. package/dependencies/bootstrap/css/bootstrap.min.css +0 -5
  52. package/dependencies/bootstrap/font-awesome/HELP-US-OUT.txt +0 -7
  53. package/dependencies/bootstrap/font-awesome/css/font-awesome.css +0 -2178
  54. package/dependencies/bootstrap/font-awesome/css/font-awesome.min.css +0 -4
  55. package/dependencies/bootstrap/font-awesome/fonts/FontAwesome.otf +0 -0
  56. package/dependencies/bootstrap/font-awesome/fonts/fontawesome-webfont.eot +0 -0
  57. package/dependencies/bootstrap/font-awesome/fonts/fontawesome-webfont.svg +0 -685
  58. package/dependencies/bootstrap/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
  59. package/dependencies/bootstrap/font-awesome/fonts/fontawesome-webfont.woff +0 -0
  60. package/dependencies/bootstrap/font-awesome/fonts/fontawesome-webfont.woff2 +0 -0
  61. package/dependencies/bootstrap/font-awesome/less/animated.less +0 -34
  62. package/dependencies/bootstrap/font-awesome/less/bordered-pulled.less +0 -25
  63. package/dependencies/bootstrap/font-awesome/less/core.less +0 -12
  64. package/dependencies/bootstrap/font-awesome/less/fixed-width.less +0 -6
  65. package/dependencies/bootstrap/font-awesome/less/font-awesome.less +0 -18
  66. package/dependencies/bootstrap/font-awesome/less/icons.less +0 -724
  67. package/dependencies/bootstrap/font-awesome/less/larger.less +0 -13
  68. package/dependencies/bootstrap/font-awesome/less/list.less +0 -19
  69. package/dependencies/bootstrap/font-awesome/less/mixins.less +0 -60
  70. package/dependencies/bootstrap/font-awesome/less/path.less +0 -15
  71. package/dependencies/bootstrap/font-awesome/less/rotated-flipped.less +0 -20
  72. package/dependencies/bootstrap/font-awesome/less/screen-reader.less +0 -5
  73. package/dependencies/bootstrap/font-awesome/less/stacked.less +0 -20
  74. package/dependencies/bootstrap/font-awesome/less/variables.less +0 -735
  75. package/dependencies/bootstrap/font-awesome/scss/_animated.scss +0 -34
  76. package/dependencies/bootstrap/font-awesome/scss/_bordered-pulled.scss +0 -25
  77. package/dependencies/bootstrap/font-awesome/scss/_core.scss +0 -12
  78. package/dependencies/bootstrap/font-awesome/scss/_fixed-width.scss +0 -6
  79. package/dependencies/bootstrap/font-awesome/scss/_icons.scss +0 -724
  80. package/dependencies/bootstrap/font-awesome/scss/_larger.scss +0 -13
  81. package/dependencies/bootstrap/font-awesome/scss/_list.scss +0 -19
  82. package/dependencies/bootstrap/font-awesome/scss/_mixins.scss +0 -60
  83. package/dependencies/bootstrap/font-awesome/scss/_path.scss +0 -15
  84. package/dependencies/bootstrap/font-awesome/scss/_rotated-flipped.scss +0 -20
  85. package/dependencies/bootstrap/font-awesome/scss/_screen-reader.scss +0 -5
  86. package/dependencies/bootstrap/font-awesome/scss/_stacked.scss +0 -20
  87. package/dependencies/bootstrap/font-awesome/scss/_variables.scss +0 -735
  88. package/dependencies/bootstrap/font-awesome/scss/font-awesome.scss +0 -18
  89. package/dependencies/bootstrap/fonts/FontAwesome.otf +0 -0
  90. package/dependencies/bootstrap/fonts/fontawesome-webfont.eot +0 -0
  91. package/dependencies/bootstrap/fonts/fontawesome-webfont.svg +0 -655
  92. package/dependencies/bootstrap/fonts/fontawesome-webfont.ttf +0 -0
  93. package/dependencies/bootstrap/fonts/fontawesome-webfont.woff +0 -0
  94. package/dependencies/bootstrap/fonts/fontawesome-webfont.woff2 +0 -0
  95. package/dependencies/bootstrap/fonts/glyphicons-halflings-regular.eot +0 -0
  96. package/dependencies/bootstrap/fonts/glyphicons-halflings-regular.svg +0 -288
  97. package/dependencies/bootstrap/fonts/glyphicons-halflings-regular.ttf +0 -0
  98. package/dependencies/bootstrap/fonts/glyphicons-halflings-regular.woff +0 -0
  99. package/dependencies/bootstrap/fonts/glyphicons-halflings-regular.woff2 +0 -0
  100. package/dependencies/bootstrap/icons/font-awesome.min.css +0 -4
  101. package/dependencies/bootstrap/js/bootstrap.js +0 -2363
  102. package/dependencies/bootstrap/js/bootstrap.min.js +0 -7
  103. package/dependencies/bootstrap/js/npm.js +0 -13
  104. package/dependencies/bootstrap/js/switch.js +0 -85
  105. package/dependencies/jquery/jquery-1.12.0.js +0 -11027
  106. package/dependencies/jquery/jquery-ui.js +0 -16617
  107. package/dependencies/jquery/jquery.js +0 -8981
  108. package/dependencies/jquery/jquery.json.js +0 -199
  109. package/dependencies/jquery/jquery.websocket.js +0 -61
  110. package/dependencies/sigma/sigma.layout.forceAtlas2.min.js +0 -1
  111. package/dependencies/sigma/sigma.layout.noverlap.min.js +0 -1
  112. package/dependencies/sigma/sigma.min.js +0 -2
  113. package/dependencies/sigma/sigma.plugins.relativeSize.min.js +0 -1
  114. package/dependencies/sigma/sigma.renderers.edgeLabels.min.js +0 -1
  115. package/dependencies/sigma/sigma.renderers.parallelEdges.min.js +0 -1
  116. package/dependencies/sigma/sigma.require.js +0 -12076
  117. package/docTemplate/README.md +0 -5
  118. package/docTemplate/publish.js +0 -654
  119. package/docTemplate/static/fonts/OpenSans-Bold-webfont.eot +0 -0
  120. package/docTemplate/static/fonts/OpenSans-Bold-webfont.svg +0 -1830
  121. package/docTemplate/static/fonts/OpenSans-Bold-webfont.woff +0 -0
  122. package/docTemplate/static/fonts/OpenSans-BoldItalic-webfont.eot +0 -0
  123. package/docTemplate/static/fonts/OpenSans-BoldItalic-webfont.svg +0 -1830
  124. package/docTemplate/static/fonts/OpenSans-BoldItalic-webfont.woff +0 -0
  125. package/docTemplate/static/fonts/OpenSans-Italic-webfont.eot +0 -0
  126. package/docTemplate/static/fonts/OpenSans-Italic-webfont.svg +0 -1830
  127. package/docTemplate/static/fonts/OpenSans-Italic-webfont.woff +0 -0
  128. package/docTemplate/static/fonts/OpenSans-Light-webfont.eot +0 -0
  129. package/docTemplate/static/fonts/OpenSans-Light-webfont.svg +0 -1831
  130. package/docTemplate/static/fonts/OpenSans-Light-webfont.woff +0 -0
  131. package/docTemplate/static/fonts/OpenSans-LightItalic-webfont.eot +0 -0
  132. package/docTemplate/static/fonts/OpenSans-LightItalic-webfont.svg +0 -1835
  133. package/docTemplate/static/fonts/OpenSans-LightItalic-webfont.woff +0 -0
  134. package/docTemplate/static/fonts/OpenSans-Regular-webfont.eot +0 -0
  135. package/docTemplate/static/fonts/OpenSans-Regular-webfont.svg +0 -1831
  136. package/docTemplate/static/fonts/OpenSans-Regular-webfont.woff +0 -0
  137. package/docTemplate/static/scripts/linenumber.js +0 -25
  138. package/docTemplate/static/scripts/prettify/Apache-License-2.0.txt +0 -202
  139. package/docTemplate/static/scripts/prettify/lang-css.js +0 -2
  140. package/docTemplate/static/scripts/prettify/prettify.js +0 -28
  141. package/docTemplate/static/styles/jsdoc-default.css +0 -354
  142. package/docTemplate/static/styles/prettify-jsdoc.css +0 -111
  143. package/docTemplate/static/styles/prettify-tomorrow.css +0 -132
  144. package/docTemplate/tmpl/augments.tmpl +0 -10
  145. package/docTemplate/tmpl/container.tmpl +0 -183
  146. package/docTemplate/tmpl/details.tmpl +0 -143
  147. package/docTemplate/tmpl/example.tmpl +0 -2
  148. package/docTemplate/tmpl/examples.tmpl +0 -13
  149. package/docTemplate/tmpl/exceptions.tmpl +0 -32
  150. package/docTemplate/tmpl/layout.tmpl +0 -38
  151. package/docTemplate/tmpl/mainpage.tmpl +0 -14
  152. package/docTemplate/tmpl/members.tmpl +0 -38
  153. package/docTemplate/tmpl/method.tmpl +0 -105
  154. package/docTemplate/tmpl/params.tmpl +0 -124
  155. package/docTemplate/tmpl/properties.tmpl +0 -108
  156. package/docTemplate/tmpl/returns.tmpl +0 -19
  157. package/docTemplate/tmpl/source.tmpl +0 -8
  158. package/docTemplate/tmpl/tutorial.tmpl +0 -19
  159. package/docTemplate/tmpl/type.tmpl +0 -7
  160. package/src/examples/client/chat.js +0 -67
  161. package/src/examples/client/config.json +0 -26
  162. package/src/examples/client/controls.js +0 -314
  163. package/src/examples/client/display.js +0 -502
  164. package/src/examples/client/main.css +0 -45
  165. package/src/examples/client/main.html +0 -220
  166. package/src/examples/client/main.js +0 -156
  167. package/src/examples/client/resources/details_close.png +0 -0
  168. package/src/examples/client/resources/details_open.png +0 -0
  169. package/src/examples/client/util.js +0 -67
  170. package/src/examples/commons/js/config.js +0 -81
  171. package/src/examples/commons/js/display.js +0 -484
  172. package/src/examples/commons/js/util.js +0 -202
  173. package/src/examples/commons/media/silence.mp3 +0 -0
  174. package/src/examples/controller/dependencies/sigma/sigma.renderers.edgeLabels.min.js +0 -1
  175. package/src/examples/controller/dependencies/sigma/sigma.renderers.parallelEdges.min.js +0 -1
  176. package/src/examples/controller/dependencies/sigma/sigma.require.js +0 -12076
  177. package/src/examples/controller/graph-view.js +0 -32
  178. package/src/examples/controller/main.css +0 -45
  179. package/src/examples/controller/main.html +0 -79
  180. package/src/examples/controller/main.js +0 -65
  181. package/src/examples/controller/parser.js +0 -202
  182. package/src/examples/controller/resources/details_close.png +0 -0
  183. package/src/examples/controller/resources/details_open.png +0 -0
  184. package/src/examples/controller/rest.js +0 -56
  185. package/src/examples/controller/table-view.js +0 -64
  186. package/src/examples/controller/test-data.js +0 -382
  187. package/src/examples/player/config.json +0 -8
  188. package/src/examples/player/player.css +0 -19
  189. package/src/examples/player/player.html +0 -54
  190. package/src/examples/player/player.js +0 -209
  191. package/src/examples/two-way-streaming/config.json +0 -34
  192. package/src/examples/two-way-streaming/two-way-streaming.css +0 -26
  193. package/src/examples/two-way-streaming/two-way-streaming.html +0 -72
  194. package/src/examples/two-way-streaming/two-way-streaming.js +0 -375
  195. package/src/sdk/constants.js +0 -513
  196. package/src/sdk/logger.js +0 -16
  197. package/src/sdk/room.js +0 -592
  198. package/src/sdk/sfu-extended.js +0 -842
  199. package/src/sdk/sfu.js +0 -208
  200. package/src/sdk/ws.js +0 -113
  201. package/src/tests/assets/1.jpeg +0 -0
  202. package/src/tests/lib/rtcaudiosourcesinewave.js +0 -109
  203. package/src/tests/lib/rtcvideosourcewrapper.js +0 -28
  204. package/src/tests/sdk/room.test.js +0 -229
  205. package/src/tests/sdk/sfu-extended.test.js +0 -265
  206. 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
- };