syntax = "proto3"; package x0gp.v1; option go_package = "github.com/x0gp/server/proto/gen/clientserverpb"; // ============================================================ // Wire protocol between client (browser / mobile) and server. // ============================================================ // // In PoC we use JSON via transport/codec.go. This file is the formal spec // for the binary protobuf wire format we'll switch to in MVP/prod. The // generated code lives in proto/gen/ and will replace transport/. // // Packet envelope (oneof payload): // message Packet { // uint64 seq = 1; // int64 ts_ms = 2; // oneof payload { // ClientHello client_hello = 10; // ServerHello server_hello = 11; // JoinRace join_race = 12; // LeaveRace leave_race = 13; // InputState input_state = 14; // RaceSnapshot race_snapshot = 15; // InputAck input_ack = 16; // Correction correction = 17; // RaceEvent race_event = 18; // Ping ping = 19; // Pong pong = 20; // ErrorMsg error_msg = 21; // ChatMessage chat_message = 22; // } // } // --- Client -> Server --- message ClientHello { string version = 1; string token = 2; // JWT in prod; empty in dev string locale = 3; string client_id = 4; // for reconnect } message JoinRace { string race_id = 1; int32 car_slot = 2; // 0..3 string car_name = 3; } message LeaveRace { string race_id = 1; } // High-rate control packet (60-120 Hz). message InputState { float steering = 1; // -1.0 .. 1.0 float throttle = 2; // 0.0 .. 1.0 float brake = 3; // 0.0 .. 1.0 int32 gear = 4; // -1 reverse, 0 neutral, 1..6 forward uint32 buttons = 5; } message Ping { int64 client_ts_ms = 1; } message ChatMessage { string text = 1; } // --- Server -> Client --- message ServerHello { string session_id = 1; uint64 race_tick = 2; string server_version = 3; ServerConfig config = 4; } message ServerConfig { int32 tick_rate_hz = 1; int32 snapshot_rate_hz = 2; int32 max_cars = 3; } message RaceSnapshot { uint64 tick = 1; int64 ts_ms = 2; double elapsed_s = 3; repeated CarInfo cars = 4; } message CarInfo { string id = 1; string driver_name = 2; double x = 3; // metres double y = 4; // metres double heading = 5; // radians double speed = 6; // m/s int32 lap = 7; int32 sector = 8; // 0..2 int64 last_lap_ms = 9; int64 best_lap_ms = 10; AppliedInput input_applied = 11; bool dnf = 12; } message AppliedInput { double steering = 1; double throttle = 2; double brake = 3; } message InputAck { uint64 seq = 1; int64 applied_at_ms = 2; int64 server_tick_ms = 3; } message Correction { uint64 tick = 1; double delta_steering = 2; double delta_throttle = 3; string reason = 4; } message RaceEvent { string race_id = 1; string event = 2; // "start" | "lap" | "sector" | "dnf" | "finish" | "joined" | "left" string car_id = 3; int32 sector = 4; int64 lap_ms = 5; int64 ts_ms = 6; } message Pong { int64 client_ts_ms = 1; int64 server_ts_ms = 2; } message ErrorMsg { string code = 1; string message = 2; }