跳转到内容

核心概念

Statocysts 使用一组精简的概念,让通知投递与具体服务保持解耦。

通知包含必填标题和可选正文:

interface Notification {
title: string
body?: string
}

标题必须是非空字符串。通知提供方负责将标题和正文转换成对应服务的请求内容。

通知目标是一个协议 URL,它同时选择通知提供方并定位接收方:

slack://webhook/T00000000/B00000000/WEBHOOK_TOKEN

slack: 等协议用于选择通知提供方,URL 的其余部分包含提供方专属的路由和凭据。可在通知提供方参考中查看经过测试的 URL 格式。

通知提供方理解一种协议,并将通知投递到匹配的通知目标。每个内置提供方都以具名对象形式导出:

import { slack } from 'statocysts'
await slack.send(target, notification, {
fetchOptions: { timeout: 5000 },
})

通知提供方也提供同步的本地校验。该操作不会构造传输 payload 或访问远程服务,而是返回可复用的目标绑定:

const validatedSlack = slack.validate(target, {
fetchOptions: { timeout: 5000 },
})
await validatedSlack.send(notification)

需要提供方专属选项时,请直接调用对应提供方。需要统一分发和批量失败报告时,请使用顶层通知运行时 API。

通知器在创建时校验并绑定一个或多个唯一通知目标,之后可以重复使用:

import { createNotifier } from 'statocysts'
const notifier = createNotifier([
process.env.SLACK_TARGET!,
process.env.JSON_TARGET!,
])
await notifier.send({ title: 'Deployment complete' })

每次发送都会并发尝试所有目标。单个目标失败不会阻止其他目标被尝试。

通知运行时注册内置通知提供方、校验目标协议和提供方专属 URL 格式,并导出 send()createNotifier()。校验只在本地执行;远程凭据、接收者和连通性仅在实际投递时由提供方处理。从 statocysts 导入会创建 Node.js 运行时;从 statocysts/browser 导入会创建浏览器兼容运行时。