CLI app for developers prototyping atproto functionality
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add Phase 5 dependencies (tokio-tungstenite, ciborium)

Phase 5 implements the subscription stage for com.atproto.label.subscribeLabels
with two-connection backfill+live-tail strategy.

Dependencies:
- bytes 1.10: byte buffer types for frame payloads
- ciborium 0.2: CBOR decoding for frame header and payload blocks
- futures-util 0.3: StreamExt for WebSocket frame iteration
- tokio-tungstenite 0.29 with rustls-tls-native-roots: WebSocket client
with native certificate validation (no OpenSSL coupling)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

+98
+94
Cargo.lock
··· 144 144 "async-trait", 145 145 "atrium-api", 146 146 "atrium-xrpc-client", 147 + "bytes", 148 + "ciborium", 147 149 "clap", 150 + "futures-util", 148 151 "hickory-resolver", 149 152 "humantime", 150 153 "insta", ··· 158 161 "serde_json", 159 162 "thiserror 2.0.18", 160 163 "tokio", 164 + "tokio-tungstenite", 161 165 "tracing", 162 166 "tracing-subscriber", 163 167 "url", ··· 381 385 ] 382 386 383 387 [[package]] 388 + name = "ciborium" 389 + version = "0.2.2" 390 + source = "registry+https://github.com/rust-lang/crates.io-index" 391 + checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" 392 + dependencies = [ 393 + "ciborium-io", 394 + "ciborium-ll", 395 + "serde", 396 + ] 397 + 398 + [[package]] 399 + name = "ciborium-io" 400 + version = "0.2.2" 401 + source = "registry+https://github.com/rust-lang/crates.io-index" 402 + checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" 403 + 404 + [[package]] 405 + name = "ciborium-ll" 406 + version = "0.2.2" 407 + source = "registry+https://github.com/rust-lang/crates.io-index" 408 + checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" 409 + dependencies = [ 410 + "ciborium-io", 411 + "half", 412 + ] 413 + 414 + [[package]] 384 415 name = "cid" 385 416 version = "0.11.1" 386 417 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 580 611 version = "0.8.21" 581 612 source = "registry+https://github.com/rust-lang/crates.io-index" 582 613 checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 614 + 615 + [[package]] 616 + name = "crunchy" 617 + version = "0.2.4" 618 + source = "registry+https://github.com/rust-lang/crates.io-index" 619 + checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" 583 620 584 621 [[package]] 585 622 name = "crypto-bigint" ··· 883 920 dependencies = [ 884 921 "futures-core", 885 922 "futures-macro", 923 + "futures-sink", 886 924 "futures-task", 887 925 "pin-project-lite", 888 926 "slab", ··· 954 992 "ff", 955 993 "rand_core 0.6.4", 956 994 "subtle", 995 + ] 996 + 997 + [[package]] 998 + name = "half" 999 + version = "2.7.1" 1000 + source = "registry+https://github.com/rust-lang/crates.io-index" 1001 + checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" 1002 + dependencies = [ 1003 + "cfg-if", 1004 + "crunchy", 1005 + "zerocopy", 957 1006 ] 958 1007 959 1008 [[package]] ··· 2324 2373 ] 2325 2374 2326 2375 [[package]] 2376 + name = "sha1" 2377 + version = "0.10.6" 2378 + source = "registry+https://github.com/rust-lang/crates.io-index" 2379 + checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 2380 + dependencies = [ 2381 + "cfg-if", 2382 + "cpufeatures", 2383 + "digest", 2384 + ] 2385 + 2386 + [[package]] 2327 2387 name = "sha2" 2328 2388 version = "0.10.9" 2329 2389 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2623 2683 ] 2624 2684 2625 2685 [[package]] 2686 + name = "tokio-tungstenite" 2687 + version = "0.29.0" 2688 + source = "registry+https://github.com/rust-lang/crates.io-index" 2689 + checksum = "8f72a05e828585856dacd553fba484c242c46e391fb0e58917c942ee9202915c" 2690 + dependencies = [ 2691 + "futures-util", 2692 + "log", 2693 + "rustls", 2694 + "rustls-native-certs", 2695 + "rustls-pki-types", 2696 + "tokio", 2697 + "tokio-rustls", 2698 + "tungstenite", 2699 + ] 2700 + 2701 + [[package]] 2626 2702 name = "tokio-util" 2627 2703 version = "0.7.18" 2628 2704 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2762 2838 version = "0.2.5" 2763 2839 source = "registry+https://github.com/rust-lang/crates.io-index" 2764 2840 checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 2841 + 2842 + [[package]] 2843 + name = "tungstenite" 2844 + version = "0.29.0" 2845 + source = "registry+https://github.com/rust-lang/crates.io-index" 2846 + checksum = "6c01152af293afb9c7c2a57e4b559c5620b421f6d133261c60dd2d0cdb38e6b8" 2847 + dependencies = [ 2848 + "bytes", 2849 + "data-encoding", 2850 + "http", 2851 + "httparse", 2852 + "log", 2853 + "rand", 2854 + "rustls", 2855 + "rustls-pki-types", 2856 + "sha1", 2857 + "thiserror 2.0.18", 2858 + ] 2765 2859 2766 2860 [[package]] 2767 2861 name = "typenum"
+4
Cargo.toml
··· 10 10 async-trait = "0.1" 11 11 atrium-api = "0.25" 12 12 atrium-xrpc-client = { version = "0.5", default-features = false, features = ["reqwest"] } 13 + bytes = "1.10" 14 + ciborium = "0.2" 13 15 clap = { version = "4.6", features = ["derive"] } 16 + futures-util = { version = "0.3", default-features = false, features = ["std"] } 14 17 hickory-resolver = "0.25" 15 18 humantime = "2.1" 16 19 k256 = { version = "0.13", features = ["ecdsa"] } ··· 23 26 serde_json = "1.0" 24 27 thiserror = "2.0" 25 28 tokio = { version = "1.51", features = ["rt", "macros", "time", "net"] } 29 + tokio-tungstenite = { version = "0.29", default-features = false, features = ["connect", "rustls-tls-native-roots"] } 26 30 tracing = "0.1" 27 31 tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt"] } 28 32 url = "2.5"