///|
pub struct ProviderCapabilities {
profile : ProviderProfile
supports_timestamp : Bool
supports_event_id : Bool
supports_event_type : Bool
recommended_window_seconds : Int
notes : String
} derive(Eq, Debug)
///|
pub fn ProviderCapabilities::new(
profile : ProviderProfile,
supports_timestamp : Bool,
supports_event_id : Bool,
supports_event_type : Bool,
recommended_window_seconds : Int,
notes : String,
) -> ProviderCapabilities {
{
profile,
supports_timestamp,
supports_event_id,
supports_event_type,
recommended_window_seconds,
notes,
}
}
///|
pub fn github_capabilities() -> ProviderCapabilities {
ProviderCapabilities::new(
ProviderProfile::github(),
false,
true,
true,
300,
"GitHub HMAC-SHA256 raw-body signature plus delivery id; no signed timestamp.",
)
}
///|
pub fn feishu_capabilities() -> ProviderCapabilities {
ProviderCapabilities::new(
ProviderProfile::feishu(),
true,
true,
true,
300,
"Feishu style request timestamp and nonce headers.",
)
}
///|
pub fn stripe_capabilities() -> ProviderCapabilities {
ProviderCapabilities::new(
ProviderProfile::stripe(),
true,
true,
true,
300,
"Stripe style versioned signature and event id mapping.",
)
}
///|
pub fn generic_capabilities() -> ProviderCapabilities {
ProviderCapabilities::new(
ProviderProfile::generic(),
true,
true,
true,
300,
"Generic HMAC-like webhook profile for internal systems.",
)
}
///|
pub fn capabilities_catalog() -> Array[ProviderCapabilities] {
[
github_capabilities(),
feishu_capabilities(),
stripe_capabilities(),
generic_capabilities(),
]
}
///|
pub fn capability_for(name : String) -> ProviderCapabilities {
let catalog = capabilities_catalog()
for i in 0.. VerificationPolicy {
VerificationPolicy::for_provider(capability_for(provider_name).profile)
.with_secret(secret)
.with_clock(now)
}
///|
pub fn provider_markdown_table() -> String {
let catalog = capabilities_catalog()
let builder = StringBuilder::new()
builder.write_string("| provider | signature | timestamp | event | id |\n")
builder.write_string("| --- | --- | --- | --- | --- |\n")
for i in 0.. WebhookRequest {
{ ..request, provider: capability_for(provider_name).profile.name }
}
///|
pub fn describe_provider(provider_name : String) -> String {
let cap = capability_for(provider_name)
cap.profile.name + ": " + cap.notes
}