Documentation
¶
Overview ¶
Package notify 负责把任务状态变化投递到预注册的 Webhook 目标。
设计要点:调用方只能提供目标名(Target),URL 与密钥都保存在服务端的注册表里。 这不是省事,而是安全边界——如果回调 URL 由调用方指定,它就能被当作探测内网、 盗取凭证的通道;配套的 SSRF 防护与出网白名单也随之省掉。
投递语义是 at-least-once:网络超时等服务端无法判定结果的场景下,接收方可能收到 重复请求。因此每条通知带稳定的 X-OFD-Delivery 头,接收方据此幂等去重。
Index ¶
- Constants
- Variables
- func KnownEvent(name string) bool
- func Retryable(err error) bool
- func Signer(secret string, body []byte, timestamp time.Time) string
- func Subscribes(events []string, event string) bool
- func Verify(secret string, header string, body []byte, timestamp time.Time) bool
- type Deliverer
- type Error
- type Registry
- type Request
- type Target
Constants ¶
const ( EventSucceeded = "succeeded" EventFailed = "failed" // EventWildcard 在订阅列表里表示"全部事件",与配置侧同一套写法。 EventWildcard = "*" )
事件名。
const ( HeaderDelivery = "X-OFD-Delivery" HeaderEvent = "X-OFD-Event" HeaderJob = "X-OFD-Job" HeaderTimestamp = "X-OFD-Timestamp" HeaderSignature = "X-OFD-Signature" SignatureVersion = "v1" )
投递所用的请求头。
const DefaultTimeout = 10 * time.Second
DefaultTimeout 是单次投递的默认超时。
刻意比一般 HTTP 客户端短:通知是旁路,接收方卡住不应该拖住队列。超过这个时间 就当作失败退避重试,反正 at-least-once 允许重复。
Variables ¶
var ErrEventNotSubscribed = errors.New("通知目标未订阅该事件")
ErrEventNotSubscribed 表示目标未订阅该事件。这不算错误:目标就是不要这个事件。
var ErrTargetNotFound = errors.New("通知目标未注册")
ErrTargetNotFound 表示目标未注册。调用方据此拒绝请求,而不是静默丢弃。
Functions ¶
func KnownEvent ¶
KnownEvent 判断 name 是不是受支持的事件名。
供提交阶段校验调用方的 notify.events 用。接线之后一个拼错的事件名会让该 任务一条通知都收不到,而调用方唯一的线索是"没收到"——所以拼错必须在提交 阶段就报错,不能等到投递时静默过滤掉。
func Subscribes ¶
Subscribes 判断订阅列表是否覆盖该事件。
列表为空表示不收窄——这正是 notify.events 与 Target.Events 共用的语义: 留空则沿用目标自己的订阅集合。
两个来源都过这一处:两个字段同名同义,各写一份判定迟早漂移。
Types ¶
type Deliverer ¶
type Deliverer struct {
// contains filtered or unexported fields
}
Deliverer 按注册表投递通知。
func NewDeliverer ¶
NewDeliverer 构造投递器。client 为 nil 时按目标超时创建客户端。
type Registry ¶
type Registry struct {
// contains filtered or unexported fields
}
Registry 持有已注册的目标。注册后只读,构造完成后可被多个投递协程共享。
func NewRegistry ¶
NewRegistry 注册目标。同名目标会覆盖,便于配置热更新。