55import com .craftmend .openaudiomc .generic .authentication .AuthenticationService ;
66import com .craftmend .openaudiomc .generic .authentication .objects .ServerKeySet ;
77import com .craftmend .openaudiomc .generic .events .events .StateChangeEvent ;
8- import com .craftmend .openaudiomc .generic .networking .DefaultNetworkingService ;
9- import com .craftmend .openaudiomc .generic .oac .OpenaudioAccountService ;
108import com .craftmend .openaudiomc .generic .logging .OpenAudioLogger ;
11- import com .craftmend .openaudiomc .generic .networking .certificate . CertificateHelper ;
9+ import com .craftmend .openaudiomc .generic .networking .DefaultNetworkingService ;
1210import com .craftmend .openaudiomc .generic .networking .abstracts .AbstractPacket ;
11+ import com .craftmend .openaudiomc .generic .networking .certificate .CertificateHelper ;
1312import com .craftmend .openaudiomc .generic .networking .drivers .ClientDriver ;
1413import com .craftmend .openaudiomc .generic .networking .drivers .NotificationDriver ;
1514import com .craftmend .openaudiomc .generic .networking .drivers .SystemDriver ;
15+ import com .craftmend .openaudiomc .generic .networking .interfaces .Authenticatable ;
16+ import com .craftmend .openaudiomc .generic .networking .interfaces .SocketDriver ;
17+ import com .craftmend .openaudiomc .generic .oac .OpenaudioAccountService ;
1618import com .craftmend .openaudiomc .generic .platform .interfaces .TaskService ;
1719import com .craftmend .openaudiomc .generic .rest .RestRequest ;
20+ import com .craftmend .openaudiomc .generic .rest .ServerEnvironment ;
1821import com .craftmend .openaudiomc .generic .rest .response .NoResponse ;
1922import com .craftmend .openaudiomc .generic .rest .routes .Endpoint ;
2023import com .craftmend .openaudiomc .generic .rest .types .RelayLoginResponse ;
2124import com .craftmend .openaudiomc .generic .state .StateService ;
2225import com .craftmend .openaudiomc .generic .state .states .*;
23- import com .craftmend .openaudiomc .generic .networking .interfaces .Authenticatable ;
24- import com .craftmend .openaudiomc .generic .networking .interfaces .SocketDriver ;
25-
2626import com .craftmend .openaudiomc .generic .storage .enums .StorageKey ;
2727import com .craftmend .openaudiomc .generic .uploads .UploadIndexService ;
28+ import com .craftmend .openaudiomc .generic .utils .NamedExecutors ;
2829import io .socket .client .IO ;
2930import io .socket .client .Socket ;
30-
3131import lombok .Getter ;
32-
3332import okhttp3 .Call ;
3433import okhttp3 .OkHttpClient ;
3534import okhttp3 .WebSocket ;
4140
4241public class SocketConnection {
4342
44- @ Getter private final DefaultNetworkingService parent ;
43+ private static final OkHttpClient SOCKET_HTTP_CLIENT = buildSocketHttpClient ();
44+ private static OkHttpClient buildSocketHttpClient () {
45+ ProxySelector .setDefault (new NullProxySelector ());
46+
47+ OkHttpClient .Builder builder = new OkHttpClient .Builder ()
48+ .proxySelector (new NullProxySelector ())
49+ .dispatcher (NamedExecutors .namedDispatcher ("OA-SocketPreauth" ));
50+
51+ if (OpenAudioMc .SERVER_ENVIRONMENT == ServerEnvironment .DEVELOPMENT ) {
52+ OpenAudioLogger .warn ("Running in development mode, disabling SSL verification" );
53+ CertificateHelper .ignore (builder );
54+ }
55+
56+ return builder .build ();
57+ }
58+
59+ @ Getter
60+ private final DefaultNetworkingService parent ;
4561
4662 private Socket socket ;
4763 @ Getter
@@ -50,8 +66,8 @@ public class SocketConnection {
5066 private boolean registeredLogout = false ;
5167 @ Getter
5268 private RelayLoginResponse previousLogin ;
53- private ServerKeySet keySet ;
54- private SystemDriver systemDriver = new SystemDriver (this );
69+ private final ServerKeySet keySet ;
70+ private final SystemDriver systemDriver = new SystemDriver (this );
5571
5672 private final SocketDriver [] drivers = new SocketDriver []{
5773 new NotificationDriver (),
@@ -71,18 +87,17 @@ public void setupConnection() {
7187
7288 if (!isReconnect && !OpenAudioMc .getService (StateService .class ).getCurrentState ().canConnect ()) return ;
7389
74- // update state
7590 if (!isReconnect ) {
76- // only override the state if we are not reconnecting
7791 OpenAudioMc .getService (StateService .class ).setState (new AssigningRelayState ());
7892 } else {
7993 OpenAudioLogger .info ("Attempting to restore connection to OpenAudioMc, attempt " + attempt );
8094 }
8195
8296 if (!registeredLogout ) {
83- relayLoginRequest = new RestRequest (RelayLoginResponse .class , Endpoint .RELAY_LOGIN );
84- relayLoginRequest .setQuery ("oa-version" , OpenAudioMc .BUILD .getBuildNumber () + "" );
85- relayLogoutRequest = new RestRequest (NoResponse .class , Endpoint .RELAY_LOGOUT );
97+ relayLoginRequest = new RestRequest <>(RelayLoginResponse .class , Endpoint .RELAY_LOGIN )
98+ .setQuery ("oa-version" , String .valueOf (OpenAudioMc .BUILD .getBuildNumber ()));
99+
100+ relayLogoutRequest = new RestRequest <>(NoResponse .class , Endpoint .RELAY_LOGOUT );
86101
87102 EventApi .getInstance ().registerHandler (StateChangeEvent .class , event -> {
88103 if (event .getOldState () instanceof ConnectedState ) {
@@ -93,13 +108,10 @@ public void setupConnection() {
93108 registeredLogout = true ;
94109 }
95110
96- ProxySelector .setDefault (new NullProxySelector ());
97- OkHttpClient okHttpClient = CertificateHelper .ignore (new OkHttpClient .Builder ().proxySelector (new NullProxySelector ())).build ();
98-
99111 IO .Options opts = new IO .Options ();
100- opts .callFactory = (Call .Factory ) okHttpClient ;
112+ opts .callFactory = (Call .Factory ) SOCKET_HTTP_CLIENT ;
113+ opts .webSocketFactory = (WebSocket .Factory ) SOCKET_HTTP_CLIENT ;
101114 opts .reconnection = false ;
102- opts .webSocketFactory = (WebSocket .Factory ) okHttpClient ;
103115 opts .forceNew = true ;
104116 opts .rememberUpgrade = false ;
105117
@@ -108,7 +120,7 @@ public void setupConnection() {
108120 "type=server&private=%s&public=%s&reconnect=%s" ,
109121 keySet .getPrivateKey ().getValue (),
110122 keySet .getPublicKey ().getValue (),
111- isReconnect ? "true" : "false"
123+ isReconnect
112124 );
113125 } else {
114126 opts .query = String .format (
@@ -118,19 +130,20 @@ public void setupConnection() {
118130 );
119131 }
120132
121- // only do login handling if we're not reconnecting, because then we'd be re-using the same config
122133 if (!isReconnect ) {
123134 OpenAudioMc .resolveDependency (TaskService .class ).schduleSyncDelayedTask (() -> {
124135 if (OpenAudioMc .getService (StateService .class ).getCurrentState () instanceof AssigningRelayState ) {
125136 OpenAudioLogger .info ("Connecting timed out." );
126- OpenAudioMc .getService (StateService .class ).setState (new IdleState ("Connecting to OpenAudioMc timed out" ));
137+ OpenAudioMc .getService (StateService .class )
138+ .setState (new IdleState ("Connecting to OpenAudioMc timed out" ));
127139 }
128140 }, 20 * 35 );
129141
130142 relayLoginRequest .run ();
131143
132144 if (relayLoginRequest .hasError ()) {
133- OpenAudioMc .getService (StateService .class ).setState (new IdleState ("Failed to do the initial handshake. Error: " + relayLoginRequest .getError ()));
145+ OpenAudioMc .getService (StateService .class )
146+ .setState (new IdleState ("Failed to do the initial handshake. Error: " + relayLoginRequest .getError ()));
134147 OpenAudioLogger .info ("Failed to get instance: " + relayLoginRequest .getError ().getMessage ());
135148 try {
136149 throw new IOException ("Failed to get instance! see console for error information" );
@@ -140,43 +153,37 @@ public void setupConnection() {
140153 return ;
141154 }
142155
143- RelayLoginResponse loginResponse = relayLoginRequest .getResponse ();
144- previousLogin = loginResponse ;
145- OpenAudioMc .getService (UploadIndexService .class ).setContent (loginResponse .getFiles ());
156+ previousLogin = relayLoginRequest .getResponse ();
157+ OpenAudioMc .getService (UploadIndexService .class ).setContent (previousLogin .getFiles ());
146158 }
147159
148160 if (previousLogin == null ) {
149- OpenAudioMc .getService (StateService .class ).setState (new IdleState ("Failed to get a relay instance" ));
150- OpenAudioLogger .warn ("Entered a track which should only be entered during recovery, but there was no previous login. reconnect: " + isReconnect + " attempt: " + attempt );
161+ OpenAudioMc .getService (StateService .class )
162+ .setState (new IdleState ("Failed to get a relay instance" ));
163+ OpenAudioLogger .warn ("Recovery path hit without previous login" );
151164 return ;
152165 }
153166
154167 try {
155- String endpoint = previousLogin .getRelayEndpoint ();
156- endpoint = endpoint .replace ("https" , "http" );
168+ String endpoint = previousLogin .getRelayEndpoint ().replace ("https" , "http" );
157169 socket = IO .socket (endpoint , opts );
158170 } catch (URISyntaxException e ) {
159171 OpenAudioLogger .error (e , "Received an invalid endpoint" );
172+ return ;
160173 }
161174
162- // this should again, only be done if we're not reconnecting
163175 if (!isReconnect ) {
164- // register state to be connecting
165176 OpenAudioMc .getService (StateService .class ).setState (new ConnectingState ());
166-
167- // clear session cache
168177 OpenAudioMc .getService (AuthenticationService .class ).getDriver ().initCache ();
169178 }
170179
171- // schedule timeout check
172180 OpenAudioMc .resolveDependency (TaskService .class ).schduleSyncDelayedTask (() -> {
173- // was it a normal connection?
174181 if (OpenAudioMc .getService (StateService .class ).getCurrentState () instanceof ConnectingState ) {
175182 OpenAudioLogger .warn ("Connect timed out." );
176- OpenAudioMc .getService (StateService .class ).setState (new IdleState ("Connecting to the assigned instance timed out (socket)" ));
183+ OpenAudioMc .getService (StateService .class )
184+ .setState (new IdleState ("Connecting to the assigned instance timed out (socket)" ));
177185 }
178186
179- // alternatively, check if we're still in the same reconnect cycle
180187 if (OpenAudioMc .getService (StateService .class ).getCurrentState () instanceof ReconnectingState ) {
181188 ReconnectingState state = (ReconnectingState ) OpenAudioMc .getService (StateService .class ).getCurrentState ();
182189 if (state .getStateId ().equals (stateId ) && state .getAttempts () == attempt ) {
@@ -185,9 +192,9 @@ public void setupConnection() {
185192 }
186193 }, 20 * 35 );
187194
188-
189- // register drivers
190- for ( SocketDriver driver : drivers ) driver . boot ( socket , this );
195+ for ( SocketDriver driver : drivers ) {
196+ driver . boot ( socket , this );
197+ }
191198
192199 socket .connect ();
193200 }
@@ -196,22 +203,22 @@ public void disconnect() {
196203 if (relayLogoutRequest != null ) {
197204 relayLogoutRequest .run ();
198205 }
199- if (this .socket != null ) {
200- // let them know that we intend to shut down
206+ if (socket != null ) {
201207 systemDriver .setAnnouncedShutdown (true );
202- this . socket .emit ("announce-shutdown" , "goodbye" );
203- this . socket .disconnect ();
208+ socket .emit ("announce-shutdown" , "goodbye" );
209+ socket .disconnect ();
204210 }
205211 OpenAudioMc .getService (StateService .class ).setState (new IdleState ());
206- OpenAudioMc .getService (OpenaudioAccountService .class ).getVoiceApiConnection ().stop ();
212+ OpenAudioMc .getService (OpenaudioAccountService .class )
213+ .getVoiceApiConnection ()
214+ .stop ();
207215 }
208216
209217 public void send (Authenticatable client , AbstractPacket packet ) {
210- // only send the packet if the client is online, valid and the plugin is connected
211- if ( client . isConnected () && OpenAudioMc .getService (StateService .class ).getCurrentState ().isConnected ()) {
218+ if ( client . isConnected () &&
219+ OpenAudioMc .getService (StateService .class ).getCurrentState ().isConnected ()) {
212220 packet .setClient (client .getOwner ().getUniqueId ());
213221 socket .emit ("data" , OpenAudioMc .getGson ().toJson (packet ));
214222 }
215223 }
216-
217224}
0 commit comments