import type { ChannelDelivery, NotifyMessage } from "../../deps.js"; import type { RoutedTarget } from "../route/type.js"; import type { DispatchPort } from "./type.js"; /** 投递器:节奏策略表 + 每频道节奏状态。单例,装配与卸载必须成对。 */ declare class Dispatcher { /** 单例实例重复装配是编程错误,当场暴露。 */ private installed; /** 装配入参:投递出口与频道状态写面。 */ private port; /** 逐频道的门与节流状态;`release` 时整表清空。 */ private rhythms; /** 装配。 */ install(port: DispatchPort): void; /** 卸载:放开能力面、清空全部节奏状态(门与节流都不跨装配期存活), * 并把**还在队列里**的投递逐条结算掉。顺序不能反:`clear()` 一执行就再也取不到那些队列项。 */ release(): void; /** 投递:逐目标 fail-soft(出口承诺失败是返回值),结果与 `targets` 同序同长。 */ dispatch(message: NotifyMessage, targets: RoutedTarget[]): Promise; /** * 单目标的违约收口:一个目标违约只产出它自己的失败明细。 * 违约若冒给 `dispatch` 里的 `Promise.all`,整批一起拒绝,调用方连健康频道的明细都拿不到, * 只能记一条「投递失败」——一次出口打洞就抹掉整批故障现场。 */ private dispatchSafely; /** * 违约频道的状态写面:状态只是观测面,它自己违约也不能再升级为抛出——明细已经成立。 * * **卸载后不写**(与 `settle` 同一条闸):这是本块**第二条**会写频道状态的路,出口在卸载之后 * 才违约(网络层抛错常发生在这类时刻)就会走它。漏掉这一条,模块头承诺的「不再写频道状态」 * 就是空话——而写面会真的落到磁盘上。 */ private recordFailure; /** 单目标:节流 → 在途门 → 重试,然后写频道状态并返回归档明细。 */ private dispatchOne; /** 取(必要时创建)频道的节奏状态。 */ private rhythmOf; /** * 在途门:槽位满时排队等待,队列无上限。 * * `onCanceled` 只对**队列项**有意义(`maxInflight > 0` 才有队列,当前只有 bark):卸载时它把 * 这一条结算成 skipped,开投永不发生。必须是 **resolve 而不是 reject**——reject 会冒给 * `dispatchSafely` 的 catch,产出一条 failed 明细并再写一次频道状态,与「卸载后不写状态」 * 直接矛盾;也会让调用方看到一次根本不存在的失败。形参不叫 `canceled`:模块里已有一个同名的 * 结算函数,遮蔽它会让「这个 canceled 到底是谁」要靠读上下文才答得上来。 */ private withGate; /** 让出一个在途槽位并唤醒队首(队首是成对登记项,走它那一半)。 */ private releaseSlot; /** * 单目标投递 + 重试:只对出口标注 `retryable` 的失败重试,线性退避。 * * `this.installed` 是退避闸而不只是首轮闸:卸载后仍在退避循环里,就是插件已经卸了还在按 * 节奏对外打请求(实测 attempts 1 → 3)。它在**两个时间窗**上都要判:循环条件挡住「本次投递 * 在途期间被卸载」,循环体内的复查挡住「退避等待期间被卸载」——只加循环条件的话,退避醒来 * 之后那次 `deliverOnce` 照样会发出去。已经在途的那一次跑完、如实归档,不再有下一次。 */ private deliverWithRetry; /** 单次投递:一次只投一个目标,结果与目标唯一对应。 */ private deliverOnce; /** * 写频道状态并返回归档明细。**卸载后一律不写**:频道状态是给还在用的界面看的观测面, * 插件卸载了就没有读者,而写面会真的落到磁盘上(stores 域的 `record()` 不看 installed)。 * 归档明细照常产出——「卸载后不再写状态」不等于「把这次投递改成没发生过」。 */ private settle; } /** 本域唯一的投递器:类不外放,外面造不出第二份节奏状态。 */ export declare const notificationDispatcher: Dispatcher; export {};