pub struct AssetServer { /* private fields */ }Expand description
Server-side asset management.
Implementations§
Source§impl AssetServer
impl AssetServer
Sourcepub fn new(config: AssetConfig) -> Self
pub fn new(config: AssetConfig) -> Self
Create a new asset server.
Examples found in repository?
examples/asset_transfer.rs (line 38)
21async fn main() -> io::Result<()> {
22 println!("╔════════════════════════════════════════╗");
23 println!("║ FastNet Asset Transfer Example ║");
24 println!("╚════════════════════════════════════════╝");
25 println!();
26
27 // Create test file
28 let test_file = "/tmp/fastnet_test_asset.bin";
29 let output_file = "/tmp/fastnet_received_asset.bin";
30
31 println!("1. Creating test file...");
32 create_test_file(test_file, 256 * 1024)?; // 256 KB
33 println!(" Created: {} (256 KB)", test_file);
34 println!();
35
36 // Server: Register asset
37 println!("2. Registering asset on server...");
38 let mut server = AssetServer::new(AssetConfig::default());
39 let info = server.register("test-asset", test_file).await?;
40 println!(" Name: {}", info.name);
41 println!(" Size: {} bytes", info.size);
42 println!(" Chunks: {}", info.chunk_count);
43 println!(" Hash: {:?}...", &info.hash[..8]);
44 println!();
45
46 // Client: Request download
47 println!("3. Client requesting asset...");
48 let mut client = AssetClient::new();
49
50 // Simulate request/response
51 let peer_id = Uuid::new_v4();
52 let (transfer_id, asset_info) = server.handle_request(peer_id, "test-asset")
53 .ok_or_else(|| io::Error::new(io::ErrorKind::NotFound, "Asset not found"))?;
54
55 println!(" Transfer ID: {}", transfer_id);
56 client.start_download(transfer_id, asset_info.clone(), output_file)?;
57 println!();
58
59 // Transfer chunks
60 println!("4. Transferring chunks...");
61 let mut chunks_sent = 0;
62
63 while let Some(chunk) = server.get_next_chunk(transfer_id)? {
64 chunks_sent += 1;
65
66 // Simulate network transfer
67 let complete = client.receive_chunk(chunk)?;
68
69 // Print progress
70 if let Some(progress) = client.get_progress(transfer_id) {
71 print!("\r Progress: {:.1}% ({}/{} chunks)",
72 progress * 100.0, chunks_sent, asset_info.chunk_count);
73 io::stdout().flush()?;
74 }
75
76 if complete {
77 println!();
78 break;
79 }
80 }
81
82 // Process events
83 println!();
84 println!("5. Processing events...");
85 for event in client.poll_events() {
86 match event {
87 AssetEvent::Progress { received, total, .. } => {
88 println!(" Progress: {} / {} bytes", received, total);
89 }
90 AssetEvent::Completed { path, .. } => {
91 println!(" ✅ Transfer complete: {:?}", path);
92 }
93 AssetEvent::Failed { error, .. } => {
94 println!(" ❌ Transfer failed: {}", error);
95 }
96 _ => {}
97 }
98 }
99
100 // Verify files match
101 println!();
102 println!("6. Verifying integrity...");
103 let original = std::fs::read(test_file)?;
104 let received = std::fs::read(output_file)?;
105
106 if original == received {
107 println!(" ✅ Files match! Transfer verified.");
108 } else {
109 println!(" ❌ Files don't match! Transfer failed.");
110 }
111
112 // Cleanup
113 println!();
114 println!("7. Cleanup...");
115 std::fs::remove_file(test_file)?;
116 std::fs::remove_file(output_file)?;
117 println!(" Temporary files removed.");
118
119 println!();
120 println!("╔════════════════════════════════════════╗");
121 println!("║ Test Complete! ║");
122 println!("╚════════════════════════════════════════╝");
123
124 Ok(())
125}Sourcepub async fn register(&mut self, name: &str, path: &str) -> Result<AssetInfo>
pub async fn register(&mut self, name: &str, path: &str) -> Result<AssetInfo>
Register an asset for serving.
§Arguments
name- Unique name clients will use to request this assetpath- Local file path
Examples found in repository?
examples/asset_transfer.rs (line 39)
21async fn main() -> io::Result<()> {
22 println!("╔════════════════════════════════════════╗");
23 println!("║ FastNet Asset Transfer Example ║");
24 println!("╚════════════════════════════════════════╝");
25 println!();
26
27 // Create test file
28 let test_file = "/tmp/fastnet_test_asset.bin";
29 let output_file = "/tmp/fastnet_received_asset.bin";
30
31 println!("1. Creating test file...");
32 create_test_file(test_file, 256 * 1024)?; // 256 KB
33 println!(" Created: {} (256 KB)", test_file);
34 println!();
35
36 // Server: Register asset
37 println!("2. Registering asset on server...");
38 let mut server = AssetServer::new(AssetConfig::default());
39 let info = server.register("test-asset", test_file).await?;
40 println!(" Name: {}", info.name);
41 println!(" Size: {} bytes", info.size);
42 println!(" Chunks: {}", info.chunk_count);
43 println!(" Hash: {:?}...", &info.hash[..8]);
44 println!();
45
46 // Client: Request download
47 println!("3. Client requesting asset...");
48 let mut client = AssetClient::new();
49
50 // Simulate request/response
51 let peer_id = Uuid::new_v4();
52 let (transfer_id, asset_info) = server.handle_request(peer_id, "test-asset")
53 .ok_or_else(|| io::Error::new(io::ErrorKind::NotFound, "Asset not found"))?;
54
55 println!(" Transfer ID: {}", transfer_id);
56 client.start_download(transfer_id, asset_info.clone(), output_file)?;
57 println!();
58
59 // Transfer chunks
60 println!("4. Transferring chunks...");
61 let mut chunks_sent = 0;
62
63 while let Some(chunk) = server.get_next_chunk(transfer_id)? {
64 chunks_sent += 1;
65
66 // Simulate network transfer
67 let complete = client.receive_chunk(chunk)?;
68
69 // Print progress
70 if let Some(progress) = client.get_progress(transfer_id) {
71 print!("\r Progress: {:.1}% ({}/{} chunks)",
72 progress * 100.0, chunks_sent, asset_info.chunk_count);
73 io::stdout().flush()?;
74 }
75
76 if complete {
77 println!();
78 break;
79 }
80 }
81
82 // Process events
83 println!();
84 println!("5. Processing events...");
85 for event in client.poll_events() {
86 match event {
87 AssetEvent::Progress { received, total, .. } => {
88 println!(" Progress: {} / {} bytes", received, total);
89 }
90 AssetEvent::Completed { path, .. } => {
91 println!(" ✅ Transfer complete: {:?}", path);
92 }
93 AssetEvent::Failed { error, .. } => {
94 println!(" ❌ Transfer failed: {}", error);
95 }
96 _ => {}
97 }
98 }
99
100 // Verify files match
101 println!();
102 println!("6. Verifying integrity...");
103 let original = std::fs::read(test_file)?;
104 let received = std::fs::read(output_file)?;
105
106 if original == received {
107 println!(" ✅ Files match! Transfer verified.");
108 } else {
109 println!(" ❌ Files don't match! Transfer failed.");
110 }
111
112 // Cleanup
113 println!();
114 println!("7. Cleanup...");
115 std::fs::remove_file(test_file)?;
116 std::fs::remove_file(output_file)?;
117 println!(" Temporary files removed.");
118
119 println!();
120 println!("╔════════════════════════════════════════╗");
121 println!("║ Test Complete! ║");
122 println!("╚════════════════════════════════════════╝");
123
124 Ok(())
125}Sourcepub fn get_asset_info(&self, name: &str) -> Option<&AssetInfo>
pub fn get_asset_info(&self, name: &str) -> Option<&AssetInfo>
Get info about a registered asset.
Sourcepub fn handle_request(
&mut self,
peer_id: PeerId,
name: &str,
) -> Option<(TransferId, AssetInfo)>
pub fn handle_request( &mut self, peer_id: PeerId, name: &str, ) -> Option<(TransferId, AssetInfo)>
Handle an asset request from a peer.
Examples found in repository?
examples/asset_transfer.rs (line 52)
21async fn main() -> io::Result<()> {
22 println!("╔════════════════════════════════════════╗");
23 println!("║ FastNet Asset Transfer Example ║");
24 println!("╚════════════════════════════════════════╝");
25 println!();
26
27 // Create test file
28 let test_file = "/tmp/fastnet_test_asset.bin";
29 let output_file = "/tmp/fastnet_received_asset.bin";
30
31 println!("1. Creating test file...");
32 create_test_file(test_file, 256 * 1024)?; // 256 KB
33 println!(" Created: {} (256 KB)", test_file);
34 println!();
35
36 // Server: Register asset
37 println!("2. Registering asset on server...");
38 let mut server = AssetServer::new(AssetConfig::default());
39 let info = server.register("test-asset", test_file).await?;
40 println!(" Name: {}", info.name);
41 println!(" Size: {} bytes", info.size);
42 println!(" Chunks: {}", info.chunk_count);
43 println!(" Hash: {:?}...", &info.hash[..8]);
44 println!();
45
46 // Client: Request download
47 println!("3. Client requesting asset...");
48 let mut client = AssetClient::new();
49
50 // Simulate request/response
51 let peer_id = Uuid::new_v4();
52 let (transfer_id, asset_info) = server.handle_request(peer_id, "test-asset")
53 .ok_or_else(|| io::Error::new(io::ErrorKind::NotFound, "Asset not found"))?;
54
55 println!(" Transfer ID: {}", transfer_id);
56 client.start_download(transfer_id, asset_info.clone(), output_file)?;
57 println!();
58
59 // Transfer chunks
60 println!("4. Transferring chunks...");
61 let mut chunks_sent = 0;
62
63 while let Some(chunk) = server.get_next_chunk(transfer_id)? {
64 chunks_sent += 1;
65
66 // Simulate network transfer
67 let complete = client.receive_chunk(chunk)?;
68
69 // Print progress
70 if let Some(progress) = client.get_progress(transfer_id) {
71 print!("\r Progress: {:.1}% ({}/{} chunks)",
72 progress * 100.0, chunks_sent, asset_info.chunk_count);
73 io::stdout().flush()?;
74 }
75
76 if complete {
77 println!();
78 break;
79 }
80 }
81
82 // Process events
83 println!();
84 println!("5. Processing events...");
85 for event in client.poll_events() {
86 match event {
87 AssetEvent::Progress { received, total, .. } => {
88 println!(" Progress: {} / {} bytes", received, total);
89 }
90 AssetEvent::Completed { path, .. } => {
91 println!(" ✅ Transfer complete: {:?}", path);
92 }
93 AssetEvent::Failed { error, .. } => {
94 println!(" ❌ Transfer failed: {}", error);
95 }
96 _ => {}
97 }
98 }
99
100 // Verify files match
101 println!();
102 println!("6. Verifying integrity...");
103 let original = std::fs::read(test_file)?;
104 let received = std::fs::read(output_file)?;
105
106 if original == received {
107 println!(" ✅ Files match! Transfer verified.");
108 } else {
109 println!(" ❌ Files don't match! Transfer failed.");
110 }
111
112 // Cleanup
113 println!();
114 println!("7. Cleanup...");
115 std::fs::remove_file(test_file)?;
116 std::fs::remove_file(output_file)?;
117 println!(" Temporary files removed.");
118
119 println!();
120 println!("╔════════════════════════════════════════╗");
121 println!("║ Test Complete! ║");
122 println!("╚════════════════════════════════════════╝");
123
124 Ok(())
125}Sourcepub fn get_next_chunk(
&mut self,
transfer_id: TransferId,
) -> Result<Option<AssetChunk>>
pub fn get_next_chunk( &mut self, transfer_id: TransferId, ) -> Result<Option<AssetChunk>>
Get the next chunk for a transfer.
Examples found in repository?
examples/asset_transfer.rs (line 63)
21async fn main() -> io::Result<()> {
22 println!("╔════════════════════════════════════════╗");
23 println!("║ FastNet Asset Transfer Example ║");
24 println!("╚════════════════════════════════════════╝");
25 println!();
26
27 // Create test file
28 let test_file = "/tmp/fastnet_test_asset.bin";
29 let output_file = "/tmp/fastnet_received_asset.bin";
30
31 println!("1. Creating test file...");
32 create_test_file(test_file, 256 * 1024)?; // 256 KB
33 println!(" Created: {} (256 KB)", test_file);
34 println!();
35
36 // Server: Register asset
37 println!("2. Registering asset on server...");
38 let mut server = AssetServer::new(AssetConfig::default());
39 let info = server.register("test-asset", test_file).await?;
40 println!(" Name: {}", info.name);
41 println!(" Size: {} bytes", info.size);
42 println!(" Chunks: {}", info.chunk_count);
43 println!(" Hash: {:?}...", &info.hash[..8]);
44 println!();
45
46 // Client: Request download
47 println!("3. Client requesting asset...");
48 let mut client = AssetClient::new();
49
50 // Simulate request/response
51 let peer_id = Uuid::new_v4();
52 let (transfer_id, asset_info) = server.handle_request(peer_id, "test-asset")
53 .ok_or_else(|| io::Error::new(io::ErrorKind::NotFound, "Asset not found"))?;
54
55 println!(" Transfer ID: {}", transfer_id);
56 client.start_download(transfer_id, asset_info.clone(), output_file)?;
57 println!();
58
59 // Transfer chunks
60 println!("4. Transferring chunks...");
61 let mut chunks_sent = 0;
62
63 while let Some(chunk) = server.get_next_chunk(transfer_id)? {
64 chunks_sent += 1;
65
66 // Simulate network transfer
67 let complete = client.receive_chunk(chunk)?;
68
69 // Print progress
70 if let Some(progress) = client.get_progress(transfer_id) {
71 print!("\r Progress: {:.1}% ({}/{} chunks)",
72 progress * 100.0, chunks_sent, asset_info.chunk_count);
73 io::stdout().flush()?;
74 }
75
76 if complete {
77 println!();
78 break;
79 }
80 }
81
82 // Process events
83 println!();
84 println!("5. Processing events...");
85 for event in client.poll_events() {
86 match event {
87 AssetEvent::Progress { received, total, .. } => {
88 println!(" Progress: {} / {} bytes", received, total);
89 }
90 AssetEvent::Completed { path, .. } => {
91 println!(" ✅ Transfer complete: {:?}", path);
92 }
93 AssetEvent::Failed { error, .. } => {
94 println!(" ❌ Transfer failed: {}", error);
95 }
96 _ => {}
97 }
98 }
99
100 // Verify files match
101 println!();
102 println!("6. Verifying integrity...");
103 let original = std::fs::read(test_file)?;
104 let received = std::fs::read(output_file)?;
105
106 if original == received {
107 println!(" ✅ Files match! Transfer verified.");
108 } else {
109 println!(" ❌ Files don't match! Transfer failed.");
110 }
111
112 // Cleanup
113 println!();
114 println!("7. Cleanup...");
115 std::fs::remove_file(test_file)?;
116 std::fs::remove_file(output_file)?;
117 println!(" Temporary files removed.");
118
119 println!();
120 println!("╔════════════════════════════════════════╗");
121 println!("║ Test Complete! ║");
122 println!("╚════════════════════════════════════════╝");
123
124 Ok(())
125}Sourcepub fn poll_events(&mut self) -> Vec<AssetEvent>
pub fn poll_events(&mut self) -> Vec<AssetEvent>
Get pending events.
Sourcepub fn pause_transfer(&mut self, transfer_id: TransferId) -> bool
pub fn pause_transfer(&mut self, transfer_id: TransferId) -> bool
Pause a transfer.
Sourcepub fn resume_transfer(&mut self, transfer_id: TransferId) -> bool
pub fn resume_transfer(&mut self, transfer_id: TransferId) -> bool
Resume a paused transfer.
Sourcepub fn cancel_transfer(&mut self, transfer_id: TransferId) -> bool
pub fn cancel_transfer(&mut self, transfer_id: TransferId) -> bool
Cancel a transfer.
Sourcepub fn get_chunk(
&self,
transfer_id: TransferId,
chunk_index: u32,
) -> Result<Option<AssetChunk>>
pub fn get_chunk( &self, transfer_id: TransferId, chunk_index: u32, ) -> Result<Option<AssetChunk>>
Get a specific chunk by index (for retries/resumes).
Sourcepub fn get_transfer_stats(
&self,
transfer_id: TransferId,
) -> Option<TransferStats>
pub fn get_transfer_stats( &self, transfer_id: TransferId, ) -> Option<TransferStats>
Get transfer statistics.
Sourcepub fn list_transfers(&self) -> Vec<TransferId> ⓘ
pub fn list_transfers(&self) -> Vec<TransferId> ⓘ
List all active transfers.
Auto Trait Implementations§
impl Freeze for AssetServer
impl RefUnwindSafe for AssetServer
impl Send for AssetServer
impl Sync for AssetServer
impl Unpin for AssetServer
impl UnwindSafe for AssetServer
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more