fix: slotsfull is occupancy, not free slots, and cover it end to end
Running the e2e suite against a real soulfind showed the per-member slots field was implemented backwards. The wire field is `slotsfull` -- a boolean that is true when the member's upload slots are all occupied -- not a count of free ones. `slots_free: u32` named it, documented it and printed it as the opposite of what the server means, so a caller reading it would pick the busiest peer to download from. - types: `slots_full: bool`, with the wire name in the doc comment - the DTO, the `room users` output and SKILL.md follow - a new e2e test joins a room with a member sharing a known three files and asserts the counts, the roster alignment and the slot flag against soulfind, so the parsing is checked against a real server rather than only against frames this repo wrote itself
This commit is contained in:
@@ -141,10 +141,10 @@ server did not answer — those are different facts, so do not treat null as 0.
|
||||
|
||||
**`room list`** — `room`, `users`.
|
||||
**`room users <room>`** — `room`, `user`, `status`, `average_speed`,
|
||||
`shared_files`, `shared_folders`, `slots_free`, `country`. Everything but
|
||||
`shared_files`, `shared_folders`, `slots_full`, `country`. Everything but
|
||||
`room` and `user` is `null` when the server sent no statistics for that
|
||||
member — `null` means unknown, not zero. `slots_free` of 0 means the peer has
|
||||
no free upload slot right now, so a download from them will queue.
|
||||
member — `null` means unknown, not zero. `slots_full` is true when the peer's
|
||||
upload slots are all occupied, so a download from them will queue.
|
||||
**`room listen <room>`** — streams `type`, `room`, `user`, `message`.
|
||||
**`room say <room> <message>`** — prints nothing; exit 0 is the confirmation.
|
||||
|
||||
|
||||
@@ -164,7 +164,7 @@ pub fn room_users(ctx: &Ctx, room: &str, timeout: Duration) -> CliResult {
|
||||
average_speed: stat.map(|s| s.average_speed),
|
||||
shared_files: stat.map(|s| s.shared_files),
|
||||
shared_folders: stat.map(|s| s.shared_folders),
|
||||
slots_free: stat.map(|s| s.slots_free),
|
||||
slots_full: stat.map(|s| s.slots_full),
|
||||
country: stat.and_then(|s| s.country.clone()),
|
||||
});
|
||||
}
|
||||
|
||||
@@ -468,7 +468,8 @@ pub struct RoomUserStatsDto {
|
||||
pub average_speed: u32,
|
||||
pub shared_files: u32,
|
||||
pub shared_folders: u32,
|
||||
pub slots_free: u32,
|
||||
/// True when the member's upload slots are all occupied.
|
||||
pub slots_full: bool,
|
||||
pub country: Option<String>,
|
||||
}
|
||||
|
||||
@@ -480,7 +481,7 @@ impl From<&RoomUserStats> for RoomUserStatsDto {
|
||||
average_speed: stats.average_speed,
|
||||
shared_files: stats.shared_files,
|
||||
shared_folders: stats.shared_folders,
|
||||
slots_free: stats.slots_free,
|
||||
slots_full: stats.slots_full,
|
||||
country: stats.country.clone(),
|
||||
}
|
||||
}
|
||||
@@ -494,7 +495,7 @@ impl From<RoomUserStatsDto> for RoomUserStats {
|
||||
average_speed: dto.average_speed,
|
||||
shared_files: dto.shared_files,
|
||||
shared_folders: dto.shared_folders,
|
||||
slots_free: dto.slots_free,
|
||||
slots_full: dto.slots_full,
|
||||
country: dto.country,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -614,7 +614,7 @@ mod tests {
|
||||
.expect("member stats");
|
||||
assert_eq!(stats["members"][0]["username"], "alice");
|
||||
assert_eq!(stats["members"][0]["status"], "online");
|
||||
assert_eq!(stats["members"][0]["slots_free"], 1);
|
||||
assert_eq!(stats["members"][0]["slots_full"], true);
|
||||
assert_eq!(stats["members"][0]["country"], "NL");
|
||||
}
|
||||
|
||||
@@ -819,7 +819,7 @@ mod tests {
|
||||
average_speed: 1024,
|
||||
shared_files: 20,
|
||||
shared_folders: 3,
|
||||
slots_free: 1,
|
||||
slots_full: true,
|
||||
country: Some("NL".to_string()),
|
||||
}]
|
||||
}
|
||||
|
||||
@@ -384,7 +384,7 @@ pub struct RoomMemberRecord {
|
||||
pub average_speed: Option<u32>,
|
||||
pub shared_files: Option<u32>,
|
||||
pub shared_folders: Option<u32>,
|
||||
pub slots_free: Option<u32>,
|
||||
pub slots_full: Option<bool>,
|
||||
pub country: Option<String>,
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user