3434import io .jooby .WebSocketConfigurer ;
3535import io .jooby .WebSocketMessage ;
3636import io .jooby .output .Output ;
37- import io .undertow .websockets .core .AbstractReceiveListener ;
38- import io .undertow .websockets .core .BufferedBinaryMessage ;
39- import io .undertow .websockets .core .BufferedTextMessage ;
40- import io .undertow .websockets .core .CloseMessage ;
41- import io .undertow .websockets .core .WebSocketCallback ;
42- import io .undertow .websockets .core .WebSocketChannel ;
43- import io .undertow .websockets .core .WebSockets ;
37+ import io .undertow .websockets .core .*;
4438
4539public class UndertowWebSocket extends AbstractReceiveListener
4640 implements WebSocketConfigurer , WebSocket {
4741
42+ enum FrameType {
43+ TEXT ,
44+ BINARY ,
45+ PING ,
46+ PONG ;
47+ }
48+
4849 private static class WriteCallbackAdaptor implements WebSocketCallback <Void > {
4950
5051 protected final UndertowWebSocket ws ;
@@ -89,7 +90,7 @@ public void onError(WebSocketChannel channel, Void context, Throwable cause) {
8990
9091 private static class WebSocketOutputCallback implements WebSocketCallback <Void > {
9192 private final Iterator <ByteBuffer > it ;
92- private final boolean binary ;
93+ private final FrameType type ;
9394 private final WebSocketChannel channel ;
9495 private final UndertowWebSocket ws ;
9596 private final WriteCallback cb ;
@@ -98,11 +99,11 @@ public WebSocketOutputCallback(
9899 UndertowWebSocket ws ,
99100 WebSocketChannel channel ,
100101 WriteCallback callback ,
101- boolean binary ,
102+ FrameType type ,
102103 Output buffer ) {
103104 this .ws = ws ;
104105 this .channel = channel ;
105- this .binary = binary ;
106+ this .type = type ;
106107 this .cb = callback ;
107108 this .it = buffer .iterator ();
108109 }
@@ -112,11 +113,7 @@ public void send() {
112113 try {
113114 var buffer = it .next ();
114115 WebSocketCallback <Void > callback = it .hasNext () ? this : new WriteCallbackAdaptor (ws , cb );
115- if (binary ) {
116- WebSockets .sendBinary (buffer , channel , callback );
117- } else {
118- WebSockets .sendText (buffer , channel , callback );
119- }
116+ UndertowWebSocket .sendMessage (ws , buffer , type , callback );
120117 } catch (Throwable x ) {
121118 ws .onError (channel , x );
122119 }
@@ -207,40 +204,53 @@ public void forEach(SneakyThrows.Consumer<WebSocket> callback) {
207204 }
208205 }
209206
207+ @ NonNull @ Override
208+ public WebSocket sendPing (@ NonNull String message , @ NonNull WriteCallback callback ) {
209+ return sendMessage (
210+ ByteBuffer .wrap (message .getBytes (StandardCharsets .UTF_8 )), FrameType .PING , callback );
211+ }
212+
213+ @ NonNull @ Override
214+ public WebSocket sendPing (@ NonNull ByteBuffer message , @ NonNull WriteCallback callback ) {
215+ return sendMessage (message , FrameType .PING , callback );
216+ }
217+
210218 @ NonNull @ Override
211219 public WebSocket send (@ NonNull String message , @ NonNull WriteCallback callback ) {
212- return sendMessage (ByteBuffer .wrap (message .getBytes (StandardCharsets .UTF_8 )), false , callback );
220+ return sendMessage (
221+ ByteBuffer .wrap (message .getBytes (StandardCharsets .UTF_8 )), FrameType .TEXT , callback );
213222 }
214223
215224 @ NonNull @ Override
216225 public WebSocket send (@ NonNull ByteBuffer message , @ NonNull WriteCallback callback ) {
217- return sendMessage (message , false , callback );
226+ return sendMessage (message , FrameType . TEXT , callback );
218227 }
219228
220229 @ NonNull @ Override
221230 public WebSocket sendBinary (@ NonNull String message , @ NonNull WriteCallback callback ) {
222- return sendMessage (ByteBuffer .wrap (message .getBytes (StandardCharsets .UTF_8 )), true , callback );
231+ return sendMessage (
232+ ByteBuffer .wrap (message .getBytes (StandardCharsets .UTF_8 )), FrameType .BINARY , callback );
223233 }
224234
225235 @ NonNull @ Override
226236 public WebSocket sendBinary (@ NonNull Output message , @ NonNull WriteCallback callback ) {
227- return sendMessage (message , true , callback );
237+ return sendMessage (message , FrameType . BINARY , callback );
228238 }
229239
230240 @ NonNull @ Override
231241 public WebSocket send (@ NonNull Output message , @ NonNull WriteCallback callback ) {
232- return sendMessage (message , false , callback );
242+ return sendMessage (message , FrameType . TEXT , callback );
233243 }
234244
235245 @ NonNull @ Override
236246 public WebSocket sendBinary (@ NonNull ByteBuffer message , @ NonNull WriteCallback callback ) {
237- return sendMessage (message , true , callback );
247+ return sendMessage (message , FrameType . BINARY , callback );
238248 }
239249
240- private WebSocket sendMessage (Output buffer , boolean binary , WriteCallback callback ) {
250+ private WebSocket sendMessage (Output buffer , FrameType type , WriteCallback callback ) {
241251 if (isOpen ()) {
242252 try {
243- new WebSocketOutputCallback (this , channel , callback , binary , buffer ).send ();
253+ new WebSocketOutputCallback (this , channel , callback , type , buffer ).send ();
244254 } catch (Throwable x ) {
245255 onError (channel , x );
246256 }
@@ -250,21 +260,36 @@ private WebSocket sendMessage(Output buffer, boolean binary, WriteCallback callb
250260 return this ;
251261 }
252262
253- private WebSocket sendMessage (ByteBuffer buffer , boolean binary , WriteCallback callback ) {
254- if (isOpen ()) {
263+ private WebSocket sendMessage (ByteBuffer buffer , FrameType type , WriteCallback callback ) {
264+
265+ return UndertowWebSocket .sendMessage (
266+ this , buffer , type , new WriteCallbackAdaptor (this , callback ));
267+ }
268+
269+ static WebSocket sendMessage (
270+ UndertowWebSocket ws , ByteBuffer buffer , FrameType type , WebSocketCallback <Void > callback ) {
271+ if (ws .isOpen ()) {
255272 try {
256- if (binary ) {
257- WebSockets .sendBinary (buffer , channel , new WriteCallbackAdaptor (this , callback ));
273+ if (type == FrameType .BINARY ) {
274+ WebSockets .sendBinary (buffer , ws .channel , callback );
275+ } else if (type == FrameType .TEXT ) {
276+ WebSockets .sendText (buffer , ws .channel , callback );
277+ } else if (type == FrameType .PING ) {
278+ WebSockets .sendPing (buffer , ws .channel , callback );
279+ } else if (type == FrameType .PONG ) {
280+ WebSockets .sendPong (buffer , ws .channel , callback );
258281 } else {
259- WebSockets . sendText ( buffer , channel , new WriteCallbackAdaptor ( this , callback ) );
282+ throw new IllegalStateException ( "Unknown frame type: " + type );
260283 }
284+
261285 } catch (Throwable x ) {
262- onError (channel , x );
286+ ws . onError (ws . channel , x );
263287 }
264288 } else {
265- onError (channel , new IllegalStateException ("Attempt to send a message on closed web socket" ));
289+ ws .onError (
290+ ws .channel , new IllegalStateException ("Attempt to send a message on closed web socket" ));
266291 }
267- return this ;
292+ return ws ;
268293 }
269294
270295 @ NonNull @ Override
0 commit comments