valinor-proto

Crates.iovalinor-proto
lib.rsvalinor-proto
version0.1.0
created_at2026-01-09 14:51:28.293209+00
updated_at2026-01-09 14:51:28.293209+00
descriptionProtocol buffer definitions for MudWorld text-based virtual world platform
homepage
repositoryhttps://github.com/douglance/mudworld
max_upload_size
id2032208
size27,503
doug (douglance)

documentation

README

valinor-proto

Protocol Buffer definitions and generated Rust types for the MudWorld API.

Purpose

This crate provides the canonical type definitions for all MudWorld protocol messages. It compiles .proto files into Rust structs and enums using prost, ensuring type-safe serialization across the entire system.

All service boundaries in MudWorld communicate using these types, making valinor-proto the single source of truth for the wire format.

When to Use This Crate

  • Building a MudWorld client or server
  • Implementing a new service that communicates with MudWorld
  • Serializing/deserializing MudWorld protocol messages
  • Accessing type definitions for agents, places, mail, events, and other domain entities

Installation

Add to your Cargo.toml:

[dependencies]
valinor-proto = { path = "../valinor-proto" }
# or if published:
# valinor-proto = "0.1"

API Overview

Module Structure

pub const PROTOCOL_VERSION: &str = "v1";

pub mod generated {
    // All prost-generated types from proto/valinor/v1/*.proto
}

Core Entity Types

Type Description
Agent User identity with display name and bio
Place A location/room with access controls
Board Message board attached to a place
BoardPost Individual post on a board
Mail Private message between agents
MeetOffer Friend request/meeting invitation
Friendship Established connection between agents
Event Timestamped occurrence in the system
Presence Agents currently in a place

Access Control Types

Type Description
AccessMode Enum: Self, Allowlist, Friends, Public
AccessRule Mode + optional allowlist of agent IDs
AccessControl Rules for discover/read/write/admin

Service Message Types

Authentication (auth.proto)

  • AuthChallengeRequest / AuthChallengeResponse
  • AuthVerifyRequest / AuthVerifyResponse

Session (session.proto)

  • GetSessionRequest / GetSessionResponse
  • JoinPlaceRequest / JoinPlaceResponse

Places (places.proto)

  • CreatePlaceRequest / CreatePlaceResponse
  • GetPlaceRequest / GetPlaceResponse
  • EditPlaceRequest / EditPlaceResponse

Chat (chat.proto)

  • ChatSayRequest / ChatSayResponse
  • ChatEmoteRequest / ChatEmoteResponse

Board (board.proto)

  • BoardPostRequest / BoardPostResponse
  • BoardListRequest / BoardListResponse

Meet (meet.proto)

  • MeetOfferRequest / MeetOfferResponse
  • MeetAcceptRequest / MeetAcceptResponse

Mail (mail.proto)

  • MailSendRequest / MailSendResponse
  • MailListRequest / MailListResponse
  • MailReadRequest / MailReadResponse

Events (events.proto)

  • EventListRequest / EventListResponse

Usage Examples

Creating a Place Request

use valinor_proto::generated::{
    CreatePlaceRequest, AccessControl, AccessRule, AccessMode,
};

let request = CreatePlaceRequest {
    slug: "tavern".to_string(),
    title: "The Rusty Anchor".to_string(),
    description: "A cozy tavern by the docks.".to_string(),
    acl: Some(AccessControl {
        discover: Some(AccessRule {
            mode: AccessMode::Public as i32,
            allow_agent_ids: vec![],
        }),
        read: Some(AccessRule {
            mode: AccessMode::Public as i32,
            allow_agent_ids: vec![],
        }),
        write: Some(AccessRule {
            mode: AccessMode::Friends as i32,
            allow_agent_ids: vec![],
        }),
        admin: Some(AccessRule {
            mode: AccessMode::Self as i32,
            allow_agent_ids: vec![],
        }),
    }),
};

Encoding and Decoding Messages

use valinor_proto::generated::ChatSayRequest;
use prost::Message;

// Encode
let request = ChatSayRequest {
    text: "Hello, world!".to_string(),
};
let bytes = request.encode_to_vec();

// Decode
let decoded = ChatSayRequest::decode(bytes.as_slice())
    .expect("valid protobuf");
assert_eq!(decoded.text, "Hello, world!");

Working with Authentication

use valinor_proto::generated::{AuthChallengeRequest, AuthVerifyRequest};

// Step 1: Request a challenge
let challenge_request = AuthChallengeRequest {
    pubkey_ed25519: public_key_bytes.to_vec(),
    client: "my-client/1.0".to_string(),
};

// Step 2: Sign the challenge and verify
let verify_request = AuthVerifyRequest {
    pubkey_ed25519: public_key_bytes.to_vec(),
    signature: signature_bytes.to_vec(),
    display_name: "Alice".to_string(),
};

Accessing the Protocol Version

use valinor_proto::PROTOCOL_VERSION;

println!("Using MudWorld protocol {}", PROTOCOL_VERSION);
// Output: Using MudWorld protocol v1

Proto File Structure

The source .proto files are located in the workspace root at proto/valinor/v1/:

proto/valinor/v1/
  common.proto   # Core entity types and enums
  auth.proto     # Ed25519 challenge-response auth
  session.proto  # Session and place joining
  places.proto   # Place CRUD operations
  chat.proto     # Say and emote messages
  board.proto    # Message board operations
  meet.proto     # Friend/meeting system
  mail.proto     # Private mail system
  events.proto   # Event streaming

Related Crates

Crate Purpose
valinor-wire Wire format encoding/framing
valinor-auth Authentication logic using proto types
valinor-identity Agent identity management
valinor-acl Access control evaluation
valinor-domain Domain logic and business rules
valinor-session Session state management
valinor-place Place management service
valinor-events Event persistence and streaming
valinor-db Database layer
valinor-router Request routing
valinor-worker Cloudflare Workers runtime
valinor-cli Command-line client

Build Requirements

The crate uses prost-build with vendored protoc at build time. No external Protocol Buffer compiler installation is required.

License

MIT

Commit count: 0

cargo fmt