@chronos.sh/sdk (英语)
官方节点.js SDK 克罗诺斯 ——以服务形式可靠安排工作.
import { Chronos } from '@chronos.sh/sdk';
const chronos = new Chronos({ apiKey: process.env.CHRONOS_API_KEY! });
chronos.worker.handle('send-email', async (ctx) => {
await sendEmail(ctx.payload);
return { sent: true };
});
await chronos.worker.start();
零从属. 随处可见 fetch ——节点.js 20+, Bun, Deno.
安装
npm install @chronos.sh/sdk
快速启动
import { Chronos } from '@chronos.sh/sdk';
const chronos = new Chronos({ apiKey: process.env.CHRONOS_API_KEY! });
chronos.worker.handle<{ to: string }>('send-email', async (ctx) => {
await sendEmail(ctx.payload.to);
return { sent: true };
});
await chronos.worker.start();
worker.start() 长期工作并寄给注册的处理者。 它一直运行直到你打电话 worker.stop()如果有任何要求得到401,工人就会停止,而返回的承诺会被拒绝 ChronosAuthenticationError,所以一个错误的配置或被取消的密钥表面会立即取代永远的重试. 限制键需要 workers:run 管理工人的范围。 没有它,工人停止 和返回的承诺拒绝 ChronosApiError 谁 code 实值 insufficient_scope。工人路线只接受 API 密钥。 通过另一个证书为 apiKey例如OAuth指使物 以同样的方式阻止工人 code 设置为 credential_not_accepted。 。 。 .
创建时间表和工作
同一客户端管理时间表、工作、处决和监视器
await chronos.schedules.create({
name: 'Nightly report',
handler: 'send-report',
cron: '0 2 * * *',
timezone: 'Europe/London',
});
await chronos.jobs.create({
name: 'Welcome email',
handler: 'send-email',
delay: { value: 10, unit: 'minute' },
payload: { to: '[email protected]' },
});
for await (const job of chronos.jobs.iterate({ status: 'failed' })) {
console.log(job.name, job.last_error);
}
球场使用API的蛇 案例名. list() 返回一页为 { data, paging },以及 iterate() 每一页都行 阅读网络错误的重试,超时,429和5xx回复. 写作只在429上重试,所以失联的回音从不发出两次创作. 一个大于64米B的响应机体从未被再试. 设定 maxRequestRetries 以更改重试数.
监视其它地方的工作
一个监视器监视着一个运行在克罗诺斯以外的工作,比如在你自己的服务器上运行克罗诺工作. 创建并给出 ping_url 任务:
const monitor = await chronos.monitors.create({
name: 'Nightly backup',
cron: '0 2 * * *',
});
monitor.ping_url 这是一个秘密。 保存在日志之外,并存放在工作读取其他证书的地方.
工作报告有一个HTTP请求,不需要SDK: curl -fsS "$PING_URL" 成功与否,或 curl -fsS "$PING_URL/fail" 失败. listPings() 财务报告和审定财务报表 iteratePings() 阅读它的报告.
当工作报告失败,或者没有成功或失败的ping到达内部时,克罗诺斯会发出警报 grace_seconds (违约300起).
检查 API 密钥
要检查启动时的 API 密钥, 请打电话 account.get()返回密钥所属的工作空间,并丢弃 ChronosAuthenticationError 如果密钥未知或被撤销:
const workspace = await chronos.account.get();
console.log(`Connected to ${workspace.name}`);
等着工作吧
要挡住,直到工作结束,打电话 jobs.wait()它在检查中等待一秒钟,一旦工作完成就返回 completed, (中文(简体) ), failed, (中文(简体) ), cancelled 或者说 skipped。一个失败的工作被退回,而不是丢弃。 60秒后,它会抛出 ChronosWaitTimeoutError,其 job 保持最后的状态 它从支票中重新删除其他错误, 例如 ChronosApiError 对于一个未知的身份。 要更改默认值, 设置 pollIntervalMs 或者说 maxWaitMs数字 :
const created = await chronos.jobs.create({ name: 'Welcome email', handler: 'send-email' });
const job = await chronos.jobs.wait(created.id, { maxWaitMs: 120_000 });
if (job.status === 'failed') {
console.error(job.last_error);
}
拖拉工作完成时才有操作员.
伟大的关闭
SDK不安装信号处理器——您的应用程序拥有其过程生命周期. 线 SIGTERM编号 :SIGINT 改为 worker.stop() 因此,飞行中的工作及其结果报告在程序退出前完成:
let stopping = false;
for (const sig of ['SIGTERM', 'SIGINT'] as const) {
process.on(sig, () => {
if (stopping) process.exit(1);
stopping = true;
chronos.worker.stop().then(() => process.exit(143));
});
}
第二次信号出击作为出逃舱门 这对任何长期工作者都很重要:独立的脚本、多克容器、系统服务、PM2、云VM或CI跑车.