Skip to content

Commit 7deb5f7

Browse files
committed
feat: split editor into frontend and backend components
The backend component runs on the server and the frontend component on the client. This improves the responsiveness. The main reason for this refactoring was that the server doesn't know the bounds of the layouted elements and had to retrieve them from the client for computing properties such as the code completion menu position.
1 parent c2a6870 commit 7deb5f7

48 files changed

Lines changed: 1147 additions & 502 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

editor-common-mps/build.gradle.kts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,15 @@ dependencies {
2020
compileOnly(coreLibs.kotlin.coroutines.core)
2121
compileOnly(coreLibs.kotlin.serialization.json)
2222

23-
api(coreLibs.ktor.server.core, excludeMPSLibraries)
24-
api(coreLibs.ktor.server.netty, excludeMPSLibraries)
25-
api(coreLibs.ktor.server.websockets, excludeMPSLibraries)
26-
api(coreLibs.ktor.server.html.builder, excludeMPSLibraries)
23+
api(libs.ktor.server.core, excludeMPSLibraries)
24+
api(libs.ktor.server.netty, excludeMPSLibraries)
25+
api(libs.ktor.server.websockets, excludeMPSLibraries)
26+
api(libs.ktor.server.html.builder, excludeMPSLibraries)
27+
api(libs.kotlinx.rpc.krpc.ktor.server, excludeMPSLibraries)
28+
api(libs.kotlinx.rpc.krpc.serialization.json, excludeMPSLibraries)
29+
api(libs.kotlinx.rpc.core, excludeMPSLibraries)
30+
api(coreLibs.kotlin.serialization.core, excludeMPSLibraries)
31+
api(coreLibs.kotlin.serialization.json, excludeMPSLibraries)
2732
api(libs.kotlin.logging, excludeMPSLibraries)
2833
api(coreLibs.logback.classic, excludeMPSLibraries)
2934
api(libs.slf4j.api, excludeMPSLibraries)

gradle/libs.versions.toml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ modelixCore = "18.5.0"
1414
modelixBuildtools="2.0.1"
1515
kotlin = "2.2.21"
1616
kotlinx-rpc = "0.10.1"
17+
ktor="3.3.0"
1718

1819
[libraries]
1920
modelix-model-api = { group = "org.modelix", name = "model-api", version.ref = "modelixCore" }
@@ -41,3 +42,34 @@ kotlinx-rpc-krpc-server = { module = "org.jetbrains.kotlinx:kotlinx-rpc-krpc-ser
4142
kotlinx-rpc-krpc-ktor-client = { module = "org.jetbrains.kotlinx:kotlinx-rpc-krpc-ktor-client", version.ref = "kotlinx-rpc" }
4243
kotlinx-rpc-krpc-ktor-server = { module = "org.jetbrains.kotlinx:kotlinx-rpc-krpc-ktor-server", version.ref = "kotlinx-rpc" }
4344
kotlinx-rpc-krpc-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-rpc-krpc-serialization-json", version.ref = "kotlinx-rpc" }
45+
46+
# ktor
47+
ktor-server-auth = { group = "io.ktor", name = "ktor-server-auth", version.ref = "ktor" }
48+
ktor-server-auth-jwt = { group = "io.ktor", name = "ktor-server-auth-jwt", version.ref = "ktor" }
49+
ktor-server-compression = { group = "io.ktor", name = "ktor-server-compression", version.ref = "ktor" }
50+
ktor-server-core = { group = "io.ktor", name = "ktor-server-core", version.ref = "ktor" }
51+
ktor-server-cors = { group = "io.ktor", name = "ktor-server-cors", version.ref = "ktor" }
52+
ktor-server-forwarded-header = { group = "io.ktor", name = "ktor-server-forwarded-header", version.ref = "ktor" }
53+
ktor-server-content-negotiation = { group = "io.ktor", name = "ktor-server-content-negotiation", version.ref = "ktor" }
54+
ktor-server-html-builder = { group = "io.ktor", name = "ktor-server-html-builder", version.ref = "ktor" }
55+
ktor-server-netty = { group = "io.ktor", name = "ktor-server-netty", version.ref = "ktor" }
56+
ktor-server-sessions = { group = "io.ktor", name = "ktor-server-sessions", version.ref = "ktor" }
57+
ktor-server-status-pages = { group = "io.ktor", name = "ktor-server-status-pages", version.ref = "ktor" }
58+
ktor-server-test-host = { group = "io.ktor", name = "ktor-server-test-host", version.ref = "ktor" }
59+
ktor-server-websockets = { group = "io.ktor", name = "ktor-server-websockets", version.ref = "ktor" }
60+
ktor-server-resources = { group = "io.ktor", name = "ktor-server-resources", version.ref = "ktor" }
61+
ktor-server-call-logging = { group = "io.ktor", name = "ktor-server-call-logging", version.ref = "ktor" }
62+
ktor-server-swagger = { group = "io.ktor", name = "ktor-server-swagger", version.ref = "ktor" }
63+
ktor-server-metrics-micrometer = { group = "io.ktor", name = "ktor-server-metrics-micrometer", version.ref = "ktor" }
64+
65+
ktor-client-core = { group = "io.ktor", name = "ktor-client-core", version.ref = "ktor" }
66+
ktor-client-content-negotiation = { group = "io.ktor", name = "ktor-client-content-negotiation", version.ref = "ktor" }
67+
ktor-client-encoding = { group = "io.ktor", name = "ktor-client-encoding", version.ref = "ktor" }
68+
ktor-client-mock = { group = "io.ktor", name = "ktor-client-mock", version.ref = "ktor" }
69+
ktor-client-cio = { group = "io.ktor", name = "ktor-client-cio", version.ref = "ktor" }
70+
ktor-client-websockets = { group = "io.ktor", name = "ktor-client-websockets", version.ref = "ktor" }
71+
ktor-client-js = { group = "io.ktor", name = "ktor-client-js", version.ref = "ktor" }
72+
ktor-client-auth = { group = "io.ktor", name = "ktor-client-auth", version.ref = "ktor" }
73+
74+
ktor-serialization = { group = "io.ktor", name = "ktor-serialization", version.ref = "ktor" }
75+
ktor-serialization-json = { group = "io.ktor", name = "ktor-serialization-kotlinx-json", version.ref = "ktor" }
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
<configuration debug="true">
3+
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
4+
<encoder>
5+
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
6+
</encoder>
7+
</appender>
8+
9+
<root level="DEBUG">
10+
<appender-ref ref="console" />
11+
</root>
12+
13+
<!--
14+
Reduce log output crated by testcontainers.
15+
See https://java.testcontainers.org/supported_docker_environment/logging_config/
16+
-->
17+
<logger name="org.testcontainers" level="INFO"/>
18+
<logger name="tc" level="INFO"/>
19+
<logger name="com.github.dockerjava" level="WARN"/>
20+
<logger name="com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.wire" level="OFF"/>
21+
<logger name="org.eclipse.jgit" level="WARN"/>
22+
</configuration>

kernelf-ssr-demo/build.gradle.kts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@ dependencies {
1111
implementation(project(":projectional-editor-ssr-server"))
1212
implementation(libs.modelix.model.datastructure)
1313
implementation(libs.modelix.model.client)
14-
implementation(coreLibs.ktor.server.core)
15-
implementation(coreLibs.ktor.server.netty)
16-
implementation(coreLibs.ktor.server.websockets)
14+
implementation(libs.ktor.server.core)
15+
implementation(libs.ktor.server.netty)
16+
implementation(libs.ktor.server.websockets)
17+
implementation(libs.kotlinx.rpc.krpc.ktor.server)
18+
implementation(libs.kotlinx.rpc.krpc.serialization.json)
1719
implementation(coreLibs.logback.classic)
1820
}
1921

kernelf-ssr-demo/src/main/kotlin/org/modelix/editor/ssr/demo/kernelf/Application.kt

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@ import io.ktor.server.application.install
55
import io.ktor.server.response.respondText
66
import io.ktor.server.routing.get
77
import io.ktor.server.routing.routing
8-
import io.ktor.server.websocket.WebSockets
9-
import io.ktor.server.websocket.pingPeriod
10-
import io.ktor.server.websocket.timeout
8+
import kotlinx.rpc.krpc.ktor.server.Krpc
119
import org.modelix.editor.kernelf.KernelfEditor
1210
import org.modelix.editor.ssr.server.ModelixSSRServer
1311
import org.modelix.kernelf.KernelfLanguages
@@ -22,7 +20,6 @@ import org.modelix.model.lazy.CLTree
2220
import org.modelix.model.lazy.ObjectStoreCache
2321
import org.modelix.model.persistent.MapBasedStore
2422
import org.modelix.model.withIncrementalComputationSupport
25-
import kotlin.time.Duration.Companion.seconds
2623

2724
fun main(args: Array<String>): Unit =
2825
io.ktor.server.netty.EngineMain
@@ -57,12 +54,7 @@ fun Application.module() {
5754
KernelfEditor.register(ssrServer.editorEngine)
5855
KernelfLanguages.registerAll()
5956

60-
install(WebSockets) {
61-
pingPeriod = 15.seconds
62-
timeout = 15.seconds
63-
maxFrameSize = Long.MAX_VALUE
64-
masking = false
65-
}
57+
install(Krpc)
6658
routing {
6759
get("/") {
6860
call.respondText("Hello, world!")

mps/modules/org.modelix.mps.notation/generator/templates/org.modelix.mps.notation.generator.templates@generator.mps

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@
212212
</concept>
213213
</language>
214214
<language id="c7b55726-1795-47bd-aa21-714ac1e30f21" name="org.modelix.mps.notation">
215-
<concept id="737165568294088373" name="org.modelix.mps.notation.structure.WithIdentCell" flags="ng" index="2OUTUo">
215+
<concept id="737165568294088373" name="org.modelix.mps.notation.structure.WithIndentCell" flags="ng" index="2OUTUo">
216216
<child id="737165568294090056" name="cells" index="2OUSl_" />
217217
</concept>
218218
<concept id="8310867745953158874" name="org.modelix.mps.notation.structure.ConstantCell" flags="ng" index="3JB3jO" />
@@ -2038,7 +2038,7 @@
20382038
</node>
20392039
</node>
20402040
<node concept="3aamgX" id="2QtC6yZ3g2L" role="3acgRq">
2041-
<ref role="30HIoZ" to="f8gn:CUW2QYOmUP" resolve="WithIdentCell" />
2041+
<ref role="30HIoZ" to="f8gn:CUW2QYOmUP" resolve="WithIndentCell" />
20422042
<node concept="1Koe21" id="2QtC6yZ3g2M" role="1lVwrX">
20432043
<node concept="2OqwBi" id="2QtC6yZ3g2N" role="1Koe22">
20442044
<node concept="2ShNRf" id="2QtC6yZ3g2O" role="2Oq$k0">

mps/modules/org.modelix.mps.react/generator/templates/org.modelix.mps.react.generator.templates@generator.mps

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3295,7 +3295,7 @@
32953295
<node concept="2OqwBi" id="7wAWjxnzzu2" role="3clFbG">
32963296
<node concept="30H73N" id="7wAWjxnzyQA" role="2Oq$k0" />
32973297
<node concept="3Tsc0h" id="7wAWjxnz$ec" role="2OqNvi">
3298-
<ref role="3TtcxE" to="8xo1:4Dhs5NhX4av" />
3298+
<ref role="3TtcxE" to="8xo1:4Dhs5NhX4av" resolve="parameterValues" />
32993299
</node>
33003300
</node>
33013301
</node>
@@ -3422,7 +3422,7 @@
34223422
<node concept="2OqwBi" id="2TLaMlBg7x3" role="1iwH7V">
34233423
<node concept="30H73N" id="2TLaMlBg7x4" role="2Oq$k0" />
34243424
<node concept="3TrEf2" id="2TLaMlBg7x5" role="2OqNvi">
3425-
<ref role="3Tt5mk" to="8xo1:1hCkroLrV8H" />
3425+
<ref role="3Tt5mk" to="8xo1:1hCkroLrV8H" resolve="decl" />
34263426
</node>
34273427
</node>
34283428
</node>

mps/modules/org.modelix.mps.react/models/org.modelix.mps.react.constraints.mps

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -612,7 +612,7 @@
612612
<property role="3GE5qa" value="pages" />
613613
<ref role="1M2myG" to="8xo1:2UuChTN9p$I" resolve="PagePathVariableReference" />
614614
<node concept="1N5Pfh" id="2UuChTN9p$L" role="1Mr941">
615-
<ref role="1N5Vy1" to="8xo1:2UuChTN9p$J" />
615+
<ref role="1N5Vy1" to="8xo1:2UuChTN9p$J" resolve="decl" />
616616
<node concept="3dgokm" id="2UuChTN9pH6" role="1N6uqs">
617617
<node concept="3clFbS" id="2UuChTN9pH7" role="2VODD2">
618618
<node concept="3clFbF" id="2UuChTN9yDp" role="3cqZAp">

mps/modules/org.modelix.mps.react/models/org.modelix.mps.react.editor.mps

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2431,5 +2431,31 @@
24312431
</node>
24322432
</node>
24332433
</node>
2434+
<node concept="24kQdi" id="szQzwtlzSZ">
2435+
<property role="3GE5qa" value="pages" />
2436+
<ref role="1XX52x" to="8xo1:6eUjE42h0Dn" resolve="PageParameter" />
2437+
<node concept="3EZMnI" id="szQzwtlzT1" role="2wV5jI">
2438+
<node concept="3F0A7n" id="szQzwtlzT7" role="3EZMnx">
2439+
<ref role="1NtTu8" to="tpck:h0TrG11" resolve="name" />
2440+
</node>
2441+
<node concept="3F0ifn" id="szQzwtlzTa" role="3EZMnx">
2442+
<property role="3F0ifm" value=":" />
2443+
<node concept="11L4FC" id="szQzwtlzTf" role="3F10Kt">
2444+
<property role="VOm3f" value="true" />
2445+
</node>
2446+
</node>
2447+
<node concept="3F1sOY" id="szQzwtlzTd" role="3EZMnx">
2448+
<ref role="1NtTu8" to="8xo1:6eUjE42h0Dr" resolve="type" />
2449+
</node>
2450+
<node concept="l2Vlx" id="szQzwtlzT4" role="2iSdaV" />
2451+
</node>
2452+
</node>
2453+
<node concept="24kQdi" id="szQzwtmcUZ">
2454+
<property role="3GE5qa" value="pages" />
2455+
<ref role="1XX52x" to="8xo1:szQzwtmcUX" resolve="StringPageParameterType" />
2456+
<node concept="PMmxH" id="szQzwtmcV1" role="2wV5jI">
2457+
<ref role="PMmxG" to="tpco:2wZex4PafBj" resolve="alias" />
2458+
</node>
2459+
</node>
24342460
</model>
24352461

mps/modules/org.modelix.mps.react/models/org.modelix.mps.react.structure.mps

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -983,5 +983,15 @@
983983
<ref role="20lvS9" node="6eUjE42hnWB" resolve="VariablePagePathPart" />
984984
</node>
985985
</node>
986+
<node concept="1TIwiD" id="szQzwtmcUX">
987+
<property role="EcuMT" value="514494716995751613" />
988+
<property role="3GE5qa" value="pages" />
989+
<property role="TrG5h" value="StringPageParameterType" />
990+
<property role="34LRSv" value="string" />
991+
<ref role="1TJDcQ" to="tpck:gw2VY9q" resolve="BaseConcept" />
992+
<node concept="PrWs8" id="szQzwtmcUY" role="PzmwI">
993+
<ref role="PrY4T" node="6eUjE42h0Dq" resolve="IPageParameterType" />
994+
</node>
995+
</node>
986996
</model>
987997

0 commit comments

Comments
 (0)