A new crate and service, crates/directory, live at ipx-dir.sdf1.net. ipx servers send the public feeds their people subscribe to (POST /v1/snapshot, replacing what that token sent before); the directory fetches each feed's title, artwork, category, description and latest twenty items every six hours with ipx-feed, and lists them A to Z and by subscribers summed over every server. It holds metadata only, never a file or a file's address. Tokens are in its config file as SHA-256 hashes, each ro, rw or rwa, and the file is read again within a minute of a change, so adding and revoking one is an edit and nothing else; a revoked token takes its server's counts. At first they were to come from environment variables, which would have meant recreating the container to add one. A file that does not load keeps the tokens as they were. Every address sent is checked with ipx_feed::url_looks_private, the check ipx makes before sending, so one server's miss does not publish a paid feed to every other; an rwa token can remove and block what both miss. Deployed: ipx-directory in the ipx Arcane project, database ipx_directory (its own login) on the databases project's Postgres, which db-backup already covers, and a tunnel route with no Access in front. The store's tests run on Postgres as well as SQLite when IPX_TEST_DATABASE_URL is set. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
43 lines
2.1 KiB
TOML
43 lines
2.1 KiB
TOML
[workspace]
|
|
members = ["crates/ipx", "crates/feed", "crates/directory"]
|
|
resolver = "3"
|
|
|
|
# One version for the whole workspace: what a release sets, and what the logo's tooltip shows.
|
|
[workspace.package]
|
|
version = "0.12.1-dev"
|
|
edition = "2024"
|
|
|
|
[workspace.dependencies]
|
|
ipx-feed = { path = "crates/feed" }
|
|
ipx-directory = { path = "crates/directory" }
|
|
ammonia = "4.1.4"
|
|
anyhow = "1.0.104"
|
|
argon2 = "0.6.0"
|
|
atom_syndication = "0.12.10"
|
|
axum = "0.8.9"
|
|
chrono = { version = "0.4.45", default-features = false, features = ["std", "clock"] }
|
|
clap = { version = "4.6.6", features = ["derive"] }
|
|
futures-util = { version = "0.3.34", default-features = false, features = ["std"] }
|
|
jsonwebtoken = { version = "11.1.0", default-features = false, features = ["aws_lc_rs"] }
|
|
librqbit = { version = "9.0.1", default-features = false, features = ["rust-tls", "http-api-client"] }
|
|
opentelemetry = { version = "0.33", default-features = false, features = ["trace"] }
|
|
opentelemetry-otlp = { version = "0.33", default-features = false, features = ["trace", "http-proto", "reqwest-blocking-client"] }
|
|
opentelemetry_sdk = { version = "0.33", default-features = false, features = ["trace"] }
|
|
opml = "1.1.6"
|
|
percent-encoding = "2.3.2"
|
|
quick-xml = { version = "0.42.0", features = ["escape-html"] }
|
|
reqwest = { version = "0.13.5", default-features = false, features = ["rustls", "http2", "gzip", "stream", "json", "charset", "system-proxy"] }
|
|
rss = "2.1.1"
|
|
sea-orm = { version = "2.0.3", default-features = false, features = ["sqlx-sqlite", "sqlx-postgres", "runtime-tokio-rustls", "macros", "with-json", "sqlite-use-returning-for-3_35"] }
|
|
serde = { version = "1.0.229", features = ["derive"] }
|
|
serde_json = "1.0.151"
|
|
sha2 = "0.10.9"
|
|
tokio = { version = "1.53.1", features = ["rt-multi-thread", "macros", "fs", "io-util", "net", "sync", "time", "signal", "process"] }
|
|
toml = "1.1.5"
|
|
tower = { version = "0.5.3", features = ["util"] }
|
|
tower-http = { version = "0.7.1", features = ["fs"] }
|
|
tracing = "0.1.44"
|
|
tracing-opentelemetry = { version = "0.34", default-features = false }
|
|
tracing-subscriber = { version = "0.3.23", features = ["env-filter", "json"] }
|
|
url = "2.5.8"
|