///|
/// Portable synchronous SDK example: observe a complete check, then cancel a new one.
fn main {
try {
let content = Bytes::make(2097169, 7)
let read = fn(
_ : Int32,
offset : Int64,
size : Int32,
) raise @swarm.CrateError {
if offset < 0L ||
size < 1 ||
offset + size.to_int64() > content.length().to_int64() {
raise @swarm.CrateError("example", "invalid read range")
}
content[offset.to_int():offset.to_int() + size].to_owned()
}
let torrent = @swarm.create_torrent(
[{ path: ["example.bin"], length: content.length().to_int64(), }],
{
..@swarm.create_options("example.bin"),
single_file: true,
piece_length: 2097152,
},
read,
)
let mut final_reads = 0
let mut final_bytes = 0L
let (report, receipt) = @swarm.verify_with_control(
torrent,
[Some(content.length().to_int64())],
read,
fn(event) {
final_reads = event.read_calls
final_bytes = event.validated_read_bytes
true
},
)
if !report.ok ||
final_reads != 3 ||
final_bytes != content.length().to_int64() {
abort("controlled example progress mismatch")
}
println(@swarm.receipt_diagnostics_json_text(receipt))
let mut cancel_reads = 0
let cancelled = try {
ignore(
@swarm.verify_with_control(
torrent,
[Some(content.length().to_int64())],
read,
fn(event) {
cancel_reads = event.read_calls
event.phase != "after_read"
},
),
)
false
} catch {
@swarm.CrateError("cancelled", _) => true
error => raise error
}
if !cancelled || cancel_reads != 1 {
abort("cancellation did not stop after one read")
}
println(
"CONTROLLED SDK PASS: completed receipt verified; cancelled call returned no receipt",
)
} catch {
@swarm.CrateError(code, detail) => abort(code + ": " + detail)
}
}