commit c83b69f154fb172d91a0c7b2649007559302a578
parent c761bd1de80119716c87b2cfffa37f85b23984b4
Author: triesap <tyson@radroots.org>
Date: Tue, 7 Jul 2026 19:21:36 +0000
sync: expose deferred preview queue counts
- show preview-unavailable and deferred-until-implemented counts in SDK-backed status views
- carry the new outbox counters through sync and transport status output
- keep actionable pending counts separate from non-actionable Reticulum preview work
- update focused sync view tests for the explicit queue fields
Diffstat:
5 files changed, 36 insertions(+), 1 deletion(-)
diff --git a/Cargo.lock b/Cargo.lock
@@ -4029,6 +4029,7 @@ dependencies = [
name = "radroots_transport_publish_protocol"
version = "0.1.0-alpha.2"
dependencies = [
+ "radroots_transport",
"serde",
]
diff --git a/src/runtime/store.rs b/src/runtime/store.rs
@@ -430,6 +430,8 @@ fn sdk_outbox_status_view(
retryable_events: status.retryable_events,
terminal_events: status.terminal_events,
failed_terminal_events: status.failed_terminal_events,
+ preview_unavailable_events: status.preview_unavailable_events,
+ deferred_until_implemented_events: status.deferred_until_implemented_events,
ready_signed_events: status.ready_signed_events,
publishing_events: status.publishing_events,
last_attempt_at_ms: status.last_attempt_at_ms,
diff --git a/src/runtime/sync.rs b/src/runtime/sync.rs
@@ -614,6 +614,10 @@ fn sdk_sync_queue(receipt: &SyncStatusReceipt) -> SyncQueueView {
retryable_count: Some(usize_from_i64(receipt.outbox.retryable_events)),
terminal_count: Some(usize_from_i64(receipt.outbox.terminal_events)),
failed_terminal_count: Some(usize_from_i64(receipt.outbox.failed_terminal_events)),
+ preview_unavailable_count: Some(usize_from_i64(receipt.outbox.preview_unavailable_events)),
+ deferred_until_implemented_count: Some(usize_from_i64(
+ receipt.outbox.deferred_until_implemented_events,
+ )),
ready_signed_count: Some(usize_from_i64(receipt.outbox.ready_signed_events)),
publishing_count: Some(usize_from_i64(receipt.outbox.publishing_events)),
last_attempt_at_ms: receipt.outbox.last_attempt_at_ms,
@@ -629,6 +633,8 @@ fn derived_projection_sync_queue(expected_count: usize, pending_count: usize) ->
retryable_count: None,
terminal_count: None,
failed_terminal_count: None,
+ preview_unavailable_count: None,
+ deferred_until_implemented_count: None,
ready_signed_count: None,
publishing_count: None,
last_attempt_at_ms: None,
@@ -1540,6 +1546,8 @@ mod tests {
0,
0,
0,
+ 0,
+ 0,
None,
None,
&["wss://relay-a.example.com", "wss://relay-b.example.com"],
@@ -1554,6 +1562,8 @@ mod tests {
assert_eq!(view.queue.pending_count, 0);
assert_eq!(view.queue.retryable_count, Some(0));
assert_eq!(view.queue.terminal_count, Some(0));
+ assert_eq!(view.queue.preview_unavailable_count, Some(0));
+ assert_eq!(view.queue.deferred_until_implemented_count, Some(0));
assert_eq!(view.queue.ready_signed_count, Some(0));
assert_eq!(view.actions, vec!["radroots sync pull"]);
}
@@ -1572,6 +1582,8 @@ mod tests {
1,
2,
1,
+ 0,
+ 0,
1,
0,
Some(1_700_000_010_000),
@@ -1586,6 +1598,8 @@ mod tests {
assert_eq!(view.queue.retryable_count, Some(1));
assert_eq!(view.queue.terminal_count, Some(2));
assert_eq!(view.queue.failed_terminal_count, Some(1));
+ assert_eq!(view.queue.preview_unavailable_count, Some(0));
+ assert_eq!(view.queue.deferred_until_implemented_count, Some(0));
assert_eq!(view.queue.ready_signed_count, Some(1));
assert_eq!(view.queue.last_attempt_at_ms, Some(1_700_000_010_000));
assert_eq!(
@@ -1610,6 +1624,8 @@ mod tests {
0,
0,
0,
+ 0,
+ 0,
1,
0,
None,
@@ -1645,7 +1661,7 @@ mod tests {
let view = sdk_push_view(
&config,
PushOutboxReceipt::default(),
- sdk_status_receipt(0, 0, 0, 0, 0, 0, 0, 0, None, None, &[]),
+ sdk_status_receipt(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, None, None, &[]),
);
assert_eq!(view.state, "ready");
@@ -1704,6 +1720,8 @@ mod tests {
0,
0,
0,
+ 0,
+ 0,
Some(1_700_000_020_000),
Some("auth-required: login".to_owned()),
&["wss://relay-a.example.com", "wss://relay-b.example.com"],
@@ -1749,6 +1767,8 @@ mod tests {
retryable_events: i64,
terminal_events: i64,
failed_terminal_events: i64,
+ preview_unavailable_events: i64,
+ deferred_until_implemented_events: i64,
ready_signed_events: i64,
publishing_events: i64,
last_attempt_at_ms: Option<i64>,
@@ -1771,6 +1791,8 @@ mod tests {
retryable_events,
terminal_events,
failed_terminal_events,
+ preview_unavailable_events,
+ deferred_until_implemented_events,
ready_signed_events,
publishing_events,
last_attempt_at_ms,
diff --git a/src/runtime/transport.rs b/src/runtime/transport.rs
@@ -110,6 +110,8 @@ pub fn outbox_status(
pending_count: receipt.outbox.pending_events,
retryable_count: receipt.outbox.retryable_events,
terminal_count: receipt.outbox.terminal_events,
+ preview_unavailable_count: receipt.outbox.preview_unavailable_events,
+ deferred_until_implemented_count: receipt.outbox.deferred_until_implemented_events,
ready_signed_count: receipt.outbox.ready_signed_events,
publishing_count: receipt.outbox.publishing_events,
last_attempt_at_ms: receipt.outbox.last_attempt_at_ms,
diff --git a/src/view/runtime.rs b/src/view/runtime.rs
@@ -634,6 +634,8 @@ pub struct SdkOutboxStatusView {
pub retryable_events: i64,
pub terminal_events: i64,
pub failed_terminal_events: i64,
+ pub preview_unavailable_events: i64,
+ pub deferred_until_implemented_events: i64,
pub ready_signed_events: i64,
pub publishing_events: i64,
#[serde(skip_serializing_if = "Option::is_none")]
@@ -3159,6 +3161,10 @@ pub struct SyncQueueView {
#[serde(skip_serializing_if = "Option::is_none")]
pub failed_terminal_count: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
+ pub preview_unavailable_count: Option<usize>,
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub deferred_until_implemented_count: Option<usize>,
+ #[serde(skip_serializing_if = "Option::is_none")]
pub ready_signed_count: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub publishing_count: Option<usize>,
@@ -3297,6 +3303,8 @@ pub struct TransportOutboxStatusView {
pub pending_count: i64,
pub retryable_count: i64,
pub terminal_count: i64,
+ pub preview_unavailable_count: i64,
+ pub deferred_until_implemented_count: i64,
pub ready_signed_count: i64,
pub publishing_count: i64,
#[serde(skip_serializing_if = "Option::is_none")]