Implements the full M1 milestone. Two clients authenticate over TLS 1.3 (guest + Argon2id password) and exchange channel + private text messages through a real server. All five ctest --preset m1-dev tests pass in ~1 s. Key components added: - vcpkg baseline + m1-dev preset (protobuf/mbedTLS/libsodium/asio/sqlite3) - FrameCodec feed+emit, encode/decode_envelope, protobuf codegen - TcpServerConn with blocking TLS handshake thread + tls_read_loop - TlsContext (mbedTLS 1.3, ECDSA-P256 self-signed cert, TOFU on client) - WorkerPool (3 threads, used for Argon2id) - Database: SQLite + libsodium Argon2id, account lifecycle, bootstrap admin - ServerIdentityManager: Ed25519 key + cert generate/persist/fingerprint - ConnSession state machine: WaitingHello -> WaitingAuth -> Authenticated - SessionRegistry: channel tree, user map, text routing, broadcast - vc_client full M1 C ABI: connect/TLS/handshake/auth/text/disconnect - voicecat-admin CLI: account add/reset/del/list - test_m1_integration: M1 exit criterion, verified green Bug fixed: double-framing in ConnSession::send_envelope -- encode_envelope was adding the [4-byte len] prefix, then TcpServerConn::send_frame added a second one, causing the client to parse [len][proto] as protobuf (silent failure). Fixed by serializing raw protobuf bytes in send_envelope and letting send_frame apply the single length prefix. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
54 lines
2.4 KiB
CMake
54 lines
2.4 KiB
CMake
cmake_minimum_required(VERSION 3.25)
|
|
|
|
project(voicecat
|
|
VERSION 0.0.1
|
|
DESCRIPTION "Self-hosted native voice & text chat (see docs/)"
|
|
LANGUAGES CXX)
|
|
|
|
# ── Options ───────────────────────────────────────────────────────────────────
|
|
# The M0 skeleton compiles with NO third-party dependencies: every subsystem is a
|
|
# stub that returns VC_ERR_NOT_IMPLEMENTED. As each subsystem is built out, flip
|
|
# VOICECAT_USE_VCPKG_DEPS=ON so CMake pulls the real libraries (mbedTLS, libsodium,
|
|
# opus, protobuf, ...) via the vcpkg toolchain (see vcpkg.json / docs/tech-stack.md).
|
|
option(VOICECAT_USE_VCPKG_DEPS "Link real third-party deps via vcpkg" OFF)
|
|
option(VOICECAT_BUILD_SERVER "Build voicecat-server" ON)
|
|
option(VOICECAT_BUILD_TOOLS "Build the vccli headless test client" ON)
|
|
option(VOICECAT_BUILD_TESTS "Build tests" ON)
|
|
option(VOICECAT_BUILD_SHARED "Build libvoicecat as a shared library" OFF)
|
|
|
|
# ── Global settings ───────────────────────────────────────────────────────────
|
|
set(CMAKE_CXX_STANDARD 20)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
|
|
|
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|
set(CMAKE_BUILD_TYPE Debug CACHE STRING "" FORCE)
|
|
endif()
|
|
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
|
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
|
|
|
|
# ── Targets ───────────────────────────────────────────────────────────────────
|
|
add_subdirectory(core)
|
|
|
|
if(VOICECAT_BUILD_SERVER)
|
|
add_subdirectory(server)
|
|
endif()
|
|
|
|
if(VOICECAT_BUILD_TOOLS)
|
|
add_subdirectory(tools/vccli)
|
|
if(VOICECAT_USE_VCPKG_DEPS)
|
|
add_subdirectory(tools/voicecat-admin)
|
|
endif()
|
|
endif()
|
|
|
|
if(VOICECAT_BUILD_TESTS)
|
|
enable_testing()
|
|
add_subdirectory(tests)
|
|
endif()
|
|
|
|
message(STATUS "VoiceCat ${PROJECT_VERSION} configured "
|
|
"(vcpkg deps: ${VOICECAT_USE_VCPKG_DEPS}, "
|
|
"server: ${VOICECAT_BUILD_SERVER}, tools: ${VOICECAT_BUILD_TOOLS})")
|