From 99123dc5fdd954542bb6ccaa75c014aa0bf260b4 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 20 Apr 2026 13:58:09 +0100 Subject: [PATCH] refactor: share native approval runtime types --- src/infra/approval-handler-runtime.ts | 58 ++++------------ src/infra/approval-native-runtime-types.ts | 61 ++++++++++++++++ src/infra/approval-native-runtime.ts | 81 +++++++--------------- 3 files changed, 99 insertions(+), 101 deletions(-) create mode 100644 src/infra/approval-native-runtime-types.ts diff --git a/src/infra/approval-handler-runtime.ts b/src/infra/approval-handler-runtime.ts index 66e1c3a499a..3929499550d 100644 --- a/src/infra/approval-handler-runtime.ts +++ b/src/infra/approval-handler-runtime.ts @@ -18,11 +18,11 @@ import type { ChannelApprovalNativeRuntimeAdapter, ChannelApprovalNativeRuntimeSpec, } from "./approval-handler-runtime-types.js"; -import type { ChannelApprovalNativePlannedTarget } from "./approval-native-delivery.js"; -import { - createChannelNativeApprovalRuntime, - type PreparedChannelNativeApprovalTarget, -} from "./approval-native-runtime.js"; +import type { + ChannelNativeApprovalDeliveryCallbacks, + ChannelNativeApprovalTransportSpec, +} from "./approval-native-runtime-types.js"; +import { createChannelNativeApprovalRuntime } from "./approval-native-runtime.js"; import { buildExpiredApprovalView, buildPendingApprovalView, @@ -337,24 +337,7 @@ export type ChannelApprovalHandlerTransportSpec< TPreparedTarget, TPendingContent, TRequest extends ApprovalRequest = ApprovalRequest, -> = { - prepareTarget: (params: { - plannedTarget: ChannelApprovalNativePlannedTarget; - request: TRequest; - approvalKind: ChannelApprovalKind; - pendingContent: TPendingContent; - }) => - | PreparedChannelNativeApprovalTarget - | null - | Promise | null>; - deliverTarget: (params: { - plannedTarget: ChannelApprovalNativePlannedTarget; - preparedTarget: TPreparedTarget; - request: TRequest; - approvalKind: ChannelApprovalKind; - pendingContent: TPendingContent; - }) => TPendingEntry | null | Promise; -}; +> = ChannelNativeApprovalTransportSpec; export type ChannelApprovalHandlerLifecycleSpec< TPendingEntry, @@ -362,29 +345,12 @@ export type ChannelApprovalHandlerLifecycleSpec< TPendingContent, TRequest extends ApprovalRequest = ApprovalRequest, TResolved extends ApprovalResolved = ApprovalResolved, -> = { - onDeliveryError?: (params: { - error: unknown; - plannedTarget: ChannelApprovalNativePlannedTarget; - request: TRequest; - approvalKind: ChannelApprovalKind; - pendingContent: TPendingContent; - }) => void; - onDuplicateSkipped?: (params: { - plannedTarget: ChannelApprovalNativePlannedTarget; - preparedTarget: PreparedChannelNativeApprovalTarget; - request: TRequest; - approvalKind: ChannelApprovalKind; - pendingContent: TPendingContent; - }) => void; - onDelivered?: (params: { - plannedTarget: ChannelApprovalNativePlannedTarget; - preparedTarget: PreparedChannelNativeApprovalTarget; - request: TRequest; - approvalKind: ChannelApprovalKind; - pendingContent: TPendingContent; - entry: TPendingEntry; - }) => void; +> = ChannelNativeApprovalDeliveryCallbacks< + TPendingEntry, + TPreparedTarget, + TPendingContent, + TRequest +> & { finalizeResolved: (params: { request: TRequest; resolved: TResolved; diff --git a/src/infra/approval-native-runtime-types.ts b/src/infra/approval-native-runtime-types.ts new file mode 100644 index 00000000000..bce0b21572f --- /dev/null +++ b/src/infra/approval-native-runtime-types.ts @@ -0,0 +1,61 @@ +import type { ChannelApprovalNativePlannedTarget } from "./approval-native-delivery.js"; +import type { ChannelApprovalKind } from "./approval-types.js"; + +export type PreparedChannelNativeApprovalTarget = { + dedupeKey: string; + target: TPreparedTarget; +}; + +export type ChannelNativeApprovalTransportSpec< + TPendingEntry, + TPreparedTarget, + TPendingContent, + TRequest, +> = { + prepareTarget: (params: { + plannedTarget: ChannelApprovalNativePlannedTarget; + request: TRequest; + approvalKind: ChannelApprovalKind; + pendingContent: TPendingContent; + }) => + | PreparedChannelNativeApprovalTarget + | null + | Promise | null>; + deliverTarget: (params: { + plannedTarget: ChannelApprovalNativePlannedTarget; + preparedTarget: TPreparedTarget; + request: TRequest; + approvalKind: ChannelApprovalKind; + pendingContent: TPendingContent; + }) => TPendingEntry | null | Promise; +}; + +export type ChannelNativeApprovalDeliveryCallbacks< + TPendingEntry, + TPreparedTarget, + TPendingContent, + TRequest, +> = { + onDeliveryError?: (params: { + error: unknown; + plannedTarget: ChannelApprovalNativePlannedTarget; + request: TRequest; + approvalKind: ChannelApprovalKind; + pendingContent: TPendingContent; + }) => void; + onDuplicateSkipped?: (params: { + plannedTarget: ChannelApprovalNativePlannedTarget; + preparedTarget: PreparedChannelNativeApprovalTarget; + request: TRequest; + approvalKind: ChannelApprovalKind; + pendingContent: TPendingContent; + }) => void; + onDelivered?: (params: { + plannedTarget: ChannelApprovalNativePlannedTarget; + preparedTarget: PreparedChannelNativeApprovalTarget; + request: TRequest; + approvalKind: ChannelApprovalKind; + pendingContent: TPendingContent; + entry: TPendingEntry; + }) => void; +}; diff --git a/src/infra/approval-native-runtime.ts b/src/infra/approval-native-runtime.ts index 5d79bf9d4cd..08cb9cd8ff5 100644 --- a/src/infra/approval-native-runtime.ts +++ b/src/infra/approval-native-runtime.ts @@ -6,6 +6,11 @@ import { type ChannelApprovalNativeDeliveryPlan, } from "./approval-native-delivery.js"; import { createApprovalNativeRouteReporter } from "./approval-native-route-coordinator.js"; +import type { + ChannelNativeApprovalDeliveryCallbacks, + ChannelNativeApprovalTransportSpec, + PreparedChannelNativeApprovalTarget, +} from "./approval-native-runtime-types.js"; import type { ChannelApprovalKind } from "./approval-types.js"; import { createExecApprovalChannelRuntime, @@ -21,10 +26,7 @@ import type { PluginApprovalRequest } from "./plugin-approvals.js"; type ApprovalRequest = ExecApprovalRequest | PluginApprovalRequest; type ApprovalResolved = ExecApprovalResolved | PluginApprovalResolved; -export type PreparedChannelNativeApprovalTarget = { - dedupeKey: string; - target: TPreparedTarget; -}; +export type { PreparedChannelNativeApprovalTarget } from "./approval-native-runtime-types.js"; export type ChannelNativeApprovalPlanDeliveryResult = { entries: TPendingEntry[]; @@ -147,57 +149,26 @@ type ChannelNativeApprovalRuntimeAdapter< > = Omit< ExecApprovalChannelRuntimeAdapter, "deliverRequested" -> & { - channel?: string; - channelLabel?: string; - accountId?: string | null; - nativeAdapter?: ChannelApprovalNativeAdapter | null; - resolveApprovalKind?: (request: TRequest) => ChannelApprovalKind; - buildPendingContent: (params: { - request: TRequest; - approvalKind: ChannelApprovalKind; - nowMs: number; - }) => TPendingContent | Promise; - prepareTarget: (params: { - plannedTarget: ChannelApprovalNativePlannedTarget; - request: TRequest; - approvalKind: ChannelApprovalKind; - pendingContent: TPendingContent; - }) => - | PreparedChannelNativeApprovalTarget - | null - | Promise | null>; - deliverTarget: (params: { - plannedTarget: ChannelApprovalNativePlannedTarget; - preparedTarget: TPreparedTarget; - request: TRequest; - approvalKind: ChannelApprovalKind; - pendingContent: TPendingContent; - }) => TPendingEntry | null | Promise; - onDeliveryError?: (params: { - error: unknown; - plannedTarget: ChannelApprovalNativePlannedTarget; - request: TRequest; - approvalKind: ChannelApprovalKind; - pendingContent: TPendingContent; - }) => void; - onDuplicateSkipped?: (params: { - plannedTarget: ChannelApprovalNativePlannedTarget; - preparedTarget: PreparedChannelNativeApprovalTarget; - request: TRequest; - approvalKind: ChannelApprovalKind; - pendingContent: TPendingContent; - }) => void; - onDelivered?: (params: { - plannedTarget: ChannelApprovalNativePlannedTarget; - preparedTarget: PreparedChannelNativeApprovalTarget; - request: TRequest; - approvalKind: ChannelApprovalKind; - pendingContent: TPendingContent; - entry: TPendingEntry; - }) => void; - onStopped?: () => Promise | void; -}; +> & + ChannelNativeApprovalTransportSpec & + ChannelNativeApprovalDeliveryCallbacks< + TPendingEntry, + TPreparedTarget, + TPendingContent, + TRequest + > & { + channel?: string; + channelLabel?: string; + accountId?: string | null; + nativeAdapter?: ChannelApprovalNativeAdapter | null; + resolveApprovalKind?: (request: TRequest) => ChannelApprovalKind; + buildPendingContent: (params: { + request: TRequest; + approvalKind: ChannelApprovalKind; + nowMs: number; + }) => TPendingContent | Promise; + onStopped?: () => Promise | void; + }; export function createChannelNativeApprovalRuntime< TPendingEntry,