@broberg/克龙
输入的自助客户端 (原始内容存档于2013-10-12). cronjobs.webhouse.net ——舰队托管 HTTP-克龙. 在几个打字的电话中注册和管理预定的工作,而不是 点击 NextAuth 登录墙或手滚动调度器.
- 无依无依. 原始内容
fetch誓以比丘/api/jobsAPI,就这样 运行在节点,邦和边缘一样. - 服务 OpenAPI 生成的类型 (单位:千美元)
pnpm gen→src/schema.ts),这样 客户端保持与合同的字节相匹配——一个 spec change 是类型错误. - (原始内容存档于2018-03-27) (英语). Per-repo specific. 范围
CRONJOBS_API_TOKEN只有曾经看到和 触摸自己的repo工作(跨范围~404). - 秘密会留在服务器边. 把目标秘密放在每份工作里
headers条目; 它被存储在cron服务上,并逐字逐字传送到每个勾点上——从来没有在 uRL或日志. 但是,除非有F013号船, 船头被储存在 简写并返回GET /api/jobs, (中文(简体) ),/api/jobs/:id财务报告和审定财务报表/api/jobs/export——任何能够接触工作的人都可以读取这个秘密. 使用一个 最小的特权, 短暂的象征.
还没有在npm. v.1.0 靴子-pulish 等待克里斯蒂安去+ 信任的出版商(标准)
@broberg/*船道). 建造了针对现场的 合同;cronjobs.webhouse.net/api/openapi.json是真理的来源.
pnpm add @broberg/cron
使用量
import { createCron } from "@broberg/cron";
// token defaults to process.env.CRONJOBS_API_TOKEN; baseUrl to cronjobs.webhouse.net
const cron = createCron();
// Register a job. Pass a stable `externalId` so re-running a deploy UPSERTS the
// same job (no duplicate) instead of creating a new one — this is also how you
// UPDATE a job (re-create with the same externalId), so you never track ids.
// The target secret rides in `headers` (object → stored JSON), never in the URL.
const job = await cron.createJob({
name: "xrt81 push-tick",
schedule: "*/10 * * * *", // every 10 minutes
url: "https://xrt81.com/api/push/tick",
method: "POST",
headers: { Authorization: "Bearer <PUSH_TICK_SECRET>" },
externalId: "xrt81:push-tick",
});
await cron.listJobs({ tag: "push" });
await cron.pauseJob(job.id); // idempotent — no-op if already paused
await cron.resumeJob(job.id);
await cron.runJob(job.id); // fire once now → Execution
await cron.getExecutions(job.id); // recent run history
await cron.deleteJob(job.id);
每个方法都会投出一个键入 CronError (单位:千美元){ status, code?, message, details? }, (中文(简体) ),
code ∈ unauthorized | forbidden | not_found | validation_error | invalid_cron(中文(简体) )
在一个非2xxx响应, 所以一个失败的注册表出声.
嵌入符( 仅指画符)
// Requires a session/admin token (a scoped token gets 403). Omit `scope` for a
// full-access token (session only). The plaintext `key` is returned ONCE.
const { key } = await cron.mintKey({ name: "xrt81 production", scope: "xrt81" });
薄荷薄荷每repo活物的 管理符 哥们 (一个已审计 优先路径);普通重置资产消耗了它们被提供的范围标记.
那些类型无法告诉你的事情
被拒绝的代号——客户从不遵循重定向(自0.4.0起,F041.4起)
今天(2026年10月30日测量,在Cronjobs F017.1,sha 34094ce之后): 每个 /api/*
用错误的符号打电话, 一个非cj_ 符号或无信头答案 401 与
{"error":{"code":"unauthorized","message":"Authentication required"}} 没有
Location。你是一个正常的 CronError 与 status: 401。 。 。 .
为何客户仍守着防线: 直到修复,一个非 --cj_
符号或缺少的页眉 307 → /login最多0.2.0 客户跟踪
它,有一个 200 以 12 kB 登录 HTML 键入,然后返回输入的页面
Job[] —— 说 jobs.length 12057,这个数字看起来像一个答案(测量)
页:1 一个服务可以倒退,所以现在的客户端 从不遵循方向数字 :
- 重定向到登录页面
CronError与真实status, (中文(简体) ),location,并有一条信息说 信物丢失或不接受. - 任意 其他项目 重新定向(例如a)
308)随其状态投掷 目标——而且 没有 声称该标志是坏的. - A 类
200他们的身体不是JSON扔cron_not_json命名内容类型和 ,而不是返回到您的类型.
时间戳是 ISO 字符串 (0. 4. 0 — 一个类型变化)
lastRunAt, (中文(简体) ), nextRunAt, (中文(简体) ), createdAt, (中文(简体) ), updatedAt 和执行时间
(单位:千美元)startedAt, (中文(简体) ), completedAt已经 ISO-8601 字符串 电线上,例如:.
"2026-10-30T17:00:00.628Z"。服务本身的光谱 说"整数,Unix ms"
直至2026年10月30日(cronjobs a1b3a75将其固定),所以0.3.x和之前的打法为:
number 而值总是字符串. 如果你对他们做了算术,
它已经是错误的;现在的类型是这样说的. 分析 new Date(job.lastRunAt)。 。 。 .
externalId 使用一个COLON - repo:job-name
舰队15个岗位中有13个跟着它 两边都没什么正常的. 因此,偏离不会失败——它沉默地 创建重复的工作 而不是更新你的意思.
从呼叫网站, "高调错过" 财务报告和审定财务报表 "更新" 看起来一模一样 仅
201对200把他们分开,没人读过.
选会而住. 这个客户是故意的 没有 重写您的标识符: 默默地正常化某人的id, 就是你如何创建你试图防止的复制品 .
connectTimeout 默认为 null这是故意的
两个不同的问题 timeout 独来独往地回答:
timeout | 多长时间 工作 可能带 |
connectTimeout | 我们等待回应多久 开始 |
fetch() 解答时 页眉所以对于一个先计算后回答的工作来说, 工时对工头是工作时间 - 短暂的违约会杀死那些工作 只在您的端点迅速回复时设定它 .
在它真正适用收益的地方是真实的: 201 ms的好友吞噬性工作答案,和与 timeout: 120000 它在16秒的停电中被吊了整整两分钟, 燃烧了它在一次死亡尝试上的全部重试预算. 长时间的耐心使工作更加脆弱,而不是更坚韧.
部分更新不再重现你留下的东西
现在应用服务器侧默认值 仅在创建时,所以一个最小的规格是安全的. tags: undefined 保留它们; tags: [] 清除他们.
它并非总是如此,而虫子击中了我们推荐的准确模式——由Endical register by externalId,每个集成继续 每次部署。每次运行都静静地清除所有标记,重新设置超时/重试/时区,将 POST 任务变成 GET,以及 {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}有人故意暂停了工作 {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}我还不知道.
固定上游. 仍然发送您的完整配置, 因此您的工作不取决于您无法从这里看到的服务器行为 .
这个客户还在吗?
npm run check:drift
获取已公布的合同、再生和比较. 三个结果,从来没有两个:
| 退出 | ||
|---|---|---|
✓ | 0 个 | 同步中 |
✗ DRIFTED | 1个 | 以 npm run gen ——它命名了第一行不同 |
? COULD NOT ASK | 2个 | 无法达到或解析 |
它作为一部分运行 npm test时 漂流块和"不能问"不是. 这种不对称是故意的: 一张在片状网络上红掉的支票是一张被关闭的支票, 而真正的漂移则被关闭。 交易是 一个无法接触的谱系是 报告 而不是说 已执行 ——读出行,不要只读出出行代码.
为什么它存在: 在2026-08-28上,4个公共-API的更改在一天内就落地了,其中两个已经使这些类型错了——我们发现的唯一原因是对方有人选择写信给我们. 只有在一个人记得发送时才存在的信号不是信号.
API 密码
createCron(config?) → CronClient—— 说config: { token?, baseUrl?, fetch? }。 。 。 .createJob(spec)(通过externalId·getJob(id)• 妇女listJobs(filter?)• 妇女deleteJob(id)• 妇女pauseJob(id)• 妇女resumeJob(id)• 妇女toggleJob(id)• 妇女runJob(id)• 妇女getExecutions(id)• 妇女getStatus(id)• 妇女mintKey({name, scope?})。 。 。 .CronError——倒入任何非-2xx(并被丢入缺失的活字牌/活字牌上).
拥有者+ broberg-ai/components
(原文:英文) F041 (法语)) (中文(简体) ). 弯曲 服务 (镜形符牌,自用薄荷,
(一) 能力) cronjobs 麻省理工学院.