*/ public function backoff(): array { return [30, 120, 600]; } public function handle(ChannelRegistry $registry): void { $delivery = Delivery::with(['event.user', 'event.source', 'channel'])->findOrFail($this->deliveryId); if ($delivery->result !== DeliveryResult::Pending) { return; } if ($delivery->event->isTerminal()) { $delivery->update(['result' => DeliveryResult::Failed, 'error' => 'skipped: событие уже закрыто']); return; } $outcome = $registry->for($delivery->channel->type) ->deliver($delivery->event, $delivery->event->user, $delivery->channel->config, $delivery); if ($outcome->ok) { $delivery->update(['result' => DeliveryResult::Ok, 'sent_at' => now(), 'error' => null, 'meta' => $outcome->meta]); return; } $delivery->update(['error' => $outcome->error]); throw new DeliveryFailed($outcome->error ?? 'delivery failed'); } public function failed(Throwable $e): void { Delivery::whereKey($this->deliveryId) ->where('result', DeliveryResult::Pending->value) ->update(['result' => DeliveryResult::Failed, 'error' => $e->getMessage()]); } }