moonhook

A lightweight MoonBit WebHook processing framework for event driven automation.

webhook
moonbit
event
automation
Download zip
Author
Version
0.2.0
License
Apache-2.0
Last updated
15 hours ago
Downloads
3

Dependencies

#zzy12346/moonhook

HookHandler

type HookHandler = (HookEvent, HookContext) -> HookResult

MiddlewareFn

type MiddlewareFn = (HookEvent, HookContext) -> MiddlewareOutcome

HookContext

pub(all) struct HookContext {
provider : HookProvider
delivery_id : String
middleware_index : Int
} derive(Eq,
Debug
)

Context supplied to every middleware and terminal handler.

HookDiagnostic

pub(all) struct HookDiagnostic {
provider : String
event_type : String
delivery_id : String
route_name : String
status : HookStatus
verification : VerificationStatus
retry_delay_ms : Int
notes : Array[String]
} derive(Eq,
Debug
)

Human-readable delivery diagnostic report.

HookDiagnostic::HookDiagnostic

fn HookDiagnostic::HookDiagnostic(event : HookEvent, route_name : StringView, result : HookResult, verification : VerificationResult, retry_delay_ms? : Int, notes? : ArrayView[String]) -> HookDiagnostic

Create a diagnostic report from common framework artifacts.

HookDiagnostic::notes_text

fn HookDiagnostic::notes_text(self : HookDiagnostic) -> String

Render notes as a semicolon-separated suffix.

HookDiagnostic::summary

fn HookDiagnostic::summary(self : HookDiagnostic) -> String

Render a compact one-line report.

HookEvent

pub(all) struct HookEvent {
provider : HookProvider
event_type : String
delivery_id : String
idempotency_key : String
body : String
attributes : Map[String, String]
} derive(Eq,
Debug
)

A normalized event after provider-specific parsing.

HookEvent::attribute

fn HookEvent::attribute(self : HookEvent, key : StringView) -> String?

Read an optional parsed attribute.

HookEvent::is_from

fn HookEvent::is_from(self : HookEvent, provider : HookProvider) -> Bool

Check whether the event matches the given provider.

HookEvent::is_type

fn HookEvent::is_type(self : HookEvent, event_type : StringView) -> Bool

Check whether the event has a specific normalized type.

HookEvent::with_attribute

fn HookEvent::with_attribute(self : HookEvent, key : StringView, value : StringView) -> HookEvent

Attach a single parsed attribute to an event.

HookEvent::with_identity

fn HookEvent::with_identity(self : HookEvent, event_type? : String, delivery_id? : String) -> HookEvent

Replace normalized event identity and rebuild the idempotency key.

HookMiddleware

pub struct HookMiddleware {
name : String
callback : (HookEvent, HookContext) -> MiddlewareOutcome
}

Named middleware entry used by the processing pipeline.

HookMiddleware::HookMiddleware

fn HookMiddleware::HookMiddleware(name : StringView, callback : (HookEvent, HookContext) -> MiddlewareOutcome) -> HookMiddleware

HookPipeline

pub struct HookPipeline {
middlewares : Array[HookMiddleware]
handler : (HookEvent, HookContext) -> HookResult
}

Ordered middleware pipeline with a terminal event handler.

HookPipeline::middleware_count

fn HookPipeline::middleware_count(self : HookPipeline) -> Int

HookPipeline::run

fn HookPipeline::run(self : HookPipeline, initial : HookEvent) -> PipelineResult

Execute middleware in order and invoke the handler only when none halts.

HookPipeline::use_middleware

fn HookPipeline::use_middleware(self : HookPipeline, name : StringView, callback : (HookEvent, HookContext) -> MiddlewareOutcome) -> HookPipeline

Append middleware while preserving registration order.

HookProvider

pub(all) enum HookProvider {
GitHub
GitLab
Gitee
Feishu
WeCom
Stripe
Custom(String)
} derive(Eq,
Debug
)

Built-in provider families supported by MoonHook adapters.

HookProvider::slug

fn HookProvider::slug(self : HookProvider) -> String

Return a stable provider slug for logs, ids, and JSON fields.

HookRequest

pub(all) struct HookRequest {
provider : HookProvider
event_type : String
delivery_id : String
timestamp : String?
headers : Map[String, String]
body : String
} derive(Eq,
Debug
)

A normalized incoming WebHook request.

HookRequest::HookRequest

fn HookRequest::HookRequest(provider : HookProvider, event_type : StringView, delivery_id : StringView, body : StringView, timestamp? : StringView, headers? : Map[String, String]) -> HookRequest

Create a request with normalized names used by all adapters.

HookRequest::has_event_type

fn HookRequest::has_event_type(self : HookRequest, event_type : StringView) -> Bool

Check whether the request carries an event type.

HookRequest::header

fn HookRequest::header(self : HookRequest, name : StringView) -> String?

Return a header by normalized, case-insensitive key.

HookRequest::is_from

fn HookRequest::is_from(self : HookRequest, provider : HookProvider) -> Bool

Check whether the request comes from a provider.

HookRequest::to_event

fn HookRequest::to_event(self : HookRequest) -> HookEvent

Convert a raw request into the minimal normalized event.

HookResult

pub(all) struct HookResult {
status : HookStatus
message : String
retryable : Bool
attempts : Int
} derive(Eq,
Debug
)

A structured result that can be logged, retried, or asserted in tests.

HookResult::HookResult

fn HookResult::HookResult(status : HookStatus, message : StringView, retryable? : Bool, attempts? : Int) -> HookResult

Construct a general result.

HookResult::is_ok

fn HookResult::is_ok(self : HookResult) -> Bool

Whether the final state represents successful completion.

HookResult::should_retry

