Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions keyext.api/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,8 @@ dependencies {
api(project(":key.ui"))

api("org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.23.1")
implementation("org.eclipse.lsp4j:org.eclipse.lsp4j.websocket.jakarta:0.23.1")
implementation("org.eclipse.lsp4j:org.eclipse.lsp4j.websocket.jakarta:0.23.1")
implementation("org.eclipse.jetty.websocket:websocket-javax-server:10.0.16")
api("org.eclipse.lsp4j:org.eclipse.lsp4j.websocket.jakarta:0.23.1")
api("org.eclipse.jetty.websocket:websocket-javax-server:10.0.16")
implementation("info.picocli:picocli:4.7.5")

implementation("com.google.guava:guava:32.1.3-jre")
Expand Down
20 changes: 20 additions & 0 deletions keyext.web/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
plugins {
id 'application'

// Used to create a single executable jar file with all dependencies
// see task "shadowJar" below
// https://github.com/GradleUp/shadow
id 'com.gradleup.shadow' version "9.4.1"
}
description = "A web interface for KeY "

application {
mainClass.set("org.key_project.key.webui.WebUi")
}

dependencies {
implementation project(":key.ui")
implementation project(":keyext.api")
implementation("org.eclipse.jetty:jetty-server:12.1.10")
implementation("org.eclipse.jetty.ee11.websocket:jetty-ee11-websocket-jakarta-server:12.1.10")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package org.key_project.key.webui;

import jakarta.websocket.OnClose;
import jakarta.websocket.OnError;
import jakarta.websocket.OnOpen;
import jakarta.websocket.Session;
import jakarta.websocket.server.ServerEndpoint;
import org.eclipse.lsp4j.websocket.jakarta.WebSocketLauncherBuilder;
import org.keyproject.key.api.KeyApiImpl;
import org.keyproject.key.api.StartServer;
import org.keyproject.key.api.remoteclient.ClientApi;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
*
* @author Alexander Weigl
* @version 1 (11.06.26)
*/
@ServerEndpoint("/ws/jsonrpc")
public class JsonRpcWebSocketEndpoint {
private static final ExecutorService threadPool = Executors.newCachedThreadPool();
private static final KeyApiImpl keyApi = new KeyApiImpl();

@OnOpen
public void onOpen(Session session) throws IOException, ExecutionException, InterruptedException {

var launcherBuilder = new WebSocketLauncherBuilder<ClientApi>()
.setSession(session)
.traceMessages(new PrintWriter(System.err))
.validateMessages(true);

launcherBuilder.configureGson(StartServer::configureJson);
launcherBuilder.setLocalService(keyApi);
launcherBuilder.setRemoteInterface(ClientApi.class);

var launcher = launcherBuilder.create();
final var clientApiLauncher = launcherBuilder.create();
keyApi.setClientApi(clientApiLauncher.getRemoteProxy());
clientApiLauncher.startListening().get();
}

@OnClose
public void onClose(Session session) {
// Connection closed - cleanup handled by launcher
}

@OnError
public void onError(Session session, Throwable throwable) {
throwable.printStackTrace();
}
}
44 changes: 44 additions & 0 deletions keyext.web/src/main/java/org/key_project/key/webui/WebUi.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package org.key_project.key.webui;

import org.eclipse.jetty.ee11.servlet.DefaultServlet;
import org.eclipse.jetty.ee11.servlet.ServletContextHandler;
import org.eclipse.jetty.ee11.websocket.jakarta.server.config.JakartaWebSocketServletContainerInitializer;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.util.resource.ResourceFactory;
import org.keyproject.key.api.StartServer;

public class WebUi {
public static void main(String[] args) throws Exception {
startNetty();
}

private static void startNetty() throws Exception {
Server server = new Server(8080);
ServletContextHandler context = new ServletContextHandler();
context.setContextPath("/");

// Static files from classpath
ResourceFactory resourceFactory = ResourceFactory.of(context);
Resource staticResources = resourceFactory.newClassLoaderResource("static");
if (staticResources == null || !staticResources.exists()) {
throw new IllegalStateException("Classpath resource 'static' not found");
}
context.setBaseResource(staticResources);

// Enable Jakarta WebSocket
JakartaWebSocketServletContainerInitializer.configure(context, (servletContext, wsContainer) -> {
wsContainer.setDefaultMaxTextMessageBufferSize(128 * 1024);
wsContainer.addEndpoint(JsonRpcWebSocketEndpoint.class);
});

// Serve static files
context.addServlet(DefaultServlet.class, "/");

server.setHandler(context);
server.start();
System.out.println("Server running at http://localhost:8080");
server.join();
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
import{i}from"./rkAS4Fq4.js";async function l(e,a){await i("plugin:clipboard-manager|write_text",{label:a==null?void 0:a.label,text:e})}export{l as writeText};

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Large diffs are not rendered by default.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Large diffs are not rendered by default.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading