use std::collections::HashMap;
use std::time::SystemTime;
use crate::record::{IdentityRecord, Pointer, PointerPage, ShardDescriptor};
#[must_use]
pub fn newer_identity(held: IdentityRecord, incoming: IdentityRecord) -> IdentityRecord {
if incoming.version() > held.version() {
incoming
} else {
held
}
}
#[must_use]
pub fn supersedes(held: &IdentityRecord, incoming: &IdentityRecord) -> bool {
incoming.version() > held.version()
}
#[must_use]
pub fn best_of(records: impl IntoIterator<Item = IdentityRecord>) -> Option<IdentityRecord> {
records.into_iter().reduce(newer_identity)
}
#[must_use]
pub fn merge_pages(pages: impl IntoIterator<Item = PointerPage>, now: SystemTime) -> PointerPage {
let mut latest: HashMap<String, u64> = HashMap::new();
for page in pages {
for pointer in page.pointers {
if pointer.is_expired(now) {
continue;
}
latest
.entry(pointer.agent_uri)
.and_modify(|expiry| *expiry = (*expiry).max(pointer.expires_at_millis))
.or_insert(pointer.expires_at_millis);
}
}
let mut pointers: Vec<Pointer> = latest
.into_iter()
.map(|(agent_uri, expires_at_millis)| Pointer {
agent_uri,
expires_at_millis,
})
.collect();
pointers.sort_by(|a, b| a.agent_uri.cmp(&b.agent_uri));
PointerPage::new(pointers)
}
#[must_use]
pub fn widest_descriptor(held: ShardDescriptor, incoming: ShardDescriptor) -> ShardDescriptor {
ShardDescriptor::at_level(held.level.max(incoming.level))
}
#[cfg(test)]
mod tests {
use super::*;
use crate::record::WireKind;
use agent_uri::AgentUri;
use agent_uri_attestation::SigningKey;
use agent_uri_dht::{Endpoint, Registration};
use std::time::Duration;
fn record(registered_at: SystemTime, sequence: u64) -> IdentityRecord {
let uri =
AgentUri::parse("agent://anthropic.com/assistant/chat/llm_01h455vb4pex5vsknk084sn02q")
.unwrap();
let state = Registration::new(
uri,
SigningKey::generate().verifying_key(),
vec![Endpoint::https("agent.anthropic.com:443")],
)
.with_registered_at(registered_at)
.with_sequence(sequence);
IdentityRecord {
state,
kind: WireKind::Register,
refresh_ttl_millis: None,
signature: crate::record::WireSignature::new([0u8; 64]),
}
}
fn epoch(offset_secs: u64) -> SystemTime {
SystemTime::UNIX_EPOCH + Duration::from_secs(offset_secs)
}
#[test]
fn a_higher_sequence_wins_within_an_instance() {
let old = record(epoch(1000), 3);
let new = record(epoch(1000), 4);
assert!(supersedes(&old, &new));
assert_eq!(newer_identity(old, new.clone()).version(), new.version());
}
#[test]
fn a_stale_replica_cannot_undo_a_fresh_write() {
let held = record(epoch(1000), 9);
let stale = record(epoch(1000), 2);
assert!(!supersedes(&held, &stale));
assert_eq!(
newer_identity(held.clone(), stale).version(),
held.version()
);
}
#[test]
fn a_later_instance_outranks_a_higher_sequence_in_an_earlier_one() {
let old = record(epoch(1000), 500);
let reborn = record(epoch(2000), 0);
assert!(supersedes(&old, &reborn));
}
#[test]
fn an_identical_version_does_not_displace_the_held_copy() {
let held = record(epoch(1000), 4);
let duplicate = record(epoch(1000), 4);
assert!(!supersedes(&held, &duplicate));
}
#[test]
fn merging_is_order_independent() {
let a = record(epoch(1000), 1);
let b = record(epoch(1000), 7);
let c = record(epoch(2000), 0);
let forward = best_of(vec![a.clone(), b.clone(), c.clone()]).unwrap();
let backward = best_of(vec![c.clone(), b, a]).unwrap();
assert_eq!(forward.version(), backward.version());
assert_eq!(forward.version(), c.version());
}
#[test]
fn best_of_nothing_is_nothing() {
assert!(best_of(Vec::new()).is_none());
}
#[test]
fn pages_union_rather_than_replace() {
let now = epoch(1000);
let future = now + Duration::from_mins(1);
let a = PointerPage::new(vec![Pointer::new("agent://a.com/x/c_1", future)]);
let b = PointerPage::new(vec![Pointer::new("agent://a.com/x/c_2", future)]);
let merged = merge_pages(vec![a, b], now);
assert_eq!(merged.pointers.len(), 2);
}
#[test]
fn a_republished_pointer_keeps_the_later_expiry() {
let now = epoch(1000);
let soon = now + Duration::from_secs(10);
let later = now + Duration::from_mins(10);
let a = PointerPage::new(vec![Pointer::new("agent://a.com/x/c_1", soon)]);
let b = PointerPage::new(vec![Pointer::new("agent://a.com/x/c_1", later)]);
for pages in [vec![a.clone(), b.clone()], vec![b, a]] {
let merged = merge_pages(pages, now);
assert_eq!(merged.pointers.len(), 1);
assert_eq!(
merged.pointers[0].expires_at_millis,
crate::record::millis(later)
);
}
}
#[test]
fn expired_pointers_are_dropped_on_merge() {
let now = epoch(1000);
let page = PointerPage::new(vec![
Pointer::new("agent://a.com/x/c_1", now - Duration::from_secs(1)),
Pointer::new("agent://a.com/x/c_2", now + Duration::from_secs(1)),
]);
let merged = merge_pages(vec![page], now);
assert_eq!(merged.pointers.len(), 1);
assert_eq!(merged.pointers[0].agent_uri, "agent://a.com/x/c_2");
}
#[test]
fn merging_a_page_with_itself_changes_nothing() {
let now = epoch(1000);
let page = PointerPage::new(vec![Pointer::new(
"agent://a.com/x/c_1",
now + Duration::from_mins(1),
)]);
let once = merge_pages(vec![page.clone()], now);
let twice = merge_pages(vec![page.clone(), page], now);
assert_eq!(once, twice);
}
#[test]
fn merged_pages_encode_identically_regardless_of_input_order() {
let now = epoch(1000);
let future = now + Duration::from_mins(1);
let pointers: Vec<Pointer> = (0..16)
.map(|n| Pointer::new(format!("agent://a.com/x/c_{n}"), future))
.collect();
let forward = merge_pages(
pointers.iter().cloned().map(|p| PointerPage::new(vec![p])),
now,
);
let backward = merge_pages(
pointers
.iter()
.rev()
.cloned()
.map(|p| PointerPage::new(vec![p])),
now,
);
assert_eq!(forward.encode().unwrap(), backward.encode().unwrap());
}
#[test]
fn a_descriptor_only_grows() {
assert_eq!(
widest_descriptor(ShardDescriptor::at_level(3), ShardDescriptor::at_level(1)).level,
3
);
assert_eq!(
widest_descriptor(ShardDescriptor::at_level(1), ShardDescriptor::at_level(3)).level,
3
);
}
}