fn HookResult::should_retry(self : HookResult) -> Bool

Whether another delivery attempt should be scheduled.

HookRoute

pub(all) struct HookRoute {
name : String
provider : MatchMode
event_type : MatchMode
enabled : Bool
} derive(Eq,
Debug
)

A declarative WebHook route.

HookRoute::HookRoute

fn HookRoute::HookRoute(name : StringView, provider? : MatchMode, event_type? : MatchMode, enabled? : Bool) -> HookRoute

Build a route for all providers and all event types.

HookRoute::matches

fn HookRoute::matches(self : HookRoute, event : HookEvent) -> Bool

Check whether a route accepts an event.

HookRouter

pub(all) struct HookRouter {
routes : Array[HookRoute]
fallback : HookResult
} derive(Eq,
Debug
)

A router is intentionally declarative so tests and CLIs can inspect it.

HookRouter::add

fn HookRouter::add(self : HookRouter, route : HookRoute) -> HookRouter

Register a route and return the updated router.

HookRouter::dispatch

fn HookRouter::dispatch(self : HookRouter, event : HookEvent) -> HookResult

Dispatch returns an accepted result for a matched route and fallback otherwise.

HookRouter::enabled_count

fn HookRouter::enabled_count(self : HookRouter) -> Int

Count enabled routes for diagnostics.

HookRouter::match_event

fn HookRouter::match_event(self : HookRouter, event : HookEvent) -> HookRoute?

Resolve the first matching route.

HookRouter::on

fn HookRouter::on(self : HookRouter, provider : HookProvider, event_type : StringView, name? : StringView) -> HookRouter

Register an exact provider/event route.

HookRouter::on_event

fn HookRouter::on_event(self : HookRouter, event_type : StringView, name? : StringView) -> HookRouter

Register an event-type-only route.

HookRouter::on_provider

fn HookRouter::on_provider(self : HookRouter, provider : HookProvider, name? : StringView) -> HookRouter

Register a provider-only route.

HookRouter::with_fallback

fn HookRouter::with_fallback(self : HookRouter, fallback : HookResult) -> HookRouter

Replace the router fallback result.

HookStatus

pub(all) enum HookStatus {
Accepted
Ignored
Retried
Failed
} derive(Eq,
Debug
)

User-facing processing status returned by handlers and middleware.

HookStatus::to_string

fn HookStatus::to_string(self : HookStatus) -> String

Stable text used by diagnostics and examples.

HttpParseResult

pub(all) enum HttpParseResult {
Parsed(HttpRequest)
InvalidHttp(String)
} derive(Eq,
Debug
)

HttpRequest

pub(all) struct HttpRequest {
verb : String
path : String
version : String
headers : Map[String, String]
body : String
} derive(Eq,
Debug
)

Transport-neutral HTTP request parsed from a server or test fixture.

HttpResponse

pub(all) struct HttpResponse {
status : Int
reason : String
headers : Map[String, String]
body : String
} derive(Eq,
Debug
)

HTTP response returned by a WebHook endpoint.

HttpResponse::HttpResponse

fn HttpResponse::HttpResponse(status : Int, reason : StringView, body : StringView) -> HttpResponse

HttpResponse::render

fn HttpResponse::render(self : HttpResponse) -> String

Serialize a response for a TCP/HTTP server binding.

IdempotencyRecord

pub(all) struct IdempotencyRecord {
key : String
status : HookStatus
note : String
first_seen_at : String
expires_at : String
} derive(Eq,
Debug
)

Stored idempotency decision.

IdempotencyRecord::IdempotencyRecord

fn IdempotencyRecord::IdempotencyRecord(key : StringView, status : HookStatus, note : StringView, first_seen_at? : StringView, expires_at? : StringView) -> IdempotencyRecord

Create an idempotency record.

InMemoryDeduper

pub(all) struct InMemoryDeduper {
records : Map[String, IdempotencyRecord]
} derive(Eq,
Debug
)

In-memory idempotency store for tests, examples, and single-process tools.

InMemoryDeduper::contains

fn InMemoryDeduper::contains(self : InMemoryDeduper, key : StringView) -> Bool

Check if an idempotency key already exists.

InMemoryDeduper::get

fn InMemoryDeduper::get(self : InMemoryDeduper, key : StringView) -> IdempotencyRecord?

Read a record by key.

InMemoryDeduper::guard_event

fn InMemoryDeduper::guard_event(self : InMemoryDeduper, event : HookEvent) -> HookResult

Return accepted when the event is new and ignored when duplicate.

InMemoryDeduper::put

Store a record and return the updated deduper.

InMemoryDeduper::remember_event

fn InMemoryDeduper::remember_event(self : InMemoryDeduper, event : HookEvent, now : StringView) -> InMemoryDeduper

Store an accepted event.

InMemoryDeduper::should_process

fn InMemoryDeduper::should_process(self : InMemoryDeduper, event : HookEvent) -> Bool

Determine whether an event should be processed.

InMemoryDeduper::size

fn InMemoryDeduper::size(self : InMemoryDeduper) -> Int

Count records.

MatchMode

pub(all) enum MatchMode {
Any
Exact(String)
} derive(Eq,
Debug
)

Matching mode for a route condition.

MiddlewareOutcome

pub(all) enum MiddlewareOutcome {
Continue(HookEvent)
Halt(HookResult)
} derive(
Debug
)

Middleware either forwards an enriched event or stops processing.

PayloadDocument

pub(all) struct PayloadDocument {
body : String
json : Json?
error : String
} derive(
Debug
)

Result of parsing a WebHook JSON payload.

PipelineResult

pub(all) struct PipelineResult {
event : HookEvent
result : HookResult
executed : Array[String]
} derive(
Debug
)

Execution details exposed to HTTP adapters, logs, and tests.

ProviderAdapter

pub(all) struct ProviderAdapter {
provider : HookProvider
event_header : String
delivery_header : String
signature_header : String?
} derive(Eq,
Debug
)

Normalized provider adapter metadata.

ProviderAdapter::ProviderAdapter

fn ProviderAdapter::ProviderAdapter(provider : HookProvider, event_header : StringView, delivery_header : StringView, signature_header? : StringView) -> ProviderAdapter

Construct adapter metadata.

ProviderAdapter::parse_event

fn ProviderAdapter::parse_event(self : ProviderAdapter, headers : Map[String, String], body : StringView) -> HookEvent

Parse provider headers and a JSON body into a normalized, enriched event.

ProviderAdapter::parse_request

fn ProviderAdapter::parse_request(self : ProviderAdapter, headers : Map[String, String], body : StringView) -> HookRequest

Convert provider headers and body into a normalized request.

ProviderAdapter::verify_presence

fn ProviderAdapter::verify_presence(self : ProviderAdapter, request : HookRequest) -> VerificationResult

Verify the configured signature header is present when the adapter has one.

ProviderCapability

pub(all) struct ProviderCapability {
provider : HookProvider
supports_signature : Bool
supports_delivery_id : Bool
supports_retry : Bool
common_events : Array[String]
} derive(Eq,
Debug
)

Static provider capability description.

ProviderCapability::ProviderCapability

fn ProviderCapability::ProviderCapability(provider : HookProvider, supports_signature? : Bool, supports_delivery_id? : Bool, supports_retry? : Bool, common_events? : ArrayView[String]) -> ProviderCapability

Construct a provider capability profile.

RetryBackoff

pub(all) enum RetryBackoff {
NoBackoff
FixedDelay
LinearBackoff
ExponentialBackoff
} derive(Eq,
Debug
)

Retry delay strategy.

RetryPolicy

pub(all) struct RetryPolicy {
max_attempts : Int
base_delay_ms : Int
max_delay_ms : Int
jitter_ms : Int
backoff : RetryBackoff
} derive(Eq,
Debug
)

Declarative retry policy for failed WebHook processing.

RetryPolicy::RetryPolicy

fn RetryPolicy::RetryPolicy(max_attempts? : Int, base_delay_ms? : Int, max_delay_ms? : Int, jitter_ms? : Int, backoff? : RetryBackoff) -> RetryPolicy

Create a retry policy.

RetryPolicy::can_retry

fn RetryPolicy::can_retry(self : RetryPolicy, result : HookResult) -> Bool

Decide whether a result should be attempted again.

RetryPolicy::delay_for_attempt

fn RetryPolicy::delay_for_attempt(self : RetryPolicy, attempt : Int) -> Int

Compute delay for a 1-based attempt number.

RetryPolicy::schedule

fn RetryPolicy::schedule(self : RetryPolicy, result : HookResult) -> HookResult

Convert a failed result into a scheduled retry when policy allows it.

SignatureVerifier

pub(all) struct SignatureVerifier {
algorithm : String
header_name : String
secret_hint : String
} derive(Eq,
Debug
)

Signature verifier configuration.

SignatureVerifier::SignatureVerifier

fn SignatureVerifier::SignatureVerifier(algorithm : StringView, header_name : StringView, secret_hint : StringView) -> SignatureVerifier

Construct a verifier descriptor.

SignatureVerifier::verify_hmac_sha256

fn SignatureVerifier::verify_hmac_sha256(self : SignatureVerifier, request : HookRequest, secret : String) -> VerificationResult

Verify an HMAC-SHA256 signature against the unmodified request body. The comparison is constant-time and accepts the conventional sha256= prefix.

SignatureVerifier::verify_presence

fn SignatureVerifier::verify_presence(self : SignatureVerifier, request : HookRequest) -> VerificationResult

Check whether the required signature header exists.

VerificationResult

pub(all) struct VerificationResult {
status : VerificationStatus
reason : String
} derive(Eq,
Debug
)

Details returned by a verifier.

VerificationResult::VerificationResult

fn VerificationResult::VerificationResult(status : VerificationStatus, reason : StringView) -> VerificationResult

Construct a verification result.

VerificationStatus

pub(all) enum VerificationStatus {
Verified
MissingSignature
InvalidSignature
ExpiredTimestamp
Unsupported
} derive(Eq,
Debug
)

Verification outcome for request signatures and timestamp checks.

VerificationStatus::to_string

fn VerificationStatus::to_string(self : VerificationStatus) -> String

Stable text used by diagnostics and examples.

WebhookEndpoint

pub struct WebhookEndpoint {
path : String
adapter : ProviderAdapter
secret : String
router : HookRouter
middlewares : Array[HookMiddleware]
deduper : InMemoryDeduper
max_body_bytes : Int
}

Stateful endpoint joining HTTP parsing, HMAC verification, JSON parsing, middleware, deduplication, and routing.

WebhookEndpoint::handle_http

Handle a structured HTTP request supplied by any MoonBit server runtime. Signature verification happens before payload parsing and routing.

WebhookEndpoint::handle_raw

fn WebhookEndpoint::handle_raw(self : WebhookEndpoint, raw : String) -> (WebhookEndpoint, HttpResponse)

Parse and handle one raw HTTP/1.x request.

WebhookEndpoint::use_middleware

fn WebhookEndpoint::use_middleware(self : WebhookEndpoint, name : StringView, callback : (HookEvent, HookContext) -> MiddlewareOutcome) -> WebhookEndpoint

WebhookEndpoint::with_max_body_bytes

fn WebhookEndpoint::with_max_body_bytes(self : WebhookEndpoint, max_body_bytes : Int) -> WebhookEndpoint

accepted

fn accepted(message? : StringView) -> HookResult

Successful handling result.

all_generated_fixtures

fn all_generated_fixtures() -> Array[HookRequest]

Return all generated fixtures. This is intentionally explicit so coverage tools and docs can point to stable function names.

attribute_middleware

fn attribute_middleware(key : String, value : String) -> ((HookEvent, HookContext) -> MiddlewareOutcome)

Built-in middleware that enriches every event with a static attribute.

builtin_capabilities

fn builtin_capabilities() -> Array[ProviderCapability]

All built-in provider capability profiles.

constant_time_equal

fn constant_time_equal(left : String, right : String) -> Bool

Compare signatures without returning early on the first different byte. Length is folded into the accumulated difference to avoid prefix matches.

enrich_provider_event

fn enrich_provider_event(request : HookRequest) -> HookEvent

Enrich a normalized event with real provider payload metadata.

exact

fn exact(value : StringView) -> MatchMode

Build an exact matcher.

exponential_retry_policy

fn exponential_retry_policy(attempts? : Int, base_delay_ms? : Int, max_delay_ms? : Int) -> RetryPolicy

Retry with an exponential delay.

failed

fn failed(message? : StringView, retryable? : Bool) -> HookResult

Failed event result.

feishu_adapter

fn feishu_adapter() -> ProviderAdapter

Feishu adapter metadata.

feishu_capability

fn feishu_capability() -> ProviderCapability

Feishu capability profile.

find_capability

fn find_capability(provider : HookProvider) -> ProviderCapability?

Find a capability by provider.

fixed_retry_policy

fn fixed_retry_policy(attempts? : Int, delay_ms? : Int) -> RetryPolicy

Retry with a fixed delay.

fixture_feishu_001

fn fixture_feishu_001() -> HookRequest

fixture_feishu_002

fn fixture_feishu_002() -> HookRequest

fixture_feishu_003

fn fixture_feishu_003() -> HookRequest

fixture_feishu_004

fn fixture_feishu_004() -> HookRequest

fixture_feishu_005

fn fixture_feishu_005() -> HookRequest

fixture_feishu_006

fn fixture_feishu_006() -> HookRequest

fixture_feishu_007

fn fixture_feishu_007() -> HookRequest

fixture_feishu_008

fn fixture_feishu_008() -> HookRequest

fixture_feishu_009

fn fixture_feishu_009() -> HookRequest

fixture_feishu_010

fn fixture_feishu_010() -> HookRequest

fixture_feishu_011

fn fixture_feishu_011() -> HookRequest

fixture_feishu_012

fn fixture_feishu_012() -> HookRequest

fixture_feishu_013

fn fixture_feishu_013() -> HookRequest

fixture_feishu_014

fn fixture_feishu_014() -> HookRequest

fixture_feishu_015

fn fixture_feishu_015() -> HookRequest

fixture_feishu_016

fn fixture_feishu_016() -> HookRequest

fixture_feishu_017

fn fixture_feishu_017() -> HookRequest

fixture_feishu_018

fn fixture_feishu_018() -> HookRequest

fixture_feishu_019

fn fixture_feishu_019() -> HookRequest

fixture_feishu_020

fn fixture_feishu_020() -> HookRequest

fixture_feishu_021

fn fixture_feishu_021() -> HookRequest

fixture_feishu_022

fn fixture_feishu_022() -> HookRequest

fixture_feishu_023

fn fixture_feishu_023() -> HookRequest

fixture_feishu_024

fn fixture_feishu_024() -> HookRequest

fixture_feishu_025

fn fixture_feishu_025() -> HookRequest

fixture_feishu_026

fn fixture_feishu_026() -> HookRequest

fixture_feishu_027

fn fixture_feishu_027() -> HookRequest

fixture_feishu_028

fn fixture_feishu_028() -> HookRequest

fixture_feishu_029

fn fixture_feishu_029() -> HookRequest

fixture_feishu_030

fn fixture_feishu_030() -> HookRequest

fixture_feishu_031

fn fixture_feishu_031() -> HookRequest

fixture_feishu_032

fn fixture_feishu_032() -> HookRequest

fixture_feishu_033

fn fixture_feishu_033() -> HookRequest

fixture_feishu_034

fn fixture_feishu_034() -> HookRequest

fixture_feishu_035

fn fixture_feishu_035() -> HookRequest

fixture_feishu_036

fn fixture_feishu_036() -> HookRequest

fixture_feishu_037

fn fixture_feishu_037() -> HookRequest

fixture_feishu_038

fn fixture_feishu_038() -> HookRequest

fixture_feishu_039

fn fixture_feishu_039() -> HookRequest

fixture_feishu_040

fn fixture_feishu_040() -> HookRequest

fixture_feishu_041

fn fixture_feishu_041() -> HookRequest

fixture_feishu_042

fn fixture_feishu_042() -> HookRequest

fixture_feishu_043

fn fixture_feishu_043() -> HookRequest

fixture_feishu_044

fn fixture_feishu_044() -> HookRequest

fixture_feishu_045

fn fixture_feishu_045() -> HookRequest

fixture_feishu_046

fn fixture_feishu_046() -> HookRequest

fixture_feishu_047

fn fixture_feishu_047() -> HookRequest

fixture_feishu_048

fn fixture_feishu_048() -> HookRequest

fixture_feishu_049

fn fixture_feishu_049() -> HookRequest

fixture_feishu_050

fn fixture_feishu_050() -> HookRequest

fixture_gitee_001

fn fixture_gitee_001() -> HookRequest

fixture_gitee_002

fn fixture_gitee_002() -> HookRequest

fixture_gitee_003

fn fixture_gitee_003() -> HookRequest

fixture_gitee_004

fn fixture_gitee_004() -> HookRequest

fixture_gitee_005

fn fixture_gitee_005() -> HookRequest

fixture_gitee_006

fn fixture_gitee_006() -> HookRequest

fixture_gitee_007

fn fixture_gitee_007() -> HookRequest

fixture_gitee_008

fn fixture_gitee_008() -> HookRequest

fixture_gitee_009

fn fixture_gitee_009() -> HookRequest

fixture_gitee_010

fn fixture_gitee_010() -> HookRequest

fixture_gitee_011

fn fixture_gitee_011() -> HookRequest

fixture_gitee_012

fn fixture_gitee_012() -> HookRequest

fixture_gitee_013

fn fixture_gitee_013() -> HookRequest

fixture_gitee_014

fn fixture_gitee_014() -> HookRequest

fixture_gitee_015

fn fixture_gitee_015() -> HookRequest

fixture_gitee_016

fn fixture_gitee_016() -> HookRequest

fixture_gitee_017

fn fixture_gitee_017() -> HookRequest

fixture_gitee_018

fn fixture_gitee_018() -> HookRequest

fixture_gitee_019

fn fixture_gitee_019() -> HookRequest

fixture_gitee_020

fn fixture_gitee_020() -> HookRequest

fixture_gitee_021

fn fixture_gitee_021() -> HookRequest

fixture_gitee_022

fn fixture_gitee_022() -> HookRequest

fixture_gitee_023

fn fixture_gitee_023() -> HookRequest

fixture_gitee_024

fn fixture_gitee_024() -> HookRequest

fixture_gitee_025

fn fixture_gitee_025() -> HookRequest

fixture_gitee_026

fn fixture_gitee_026() -> HookRequest

fixture_gitee_027

fn fixture_gitee_027() -> HookRequest

fixture_gitee_028

fn fixture_gitee_028() -> HookRequest

fixture_gitee_029

fn fixture_gitee_029() -> HookRequest

fixture_gitee_030

fn fixture_gitee_030() -> HookRequest

fixture_gitee_031

fn fixture_gitee_031() -> HookRequest

fixture_gitee_032

fn fixture_gitee_032() -> HookRequest

fixture_gitee_033

fn fixture_gitee_033() -> HookRequest

fixture_gitee_034

fn fixture_gitee_034() -> HookRequest

fixture_gitee_035

fn fixture_gitee_035() -> HookRequest

fixture_gitee_036

fn fixture_gitee_036() -> HookRequest

fixture_gitee_037

fn fixture_gitee_037() -> HookRequest

fixture_gitee_038

fn fixture_gitee_038() -> HookRequest

fixture_gitee_039

fn fixture_gitee_039() -> HookRequest

fixture_gitee_040

fn fixture_gitee_040() -> HookRequest

fixture_gitee_041

fn fixture_gitee_041() -> HookRequest

fixture_gitee_042

fn fixture_gitee_042() -> HookRequest

fixture_gitee_043

fn fixture_gitee_043() -> HookRequest

fixture_gitee_044

fn fixture_gitee_044() -> HookRequest

fixture_gitee_045

fn fixture_gitee_045() -> HookRequest

fixture_gitee_046

fn fixture_gitee_046() -> HookRequest

fixture_gitee_047

fn fixture_gitee_047() -> HookRequest

fixture_gitee_048

fn fixture_gitee_048() -> HookRequest

fixture_gitee_049

fn fixture_gitee_049() -> HookRequest

fixture_gitee_050

fn fixture_gitee_050() -> HookRequest

fixture_github_001

fn fixture_github_001() -> HookRequest

fixture_github_002

fn fixture_github_002() -> HookRequest

fixture_github_003

fn fixture_github_003() -> HookRequest

fixture_github_004

fn fixture_github_004() -> HookRequest

fixture_github_005

fn fixture_github_005() -> HookRequest

fixture_github_006

fn fixture_github_006() -> HookRequest

fixture_github_007

fn fixture_github_007() -> HookRequest

fixture_github_008

fn fixture_github_008() -> HookRequest

fixture_github_009

fn fixture_github_009() -> HookRequest

fixture_github_010

fn fixture_github_010() -> HookRequest

fixture_github_011

fn fixture_github_011() -> HookRequest

fixture_github_012

fn fixture_github_012() -> HookRequest

fixture_github_013

fn fixture_github_013() -> HookRequest

fixture_github_014

fn fixture_github_014() -> HookRequest

fixture_github_015

fn fixture_github_015() -> HookRequest

fixture_github_016

fn fixture_github_016() -> HookRequest

fixture_github_017

fn fixture_github_017() -> HookRequest

fixture_github_018

fn fixture_github_018() -> HookRequest

fixture_github_019

fn fixture_github_019() -> HookRequest

fixture_github_020

fn fixture_github_020() -> HookRequest

fixture_github_021

fn fixture_github_021() -> HookRequest

fixture_github_022

fn fixture_github_022() -> HookRequest

fixture_github_023

fn fixture_github_023() -> HookRequest

fixture_github_024

fn fixture_github_024() -> HookRequest

fixture_github_025

fn fixture_github_025() -> HookRequest

fixture_github_026

fn fixture_github_026() -> HookRequest

fixture_github_027

fn fixture_github_027() -> HookRequest

fixture_github_028

fn fixture_github_028() -> HookRequest

fixture_github_029

fn fixture_github_029() -> HookRequest

fixture_github_030

fn fixture_github_030() -> HookRequest

fixture_github_031

fn fixture_github_031() -> HookRequest

fixture_github_032

fn fixture_github_032() -> HookRequest

fixture_github_033

fn fixture_github_033() -> HookRequest

fixture_github_034

fn fixture_github_034() -> HookRequest

fixture_github_035

fn fixture_github_035() -> HookRequest

fixture_github_036

fn fixture_github_036() -> HookRequest

fixture_github_037

fn fixture_github_037() -> HookRequest

fixture_github_038

fn fixture_github_038() -> HookRequest

fixture_github_039

fn fixture_github_039() -> HookRequest

fixture_github_040

fn fixture_github_040() -> HookRequest

fixture_github_041

fn fixture_github_041() -> HookRequest

fixture_github_042

fn fixture_github_042() -> HookRequest

fixture_github_043

fn fixture_github_043() -> HookRequest

fixture_github_044

fn fixture_github_044() -> HookRequest

fixture_github_045

fn fixture_github_045() -> HookRequest

fixture_github_046

fn fixture_github_046() -> HookRequest

fixture_github_047

fn fixture_github_047() -> HookRequest

fixture_github_048

fn fixture_github_048() -> HookRequest

fixture_github_049

fn fixture_github_049() -> HookRequest

fixture_github_050

fn fixture_github_050() -> HookRequest

fixture_gitlab_001

fn fixture_gitlab_001() -> HookRequest

fixture_gitlab_002

fn fixture_gitlab_002() -> HookRequest

fixture_gitlab_003

fn fixture_gitlab_003() -> HookRequest

fixture_gitlab_004

fn fixture_gitlab_004() -> HookRequest

fixture_gitlab_005

fn fixture_gitlab_005() -> HookRequest

fixture_gitlab_006

fn fixture_gitlab_006() -> HookRequest

fixture_gitlab_007

fn fixture_gitlab_007() -> HookRequest

fixture_gitlab_008

fn fixture_gitlab_008() -> HookRequest

fixture_gitlab_009

fn fixture_gitlab_009() -> HookRequest

fixture_gitlab_010

fn fixture_gitlab_010() -> HookRequest

fixture_gitlab_011

fn fixture_gitlab_011() -> HookRequest

fixture_gitlab_012

fn fixture_gitlab_012() -> HookRequest

fixture_gitlab_013

fn fixture_gitlab_013() -> HookRequest

fixture_gitlab_014

fn fixture_gitlab_014() -> HookRequest

fixture_gitlab_015

fn fixture_gitlab_015() -> HookRequest

fixture_gitlab_016

fn fixture_gitlab_016() -> HookRequest

fixture_gitlab_017

fn fixture_gitlab_017() -> HookRequest

fixture_gitlab_018

fn fixture_gitlab_018() -> HookRequest

fixture_gitlab_019

fn fixture_gitlab_019() -> HookRequest

fixture_gitlab_020

fn fixture_gitlab_020() -> HookRequest

fixture_gitlab_021

fn fixture_gitlab_021() -> HookRequest

fixture_gitlab_022

fn fixture_gitlab_022() -> HookRequest

fixture_gitlab_023

fn fixture_gitlab_023() -> HookRequest

fixture_gitlab_024

fn fixture_gitlab_024() -> HookRequest

fixture_gitlab_025

fn fixture_gitlab_025() -> HookRequest

fixture_gitlab_026

fn fixture_gitlab_026() -> HookRequest

fixture_gitlab_027

fn fixture_gitlab_027() -> HookRequest

fixture_gitlab_028

fn fixture_gitlab_028() -> HookRequest

fixture_gitlab_029

fn fixture_gitlab_029() -> HookRequest

fixture_gitlab_030

fn fixture_gitlab_030() -> HookRequest

fixture_gitlab_031

fn fixture_gitlab_031() -> HookRequest

fixture_gitlab_032

fn fixture_gitlab_032() -> HookRequest

fixture_gitlab_033

fn fixture_gitlab_033() -> HookRequest

fixture_gitlab_034

fn fixture_gitlab_034() -> HookRequest

fixture_gitlab_035

fn fixture_gitlab_035() -> HookRequest

fixture_gitlab_036

fn fixture_gitlab_036() -> HookRequest

fixture_gitlab_037

fn fixture_gitlab_037() -> HookRequest

fixture_gitlab_038

fn fixture_gitlab_038() -> HookRequest

fixture_gitlab_039

fn fixture_gitlab_039() -> HookRequest

fixture_gitlab_040

fn fixture_gitlab_040() -> HookRequest

fixture_gitlab_041

fn fixture_gitlab_041() -> HookRequest

fixture_gitlab_042

fn fixture_gitlab_042() -> HookRequest

fixture_gitlab_043

fn fixture_gitlab_043() -> HookRequest

fixture_gitlab_044

fn fixture_gitlab_044() -> HookRequest

fixture_gitlab_045

fn fixture_gitlab_045() -> HookRequest

fixture_gitlab_046

fn fixture_gitlab_046() -> HookRequest

fixture_gitlab_047

fn fixture_gitlab_047() -> HookRequest

fixture_gitlab_048

fn fixture_gitlab_048() -> HookRequest

fixture_gitlab_049

fn fixture_gitlab_049() -> HookRequest

fixture_gitlab_050

fn fixture_gitlab_050() -> HookRequest

fixture_stripe_001

fn fixture_stripe_001() -> HookRequest

fixture_stripe_002

fn fixture_stripe_002() -> HookRequest

fixture_stripe_003

fn fixture_stripe_003() -> HookRequest

fixture_stripe_004

fn fixture_stripe_004() -> HookRequest

fixture_stripe_005

fn fixture_stripe_005() -> HookRequest

fixture_stripe_006

fn fixture_stripe_006() -> HookRequest

fixture_stripe_007

fn fixture_stripe_007() -> HookRequest

fixture_stripe_008

fn fixture_stripe_008() -> HookRequest

fixture_stripe_009

fn fixture_stripe_009() -> HookRequest

fixture_stripe_010

fn fixture_stripe_010() -> HookRequest

fixture_stripe_011

fn fixture_stripe_011() -> HookRequest

fixture_stripe_012

fn fixture_stripe_012() -> HookRequest

fixture_stripe_013

fn fixture_stripe_013() -> HookRequest

fixture_stripe_014

fn fixture_stripe_014() -> HookRequest

fixture_stripe_015

fn fixture_stripe_015() -> HookRequest

fixture_stripe_016

fn fixture_stripe_016() -> HookRequest

fixture_stripe_017

fn fixture_stripe_017() -> HookRequest

fixture_stripe_018

fn fixture_stripe_018() -> HookRequest

fixture_stripe_019

fn fixture_stripe_019() -> HookRequest

fixture_stripe_020

fn fixture_stripe_020() -> HookRequest

fixture_stripe_021

fn fixture_stripe_021() -> HookRequest

fixture_stripe_022

fn fixture_stripe_022() -> HookRequest

fixture_stripe_023

fn fixture_stripe_023() -> HookRequest

fixture_stripe_024

fn fixture_stripe_024() -> HookRequest

fixture_stripe_025

fn fixture_stripe_025() -> HookRequest

fixture_stripe_026

fn fixture_stripe_026() -> HookRequest

fixture_stripe_027

fn fixture_stripe_027() -> HookRequest

fixture_stripe_028

fn fixture_stripe_028() -> HookRequest

fixture_stripe_029

fn fixture_stripe_029() -> HookRequest

fixture_stripe_030

fn fixture_stripe_030() -> HookRequest

fixture_stripe_031

fn fixture_stripe_031() -> HookRequest

fixture_stripe_032

fn fixture_stripe_032() -> HookRequest

fixture_stripe_033

fn fixture_stripe_033() -> HookRequest

fixture_stripe_034

fn fixture_stripe_034() -> HookRequest

fixture_stripe_035

fn fixture_stripe_035() -> HookRequest

fixture_stripe_036

fn fixture_stripe_036() -> HookRequest

fixture_stripe_037

fn fixture_stripe_037() -> HookRequest

fixture_stripe_038

fn fixture_stripe_038() -> HookRequest

fixture_stripe_039

fn fixture_stripe_039() -> HookRequest

fixture_stripe_040

fn fixture_stripe_040() -> HookRequest

fixture_stripe_041

fn fixture_stripe_041() -> HookRequest

fixture_stripe_042

fn fixture_stripe_042() -> HookRequest

fixture_stripe_043

fn fixture_stripe_043() -> HookRequest

fixture_stripe_044

fn fixture_stripe_044() -> HookRequest

fixture_stripe_045

fn fixture_stripe_045() -> HookRequest

fixture_stripe_046

fn fixture_stripe_046() -> HookRequest

fixture_stripe_047

fn fixture_stripe_047() -> HookRequest

fixture_stripe_048

fn fixture_stripe_048() -> HookRequest

fixture_stripe_049

fn fixture_stripe_049() -> HookRequest

fixture_stripe_050

fn fixture_stripe_050() -> HookRequest

fixture_wecom_001

fn fixture_wecom_001() -> HookRequest

fixture_wecom_002

fn fixture_wecom_002() -> HookRequest

fixture_wecom_003

fn fixture_wecom_003() -> HookRequest

fixture_wecom_004

fn fixture_wecom_004() -> HookRequest

fixture_wecom_005

fn fixture_wecom_005() -> HookRequest

fixture_wecom_006

fn fixture_wecom_006() -> HookRequest

fixture_wecom_007

fn fixture_wecom_007() -> HookRequest

fixture_wecom_008

fn fixture_wecom_008() -> HookRequest

fixture_wecom_009

fn fixture_wecom_009() -> HookRequest

fixture_wecom_010

fn fixture_wecom_010() -> HookRequest

fixture_wecom_011

fn fixture_wecom_011() -> HookRequest

fixture_wecom_012

fn fixture_wecom_012() -> HookRequest

fixture_wecom_013

fn fixture_wecom_013() -> HookRequest

fixture_wecom_014

fn fixture_wecom_014() -> HookRequest

fixture_wecom_015

fn fixture_wecom_015() -> HookRequest

fixture_wecom_016

fn fixture_wecom_016() -> HookRequest

fixture_wecom_017

fn fixture_wecom_017() -> HookRequest

fixture_wecom_018

fn fixture_wecom_018() -> HookRequest

fixture_wecom_019

fn fixture_wecom_019() -> HookRequest

fixture_wecom_020

fn fixture_wecom_020() -> HookRequest

fixture_wecom_021

fn fixture_wecom_021() -> HookRequest

fixture_wecom_022

fn fixture_wecom_022() -> HookRequest

fixture_wecom_023

fn fixture_wecom_023() -> HookRequest

fixture_wecom_024

fn fixture_wecom_024() -> HookRequest

fixture_wecom_025

fn fixture_wecom_025() -> HookRequest

fixture_wecom_026

fn fixture_wecom_026() -> HookRequest

fixture_wecom_027

fn fixture_wecom_027() -> HookRequest

fixture_wecom_028

fn fixture_wecom_028() -> HookRequest

fixture_wecom_029

fn fixture_wecom_029() -> HookRequest

fixture_wecom_030

fn fixture_wecom_030() -> HookRequest

fixture_wecom_031

fn fixture_wecom_031() -> HookRequest

fixture_wecom_032

fn fixture_wecom_032() -> HookRequest

fixture_wecom_033

fn fixture_wecom_033() -> HookRequest

fixture_wecom_034

fn fixture_wecom_034() -> HookRequest

fixture_wecom_035

fn fixture_wecom_035() -> HookRequest

fixture_wecom_036

fn fixture_wecom_036() -> HookRequest

fixture_wecom_037

fn fixture_wecom_037() -> HookRequest

fixture_wecom_038

fn fixture_wecom_038() -> HookRequest

fixture_wecom_039

fn fixture_wecom_039() -> HookRequest

fixture_wecom_040

fn fixture_wecom_040() -> HookRequest

fixture_wecom_041

fn fixture_wecom_041() -> HookRequest

fixture_wecom_042

fn fixture_wecom_042() -> HookRequest

fixture_wecom_043

fn fixture_wecom_043() -> HookRequest

fixture_wecom_044

fn fixture_wecom_044() -> HookRequest

fixture_wecom_045

fn fixture_wecom_045() -> HookRequest

fixture_wecom_046

fn fixture_wecom_046() -> HookRequest

fixture_wecom_047

fn fixture_wecom_047() -> HookRequest

fixture_wecom_048

fn fixture_wecom_048() -> HookRequest

fixture_wecom_049

fn fixture_wecom_049() -> HookRequest

fixture_wecom_050

fn fixture_wecom_050() -> HookRequest

gitee_adapter

fn gitee_adapter() -> ProviderAdapter

Gitee adapter metadata.

gitee_capability

fn gitee_capability() -> ProviderCapability

Gitee capability profile.

github_adapter

fn github_adapter() -> ProviderAdapter

GitHub adapter metadata.

github_capability

fn github_capability() -> ProviderCapability

GitHub capability profile.

github_sha256_verifier

fn github_sha256_verifier() -> SignatureVerifier

Standard GitHub HMAC-SHA256 verifier descriptor.

gitlab_adapter

fn gitlab_adapter() -> ProviderAdapter

GitLab adapter metadata.

gitlab_capability

fn gitlab_capability() -> ProviderCapability

GitLab capability profile.

gitlab_token_verifier

fn gitlab_token_verifier() -> SignatureVerifier

Standard GitLab token verifier descriptor.

header_value

fn header_value(headers : Map[String, String], name : StringView) -> String?

Read a header from a raw map using HTTP's case-insensitive name rules.

hmac_sha256_hex

fn hmac_sha256_hex(secret : String, message : String) -> String

Return the lowercase HMAC-SHA256 digest of a UTF-8 payload.

ignored

fn ignored(message? : StringView) -> HookResult

Ignored event result.

json_path

fn json_path(json : Json, path : Array[String]) -> Json?

Return a nested JSON value using object-key path segments.

make_idempotency_key

fn make_idempotency_key(provider : HookProvider, delivery_id : String) -> String

Build the default idempotency key from provider and delivery id.

new_github_endpoint

fn new_github_endpoint(path : StringView, secret : String, router : HookRouter) -> WebhookEndpoint

Create a GitHub-compatible HMAC-SHA256 WebHook endpoint.

new_hook_pipeline

fn new_hook_pipeline(handler : (HookEvent, HookContext) -> HookResult) -> HookPipeline

new_hook_router

fn new_hook_router() -> HookRouter

Create an empty router.

new_in_memory_deduper

fn new_in_memory_deduper() -> InMemoryDeduper

Create an empty in-memory store.

no_retry_policy

fn no_retry_policy() -> RetryPolicy

Disable retries.

parse_http_request

fn parse_http_request(raw : String) -> HttpParseResult

Parse an HTTP/1.x request and normalize header names to lowercase.

parse_payload

fn parse_payload(body : String) -> PayloadDocument

Parse JSON while preserving invalid input as a diagnostic value.

payload_path

fn payload_path(body : String, path : Array[String]) -> String?

Read a nested JSON value as text.

report_matched_delivery

fn report_matched_delivery(event : HookEvent, route : HookRoute, verification : VerificationResult) -> HookDiagnostic

Build a report for a matched route.

report_unmatched_delivery

fn report_unmatched_delivery(event : HookEvent, verification : VerificationResult) -> HookDiagnostic

Build a report for an unmatched delivery.

representative_fixtures

fn representative_fixtures() -> Array[HookRequest]

Return one representative fixture for each built-in provider.

require_attribute_middleware

fn require_attribute_middleware(key : String) -> ((HookEvent, HookContext) -> MiddlewareOutcome)

Built-in middleware that rejects events missing a parsed attribute.

require_json_middleware

fn require_json_middleware() -> ((HookEvent, HookContext) -> MiddlewareOutcome)

Built-in middleware that requires valid JSON before routing.

retried

fn retried(message? : StringView, attempts? : Int) -> HookResult

Retry event result.

sha256_hex

fn sha256_hex(message : String) -> String

Return the lowercase SHA-256 digest of a UTF-8 string.

sign_github_body

fn sign_github_body(secret : String, body : String) -> String

Build the GitHub-compatible signature header value for an exact raw body.

stripe_adapter

fn stripe_adapter() -> ProviderAdapter

Stripe adapter metadata.

stripe_capability

fn stripe_capability() -> ProviderCapability

Stripe capability profile.

stripe_signature_verifier

fn stripe_signature_verifier() -> SignatureVerifier

Standard Stripe signature verifier descriptor.

verify_github_signature

fn verify_github_signature(request : HookRequest, secret : String) -> VerificationResult

Verify a GitHub X-Hub-Signature-256 header using the exact raw body.

wecom_adapter

fn wecom_adapter() -> ProviderAdapter

WeCom adapter metadata.

wecom_capability

fn wecom_capability() -> ProviderCapability

WeCom capability profile.