From 8fe6d4b9abe14fdc84f5b7a41e8f6e956f03b0dc Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sun, 18 Jun 2023 17:39:27 +0200 Subject: chore(deps): bump dependencies --- subprojects/frontend/index.html | 6 +-- subprojects/frontend/package.json | 60 +++++++++++----------- subprojects/frontend/src/theme/ThemeProvider.tsx | 4 +- subprojects/language-web/build.gradle.kts | 1 + .../language/web/xtext/servlet/XtextWebSocket.java | 39 +++++++------- .../ProblemWebSocketServletIntegrationTest.java | 46 +++++++++++------ .../web/tests/WebSocketIntegrationTestClient.java | 17 +++--- 7 files changed, 92 insertions(+), 81 deletions(-) (limited to 'subprojects') diff --git a/subprojects/frontend/index.html b/subprojects/frontend/index.html index e1d2bf14..1bf3472e 100644 --- a/subprojects/frontend/index.html +++ b/subprojects/frontend/index.html @@ -18,9 +18,9 @@ diff --git a/subprojects/frontend/package.json b/subprojects/frontend/package.json index b46e5c9d..ba8a0a58 100644 --- a/subprojects/frontend/package.json +++ b/subprojects/frontend/package.json @@ -28,24 +28,24 @@ }, "homepage": "https://refinery.tools", "dependencies": { - "@codemirror/autocomplete": "^6.5.1", - "@codemirror/commands": "^6.2.3", - "@codemirror/language": "^6.6.0", - "@codemirror/lint": "^6.2.1", - "@codemirror/search": "^6.4.0", - "@codemirror/state": "^6.2.0", - "@codemirror/view": "^6.10.0", - "@emotion/react": "^11.10.6", - "@emotion/styled": "^11.10.6", - "@fontsource/inter": "^4.5.15", - "@fontsource/jetbrains-mono": "^4.5.12", - "@lezer/common": "^1.0.2", - "@lezer/highlight": "^1.1.4", - "@lezer/lr": "^1.3.4", + "@codemirror/autocomplete": "^6.8.0", + "@codemirror/commands": "^6.2.4", + "@codemirror/language": "^6.8.0", + "@codemirror/lint": "^6.2.2", + "@codemirror/search": "^6.5.0", + "@codemirror/state": "^6.2.1", + "@codemirror/view": "^6.13.2", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@fontsource-variable/inter": "^5.0.3", + "@fontsource-variable/jetbrains-mono": "^5.0.3", + "@lezer/common": "^1.0.3", + "@lezer/highlight": "^1.1.6", + "@lezer/lr": "^1.3.6", "@material-icons/svg": "^1.0.33", "@mui/icons-material": "5.11.16", - "@mui/material": "5.12.2", - "@vitejs/plugin-react-swc": "^3.3.0", + "@mui/material": "5.13.5", + "@vitejs/plugin-react-swc": "^3.3.2", "ansi-styles": "^6.2.1", "csstype": "^3.1.2", "escape-string-regexp": "^5.0.0", @@ -63,21 +63,21 @@ "zod": "^3.21.4" }, "devDependencies": { - "@lezer/generator": "^1.2.2", - "@types/eslint": "^8.37.0", + "@lezer/generator": "^1.3.0", + "@types/eslint": "^8.40.2", "@types/html-minifier-terser": "^7.0.0", "@types/lodash-es": "^4.17.7", "@types/micromatch": "^4.0.2", "@types/ms": "^0.7.31", - "@types/node": "^18.16.1", - "@types/prettier": "^2.7.2", - "@types/react": "^18.2.0", - "@types/react-dom": "^18.2.1", - "@typescript-eslint/eslint-plugin": "^5.59.1", - "@typescript-eslint/parser": "^5.59.1", - "@xstate/cli": "^0.4.2", + "@types/node": "^18.16.18", + "@types/prettier": "^2.7.3", + "@types/react": "^18.2.12", + "@types/react-dom": "^18.2.5", + "@typescript-eslint/eslint-plugin": "^5.59.11", + "@typescript-eslint/parser": "^5.59.11", + "@xstate/cli": "^0.5.1", "cross-env": "^7.0.3", - "eslint": "^8.39.0", + "eslint": "^8.43.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-airbnb-typescript": "^17.0.0", "eslint-config-prettier": "^8.8.0", @@ -91,9 +91,9 @@ "html-minifier-terser": "^7.2.0", "micromatch": "^4.0.5", "prettier": "^2.8.8", - "typescript": "5.0.4", - "vite": "^4.3.3", - "vite-plugin-pwa": "^0.14.7", - "workbox-window": "^6.5.4" + "typescript": "5.1.3", + "vite": "^4.3.9", + "vite-plugin-pwa": "^0.16.4", + "workbox-window": "^7.0.0" } } diff --git a/subprojects/frontend/src/theme/ThemeProvider.tsx b/subprojects/frontend/src/theme/ThemeProvider.tsx index 740e9562..78146f25 100644 --- a/subprojects/frontend/src/theme/ThemeProvider.tsx +++ b/subprojects/frontend/src/theme/ThemeProvider.tsx @@ -75,7 +75,7 @@ function createResponsiveTheme( ...options, typography: { fontFamily: - '"InterVariable", "Inter", "Roboto", "Helvetica", "Arial", sans-serif', + '"Inter Variable", "Inter", "Roboto", "Helvetica", "Arial", sans-serif', fontWeightMedium: 600, fontWeightEditorNormal: 400, fontWeightEditorBold: 700, @@ -85,7 +85,7 @@ function createResponsiveTheme( }, editor: { fontFamily: - '"JetBrains MonoVariable", "JetBrains Mono", "Cascadia Code", "Fira Code", monospace', + '"JetBrains Mono Variable", "JetBrains Mono", "Cascadia Code", "Fira Code", monospace', fontFeatureSettings: '"liga", "calt"', // `rem` for JetBrains MonoVariable make the text too large in Safari. fontSize: '16px', diff --git a/subprojects/language-web/build.gradle.kts b/subprojects/language-web/build.gradle.kts index 7a7adac0..562a1bd9 100644 --- a/subprojects/language-web/build.gradle.kts +++ b/subprojects/language-web/build.gradle.kts @@ -19,6 +19,7 @@ dependencies { implementation(project(":refinery-language-ide")) implementation(libs.jetty.server) implementation(libs.jetty.servlet) + implementation(libs.jetty.websocket.api) implementation(libs.jetty.websocket.server) implementation(libs.slf4j.api) implementation(libs.xtext.web) diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/XtextWebSocket.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/XtextWebSocket.java index f7d33e9e..043d318c 100644 --- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/XtextWebSocket.java +++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/XtextWebSocket.java @@ -8,10 +8,10 @@ package tools.refinery.language.web.xtext.servlet; import com.google.gson.Gson; import com.google.gson.JsonIOException; import com.google.gson.JsonParseException; -import org.eclipse.jetty.ee10.websocket.api.Session; -import org.eclipse.jetty.ee10.websocket.api.StatusCode; -import org.eclipse.jetty.ee10.websocket.api.WriteCallback; -import org.eclipse.jetty.ee10.websocket.api.annotations.*; +import org.eclipse.jetty.websocket.api.Callback; +import org.eclipse.jetty.websocket.api.Session; +import org.eclipse.jetty.websocket.api.StatusCode; +import org.eclipse.jetty.websocket.api.annotations.*; import org.eclipse.xtext.resource.IResourceServiceProvider; import org.eclipse.xtext.web.server.ISession; import org.slf4j.Logger; @@ -25,7 +25,7 @@ import tools.refinery.language.web.xtext.server.message.XtextWebResponse; import java.io.Reader; @WebSocket -public class XtextWebSocket implements WriteCallback, ResponseHandler { +public class XtextWebSocket implements ResponseHandler { private static final Logger LOG = LoggerFactory.getLogger(XtextWebSocket.class); private final Gson gson = new Gson(); @@ -43,13 +43,13 @@ public class XtextWebSocket implements WriteCallback, ResponseHandler { this(new TransactionExecutor(session, resourceServiceProviderRegistry)); } - @OnWebSocketConnect - public void onConnect(Session webSocketSession) { + @OnWebSocketOpen + public void onOpen(Session webSocketSession) { if (this.webSocketSession != null) { LOG.error("Websocket session onConnect when already connected"); return; } - LOG.debug("New websocket connection from {}", webSocketSession.getRemoteAddress()); + LOG.debug("New websocket connection from {}", webSocketSession.getRemoteSocketAddress()); this.webSocketSession = webSocketSession; } @@ -60,10 +60,10 @@ public class XtextWebSocket implements WriteCallback, ResponseHandler { return; } if (statusCode == StatusCode.NORMAL || statusCode == StatusCode.SHUTDOWN) { - LOG.debug("{} closed connection normally: {}", webSocketSession.getRemoteAddress(), reason); + LOG.debug("{} closed connection normally: {}", webSocketSession.getRemoteSocketAddress(), reason); } else { - LOG.warn("{} closed connection with status code {}: {}", webSocketSession.getRemoteAddress(), statusCode, - reason); + LOG.warn("{} closed connection with status code {}: {}", webSocketSession.getRemoteSocketAddress(), + statusCode, reason); } webSocketSession = null; } @@ -73,7 +73,7 @@ public class XtextWebSocket implements WriteCallback, ResponseHandler { if (webSocketSession == null) { return; } - LOG.error("Internal websocket error in connection from" + webSocketSession.getRemoteAddress(), error); + LOG.error("Internal websocket error in connection from" + webSocketSession.getRemoteSocketAddress(), error); } @OnWebSocketMessage @@ -86,14 +86,14 @@ public class XtextWebSocket implements WriteCallback, ResponseHandler { try { request = gson.fromJson(reader, XtextWebRequest.class); } catch (JsonIOException e) { - LOG.error("Cannot read from websocket from" + webSocketSession.getRemoteAddress(), e); + LOG.error("Cannot read from websocket from" + webSocketSession.getRemoteSocketAddress(), e); if (webSocketSession.isOpen()) { - webSocketSession.close(StatusCode.SERVER_ERROR, "Cannot read payload"); + webSocketSession.close(StatusCode.SERVER_ERROR, "Cannot read payload", Callback.NOOP); } return; } catch (JsonParseException e) { - LOG.warn("Malformed websocket request from" + webSocketSession.getRemoteAddress(), e); - webSocketSession.close(XtextStatusCode.INVALID_JSON, "Invalid JSON payload"); + LOG.warn("Malformed websocket request from" + webSocketSession.getRemoteSocketAddress(), e); + webSocketSession.close(XtextStatusCode.INVALID_JSON, "Invalid JSON payload", Callback.NOOP); return; } try { @@ -101,7 +101,7 @@ public class XtextWebSocket implements WriteCallback, ResponseHandler { } catch (ResponseHandlerException e) { LOG.warn("Cannot write websocket response", e); if (webSocketSession.isOpen()) { - webSocketSession.close(StatusCode.SERVER_ERROR, "Cannot write response"); + webSocketSession.close(StatusCode.SERVER_ERROR, "Cannot write response", Callback.NOOP); } } } @@ -112,15 +112,14 @@ public class XtextWebSocket implements WriteCallback, ResponseHandler { throw new ResponseHandlerException("Trying to send message when websocket is disconnected"); } var responseString = gson.toJson(response); - webSocketSession.getRemote().sendPartialString(responseString, true, this); + webSocketSession.sendText(responseString, Callback.from(() -> {}, this::writeFailed)); } - @Override public void writeFailed(Throwable x) { if (webSocketSession == null) { LOG.error("Cannot complete async write to disconnected websocket", x); return; } - LOG.warn("Cannot complete async write to websocket " + webSocketSession.getRemoteAddress(), x); + LOG.warn("Cannot complete async write to websocket " + webSocketSession.getRemoteSocketAddress(), x); } } diff --git a/subprojects/language-web/src/test/java/tools/refinery/language/web/ProblemWebSocketServletIntegrationTest.java b/subprojects/language-web/src/test/java/tools/refinery/language/web/ProblemWebSocketServletIntegrationTest.java index 40f5281d..927eeab1 100644 --- a/subprojects/language-web/src/test/java/tools/refinery/language/web/ProblemWebSocketServletIntegrationTest.java +++ b/subprojects/language-web/src/test/java/tools/refinery/language/web/ProblemWebSocketServletIntegrationTest.java @@ -7,17 +7,18 @@ package tools.refinery.language.web; import org.eclipse.jetty.ee10.servlet.ServletContextHandler; import org.eclipse.jetty.ee10.servlet.ServletHolder; -import org.eclipse.jetty.ee10.websocket.api.Session; -import org.eclipse.jetty.ee10.websocket.api.StatusCode; -import org.eclipse.jetty.ee10.websocket.api.annotations.WebSocket; -import org.eclipse.jetty.ee10.websocket.api.exceptions.UpgradeException; -import org.eclipse.jetty.ee10.websocket.client.ClientUpgradeRequest; -import org.eclipse.jetty.ee10.websocket.client.WebSocketClient; import org.eclipse.jetty.ee10.websocket.server.config.JettyWebSocketServletContainerInitializer; import org.eclipse.jetty.http.HttpHeader; import org.eclipse.jetty.http.HttpStatus; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.util.thread.QueuedThreadPool; +import org.eclipse.jetty.websocket.api.Callback; +import org.eclipse.jetty.websocket.api.Session; +import org.eclipse.jetty.websocket.api.StatusCode; +import org.eclipse.jetty.websocket.api.annotations.WebSocket; +import org.eclipse.jetty.websocket.api.exceptions.UpgradeException; +import org.eclipse.jetty.websocket.client.ClientUpgradeRequest; +import org.eclipse.jetty.websocket.client.WebSocketClient; import org.eclipse.xtext.testing.GlobalRegistries; import org.eclipse.xtext.testing.GlobalRegistries.GlobalStateMemento; import org.junit.jupiter.api.AfterEach; @@ -95,23 +96,34 @@ class ProblemWebSocketServletIntegrationTest { assertThat(responses, hasSize(5)); assertThat(responses.get(0), equalTo("{\"id\":\"foo\",\"response\":{\"stateId\":\"-80000000\"}}")); assertThat(responses.get(1), startsWith( - "{\"resource\":\"test.problem\",\"stateId\":\"-80000000\",\"service\":\"highlight\",\"push\":{\"regions\":[")); + "{\"resource\":\"test.problem\",\"stateId\":\"-80000000\",\"service\":\"highlight\"," + + "\"push\":{\"regions\":[")); assertThat(responses.get(2), equalTo( - "{\"resource\":\"test.problem\",\"stateId\":\"-80000000\",\"service\":\"validate\",\"push\":{\"issues\":[]}}")); + "{\"resource\":\"test.problem\",\"stateId\":\"-80000000\",\"service\":\"validate\"," + + "\"push\":{\"issues\":[]}}")); assertThat(responses.get(3), equalTo("{\"id\":\"bar\",\"response\":{\"stateId\":\"-7fffffff\"}}")); assertThat(responses.get(4), startsWith( - "{\"resource\":\"test.problem\",\"stateId\":\"-7fffffff\",\"service\":\"highlight\",\"push\":{\"regions\":[")); + "{\"resource\":\"test.problem\",\"stateId\":\"-7fffffff\",\"service\":\"highlight\"," + + "\"push\":{\"regions\":[")); } @WebSocket public static class UpdateTestClient extends WebSocketIntegrationTestClient { @Override - protected void arrange(Session session, int responsesReceived) throws IOException { + protected void arrange(Session session, int responsesReceived) { switch (responsesReceived) { - case 0 -> session.getRemote().sendString( - "{\"id\":\"foo\",\"request\":{\"resource\":\"test.problem\",\"serviceType\":\"update\",\"fullText\":\"class Person.\n\"}}"); - case 3 -> session.getRemote().sendString( - "{\"id\":\"bar\",\"request\":{\"resource\":\"test.problem\",\"serviceType\":\"update\",\"requiredStateId\":\"-80000000\",\"deltaText\":\"indiv q.\nnode(q).\n\",\"deltaOffset\":\"0\",\"deltaReplaceLength\":\"0\"}}"); + case 0 -> session.sendText( + "{\"id\":\"foo\",\"request\":{\"resource\":\"test.problem\",\"serviceType\":\"update\"," + + "\"fullText\":\"class Person.\n\"}}", + Callback.NOOP + ); + case 3 -> //noinspection TextBlockMigration + session.sendText( + "{\"id\":\"bar\",\"request\":{\"resource\":\"test.problem\",\"serviceType\":\"update\"," + + "\"requiredStateId\":\"-80000000\",\"deltaText\":\"indiv q.\nnode(q).\n\"," + + "\"deltaOffset\":\"0\",\"deltaReplaceLength\":\"0\"}}", + Callback.NOOP + ); case 5 -> session.close(); } } @@ -161,13 +173,13 @@ class ProblemWebSocketServletIntegrationTest { @WebSocket public static class InvalidJsonTestClient extends WebSocketIntegrationTestClient { @Override - protected void arrange(Session session, int responsesReceived) throws IOException { - session.getRemote().sendString(""); + protected void arrange(Session session, int responsesReceived) { + session.sendText("", Callback.NOOP); } } @ParameterizedTest(name = "validOriginTest(\"{0}\")") - @ValueSource(strings = { "https://refinery.example", "https://refinery.example:443", "HTTPS://REFINERY.EXAMPLE" }) + @ValueSource(strings = {"https://refinery.example", "https://refinery.example:443", "HTTPS://REFINERY.EXAMPLE"}) void validOriginTest(String origin) { startServer("https://refinery.example,https://refinery.example:443"); var clientSocket = new CloseImmediatelyTestClient(); diff --git a/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/WebSocketIntegrationTestClient.java b/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/WebSocketIntegrationTestClient.java index 46220777..6ccf1760 100644 --- a/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/WebSocketIntegrationTestClient.java +++ b/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/WebSocketIntegrationTestClient.java @@ -5,13 +5,12 @@ */ package tools.refinery.language.web.tests; -import org.eclipse.jetty.ee10.websocket.api.Session; -import org.eclipse.jetty.ee10.websocket.api.annotations.OnWebSocketClose; -import org.eclipse.jetty.ee10.websocket.api.annotations.OnWebSocketConnect; -import org.eclipse.jetty.ee10.websocket.api.annotations.OnWebSocketError; -import org.eclipse.jetty.ee10.websocket.api.annotations.OnWebSocketMessage; +import org.eclipse.jetty.websocket.api.Session; +import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose; +import org.eclipse.jetty.websocket.api.annotations.OnWebSocketError; +import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage; +import org.eclipse.jetty.websocket.api.annotations.OnWebSocketOpen; -import java.io.IOException; import java.time.Duration; import java.util.ArrayList; import java.util.List; @@ -39,8 +38,8 @@ public abstract class WebSocketIntegrationTestClient { return responses; } - @OnWebSocketConnect - public void onConnect(Session session) { + @OnWebSocketOpen + public void onOpen(Session session) { arrangeAndCatchErrors(session); } @@ -52,7 +51,7 @@ public abstract class WebSocketIntegrationTestClient { } } - protected abstract void arrange(Session session, int responsesReceived) throws IOException; + protected abstract void arrange(Session session, int responsesReceived); @OnWebSocketClose public void onClose(int statusCode, String reason) { -- cgit v1.2.3-54-g00ecf