aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2023-06-18 17:39:27 +0200
committerLibravatar Kristóf Marussy <kristof@marussy.com>2023-06-18 17:49:03 +0200
commit8fe6d4b9abe14fdc84f5b7a41e8f6e956f03b0dc (patch)
tree6d6e342b019a1f3ad0baae710cf520a5dffe4b9e /subprojects
parentrefactor: prefer Query.of over Dnf.of (diff)
downloadrefinery-8fe6d4b9abe14fdc84f5b7a41e8f6e956f03b0dc.tar.gz
refinery-8fe6d4b9abe14fdc84f5b7a41e8f6e956f03b0dc.tar.zst
refinery-8fe6d4b9abe14fdc84f5b7a41e8f6e956f03b0dc.zip
chore(deps): bump dependencies
Diffstat (limited to 'subprojects')
-rw-r--r--subprojects/frontend/index.html6
-rw-r--r--subprojects/frontend/package.json60
-rw-r--r--subprojects/frontend/src/theme/ThemeProvider.tsx4
-rw-r--r--subprojects/language-web/build.gradle.kts1
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/servlet/XtextWebSocket.java39
-rw-r--r--subprojects/language-web/src/test/java/tools/refinery/language/web/ProblemWebSocketServletIntegrationTest.java46
-rw-r--r--subprojects/language-web/src/test/java/tools/refinery/language/web/tests/WebSocketIntegrationTestClient.java17
7 files changed, 92 insertions, 81 deletions
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 @@
18 <meta name="theme-color" media="(prefers-color-scheme:light)" content="#f5f5f5"> 18 <meta name="theme-color" media="(prefers-color-scheme:light)" content="#f5f5f5">
19 <meta name="theme-color" media="(prefers-color-scheme:dark)" content="#21252b"> 19 <meta name="theme-color" media="(prefers-color-scheme:dark)" content="#21252b">
20 <style> 20 <style>
21 @import '@fontsource/inter/variable.css'; 21 @import '@fontsource-variable/inter/wght.css';
22 @import '@fontsource/jetbrains-mono/variable.css'; 22 @import '@fontsource-variable/jetbrains-mono/wght.css';
23 @import '@fontsource/jetbrains-mono/variable-italic.css'; 23 @import '@fontsource-variable/jetbrains-mono/wght-italic.css';
24 </style> 24 </style>
25 </head> 25 </head>
26 <body> 26 <body>
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 @@
28 }, 28 },
29 "homepage": "https://refinery.tools", 29 "homepage": "https://refinery.tools",
30 "dependencies": { 30 "dependencies": {
31 "@codemirror/autocomplete": "^6.5.1", 31 "@codemirror/autocomplete": "^6.8.0",
32 "@codemirror/commands": "^6.2.3", 32 "@codemirror/commands": "^6.2.4",
33 "@codemirror/language": "^6.6.0", 33 "@codemirror/language": "^6.8.0",
34 "@codemirror/lint": "^6.2.1", 34 "@codemirror/lint": "^6.2.2",
35 "@codemirror/search": "^6.4.0", 35 "@codemirror/search": "^6.5.0",
36 "@codemirror/state": "^6.2.0", 36 "@codemirror/state": "^6.2.1",
37 "@codemirror/view": "^6.10.0", 37 "@codemirror/view": "^6.13.2",
38 "@emotion/react": "^11.10.6", 38 "@emotion/react": "^11.11.1",
39 "@emotion/styled": "^11.10.6", 39 "@emotion/styled": "^11.11.0",
40 "@fontsource/inter": "^4.5.15", 40 "@fontsource-variable/inter": "^5.0.3",
41 "@fontsource/jetbrains-mono": "^4.5.12", 41 "@fontsource-variable/jetbrains-mono": "^5.0.3",
42 "@lezer/common": "^1.0.2", 42 "@lezer/common": "^1.0.3",
43 "@lezer/highlight": "^1.1.4", 43 "@lezer/highlight": "^1.1.6",
44 "@lezer/lr": "^1.3.4", 44 "@lezer/lr": "^1.3.6",
45 "@material-icons/svg": "^1.0.33", 45 "@material-icons/svg": "^1.0.33",
46 "@mui/icons-material": "5.11.16", 46 "@mui/icons-material": "5.11.16",
47 "@mui/material": "5.12.2", 47 "@mui/material": "5.13.5",
48 "@vitejs/plugin-react-swc": "^3.3.0", 48 "@vitejs/plugin-react-swc": "^3.3.2",
49 "ansi-styles": "^6.2.1", 49 "ansi-styles": "^6.2.1",
50 "csstype": "^3.1.2", 50 "csstype": "^3.1.2",
51 "escape-string-regexp": "^5.0.0", 51 "escape-string-regexp": "^5.0.0",
@@ -63,21 +63,21 @@
63 "zod": "^3.21.4" 63 "zod": "^3.21.4"
64 }, 64 },
65 "devDependencies": { 65 "devDependencies": {
66 "@lezer/generator": "^1.2.2", 66 "@lezer/generator": "^1.3.0",
67 "@types/eslint": "^8.37.0", 67 "@types/eslint": "^8.40.2",
68 "@types/html-minifier-terser": "^7.0.0", 68 "@types/html-minifier-terser": "^7.0.0",
69 "@types/lodash-es": "^4.17.7", 69 "@types/lodash-es": "^4.17.7",
70 "@types/micromatch": "^4.0.2", 70 "@types/micromatch": "^4.0.2",
71 "@types/ms": "^0.7.31", 71 "@types/ms": "^0.7.31",
72 "@types/node": "^18.16.1", 72 "@types/node": "^18.16.18",
73 "@types/prettier": "^2.7.2", 73 "@types/prettier": "^2.7.3",
74 "@types/react": "^18.2.0", 74 "@types/react": "^18.2.12",
75 "@types/react-dom": "^18.2.1", 75 "@types/react-dom": "^18.2.5",
76 "@typescript-eslint/eslint-plugin": "^5.59.1", 76 "@typescript-eslint/eslint-plugin": "^5.59.11",
77 "@typescript-eslint/parser": "^5.59.1", 77 "@typescript-eslint/parser": "^5.59.11",
78 "@xstate/cli": "^0.4.2", 78 "@xstate/cli": "^0.5.1",
79 "cross-env": "^7.0.3", 79 "cross-env": "^7.0.3",
80 "eslint": "^8.39.0", 80 "eslint": "^8.43.0",
81 "eslint-config-airbnb": "^19.0.4", 81 "eslint-config-airbnb": "^19.0.4",
82 "eslint-config-airbnb-typescript": "^17.0.0", 82 "eslint-config-airbnb-typescript": "^17.0.0",
83 "eslint-config-prettier": "^8.8.0", 83 "eslint-config-prettier": "^8.8.0",
@@ -91,9 +91,9 @@
91 "html-minifier-terser": "^7.2.0", 91 "html-minifier-terser": "^7.2.0",
92 "micromatch": "^4.0.5", 92 "micromatch": "^4.0.5",
93 "prettier": "^2.8.8", 93 "prettier": "^2.8.8",
94 "typescript": "5.0.4", 94 "typescript": "5.1.3",
95 "vite": "^4.3.3", 95 "vite": "^4.3.9",
96 "vite-plugin-pwa": "^0.14.7", 96 "vite-plugin-pwa": "^0.16.4",
97 "workbox-window": "^6.5.4" 97 "workbox-window": "^7.0.0"
98 } 98 }
99} 99}
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(
75 ...options, 75 ...options,
76 typography: { 76 typography: {
77 fontFamily: 77 fontFamily:
78 '"InterVariable", "Inter", "Roboto", "Helvetica", "Arial", sans-serif', 78 '"Inter Variable", "Inter", "Roboto", "Helvetica", "Arial", sans-serif',
79 fontWeightMedium: 600, 79 fontWeightMedium: 600,
80 fontWeightEditorNormal: 400, 80 fontWeightEditorNormal: 400,
81 fontWeightEditorBold: 700, 81 fontWeightEditorBold: 700,
@@ -85,7 +85,7 @@ function createResponsiveTheme(
85 }, 85 },
86 editor: { 86 editor: {
87 fontFamily: 87 fontFamily:
88 '"JetBrains MonoVariable", "JetBrains Mono", "Cascadia Code", "Fira Code", monospace', 88 '"JetBrains Mono Variable", "JetBrains Mono", "Cascadia Code", "Fira Code", monospace',
89 fontFeatureSettings: '"liga", "calt"', 89 fontFeatureSettings: '"liga", "calt"',
90 // `rem` for JetBrains MonoVariable make the text too large in Safari. 90 // `rem` for JetBrains MonoVariable make the text too large in Safari.
91 fontSize: '16px', 91 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 {
19 implementation(project(":refinery-language-ide")) 19 implementation(project(":refinery-language-ide"))
20 implementation(libs.jetty.server) 20 implementation(libs.jetty.server)
21 implementation(libs.jetty.servlet) 21 implementation(libs.jetty.servlet)
22 implementation(libs.jetty.websocket.api)
22 implementation(libs.jetty.websocket.server) 23 implementation(libs.jetty.websocket.server)
23 implementation(libs.slf4j.api) 24 implementation(libs.slf4j.api)
24 implementation(libs.xtext.web) 25 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;
8import com.google.gson.Gson; 8import com.google.gson.Gson;
9import com.google.gson.JsonIOException; 9import com.google.gson.JsonIOException;
10import com.google.gson.JsonParseException; 10import com.google.gson.JsonParseException;
11import org.eclipse.jetty.ee10.websocket.api.Session; 11import org.eclipse.jetty.websocket.api.Callback;
12import org.eclipse.jetty.ee10.websocket.api.StatusCode; 12import org.eclipse.jetty.websocket.api.Session;
13import org.eclipse.jetty.ee10.websocket.api.WriteCallback; 13import org.eclipse.jetty.websocket.api.StatusCode;
14import org.eclipse.jetty.ee10.websocket.api.annotations.*; 14import org.eclipse.jetty.websocket.api.annotations.*;
15import org.eclipse.xtext.resource.IResourceServiceProvider; 15import org.eclipse.xtext.resource.IResourceServiceProvider;
16import org.eclipse.xtext.web.server.ISession; 16import org.eclipse.xtext.web.server.ISession;
17import org.slf4j.Logger; 17import org.slf4j.Logger;
@@ -25,7 +25,7 @@ import tools.refinery.language.web.xtext.server.message.XtextWebResponse;
25import java.io.Reader; 25import java.io.Reader;
26 26
27@WebSocket 27@WebSocket
28public class XtextWebSocket implements WriteCallback, ResponseHandler { 28public class XtextWebSocket implements ResponseHandler {
29 private static final Logger LOG = LoggerFactory.getLogger(XtextWebSocket.class); 29 private static final Logger LOG = LoggerFactory.getLogger(XtextWebSocket.class);
30 30
31 private final Gson gson = new Gson(); 31 private final Gson gson = new Gson();
@@ -43,13 +43,13 @@ public class XtextWebSocket implements WriteCallback, ResponseHandler {
43 this(new TransactionExecutor(session, resourceServiceProviderRegistry)); 43 this(new TransactionExecutor(session, resourceServiceProviderRegistry));
44 } 44 }
45 45
46 @OnWebSocketConnect 46 @OnWebSocketOpen
47 public void onConnect(Session webSocketSession) { 47 public void onOpen(Session webSocketSession) {
48 if (this.webSocketSession != null) { 48 if (this.webSocketSession != null) {
49 LOG.error("Websocket session onConnect when already connected"); 49 LOG.error("Websocket session onConnect when already connected");
50 return; 50 return;
51 } 51 }
52 LOG.debug("New websocket connection from {}", webSocketSession.getRemoteAddress()); 52 LOG.debug("New websocket connection from {}", webSocketSession.getRemoteSocketAddress());
53 this.webSocketSession = webSocketSession; 53 this.webSocketSession = webSocketSession;
54 } 54 }
55 55
@@ -60,10 +60,10 @@ public class XtextWebSocket implements WriteCallback, ResponseHandler {
60 return; 60 return;
61 } 61 }
62 if (statusCode == StatusCode.NORMAL || statusCode == StatusCode.SHUTDOWN) { 62 if (statusCode == StatusCode.NORMAL || statusCode == StatusCode.SHUTDOWN) {
63 LOG.debug("{} closed connection normally: {}", webSocketSession.getRemoteAddress(), reason); 63 LOG.debug("{} closed connection normally: {}", webSocketSession.getRemoteSocketAddress(), reason);
64 } else { 64 } else {
65 LOG.warn("{} closed connection with status code {}: {}", webSocketSession.getRemoteAddress(), statusCode, 65 LOG.warn("{} closed connection with status code {}: {}", webSocketSession.getRemoteSocketAddress(),
66 reason); 66 statusCode, reason);
67 } 67 }
68 webSocketSession = null; 68 webSocketSession = null;
69 } 69 }
@@ -73,7 +73,7 @@ public class XtextWebSocket implements WriteCallback, ResponseHandler {
73 if (webSocketSession == null) { 73 if (webSocketSession == null) {
74 return; 74 return;
75 } 75 }
76 LOG.error("Internal websocket error in connection from" + webSocketSession.getRemoteAddress(), error); 76 LOG.error("Internal websocket error in connection from" + webSocketSession.getRemoteSocketAddress(), error);
77 } 77 }
78 78
79 @OnWebSocketMessage 79 @OnWebSocketMessage
@@ -86,14 +86,14 @@ public class XtextWebSocket implements WriteCallback, ResponseHandler {
86 try { 86 try {
87 request = gson.fromJson(reader, XtextWebRequest.class); 87 request = gson.fromJson(reader, XtextWebRequest.class);
88 } catch (JsonIOException e) { 88 } catch (JsonIOException e) {
89 LOG.error("Cannot read from websocket from" + webSocketSession.getRemoteAddress(), e); 89 LOG.error("Cannot read from websocket from" + webSocketSession.getRemoteSocketAddress(), e);
90 if (webSocketSession.isOpen()) { 90 if (webSocketSession.isOpen()) {
91 webSocketSession.close(StatusCode.SERVER_ERROR, "Cannot read payload"); 91 webSocketSession.close(StatusCode.SERVER_ERROR, "Cannot read payload", Callback.NOOP);
92 } 92 }
93 return; 93 return;
94 } catch (JsonParseException e) { 94 } catch (JsonParseException e) {
95 LOG.warn("Malformed websocket request from" + webSocketSession.getRemoteAddress(), e); 95 LOG.warn("Malformed websocket request from" + webSocketSession.getRemoteSocketAddress(), e);
96 webSocketSession.close(XtextStatusCode.INVALID_JSON, "Invalid JSON payload"); 96 webSocketSession.close(XtextStatusCode.INVALID_JSON, "Invalid JSON payload", Callback.NOOP);
97 return; 97 return;
98 } 98 }
99 try { 99 try {
@@ -101,7 +101,7 @@ public class XtextWebSocket implements WriteCallback, ResponseHandler {
101 } catch (ResponseHandlerException e) { 101 } catch (ResponseHandlerException e) {
102 LOG.warn("Cannot write websocket response", e); 102 LOG.warn("Cannot write websocket response", e);
103 if (webSocketSession.isOpen()) { 103 if (webSocketSession.isOpen()) {
104 webSocketSession.close(StatusCode.SERVER_ERROR, "Cannot write response"); 104 webSocketSession.close(StatusCode.SERVER_ERROR, "Cannot write response", Callback.NOOP);
105 } 105 }
106 } 106 }
107 } 107 }
@@ -112,15 +112,14 @@ public class XtextWebSocket implements WriteCallback, ResponseHandler {
112 throw new ResponseHandlerException("Trying to send message when websocket is disconnected"); 112 throw new ResponseHandlerException("Trying to send message when websocket is disconnected");
113 } 113 }
114 var responseString = gson.toJson(response); 114 var responseString = gson.toJson(response);
115 webSocketSession.getRemote().sendPartialString(responseString, true, this); 115 webSocketSession.sendText(responseString, Callback.from(() -> {}, this::writeFailed));
116 } 116 }
117 117
118 @Override
119 public void writeFailed(Throwable x) { 118 public void writeFailed(Throwable x) {
120 if (webSocketSession == null) { 119 if (webSocketSession == null) {
121 LOG.error("Cannot complete async write to disconnected websocket", x); 120 LOG.error("Cannot complete async write to disconnected websocket", x);
122 return; 121 return;
123 } 122 }
124 LOG.warn("Cannot complete async write to websocket " + webSocketSession.getRemoteAddress(), x); 123 LOG.warn("Cannot complete async write to websocket " + webSocketSession.getRemoteSocketAddress(), x);
125 } 124 }
126} 125}
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;
7 7
8import org.eclipse.jetty.ee10.servlet.ServletContextHandler; 8import org.eclipse.jetty.ee10.servlet.ServletContextHandler;
9import org.eclipse.jetty.ee10.servlet.ServletHolder; 9import org.eclipse.jetty.ee10.servlet.ServletHolder;
10import org.eclipse.jetty.ee10.websocket.api.Session;
11import org.eclipse.jetty.ee10.websocket.api.StatusCode;
12import org.eclipse.jetty.ee10.websocket.api.annotations.WebSocket;
13import org.eclipse.jetty.ee10.websocket.api.exceptions.UpgradeException;
14import org.eclipse.jetty.ee10.websocket.client.ClientUpgradeRequest;
15import org.eclipse.jetty.ee10.websocket.client.WebSocketClient;
16import org.eclipse.jetty.ee10.websocket.server.config.JettyWebSocketServletContainerInitializer; 10import org.eclipse.jetty.ee10.websocket.server.config.JettyWebSocketServletContainerInitializer;
17import org.eclipse.jetty.http.HttpHeader; 11import org.eclipse.jetty.http.HttpHeader;
18import org.eclipse.jetty.http.HttpStatus; 12import org.eclipse.jetty.http.HttpStatus;
19import org.eclipse.jetty.server.Server; 13import org.eclipse.jetty.server.Server;
20import org.eclipse.jetty.util.thread.QueuedThreadPool; 14import org.eclipse.jetty.util.thread.QueuedThreadPool;
15import org.eclipse.jetty.websocket.api.Callback;
16import org.eclipse.jetty.websocket.api.Session;
17import org.eclipse.jetty.websocket.api.StatusCode;
18import org.eclipse.jetty.websocket.api.annotations.WebSocket;
19import org.eclipse.jetty.websocket.api.exceptions.UpgradeException;
20import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
21import org.eclipse.jetty.websocket.client.WebSocketClient;
21import org.eclipse.xtext.testing.GlobalRegistries; 22import org.eclipse.xtext.testing.GlobalRegistries;
22import org.eclipse.xtext.testing.GlobalRegistries.GlobalStateMemento; 23import org.eclipse.xtext.testing.GlobalRegistries.GlobalStateMemento;
23import org.junit.jupiter.api.AfterEach; 24import org.junit.jupiter.api.AfterEach;
@@ -95,23 +96,34 @@ class ProblemWebSocketServletIntegrationTest {
95 assertThat(responses, hasSize(5)); 96 assertThat(responses, hasSize(5));
96 assertThat(responses.get(0), equalTo("{\"id\":\"foo\",\"response\":{\"stateId\":\"-80000000\"}}")); 97 assertThat(responses.get(0), equalTo("{\"id\":\"foo\",\"response\":{\"stateId\":\"-80000000\"}}"));
97 assertThat(responses.get(1), startsWith( 98 assertThat(responses.get(1), startsWith(
98 "{\"resource\":\"test.problem\",\"stateId\":\"-80000000\",\"service\":\"highlight\",\"push\":{\"regions\":[")); 99 "{\"resource\":\"test.problem\",\"stateId\":\"-80000000\",\"service\":\"highlight\"," +
100 "\"push\":{\"regions\":["));
99 assertThat(responses.get(2), equalTo( 101 assertThat(responses.get(2), equalTo(
100 "{\"resource\":\"test.problem\",\"stateId\":\"-80000000\",\"service\":\"validate\",\"push\":{\"issues\":[]}}")); 102 "{\"resource\":\"test.problem\",\"stateId\":\"-80000000\",\"service\":\"validate\"," +
103 "\"push\":{\"issues\":[]}}"));
101 assertThat(responses.get(3), equalTo("{\"id\":\"bar\",\"response\":{\"stateId\":\"-7fffffff\"}}")); 104 assertThat(responses.get(3), equalTo("{\"id\":\"bar\",\"response\":{\"stateId\":\"-7fffffff\"}}"));
102 assertThat(responses.get(4), startsWith( 105 assertThat(responses.get(4), startsWith(
103 "{\"resource\":\"test.problem\",\"stateId\":\"-7fffffff\",\"service\":\"highlight\",\"push\":{\"regions\":[")); 106 "{\"resource\":\"test.problem\",\"stateId\":\"-7fffffff\",\"service\":\"highlight\"," +
107 "\"push\":{\"regions\":["));
104 } 108 }
105 109
106 @WebSocket 110 @WebSocket
107 public static class UpdateTestClient extends WebSocketIntegrationTestClient { 111 public static class UpdateTestClient extends WebSocketIntegrationTestClient {
108 @Override 112 @Override
109 protected void arrange(Session session, int responsesReceived) throws IOException { 113 protected void arrange(Session session, int responsesReceived) {
110 switch (responsesReceived) { 114 switch (responsesReceived) {
111 case 0 -> session.getRemote().sendString( 115 case 0 -> session.sendText(
112 "{\"id\":\"foo\",\"request\":{\"resource\":\"test.problem\",\"serviceType\":\"update\",\"fullText\":\"class Person.\n\"}}"); 116 "{\"id\":\"foo\",\"request\":{\"resource\":\"test.problem\",\"serviceType\":\"update\"," +
113 case 3 -> session.getRemote().sendString( 117 "\"fullText\":\"class Person.\n\"}}",
114 "{\"id\":\"bar\",\"request\":{\"resource\":\"test.problem\",\"serviceType\":\"update\",\"requiredStateId\":\"-80000000\",\"deltaText\":\"indiv q.\nnode(q).\n\",\"deltaOffset\":\"0\",\"deltaReplaceLength\":\"0\"}}"); 118 Callback.NOOP
119 );
120 case 3 -> //noinspection TextBlockMigration
121 session.sendText(
122 "{\"id\":\"bar\",\"request\":{\"resource\":\"test.problem\",\"serviceType\":\"update\"," +
123 "\"requiredStateId\":\"-80000000\",\"deltaText\":\"indiv q.\nnode(q).\n\"," +
124 "\"deltaOffset\":\"0\",\"deltaReplaceLength\":\"0\"}}",
125 Callback.NOOP
126 );
115 case 5 -> session.close(); 127 case 5 -> session.close();
116 } 128 }
117 } 129 }
@@ -161,13 +173,13 @@ class ProblemWebSocketServletIntegrationTest {
161 @WebSocket 173 @WebSocket
162 public static class InvalidJsonTestClient extends WebSocketIntegrationTestClient { 174 public static class InvalidJsonTestClient extends WebSocketIntegrationTestClient {
163 @Override 175 @Override
164 protected void arrange(Session session, int responsesReceived) throws IOException { 176 protected void arrange(Session session, int responsesReceived) {
165 session.getRemote().sendString("<invalid json>"); 177 session.sendText("<invalid json>", Callback.NOOP);
166 } 178 }
167 } 179 }
168 180
169 @ParameterizedTest(name = "validOriginTest(\"{0}\")") 181 @ParameterizedTest(name = "validOriginTest(\"{0}\")")
170 @ValueSource(strings = { "https://refinery.example", "https://refinery.example:443", "HTTPS://REFINERY.EXAMPLE" }) 182 @ValueSource(strings = {"https://refinery.example", "https://refinery.example:443", "HTTPS://REFINERY.EXAMPLE"})
171 void validOriginTest(String origin) { 183 void validOriginTest(String origin) {
172 startServer("https://refinery.example,https://refinery.example:443"); 184 startServer("https://refinery.example,https://refinery.example:443");
173 var clientSocket = new CloseImmediatelyTestClient(); 185 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 @@
5 */ 5 */
6package tools.refinery.language.web.tests; 6package tools.refinery.language.web.tests;
7 7
8import org.eclipse.jetty.ee10.websocket.api.Session; 8import org.eclipse.jetty.websocket.api.Session;
9import org.eclipse.jetty.ee10.websocket.api.annotations.OnWebSocketClose; 9import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
10import org.eclipse.jetty.ee10.websocket.api.annotations.OnWebSocketConnect; 10import org.eclipse.jetty.websocket.api.annotations.OnWebSocketError;
11import org.eclipse.jetty.ee10.websocket.api.annotations.OnWebSocketError; 11import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
12import org.eclipse.jetty.ee10.websocket.api.annotations.OnWebSocketMessage; 12import org.eclipse.jetty.websocket.api.annotations.OnWebSocketOpen;
13 13
14import java.io.IOException;
15import java.time.Duration; 14import java.time.Duration;
16import java.util.ArrayList; 15import java.util.ArrayList;
17import java.util.List; 16import java.util.List;
@@ -39,8 +38,8 @@ public abstract class WebSocketIntegrationTestClient {
39 return responses; 38 return responses;
40 } 39 }
41 40
42 @OnWebSocketConnect 41 @OnWebSocketOpen
43 public void onConnect(Session session) { 42 public void onOpen(Session session) {
44 arrangeAndCatchErrors(session); 43 arrangeAndCatchErrors(session);
45 } 44 }
46 45
@@ -52,7 +51,7 @@ public abstract class WebSocketIntegrationTestClient {
52 } 51 }
53 } 52 }
54 53
55 protected abstract void arrange(Session session, int responsesReceived) throws IOException; 54 protected abstract void arrange(Session session, int responsesReceived);
56 55
57 @OnWebSocketClose 56 @OnWebSocketClose
58 public void onClose(int statusCode, String reason) { 57 public void onClose(int statusCode, String reason) {