43 lines
1.8 KiB
Go
43 lines
1.8 KiB
Go
// Package room models the policy and identity of a unibus room.
|
|
//
|
|
// A room is a logical channel on the bus. Its Policy decides whether messages
|
|
// are encrypted end-to-end, persisted to history, and signed per-message. Two
|
|
// canonical policies are provided:
|
|
//
|
|
// - ModeNATS: cleartext, ephemeral, unsigned. The "plain NATS" experience —
|
|
// fast fan-out for telemetry, process coordination, and RPC where the
|
|
// transport boundary is already trusted.
|
|
// - ModeMatrix: encrypted, persisted, signed. The "Matrix-like" experience —
|
|
// E2E confidentiality with forward secrecy (key rotation on leave/kick),
|
|
// durable history, and per-message authorship signatures.
|
|
//
|
|
// Subject naming convention (the address space of the bus):
|
|
//
|
|
// proc.<svc>.<canal> process/worker telemetry & coordination (e.g. proc.test.ticks)
|
|
// rpc.<svc> request/reply endpoints (e.g. rpc.indexer)
|
|
// room.<grupo> human/group chat rooms (e.g. room.general)
|
|
// agent.<nombre>.{in,out} LLM agent inbox/outbox (e.g. agent.scout.in)
|
|
package room
|
|
|
|
// Policy controls how a room treats its messages.
|
|
type Policy struct {
|
|
Encrypt bool // payload is AEAD-encrypted with the room key K
|
|
Persist bool // messages are kept in durable history (JetStream)
|
|
SignMsgs bool // each message carries an Ed25519 signature over its canonical bytes
|
|
}
|
|
|
|
// ModeNATS is cleartext, ephemeral, unsigned: plain NATS semantics.
|
|
var ModeNATS = Policy{Encrypt: false, Persist: false, SignMsgs: false}
|
|
|
|
// ModeMatrix is encrypted, persisted, signed: Matrix-like E2E semantics.
|
|
var ModeMatrix = Policy{Encrypt: true, Persist: true, SignMsgs: true}
|
|
|
|
// Room is the in-memory view of a room: its identity, transport subject, the
|
|
// current key epoch, and its policy.
|
|
type Room struct {
|
|
ID string
|
|
Subject string
|
|
Epoch int
|
|
Policy Policy
|
|
}
|