public ClientEndpoint createFor (
AsyncHttpClient httpClient,
String destination,
MetricsCollector metricsCollector) {
StreamCreatingWebSocketTextListener listener = new StreamCreatingWebSocketTextListener();
WebSocketUpgradeHandler webSocketUpgradeHandler =new WebSocketUpgradeHandler.Builder()
.addWebSocketListener(listener)
.build();
com.ning.http.client.ws.WebSocket underlyingWebSocket = openConnection(httpClient, destination, webSocketUpgradeHandler);
WebSocket webSocket = createWebSocket(destination, underlyingWebSocket, metricsCollector);
Function<com.ning.http.client.ws.WebSocket, WebSocket> webSocketFactory = rawSocket -> webSocket;
EndpointStreamSource endpointStreamSource =
EndpointStreamSourceFactory.createStreamSourceFor(destination, webSocketFactory, listener, metricsCollector);
Consumer<CloseReason> closeAction = closeReason -> {
if (underlyingWebSocket instanceof GrizzlyWebSocketAdapter) {
GrizzlyWebSocketAdapter gwsa = (GrizzlyWebSocketAdapter) underlyingWebSocket;
gwsa.getGrizzlyWebSocket().close(closeReason.code, closeReason.text);
} else {
underlyingWebSocket.close();
}
listener.close();
};
return new ClientEndpoint(destination, endpointStreamSource, webSocket, closeAction, messageTranscriber, metricsCollector);
}