cratefield-adapter-github-app 0.2.3

GitHub App auth for the Cratefield harness: RS256 app JWTs, installation tokens and the user-to-server code exchange
Documentation
[package]
name = "cratefield-adapter-github-app"
description = "GitHub App auth for the Cratefield harness: RS256 app JWTs, installation tokens and the user-to-server code exchange"
readme = "README.md"
keywords = ["cratefield", "github", "app", "jwt", "auth"]
categories = ["api-bindings"]
include = ["src/**/*", "README.md"]
version = "0.2.3"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
repository.workspace = true

[lints]
workspace = true

[dependencies]
cratefield-core = { workspace = true }
# RS256 signing and the keyed token cache, so a GitHub App JWT and the
# installation tokens it mints reuse the push adapters' verified stack
# rather than a second copy of base64url(header).base64url(claims).base64url(sig).
cratefield-push-auth = { workspace = true }
http = { workspace = true }
bytes = { workspace = true }
serde = { workspace = true }
serde_json = { workspace = true }
thiserror = { workspace = true }
tracing = { workspace = true }
time = { workspace = true }
# The async mutex that makes "check cache -> exchange -> store" one exchange
# for concurrent cold callers. wasm32-safe (no std thread primitives).
futures-util = { workspace = true }
# Not called from this crate — nothing here draws randomness. It is here to
# pick getrandom's `wasm_js` backend, which `ulid` (via cratefield-core)
# pulls in and which otherwise only a leaf crate selects, so that
# `cargo build --target wasm32-unknown-unknown -p cratefield-adapter-github-app`
# stands on its own (issue #178/#432 pattern).
getrandom = { workspace = true }

[dev-dependencies]
# The recording `HttpClient` and step clock these tests drive are hand-rolled
# in tests/common/mod.rs, the way crates/adapter-apns/tests/apns.rs does: the
# kit's `FakeHttpClient` captures the method, URI and body but not the
# headers, and its `FixedClock` cannot advance — both of which the `401`
# replay and expiry tests need.
async-trait = { workspace = true }
pollster = { workspace = true }
time = { workspace = true }
# The JWT test derives the fixture's public key from its private PEM instead
# of committing a second file, and verifies the RS256 signature the long way
# round. `pem` parses the PKCS#1 form GitHub hands out.
rsa = { workspace = true, features = ["pem"] }
base64 = { workspace = true }
futures-util = { workspace = true }