Invoke typed operations through retained clients
This commit is contained in:
parent
0943128365
commit
e49f93f56d
8 changed files with 268 additions and 24 deletions
|
|
@ -208,7 +208,29 @@ static async Task RunHeadlessAsync(Args arguments)
|
|||
Console.WriteLine("HEADLESS_READY " + JsonSerializer.Serialize(new { count = initial.Count }));
|
||||
}
|
||||
if (initial.Count >= arguments.ExpectedCount) completion.TrySetResult();
|
||||
await completion.Task.WaitAsync(TimeSpan.FromSeconds(45));
|
||||
var commandTask = Task.Run(async () =>
|
||||
{
|
||||
var line = await Console.In.ReadLineAsync();
|
||||
if (line == null || !line.StartsWith("INVOKE ", StringComparison.Ordinal))
|
||||
throw new InvalidOperationException("The headless sample expected 'INVOKE <idempotency-key>' on stdin.");
|
||||
var commandId = line["INVOKE ".Length..].Trim();
|
||||
var result = await mesh.InvokeAsync<IncrementRequest, IncrementReceipt>(
|
||||
arguments.VerseId,
|
||||
"sample.counter",
|
||||
"sample.counter.increment",
|
||||
"sample.increment.v1",
|
||||
"gamecult.eve.command_receipt.v1",
|
||||
new IncrementRequest { Amount = 1 },
|
||||
sourceRuntimeId: "sample.csharp",
|
||||
idempotencyKey: commandId);
|
||||
Console.WriteLine("HEADLESS_RECEIPT " + JsonSerializer.Serialize(new
|
||||
{
|
||||
receiptId = result.Value.ReceiptId,
|
||||
count = result.Value.Count,
|
||||
status = result.Status
|
||||
}));
|
||||
});
|
||||
await Task.WhenAll(completion.Task, commandTask).WaitAsync(TimeSpan.FromSeconds(45));
|
||||
}
|
||||
|
||||
static EveSurfaceDocument CreateCounterSurface()
|
||||
|
|
|
|||
|
|
@ -7,8 +7,9 @@ This is the real-process continuation of `samples/eve-two-runtime`:
|
|||
- one real Chromium page leases both documents through `cultmesh-browser` and
|
||||
lowers the provider-owned Eve surface;
|
||||
- one retained C# headless client discovers the provider through the same Odin
|
||||
identity, observes the typed counter and canonical receipt ids, and survives
|
||||
the provider route replacement without application reconnect code;
|
||||
identity, observes the typed counter and canonical receipt ids, survives the
|
||||
provider route replacement, and invokes through the generic CultMesh client
|
||||
without application transport or reconnect code;
|
||||
- one separate local Odin fixture answers the canonical CultMesh Verse catalog
|
||||
over binary CultNet WebSocket messages;
|
||||
- the browser and C# clients speak the same binary CultNet schema-v0 WebSocket
|
||||
|
|
@ -26,12 +27,12 @@ directly only to diagnose the network layer. Browser discovery is portable:
|
|||
`CHROME_PATH` wins when configured, then common Chrome/Chromium/Edge locations
|
||||
and Playwright's installed Chromium are checked.
|
||||
|
||||
The verifier clicks the Eve button twice with one idempotency key, requires one
|
||||
state transition, restarts the provider on a different physical port, updates
|
||||
the local Odin fixture, and requires the still-open browser to rediscover the
|
||||
route, resubscribe, execute a second command, and preserve the durable count.
|
||||
The retained C# lease independently rediscovers the same replacement route and
|
||||
observes both canonical receipt ids.
|
||||
The verifier clicks the Eve button twice with one idempotency key and requires
|
||||
one state transition. It then restarts the provider on a different physical
|
||||
port, updates the local Odin fixture, and requires both retained clients to
|
||||
rediscover and resubscribe. The C# client invokes the second command through
|
||||
`CultMeshClient.InvokeAsync`; Chromium observes the resulting count and both
|
||||
clients observe both canonical receipt ids.
|
||||
The fixture speaks the production Verse-catalog contract; a deployment smoke
|
||||
against the full Odin daemon remains a separate infrastructure gate.
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue