Skip to main content

LinearStatusWebhook

Struct LinearStatusWebhook 

Source
pub struct LinearStatusWebhook;
Expand description

Linear’s inbound status webhook, over core’s ProviderScheme: Linear-Signature: <hex>, HMAC-SHA256 over the raw body with no prefix, read by cratefield_core::receive_status — verify, then parse.

Replay protection is not provided here. Linear signs the raw body alone — its webhookTimestamp (ms) rides inside that body, not in a header — and core’s ProviderScheme can only bind a timestamp header into the signed payload, so the verifier’s replay tolerance has nothing to run on and a captured delivery verifies forever, exactly as with Jira. This type parses the body and nothing else; a caller wanting a freshness window must read webhookTimestamp (and the delivery’s webhookId) out of the already-verified body itself. Terminate on TLS and rotate the per-tenant secret either way.

Trait Implementations§

Source§

impl StatusWebhook for LinearStatusWebhook

Source§

fn verifier(&self) -> WebhookVerifier

Constant-time compare, fail-closed on unreadable input: inherited from core’s WebhookVerifier, never re-derived here.

Source§

fn parse(&self, body: &[u8]) -> Result<Option<StatusUpdate>, InboundStatusError>

Reads one verified delivery. An update on "type": "Issue" that carries a state and names the state it came from (updatedFrom.stateId) maps onto a StatusUpdate keyed by the same issue UUID Tracker::file returns; every other event, and an update that touched no state, is Ok(None) — verified silence, not an error.

§Errors

InboundStatusError::Malformed when the verified body is not JSON or not an event of the shape Linear sends, or a state change arrives with no id to key it by. Never InboundStatusError::Signature — that belongs to cratefield_core::receive_status, before parsing.

Source§

fn kind(&self) -> &'static str

The vendor this webhook speaks for, for logs and metrics — the same name Destination::kind uses for the outbound direction.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more