Skip to content
Merged
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
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,11 @@ target/debug/chunk create ../my-server --chunk-source .
```

It creates a Kotlin project (`--language java` for Java) and prints the commands to build and run it. Gameplay code
starts at [`jvm/runtime-minestom`](jvm/runtime-minestom/README.md); [`examples/arena`](examples/arena/README.md) shows
the Java side of the API. The [CLI README](crates/chunk-cli/README.md) covers every command: `dev` runs a project
locally and rebuilds it on change, `build` packages a release, `players` and `nodes` operate the local environment, and
`auth login` and `deploy` deploy to a self-hosted install. [`docs/distribution.md`](docs/distribution.md) covers
packaging and publishing the SDK.
starts at [`jvm/multistom`](jvm/multistom/README.md); [`examples/arena`](examples/arena/README.md) shows the Java side
of the API. The [CLI README](crates/chunk-cli/README.md) covers every command: `dev` runs a project locally and rebuilds
it on change, `build` packages a release, `players` and `nodes` operate the local environment, and `auth login` and
`deploy` deploy to a self-hosted install. [`docs/distribution.md`](docs/distribution.md) covers packaging and publishing
the SDK.

## Self-hosting

Expand Down
2 changes: 1 addition & 1 deletion crates/chunk-build/src/codegen/java/configurations.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ pub(super) fn sources(
let provider = names::type_name(session, &provider_scope.path);
provider_scope.declare(&provider, session)?;
provider_scope.declarations.push(format!(
"public interface {provider} extends com.chunkzero.chunk.runtime.ConfiguredSessionProvider<{}> {{\n@Override default JsonType<{}> configurationType() {{ return {}.TYPE; }}\n}}",
"public interface {provider} extends com.chunkzero.chunk.multistom.ConfiguredSessionProvider<{}> {{\n@Override default JsonType<{}> configurationType() {{ return {}.TYPE; }}\n}}",
config.ty, config.ty, scope.path.join(".")
));
metadata.push(json!({
Expand Down
2 changes: 1 addition & 1 deletion crates/chunk-build/src/release/session_configurations.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ pub(super) fn validate(
{
return Ok(None);
}
let registration = read_registration(archive, "com.chunkzero.chunk.runtime.SessionProvider")?;
let registration = read_registration(archive, "com.chunkzero.chunk.multistom.SessionProvider")?;
if registration.len() > 65_536 || !registration.lines().any(|line| line.trim() == configuration.provider) {
return Err(io::Error::other("unregistered configured session provider"));
}
Expand Down
2 changes: 1 addition & 1 deletion crates/chunk-build/src/release/session_methods.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ pub(super) fn validate(
if actual.is_empty() {
return Ok(());
}
let registration = read_registration(archive, "com.chunkzero.chunk.runtime.SessionMethodProvider")?;
let registration = read_registration(archive, "com.chunkzero.chunk.multistom.SessionMethodProvider")?;
let providers: Vec<_> = registration.lines().filter(|line| !line.trim().is_empty()).collect();
if registration.len() > 65_536
|| providers.len() != 1
Expand Down
4 changes: 2 additions & 2 deletions crates/chunk-build/src/release/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -397,7 +397,7 @@ fn session_methods_publish_with_the_runtime_contract_and_reject_stale_jars() {
("sample/lobby/Provider.class", class(25, 1)),
("sample/Method.class", class(25, 1)),
(
"META-INF/services/com.chunkzero.chunk.runtime.SessionMethodProvider",
"META-INF/services/com.chunkzero.chunk.multistom.SessionMethodProvider",
b"sample.lobby.Provider\n".to_vec(),
),
(
Expand Down Expand Up @@ -460,7 +460,7 @@ fn session_configurations_require_matching_packaged_schemas_and_registered_provi
("META-INF/MANIFEST.MF", b"Manifest-Version: 1.0\r\nMain-Class: sample.lobby.Provider\r\n\r\n".to_vec()),
("sample/lobby/Provider.class", class(25, 1)),
("sample/ConfigProvider.class", class(25, 1)),
("META-INF/services/com.chunkzero.chunk.runtime.SessionProvider", provider.as_bytes().to_vec()),
("META-INF/services/com.chunkzero.chunk.multistom.SessionProvider", provider.as_bytes().to_vec()),
(
"META-INF/chunk/session-configurations.json",
serde_json::to_vec(&json!({"version":1,"app":"lobby","configurations":[configuration]})).unwrap(),
Expand Down
2 changes: 1 addition & 1 deletion crates/chunk-cli/src/creation/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ fn source(root: &Path) -> PathBuf {
for name in WRAPPER.iter().map(|(name, _)| *name).chain([
"settings.gradle.kts",
"jvm/gradle-plugin/settings.gradle.kts",
"jvm/runtime-minestom/build.gradle.kts",
"jvm/multistom/build.gradle.kts",
]) {
let path = source.join(name);
fs::create_dir_all(path.parent().unwrap()).unwrap();
Expand Down
2 changes: 1 addition & 1 deletion crates/chunk-cli/src/creation/toolchain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ impl Toolchain {
for name in super::WRAPPER
.iter()
.map(|(name, _)| *name)
.chain(["jvm/gradle-plugin/settings.gradle.kts", "jvm/runtime-minestom/build.gradle.kts"])
.chain(["jvm/gradle-plugin/settings.gradle.kts", "jvm/multistom/build.gradle.kts"])
{
if !source.join(name).is_file() {
return Err(io::Error::new(io::ErrorKind::NotFound, format!("Chunk checkout is missing {name}")));
Expand Down
2 changes: 1 addition & 1 deletion crates/chunk-cli/templates/common/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ hook, imported from `#chunk/apps`. A `scope.ts` in any directory under `apps/` a
below it.

