Documentation
¶
Overview ¶
Package api defines the read-only view contracts that observability (R7 — dashboard, metrics, audit, webhook) and auth gates (R4) consume from the registry's R5 state stores (directory, membership, trust, policy, identity).
This package is the contract layer for the registry-server split (the R10-equivalent of pkg/coreapi for the daemon). No implementations live here. Concrete R5 stores in their own sub-packages will satisfy these interfaces; consumers in R7 and R4 will hold only the interface types, never the writeable *Store pointers.
See architecture-notes/07-REGISTRY-LAYERS.md (Critical invariants rule #2) and architecture-notes/08-REGISTRY-EXTRACTION.md (Tier R0.4) for the rationale and the full extraction roadmap.
Stability contract: every exported identifier is part of the registry-internal layer-boundary ABI. Adding fields to the snapshot view structs is backward-compatible; renaming or removing them breaks every R7/R4 consumer in lockstep with the R5 store that produces the snapshot.
Allowed imports: stdlib only (plus crypto/ed25519 and time when a view structurally needs them). No store-package imports — the import direction is consumer → api ← store.
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type DirectoryView ¶
type DirectoryView interface {
// GetNode returns a snapshot of the node and true if present.
GetNode(nodeID uint32) (*NodeInfo, bool)
// NodeCount returns the total number of registered nodes.
NodeCount() int
// List returns a snapshot slice of every node. The returned slice
// is owned by the caller; mutations do not affect the store.
List() []*NodeInfo
// Online returns the count of nodes whose LastSeen is at or after
// threshold (i.e., considered live).
Online(threshold time.Time) int
// TaskExecutorCount returns the number of nodes advertising task
// execution capability.
TaskExecutorCount() int
// LookupByPubKey returns the nodeID owning the given base64-encoded
// Ed25519 public key. The bool is false on miss.
LookupByPubKey(pubKeyB64 string) (uint32, bool)
// LookupByHostname returns the nodeID with the given unique
// hostname. The bool is false on miss.
LookupByHostname(name string) (uint32, bool)
}
DirectoryView is the read-only contract over the registry's directory store. R7 (dashboard, metrics) and R4 (authz) consume this; only the directory store package produces it.
Implementations must be safe for concurrent use; callers may call any method from any goroutine without external synchronization.
type IdentityView ¶
type IdentityView interface {
// Configured reports whether an external IDP integration is set
// up (mirrors today's "idpConfig != nil" check on Server).
Configured() bool
// GetKeyInfo returns the lifecycle metadata for nodeID's current
// key and true if present.
GetKeyInfo(nodeID uint32) (*KeyInfo, bool)
}
IdentityView is the read-only contract over the registry's identity store (key lifecycle, IDP configuration). R7 (dashboard) and R4 consume this; only the identity store package produces it.
Implementations must be safe for concurrent use.
type KeyInfo ¶
type KeyInfo struct {
CreatedAt time.Time `json:"created_at"`
RotatedAt time.Time `json:"rotated_at,omitempty"` // zero if never rotated
RotateCount int `json:"rotate_count"`
ExpiresAt time.Time `json:"expires_at,omitempty"` // zero = no expiry
}
KeyInfo is a read-only snapshot of a node's key lifecycle metadata, surfaced for compliance reporting and trust decisions. Field shape mirrors pkg/registry/server.KeyInfo for mechanical adoption.
type MembershipView ¶
type MembershipView interface {
// GetNetwork returns a snapshot of the network and true if present.
GetNetwork(networkID uint16) (*NetworkInfo, bool)
// Count returns the total number of networks.
Count() int
// Networks returns a snapshot slice of every network.
Networks() []*NetworkInfo
// Members returns the node IDs that belong to networkID. Returns
// nil if the network does not exist.
Members(networkID uint16) []uint32
// NetworksFor returns the network IDs nodeID is a member of.
NetworksFor(nodeID uint32) []uint16
// MemberRole returns the member's role in the network. The error
// is non-nil when the network or membership does not exist.
MemberRole(networkID uint16, nodeID uint32) (Role, error)
// MemberTags returns the admin-assigned tags for the member.
// Returns nil when no tags are set or the membership is absent.
MemberTags(networkID uint16, nodeID uint32) []string
// PendingInvites returns the count of pending network invites in
// the node's inbox.
PendingInvites(nodeID uint32) int
}
MembershipView is the read-only contract over the registry's membership store. R7 (dashboard) and R4 (authz role check) consume this; only the membership store package produces it.
Implementations must be safe for concurrent use.
type NetworkInfo ¶
type NetworkInfo struct {
ID uint16
Name string
JoinRule string
Token string // for token-gated networks
Members []uint32
MemberRoles map[uint32]Role // per-member RBAC roles
MemberTags map[uint32][]string // admin-assigned per-member tags
AdminToken string // per-network admin token (optional)
Policy NetworkPolicy // network policy (limits, port restrictions)
Rules json.RawMessage // managed network rules document (nil = none)
ExprPolicy json.RawMessage // programmable policy engine document (nil = none)
Enterprise bool // enterprise network (gates phase 2-5 features)
Created time.Time
}
NetworkInfo is a read-only snapshot of a network record.
Field shape mirrors pkg/registry/server.NetworkInfo. The server type's *wire.NetworkRules pointer is represented here as the marshaled rules document (json.RawMessage); a nil/empty value means the network has no managed rules. Internal atomic counters (requestCount) are intentionally absent from the snapshot.
type NetworkInvite ¶
type NetworkInvite struct {
NetworkID uint16 `json:"network_id"`
InviterID uint32 `json:"inviter_id"`
Timestamp time.Time `json:"timestamp"`
}
NetworkInvite is a read-only snapshot of a pending network invitation in the registry's invite inbox. Field shape mirrors pkg/registry/server.NetworkInvite for mechanical adoption.
type NetworkPolicy ¶
type NetworkPolicy struct {
MaxMembers int `json:"max_members"` // 0 = unlimited
AllowedPorts []uint16 `json:"allowed_ports"` // empty = all ports allowed
Description string `json:"description"` // human-readable description
}
NetworkPolicy is a read-only snapshot of a network's policy constraints. Field shape mirrors pkg/registry/server.NetworkPolicy for mechanical adoption.
type NodeInfo ¶
type NodeInfo struct {
ID uint32
Owner string // email or identifier (for key rotation)
PublicKey []byte
RealAddr string
Networks []uint16
LastSeen time.Time
Public bool // if true, endpoint is visible in lookup/list_nodes
Hostname string // unique hostname for discovery (empty = none)
Tags []string
TaskExec bool // node advertises task execution capability
LANAddrs []string // LAN addresses for same-network peer detection
KeyMeta KeyInfo // key lifecycle metadata
ExternalID string // verified external identity (e.g., OIDC sub)
Version string // binary version reported by daemon
RelayOnly bool // peers must reach this node via beacon relay only
}
NodeInfo is a read-only snapshot of a directory entry.
Field shape mirrors pkg/registry/server.NodeInfo so that adoption (in later extraction tiers) is mechanical: the directory store will either type-alias api.NodeInfo or copy fields into it on read. The internal atomic counters that today live on server.NodeInfo (lastSeenNano, lastVerifiedNano) are intentionally absent — readers receive the resolved LastSeen value, not the raw atomic.
type PolicyView ¶
type PolicyView interface {
// Get returns the policy for networkID and true if set.
Get(networkID uint16) (*NetworkPolicy, bool)
// GetExpr returns the marshaled expression-policy document for
// networkID, or (nil, false) when none is set. The bytes are
// owned by the caller and may be retained or mutated freely.
GetExpr(networkID uint16) ([]byte, bool)
}
PolicyView is the read-only contract over the registry's per-network policy store. R7 and R4 consume this; only the policy store package produces it.
Implementations must be safe for concurrent use.
type Role ¶
type Role string
Role is a member's permission level within a network. Values are the same string constants used today by server.Role.
type TrustView ¶
type TrustView interface {
// Count returns the total number of trust pairs currently stored.
Count() int
// IsTrusted reports whether nodes a and b have an established
// trust pair. The relation is symmetric: IsTrusted(a, b) ==
// IsTrusted(b, a).
IsTrusted(a, b uint32) bool
}
TrustView is the read-only contract over the registry's trust-pair store. R7 (dashboard) and R4 (authz) consume this; only the trust store package produces it.
Implementations must be safe for concurrent use.