Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6b0992e208 | ||
|
|
2b64b10646 |
@@ -26,22 +26,14 @@ It ensures compile-time guarantees for message structure, reduces runtime errors
|
|||||||
|
|
||||||
```groovy
|
```groovy
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
maven { url 'https://jitpack.io' }
|
||||||
|
|
||||||
maven {
|
|
||||||
url = uri("https://maven.pkg.github.com/selimaj-dev/session-java")
|
|
||||||
credentials {
|
|
||||||
username = project.findProperty("gpr.user") ?: System.getenv("GITHUB_USERNAME")
|
|
||||||
password = project.findProperty("gpr.key") ?: System.getenv("GITHUB_TOKEN")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Add the dependency
|
#### Add the dependency
|
||||||
```groovy
|
```groovy
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation "dev.selimaj.session:session-java:0.1.0"
|
implementation 'com.github.selimaj-dev:session-java:v0.1.3'
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ plugins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
group = "dev.selimaj.session"
|
group = "dev.selimaj.session"
|
||||||
version = "0.1.0"
|
version = "0.1.2"
|
||||||
|
|
||||||
java {
|
java {
|
||||||
toolchain {
|
toolchain {
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import java.net.URI;
|
|||||||
import java.net.http.HttpClient;
|
import java.net.http.HttpClient;
|
||||||
import java.net.http.WebSocket;
|
import java.net.http.WebSocket;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
public final class Session {
|
public final class Session {
|
||||||
|
|
||||||
@@ -34,6 +35,18 @@ public final class Session {
|
|||||||
return new Session(ws, listener);
|
return new Session(ws, listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Session connect(String uri, long timeout, TimeUnit unit) throws Exception {
|
||||||
|
SessionListener listener = new SessionListener();
|
||||||
|
|
||||||
|
WebSocket ws = HttpClient.newHttpClient()
|
||||||
|
.newWebSocketBuilder()
|
||||||
|
.buildAsync(URI.create(uri), listener)
|
||||||
|
.orTimeout(timeout, unit)
|
||||||
|
.join();
|
||||||
|
|
||||||
|
return new Session(ws, listener);
|
||||||
|
}
|
||||||
|
|
||||||
public void send(Message msg) throws Exception {
|
public void send(Message msg) throws Exception {
|
||||||
listener.send(ws, msg);
|
listener.send(ws, msg);
|
||||||
}
|
}
|
||||||
@@ -50,12 +63,12 @@ public final class Session {
|
|||||||
listener.notify(ws, method, data);
|
listener.notify(ws, method, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
<Req extends JsonNode, Res extends JsonNode, Err extends JsonNode> CompletableFuture<Res> request(
|
<Req, Res, Err> CompletableFuture<Res> request(
|
||||||
Method<Req, Res, Err> method, Req req) throws Exception {
|
Method<Req, Res, Err> method, Req req) throws Exception {
|
||||||
return listener.request(ws, method.getName(), req, method.getResClass());
|
return listener.request(ws, method.getName(), req, method.getResClass());
|
||||||
}
|
}
|
||||||
|
|
||||||
<Req extends JsonNode, Res extends JsonNode, Err extends JsonNode> void onRequest(Method<Req, Res, Err> method,
|
<Req, Res, Err> void onRequest(Method<Req, Res, Err> method,
|
||||||
MethodHandler<Req> handler) {
|
MethodHandler<Req> handler) {
|
||||||
MethodHandler<JsonNode> wrapper = (id, value) -> {
|
MethodHandler<JsonNode> wrapper = (id, value) -> {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package dev.selimaj.session;
|
package dev.selimaj.session;
|
||||||
|
|
||||||
import java.net.http.WebSocket;
|
import java.net.http.WebSocket;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.CompletionStage;
|
import java.util.concurrent.CompletionStage;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
@@ -13,7 +14,7 @@ import dev.selimaj.session.types.Message;
|
|||||||
import dev.selimaj.session.types.MethodHandler;
|
import dev.selimaj.session.types.MethodHandler;
|
||||||
|
|
||||||
public class SessionListener implements WebSocket.Listener {
|
public class SessionListener implements WebSocket.Listener {
|
||||||
public final ConcurrentHashMap<String, MethodHandler<JsonNode>> methods = new ConcurrentHashMap<>();
|
final ConcurrentHashMap<String, MethodHandler<JsonNode>> methods = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
final ObjectMapper mapper = new ObjectMapper();
|
final ObjectMapper mapper = new ObjectMapper();
|
||||||
private final ConcurrentHashMap<Integer, CompletableFuture<JsonNode>> pending = new ConcurrentHashMap<>();
|
private final ConcurrentHashMap<Integer, CompletableFuture<JsonNode>> pending = new ConcurrentHashMap<>();
|
||||||
@@ -60,6 +61,11 @@ public class SessionListener implements WebSocket.Listener {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CompletionStage<?> onPing(WebSocket ws, ByteBuffer message) {
|
||||||
|
return ws.sendPong(message);
|
||||||
|
}
|
||||||
|
|
||||||
void send(WebSocket ws, Message msg) throws Exception {
|
void send(WebSocket ws, Message msg) throws Exception {
|
||||||
ws.sendText(mapper.writeValueAsString(msg), true);
|
ws.sendText(mapper.writeValueAsString(msg), true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package dev.selimaj.session.types;
|
package dev.selimaj.session.types;
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.JsonNode;
|
public class Method<Req, Res, Err> {
|
||||||
|
|
||||||
public class Method<Req extends JsonNode, Res extends JsonNode, Err extends JsonNode> {
|
|
||||||
private final String name;
|
private final String name;
|
||||||
private final Class<Req> reqClass;
|
private final Class<Req> reqClass;
|
||||||
private final Class<Res> resClass;
|
private final Class<Res> resClass;
|
||||||
|
|||||||
@@ -2,9 +2,7 @@ package dev.selimaj.session.types;
|
|||||||
|
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.JsonNode;
|
|
||||||
|
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
public interface MethodHandler<Req extends JsonNode> {
|
public interface MethodHandler<Req> {
|
||||||
CompletableFuture<SessionResult> handle(int id, Req data);
|
CompletableFuture<SessionResult> handle(int id, Req data);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user