/** * Factory method to create new {@link TyrusWebSocket} instances. Developers may * wish to override this to return customized {@link TyrusWebSocket} implementations. * * @param handler the {@link ProtocolHandler} to use with the newly created * {@link TyrusWebSocket}. * @return TODO */ TyrusWebSocket createSocket(final ProtocolHandler handler) { return new TyrusWebSocket(handler, this); }
/** * Send a frame to the remote endpoint. * * @param data complete data frame. * @return {@link Future} which could be used to control/check the sending completion state. */ public Future<Frame> sendRawFrame(ByteBuffer data) { checkConnectedState(); return protocolHandler.sendRawFrame(data); }
@Override public void respond(TyrusWebSocket socket) { if (continuation) { socket.onFragment(this, isFin()); } else { if (isFin()) { socket.onMessage(this); } else { socket.onFragment(this, false); } } }
@Override public Future<?> call(TyrusWebSocket webSocket, TyrusSession session) { final ProtocolHandler protocolHandler = webSocket.getProtocolHandler(); // we need to let protocol handler execute extensions if there are any if (protocolHandler.hasExtensions()) { final Frame dataFrame = new TextFrame(message, false, true); return sendBroadcast(webSocket, dataFrame, TyrusFrame.FrameType.TEXT); } else { final Future<Frame> frameFuture = webSocket.sendRawFrame(ByteBuffer.wrap(frame)); webSocket.getMessageEventListener().onFrameSent(TyrusFrame.FrameType.TEXT, payloadLength); return frameFuture; } } };
clientHandShake.validateServerResponse(upgradeResponse); final TyrusWebSocket socket = new TyrusWebSocket(protocolHandler, endpointWrapper); final List<Extension> handshakeResponseExtensions = TyrusExtension.fromHeaders( upgradeResponse.getHeaders().get(HandshakeRequest.SEC_WEBSOCKET_EXTENSIONS)); socket.onConnect(this.clientHandShake.getRequest(), null, null, null, debugContext);
/** * This callback will be invoked when a binary message has been received. * * @param frame the binary data received from the remote endpoint. */ public void onMessage(BinaryFrame frame) { awaitOnConnect(); if (endpointWrapper != null) { endpointWrapper.onMessage(this, ByteBuffer.wrap(frame.getPayloadData())); messageEventListener.onFrameReceived(frame.getFrameType(), frame.getPayloadLength()); } }
@Override public void close(CloseReason reason) { if (!socket.isConnected()) { return; } socket.close(reason.getCloseCode().getCode(), reason.getReasonPhrase()); for (Extension extension : extensions) { if (extension instanceof ExtendedExtension) { try { ((ExtendedExtension) extension).destroy(extensionContext); } catch (Throwable t) { // ignore. } } } } }
TyrusConnection(TyrusEndpointWrapper endpointWrapper, ProtocolHandler protocolHandler, int incomingBufferSize, Writer writer, CloseListener closeListener, UpgradeRequest upgradeRequest, UpgradeResponse upgradeResponse, ExtendedExtension.ExtensionContext extensionContext, DebugContext debugContext) { protocolHandler.setWriter(writer); extensions = protocolHandler.getExtensions(); this.socket = endpointWrapper.createSocket(protocolHandler); // TODO: we might need to introduce some property to check whether we should put this header into the // response. final List<String> connectionIdHeader = upgradeRequest.getHeaders().get(UpgradeRequest.CLUSTER_CONNECTION_ID_HEADER); String connectionId; if (connectionIdHeader != null && connectionIdHeader.size() == 1) { connectionId = connectionIdHeader.get(0); } else { connectionId = upgradeResponse.getFirstHeaderValue(UpgradeRequest.CLUSTER_CONNECTION_ID_HEADER); } this.socket.onConnect(upgradeRequest, protocolHandler.getSubProtocol(), extensions, connectionId, debugContext); this.readHandler = new TyrusReadHandler(protocolHandler, socket, endpointWrapper, incomingBufferSize, extensionContext, debugContext); this.writer = writer; this.closeListener = closeListener; this.extensionContext = extensionContext; }
public void close(CloseReason cr) { LOGGER.fine("Close public void close(CloseReason cr): " + cr); webSocket.close(cr); } }
final ByteBuffer byteBuffer = webSocket.getProtocolHandler().frame(dataFrame); final byte[] frame = new byte[byteBuffer.remaining()]; byteBuffer.get(frame);
private void checkConnectedState() { if (!isConnected()) { throw new RuntimeException(LocalizationMessages.SOCKET_NOT_CONNECTED()); } }
@Override public Future<?> call(TyrusWebSocket webSocket, TyrusSession session) { final ProtocolHandler protocolHandler = webSocket.getProtocolHandler(); // we need to let protocol handler execute extensions if there are any if (protocolHandler.hasExtensions()) { final Frame dataFrame = new BinaryFrame(byteArrayMessage, false, true); return sendBroadcast(webSocket, dataFrame, TyrusFrame.FrameType.BINARY); } else { final Future<Frame> frameFuture = webSocket.sendRawFrame(ByteBuffer.wrap(frame)); webSocket.getMessageEventListener().onFrameSent(TyrusFrame.FrameType.BINARY, payloadLength); return frameFuture; } } };
clientHandShake.validateServerResponse(upgradeResponse); final TyrusWebSocket socket = new TyrusWebSocket(protocolHandler, endpointWrapper); final List<Extension> handshakeResponseExtensions = TyrusExtension.fromHeaders( upgradeResponse.getHeaders().get(HandshakeRequest.SEC_WEBSOCKET_EXTENSIONS)); socket.onConnect(this.clientHandShake.getRequest(), null, null, null, debugContext);
@Override public void respond(TyrusWebSocket socket) { if (continuation) { socket.onFragment(this, isFin()); } else { if (isFin()) { socket.onMessage(this); } else { socket.onFragment(this, false); } } }
/** * This callback will be invoked when the remote endpoint has sent a ping frame. * * @param frame the ping frame from the remote endpoint. */ public void onPing(PingFrame frame) { awaitOnConnect(); if (endpointWrapper != null) { endpointWrapper.onPing(this, ByteBuffer.wrap(frame.getPayloadData())); messageEventListener.onFrameReceived(frame.getFrameType(), frame.getPayloadLength()); } }
@Override public void close(CloseReason reason) { if (!socket.isConnected()) { return; } socket.close(reason.getCloseCode().getCode(), reason.getReasonPhrase()); for (Extension extension : extensions) { if (extension instanceof ExtendedExtension) { try { ((ExtendedExtension) extension).destroy(extensionContext); } catch (Throwable t) { // ignore. } } } } }
TyrusConnection(TyrusEndpointWrapper endpointWrapper, ProtocolHandler protocolHandler, int incomingBufferSize, Writer writer, CloseListener closeListener, UpgradeRequest upgradeRequest, UpgradeResponse upgradeResponse, ExtendedExtension.ExtensionContext extensionContext, DebugContext debugContext) { protocolHandler.setWriter(writer); extensions = protocolHandler.getExtensions(); this.socket = endpointWrapper.createSocket(protocolHandler); // TODO: we might need to introduce some property to check whether we should put this header into the // response. final List<String> connectionIdHeader = upgradeRequest.getHeaders().get(UpgradeRequest.CLUSTER_CONNECTION_ID_HEADER); String connectionId; if (connectionIdHeader != null && connectionIdHeader.size() == 1) { connectionId = connectionIdHeader.get(0); } else { connectionId = upgradeResponse.getFirstHeaderValue(UpgradeRequest.CLUSTER_CONNECTION_ID_HEADER); } this.socket.onConnect(upgradeRequest, protocolHandler.getSubProtocol(), extensions, connectionId, debugContext); this.readHandler = new TyrusReadHandler(protocolHandler, socket, endpointWrapper, incomingBufferSize, extensionContext, debugContext); this.writer = writer; this.closeListener = closeListener; this.extensionContext = extensionContext; }