pub struct WriterHandle { /* private fields */ }Expand description
Cheap handle to the writer task. Clones share the same underlying
mpsc channel; a drop of the last clone is a silent shutdown signal
to the writer task (receiver closes). For a clean shutdown that
releases the lease row, call WriterHandle::shutdown.
Implementations§
Source§impl WriterHandle
impl WriterHandle
Sourcepub async fn apply_label(&self, req: ApplyLabelRequest) -> Result<LabelEvent>
pub async fn apply_label(&self, req: ApplyLabelRequest) -> Result<LabelEvent>
Submit an apply-label request. Resolves when the writer has
committed the transaction and broadcast the event, or returns an
Err describing why the write was rejected.
Sourcepub async fn negate_label(&self, req: NegateLabelRequest) -> Result<LabelEvent>
pub async fn negate_label(&self, req: NegateLabelRequest) -> Result<LabelEvent>
Submit a negate-label request. Returns Error::LabelNotFound if
no applied label currently exists for (service_did, uri, val).
Sourcepub async fn resolve_report(
&self,
req: ResolveReportRequest,
) -> Result<ResolvedReport>
pub async fn resolve_report( &self, req: ResolveReportRequest, ) -> Result<ResolvedReport>
Resolve a report, optionally applying a label in the same atomic transaction. The label INSERT + audit row + report UPDATE + resolution audit row all commit together or not at all; the label broadcast fires post-commit inside the writer task (§F5 + §F12 atomicity contract).
Errors:
Error::ReportNotFound—report_iddoesn’t exist.Error::ReportAlreadyResolved— report is not in thependingstate. Handler maps to a genericInvalidRequest.
Sourcepub async fn sweep(&self, _req: SweepRequest) -> Result<SweepResult>
pub async fn sweep(&self, _req: SweepRequest) -> Result<SweepResult>
Trigger a §F4 retention sweep through the writer task. Loops
over single-batch dispatches until a batch returns
has_more = false, aggregating rows + duration.
Other writer commands interleave between batches (single-writer
invariant + bounded latency).
Returns rows_deleted = 0, batches = 0 when the writer was
spawned with retention_days = None (sweep configured off):
the first batch returns immediately and the loop exits with
the no-op result.
Sourcepub async fn record_action(
&self,
req: RecordActionRequest,
) -> Result<RecordedAction>
pub async fn record_action( &self, req: RecordActionRequest, ) -> Result<RecordedAction>
Record a graduated-action moderation event (§F20 / #51). The writer validates inputs, computes the strike value at action time via the v1.4 calculators (#48/#49/#50/#51), inserts the subject_actions row, updates the strike-state cache, and writes a hash-chained audit_log row — all in a single transaction. Errors:
Error::ReasonNotFoundwhen a reason identifier is not declared in[moderation_reasons].Error::DurationRequiredForTempSuspensionfortemp_suspensionwithoutduration_iso.Error::DurationOnlyForTempSuspensionfor non-temp types withduration_isoset.Error::Signingfor malformed subject / duration / etc.
Sourcepub async fn revoke_action(
&self,
req: RevokeActionRequest,
) -> Result<RevokedAction>
pub async fn revoke_action( &self, req: RevokeActionRequest, ) -> Result<RevokedAction>
Revoke a previously-recorded action (§F20 / #51). Errors:
Error::ActionNotFoundwhen no row matchesaction_id.Error::ActionAlreadyRevokedwhen the row’s revoked_at is already non-NULL — the schema trigger forbids re-revocation; the handler catches it before the UPDATE.
Sourcepub async fn confirm_pending_action(
&self,
req: ConfirmPendingActionRequest,
) -> Result<ConfirmedPendingAction>
pub async fn confirm_pending_action( &self, req: ConfirmPendingActionRequest, ) -> Result<ConfirmedPendingAction>
Confirm a pending policy action (§F22 / #74). The proposed
action carried on the pending row is materialized as a real
subject_actions row (actor_kind=‘moderator’,
triggered_by_policy_rule preserves the rule that proposed
it), labels emit per crate::labels::policy::LabelEmissionPolicy,
the pending row’s resolution columns transition NULL →
‘confirmed’, and the strike-state cache is recomputed — all
in one transaction under a single
pending_policy_action_confirmed audit row. Errors:
Error::PendingActionNotFoundwhen no row matchespending_id.Error::PendingAlreadyResolvedwhen the row’s resolution column is already non-NULL.Error::SubjectTakendownwhen the subject already carries an unrevoked Takedown — defensive guard against the auto-dismissal-on-takedown race (#76).
Sourcepub async fn dismiss_pending_action(
&self,
req: DismissPendingActionRequest,
) -> Result<DismissedPendingAction>
pub async fn dismiss_pending_action( &self, req: DismissPendingActionRequest, ) -> Result<DismissedPendingAction>
Dismiss a pending policy action (§F22 / #75). The pending
row’s resolution columns transition NULL → ‘dismissed’ and
a single hash-chained pending_policy_action_dismissed
audit row commits with the UPDATE — no subject_actions
row, no label emission, no strike-state change. The
pending row stays in the table as forensic record
(confirmed_action_id stays NULL since no action was
created).
Errors:
Error::PendingActionNotFoundwhen no row matchespending_id.Error::PendingAlreadyResolvedwhen the row’s resolution column is already non-NULL.
Sourcepub async fn append_audit(&self, row: AuditRowForAppend) -> Result<i64>
pub async fn append_audit(&self, row: AuditRowForAppend) -> Result<i64>
Append a hash-chained audit row through the writer task (#39).
Used by in-process callers that don’t already hold a transaction
— e.g., retentionSweep’s post-sweep audit row. Callers that
have an open transaction (writer-internal handlers,
flag_reporter) use crate::audit::append::append_in_tx
directly so the audit row commits atomically with the rest of
their work. Cross-process CLIs (publish/unpublish-service-
record) use crate::audit::append::append_via_pool.
Returns the inserted audit_log.id.
Sourcepub fn subscribe(&self) -> Receiver<LabelEvent>
pub fn subscribe(&self) -> Receiver<LabelEvent>
Subscribe to committed events. The returned receiver lags past
the internal broadcast buffer; the consumer (subscribeLabels, #7)
turns RecvError::Lagged into a connection close.
Sourcepub fn receiver_count(&self) -> usize
pub fn receiver_count(&self) -> usize
Count of live broadcast receivers. Exposed for test sync points
(the WS handler subscribes asynchronously after upgrade; tests
that want to emit an event “after the subscriber is ready” poll
this until it reaches the expected count). Not a production hot
path — broadcast::Sender::receiver_count walks an atomic chain.
Sourcepub fn shutdown_signal(&self) -> Receiver<bool>
pub fn shutdown_signal(&self) -> Receiver<bool>
Observe writer lifecycle. The returned receiver starts at false
and flips to true once exactly, when the writer has accepted a
shutdown command and is about to release the lease. Holders close
downstream connections gracefully on the true transition.
Trait Implementations§
Source§impl Clone for WriterHandle
impl Clone for WriterHandle
Auto Trait Implementations§
impl !RefUnwindSafe for WriterHandle
impl !UnwindSafe for WriterHandle
impl Freeze for WriterHandle
impl Send for WriterHandle
impl Sync for WriterHandle
impl Unpin for WriterHandle
impl UnsafeUnpin for WriterHandle
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<A, B, T> HttpServerConnExec<A, B> for Twhere
B: Body,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi Quirk value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);