wtclaude 8e018a01e9 feat(store): persist world.ruleset and serve it from GET /ruleset
Protocol 3.0 §5 (docs/link/v3.md). The shard publishes one world.ruleset frame
per connect describing how it is configured; the sidecar folds it into a
singleton row and serves it back.

Store-backed rather than an RPC, for the same reason /guilds and /houses are
(PROTOCOL_2.md §12.2): a rules page that goes blank while the shard restarts is
worse than one that is briefly stale. `{"ruleset": null}` distinguishes "the
shard has never published one" — an old plugin, or Bridge.RulesetEnabled=false —
from a published ruleset, which the website renders differently.

`rev` (the shard's FNV-1a of the body) is kept alongside the JSON so a reader can
tell "same ruleset, re-sent on reconnect" from "the operator changed something"
without diffing.

PROTOCOL_VERSION stays 2. The 2→3 bump is a hard operator-visible cutover and
happens exactly once, at the end of v3 (§4), not per phase.

Smoke-tested against a fake shard on loopback: frame ingested, GET /ruleset
returns it with plugin_connected=false (outage path), and the route sits behind
the gate (409 on a version mismatch, 401 unauthenticated). cargo build + clippy
clean.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-28 11:19:10 -05:00

uo-link — Rust sidecar

The Rust sidecar half of the Runic Gateway bridge. The ServUO shard dials out to this sidecar over a loopback TCP socket (newline-delimited JSON); the sidecar owns the WebSocket + REST API the website consumes, along with auth, buffering, and fan-out.

ServUO plugin (C#, net48)  ──loopback TCP, newline-JSON──►  Rust sidecar  ──WebSocket/JSON──►  website
   (RunicGateway/servuo-plugins)                           >>> THIS REPO <<<

The shard never speaks WebSocket and exposes no port of its own — the sidecar is the only network-facing component, which is what keeps the game unreachable from the internet.

Repo What
thisRunicGateway/link The Rust sidecar (sidecar/).
RunicGateway/servuo-plugins The C# ServUO plugin — the shard side of the bridge (overlay/, patches/, deploy.ps1, test scaffolding).
RunicGateway/docs All project documentation — design docs, protocol spec, integration guide, research.

Layout

Path What
sidecar/ The Rust sidecar crate — terminates the loopback link to the shard, exposes WS + REST to the website. See sidecar/README.md.
.gitea/workflows/release.yml Builds + releases the sidecar binary (Linux + Windows) on every merge to main.

Build & run

The sidecar is a standard cargo crate:

cd sidecar
cargo build --release        # binary at target/release/uo-link-sidecar
cp sidecar.toml.example sidecar.toml   # then edit
cargo run --release

.gitea/workflows/release.yml cross-compiles Linux + Windows binaries and cuts a Gitea release on every merge to main (conventional-commit versioning). See sidecar/README.md for configuration and the wire protocol.

Deployment & compatibility

The plugin (RunicGateway/servuo-plugins) and this sidecar are deployed together but built independently:

  • The plugin is deployed as source into the ServUO server root and compiled by ServUO at boot — no build artifact, no CI build.
  • The sidecar is a standalone Rust binary released from this repo.

The only coupling is the loopback JSON protocol (the shard dials 127.0.0.1). Compatibility is a protocol concern, not a build-order one — keep the event/command catalog in sync across the two repos. Canonical spec: PLAN.md §5/§7 and INTEGRATION.md. Because a wedged or absent sidecar cannot stall the shard, either side can be deployed or restarted independently.


License

Runic Gateway is free software, licensed under the GNU General Public License v3.0 or later — see LICENSE.md.

Copyright (C) 2026 Runic Gateway

This program is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version. It is distributed WITHOUT ANY WARRANTY; without even the implied
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.

Contributions are welcome — please read CONTRIBUTING.md (note the AI-usage disclosure requirement) and our Code of Conduct. Report vulnerabilities privately per SECURITY.md.

Description
No description provided
Readme 947 KiB
v1.0.0 Latest
2026-08-01 06:47:57 +00:00
Languages
Rust 98.1%
Python 1.9%