Skip to content

Commit 30f25fb

Browse files
authored
Merge pull request #44504 from mkouba/ws-next-array-return-type
WebSockets Next: support arrays as valid return types of callbacks
2 parents aeeb628 + d90b5f9 commit 30f25fb

File tree

4 files changed

+194
-1
lines changed

4 files changed

+194
-1
lines changed

extensions/websockets-next/deployment/src/main/java/io/quarkus/websockets/next/deployment/WebSocketProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1594,10 +1594,10 @@ static boolean hasBlockingSignature(MethodInfo method) {
15941594
if (KotlinUtils.isKotlinSuspendMethod(method)) {
15951595
return false;
15961596
}
1597-
15981597
switch (method.returnType().kind()) {
15991598
case VOID:
16001599
case CLASS:
1600+
case ARRAY:
16011601
return true;
16021602
case PARAMETERIZED_TYPE:
16031603
// Uni, Multi -> non-blocking
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package io.quarkus.websockets.next.test.codec;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import java.lang.reflect.GenericArrayType;
6+
import java.lang.reflect.Type;
7+
import java.net.URI;
8+
9+
import jakarta.inject.Inject;
10+
import jakarta.inject.Singleton;
11+
12+
import org.junit.jupiter.api.Test;
13+
import org.junit.jupiter.api.extension.RegisterExtension;
14+
15+
import io.quarkus.test.QuarkusUnitTest;
16+
import io.quarkus.test.common.http.TestHTTPResource;
17+
import io.quarkus.websockets.next.BinaryMessageCodec;
18+
import io.quarkus.websockets.next.OnBinaryMessage;
19+
import io.quarkus.websockets.next.WebSocket;
20+
import io.quarkus.websockets.next.test.utils.WSClient;
21+
import io.vertx.core.Vertx;
22+
import io.vertx.core.buffer.Buffer;
23+
24+
public class ArrayBinaryCodecTest {
25+
26+
@RegisterExtension
27+
public static final QuarkusUnitTest test = new QuarkusUnitTest()
28+
.withApplicationRoot(root -> {
29+
root.addClasses(Item.class, Endpoint.class, WSClient.class, ItemArrayBinaryCodec.class);
30+
});
31+
32+
@Inject
33+
Vertx vertx;
34+
35+
@TestHTTPResource("end")
36+
URI testUri;
37+
38+
@Test
39+
public void testCodec() {
40+
try (WSClient client = new WSClient(vertx)) {
41+
client.connect(testUri);
42+
client.sendAndAwait(Buffer.buffer("Foo"));
43+
client.waitForMessages(1);
44+
assertEquals("Foo", client.getMessages().get(0).toString());
45+
}
46+
}
47+
48+
@Singleton
49+
public static class ItemArrayBinaryCodec implements BinaryMessageCodec<Item[]> {
50+
51+
@Override
52+
public boolean supports(Type type) {
53+
return (type instanceof GenericArrayType) || (type instanceof Class<?> && ((Class<?>) type).isArray());
54+
}
55+
56+
@Override
57+
public Buffer encode(Item[] value) {
58+
return Buffer.buffer(value[0].getName());
59+
}
60+
61+
@Override
62+
public Item[] decode(Type type, Buffer value) {
63+
throw new UnsupportedOperationException();
64+
}
65+
66+
}
67+
68+
@WebSocket(path = "/end")
69+
public static class Endpoint {
70+
71+
@OnBinaryMessage
72+
Item[] process(String name) {
73+
Item item = new Item();
74+
item.setName(name);
75+
item.setCount(1);
76+
return new Item[] { item };
77+
}
78+
79+
}
80+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package io.quarkus.websockets.next.test.codec;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import java.net.URI;
6+
7+
import jakarta.inject.Inject;
8+
9+
import org.junit.jupiter.api.Test;
10+
import org.junit.jupiter.api.extension.RegisterExtension;
11+
12+
import io.quarkus.test.QuarkusUnitTest;
13+
import io.quarkus.test.common.http.TestHTTPResource;
14+
import io.quarkus.websockets.next.OnOpen;
15+
import io.quarkus.websockets.next.WebSocket;
16+
import io.quarkus.websockets.next.test.utils.WSClient;
17+
import io.vertx.core.Vertx;
18+
import io.vertx.core.json.JsonArray;
19+
import io.vertx.core.json.JsonObject;
20+
21+
public class ArrayTextCodecTest {
22+
23+
@RegisterExtension
24+
public static final QuarkusUnitTest test = new QuarkusUnitTest()
25+
.withApplicationRoot(root -> {
26+
root.addClasses(Item.class, Endpont.class, WSClient.class);
27+
});
28+
29+
@Inject
30+
Vertx vertx;
31+
32+
@TestHTTPResource("end")
33+
URI testUri;
34+
35+
@Test
36+
public void testCodec() throws Exception {
37+
try (WSClient client = new WSClient(vertx)) {
38+
client.connect(testUri);
39+
client.waitForMessages(1);
40+
assertEquals(new JsonArray().add(new JsonObject().put("name", "Foo").put("count", 1)).toString(),
41+
client.getMessages().get(0).toString());
42+
}
43+
}
44+
45+
@WebSocket(path = "/end")
46+
public static class Endpont {
47+
48+
// The default JsonTextMessageCodec is used
49+
@OnOpen
50+
Item[] open() {
51+
Item item = new Item();
52+
item.setName("Foo");
53+
item.setCount(1);
54+
return new Item[] { item };
55+
}
56+
57+
}
58+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package io.quarkus.websockets.next.test.codec;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import java.net.URI;
6+
7+
import jakarta.inject.Inject;
8+
9+
import org.junit.jupiter.api.Test;
10+
import org.junit.jupiter.api.extension.RegisterExtension;
11+
12+
import io.quarkus.test.QuarkusUnitTest;
13+
import io.quarkus.test.common.http.TestHTTPResource;
14+
import io.quarkus.websockets.next.OnBinaryMessage;
15+
import io.quarkus.websockets.next.WebSocket;
16+
import io.quarkus.websockets.next.test.utils.WSClient;
17+
import io.vertx.core.Vertx;
18+
import io.vertx.core.buffer.Buffer;
19+
20+
public class ByteArrayBinaryMessageTest {
21+
22+
@RegisterExtension
23+
public static final QuarkusUnitTest test = new QuarkusUnitTest()
24+
.withApplicationRoot(root -> {
25+
root.addClasses(Endpont.class, WSClient.class);
26+
});
27+
28+
@Inject
29+
Vertx vertx;
30+
31+
@TestHTTPResource("end")
32+
URI testUri;
33+
34+
@Test
35+
public void testCodec() throws Exception {
36+
try (WSClient client = new WSClient(vertx)) {
37+
client.connect(testUri);
38+
client.send(Buffer.buffer("43"));
39+
client.waitForMessages(1);
40+
assertEquals("43", client.getMessages().get(0).toString());
41+
}
42+
}
43+
44+
@WebSocket(path = "/end")
45+
public static class Endpont {
46+
47+
// This is an equivalent to Sender#sendBinary(byte[])
48+
// byte[] is encoded with Buffer#buffer(byte[]), codec is not needed
49+
@OnBinaryMessage
50+
byte[] echo(Buffer message) {
51+
return message.getBytes();
52+
}
53+
54+
}
55+
}

0 commit comments

Comments
 (0)