See the [TypeScript SDK](https://github.com/chunkzero/chunk/blob/main/crates/chunk-build/sdk/README.md), the
[session API](https://github.com/chunkzero/chunk/blob/main/jvm/runtime-minestom/README.md) and the
[session API](https://github.com/chunkzero/chunk/blob/main/jvm/multistom/README.md) and the
[Gradle plugin](https://github.com/chunkzero/chunk/blob/main/jvm/gradle-plugin/README.md) for the details.

## Toolchain
Expand Down
8 changes: 4 additions & 4 deletions crates/chunk-cli/templates/java/Lobby.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
import com.chunkzero.chunk.generated.BackendClient;
import com.chunkzero.chunk.generated.BackendTypes.Shared.Greetings.MessageArgs;
import com.chunkzero.chunk.generated.BackendTypes.Shared.Greetings.MessageResult;
import com.chunkzero.chunk.runtime.ChunkMinestom;
import com.chunkzero.chunk.multistom.ChunkMinestom;
import com.chunkzero.chunk.multistom.Session;
import com.chunkzero.chunk.multistom.SessionProvider;
import com.chunkzero.chunk.multistom.SessionScope;
import com.chunkzero.chunk.runtime.ChunkProcess;
import com.chunkzero.chunk.runtime.Session;
import com.chunkzero.chunk.runtime.SessionProvider;
import com.chunkzero.chunk.runtime.SessionScope;
import com.chunkzero.chunk.runtime.SessionType;

import net.kyori.adventure.text.Component;
Expand Down
12 changes: 6 additions & 6 deletions crates/chunk-cli/templates/kotlin/Lobby.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@ package example

import com.chunkzero.chunk.generated.BackendTypes.Shared.Greetings.MessageArgs
import com.chunkzero.chunk.generated.CoroutineBackendClient
import com.chunkzero.chunk.runtime.ChunkMinestom
import com.chunkzero.chunk.multistom.ChunkMinestom
import com.chunkzero.chunk.multistom.CoroutineSession
import com.chunkzero.chunk.multistom.Session
import com.chunkzero.chunk.multistom.SessionProvider
import com.chunkzero.chunk.multistom.SessionScope
import com.chunkzero.chunk.multistom.coroutines
import com.chunkzero.chunk.runtime.ChunkProcess
import com.chunkzero.chunk.runtime.CoroutineSession
import com.chunkzero.chunk.runtime.Session
import com.chunkzero.chunk.runtime.SessionProvider
import com.chunkzero.chunk.runtime.SessionScope
import com.chunkzero.chunk.runtime.SessionType
import com.chunkzero.chunk.runtime.coroutines
import net.kyori.adventure.text.Component
import net.minestom.server.ServerProcess
import net.minestom.server.entity.Player
Expand Down
2 changes: 1 addition & 1 deletion docs/distribution.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ How the chunk SDK is packaged, installed and published. A release of the SDK has
TypeScript SDK, the project templates, the Gradle wrapper and the version pins that `chunk create` writes.
- **The JVM artifacts**, published to `https://maven.chunkzero.com` (nightlies to
`https://maven.chunkzero.com/nightlies`) under `com.chunkzero.chunk`: `proto`, `backend-api`, `backend-client`,
`backend-client-kotlin`, `runtime`, `runtime-minestom`, `runtime-minestom-kotlin`, the Gradle plugin and its three
`backend-client-kotlin`, `runtime`, `multistom`, `multistom-kotlin`, `minestom`, the Gradle plugin and its three
plugin markers. Each library has `-sources.jar` and `-javadoc.jar` (Dokka HTML) artifacts. Projects resolve these
through Gradle; the CLI archives contain no JARs.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

import com.chunkzero.chunk.generated.ArenaSessionProviders;
import com.chunkzero.chunk.generated.SessionConfigs;
import com.chunkzero.chunk.runtime.ChunkMinestom;
import com.chunkzero.chunk.multistom.ChunkMinestom;
import com.chunkzero.chunk.multistom.SessionCreation;
import com.chunkzero.chunk.runtime.ChunkProcess;
import com.chunkzero.chunk.runtime.SessionCreation;
import com.chunkzero.chunk.runtime.SessionType;

import net.minestom.server.ServerProcess;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
import com.chunkzero.chunk.generated.Destinations;
import com.chunkzero.chunk.generated.SessionMethods;
import com.chunkzero.chunk.generated.Worlds;
import com.chunkzero.chunk.multistom.Session;
import com.chunkzero.chunk.multistom.SessionScope;
import com.chunkzero.chunk.multistom.assets.Assets;
import com.chunkzero.chunk.runtime.MoveResult;
import com.chunkzero.chunk.runtime.Session;
import com.chunkzero.chunk.runtime.SessionScope;
import com.chunkzero.chunk.runtime.assets.Assets;

import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package example.arena;

import com.chunkzero.chunk.runtime.SessionScope;
import com.chunkzero.chunk.multistom.SessionScope;

import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import com.chunkzero.chunk.backend.client.WatchState;
import com.chunkzero.chunk.generated.BackendClient;
import com.chunkzero.chunk.generated.BackendTypes.Shared.Stats.LeaderboardResultItem;
import com.chunkzero.chunk.runtime.SessionScope;
import com.chunkzero.chunk.multistom.SessionScope;

import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package example.lobby;

import com.chunkzero.chunk.runtime.ChunkMinestom;
import com.chunkzero.chunk.multistom.ChunkMinestom;
import com.chunkzero.chunk.multistom.SessionProvider;
import com.chunkzero.chunk.runtime.ChunkProcess;
import com.chunkzero.chunk.runtime.SessionProvider;
import com.chunkzero.chunk.runtime.SessionType;

import net.minestom.server.ServerProcess;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
import com.chunkzero.chunk.generated.BackendClient;
import com.chunkzero.chunk.generated.BackendTypes.Shared.Stats.MineResult;
import com.chunkzero.chunk.generated.Worlds;
import com.chunkzero.chunk.runtime.Session;
import com.chunkzero.chunk.runtime.SessionScope;
import com.chunkzero.chunk.runtime.assets.Assets;
import com.chunkzero.chunk.multistom.Session;
import com.chunkzero.chunk.multistom.SessionScope;
import com.chunkzero.chunk.multistom.assets.Assets;

import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package example.lobby;

import com.chunkzero.chunk.generated.Destinations;
import com.chunkzero.chunk.multistom.SessionScope;
import com.chunkzero.chunk.runtime.MoveResult;
import com.chunkzero.chunk.runtime.SessionScope;

import net.kyori.adventure.sound.Sound;
import net.kyori.adventure.text.Component;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@ package com.chunkzero.chunk.example.load

import com.chunkzero.chunk.example.load.generated.BackendTypes
import com.chunkzero.chunk.example.load.generated.CoroutineBackendClient
import com.chunkzero.chunk.runtime.ChunkMinestom
import com.chunkzero.chunk.multistom.ChunkMinestom
import com.chunkzero.chunk.multistom.CoroutineSession
import com.chunkzero.chunk.multistom.SessionProvider
import com.chunkzero.chunk.multistom.SessionScope
import com.chunkzero.chunk.multistom.coroutines
import com.chunkzero.chunk.multistom.own
import com.chunkzero.chunk.runtime.ChunkProcess
import com.chunkzero.chunk.runtime.CoroutineSession
import com.chunkzero.chunk.runtime.SessionProvider
import com.chunkzero.chunk.runtime.SessionScope
import com.chunkzero.chunk.runtime.SessionType
import com.chunkzero.chunk.runtime.coroutines
import com.chunkzero.chunk.runtime.own
import kotlinx.coroutines.launch
import net.minestom.server.ServerProcess
import net.minestom.server.entity.Player
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ package com.chunkzero.chunk.example.arena
import com.chunkzero.chunk.example.ExampleSessions
import com.chunkzero.chunk.example.generated.ArenaSessionProviders
import com.chunkzero.chunk.example.generated.SessionConfigs
import com.chunkzero.chunk.runtime.ChunkMinestom
import com.chunkzero.chunk.multistom.ChunkMinestom
import com.chunkzero.chunk.multistom.SessionCreation
import com.chunkzero.chunk.runtime.ChunkProcess
import com.chunkzero.chunk.runtime.SessionCreation
import com.chunkzero.chunk.runtime.SessionType
import net.minestom.server.ServerProcess

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.chunkzero.chunk.example.lobby

import com.chunkzero.chunk.example.ExampleSessions
import com.chunkzero.chunk.runtime.ChunkMinestom
import com.chunkzero.chunk.multistom.ChunkMinestom
import com.chunkzero.chunk.multistom.SessionProvider
import com.chunkzero.chunk.runtime.ChunkProcess
import com.chunkzero.chunk.runtime.SessionProvider
import com.chunkzero.chunk.runtime.SessionType
import net.minestom.server.ServerProcess

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ import com.chunkzero.chunk.backend.client.QueryResult
import com.chunkzero.chunk.example.generated.CoroutineBackendClient
import com.chunkzero.chunk.example.generated.Destinations
import com.chunkzero.chunk.example.generated.SessionMethods
import com.chunkzero.chunk.runtime.CoroutineSession
import com.chunkzero.chunk.multistom.CoroutineSession
import com.chunkzero.chunk.multistom.Session
import com.chunkzero.chunk.multistom.SessionScope
import com.chunkzero.chunk.multistom.coroutines
import com.chunkzero.chunk.runtime.MoveResult
import com.chunkzero.chunk.runtime.Session
import com.chunkzero.chunk.runtime.SessionScope
import com.chunkzero.chunk.runtime.coroutines
import kotlinx.coroutines.flow.distinctUntilChangedBy
import kotlinx.coroutines.launch
import net.kyori.adventure.text.Component
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.chunkzero.chunk.runtime;
package com.chunkzero.chunk.multistom;

import static org.junit.jupiter.api.Assertions.*;

Expand All @@ -9,13 +9,15 @@
import chunk.sync.v1.CoreOuterClass.Position;
import chunk.sync.v1.CoreOuterClass.SubscribeRequest;
import chunk.sync.v1.CoreOuterClass.Update;
import chunk.sync.v1.Gateway.PlayerIdentity;
import chunk.sync.v1.Jvm.JvmDelivery;
import chunk.sync.v1.Jvm.JvmSession;

import com.chunkzero.chunk.backend.api.SessionId;
import com.chunkzero.chunk.backend.client.BackendSession;
import com.chunkzero.chunk.backend.client.SessionIdentity;
import com.chunkzero.chunk.example.ExampleSessions;
import com.chunkzero.chunk.runtime.TestHosts;
import com.google.protobuf.ByteString;

import io.grpc.ManagedChannelBuilder;
Expand Down Expand Up @@ -112,20 +114,24 @@ public void subscribe(
new SessionRegistration(
"arena",
() -> ExampleSessions.INSTANCE.arena("Arena"))),
(session, app) ->
Map.of());
var host =
TestHosts.detached(
manager,
session ->
BackendSession.overCore(
channel,
"test-credential-with-at-least-32-bytes",
"build",
new SessionIdentity(
new SessionId(session), app, Optional.empty()),
new SessionId(session), session, Optional.empty()),
scheduler,
Duration.ofSeconds(5)));
var lobby = session("lobby");
var arena = session("arena");
try {
await(ticks, manager.create("lobby", lobby));
await(ticks, manager.create("arena", arena));
await(ticks, TestHosts.create(host, "lobby", lobby));
await(ticks, TestHosts.create(host, "arena", arena));
var uuid = UUID.randomUUID();
long generation = 0;
for (var destination : List.of("lobby", "arena", "arena")) {
Expand All @@ -142,8 +148,17 @@ public SocketAddress getRemoteAddress() {
};
connection.setClientState(ConnectionState.PLAY);
var player = new ManagedPlayer(connection, new GameProfile(uuid, "player"));
player.setBinding(
"delivery", JvmDelivery.newBuilder().setGeneration(at(generation)).build());
player.setDelivery(
TestHosts.delivery(
"delivery",
JvmDelivery.newBuilder()
.setSession(destination)
.setGeneration(at(generation))
.setPlayer(
PlayerIdentity.newBuilder()
.setUuid(uuid.toString())
.setUsername("player"))
.build()));
var managed = manager.get(destination);
try {
await(ticks, managed.join(player));
Expand All @@ -165,8 +180,8 @@ public SocketAddress getRemoteAddress() {
}
} finally {
try {
await(ticks, manager.finish("lobby", lobby));
await(ticks, manager.finish("arena", arena));
await(ticks, TestHosts.finish(host, "lobby", lobby));
await(ticks, TestHosts.finish(host, "arena", arena));
} finally {
channel.shutdownNow().awaitTermination(3, TimeUnit.SECONDS);
server.shutdownNow().awaitTermination(3, TimeUnit.SECONDS);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.chunkzero.chunk.runtime;

import chunk.sync.v1.Jvm.JvmDelivery;
import chunk.sync.v1.Jvm.JvmSession;
import chunk.sync.v1.Jvm.JvmSessionStatus;

import com.chunkzero.chunk.backend.client.BackendSession;

import java.util.concurrent.CompletableFuture;
import java.util.function.Function;

/** Test bridge to the package-private parts of {@link ChunkSessions} and {@link Delivery}. */
public final class TestHosts {
private TestHosts() {}

public static ChunkSessions detached(
SessionHandler handler, Function<String, BackendSession> backends) {
return ChunkSessions.detached(handler, backends);
}

public static CompletableFuture<JvmSessionStatus> create(
ChunkSessions host, String id, JvmSession session) {
return host.create(id, session);
}

public static CompletableFuture<JvmSessionStatus> finish(
ChunkSessions host, String id, JvmSession session) {
return host.finish(id, session);
}

public static Delivery delivery(String id, JvmDelivery spec) {
return new Delivery(null, id, spec, 0);
}
}
Loading
Loading