Skip to content

Commit 1a92e21

Browse files
committed
feat(appserver): serialize websocket writes
1 parent 36ac6f5 commit 1a92e21

1 file changed

Lines changed: 35 additions & 0 deletions

File tree

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright (c) 2018-present, easy-4-java (https://github.com/easy-4-java).
3+
*
4+
* Licensed under the Apache License, Version 2.0.
5+
*/
6+
package io.github.easy4j.codex.appserver;
7+
8+
import java.net.http.WebSocket;
9+
import java.util.Objects;
10+
import java.util.concurrent.CompletableFuture;
11+
import java.util.concurrent.CompletionStage;
12+
13+
/**
14+
* Serializes text writes for one JDK {@link WebSocket}. The JDK WebSocket
15+
* contract permits only one outstanding send at a time, so every write is
16+
* chained after the previous write future.
17+
*/
18+
final class CodexWebSocketSender {
19+
20+
private final WebSocket socket;
21+
private CompletionStage<WebSocket> tail;
22+
23+
CodexWebSocketSender(WebSocket socket) {
24+
this.socket = Objects.requireNonNull(socket, "socket");
25+
this.tail = CompletableFuture.completedFuture(socket);
26+
}
27+
28+
synchronized CompletionStage<WebSocket> send(String text) {
29+
Objects.requireNonNull(text, "text");
30+
CompletionStage<WebSocket> next =
31+
tail.thenCompose(ignored -> socket.sendText(text, true));
32+
tail = next;
33+
return next;
34+
}
35+
}

0 commit comments

Comments
 (0)