3 Commits
Author SHA1 Message Date
selimaj-dev 34d86a23ab Fixed build artifacts 2026-02-20 02:06:05 +01:00
selimaj-dev 6b0992e208 v0.1.2
Gradle Build / build (push) Canceled after 47s
2026-02-20 01:42:30 +01:00
selimaj-dev 2b64b10646 Fixed types 2026-02-20 01:26:10 +01:00
6 changed files with 35 additions and 20 deletions
+2 -10
View File
@@ -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:0.1.3'
} }
``` ```
+9 -1
View File
@@ -4,7 +4,7 @@ plugins {
} }
group = "dev.selimaj.session" group = "dev.selimaj.session"
version = "0.1.0" version = "0.1.3"
java { java {
toolchain { toolchain {
@@ -34,3 +34,11 @@ dependencies {
test { test {
useJUnitPlatform() useJUnitPlatform()
} }
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
}
}
}
+15 -2
View File
@@ -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);
} }