@device-portal/react 0.0.1 → 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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@device-portal/react",
3
- "version": "0.0.1",
3
+ "version": "0.0.5",
4
4
  "description": "Simple WebRTC data channel for React.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -16,7 +16,7 @@
16
16
  },
17
17
  "repository": {
18
18
  "type": "git",
19
- "url": "https://github.com/FilipChalupa/react-device-portal.git"
19
+ "url": "https://github.com/FilipChalupa/device-portal.git"
20
20
  },
21
21
  "keywords": [
22
22
  "react",
@@ -31,6 +31,9 @@
31
31
  "peerDependencies": {
32
32
  "react": "18 || 19"
33
33
  },
34
+ "dependencies": {
35
+ "@device-portal/client": "^0.0.5"
36
+ },
34
37
  "devDependencies": {
35
38
  "@babel/core": "^7.24.0",
36
39
  "@babel/preset-env": "^7.24.0",
package/dist/delay.js DELETED
@@ -1,8 +0,0 @@
1
- var delay = function delay(milliseconds) {
2
- return new Promise(function (resolve) {
3
- return setTimeout(resolve, milliseconds);
4
- });
5
- };
6
-
7
- export { delay };
8
- //# sourceMappingURL=delay.js.map
package/dist/delay.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"delay.js","sources":["../src/delay.ts"],"sourcesContent":["export const delay = (milliseconds: number) =>\n\tnew Promise((resolve) => setTimeout(resolve, milliseconds))\n"],"names":["delay","milliseconds","Promise","resolve","setTimeout"],"mappings":"IAAaA,KAAK,GAAG,SAARA,KAAKA,CAAIC,YAAoB,EAAA;AAAA,EAAA,OACzC,IAAIC,OAAO,CAAC,UAACC,OAAO,EAAA;AAAA,IAAA,OAAKC,UAAU,CAACD,OAAO,EAAEF,YAAY,CAAC;GAAC,CAAA;AAAA;;;;"}
package/dist/settings.js DELETED
@@ -1,12 +0,0 @@
1
- var settings = {
2
- channel: {
3
- label: 'data'
4
- },
5
- defaultWebsocketSignalingServer: 'wss://device-portal.filipchalupa.cz',
6
- iceServers: [{
7
- urls: ['stun:stun1.l.google.com:19302', 'stun:stun3.l.google.com:19302']
8
- }]
9
- };
10
-
11
- export { settings };
12
- //# sourceMappingURL=settings.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"settings.js","sources":["../src/settings.ts"],"sourcesContent":["export const settings = {\n\tchannel: {\n\t\tlabel: 'data',\n\t},\n\tdefaultWebsocketSignalingServer: 'wss://device-portal.filipchalupa.cz',\n\ticeServers: [\n\t\t{\n\t\t\turls: ['stun:stun1.l.google.com:19302', 'stun:stun3.l.google.com:19302'],\n\t\t},\n\t] satisfies Array<RTCIceServer>,\n} as const\n"],"names":["settings","channel","label","defaultWebsocketSignalingServer","iceServers","urls"],"mappings":"AAAO,IAAMA,QAAQ,GAAG;AACvBC,EAAAA,OAAO,EAAE;AACRC,IAAAA,KAAK,EAAE;GACP;AACDC,EAAAA,+BAA+B,EAAE,qCAAqC;AACtEC,EAAAA,UAAU,EAAE,CACX;AACCC,IAAAA,IAAI,EAAE,CAAC,+BAA+B,EAAE,+BAA+B;GACvE;AAEH;;;;"}
@@ -1,359 +0,0 @@
1
- import { inherits as _inherits, createClass as _createClass, createForOfIteratorHelper as _createForOfIteratorHelper, superPropGet as _superPropGet, asyncToGenerator as _asyncToGenerator, classCallCheck as _classCallCheck, callSuper as _callSuper, defineProperty as _defineProperty, regeneratorRuntime as _regeneratorRuntime } from '../_virtual/_rollupPluginBabelHelpers.js';
2
- import { Peer } from './Peer.js';
3
- import { settings } from '../settings.js';
4
-
5
- var Initiator = /*#__PURE__*/function (_Peer) {
6
- function Initiator(room) {
7
- var _options$maxClients;
8
- var _this;
9
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
10
- _classCallCheck(this, Initiator);
11
- _this = _callSuper(this, Initiator, [room, options]);
12
- _defineProperty(_this, "role", 'initiator');
13
- _defineProperty(_this, "connections", new Map());
14
- _defineProperty(_this, "waitingPeers", new Set());
15
- _defineProperty(_this, "peerListeners", new Map());
16
- _this.onMessage = options.onMessage;
17
- _this.onPeersChange = options.onPeersChange;
18
- _this.maxClients = (_options$maxClients = options.maxClients) !== null && _options$maxClients !== void 0 ? _options$maxClients : 1;
19
- return _this;
20
- }
21
- _inherits(Initiator, _Peer);
22
- return _createClass(Initiator, [{
23
- key: "peers",
24
- get: function get() {
25
- return Array.from(this.connections.keys());
26
- }
27
- }, {
28
- key: "addPeerListener",
29
- value: function addPeerListener(peerId, listener) {
30
- var _this2 = this;
31
- if (!this.peerListeners.has(peerId)) {
32
- this.peerListeners.set(peerId, new Set());
33
- }
34
- this.peerListeners.get(peerId).add(listener);
35
- return function () {
36
- var _this2$peerListeners$;
37
- (_this2$peerListeners$ = _this2.peerListeners.get(peerId)) === null || _this2$peerListeners$ === void 0 || _this2$peerListeners$["delete"](listener);
38
- };
39
- }
40
- }, {
41
- key: "onConnected",
42
- value: function onConnected() {
43
- console.log('[Initiator] Connected to signaling server');
44
- }
45
- }, {
46
- key: "handlePeerJoined",
47
- value: function () {
48
- var _handlePeerJoined = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(peerId) {
49
- var _this$onPeersChange;
50
- return _regeneratorRuntime().wrap(function _callee$(_context) {
51
- while (1) switch (_context.prev = _context.next) {
52
- case 0:
53
- console.log("[Initiator] Peer ".concat(peerId, " joined"));
54
- if (!(this.connections.size >= this.maxClients)) {
55
- _context.next = 5;
56
- break;
57
- }
58
- console.log("[Initiator] Max clients reached, adding ".concat(peerId, " to waiting list"));
59
- this.waitingPeers.add(peerId);
60
- return _context.abrupt("return");
61
- case 5:
62
- _context.next = 7;
63
- return this.createAndSendOffer(peerId);
64
- case 7:
65
- (_this$onPeersChange = this.onPeersChange) === null || _this$onPeersChange === void 0 || _this$onPeersChange.call(this, this.peers);
66
- case 8:
67
- case "end":
68
- return _context.stop();
69
- }
70
- }, _callee, this);
71
- }));
72
- function handlePeerJoined(_x) {
73
- return _handlePeerJoined.apply(this, arguments);
74
- }
75
- return handlePeerJoined;
76
- }()
77
- }, {
78
- key: "handlePeerLeft",
79
- value: function handlePeerLeft(peerId) {
80
- console.log("[Initiator] Peer ".concat(peerId, " left"));
81
- this.waitingPeers["delete"](peerId);
82
- var client = this.connections.get(peerId);
83
- if (client) {
84
- var _this$onPeersChange2;
85
- client.channel.close();
86
- client.connection.close();
87
- this.connections["delete"](peerId);
88
- (_this$onPeersChange2 = this.onPeersChange) === null || _this$onPeersChange2 === void 0 || _this$onPeersChange2.call(this, this.peers);
89
- this.processWaitingPeers();
90
- }
91
- }
92
- }, {
93
- key: "processWaitingPeers",
94
- value: function () {
95
- var _processWaitingPeers = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
96
- var nextPeerId, _this$onPeersChange3;
97
- return _regeneratorRuntime().wrap(function _callee2$(_context2) {
98
- while (1) switch (_context2.prev = _context2.next) {
99
- case 0:
100
- if (!(this.connections.size >= this.maxClients || this.waitingPeers.size === 0)) {
101
- _context2.next = 2;
102
- break;
103
- }
104
- return _context2.abrupt("return");
105
- case 2:
106
- nextPeerId = this.waitingPeers.values().next().value;
107
- if (!nextPeerId) {
108
- _context2.next = 9;
109
- break;
110
- }
111
- console.log("[Initiator] Slot available, connecting waiting peer: ".concat(nextPeerId));
112
- this.waitingPeers["delete"](nextPeerId);
113
- _context2.next = 8;
114
- return this.createAndSendOffer(nextPeerId);
115
- case 8:
116
- (_this$onPeersChange3 = this.onPeersChange) === null || _this$onPeersChange3 === void 0 || _this$onPeersChange3.call(this, this.peers);
117
- case 9:
118
- case "end":
119
- return _context2.stop();
120
- }
121
- }, _callee2, this);
122
- }));
123
- function processWaitingPeers() {
124
- return _processWaitingPeers.apply(this, arguments);
125
- }
126
- return processWaitingPeers;
127
- }()
128
- }, {
129
- key: "createAndSendOffer",
130
- value: function () {
131
- var _createAndSendOffer = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(toPeerId) {
132
- var _this3 = this;
133
- var existingClient, connection, channel, clientConnection, offer;
134
- return _regeneratorRuntime().wrap(function _callee3$(_context3) {
135
- while (1) switch (_context3.prev = _context3.next) {
136
- case 0:
137
- console.log("[Initiator] Creating offer for ".concat(toPeerId, "..."));
138
-
139
- // Close existing connection if any
140
- existingClient = this.connections.get(toPeerId);
141
- if (existingClient) {
142
- console.log("[Initiator] Closing existing connection for ".concat(toPeerId));
143
- existingClient.connection.close();
144
- existingClient.channel.close();
145
- }
146
- connection = new RTCPeerConnection({
147
- iceServers: this.iceServers
148
- });
149
- channel = connection.createDataChannel(settings.channel.label);
150
- clientConnection = {
151
- connection: connection,
152
- channel: channel,
153
- candidatesQueue: []
154
- };
155
- this.connections.set(toPeerId, clientConnection);
156
- connection.onicecandidate = function (event) {
157
- if (event.candidate) {
158
- _this3.sendMessage('ice-candidate', event.candidate.toJSON(), toPeerId);
159
- }
160
- };
161
- connection.oniceconnectionstatechange = function () {
162
- console.log("[Initiator] ICE state for ".concat(toPeerId, ": ").concat(connection.iceConnectionState));
163
- if (connection.iceConnectionState === 'disconnected' || connection.iceConnectionState === 'failed' || connection.iceConnectionState === 'closed') {
164
- var _this3$onPeersChange;
165
- _this3.connections["delete"](toPeerId);
166
- (_this3$onPeersChange = _this3.onPeersChange) === null || _this3$onPeersChange === void 0 || _this3$onPeersChange.call(_this3, _this3.peers);
167
- _this3.processWaitingPeers();
168
- }
169
- };
170
- channel.onopen = function () {
171
- console.log("[Initiator] Data channel opened for ".concat(toPeerId));
172
- if (_this3.value && _this3.sendLastValueOnConnectAndReconnect) {
173
- channel.send(_this3.value.value);
174
- }
175
- if (clientConnection.value) {
176
- channel.send(clientConnection.value.value);
177
- }
178
- };
179
- channel.onmessage = function (event) {
180
- var _this3$onMessage;
181
- console.log("[Initiator] Message from ".concat(toPeerId, ": ").concat(event.data));
182
- (_this3$onMessage = _this3.onMessage) === null || _this3$onMessage === void 0 || _this3$onMessage.call(_this3, event.data, toPeerId);
183
- var listeners = _this3.peerListeners.get(toPeerId);
184
- if (listeners) {
185
- var _iterator = _createForOfIteratorHelper(listeners),
186
- _step;
187
- try {
188
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
189
- var listener = _step.value;
190
- listener(event.data);
191
- }
192
- } catch (err) {
193
- _iterator.e(err);
194
- } finally {
195
- _iterator.f();
196
- }
197
- }
198
- };
199
- _context3.next = 13;
200
- return connection.createOffer();
201
- case 13:
202
- offer = _context3.sent;
203
- _context3.next = 16;
204
- return connection.setLocalDescription(offer);
205
- case 16:
206
- this.sendMessage('offer', offer, toPeerId);
207
- case 17:
208
- case "end":
209
- return _context3.stop();
210
- }
211
- }, _callee3, this);
212
- }));
213
- function createAndSendOffer(_x2) {
214
- return _createAndSendOffer.apply(this, arguments);
215
- }
216
- return createAndSendOffer;
217
- }()
218
- }, {
219
- key: "handleOffer",
220
- value: function handleOffer(offer, fromPeerId) {
221
- // Initiator does not handle offers
222
- }
223
- }, {
224
- key: "handleAnswer",
225
- value: function () {
226
- var _handleAnswer = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee4(answer, fromPeerId) {
227
- var client, candidate;
228
- return _regeneratorRuntime().wrap(function _callee4$(_context4) {
229
- while (1) switch (_context4.prev = _context4.next) {
230
- case 0:
231
- client = this.connections.get(fromPeerId);
232
- if (!client) {
233
- _context4.next = 11;
234
- break;
235
- }
236
- console.log("[Initiator] Handling answer from ".concat(fromPeerId));
237
- _context4.next = 5;
238
- return client.connection.setRemoteDescription(answer);
239
- case 5:
240
- if (!(client.candidatesQueue.length > 0)) {
241
- _context4.next = 11;
242
- break;
243
- }
244
- candidate = client.candidatesQueue.shift();
245
- _context4.next = 9;
246
- return client.connection.addIceCandidate(new RTCIceCandidate(candidate));
247
- case 9:
248
- _context4.next = 5;
249
- break;
250
- case 11:
251
- case "end":
252
- return _context4.stop();
253
- }
254
- }, _callee4, this);
255
- }));
256
- function handleAnswer(_x3, _x4) {
257
- return _handleAnswer.apply(this, arguments);
258
- }
259
- return handleAnswer;
260
- }()
261
- }, {
262
- key: "handleIceCandidate",
263
- value: function () {
264
- var _handleIceCandidate = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee5(candidate, fromPeerId) {
265
- var client;
266
- return _regeneratorRuntime().wrap(function _callee5$(_context5) {
267
- while (1) switch (_context5.prev = _context5.next) {
268
- case 0:
269
- if (fromPeerId) {
270
- _context5.next = 2;
271
- break;
272
- }
273
- return _context5.abrupt("return");
274
- case 2:
275
- client = this.connections.get(fromPeerId);
276
- if (!client) {
277
- _context5.next = 10;
278
- break;
279
- }
280
- if (!client.connection.remoteDescription) {
281
- _context5.next = 9;
282
- break;
283
- }
284
- _context5.next = 7;
285
- return client.connection.addIceCandidate(new RTCIceCandidate(candidate));
286
- case 7:
287
- _context5.next = 10;
288
- break;
289
- case 9:
290
- client.candidatesQueue.push(candidate);
291
- case 10:
292
- case "end":
293
- return _context5.stop();
294
- }
295
- }, _callee5, this);
296
- }));
297
- function handleIceCandidate(_x5, _x6) {
298
- return _handleIceCandidate.apply(this, arguments);
299
- }
300
- return handleIceCandidate;
301
- }()
302
- }, {
303
- key: "send",
304
- value: function send(value) {
305
- this.value = {
306
- value: value
307
- };
308
- var _iterator2 = _createForOfIteratorHelper(this.connections.values()),
309
- _step2;
310
- try {
311
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
312
- var client = _step2.value;
313
- if (client.channel.readyState === 'open') {
314
- client.channel.send(value);
315
- }
316
- }
317
- } catch (err) {
318
- _iterator2.e(err);
319
- } finally {
320
- _iterator2.f();
321
- }
322
- }
323
- }, {
324
- key: "sendToPeer",
325
- value: function sendToPeer(peerId, value) {
326
- var client = this.connections.get(peerId);
327
- if (!client) return;
328
- client.value = {
329
- value: value
330
- };
331
- if (client && client.channel.readyState === 'open') {
332
- client.channel.send(value);
333
- }
334
- }
335
- }, {
336
- key: "destroy",
337
- value: function destroy() {
338
- _superPropGet(Initiator, "destroy", this)([]);
339
- var _iterator3 = _createForOfIteratorHelper(this.connections.values()),
340
- _step3;
341
- try {
342
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
343
- var client = _step3.value;
344
- client.channel.close();
345
- client.connection.close();
346
- }
347
- } catch (err) {
348
- _iterator3.e(err);
349
- } finally {
350
- _iterator3.f();
351
- }
352
- this.connections.clear();
353
- this.peerListeners.clear();
354
- }
355
- }]);
356
- }(Peer);
357
-
358
- export { Initiator };
359
- //# sourceMappingURL=Initiator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Initiator.js","sources":["../../src/webrtc/Initiator.ts"],"sourcesContent":["import { Peer } from './Peer'\nimport { settings } from '../settings'\nimport { PeerId } from './PeerId'\n\ntype ClientConnection = {\n\tconnection: RTCPeerConnection\n\tchannel: RTCDataChannel\n\tcandidatesQueue: RTCIceCandidateInit[]\n\tvalue?: { value: string }\n}\n\nexport class Initiator extends Peer {\n\tprotected role = 'initiator' as const\n\tprotected connections = new Map<PeerId, ClientConnection>()\n\tprotected waitingPeers = new Set<PeerId>()\n\tprotected readonly maxClients: number\n\tprotected peerListeners = new Map<PeerId, Set<(value: string) => void>>()\n\tprotected onPeersChange: ((peers: PeerId[]) => void) | undefined\n\tprotected override readonly onMessage:\n\t\t| ((value: string, peerId: PeerId) => void)\n\t\t| undefined\n\n\tconstructor(\n\t\troom: string,\n\t\toptions: {\n\t\t\tonMessage?: (value: string, peerId: PeerId) => void\n\t\t\tonPeersChange?: (peers: PeerId[]) => void\n\t\t\tsendLastValueOnConnectAndReconnect?: boolean\n\t\t\twebsocketSignalingServer?: string\n\t\t\ticeServers?: Array<RTCIceServer>\n\t\t\tmaxClients?: number\n\t\t} = {},\n\t) {\n\t\tsuper(room, options)\n\t\tthis.onMessage = options.onMessage\n\t\tthis.onPeersChange = options.onPeersChange\n\t\tthis.maxClients = options.maxClients ?? 1\n\t}\n\n\tpublic get peers(): PeerId[] {\n\t\treturn Array.from(this.connections.keys())\n\t}\n\n\tpublic addPeerListener(peerId: PeerId, listener: (value: string) => void) {\n\t\tif (!this.peerListeners.has(peerId)) {\n\t\t\tthis.peerListeners.set(peerId, new Set())\n\t\t}\n\t\tthis.peerListeners.get(peerId)!.add(listener)\n\t\treturn () => {\n\t\t\tthis.peerListeners.get(peerId)?.delete(listener)\n\t\t}\n\t}\n\n\tprotected onConnected(): void {\n\t\tconsole.log('[Initiator] Connected to signaling server')\n\t}\n\n\tprotected async handlePeerJoined(peerId: PeerId) {\n\t\tconsole.log(`[Initiator] Peer ${peerId} joined`)\n\t\tif (this.connections.size >= this.maxClients) {\n\t\t\tconsole.log(\n\t\t\t\t`[Initiator] Max clients reached, adding ${peerId} to waiting list`,\n\t\t\t)\n\t\t\tthis.waitingPeers.add(peerId)\n\t\t\treturn\n\t\t}\n\t\tawait this.createAndSendOffer(peerId)\n\t\tthis.onPeersChange?.(this.peers)\n\t}\n\n\tprotected handlePeerLeft(peerId: PeerId) {\n\t\tconsole.log(`[Initiator] Peer ${peerId} left`)\n\t\tthis.waitingPeers.delete(peerId)\n\t\tconst client = this.connections.get(peerId)\n\t\tif (client) {\n\t\t\tclient.channel.close()\n\t\t\tclient.connection.close()\n\t\t\tthis.connections.delete(peerId)\n\t\t\tthis.onPeersChange?.(this.peers)\n\t\t\tthis.processWaitingPeers()\n\t\t}\n\t}\n\n\tprotected async processWaitingPeers() {\n\t\tif (\n\t\t\tthis.connections.size >= this.maxClients ||\n\t\t\tthis.waitingPeers.size === 0\n\t\t) {\n\t\t\treturn\n\t\t}\n\n\t\tconst nextPeerId = this.waitingPeers.values().next().value\n\t\tif (nextPeerId) {\n\t\t\tconsole.log(\n\t\t\t\t`[Initiator] Slot available, connecting waiting peer: ${nextPeerId}`,\n\t\t\t)\n\t\t\tthis.waitingPeers.delete(nextPeerId)\n\t\t\tawait this.createAndSendOffer(nextPeerId)\n\t\t\tthis.onPeersChange?.(this.peers)\n\t\t}\n\t}\n\n\tprotected async createAndSendOffer(toPeerId: PeerId) {\n\t\tconsole.log(`[Initiator] Creating offer for ${toPeerId}...`)\n\n\t\t// Close existing connection if any\n\t\tconst existingClient = this.connections.get(toPeerId)\n\t\tif (existingClient) {\n\t\t\tconsole.log(`[Initiator] Closing existing connection for ${toPeerId}`)\n\t\t\texistingClient.connection.close()\n\t\t\texistingClient.channel.close()\n\t\t}\n\n\t\tconst connection = new RTCPeerConnection({ iceServers: this.iceServers })\n\t\tconst channel = connection.createDataChannel(settings.channel.label)\n\t\tconst clientConnection: ClientConnection = {\n\t\t\tconnection,\n\t\t\tchannel,\n\t\t\tcandidatesQueue: [],\n\t\t}\n\n\t\tthis.connections.set(toPeerId, clientConnection)\n\n\t\tconnection.onicecandidate = (event) => {\n\t\t\tif (event.candidate) {\n\t\t\t\tthis.sendMessage('ice-candidate', event.candidate.toJSON(), toPeerId)\n\t\t\t}\n\t\t}\n\n\t\tconnection.oniceconnectionstatechange = () => {\n\t\t\tconsole.log(\n\t\t\t\t`[Initiator] ICE state for ${toPeerId}: ${connection.iceConnectionState}`,\n\t\t\t)\n\t\t\tif (\n\t\t\t\tconnection.iceConnectionState === 'disconnected' ||\n\t\t\t\tconnection.iceConnectionState === 'failed' ||\n\t\t\t\tconnection.iceConnectionState === 'closed'\n\t\t\t) {\n\t\t\t\tthis.connections.delete(toPeerId)\n\t\t\t\tthis.onPeersChange?.(this.peers)\n\t\t\t\tthis.processWaitingPeers()\n\t\t\t}\n\t\t}\n\n\t\tchannel.onopen = () => {\n\t\t\tconsole.log(`[Initiator] Data channel opened for ${toPeerId}`)\n\t\t\tif (this.value && this.sendLastValueOnConnectAndReconnect) {\n\t\t\t\tchannel.send(this.value.value)\n\t\t\t}\n\t\t\tif (clientConnection.value) {\n\t\t\t\tchannel.send(clientConnection.value.value)\n\t\t\t}\n\t\t}\n\n\t\tchannel.onmessage = (event) => {\n\t\t\tconsole.log(`[Initiator] Message from ${toPeerId}: ${event.data}`)\n\t\t\tthis.onMessage?.(event.data, toPeerId)\n\t\t\tconst listeners = this.peerListeners.get(toPeerId)\n\t\t\tif (listeners) {\n\t\t\t\tfor (const listener of listeners) {\n\t\t\t\t\tlistener(event.data)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst offer = await connection.createOffer()\n\t\tawait connection.setLocalDescription(offer)\n\t\tthis.sendMessage('offer', offer, toPeerId)\n\t}\n\n\tprotected handleOffer(\n\t\toffer: RTCSessionDescriptionInit,\n\t\tfromPeerId: PeerId,\n\t): void {\n\t\t// Initiator does not handle offers\n\t}\n\n\tprotected async handleAnswer(\n\t\tanswer: RTCSessionDescriptionInit,\n\t\tfromPeerId: PeerId,\n\t) {\n\t\tconst client = this.connections.get(fromPeerId)\n\t\tif (client) {\n\t\t\tconsole.log(`[Initiator] Handling answer from ${fromPeerId}`)\n\t\t\tawait client.connection.setRemoteDescription(answer)\n\t\t\t// Process queued candidates\n\t\t\twhile (client.candidatesQueue.length > 0) {\n\t\t\t\tconst candidate = client.candidatesQueue.shift()!\n\t\t\t\tawait client.connection.addIceCandidate(new RTCIceCandidate(candidate))\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected async handleIceCandidate(\n\t\tcandidate: RTCIceCandidateInit,\n\t\tfromPeerId?: PeerId,\n\t) {\n\t\tif (!fromPeerId) {\n\t\t\treturn\n\t\t}\n\t\tconst client = this.connections.get(fromPeerId)\n\t\tif (client) {\n\t\t\tif (client.connection.remoteDescription) {\n\t\t\t\tawait client.connection.addIceCandidate(new RTCIceCandidate(candidate))\n\t\t\t} else {\n\t\t\t\tclient.candidatesQueue.push(candidate)\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic send(value: string) {\n\t\tthis.value = { value }\n\t\tfor (const client of this.connections.values()) {\n\t\t\tif (client.channel.readyState === 'open') {\n\t\t\t\tclient.channel.send(value)\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic sendToPeer(peerId: PeerId, value: string) {\n\t\tconst client = this.connections.get(peerId)\n\t\tif (!client) return\n\t\tclient.value = { value }\n\t\tif (client && client.channel.readyState === 'open') {\n\t\t\tclient.channel.send(value)\n\t\t}\n\t}\n\n\tpublic destroy() {\n\t\tsuper.destroy()\n\t\tfor (const client of this.connections.values()) {\n\t\t\tclient.channel.close()\n\t\t\tclient.connection.close()\n\t\t}\n\t\tthis.connections.clear()\n\t\tthis.peerListeners.clear()\n\t}\n}\n"],"names":["Initiator","_Peer","room","_options$maxClients","_this","options","arguments","length","undefined","_classCallCheck","_callSuper","_defineProperty","Map","Set","onMessage","onPeersChange","maxClients","_inherits","_createClass","key","get","Array","from","connections","keys","value","addPeerListener","peerId","listener","_this2","peerListeners","has","set","add","_this2$peerListeners$","onConnected","console","log","_handlePeerJoined","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_this$onPeersChange","wrap","_callee$","_context","prev","next","concat","size","waitingPeers","abrupt","createAndSendOffer","call","peers","stop","handlePeerJoined","_x","apply","handlePeerLeft","client","_this$onPeersChange2","channel","close","connection","processWaitingPeers","_processWaitingPeers","_callee2","nextPeerId","_this$onPeersChange3","_callee2$","_context2","values","_createAndSendOffer","_callee3","toPeerId","_this3","existingClient","clientConnection","offer","_callee3$","_context3","RTCPeerConnection","iceServers","createDataChannel","settings","label","candidatesQueue","onicecandidate","event","candidate","sendMessage","toJSON","oniceconnectionstatechange","iceConnectionState","_this3$onPeersChange","onopen","sendLastValueOnConnectAndReconnect","send","onmessage","_this3$onMessage","data","listeners","_iterator","_createForOfIteratorHelper","_step","s","n","done","err","e","f","createOffer","sent","setLocalDescription","_x2","handleOffer","fromPeerId","_handleAnswer","_callee4","answer","_callee4$","_context4","setRemoteDescription","shift","addIceCandidate","RTCIceCandidate","handleAnswer","_x3","_x4","_handleIceCandidate","_callee5","_callee5$","_context5","remoteDescription","push","handleIceCandidate","_x5","_x6","_iterator2","_step2","readyState","sendToPeer","destroy","_superPropGet","_iterator3","_step3","clear","Peer"],"mappings":"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"}