Files
meta-transport-ipfs/src/api/mod.rs
T

60 lines
2.3 KiB
Rust

//! The plugin's slice of meta-share's former `api` module: the state the moved
//! IPFS code reads (kept under the same names, so it moved unedited), the dag
//! walker, the `/ipfs/:cid` gateway handler and the bitswap byte path.
use std::path::PathBuf;
use std::sync::Arc;
use meta_feeder_sdk::transport::{Event, FocusView, HullClient};
use tokio::sync::{mpsc, OnceCell};
use tracing::debug;
pub mod files;
pub mod ipfs_gateway;
pub mod ipfs_walker;
pub use meta_feeder_sdk::transport::ApiError;
pub mod range {
pub use meta_feeder_sdk::transport::range::*;
}
/// What the IPFS tier reaches for — the subset of meta-share's `AppState` it
/// used, under the same field names.
pub struct AppState {
pub block_store: Arc<crate::filestore::SharedBlockstore>,
pub ingress: Arc<crate::ingress::IngressRegistry>,
pub swarm_tx: mpsc::Sender<crate::swarm::Command>,
pub peer_directory: crate::swarm::PeerDirectory,
/// The playback focus the hull pushes.
pub focus: Arc<FocusView>,
pub http: reqwest::Client,
/// Callbacks into the hull (seed rows, promoted containers, display names).
pub hull: HullClient,
pub data_dir: PathBuf,
/// For reading library bytes (refs into meta-core files) — byte reads only.
pub meta_core_url: Option<String>,
pub webdav_url_cache: Arc<OnceCell<String>>,
/// Announce seeded cids on the public DHT (`META_SHARE_SEED_DHT_PROVIDE`,
/// default = public mode). Decided here, where `PUBLIC_ADDR` is known; the
/// hull always asks and this gates.
pub seed_dht_provide: bool,
/// Gateways that can redeem pointers, fastest first (`/ipfs-tier/resolve`).
pub gateways: Arc<crate::gateways::Gateways>,
}
/// "This peer now seeds `cid`" — the hull writes the seed row (and decides on
/// the DHT announce). Every seed this plugin reports on its own is cache-origin;
/// library seeds are recorded by the hull, which drives them.
pub async fn record_ipfs_seed(state: &AppState, cid: &str, name: &str, size: u64, container: Option<&str>) {
let ev = Event::Seed {
cid: cid.to_string(),
kind: "ipfs".into(),
name: name.to_string(),
size_bytes: size,
container: container.map(str::to_string),
};
if let Err(e) = state.hull.emit(&ev).await {
debug!(cid, error = %e, "seed notification not delivered");
}
}