From 0c486796ab38d6dbad99c9e724d1f1eb7c6b8c6d Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 17 Aug 2026 22:41:36 +0200 Subject: [PATCH] Add provider-owned Eve navigation receipts --- .../dist/generated/command-receipt.d.ts | 7 ++++ .../eve-contracts/dist/generated/schemas.d.ts | 29 +++++++++++++++ .../eve-contracts/dist/generated/schemas.js | 32 ++++++++++++++++ .../src/generated/command-receipt.ts | 7 ++++ .../eve-contracts/src/generated/schemas.ts | 32 ++++++++++++++++ .../Runtime/EveProviderDocuments.cs | 37 ++++++++++++++++--- .../org.gamecult.eve.surface/package.json | 2 +- ...amecult.eve.command_receipt.v1.schema.json | 32 ++++++++++++++++ ...eSurfaceSerializationCompatibilityTests.cs | 35 +++++++++++++++++- 9 files changed, 206 insertions(+), 7 deletions(-) diff --git a/packages/eve-contracts/dist/generated/command-receipt.d.ts b/packages/eve-contracts/dist/generated/command-receipt.d.ts index c0c695b..7c6c6c4 100644 --- a/packages/eve-contracts/dist/generated/command-receipt.d.ts +++ b/packages/eve-contracts/dist/generated/command-receipt.d.ts @@ -14,5 +14,12 @@ export interface EveCommandReceipt { }[]; issuedAtUtc?: string; sourceVersion: number; + navigation?: { + verseId: string; + providerId?: string; + surfaceId: string; + surfaceKind?: string; + rendezvousEndpoints?: string[]; + }; [k: string]: any; } diff --git a/packages/eve-contracts/dist/generated/schemas.d.ts b/packages/eve-contracts/dist/generated/schemas.d.ts index 157cb96..0a823e6 100644 --- a/packages/eve-contracts/dist/generated/schemas.d.ts +++ b/packages/eve-contracts/dist/generated/schemas.d.ts @@ -622,6 +622,35 @@ export declare const eveContractSchemas: { readonly type: "integer"; readonly minimum: 0; }; + readonly navigation: { + readonly type: "object"; + readonly required: readonly ["verseId", "surfaceId"]; + readonly properties: { + readonly verseId: { + readonly type: "string"; + readonly minLength: 1; + }; + readonly providerId: { + readonly type: "string"; + }; + readonly surfaceId: { + readonly type: "string"; + readonly minLength: 1; + }; + readonly surfaceKind: { + readonly type: "string"; + }; + readonly rendezvousEndpoints: { + readonly type: "array"; + readonly items: { + readonly type: "string"; + readonly minLength: 1; + }; + readonly uniqueItems: true; + }; + }; + readonly additionalProperties: false; + }; }; readonly additionalProperties: true; }; diff --git a/packages/eve-contracts/dist/generated/schemas.js b/packages/eve-contracts/dist/generated/schemas.js index 50baf5d..88188b2 100644 --- a/packages/eve-contracts/dist/generated/schemas.js +++ b/packages/eve-contracts/dist/generated/schemas.js @@ -745,6 +745,38 @@ export const eveContractSchemas = { "sourceVersion": { "type": "integer", "minimum": 0 + }, + "navigation": { + "type": "object", + "required": [ + "verseId", + "surfaceId" + ], + "properties": { + "verseId": { + "type": "string", + "minLength": 1 + }, + "providerId": { + "type": "string" + }, + "surfaceId": { + "type": "string", + "minLength": 1 + }, + "surfaceKind": { + "type": "string" + }, + "rendezvousEndpoints": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "uniqueItems": true + } + }, + "additionalProperties": false } }, "additionalProperties": true diff --git a/packages/eve-contracts/src/generated/command-receipt.ts b/packages/eve-contracts/src/generated/command-receipt.ts index 61ec04f..46a6db4 100644 --- a/packages/eve-contracts/src/generated/command-receipt.ts +++ b/packages/eve-contracts/src/generated/command-receipt.ts @@ -16,5 +16,12 @@ diagnostics?: { }[] issuedAtUtc?: string sourceVersion: number +navigation?: { +verseId: string +providerId?: string +surfaceId: string +surfaceKind?: string +rendezvousEndpoints?: string[] +} [k: string]: any } diff --git a/packages/eve-contracts/src/generated/schemas.ts b/packages/eve-contracts/src/generated/schemas.ts index b3696e2..a77d3e3 100644 --- a/packages/eve-contracts/src/generated/schemas.ts +++ b/packages/eve-contracts/src/generated/schemas.ts @@ -745,6 +745,38 @@ export const eveContractSchemas = { "sourceVersion": { "type": "integer", "minimum": 0 + }, + "navigation": { + "type": "object", + "required": [ + "verseId", + "surfaceId" + ], + "properties": { + "verseId": { + "type": "string", + "minLength": 1 + }, + "providerId": { + "type": "string" + }, + "surfaceId": { + "type": "string", + "minLength": 1 + }, + "surfaceKind": { + "type": "string" + }, + "rendezvousEndpoints": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "uniqueItems": true + } + }, + "additionalProperties": false } }, "additionalProperties": true diff --git a/packages/org.gamecult.eve.surface/Runtime/EveProviderDocuments.cs b/packages/org.gamecult.eve.surface/Runtime/EveProviderDocuments.cs index eb7cd62..dc7440a 100644 --- a/packages/org.gamecult.eve.surface/Runtime/EveProviderDocuments.cs +++ b/packages/org.gamecult.eve.surface/Runtime/EveProviderDocuments.cs @@ -364,8 +364,9 @@ namespace GameCult.Eve.Surface string surfaceId, string message, string issuedAtUtc, - long sourceVersion) - : this(SchemaId, receiptId, commandId, command, state, ownerRepo, authority, providerId, surfaceId, message, issuedAtUtc, sourceVersion) + long sourceVersion, + EveSurfaceNavigationTarget? navigation = null) + : this(SchemaId, receiptId, commandId, command, state, ownerRepo, authority, providerId, surfaceId, message, issuedAtUtc, sourceVersion, navigation) { } @@ -382,7 +383,8 @@ namespace GameCult.Eve.Surface string surfaceId, string message, string issuedAtUtc, - long sourceVersion) + long sourceVersion, + EveSurfaceNavigationTarget? navigation = null) { Schema = string.IsNullOrWhiteSpace(schema) ? SchemaId : schema; ReceiptId = receiptId ?? ""; @@ -396,6 +398,7 @@ namespace GameCult.Eve.Surface Message = message ?? ""; IssuedAtUtc = issuedAtUtc ?? ""; SourceVersion = sourceVersion; + Navigation = navigation; } [Key(0)] public string Schema { get; } @@ -410,7 +413,31 @@ namespace GameCult.Eve.Surface [Key(9)] public string Message { get; } [Key(10)] public string IssuedAtUtc { get; } [Key(11)] public long SourceVersion { get; } + [Key(12)] public EveSurfaceNavigationTarget? Navigation { get; } + } + + [MessagePackObject] + public sealed class EveSurfaceNavigationTarget + { + [SerializationConstructor] + public EveSurfaceNavigationTarget( + string verseId, + string providerId, + string surfaceId, + string surfaceKind, + string[]? rendezvousEndpoints = null) + { + VerseId = verseId ?? ""; + ProviderId = providerId ?? ""; + SurfaceId = surfaceId ?? ""; + SurfaceKind = surfaceKind ?? ""; + RendezvousEndpoints = rendezvousEndpoints ?? Array.Empty(); + } + + [Key(0)] public string VerseId { get; } + [Key(1)] public string ProviderId { get; } + [Key(2)] public string SurfaceId { get; } + [Key(3)] public string SurfaceKind { get; } + [Key(4)] public string[] RendezvousEndpoints { get; } } } - - diff --git a/packages/org.gamecult.eve.surface/package.json b/packages/org.gamecult.eve.surface/package.json index 19de395..110f784 100644 --- a/packages/org.gamecult.eve.surface/package.json +++ b/packages/org.gamecult.eve.surface/package.json @@ -1,7 +1,7 @@ { "name": "org.gamecult.eve.surface", "displayName": "Eve Surface Contract", - "version": "0.3.0", + "version": "0.3.1", "unity": "2021.3", "description": "Renderer-neutral C# contracts and builders for gamecult.eve.surface.v1 documents.", "dependencies": { diff --git a/schemas/gamecult.eve.command_receipt.v1.schema.json b/schemas/gamecult.eve.command_receipt.v1.schema.json index c307f1c..90ea3fb 100644 --- a/schemas/gamecult.eve.command_receipt.v1.schema.json +++ b/schemas/gamecult.eve.command_receipt.v1.schema.json @@ -68,6 +68,38 @@ "sourceVersion": { "type": "integer", "minimum": 0 + }, + "navigation": { + "type": "object", + "required": [ + "verseId", + "surfaceId" + ], + "properties": { + "verseId": { + "type": "string", + "minLength": 1 + }, + "providerId": { + "type": "string" + }, + "surfaceId": { + "type": "string", + "minLength": 1 + }, + "surfaceKind": { + "type": "string" + }, + "rendezvousEndpoints": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "uniqueItems": true + } + }, + "additionalProperties": false } }, "additionalProperties": true diff --git a/tests/GameCult.Eve.Surface.Serialization.Tests/EveSurfaceSerializationCompatibilityTests.cs b/tests/GameCult.Eve.Surface.Serialization.Tests/EveSurfaceSerializationCompatibilityTests.cs index 40fd3d0..22d4417 100644 --- a/tests/GameCult.Eve.Surface.Serialization.Tests/EveSurfaceSerializationCompatibilityTests.cs +++ b/tests/GameCult.Eve.Surface.Serialization.Tests/EveSurfaceSerializationCompatibilityTests.cs @@ -169,6 +169,40 @@ public sealed class EveSurfaceSerializationCompatibilityTests }); } + [Test] + public void CommandReceiptCarriesRendererNeutralNavigationTarget() + { + var document = new EveCommandReceiptDocument( + "receipt:launch", + "launch", + "aetheria.hangar.launch", + "accepted", + "Aetheria", + "commander-daemon", + "aetheria.daemon", + "aetheria.hangar", + "", + "2026-08-17T20:00:00Z", + 42, + new EveSurfaceNavigationTarget( + "gamecult.aetheria", + "aetheria.daemon", + "aetheria.pilot", + "interactive-world", + new[] { "cultnet+tcp://odin.gamecult.example:3076" })); + + var bytes = MessagePackSerializer.Serialize(document, Options); + var reader = new MessagePackReader(bytes); + var restored = MessagePackSerializer.Deserialize(bytes, Options); + + Assert.That(reader.ReadArrayHeader(), Is.EqualTo(13)); + Assert.That(restored.Navigation, Is.Not.Null); + Assert.That(restored.Navigation!.VerseId, Is.EqualTo("gamecult.aetheria")); + Assert.That(restored.Navigation.SurfaceId, Is.EqualTo("aetheria.pilot")); + Assert.That(restored.Navigation.SurfaceKind, Is.EqualTo("interactive-world")); + Assert.That(restored.Navigation.RendezvousEndpoints, Is.EqualTo(new[] { "cultnet+tcp://odin.gamecult.example:3076" })); + } + private static EveSurfaceDocument CreateCurrentDocument() => new( "current-provider", "current-kind", @@ -265,4 +299,3 @@ public sealed class EveSurfaceSerializationCompatibilityTests return buffer.WrittenSpan.ToArray(); } } -