All notable changes to this crate are documented here.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.1.0 — 2026-02-21
PersistenceBackendtrait — pluggable async storage interface withstore,query,cleanup, and an optionalinitializehook (backend.rs)StoredValue— typed record returned byquery:record_name,value: serde_json::Value,stored_at: u64(Unix ms)QueryParams—limit_per_record: Option<usize>,start_time: Option<u64>,end_time: Option<u64>;Nonelimit means "return all matching rows" (no implicit truncation)AimDbBuilderPersistExttrait — adds.with_persistence(backend, retention)toAimDbBuilder<R>; storesPersistenceStatein the builder'sExtensionsTypeMap and registers a 24-hour retention cleanup task viaon_start()PersistenceState—backend: Arc<dyn PersistenceBackend>+retention_ms: u64; stored inExtensionsand shared between the subscriber and query-time codeRecordRegistrarPersistExttrait — adds.persist(record_name)toRecordRegistrar<T, R>; acceptsimpl Into<String>for ergonomic call sites; spawns atap_rawsubscriber that serialises eachTto JSON and writes it to the backendAimDbQueryExttrait — addsquery_latest,query_range, andquery_rawtoAimDb<R>:query_latest<T>(&self, pattern, limit) -> Vec<T>— typed, limit per recordquery_range<T>(&self, pattern, start_ms, end_ms, limit_per_record) -> Vec<T>— typed, time range with optional per-record limit (None= all rows)query_raw(&self, pattern, params) -> Vec<StoredValue>— untyped escape hatch used by the AimXrecord.queryprotocol handler
PersistenceError—NotConfigured,Backend(String),BackendShutdown,Serialization(serde_json::Error)tracingfeature — optional structured logging for subscriber events, cleanup results, and query-time deserialisation failures- Cleanup observability — when the
tracingfeature is disabled, cleanup errors are printed tostderrviaeprintln!so operators are never silently left with unbounded database growth
- No coupling to
aimdb-corepersistence types — persistence state flows through theExtensionsTypeMap;aimdb-corecarries only a type-erasedQueryHandlerFnfor the AimX protocol delegation - Runtime-agnostic subscriber —
RecordRegistrarPersistExtrequires onlyT: Serialize;.with_remote_access()is not needed StoredValue.valuemoved, not cloned —filter_mapinAimDbQueryExtdestructuresStoredValueto move theValueintofrom_value()directly