11package io .calidog .certstream ;
22
3+ import org .java_websocket .client .WebSocketClient ;
34import org .java_websocket .handshake .ServerHandshake ;
45import org .slf4j .Logger ;
56import org .slf4j .LoggerFactory ;
67
8+ import java .util .Arrays ;
9+ import java .util .HashSet ;
10+ import java .util .function .Supplier ;
11+
712/**
8- * The class that takes care of ll the boring parts
13+ * The class that takes care of all the boring parts
914 * of talking over WebSockets, most notably the onClose
1015 * which will get called if your internet connection
1116 * hiccups.
@@ -15,15 +20,50 @@ public class BoringParts implements
1520 CertStreamCloseHandler ,
1621 CertStreamOpenHandler {
1722 private static final Logger logger = LoggerFactory .getLogger (BoringParts .class );
18- private boolean notClosed = true ;
23+ private final long sleepBeforeReconnect ;
24+
25+ private HashSet <Integer > recoverableCloseCodes = new HashSet <>(Arrays .asList (1001 , 1005 , 1006 , 1009 ));
26+
27+ private final Supplier <WebSocketClient > webSocketClientSupplier ;
28+ private WebSocketClient webSocketClient ;
29+
30+ private final CertStreamClientImplFactory defaultImplFactory =
31+ new CertStreamClientImplFactory (this ,
32+ this ,
33+ this );
34+
35+ public BoringParts (CertStreamStringMessageHandler handler )
36+ {
37+ this (handler , 0 );
38+ }
39+
40+ public BoringParts (CertStreamStringMessageHandler messageHandler , long sleepBeforeReconnect ) {
41+ this .sleepBeforeReconnect = sleepBeforeReconnect ;
42+ this .webSocketClientSupplier = () -> defaultImplFactory .make (messageHandler );
43+ webSocketClient = webSocketClientSupplier .get ();
44+ }
1945
2046 //todo reconnection logic
2147 @ Override
2248 public void onClose (int i , String s , boolean b ) {
2349 logger .warn ("OnClose was called wih i = " + i + ", s = " +s + ", b = b" );
2450 System .out .println ("OnClose was called wih i = " + i + ", s = " +s + ", b = b" );
2551
26- notClosed = false ;
52+ if (recoverableCloseCodes .contains (i ))
53+ {
54+ if (sleepBeforeReconnect >= 0 )
55+ {
56+ try {
57+ Thread .yield ();
58+ Thread .sleep (sleepBeforeReconnect );
59+ } catch (InterruptedException e ) {
60+ logger .info ("Thread sleep interrupted, weird, exiting" , e );
61+ return ;
62+ }
63+ }
64+
65+ webSocketClient = webSocketClientSupplier .get ();
66+ }
2767 }
2868
2969 @ Override
@@ -51,6 +91,6 @@ public void onOpen(ServerHandshake serverHandshake) {
5191 * @return whether or not onClose has been called
5292 */
5393 public boolean isNotClosed () {
54- return notClosed ;
94+ return ! webSocketClient . isClosed () ;
5595 }
5696}
0 commit comments