valinor-wire
Wire protocol codec for MudWorld client-server communication.
Purpose
valinor-wire provides a transport-agnostic message envelope format and codec for encoding/decoding messages between MudWorld clients and servers. It abstracts the serialization format (JSON or binary) behind a unified API, enabling format negotiation during connection handshake.
When to Use This Crate
- Building a WebSocket handler that needs to encode/decode messages
- Implementing a client library that communicates with MudWorld servers
- Adding support for a new transport layer
- Working with request/response patterns over bidirectional connections
Installation
Add to your Cargo.toml:
[]
= { = "../valinor-wire" }
Or if published:
[]
= "0.1"
API Overview
Core Types
| Type | Description |
|---|---|
Envelope |
Message wrapper containing type, optional request ID, and JSON payload |
WireCodec |
Encoder/decoder supporting JSON and Protobuf formats |
WireFormat |
Format selection enum (Json, Protobuf) |
ContentType |
HTTP content-type header negotiation helper |
EnvelopeError |
Error type for encoding/decoding failures |
Envelope
The Envelope struct is the standard message container:
Factory methods:
Envelope::request()- Create a request expecting a responseEnvelope::response()- Create a response to a requestEnvelope::event()- Create a fire-and-forget eventEnvelope::error()- Create an error response
WireCodec
The codec handles serialization:
Usage Examples
Sending an Event
use ;
use json;
// Create a chat message event
let envelope = event;
// Encode for transmission
let codec = json;
let bytes = codec.encode.expect;
// Send bytes over WebSocket...
Request/Response Pattern
use ;
use json;
// Create a request with correlation ID
let request = request;
let codec = json;
let bytes = codec.encode.expect;
// Later, when response arrives...
let response_bytes: & = /* received from server */;
let response = codec.decode.expect;
if response.request_id == Some
Creating Error Responses
use Envelope;
use json;
// Error with correlation to original request
let error = error;
// Error without request context (e.g., protocol violation)
let protocol_error = error;
Content-Type Negotiation
use ;
// Parse from HTTP header
let content_type = from_header;
assert_eq!;
// Create codec based on negotiated format
let codec = match content_type ;
// Get header value for responses
let header = Json.to_header;
assert_eq!;
Binary (Protobuf) Format
The binary format is optimized for game state updates where payload is already serialized protobuf:
use ;
use STANDARD;
use Engine;
// Binary payloads must be base64-encoded strings
let protobuf_bytes: = vec!;
let payload_b64 = STANDARD.encode;
let envelope = event;
let codec = protobuf;
let wire_bytes = codec.encode.expect;
// Binary format: [2-byte type length][type bytes][payload bytes]
// More compact than JSON for binary payloads
Wire Format Details
JSON Format
Standard JSON serialization:
Binary Format
Compact binary encoding for protobuf payloads:
[u16 big-endian: type length][type bytes][raw payload bytes]
Note: Binary format does not support request_id. Use JSON for request/response patterns.
Related Crates
| Crate | Relationship |
|---|---|
valinor-proto |
Protobuf message definitions used as payloads |
valinor-router |
Message routing that dispatches decoded envelopes |
valinor-session |
Session management using wire protocol |
valinor-worker |
Cloudflare Worker that uses this codec |
License
MIT