[package] name = "meta-feeder-sdk" version = "1.7.0" edition = "2021" rust-version = "1.85" license = "MIT" repository = "https://github.com/worph/meta-feeder-sdk" description = "Source-agnostic foundation for MetaMesh gateway feeders: the FeederPlugin trait, the content-addressing hash families, the structured-query evaluator, and an axum harness that serves any set of plugins over the feeder HTTP contract." readme = "README.md" keywords = ["metamesh", "feeder", "gateway", "content-addressing", "plugin"] categories = ["api-bindings", "web-programming::http-server"] # Not on crates.io yet โ€” consumers depend on a git tag while the contract is # still moving (see docs/project-architecture/feeder-architecture.md ยง8). # Flip this, not the dep form, when `cargo add meta-feeder-sdk` should work. publish = false # This repo IS the crate. The explicit (empty) workspace table stops it being # absorbed into a parent workspace when it is vendored or path-overridden into # a feeder checkout during local development. [workspace] # Source-agnostic foundation shared by the gateway core and every feeder # sidecar binary: the `FeederPlugin` trait, the content-addressing hash # families, the per-plugin redb cache, the shared HTTP/cache helpers, the # structured-query evaluator, and the axum `serve_feeders` harness that wraps # any set of `FeederPlugin`s in the feeder HTTP contract. # # Deliberately libp2p-free / blockstore-free: a feeder finds + fetches bytes; # the gateway core owns hashing-into-the-blockstore, the meta-core store-back, # and the libp2p wire. Keep heavy deps (librqbit, beetswap, cid, libp2p) OUT # of here so feeders that don't need them don't pay for them. [features] default = ["feeder"] # Everything a feeder sidecar (and the transport contract) builds on: the # FeederPlugin trait, hashing, the redb cache, the axum harness. On by default # so existing consumers build exactly what they always did. feeder = [ "beacon", "dep:axum", "dep:hyper", "dep:reqwest", "dep:base64", "dep:futures", "dep:async-trait", "dep:anyhow", "dep:thiserror", "dep:sha2", "dep:bytes", "dep:regex", "dep:redb", ] # Beacon v2 local discovery (`src/beacon/`). Needs only tokio/serde/tracing/libc, # so a meta-* service takes the SDK with `default-features = false, # features = ["beacon"]` and pulls in none of the feeder machinery. beacon = ["dep:libc"] # The meta-share transport-plugin contract (`src/transport/`): the hull's # client, the plugins' axum harness, the focus replica, shared error/range # types. Off by default so feeders build exactly what they always did. transport = ["feeder", "dep:cid", "dep:tokio-util"] # Conformance checks any transport implementation must pass. testkit = ["transport"] [dependencies] # Async runtime + HTTP server (the serve_feeders harness) tokio = { version = "1.40", features = ["full"] } axum = { version = "0.7", features = ["json"], optional = true } hyper = { version = "1", features = ["full"], optional = true } reqwest = { version = "0.12", features = ["json", "rustls-tls", "stream"], default-features = false, optional = true } # Serialization serde = { version = "1", features = ["derive"] } serde_json = "1" base64 = { version = "0.22", optional = true } # Utilities futures = { version = "0.3", optional = true } async-trait = { version = "0.1", optional = true } anyhow = { version = "1", optional = true } thiserror = { version = "1", optional = true } tracing = "0.1" sha2 = { version = "0.10", optional = true } bytes = { version = "1", optional = true } # Title-tag parsing (shared filename_meta โ€” season/episode/quality/codec/languages). regex = { version = "1", optional = true } # Per-plugin midhash/blob cache. Schema is identical to meta-share v1 โ€” see # cache.rs. Pure-Rust single-process embedded store. redb = { version = "2", optional = true } # CID parsing for the transport contract only (`transport::cid`). Optional so # feeders don't pull it. cid = { version = "0.11", optional = true } # Raw sockets for `beacon` (per-interface multicast) and statvfs(2) for # `transport::fsutil::available_bytes`. libc = { version = "0.2", optional = true } # `ReaderStream` for `transport::file`. tokio-util = { version = "0.7", features = ["io"], optional = true } [dev-dependencies] tempfile = "3" tower = { version = "0.4", features = ["util"] } tokio = { version = "1.40", features = ["full", "test-util"] }