9536e08748
- ADR-0008: Build-first, gesammelte Windows-Validierung (Auftraggeber-Freigabe) - ADR-0004 vorläufig: Rust auf GStreamer-D3D11-Elementpfad - ADR-0005 vorläufig: Nuitka Onefolder - hms_protocol: IpcServer/IpcClient mit Handshake (hello/welcome), Capabilities-Austausch, Heartbeat 500 ms bidirektional, Snapshot/Delta, Loopback-only-Enforcement, Re-Sync nach Reconnect, Version-Mismatch-Fehler - 9 Integrationstests: echter TCP-Loopback, kein Mock
39 lines
1014 B
Python
39 lines
1014 B
Python
"""IPC-Nachrichten-Umschlag (PLAN.md §6.2)."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import time
|
|
import uuid
|
|
from enum import StrEnum
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
PROTOCOL_VERSION = 1
|
|
|
|
|
|
class MessageType(StrEnum):
|
|
COMMAND = "command"
|
|
EVENT = "event"
|
|
SNAPSHOT = "snapshot"
|
|
ACK = "ack"
|
|
ERROR = "error"
|
|
TELEMETRY = "telemetry"
|
|
HEARTBEAT = "heartbeat"
|
|
|
|
|
|
class Envelope(BaseModel):
|
|
"""Jede IPC-Nachricht besitzt mindestens diese Felder (§6.2)."""
|
|
|
|
protocol_version: int = PROTOCOL_VERSION
|
|
message_id: str = Field(default_factory=lambda: str(uuid.uuid4()))
|
|
type: MessageType
|
|
revision: int = 0
|
|
monotonic_timestamp_ns: int = Field(default_factory=lambda: time.monotonic_ns())
|
|
payload: dict = Field(default_factory=dict)
|
|
|
|
def model_post_init(self, _ctx: object) -> None:
|
|
if self.protocol_version != PROTOCOL_VERSION:
|
|
raise ValueError(
|
|
f"protocol_version {self.protocol_version} != {PROTOCOL_VERSION}"
|
|
)
|