feat: v2 Phase 1 — foundation, proto schemas, RPC framework, SDK skeleton
New workspace structure with 9 crates. Adds: - proto/qpq/v1/*.proto: 11 protobuf schemas covering all 33 RPC methods - quicproquo-proto: dual codegen (capnp legacy + prost v2) - quicproquo-rpc: QUIC RPC framework (framing, server, client, middleware) - quicproquo-sdk: client SDK (QpqClient, events, conversation store) - quicproquo-server/domain/: protocol-agnostic domain types and services - justfile: build commands Wire format: [method_id:u16][req_id:u32][len:u32][protobuf] per QUIC stream. All 151 existing tests pass. Backward compatible with v1 capnp code.
This commit is contained in:
@@ -1,51 +1,30 @@
|
||||
//! Build script for quicproquo-proto.
|
||||
//!
|
||||
//! Invokes the `capnp` compiler to generate Rust types from `.capnp` schemas
|
||||
//! located in the workspace-root `schemas/` directory.
|
||||
//!
|
||||
//! # Prerequisites
|
||||
//!
|
||||
//! The `capnp` CLI must be installed and on `PATH`.
|
||||
//!
|
||||
//! Debian/Ubuntu: apt-get install capnproto
|
||||
//! macOS: brew install capnp
|
||||
//! Docker: see docker/Dockerfile
|
||||
//! Runs two code generators:
|
||||
//! 1. Cap'n Proto (v1 legacy) — from `schemas/*.capnp`
|
||||
//! 2. Protobuf/prost (v2) — from `proto/qpq/v1/*.proto`
|
||||
|
||||
use std::{env, path::PathBuf};
|
||||
|
||||
fn main() {
|
||||
let manifest_dir =
|
||||
PathBuf::from(env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set by Cargo"));
|
||||
// Vendor protoc from protobuf-src so the build doesn't require system protoc.
|
||||
std::env::set_var("PROTOC", protobuf_src::protoc());
|
||||
|
||||
// Workspace root is two levels above this crate (quicproquo/crates/quicproquo-proto).
|
||||
let manifest_dir =
|
||||
PathBuf::from(env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR"));
|
||||
let workspace_root = manifest_dir
|
||||
.join("../..")
|
||||
.canonicalize()
|
||||
.expect("could not canonicalize workspace root path");
|
||||
.expect("canonicalize workspace root");
|
||||
|
||||
// ── v1: Cap'n Proto codegen ──────────────────────────────────────────────
|
||||
let schemas_dir = workspace_root.join("schemas");
|
||||
|
||||
// Re-run this build script whenever any schema file changes.
|
||||
println!(
|
||||
"cargo:rerun-if-changed={}",
|
||||
schemas_dir.join("auth.capnp").display()
|
||||
);
|
||||
println!(
|
||||
"cargo:rerun-if-changed={}",
|
||||
schemas_dir.join("delivery.capnp").display()
|
||||
);
|
||||
println!(
|
||||
"cargo:rerun-if-changed={}",
|
||||
schemas_dir.join("node.capnp").display()
|
||||
);
|
||||
println!(
|
||||
"cargo:rerun-if-changed={}",
|
||||
schemas_dir.join("federation.capnp").display()
|
||||
);
|
||||
for schema in &["auth.capnp", "delivery.capnp", "node.capnp", "federation.capnp"] {
|
||||
println!("cargo:rerun-if-changed={}", schemas_dir.join(schema).display());
|
||||
}
|
||||
|
||||
capnpc::CompilerCommand::new()
|
||||
// Treat `schemas/` as the include root so that inter-schema imports
|
||||
// resolve correctly.
|
||||
.src_prefix(&schemas_dir)
|
||||
.file(schemas_dir.join("auth.capnp"))
|
||||
.file(schemas_dir.join("delivery.capnp"))
|
||||
@@ -56,4 +35,32 @@ fn main() {
|
||||
"Cap'n Proto schema compilation failed. \
|
||||
Is `capnp` installed? (apt-get install capnproto / brew install capnp)",
|
||||
);
|
||||
|
||||
// ── v2: Protobuf/prost codegen ───────────────────────────────────────────
|
||||
let proto_dir = workspace_root.join("proto");
|
||||
|
||||
let proto_files = [
|
||||
"qpq/v1/common.proto",
|
||||
"qpq/v1/auth.proto",
|
||||
"qpq/v1/delivery.proto",
|
||||
"qpq/v1/keys.proto",
|
||||
"qpq/v1/channel.proto",
|
||||
"qpq/v1/user.proto",
|
||||
"qpq/v1/blob.proto",
|
||||
"qpq/v1/device.proto",
|
||||
"qpq/v1/p2p.proto",
|
||||
"qpq/v1/federation.proto",
|
||||
"qpq/v1/push.proto",
|
||||
];
|
||||
|
||||
let full_paths: Vec<PathBuf> = proto_files.iter().map(|f| proto_dir.join(f)).collect();
|
||||
|
||||
for path in &full_paths {
|
||||
println!("cargo:rerun-if-changed={}", path.display());
|
||||
}
|
||||
|
||||
prost_build::Config::new()
|
||||
.out_dir(PathBuf::from(env::var("OUT_DIR").expect("OUT_DIR")))
|
||||
.compile_protos(&full_paths, &[&proto_dir])
|
||||
.expect("prost compile_protos failed");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user