51
51
import java .util .List ;
52
52
import java .util .Set ;
53
53
import java .util .concurrent .CompletableFuture ;
54
- import java .util .concurrent .CompletionException ;
55
54
import java .util .concurrent .CompletionStage ;
56
55
57
56
/**
@@ -116,8 +115,11 @@ private enum MessageType {
116
115
117
116
private SignalingListener listener ;
118
117
118
+ private StringBuilder text ;
119
+
119
120
120
121
public AppRTCWebSocketClient () {
122
+ text = new StringBuilder ();
121
123
wsSendQueue = new ArrayList <>();
122
124
codec = new AppRTCJsonCodec ();
123
125
client = HttpClient .newBuilder ().build ();
@@ -131,13 +133,37 @@ public Set<Contact> getContacts() {
131
133
}
132
134
133
135
@ Override
134
- public void joinRoom (Contact asContact , Room room ) {
135
- connect (SERVER_URL , room );
136
+ public void joinRoom (Contact asContact , Room room ) throws Exception {
137
+ roomState = ConnectionState .NEW ;
138
+
139
+ connectionParameters = new AppRTCConnectionParameters (SERVER_URL ,
140
+ room .getName ());
141
+
142
+ String roomUrl = String .format (JOIN_URL ,
143
+ connectionParameters .roomUrl ,
144
+ connectionParameters .roomId );
145
+
146
+ LOGGER .log (Level .INFO , "Connecting to room: " + roomUrl );
147
+
148
+ HttpRequest .Builder request = HttpRequest .newBuilder ()
149
+ .setHeader ("REFERER" , connectionParameters .roomUrl )
150
+ .POST (HttpRequest .BodyPublishers .noBody ())
151
+ .uri (URI .create (roomUrl ));
152
+
153
+ HttpResponse <String > response = client .send (request .build (),
154
+ HttpResponse .BodyHandlers
155
+ .ofString ());
156
+
157
+ String body = response .body ();
158
+
159
+ LOGGER .log (Level .INFO , "Room response: " + body );
160
+
161
+ setSignalingParameters (parseConnectResponse (body ));
136
162
}
137
163
138
164
@ Override
139
165
public void leaveRoom () {
140
- LOGGER .log (Level .INFO , "Disconnect. Room state: " + roomState );
166
+ LOGGER .log (Level .INFO , "Leaving room" );
141
167
142
168
if (roomState == ConnectionState .CONNECTED ) {
143
169
LOGGER .log (Level .INFO , "Closing room" );
@@ -148,7 +174,7 @@ public void leaveRoom() {
148
174
roomState = ConnectionState .CLOSED ;
149
175
150
176
if (webSocket != null ) {
151
- LOGGER .log (Level .INFO , "Disconnect WebSocket in state: " + state );
177
+ LOGGER .log (Level .INFO , "Disconnecting WebSocket" );
152
178
153
179
if (state == WebSocketConnectionState .REGISTERED ) {
154
180
// Send "bye" to WebSocket server.
@@ -194,8 +220,6 @@ public void setSignalingListener(SignalingListener listener) {
194
220
this .listener = listener ;
195
221
}
196
222
197
- StringBuilder text = new StringBuilder ();
198
-
199
223
@ Override
200
224
public void onOpen (WebSocket webSocket ) {
201
225
webSocket .request (1 );
@@ -218,7 +242,7 @@ public CompletionStage<?> onText(WebSocket webSocket, CharSequence data,
218
242
text .append (data );
219
243
220
244
if (last ) {
221
- String message = text .toString ();
245
+ String message = text .toString (). trim () ;
222
246
223
247
LOGGER .log (Level .INFO , "WSS->C: " + message );
224
248
@@ -284,7 +308,7 @@ private void sendWSSMessage(final String method, final String message) {
284
308
HttpRequest .BodyPublishers .ofString (message );
285
309
286
310
HttpRequest .Builder request = HttpRequest .newBuilder ()
287
- .setHeader ("REFERER" , SERVER_URL )
311
+ .setHeader ("REFERER" , connectionParameters . roomUrl )
288
312
.uri (URI .create (postUrl ));
289
313
290
314
if (method .equals ("POST" )) {
@@ -326,7 +350,9 @@ private void sendWebSocketMessage(AppRTCMessage message) {
326
350
});
327
351
}
328
352
329
- private void signalingParametersReady (AppRTCSignalingParameters signalingParameters ) {
353
+ private void setSignalingParameters (AppRTCSignalingParameters signalingParameters ) {
354
+ this .signalingParameters = signalingParameters ;
355
+
330
356
LOGGER .log (Level .INFO , "Room connection completed" );
331
357
LOGGER .log (Level .INFO , "ClientId: " + signalingParameters .clientId );
332
358
LOGGER .log (Level .INFO , "Initiator: " + signalingParameters .initiator );
@@ -335,8 +361,6 @@ private void signalingParametersReady(AppRTCSignalingParameters signalingParamet
335
361
LOGGER .log (Level .INFO , "ICEServer: " + iceServer );
336
362
}
337
363
338
- this .signalingParameters = signalingParameters ;
339
-
340
364
if (connectionParameters .loopback && (!signalingParameters .initiator
341
365
|| signalingParameters .offer != null )) {
342
366
reportError ("Loopback room is busy" );
@@ -349,6 +373,10 @@ private void signalingParametersReady(AppRTCSignalingParameters signalingParamet
349
373
350
374
roomState = ConnectionState .CONNECTED ;
351
375
376
+ startSignaling ();
377
+ }
378
+
379
+ private void startSignaling () {
352
380
connectWebSocket ();
353
381
register ();
354
382
@@ -446,33 +474,6 @@ private void sendLocalIceCandidateRemovals(final RTCIceCandidate[] candidates) {
446
474
}
447
475
}
448
476
449
- private void connect (String serverUrl , Room room ) {
450
- roomState = ConnectionState .NEW ;
451
-
452
- connectionParameters = new AppRTCConnectionParameters (serverUrl ,
453
- room .getName ());
454
-
455
- String roomUrl = String .format (JOIN_URL ,
456
- connectionParameters .roomUrl ,
457
- connectionParameters .roomId );
458
-
459
- LOGGER .log (Level .INFO , "Connecting to room: " + roomUrl );
460
-
461
- HttpRequest .Builder request = HttpRequest .newBuilder ()
462
- .setHeader ("REFERER" , connectionParameters .roomUrl )
463
- .POST (HttpRequest .BodyPublishers .noBody ())
464
- .uri (URI .create (roomUrl ));
465
-
466
- client .sendAsync (request .build (), HttpResponse .BodyHandlers .ofString ())
467
- .thenApply (HttpResponse ::body )
468
- .thenApply (this ::parseConnectResponse )
469
- .thenAccept (this ::signalingParametersReady )
470
- .exceptionally (throwable -> {
471
- reportError ("Connect to room failed" , throwable );
472
- return null ;
473
- });
474
- }
475
-
476
477
private void connectWebSocket () {
477
478
String wssUrl = signalingParameters .wssUrl ;
478
479
@@ -484,7 +485,7 @@ private void connectWebSocket() {
484
485
}
485
486
486
487
webSocket = client .newWebSocketBuilder ()
487
- .header ("Origin" , SERVER_URL )
488
+ .header ("Origin" , connectionParameters . roomUrl )
488
489
.buildAsync (URI .create (wssUrl ), this )
489
490
.join ();
490
491
}
@@ -510,7 +511,7 @@ private void register() {
510
511
}
511
512
512
513
wsSendQueue .clear ();
513
- });
514
+ }). join () ;
514
515
}
515
516
516
517
private void reportError (final String message , final Throwable error ) {
@@ -531,35 +532,29 @@ private void reportError(final String errorMessage) {
531
532
}
532
533
}
533
534
534
- private AppRTCSignalingParameters parseConnectResponse (String response ) {
535
- LOGGER .log (Level .INFO , "Room response: " + response );
535
+ private AppRTCSignalingParameters parseConnectResponse (String response )
536
+ throws Exception {
537
+ AppRTCSignalingParameters params = codec .toSignalingParameters (response );
536
538
537
- try {
538
- AppRTCSignalingParameters params = codec .toSignalingParameters (response );
539
+ // Request TURN servers.
540
+ boolean isTurnPresent = params .iceServers .stream ()
541
+ .anyMatch (s -> s .urls .stream ()
542
+ .anyMatch (url -> url .startsWith ("turn:" )));
539
543
540
- // Request TURN servers.
541
- boolean isTurnPresent = params .iceServers .stream ()
542
- .anyMatch (s -> s .urls .stream ()
543
- .anyMatch (url -> url .startsWith ("turn:" )));
544
+ String iceServerUrl = params .iceServerUrl ;
544
545
545
- String iceServerUrl = params .iceServerUrl ;
546
-
547
- if (!isTurnPresent && nonNull (iceServerUrl ) && !iceServerUrl .isEmpty ()) {
548
- params .iceServers .addAll (requestTurnServers (iceServerUrl ));
549
- }
550
-
551
- return params ;
552
- }
553
- catch (Exception e ) {
554
- throw new CompletionException (e );
546
+ if (!isTurnPresent && nonNull (iceServerUrl ) && !iceServerUrl .isEmpty ()) {
547
+ params .iceServers .addAll (requestTurnServers (iceServerUrl ));
555
548
}
549
+
550
+ return params ;
556
551
}
557
552
558
553
private List <RTCIceServer > requestTurnServers (String url ) throws Exception {
559
554
LOGGER .log (Level .INFO , "Request TURN from: " + url );
560
555
561
556
HttpRequest .Builder request = HttpRequest .newBuilder ()
562
- .setHeader ("REFERER" , SERVER_URL )
557
+ .setHeader ("REFERER" , connectionParameters . roomUrl )
563
558
.timeout (Duration .ofMillis (5000 ))
564
559
.POST (HttpRequest .BodyPublishers .noBody ())
565
560
.uri (URI .create (url ));
@@ -648,7 +643,7 @@ private void sendPostMessage(MessageType messageType, AppRTCMessage message) {
648
643
649
644
HttpRequest request = HttpRequest .newBuilder ()
650
645
.uri (URI .create (url ))
651
- .setHeader ("REFERER" , SERVER_URL )
646
+ .setHeader ("REFERER" , connectionParameters . roomUrl )
652
647
.header ("Content-Type" , "application/json" )
653
648
.POST (publisher )
654
649
.build ();
0 commit comments