A better Rust ATProto crate
1[package]
2name = "jacquard-common"
3description = "Core AT Protocol types and utilities for Jacquard"
4edition.workspace = true
5version = "0.12.1"
6authors.workspace = true
7repository.workspace = true
8keywords.workspace = true
9categories.workspace = true
10readme.workspace = true
11exclude.workspace = true
12license.workspace = true
13
14[features]
15default = ["std", "service-auth", "reqwest-client", "crypto", "reqwest-compression"]
16std = [
17 "dep:tokio",
18 "dep:tokio-util",
19 "dep:regex",
20 "regex?/std",
21 "rand/std",
22 "rand/std_rng",
23 "rand/os_rng",
24 "rand/thread_rng",
25 "serde_json/std",
26 "serde/std",
27 "postcard/use-std",
28 "ciborium?/std",
29 "ciborium-io?/std",
30 "cid/std",
31 "ipld-core/std",
32 "multihash/std",
33 "multibase/std",
34 "serde_ipld_dagcbor/std",
35 "serde_html_form/std",
36 "miette",
37 "dep:bon",
38 "chrono/std",
39 "chrono/clock",
40 "http/std",
41 "bytes/std",
42 "oxilangtag/std",
43 "serde_bytes/std"
44]
45crypto = []
46crypto-ed25519 = ["crypto", "dep:ed25519-dalek"]
47crypto-k256 = ["crypto", "dep:k256", "k256/ecdsa"]
48crypto-p256 = ["crypto", "dep:p256", "p256/ecdsa"]
49service-auth = ["crypto-k256", "crypto-p256", "dep:signature"]
50reqwest-client = ["std", "dep:reqwest"]
51tracing = ["std", "dep:tracing"]
52streaming = ["n0-future", "futures", "reqwest/stream"]
53websocket = ["streaming", "tokio-tungstenite-wasm", "dep:ciborium", "dep:ciborium-io"]
54zstd = ["dep:zstd"]
55reqwest-compression = ["reqwest/gzip", "reqwest/brotli", "reqwest/deflate"]
56
57[dependencies]
58trait-variant.workspace = true
59bon = { workspace = true, optional = true }
60base64.workspace = true
61phf.workspace = true
62bytes = { workspace = true, features = ["serde"] }
63chrono.workspace = true
64cid.workspace = true
65ipld-core.workspace = true
66oxilangtag = { version = "0.1", default-features = false, features = ["alloc", "serde"] }
67miette = { workspace = true, optional = true } # also need to gate this to std only
68multibase = { version = "0.9.1", default-features = false }
69multihash = { version = "0.19.3", default-features = false, features = ["alloc"] }
70rand = { version = "0.9.2", default-features = false, features = ["alloc"] }
71serde.workspace = true
72serde_html_form.workspace = true # need to check these at workspace level
73serde_json.workspace = true
74smol_str.workspace = true
75thiserror.workspace = true
76rustversion.workspace = true
77unicode-segmentation.workspace = true
78fluent-uri.workspace = true
79http.workspace = true
80serde_bytes.workspace = true
81spin = { version = "0.10", default-features = false, features = ["lazy"] }
82maitake-sync = { version = "0.1", default-features = false }
83hashbrown = "0.15"
84
85reqwest = { workspace = true, optional = true, features = ["json", "charset"] }
86serde_ipld_dagcbor.workspace = true
87signature = { version = "2", optional = true }
88tracing = { workspace = true, optional = true }
89tokio = { workspace = true, default-features = false, features = ["sync"], optional = true }
90
91# Streaming support (optional)
92n0-future = { workspace = true, optional = true }
93futures = { version = "0.3", optional = true, default-features = false, features = ["alloc"] }
94tokio-tungstenite-wasm = { version = "0.4", default-features = false, optional = true }
95ciborium = { version = "0.2.0", default-features = false, optional = true }
96ciborium-io = { version = "0.2.0", default-features = false, optional = true }
97zstd = { version = "0.13", optional = true }
98postcard = { version = "1.1.3" }
99
100# regex-automata for no_std embedded, regex-lite for wasm, full regex with std on native
101regex-automata = { version = "0.4", default-features = false, features = ["alloc", "meta", "nfa-pikevm", "syntax"] }
102regex = { version = "1.11.3", default-features = false, features = ["perf-literal"], optional = true }
103
104[target.'cfg(target_family = "wasm")'.dependencies]
105getrandom = { version = "0.3.4", features = ["wasm_js"] }
106chrono = { workspace = true, features = ["wasmbind"] }
107getrandom_02 = { package = "getrandom", version = "0.2", features = ["js"] }
108regex-lite = "0.1"
109#ring = { version = "0.17", features = ["wasm32_unknown_unknown_js"]}
110reqwest = { workspace = true, optional = true, features = [ "json", "gzip", "rustls-tls-manual-roots"] }
111tokio-tungstenite-wasm = { version = "0.4", features = [], optional = true }
112
113[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
114reqwest = { workspace = true, optional = true, features = [ "http2", "gzip", "system-proxy", "rustls-tls"] }
115tokio-util = { version = "0.7.16", features = ["io"], optional = true }
116tokio-tungstenite-wasm = { version = "0.4", features = ["rustls-tls-native-roots"], optional = true }
117
118
119[dependencies.ed25519-dalek]
120version = "2"
121optional = true
122default-features = false
123features = ["pkcs8"]
124
125[dependencies.k256]
126version = "0.13"
127optional = true
128default-features = false
129features = ["arithmetic"]
130
131[dependencies.p256]
132workspace = true
133optional = true
134features = ["arithmetic"]
135
136[dev-dependencies]
137tokio = { version = "1", features = ["macros", "rt", "rt-multi-thread"] }
138futures-lite = "2.6"
139
140[package.metadata.docs.rs]
141features = [ "crypto-k256", "crypto-ed25519", "crypto-p256", "websocket", "zstd", "service-auth", "reqwest-client", "crypto"]