@cronvello/sdk 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +7 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/package.json +25 -7
package/dist/index.cjs
CHANGED
|
@@ -119,7 +119,7 @@ var Transport = class {
|
|
|
119
119
|
this.onRequest?.({ method: opts.method, path: opts.path, status: res.status, attempt, durationMs });
|
|
120
120
|
const text = await res.text();
|
|
121
121
|
const parsed = text ? safeJson(text) : null;
|
|
122
|
-
if (res.ok) return parsed;
|
|
122
|
+
if (res.ok) return unwrapEnvelope(parsed);
|
|
123
123
|
const retryAfter = parseRetryAfter(res, parsed);
|
|
124
124
|
if (RETRYABLE_STATUS.has(res.status) && attempt < this.maxRetries) {
|
|
125
125
|
await sleep(this.backoff(attempt, retryAfter));
|
|
@@ -184,6 +184,12 @@ function safeJson(text) {
|
|
|
184
184
|
return text;
|
|
185
185
|
}
|
|
186
186
|
}
|
|
187
|
+
function unwrapEnvelope(body) {
|
|
188
|
+
if (body !== null && typeof body === "object" && "success" in body && typeof body.success === "boolean" && "data" in body) {
|
|
189
|
+
return body.data;
|
|
190
|
+
}
|
|
191
|
+
return body;
|
|
192
|
+
}
|
|
187
193
|
function extractMessage(body) {
|
|
188
194
|
if (body && typeof body === "object" && "message" in body) {
|
|
189
195
|
const m = body.message;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/internal/errors.ts","../src/internal/http.ts","../src/client/client.ts","../src/registry/verify.ts","../src/registry/dispatch.ts","../src/registry/reconcile.ts","../src/adapters/express.ts","../src/adapters/next.ts","../src/registry/define.ts","../src/index.ts"],"names":["headerValue"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Error taxonomy for the SDK. Everything thrown by the public surface is a\n * `CronvelloError` (or subclass), so callers can `catch (e) { if (e instanceof CronvelloError) … }`.\n */\n\nexport class CronvelloError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CronvelloError\";\n // Restore prototype chain for instanceof across transpilation targets.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** A non-2xx response from the Cronvello API. */\nexport class CronvelloApiError extends CronvelloError {\n /** HTTP status code. */\n readonly status: number;\n /** Machine-readable error code from the API body, when present. */\n readonly code: string | undefined;\n /** The method + path that failed, e.g. `POST /v1/jobs`. */\n readonly endpoint: string;\n /** Parsed response body (best effort). */\n readonly body: unknown;\n /** Seconds to wait before retrying, parsed from `Retry-After` / rate-limit payload (429 only). */\n readonly retryAfterSeconds: number | undefined;\n\n constructor(args: {\n status: number;\n endpoint: string;\n message: string;\n code?: string;\n body?: unknown;\n retryAfterSeconds?: number;\n }) {\n super(`[${args.status}] ${args.endpoint}: ${args.message}`);\n this.name = \"CronvelloApiError\";\n this.status = args.status;\n this.code = args.code;\n this.endpoint = args.endpoint;\n this.body = args.body;\n this.retryAfterSeconds = args.retryAfterSeconds;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n get isRateLimited(): boolean {\n return this.status === 429;\n }\n\n get isAuthError(): boolean {\n return this.status === 401 || this.status === 403;\n }\n\n get isNotFound(): boolean {\n return this.status === 404;\n }\n}\n\n/** A network/transport failure (DNS, connection reset, timeout) before any HTTP status. */\nexport class CronvelloNetworkError extends CronvelloError {\n readonly endpoint: string;\n override readonly cause: unknown;\n constructor(endpoint: string, cause: unknown) {\n super(`Network error calling ${endpoint}: ${describe(cause)}`);\n this.name = \"CronvelloNetworkError\";\n this.endpoint = endpoint;\n this.cause = cause;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** A misconfiguration caught before any network call (missing apiKey, bad URL, …). */\nexport class CronvelloConfigError extends CronvelloError {\n constructor(message: string) {\n super(message);\n this.name = \"CronvelloConfigError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nfunction describe(cause: unknown): string {\n if (cause instanceof Error) return cause.message;\n return String(cause);\n}\n","/**\n * Minimal HTTP transport over the global `fetch` (Node 18+). No axios, no node-fetch —\n * zero runtime dependencies. Adds bearer auth, JSON (de)serialization, typed error mapping,\n * bounded retries with backoff for transient failures, and optional idempotency keys.\n */\n\nimport {\n CronvelloApiError,\n CronvelloConfigError,\n CronvelloNetworkError,\n} from \"./errors.js\";\n\nexport type FetchLike = (\n input: string,\n init?: {\n method?: string;\n headers?: Record<string, string>;\n body?: string;\n signal?: AbortSignal;\n },\n) => Promise<{\n ok: boolean;\n status: number;\n headers: { get(name: string): string | null };\n text(): Promise<string>;\n}>;\n\nexport interface TransportOptions {\n baseUrl: string;\n apiKey: string;\n /** Per-request timeout in ms. Default 30_000. */\n timeoutMs?: number;\n /** Max retry attempts for 429/5xx/network errors. Default 2 (=> up to 3 tries). */\n maxRetries?: number;\n /** Override the fetch implementation (testing / custom agents). */\n fetch?: FetchLike;\n /** Extra headers sent on every request (e.g. a custom User-Agent). */\n defaultHeaders?: Record<string, string>;\n /** Telemetry hook — called once per completed attempt. */\n onRequest?: (info: { method: string; path: string; status: number; attempt: number; durationMs: number }) => void;\n}\n\nexport interface RequestOptions {\n method: string;\n path: string;\n query?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n /** Idempotency-Key header value — replays of the same key are de-duplicated server-side. */\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nconst RETRYABLE_STATUS = new Set([429, 500, 502, 503, 504]);\n\nexport class Transport {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeoutMs: number;\n private readonly maxRetries: number;\n private readonly fetchImpl: FetchLike;\n private readonly defaultHeaders: Record<string, string>;\n private readonly onRequest: TransportOptions[\"onRequest\"];\n\n constructor(opts: TransportOptions) {\n if (!opts.apiKey) throw new CronvelloConfigError(\"apiKey is required\");\n if (!opts.baseUrl) throw new CronvelloConfigError(\"baseUrl is required\");\n const resolvedFetch = opts.fetch ?? (globalThis.fetch as unknown as FetchLike | undefined);\n if (!resolvedFetch) {\n throw new CronvelloConfigError(\n \"No global fetch found. Use Node 18+ or pass a `fetch` implementation in the client options.\",\n );\n }\n this.baseUrl = opts.baseUrl.replace(/\\/+$/, \"\");\n this.apiKey = opts.apiKey;\n this.timeoutMs = opts.timeoutMs ?? 30_000;\n this.maxRetries = opts.maxRetries ?? 2;\n this.fetchImpl = resolvedFetch;\n this.defaultHeaders = opts.defaultHeaders ?? {};\n this.onRequest = opts.onRequest;\n }\n\n async request<T>(opts: RequestOptions): Promise<T> {\n const url = this.buildUrl(opts.path, opts.query);\n const endpoint = `${opts.method} ${opts.path}`;\n const headers: Record<string, string> = {\n authorization: `Bearer ${this.apiKey}`,\n accept: \"application/json\",\n ...this.defaultHeaders,\n };\n let payload: string | undefined;\n if (opts.body !== undefined) {\n headers[\"content-type\"] = \"application/json\";\n payload = JSON.stringify(opts.body);\n }\n if (opts.idempotencyKey) headers[\"idempotency-key\"] = opts.idempotencyKey;\n\n let lastError: unknown;\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n const startedAt = Date.now();\n const { signal, cancel } = this.withTimeout(opts.signal);\n try {\n const res = await this.fetchImpl(url, {\n method: opts.method,\n headers,\n ...(payload !== undefined ? { body: payload } : {}),\n signal,\n });\n cancel();\n const durationMs = Date.now() - startedAt;\n this.onRequest?.({ method: opts.method, path: opts.path, status: res.status, attempt, durationMs });\n\n const text = await res.text();\n const parsed = text ? safeJson(text) : null;\n\n if (res.ok) return parsed as T;\n\n const retryAfter = parseRetryAfter(res, parsed);\n if (RETRYABLE_STATUS.has(res.status) && attempt < this.maxRetries) {\n await sleep(this.backoff(attempt, retryAfter));\n continue;\n }\n throw new CronvelloApiError({\n status: res.status,\n endpoint,\n message: extractMessage(parsed) ?? `Request failed`,\n code: extractCode(parsed),\n body: parsed,\n ...(retryAfter !== undefined ? { retryAfterSeconds: retryAfter } : {}),\n });\n } catch (err) {\n cancel();\n if (err instanceof CronvelloApiError) throw err;\n // Network/abort error — retry if attempts remain.\n lastError = err;\n if (attempt < this.maxRetries) {\n await sleep(this.backoff(attempt));\n continue;\n }\n throw new CronvelloNetworkError(endpoint, err);\n }\n }\n // Unreachable, but satisfies the type checker.\n throw new CronvelloNetworkError(endpoint, lastError);\n }\n\n private buildUrl(path: string, query?: RequestOptions[\"query\"]): string {\n const base = `${this.baseUrl}${path.startsWith(\"/\") ? path : `/${path}`}`;\n if (!query) return base;\n const params = Object.entries(query)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`);\n return params.length ? `${base}?${params.join(\"&\")}` : base;\n }\n\n private withTimeout(external?: AbortSignal): { signal: AbortSignal; cancel: () => void } {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n const onExternalAbort = () => controller.abort();\n if (external) {\n if (external.aborted) controller.abort();\n else external.addEventListener(\"abort\", onExternalAbort, { once: true });\n }\n return {\n signal: controller.signal,\n cancel: () => {\n clearTimeout(timer);\n external?.removeEventListener(\"abort\", onExternalAbort);\n },\n };\n }\n\n private backoff(attempt: number, retryAfterSeconds?: number): number {\n if (retryAfterSeconds !== undefined) return Math.min(retryAfterSeconds * 1000, 30_000);\n // Exponential backoff with full jitter: base 300ms, capped at 5s.\n const base = Math.min(300 * 2 ** attempt, 5_000);\n return Math.floor(Math.random() * base);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction safeJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nfunction extractMessage(body: unknown): string | undefined {\n if (body && typeof body === \"object\" && \"message\" in body) {\n const m = (body as { message?: unknown }).message;\n if (typeof m === \"string\") return m;\n }\n return undefined;\n}\n\nfunction extractCode(body: unknown): string | undefined {\n if (body && typeof body === \"object\" && \"code\" in body) {\n const c = (body as { code?: unknown }).code;\n if (typeof c === \"string\") return c;\n }\n return undefined;\n}\n\nfunction parseRetryAfter(\n res: { headers: { get(name: string): string | null } },\n body: unknown,\n): number | undefined {\n const header = res.headers.get(\"retry-after\");\n if (header) {\n const n = Number(header);\n if (Number.isFinite(n)) return n;\n }\n if (body && typeof body === \"object\" && \"data\" in body) {\n const data = (body as { data?: { retryAfterSeconds?: unknown } }).data;\n if (data && typeof data.retryAfterSeconds === \"number\") return data.retryAfterSeconds;\n }\n return undefined;\n}\n","/**\n * Low-level, fully-typed client for the Cronvello public `/v1` API.\n *\n * This is the thin REST layer: one method per endpoint, request/response types straight\n * from the server contract. The high-level registry (`defineCronvello`) is built on top of\n * it. Use this directly when you need ad-hoc control beyond the registry model.\n */\n\nimport { Transport, type FetchLike } from \"../internal/http.js\";\nimport { CronvelloConfigError } from \"../internal/errors.js\";\nimport type {\n AccountRunsQuery,\n AccountTasksQuery,\n JobCreateBody,\n JobUpdateBody,\n MeResponse,\n PublicJob,\n PublicRun,\n PublicTask,\n RunNowResult,\n RegistryReconcileRequest,\n RegistryReconcileResponse,\n RunsPage,\n RunsQuery,\n TaskCreateBody,\n TasksPage,\n TaskUpdateBody,\n UsageResponse,\n} from \"../internal/wire.js\";\n\n/** The production Cronvello API. Override `baseUrl` only for self-hosting or testing. */\nexport const CRONVELLO_DEFAULT_BASE_URL = \"https://api.cronvello.com\";\n\nexport interface CronvelloClientOptions {\n /** Account API key (`crn_live_…`). Required. */\n apiKey: string;\n /** API base URL. Defaults to https://api.cronvello.com. */\n baseUrl?: string;\n /** Per-request timeout in ms (default 30_000). */\n timeoutMs?: number;\n /** Retry attempts for 429/5xx/network errors (default 2). */\n maxRetries?: number;\n /** Custom fetch implementation (default: global fetch). */\n fetch?: FetchLike;\n /** Telemetry hook for every request attempt. */\n onRequest?: (info: { method: string; path: string; status: number; attempt: number; durationMs: number }) => void;\n}\n\nexport class CronvelloClient {\n private readonly transport: Transport;\n /** The resolved base URL in use. */\n readonly baseUrl: string;\n\n /** Job container operations. */\n readonly jobs: JobsResource;\n /** Scheduled task operations. */\n readonly tasks: TasksResource;\n /** Execution-history (run) operations. */\n readonly runs: RunsResource;\n /** Account identity + usage. */\n readonly account: AccountResource;\n\n constructor(options: CronvelloClientOptions) {\n if (!options || !options.apiKey) {\n throw new CronvelloConfigError(\"CronvelloClient requires an `apiKey` (crn_live_…).\");\n }\n this.baseUrl = (options.baseUrl ?? CRONVELLO_DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.transport = new Transport({\n baseUrl: this.baseUrl,\n apiKey: options.apiKey,\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n ...(options.maxRetries !== undefined ? { maxRetries: options.maxRetries } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n ...(options.onRequest ? { onRequest: options.onRequest } : {}),\n defaultHeaders: { \"user-agent\": \"cronvello-sdk\" },\n });\n this.jobs = new JobsResource(this.transport);\n this.tasks = new TasksResource(this.transport);\n this.runs = new RunsResource(this.transport);\n this.account = new AccountResource(this.transport);\n }\n\n /**\n * Atomically reconcile a whole code registry server-side (`PUT /v1/registry`): one job\n * container + its tasks, created/updated/pruned/started in a single call. This is what\n * `defineCronvello().sync()` prefers; the high-level API builds the body for you.\n */\n reconcileRegistry(body: RegistryReconcileRequest, opts?: { idempotencyKey?: string }): Promise<RegistryReconcileResponse> {\n return this.transport.request({\n method: \"PUT\",\n path: \"/v1/registry\",\n body,\n ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}),\n });\n }\n\n /**\n * Escape hatch for endpoints not yet wrapped by a typed method (heartbeat monitors,\n * maintenance windows, DLQ, notification channels, audit log, API-key self-service …).\n * `T` is the response shape you expect.\n */\n request<T>(method: string, path: string, opts?: { query?: Record<string, string | number | boolean | undefined>; body?: unknown; idempotencyKey?: string }): Promise<T> {\n return this.transport.request<T>({\n method,\n path,\n ...(opts?.query ? { query: opts.query } : {}),\n ...(opts?.body !== undefined ? { body: opts.body } : {}),\n ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}),\n });\n }\n}\n\nclass JobsResource {\n constructor(private readonly t: Transport) {}\n\n list(): Promise<PublicJob[]> {\n return this.t.request({ method: \"GET\", path: \"/v1/jobs\" });\n }\n get(jobId: string): Promise<PublicJob> {\n return this.t.request({ method: \"GET\", path: `/v1/jobs/${enc(jobId)}` });\n }\n create(body: JobCreateBody, opts?: { idempotencyKey?: string }): Promise<PublicJob> {\n return this.t.request({ method: \"POST\", path: \"/v1/jobs\", body, ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}) });\n }\n update(jobId: string, body: JobUpdateBody): Promise<PublicJob> {\n return this.t.request({ method: \"PATCH\", path: `/v1/jobs/${enc(jobId)}`, body });\n }\n delete(jobId: string): Promise<null> {\n return this.t.request({ method: \"DELETE\", path: `/v1/jobs/${enc(jobId)}` });\n }\n start(jobId: string): Promise<PublicJob> {\n return this.t.request({ method: \"POST\", path: `/v1/jobs/${enc(jobId)}/start` });\n }\n stop(jobId: string): Promise<PublicJob> {\n return this.t.request({ method: \"POST\", path: `/v1/jobs/${enc(jobId)}/stop` });\n }\n listTasks(jobId: string): Promise<PublicTask[]> {\n return this.t.request({ method: \"GET\", path: `/v1/jobs/${enc(jobId)}/tasks` });\n }\n createTask(jobId: string, body: TaskCreateBody, opts?: { idempotencyKey?: string }): Promise<PublicTask> {\n return this.t.request({ method: \"POST\", path: `/v1/jobs/${enc(jobId)}/tasks`, body, ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}) });\n }\n}\n\nclass TasksResource {\n constructor(private readonly t: Transport) {}\n\n /** Account-wide paginated task table. */\n list(query?: AccountTasksQuery): Promise<TasksPage> {\n return this.t.request({ method: \"GET\", path: \"/v1/tasks\", ...(query ? { query: query as Record<string, string | number | boolean | undefined> } : {}) });\n }\n get(taskId: string): Promise<PublicTask> {\n return this.t.request({ method: \"GET\", path: `/v1/tasks/${enc(taskId)}` });\n }\n update(taskId: string, body: TaskUpdateBody): Promise<PublicTask> {\n return this.t.request({ method: \"PATCH\", path: `/v1/tasks/${enc(taskId)}`, body });\n }\n delete(taskId: string): Promise<null> {\n return this.t.request({ method: \"DELETE\", path: `/v1/tasks/${enc(taskId)}` });\n }\n start(taskId: string): Promise<PublicTask> {\n return this.t.request({ method: \"POST\", path: `/v1/tasks/${enc(taskId)}/start` });\n }\n stop(taskId: string): Promise<PublicTask> {\n return this.t.request({ method: \"POST\", path: `/v1/tasks/${enc(taskId)}/stop` });\n }\n /** Trigger a one-off manual execution (does not change the schedule). */\n runNow(taskId: string): Promise<RunNowResult> {\n return this.t.request({ method: \"POST\", path: `/v1/tasks/${enc(taskId)}/run` });\n }\n listRuns(taskId: string, query?: RunsQuery): Promise<RunsPage> {\n return this.t.request({ method: \"GET\", path: `/v1/tasks/${enc(taskId)}/runs`, ...(query ? { query: query as Record<string, string | number | boolean | undefined> } : {}) });\n }\n}\n\nclass RunsResource {\n constructor(private readonly t: Transport) {}\n\n /** Account-wide paginated activity feed. */\n list(query?: AccountRunsQuery): Promise<RunsPage> {\n return this.t.request({ method: \"GET\", path: \"/v1/runs\", ...(query ? { query: query as Record<string, string | number | boolean | undefined> } : {}) });\n }\n get(runId: string): Promise<PublicRun> {\n return this.t.request({ method: \"GET\", path: `/v1/runs/${enc(runId)}` });\n }\n}\n\nclass AccountResource {\n constructor(private readonly t: Transport) {}\n\n me(): Promise<MeResponse> {\n return this.t.request({ method: \"GET\", path: \"/v1/me\" });\n }\n usage(): Promise<UsageResponse> {\n return this.t.request({ method: \"GET\", path: \"/v1/usage\" });\n }\n}\n\nfunction enc(segment: string): string {\n return encodeURIComponent(segment);\n}\n","/**\n * Authentication helpers for the dispatch handler.\n *\n * Inbound (Cronvello → app): a bearer token equal to the configured `dispatchSecret`.\n * We compare it in constant time to avoid leaking the secret through timing.\n *\n * Outbound (app → Cronvello, async_callback only): we sign the callback body with\n * HMAC-SHA256 (`sha256=<hex>`), matching node-cron's `webhook-hmac.service`.\n */\n\nconst encoder = new TextEncoder();\n\n/** Parse `Authorization: Bearer <token>` (scheme is case-insensitive). Returns the token or null. */\nexport function parseBearer(headerValue: string | undefined): string | null {\n if (!headerValue) return null;\n const match = /^bearer\\s+(.+)$/i.exec(headerValue.trim());\n return match ? match[1]!.trim() : null;\n}\n\n/**\n * Constant-time string comparison. Runs in time proportional to the longer input and never\n * short-circuits, so it does not reveal where two values diverge. No `node:crypto` dependency,\n * so it works on edge runtimes too.\n */\nexport function timingSafeEqual(a: string, b: string): boolean {\n const ab = encoder.encode(a);\n const bb = encoder.encode(b);\n const len = Math.max(ab.length, bb.length);\n let diff = ab.length ^ bb.length;\n for (let i = 0; i < len; i++) {\n diff |= (ab[i] ?? 0) ^ (bb[i] ?? 0);\n }\n return diff === 0;\n}\n\n/**\n * HMAC-SHA256 signature in node-cron's wire format: `sha256=<hex>`.\n * Uses WebCrypto (`crypto.subtle`), available on Node 18+ and edge runtimes — no node:crypto.\n */\nexport async function signHmacSha256(payload: string, secret: string): Promise<string> {\n const key = await crypto.subtle.importKey(\n \"raw\",\n encoder.encode(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n const sig = await crypto.subtle.sign(\"HMAC\", key, encoder.encode(payload));\n const hex = Array.from(new Uint8Array(sig))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n return `sha256=${hex}`;\n}\n","/**\n * Framework-neutral dispatch core.\n *\n * Cronvello fires a due task by POSTing to the app's dispatch URL with\n * Authorization: Bearer <dispatchSecret>\n * body: { job: \"<registry-key>\", schedule: \"<cron>\", ...payload, _callback?: {...} }\n *\n * This module verifies the bearer, selects the job by key, runs its handler, and returns a\n * response. The Express/Next adapters are thin shells that translate their request/response\n * objects to/from the neutral shapes below.\n */\n\nimport type { CronvelloJobConfig, CronvelloJobContext, CronvelloLogger } from \"./types.js\";\nimport { parseBearer, signHmacSha256, timingSafeEqual } from \"./verify.js\";\n\nexport interface ResolvedJob {\n key: string;\n config: CronvelloJobConfig;\n}\n\nexport interface DispatcherState {\n jobs: Map<string, ResolvedJob>;\n dispatchSecret: string;\n logger: CronvelloLogger | undefined;\n}\n\nexport interface DispatchRequest {\n method: string;\n /** Value of the Authorization header, if any. */\n authorization: string | undefined;\n /** Raw request body as text. */\n rawBody: string;\n /** Lower-cased request headers. */\n headers: Record<string, string>;\n /** Abort signal for the inbound request, if the host provides one. */\n signal?: AbortSignal;\n /**\n * Optional serverless lifecycle hook (e.g. Vercel/Cloudflare `ctx.waitUntil`). When present,\n * async_callback background work is registered with it so the function stays alive until done.\n */\n waitUntil?: (promise: Promise<unknown>) => void;\n}\n\nexport interface DispatchResponse {\n status: number;\n body: Record<string, unknown>;\n}\n\n/** Async-callback metadata Cronvello injects into the request body. */\ninterface CallbackEnvelope {\n url: string;\n runId: string;\n expectedSignatureHeader?: string;\n timeoutMs?: number;\n}\n\nexport function createDispatcher(state: DispatcherState) {\n const log = state.logger;\n\n async function handle(req: DispatchRequest): Promise<DispatchResponse> {\n if (req.method.toUpperCase() !== \"POST\") {\n return resp(405, { ok: false, error: \"Method not allowed\" });\n }\n\n // 1. Authenticate: bearer must equal the dispatch secret (constant-time).\n const token = parseBearer(req.authorization);\n if (!token || !timingSafeEqual(token, state.dispatchSecret)) {\n log?.warn?.(\"[cronvello] dispatch rejected: bad or missing bearer token\");\n return resp(401, { ok: false, error: \"Unauthorized\" });\n }\n\n // 2. Parse the body.\n let body: Record<string, unknown>;\n try {\n const parsed = req.rawBody ? JSON.parse(req.rawBody) : {};\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return resp(400, { ok: false, error: \"Body must be a JSON object\" });\n }\n body = parsed as Record<string, unknown>;\n } catch {\n return resp(400, { ok: false, error: \"Invalid JSON body\" });\n }\n\n // 3. Select the job by its registry key.\n const key = typeof body[\"job\"] === \"string\" ? (body[\"job\"] as string) : null;\n if (!key) {\n return resp(400, { ok: false, error: \"Missing 'job' key in body\" });\n }\n const job = state.jobs.get(key);\n if (!job) {\n log?.warn?.(`[cronvello] dispatch for unknown job '${key}'`);\n return resp(404, { ok: false, error: `Unknown job: ${key}` });\n }\n\n const callback = readCallback(body[\"_callback\"]);\n const isAsync = callback !== null;\n const ctx: CronvelloJobContext = {\n key,\n schedule: typeof body[\"schedule\"] === \"string\" ? (body[\"schedule\"] as string) : \"\",\n payload: (job.config.payload as Record<string, unknown>) ?? {},\n body,\n headers: req.headers,\n isAsync,\n signal: req.signal,\n };\n\n // 4a. Async path — acknowledge now, run in the background, post the result back.\n if (callback) {\n const work = runAndReportCallback(job, ctx, callback, state.dispatchSecret, log);\n if (req.waitUntil) req.waitUntil(work);\n else void work; // fire-and-forget on long-running hosts\n return resp(202, { ok: true, job: key, accepted: true });\n }\n\n // 4b. Sync path — run inline; the result IS the HTTP response Cronvello records.\n const startedAt = Date.now();\n try {\n const result = await job.config.handler(ctx);\n log?.debug?.(`[cronvello] job '${key}' completed in ${Date.now() - startedAt}ms`);\n return resp(200, { ok: true, job: key, result: result ?? null });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n log?.error?.(`[cronvello] job '${key}' failed: ${message}`, { error: message });\n // Non-2xx → Cronvello records a failure and retries per the task's maxRetries.\n return resp(500, { ok: false, job: key, error: message });\n }\n }\n\n return { handle };\n}\n\nasync function runAndReportCallback(\n job: ResolvedJob,\n ctx: CronvelloJobContext,\n callback: CallbackEnvelope,\n secret: string,\n log: CronvelloLogger | undefined,\n): Promise<void> {\n const startedAt = Date.now();\n let payload: Record<string, unknown>;\n try {\n const result = await job.config.handler(ctx);\n payload = {\n runId: callback.runId,\n success: true,\n durationMs: Date.now() - startedAt,\n result: result ?? null,\n };\n } catch (err) {\n payload = {\n runId: callback.runId,\n success: false,\n durationMs: Date.now() - startedAt,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n\n try {\n const bodyStr = JSON.stringify(payload);\n const header = callback.expectedSignatureHeader || \"X-Webhook-Signature\";\n const signature = await signHmacSha256(bodyStr, secret);\n const res = await fetch(callback.url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", [header]: signature },\n body: bodyStr,\n });\n if (!res.ok) {\n log?.warn?.(`[cronvello] callback POST for job '${job.key}' returned ${res.status}`);\n }\n } catch (err) {\n log?.error?.(`[cronvello] failed to deliver callback for job '${job.key}'`, {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\nfunction readCallback(value: unknown): CallbackEnvelope | null {\n if (!value || typeof value !== \"object\") return null;\n const v = value as Record<string, unknown>;\n if (typeof v[\"url\"] !== \"string\" || typeof v[\"runId\"] !== \"string\") return null;\n return {\n url: v[\"url\"] as string,\n runId: v[\"runId\"] as string,\n ...(typeof v[\"expectedSignatureHeader\"] === \"string\"\n ? { expectedSignatureHeader: v[\"expectedSignatureHeader\"] as string }\n : {}),\n ...(typeof v[\"timeoutMs\"] === \"number\" ? { timeoutMs: v[\"timeoutMs\"] as number } : {}),\n };\n}\n\nfunction resp(status: number, body: Record<string, unknown>): DispatchResponse {\n return { status, body };\n}\n","/**\n * Idempotent reconciliation of a code registry into Cronvello.\n *\n * Model: ONE Job container per app (named `appName`), and one Task per registry job. The\n * Task's `name` IS the registry key — the stable identity used for matching, so renaming a\n * job's display/description never breaks the link. On each `sync()` we:\n * 1. ensure the Job container exists,\n * 2. diff registry tasks against the container's current tasks,\n * 3. create missing, patch changed, (optionally) delete removed,\n * 4. start newly-created tasks (Cronvello creates them DISABLED).\n *\n * The container is fully SDK-managed: only tasks inside THIS app's Job are ever touched.\n */\n\nimport type { CronvelloClient } from \"../client/client.js\";\nimport type {\n PublicJob,\n PublicTask,\n SuccessCriteria,\n TaskCreateBody,\n TaskUpdateBody,\n} from \"../internal/wire.js\";\nimport type {\n ReconcileResult,\n ReconcileTaskChange,\n SyncOptions,\n} from \"./types.js\";\nimport type { ResolvedJob } from \"./dispatch.js\";\n\nexport interface ReconcileInput {\n client: CronvelloClient;\n appName: string;\n appDescription?: string;\n dispatchUrl: string;\n dispatchSecret: string;\n defaultTimeZone: string;\n jobs: ResolvedJob[];\n}\n\nexport async function reconcile(input: ReconcileInput, options: SyncOptions = {}): Promise<ReconcileResult> {\n const { client, appName, dispatchUrl, dispatchSecret, defaultTimeZone, jobs } = input;\n const prune = options.prune ?? true;\n const dryRun = options.dryRun ?? false;\n const rotateSecret = options.rotateSecret ?? false;\n\n // 1. Ensure the Job container.\n const { job: container, created: jobCreated } = await ensureContainer(client, appName, input.appDescription, dryRun);\n const jobId = container?.id ?? \"(dry-run)\";\n\n const changes: ReconcileTaskChange[] = [];\n const existingTasks = container && !jobCreated ? await client.jobs.listTasks(container.id) : [];\n const byKey = new Map(existingTasks.map((t) => [t.name, t] as const));\n const registryKeys = new Set(jobs.map((j) => j.key));\n\n // 2. Reconcile each registry job.\n for (const job of jobs) {\n const enabled = job.config.enabled ?? true;\n const existing = byKey.get(job.key);\n const desired = buildDesiredTask({ job, dispatchUrl, dispatchSecret, defaultTimeZone });\n\n if (!enabled) {\n // Keep the task but make sure it is not scheduled.\n if (existing && existing.status === \"ACTIVE\" && !dryRun) await client.tasks.stop(existing.id);\n changes.push({ key: job.key, action: \"skipped\", taskId: existing?.id ?? null, reason: \"disabled in registry\" });\n continue;\n }\n\n if (!existing) {\n if (dryRun || !container) {\n changes.push({ key: job.key, action: \"created\", taskId: null });\n continue;\n }\n const createBody: TaskCreateBody = { ...desired, targetToken: dispatchSecret };\n const task = await client.jobs.createTask(container.id, createBody, { idempotencyKey: `cv-create-${appName}-${job.key}` });\n await client.tasks.start(task.id); // tasks are created DISABLED\n changes.push({ key: job.key, action: \"created\", taskId: task.id });\n continue;\n }\n\n // Existing task — compute the diff.\n const { patch, changedFields } = diffTask(existing, desired, { rotateSecret, dispatchSecret });\n const needsStart = existing.status === \"DISABLED\";\n\n if (changedFields.length === 0 && !needsStart) {\n changes.push({ key: job.key, action: \"unchanged\", taskId: existing.id });\n continue;\n }\n if (!dryRun) {\n if (changedFields.length > 0) await client.tasks.update(existing.id, patch);\n if (needsStart) await client.tasks.start(existing.id);\n }\n changes.push({\n key: job.key,\n action: changedFields.length > 0 ? \"updated\" : \"unchanged\",\n taskId: existing.id,\n ...(changedFields.length > 0 ? { changedFields } : {}),\n ...(needsStart ? { reason: \"re-activated\" } : {}),\n });\n }\n\n // 3. Prune tasks no longer in the registry.\n if (prune) {\n for (const task of existingTasks) {\n if (registryKeys.has(task.name)) continue;\n if (!dryRun) await client.tasks.delete(task.id);\n changes.push({ key: task.name, action: \"deleted\", taskId: task.id });\n }\n }\n\n return summarize(jobId, appName, jobCreated, changes);\n}\n\nasync function ensureContainer(\n client: CronvelloClient,\n appName: string,\n description: string | undefined,\n dryRun: boolean,\n): Promise<{ job: PublicJob | null; created: boolean }> {\n const jobs = await client.jobs.list();\n const found = jobs.find((j) => j.name === appName);\n if (found) return { job: found, created: false };\n if (dryRun) return { job: null, created: true };\n const created = await client.jobs.create(\n { name: appName, ...(description ? { description } : {}) },\n { idempotencyKey: `cv-job-${appName}` },\n );\n return { job: created, created: true };\n}\n\nfunction buildDesiredTask(args: {\n job: ResolvedJob;\n dispatchUrl: string;\n dispatchSecret: string;\n defaultTimeZone: string;\n}): TaskCreateBody {\n const { job, dispatchUrl, defaultTimeZone } = args;\n const cfg = job.config;\n const requestBody = JSON.stringify({ job: job.key, ...(cfg.payload ?? {}) });\n const body: TaskCreateBody = {\n name: job.key,\n schedule: cfg.schedule,\n timeZone: cfg.timeZone ?? defaultTimeZone,\n targetUrl: dispatchUrl,\n method: \"POST\",\n requestBody,\n };\n if (cfg.description !== undefined) body.description = cfg.description;\n if (cfg.urgency !== undefined) body.urgency = cfg.urgency;\n if (cfg.maxRetries !== undefined) body.maxRetries = cfg.maxRetries;\n if (cfg.executionMode !== undefined) body.executionMode = cfg.executionMode;\n if (cfg.callbackTimeoutMs !== undefined) body.callbackTimeoutMs = cfg.callbackTimeoutMs;\n if (cfg.allowConcurrentRuns !== undefined) body.allowConcurrentRuns = cfg.allowConcurrentRuns;\n if (cfg.successCriteria !== undefined) body.successCriteria = cfg.successCriteria;\n return body;\n}\n\nfunction diffTask(\n existing: PublicTask,\n desired: TaskCreateBody,\n opts: { rotateSecret: boolean; dispatchSecret: string },\n): { patch: TaskUpdateBody; changedFields: string[] } {\n const patch: TaskUpdateBody = {};\n const changed: string[] = [];\n\n const set = <K extends keyof TaskUpdateBody>(field: K, value: TaskUpdateBody[K]) => {\n patch[field] = value;\n changed.push(field);\n };\n\n if (existing.schedule !== desired.schedule) set(\"schedule\", desired.schedule);\n if (desired.timeZone !== undefined && existing.timeZone !== desired.timeZone) set(\"timeZone\", desired.timeZone);\n if (existing.targetUrl !== desired.targetUrl) set(\"targetUrl\", desired.targetUrl);\n if (existing.method !== (desired.method ?? \"POST\")) set(\"method\", desired.method ?? \"POST\");\n if (!jsonEqual(existing.requestBody, desired.requestBody)) set(\"requestBody\", desired.requestBody ?? null);\n\n // Optional fields: only reconcile when the registry explicitly sets them.\n if (desired.description !== undefined && (existing.description ?? undefined) !== desired.description) {\n set(\"description\", desired.description);\n }\n if (desired.urgency !== undefined && existing.urgency !== desired.urgency) set(\"urgency\", desired.urgency);\n if (desired.maxRetries !== undefined && existing.maxRetries !== desired.maxRetries) set(\"maxRetries\", desired.maxRetries);\n if (desired.executionMode !== undefined && existing.executionMode !== desired.executionMode) {\n set(\"executionMode\", desired.executionMode);\n }\n if (desired.callbackTimeoutMs !== undefined && existing.callbackTimeoutMs !== desired.callbackTimeoutMs) {\n set(\"callbackTimeoutMs\", desired.callbackTimeoutMs);\n }\n if (desired.allowConcurrentRuns !== undefined && existing.allowConcurrentRuns !== desired.allowConcurrentRuns) {\n set(\"allowConcurrentRuns\", desired.allowConcurrentRuns);\n }\n if (desired.successCriteria !== undefined && !deepEqual(existing.successCriteria, desired.successCriteria)) {\n set(\"successCriteria\", desired.successCriteria as SuccessCriteria);\n }\n\n // The dispatch secret (targetToken) can't be read back — only (re)set it on demand or when absent.\n if (opts.rotateSecret || !existing.hasTargetToken) set(\"targetToken\", opts.dispatchSecret);\n\n return { patch, changedFields: changed };\n}\n\nfunction jsonEqual(a: string | null, b: string | null | undefined): boolean {\n if (a == null || b == null) return a == b;\n try {\n return deepEqual(JSON.parse(a), JSON.parse(b));\n } catch {\n return a === b;\n }\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return a === b;\n if (typeof a !== \"object\" || typeof b !== \"object\") return false;\n const ak = Object.keys(a as object).sort();\n const bk = Object.keys(b as object).sort();\n if (ak.length !== bk.length) return false;\n for (let i = 0; i < ak.length; i++) {\n if (ak[i] !== bk[i]) return false;\n if (!deepEqual((a as Record<string, unknown>)[ak[i]!], (b as Record<string, unknown>)[bk[i]!])) return false;\n }\n return true;\n}\n\nfunction summarize(\n jobId: string,\n jobName: string,\n jobCreated: boolean,\n changes: ReconcileTaskChange[],\n): ReconcileResult {\n const count = (a: ReconcileTaskChange[\"action\"]) => changes.filter((c) => c.action === a).length;\n return {\n jobId,\n jobName,\n jobCreated,\n created: count(\"created\"),\n updated: count(\"updated\"),\n unchanged: count(\"unchanged\"),\n deleted: count(\"deleted\"),\n skipped: count(\"skipped\"),\n changes,\n };\n}\n","/**\n * Express adapter. Zero dependency on `express` itself — the request/response are typed\n * structurally, so this works with Express 4/5 and any Connect-style middleware stack.\n *\n * import { defineCronvello } from \"@cronvello/sdk\";\n * import { expressHandler } from \"@cronvello/sdk/express\";\n *\n * app.post(\"/cronvello/dispatch\", express.json(), expressHandler(cronvello));\n * // …or simply: app.post(cronvello.dispatchPath, express.json(), cronvello.expressHandler());\n *\n * Works with or without `express.json()` — if the body isn't pre-parsed, the raw stream is read.\n */\n\nimport type { DispatchHandler } from \"../registry/dispatch-handler.js\";\n\nexport interface ExpressRequestLike {\n method?: string;\n headers: Record<string, string | string[] | undefined>;\n body?: unknown;\n on?(event: string, listener: (chunk?: unknown) => void): void;\n}\n\nexport interface ExpressResponseLike {\n status(code: number): ExpressResponseLike;\n json(body: unknown): void;\n}\n\nexport type ExpressDispatchHandler = (req: ExpressRequestLike, res: ExpressResponseLike) => Promise<void>;\n\nexport function expressHandler(app: DispatchHandler): ExpressDispatchHandler {\n return async (req, res) => {\n const rawBody = await readBody(req);\n const result = await app.handle({\n method: req.method ?? \"POST\",\n authorization: headerValue(req.headers[\"authorization\"]),\n rawBody,\n headers: flattenHeaders(req.headers),\n });\n res.status(result.status).json(result.body);\n };\n}\n\nasync function readBody(req: ExpressRequestLike): Promise<string> {\n const body = req.body;\n if (body !== undefined && body !== null) {\n if (typeof body === \"string\") return body;\n if (typeof Buffer !== \"undefined\" && Buffer.isBuffer(body)) return body.toString(\"utf8\");\n if (typeof body === \"object\") return JSON.stringify(body);\n }\n if (typeof req.on !== \"function\") return \"\";\n return new Promise<string>((resolve) => {\n let data = \"\";\n req.on!(\"data\", (chunk?: unknown) => {\n data += typeof chunk === \"string\" ? chunk : String(chunk ?? \"\");\n });\n req.on!(\"end\", () => resolve(data));\n req.on!(\"error\", () => resolve(data));\n });\n}\n\nfunction headerValue(value: string | string[] | undefined): string | undefined {\n if (Array.isArray(value)) return value[0];\n return value;\n}\n\nfunction flattenHeaders(headers: Record<string, string | string[] | undefined>): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(headers)) {\n if (v === undefined) continue;\n out[k.toLowerCase()] = Array.isArray(v) ? v.join(\", \") : v;\n }\n return out;\n}\n","/**\n * Next.js App Router adapter (Route Handlers). Zero dependency on `next` — uses the Web\n * Fetch `Request`/`Response` globals (Node 18+ and the edge runtime).\n *\n * // app/cronvello/dispatch/route.ts\n * import { cronvello } from \"@/lib/cronvello\";\n * import { nextHandler } from \"@cronvello/sdk/next\";\n * export const POST = nextHandler(cronvello);\n *\n * On serverless hosts, prefer the default sync execution mode so the work finishes within the\n * request. async_callback needs a host that keeps running after the response (see docs).\n */\n\nimport type { DispatchHandler } from \"../registry/dispatch-handler.js\";\n\n/** Structural subset of the Web Fetch `Request` we rely on. */\nexport interface FetchRequestLike {\n method: string;\n headers: {\n get(name: string): string | null;\n forEach?(cb: (value: string, key: string) => void): void;\n };\n text(): Promise<string>;\n}\n\nexport type NextRouteHandler = (req: FetchRequestLike) => Promise<Response>;\n\nexport function nextHandler(app: DispatchHandler): NextRouteHandler {\n return async (req) => {\n const rawBody = await req.text();\n const headers: Record<string, string> = {};\n req.headers.forEach?.((value, key) => {\n headers[key.toLowerCase()] = value;\n });\n const result = await app.handle({\n method: req.method,\n authorization: req.headers.get(\"authorization\") ?? undefined,\n rawBody,\n headers,\n });\n return new Response(JSON.stringify(result.body), {\n status: result.status,\n headers: { \"content-type\": \"application/json\" },\n });\n };\n}\n","/**\n * `defineCronvello` — the high-level, code-first entry point.\n *\n * export const cronvello = defineCronvello({\n * appName: \"my-app\",\n * appUrl: process.env.APP_URL!,\n * apiKey: process.env.CRONVELLO_API_KEY!,\n * dispatchSecret: process.env.CRONVELLO_DISPATCH_SECRET!,\n * jobs: {\n * \"send-daily-digest\": { schedule: \"0 8 * * *\", handler: async () => { … } },\n * \"cleanup-temp\": { schedule: \"*\\/15 * * * *\", handler: async () => { … } },\n * },\n * });\n *\n * await cronvello.sync(); // reconcile the registry to Cronvello (idempotent)\n * app.post(cronvello.dispatchPath, express.json(), cronvello.expressHandler());\n */\n\nimport { CronvelloClient, CRONVELLO_DEFAULT_BASE_URL } from \"../client/client.js\";\nimport { CronvelloApiError, CronvelloConfigError } from \"../internal/errors.js\";\nimport type { RegistryReconcileRequest, RegistryTaskInput, RunNowResult } from \"../internal/wire.js\";\nimport { createDispatcher, type DispatchRequest, type DispatchResponse, type ResolvedJob } from \"./dispatch.js\";\nimport { reconcile } from \"./reconcile.js\";\nimport { expressHandler, type ExpressDispatchHandler } from \"../adapters/express.js\";\nimport { nextHandler, type NextRouteHandler } from \"../adapters/next.js\";\nimport type {\n CronvelloAppConfig,\n CronvelloJobConfig,\n CronvelloJobsInput,\n ReconcileResult,\n SyncOptions,\n} from \"./types.js\";\n\nconst DEFAULT_DISPATCH_PATH = \"/cronvello/dispatch\";\nconst DEFAULT_TIME_ZONE = \"Europe/Berlin\";\n\nexport interface CronvelloApp {\n /** The underlying low-level client for ad-hoc `/v1` calls. */\n readonly client: CronvelloClient;\n /** Resolved jobs, keyed by their stable registry key. */\n readonly jobs: ReadonlyMap<string, ResolvedJob>;\n /** The app identity / Job-container name. */\n readonly appName: string;\n /** Path the dispatch handler should be mounted at (e.g. \"/cronvello/dispatch\"). */\n readonly dispatchPath: string;\n /** Absolute URL Cronvello calls back (appUrl + dispatchPath). */\n readonly dispatchUrl: string;\n\n /** Reconcile the registry into Cronvello. Idempotent — safe to call on every boot/deploy. */\n sync(options?: SyncOptions): Promise<ReconcileResult>;\n /** Trigger one job immediately via Cronvello (manual run). Requires a prior `sync()`. */\n run(key: string): Promise<RunNowResult>;\n /** Framework-neutral dispatch entry — used by the adapters. */\n handle(req: DispatchRequest): Promise<DispatchResponse>;\n /** Express/Connect request handler for the dispatch endpoint. */\n expressHandler(): ExpressDispatchHandler;\n /** Next.js App Router (Route Handler) for the dispatch endpoint. */\n nextHandler(): NextRouteHandler;\n /** The registry keys, for diagnostics. */\n keys(): string[];\n}\n\nexport function defineCronvello(config: CronvelloAppConfig): CronvelloApp {\n validateConfig(config);\n\n const jobs = normalizeJobs(config.jobs);\n const dispatchPath = normalizePath(config.dispatchPath ?? DEFAULT_DISPATCH_PATH);\n const dispatchUrl = joinUrl(config.appUrl, dispatchPath);\n const defaultTimeZone = config.timeZone ?? DEFAULT_TIME_ZONE;\n\n const client = new CronvelloClient({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? CRONVELLO_DEFAULT_BASE_URL,\n ...(config.timeoutMs !== undefined ? { timeoutMs: config.timeoutMs } : {}),\n ...(config.maxRetries !== undefined ? { maxRetries: config.maxRetries } : {}),\n ...(config.fetch ? { fetch: config.fetch } : {}),\n });\n\n const dispatcher = createDispatcher({\n jobs,\n dispatchSecret: config.dispatchSecret,\n logger: config.logger,\n });\n\n const app: CronvelloApp = {\n client,\n jobs,\n appName: config.appName,\n dispatchPath,\n dispatchUrl,\n\n async sync(options?: SyncOptions): Promise<ReconcileResult> {\n const opts = options ?? {};\n // Prefer the atomic server-side reconcile (one round-trip). dryRun is only supported by\n // the local differ, so it always takes the client-side path.\n if (!opts.dryRun) {\n try {\n const res = await client.reconcileRegistry(\n buildRegistryRequest(config, dispatchUrl, defaultTimeZone, [...jobs.values()], opts),\n );\n return {\n jobId: res.job.id,\n jobName: res.job.name,\n jobCreated: res.jobCreated,\n created: res.created,\n updated: res.updated,\n unchanged: res.unchanged,\n deleted: res.deleted,\n skipped: res.skipped,\n changes: res.changes.map((c) => ({\n key: c.key,\n action: c.action,\n taskId: c.taskId,\n ...(c.changedFields ? { changedFields: c.changedFields } : {}),\n })),\n tasks: res.tasks,\n };\n } catch (e) {\n // Older server without /v1/registry → fall back to the client-side differ.\n if (!(e instanceof CronvelloApiError) || (e.status !== 404 && e.status !== 405)) throw e;\n }\n }\n return reconcile(\n {\n client,\n appName: config.appName,\n dispatchUrl,\n dispatchSecret: config.dispatchSecret,\n defaultTimeZone,\n jobs: [...jobs.values()],\n },\n opts,\n );\n },\n\n async run(key: string): Promise<RunNowResult> {\n if (!jobs.has(key)) {\n throw new CronvelloConfigError(`Unknown job '${key}'. Known: ${[...jobs.keys()].join(\", \") || \"(none)\"}`);\n }\n const containers = await client.jobs.list();\n const container = containers.find((j) => j.name === config.appName);\n if (!container) {\n throw new CronvelloConfigError(`App '${config.appName}' is not synced yet — call sync() first.`);\n }\n const tasks = await client.jobs.listTasks(container.id);\n const task = tasks.find((t) => t.name === key);\n if (!task) {\n throw new CronvelloConfigError(`Job '${key}' has no task yet — call sync() first.`);\n }\n return client.tasks.runNow(task.id);\n },\n\n handle: dispatcher.handle,\n expressHandler: () => expressHandler(app),\n nextHandler: () => nextHandler(app),\n keys: () => [...jobs.keys()],\n };\n\n return app;\n}\n\nfunction validateConfig(config: CronvelloAppConfig): void {\n if (!config) throw new CronvelloConfigError(\"defineCronvello requires a config object.\");\n if (!config.appName || !config.appName.trim()) throw new CronvelloConfigError(\"`appName` is required.\");\n if (!config.appUrl || !/^https?:\\/\\//i.test(config.appUrl)) {\n throw new CronvelloConfigError(\"`appUrl` must be an absolute http(s) URL (the public URL of THIS app).\");\n }\n if (!config.apiKey) throw new CronvelloConfigError(\"`apiKey` (crn_live_…) is required.\");\n if (!config.dispatchSecret || config.dispatchSecret.length < 16) {\n throw new CronvelloConfigError(\"`dispatchSecret` is required and must be at least 16 chars (use a random 32-byte value).\");\n }\n if (!config.jobs) throw new CronvelloConfigError(\"`jobs` is required.\");\n}\n\nfunction normalizeJobs(input: CronvelloJobsInput): Map<string, ResolvedJob> {\n const map = new Map<string, ResolvedJob>();\n const entries: Array<{ key: string; config: CronvelloJobConfig }> = Array.isArray(input)\n ? input.map(({ key, ...rest }) => ({ key, config: rest }))\n : Object.entries(input).map(([key, config]) => ({ key, config }));\n\n for (const { key, config } of entries) {\n const trimmed = (key ?? \"\").trim();\n if (!trimmed) throw new CronvelloConfigError(\"Every job needs a non-empty key.\");\n if (trimmed.length > 255) throw new CronvelloConfigError(`Job key '${trimmed}' exceeds 255 characters.`);\n if (map.has(trimmed)) throw new CronvelloConfigError(`Duplicate job key '${trimmed}'.`);\n if (!config || typeof config.handler !== \"function\") {\n throw new CronvelloConfigError(`Job '${trimmed}' is missing a handler function.`);\n }\n if (!config.schedule || !config.schedule.trim()) {\n throw new CronvelloConfigError(`Job '${trimmed}' is missing a schedule.`);\n }\n map.set(trimmed, { key: trimmed, config });\n }\n if (map.size === 0) throw new CronvelloConfigError(\"At least one job is required.\");\n return map;\n}\n\nfunction normalizePath(path: string): string {\n const trimmed = path.trim();\n return trimmed.startsWith(\"/\") ? trimmed.replace(/\\/+$/, \"\") || \"/\" : `/${trimmed.replace(/\\/+$/, \"\")}`;\n}\n\nfunction joinUrl(base: string, path: string): string {\n return `${base.replace(/\\/+$/, \"\")}${path}`;\n}\n\n/** Build the PUT /v1/registry body from the registry jobs. */\nfunction buildRegistryRequest(\n config: CronvelloAppConfig,\n dispatchUrl: string,\n defaultTimeZone: string,\n jobs: ResolvedJob[],\n opts: SyncOptions,\n): RegistryReconcileRequest {\n const tasks: RegistryTaskInput[] = jobs.map((j) => {\n const cfg = j.config;\n const task: RegistryTaskInput = {\n key: j.key,\n schedule: cfg.schedule,\n targetUrl: dispatchUrl,\n targetToken: config.dispatchSecret,\n method: \"POST\",\n timeZone: cfg.timeZone ?? defaultTimeZone,\n requestBody: JSON.stringify({ job: j.key, ...(cfg.payload ?? {}) }),\n };\n if (cfg.description !== undefined) task.description = cfg.description;\n if (cfg.urgency !== undefined) task.urgency = cfg.urgency;\n if (cfg.maxRetries !== undefined) task.maxRetries = cfg.maxRetries;\n if (cfg.executionMode !== undefined) task.executionMode = cfg.executionMode;\n if (cfg.callbackTimeoutMs !== undefined) task.callbackTimeoutMs = cfg.callbackTimeoutMs;\n if (cfg.allowConcurrentRuns !== undefined) task.allowConcurrentRuns = cfg.allowConcurrentRuns;\n if (cfg.successCriteria !== undefined) task.successCriteria = cfg.successCriteria;\n if (cfg.enabled !== undefined) task.enabled = cfg.enabled;\n return task;\n });\n return {\n appName: config.appName,\n tasks,\n prune: opts.prune ?? true,\n rotateSecret: opts.rotateSecret ?? false,\n };\n}\n","/**\n * @cronvello/sdk — code-first cron jobs for Cronvello.\n *\n * Two layers, one package:\n * • High-level registry: `defineCronvello({ jobs })` → `.sync()` + `.expressHandler()` / `.nextHandler()`.\n * Define jobs in code; the SDK reconciles them to https://api.cronvello.com and runs them.\n * • Low-level client: `new CronvelloClient({ apiKey })` → typed access to the whole `/v1` API.\n */\n\n// ── High-level registry ────────────────────────────────────────────────────\nexport { defineCronvello, type CronvelloApp } from \"./registry/define.js\";\nexport type {\n CronvelloAppConfig,\n CronvelloJobConfig,\n CronvelloJobConfigWithKey,\n CronvelloJobsInput,\n CronvelloJobContext,\n CronvelloJobHandler,\n CronvelloLogger,\n ReconcileResult,\n ReconcileTaskChange,\n SyncOptions,\n} from \"./registry/types.js\";\nexport type { DispatchRequest, DispatchResponse } from \"./registry/dispatch.js\";\n\n// ── Low-level client ───────────────────────────────────────────────────────\nexport {\n CronvelloClient,\n CRONVELLO_DEFAULT_BASE_URL,\n type CronvelloClientOptions,\n} from \"./client/client.js\";\n\n// ── Errors ─────────────────────────────────────────────────────────────────\nexport {\n CronvelloError,\n CronvelloApiError,\n CronvelloNetworkError,\n CronvelloConfigError,\n} from \"./internal/errors.js\";\n\n// ── Wire types ─────────────────────────────────────────────────────────────\nexport type {\n Urgency,\n ExecutionMode,\n HttpMethod,\n JobStatus,\n RunStatus,\n RunType,\n CallbackStatus,\n SuccessCriteria,\n PublicJob,\n PublicTask,\n PublicRun,\n JobCreateBody,\n JobUpdateBody,\n TaskCreateBody,\n TaskUpdateBody,\n RunsPage,\n TasksPage,\n RunNowResult,\n RegistryTaskInput,\n RegistryReconcileRequest,\n RegistryReconcileResponse,\n RegistryReconcileChange,\n MeResponse,\n UsageResponse,\n Pagination,\n RunsQuery,\n AccountTasksQuery,\n AccountRunsQuery,\n} from \"./internal/wire.js\";\n\n/**\n * Generate a strong random dispatch secret (hex). Convenience for setup scripts:\n * node -e \"console.log(require('@cronvello/sdk').generateDispatchSecret())\"\n */\nexport function generateDispatchSecret(bytes = 32): string {\n const buf = new Uint8Array(bytes);\n crypto.getRandomValues(buf);\n return Array.from(buf)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/internal/errors.ts","../src/internal/http.ts","../src/client/client.ts","../src/registry/verify.ts","../src/registry/dispatch.ts","../src/registry/reconcile.ts","../src/adapters/express.ts","../src/adapters/next.ts","../src/registry/define.ts","../src/index.ts"],"names":["headerValue"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Error taxonomy for the SDK. Everything thrown by the public surface is a\n * `CronvelloError` (or subclass), so callers can `catch (e) { if (e instanceof CronvelloError) … }`.\n */\n\nexport class CronvelloError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CronvelloError\";\n // Restore prototype chain for instanceof across transpilation targets.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** A non-2xx response from the Cronvello API. */\nexport class CronvelloApiError extends CronvelloError {\n /** HTTP status code. */\n readonly status: number;\n /** Machine-readable error code from the API body, when present. */\n readonly code: string | undefined;\n /** The method + path that failed, e.g. `POST /v1/jobs`. */\n readonly endpoint: string;\n /** Parsed response body (best effort). */\n readonly body: unknown;\n /** Seconds to wait before retrying, parsed from `Retry-After` / rate-limit payload (429 only). */\n readonly retryAfterSeconds: number | undefined;\n\n constructor(args: {\n status: number;\n endpoint: string;\n message: string;\n code?: string;\n body?: unknown;\n retryAfterSeconds?: number;\n }) {\n super(`[${args.status}] ${args.endpoint}: ${args.message}`);\n this.name = \"CronvelloApiError\";\n this.status = args.status;\n this.code = args.code;\n this.endpoint = args.endpoint;\n this.body = args.body;\n this.retryAfterSeconds = args.retryAfterSeconds;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n get isRateLimited(): boolean {\n return this.status === 429;\n }\n\n get isAuthError(): boolean {\n return this.status === 401 || this.status === 403;\n }\n\n get isNotFound(): boolean {\n return this.status === 404;\n }\n}\n\n/** A network/transport failure (DNS, connection reset, timeout) before any HTTP status. */\nexport class CronvelloNetworkError extends CronvelloError {\n readonly endpoint: string;\n override readonly cause: unknown;\n constructor(endpoint: string, cause: unknown) {\n super(`Network error calling ${endpoint}: ${describe(cause)}`);\n this.name = \"CronvelloNetworkError\";\n this.endpoint = endpoint;\n this.cause = cause;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** A misconfiguration caught before any network call (missing apiKey, bad URL, …). */\nexport class CronvelloConfigError extends CronvelloError {\n constructor(message: string) {\n super(message);\n this.name = \"CronvelloConfigError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nfunction describe(cause: unknown): string {\n if (cause instanceof Error) return cause.message;\n return String(cause);\n}\n","/**\n * Minimal HTTP transport over the global `fetch` (Node 18+). No axios, no node-fetch —\n * zero runtime dependencies. Adds bearer auth, JSON (de)serialization, typed error mapping,\n * bounded retries with backoff for transient failures, and optional idempotency keys.\n */\n\nimport {\n CronvelloApiError,\n CronvelloConfigError,\n CronvelloNetworkError,\n} from \"./errors.js\";\n\nexport type FetchLike = (\n input: string,\n init?: {\n method?: string;\n headers?: Record<string, string>;\n body?: string;\n signal?: AbortSignal;\n },\n) => Promise<{\n ok: boolean;\n status: number;\n headers: { get(name: string): string | null };\n text(): Promise<string>;\n}>;\n\nexport interface TransportOptions {\n baseUrl: string;\n apiKey: string;\n /** Per-request timeout in ms. Default 30_000. */\n timeoutMs?: number;\n /** Max retry attempts for 429/5xx/network errors. Default 2 (=> up to 3 tries). */\n maxRetries?: number;\n /** Override the fetch implementation (testing / custom agents). */\n fetch?: FetchLike;\n /** Extra headers sent on every request (e.g. a custom User-Agent). */\n defaultHeaders?: Record<string, string>;\n /** Telemetry hook — called once per completed attempt. */\n onRequest?: (info: { method: string; path: string; status: number; attempt: number; durationMs: number }) => void;\n}\n\nexport interface RequestOptions {\n method: string;\n path: string;\n query?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n /** Idempotency-Key header value — replays of the same key are de-duplicated server-side. */\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nconst RETRYABLE_STATUS = new Set([429, 500, 502, 503, 504]);\n\nexport class Transport {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeoutMs: number;\n private readonly maxRetries: number;\n private readonly fetchImpl: FetchLike;\n private readonly defaultHeaders: Record<string, string>;\n private readonly onRequest: TransportOptions[\"onRequest\"];\n\n constructor(opts: TransportOptions) {\n if (!opts.apiKey) throw new CronvelloConfigError(\"apiKey is required\");\n if (!opts.baseUrl) throw new CronvelloConfigError(\"baseUrl is required\");\n const resolvedFetch = opts.fetch ?? (globalThis.fetch as unknown as FetchLike | undefined);\n if (!resolvedFetch) {\n throw new CronvelloConfigError(\n \"No global fetch found. Use Node 18+ or pass a `fetch` implementation in the client options.\",\n );\n }\n this.baseUrl = opts.baseUrl.replace(/\\/+$/, \"\");\n this.apiKey = opts.apiKey;\n this.timeoutMs = opts.timeoutMs ?? 30_000;\n this.maxRetries = opts.maxRetries ?? 2;\n this.fetchImpl = resolvedFetch;\n this.defaultHeaders = opts.defaultHeaders ?? {};\n this.onRequest = opts.onRequest;\n }\n\n async request<T>(opts: RequestOptions): Promise<T> {\n const url = this.buildUrl(opts.path, opts.query);\n const endpoint = `${opts.method} ${opts.path}`;\n const headers: Record<string, string> = {\n authorization: `Bearer ${this.apiKey}`,\n accept: \"application/json\",\n ...this.defaultHeaders,\n };\n let payload: string | undefined;\n if (opts.body !== undefined) {\n headers[\"content-type\"] = \"application/json\";\n payload = JSON.stringify(opts.body);\n }\n if (opts.idempotencyKey) headers[\"idempotency-key\"] = opts.idempotencyKey;\n\n let lastError: unknown;\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n const startedAt = Date.now();\n const { signal, cancel } = this.withTimeout(opts.signal);\n try {\n const res = await this.fetchImpl(url, {\n method: opts.method,\n headers,\n ...(payload !== undefined ? { body: payload } : {}),\n signal,\n });\n cancel();\n const durationMs = Date.now() - startedAt;\n this.onRequest?.({ method: opts.method, path: opts.path, status: res.status, attempt, durationMs });\n\n const text = await res.text();\n const parsed = text ? safeJson(text) : null;\n\n if (res.ok) return unwrapEnvelope(parsed) as T;\n\n const retryAfter = parseRetryAfter(res, parsed);\n if (RETRYABLE_STATUS.has(res.status) && attempt < this.maxRetries) {\n await sleep(this.backoff(attempt, retryAfter));\n continue;\n }\n throw new CronvelloApiError({\n status: res.status,\n endpoint,\n message: extractMessage(parsed) ?? `Request failed`,\n code: extractCode(parsed),\n body: parsed,\n ...(retryAfter !== undefined ? { retryAfterSeconds: retryAfter } : {}),\n });\n } catch (err) {\n cancel();\n if (err instanceof CronvelloApiError) throw err;\n // Network/abort error — retry if attempts remain.\n lastError = err;\n if (attempt < this.maxRetries) {\n await sleep(this.backoff(attempt));\n continue;\n }\n throw new CronvelloNetworkError(endpoint, err);\n }\n }\n // Unreachable, but satisfies the type checker.\n throw new CronvelloNetworkError(endpoint, lastError);\n }\n\n private buildUrl(path: string, query?: RequestOptions[\"query\"]): string {\n const base = `${this.baseUrl}${path.startsWith(\"/\") ? path : `/${path}`}`;\n if (!query) return base;\n const params = Object.entries(query)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`);\n return params.length ? `${base}?${params.join(\"&\")}` : base;\n }\n\n private withTimeout(external?: AbortSignal): { signal: AbortSignal; cancel: () => void } {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n const onExternalAbort = () => controller.abort();\n if (external) {\n if (external.aborted) controller.abort();\n else external.addEventListener(\"abort\", onExternalAbort, { once: true });\n }\n return {\n signal: controller.signal,\n cancel: () => {\n clearTimeout(timer);\n external?.removeEventListener(\"abort\", onExternalAbort);\n },\n };\n }\n\n private backoff(attempt: number, retryAfterSeconds?: number): number {\n if (retryAfterSeconds !== undefined) return Math.min(retryAfterSeconds * 1000, 30_000);\n // Exponential backoff with full jitter: base 300ms, capped at 5s.\n const base = Math.min(300 * 2 ** attempt, 5_000);\n return Math.floor(Math.random() * base);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction safeJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\n/**\n * The Cronvello server wraps every successful `/v1` response in a `{ success, message, data }`\n * envelope, while the typed client methods are declared in terms of the inner payload. Unwrap\n * it here — centrally — so every resource method (and the high-level `sync()`) sees the data it\n * expects. Bodies that aren't enveloped (no boolean `success` + `data`) pass through unchanged,\n * so non-enveloped or future endpoints keep working.\n */\nfunction unwrapEnvelope(body: unknown): unknown {\n if (\n body !== null &&\n typeof body === \"object\" &&\n \"success\" in body &&\n typeof (body as { success: unknown }).success === \"boolean\" &&\n \"data\" in body\n ) {\n return (body as { data: unknown }).data;\n }\n return body;\n}\n\nfunction extractMessage(body: unknown): string | undefined {\n if (body && typeof body === \"object\" && \"message\" in body) {\n const m = (body as { message?: unknown }).message;\n if (typeof m === \"string\") return m;\n }\n return undefined;\n}\n\nfunction extractCode(body: unknown): string | undefined {\n if (body && typeof body === \"object\" && \"code\" in body) {\n const c = (body as { code?: unknown }).code;\n if (typeof c === \"string\") return c;\n }\n return undefined;\n}\n\nfunction parseRetryAfter(\n res: { headers: { get(name: string): string | null } },\n body: unknown,\n): number | undefined {\n const header = res.headers.get(\"retry-after\");\n if (header) {\n const n = Number(header);\n if (Number.isFinite(n)) return n;\n }\n if (body && typeof body === \"object\" && \"data\" in body) {\n const data = (body as { data?: { retryAfterSeconds?: unknown } }).data;\n if (data && typeof data.retryAfterSeconds === \"number\") return data.retryAfterSeconds;\n }\n return undefined;\n}\n","/**\n * Low-level, fully-typed client for the Cronvello public `/v1` API.\n *\n * This is the thin REST layer: one method per endpoint, request/response types straight\n * from the server contract. The high-level registry (`defineCronvello`) is built on top of\n * it. Use this directly when you need ad-hoc control beyond the registry model.\n */\n\nimport { Transport, type FetchLike } from \"../internal/http.js\";\nimport { CronvelloConfigError } from \"../internal/errors.js\";\nimport type {\n AccountRunsQuery,\n AccountTasksQuery,\n JobCreateBody,\n JobUpdateBody,\n MeResponse,\n PublicJob,\n PublicRun,\n PublicTask,\n RunNowResult,\n RegistryReconcileRequest,\n RegistryReconcileResponse,\n RunsPage,\n RunsQuery,\n TaskCreateBody,\n TasksPage,\n TaskUpdateBody,\n UsageResponse,\n} from \"../internal/wire.js\";\n\n/** The production Cronvello API. Override `baseUrl` only for self-hosting or testing. */\nexport const CRONVELLO_DEFAULT_BASE_URL = \"https://api.cronvello.com\";\n\nexport interface CronvelloClientOptions {\n /** Account API key (`crn_live_…`). Required. */\n apiKey: string;\n /** API base URL. Defaults to https://api.cronvello.com. */\n baseUrl?: string;\n /** Per-request timeout in ms (default 30_000). */\n timeoutMs?: number;\n /** Retry attempts for 429/5xx/network errors (default 2). */\n maxRetries?: number;\n /** Custom fetch implementation (default: global fetch). */\n fetch?: FetchLike;\n /** Telemetry hook for every request attempt. */\n onRequest?: (info: { method: string; path: string; status: number; attempt: number; durationMs: number }) => void;\n}\n\nexport class CronvelloClient {\n private readonly transport: Transport;\n /** The resolved base URL in use. */\n readonly baseUrl: string;\n\n /** Job container operations. */\n readonly jobs: JobsResource;\n /** Scheduled task operations. */\n readonly tasks: TasksResource;\n /** Execution-history (run) operations. */\n readonly runs: RunsResource;\n /** Account identity + usage. */\n readonly account: AccountResource;\n\n constructor(options: CronvelloClientOptions) {\n if (!options || !options.apiKey) {\n throw new CronvelloConfigError(\"CronvelloClient requires an `apiKey` (crn_live_…).\");\n }\n this.baseUrl = (options.baseUrl ?? CRONVELLO_DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.transport = new Transport({\n baseUrl: this.baseUrl,\n apiKey: options.apiKey,\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n ...(options.maxRetries !== undefined ? { maxRetries: options.maxRetries } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n ...(options.onRequest ? { onRequest: options.onRequest } : {}),\n defaultHeaders: { \"user-agent\": \"cronvello-sdk\" },\n });\n this.jobs = new JobsResource(this.transport);\n this.tasks = new TasksResource(this.transport);\n this.runs = new RunsResource(this.transport);\n this.account = new AccountResource(this.transport);\n }\n\n /**\n * Atomically reconcile a whole code registry server-side (`PUT /v1/registry`): one job\n * container + its tasks, created/updated/pruned/started in a single call. This is what\n * `defineCronvello().sync()` prefers; the high-level API builds the body for you.\n */\n reconcileRegistry(body: RegistryReconcileRequest, opts?: { idempotencyKey?: string }): Promise<RegistryReconcileResponse> {\n return this.transport.request({\n method: \"PUT\",\n path: \"/v1/registry\",\n body,\n ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}),\n });\n }\n\n /**\n * Escape hatch for endpoints not yet wrapped by a typed method (heartbeat monitors,\n * maintenance windows, DLQ, notification channels, audit log, API-key self-service …).\n * `T` is the response shape you expect.\n */\n request<T>(method: string, path: string, opts?: { query?: Record<string, string | number | boolean | undefined>; body?: unknown; idempotencyKey?: string }): Promise<T> {\n return this.transport.request<T>({\n method,\n path,\n ...(opts?.query ? { query: opts.query } : {}),\n ...(opts?.body !== undefined ? { body: opts.body } : {}),\n ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}),\n });\n }\n}\n\nclass JobsResource {\n constructor(private readonly t: Transport) {}\n\n list(): Promise<PublicJob[]> {\n return this.t.request({ method: \"GET\", path: \"/v1/jobs\" });\n }\n get(jobId: string): Promise<PublicJob> {\n return this.t.request({ method: \"GET\", path: `/v1/jobs/${enc(jobId)}` });\n }\n create(body: JobCreateBody, opts?: { idempotencyKey?: string }): Promise<PublicJob> {\n return this.t.request({ method: \"POST\", path: \"/v1/jobs\", body, ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}) });\n }\n update(jobId: string, body: JobUpdateBody): Promise<PublicJob> {\n return this.t.request({ method: \"PATCH\", path: `/v1/jobs/${enc(jobId)}`, body });\n }\n delete(jobId: string): Promise<null> {\n return this.t.request({ method: \"DELETE\", path: `/v1/jobs/${enc(jobId)}` });\n }\n start(jobId: string): Promise<PublicJob> {\n return this.t.request({ method: \"POST\", path: `/v1/jobs/${enc(jobId)}/start` });\n }\n stop(jobId: string): Promise<PublicJob> {\n return this.t.request({ method: \"POST\", path: `/v1/jobs/${enc(jobId)}/stop` });\n }\n listTasks(jobId: string): Promise<PublicTask[]> {\n return this.t.request({ method: \"GET\", path: `/v1/jobs/${enc(jobId)}/tasks` });\n }\n createTask(jobId: string, body: TaskCreateBody, opts?: { idempotencyKey?: string }): Promise<PublicTask> {\n return this.t.request({ method: \"POST\", path: `/v1/jobs/${enc(jobId)}/tasks`, body, ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}) });\n }\n}\n\nclass TasksResource {\n constructor(private readonly t: Transport) {}\n\n /** Account-wide paginated task table. */\n list(query?: AccountTasksQuery): Promise<TasksPage> {\n return this.t.request({ method: \"GET\", path: \"/v1/tasks\", ...(query ? { query: query as Record<string, string | number | boolean | undefined> } : {}) });\n }\n get(taskId: string): Promise<PublicTask> {\n return this.t.request({ method: \"GET\", path: `/v1/tasks/${enc(taskId)}` });\n }\n update(taskId: string, body: TaskUpdateBody): Promise<PublicTask> {\n return this.t.request({ method: \"PATCH\", path: `/v1/tasks/${enc(taskId)}`, body });\n }\n delete(taskId: string): Promise<null> {\n return this.t.request({ method: \"DELETE\", path: `/v1/tasks/${enc(taskId)}` });\n }\n start(taskId: string): Promise<PublicTask> {\n return this.t.request({ method: \"POST\", path: `/v1/tasks/${enc(taskId)}/start` });\n }\n stop(taskId: string): Promise<PublicTask> {\n return this.t.request({ method: \"POST\", path: `/v1/tasks/${enc(taskId)}/stop` });\n }\n /** Trigger a one-off manual execution (does not change the schedule). */\n runNow(taskId: string): Promise<RunNowResult> {\n return this.t.request({ method: \"POST\", path: `/v1/tasks/${enc(taskId)}/run` });\n }\n listRuns(taskId: string, query?: RunsQuery): Promise<RunsPage> {\n return this.t.request({ method: \"GET\", path: `/v1/tasks/${enc(taskId)}/runs`, ...(query ? { query: query as Record<string, string | number | boolean | undefined> } : {}) });\n }\n}\n\nclass RunsResource {\n constructor(private readonly t: Transport) {}\n\n /** Account-wide paginated activity feed. */\n list(query?: AccountRunsQuery): Promise<RunsPage> {\n return this.t.request({ method: \"GET\", path: \"/v1/runs\", ...(query ? { query: query as Record<string, string | number | boolean | undefined> } : {}) });\n }\n get(runId: string): Promise<PublicRun> {\n return this.t.request({ method: \"GET\", path: `/v1/runs/${enc(runId)}` });\n }\n}\n\nclass AccountResource {\n constructor(private readonly t: Transport) {}\n\n me(): Promise<MeResponse> {\n return this.t.request({ method: \"GET\", path: \"/v1/me\" });\n }\n usage(): Promise<UsageResponse> {\n return this.t.request({ method: \"GET\", path: \"/v1/usage\" });\n }\n}\n\nfunction enc(segment: string): string {\n return encodeURIComponent(segment);\n}\n","/**\n * Authentication helpers for the dispatch handler.\n *\n * Inbound (Cronvello → app): a bearer token equal to the configured `dispatchSecret`.\n * We compare it in constant time to avoid leaking the secret through timing.\n *\n * Outbound (app → Cronvello, async_callback only): we sign the callback body with\n * HMAC-SHA256 (`sha256=<hex>`), matching node-cron's `webhook-hmac.service`.\n */\n\nconst encoder = new TextEncoder();\n\n/** Parse `Authorization: Bearer <token>` (scheme is case-insensitive). Returns the token or null. */\nexport function parseBearer(headerValue: string | undefined): string | null {\n if (!headerValue) return null;\n const match = /^bearer\\s+(.+)$/i.exec(headerValue.trim());\n return match ? match[1]!.trim() : null;\n}\n\n/**\n * Constant-time string comparison. Runs in time proportional to the longer input and never\n * short-circuits, so it does not reveal where two values diverge. No `node:crypto` dependency,\n * so it works on edge runtimes too.\n */\nexport function timingSafeEqual(a: string, b: string): boolean {\n const ab = encoder.encode(a);\n const bb = encoder.encode(b);\n const len = Math.max(ab.length, bb.length);\n let diff = ab.length ^ bb.length;\n for (let i = 0; i < len; i++) {\n diff |= (ab[i] ?? 0) ^ (bb[i] ?? 0);\n }\n return diff === 0;\n}\n\n/**\n * HMAC-SHA256 signature in node-cron's wire format: `sha256=<hex>`.\n * Uses WebCrypto (`crypto.subtle`), available on Node 18+ and edge runtimes — no node:crypto.\n */\nexport async function signHmacSha256(payload: string, secret: string): Promise<string> {\n const key = await crypto.subtle.importKey(\n \"raw\",\n encoder.encode(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n const sig = await crypto.subtle.sign(\"HMAC\", key, encoder.encode(payload));\n const hex = Array.from(new Uint8Array(sig))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n return `sha256=${hex}`;\n}\n","/**\n * Framework-neutral dispatch core.\n *\n * Cronvello fires a due task by POSTing to the app's dispatch URL with\n * Authorization: Bearer <dispatchSecret>\n * body: { job: \"<registry-key>\", schedule: \"<cron>\", ...payload, _callback?: {...} }\n *\n * This module verifies the bearer, selects the job by key, runs its handler, and returns a\n * response. The Express/Next adapters are thin shells that translate their request/response\n * objects to/from the neutral shapes below.\n */\n\nimport type { CronvelloJobConfig, CronvelloJobContext, CronvelloLogger } from \"./types.js\";\nimport { parseBearer, signHmacSha256, timingSafeEqual } from \"./verify.js\";\n\nexport interface ResolvedJob {\n key: string;\n config: CronvelloJobConfig;\n}\n\nexport interface DispatcherState {\n jobs: Map<string, ResolvedJob>;\n dispatchSecret: string;\n logger: CronvelloLogger | undefined;\n}\n\nexport interface DispatchRequest {\n method: string;\n /** Value of the Authorization header, if any. */\n authorization: string | undefined;\n /** Raw request body as text. */\n rawBody: string;\n /** Lower-cased request headers. */\n headers: Record<string, string>;\n /** Abort signal for the inbound request, if the host provides one. */\n signal?: AbortSignal;\n /**\n * Optional serverless lifecycle hook (e.g. Vercel/Cloudflare `ctx.waitUntil`). When present,\n * async_callback background work is registered with it so the function stays alive until done.\n */\n waitUntil?: (promise: Promise<unknown>) => void;\n}\n\nexport interface DispatchResponse {\n status: number;\n body: Record<string, unknown>;\n}\n\n/** Async-callback metadata Cronvello injects into the request body. */\ninterface CallbackEnvelope {\n url: string;\n runId: string;\n expectedSignatureHeader?: string;\n timeoutMs?: number;\n}\n\nexport function createDispatcher(state: DispatcherState) {\n const log = state.logger;\n\n async function handle(req: DispatchRequest): Promise<DispatchResponse> {\n if (req.method.toUpperCase() !== \"POST\") {\n return resp(405, { ok: false, error: \"Method not allowed\" });\n }\n\n // 1. Authenticate: bearer must equal the dispatch secret (constant-time).\n const token = parseBearer(req.authorization);\n if (!token || !timingSafeEqual(token, state.dispatchSecret)) {\n log?.warn?.(\"[cronvello] dispatch rejected: bad or missing bearer token\");\n return resp(401, { ok: false, error: \"Unauthorized\" });\n }\n\n // 2. Parse the body.\n let body: Record<string, unknown>;\n try {\n const parsed = req.rawBody ? JSON.parse(req.rawBody) : {};\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return resp(400, { ok: false, error: \"Body must be a JSON object\" });\n }\n body = parsed as Record<string, unknown>;\n } catch {\n return resp(400, { ok: false, error: \"Invalid JSON body\" });\n }\n\n // 3. Select the job by its registry key.\n const key = typeof body[\"job\"] === \"string\" ? (body[\"job\"] as string) : null;\n if (!key) {\n return resp(400, { ok: false, error: \"Missing 'job' key in body\" });\n }\n const job = state.jobs.get(key);\n if (!job) {\n log?.warn?.(`[cronvello] dispatch for unknown job '${key}'`);\n return resp(404, { ok: false, error: `Unknown job: ${key}` });\n }\n\n const callback = readCallback(body[\"_callback\"]);\n const isAsync = callback !== null;\n const ctx: CronvelloJobContext = {\n key,\n schedule: typeof body[\"schedule\"] === \"string\" ? (body[\"schedule\"] as string) : \"\",\n payload: (job.config.payload as Record<string, unknown>) ?? {},\n body,\n headers: req.headers,\n isAsync,\n signal: req.signal,\n };\n\n // 4a. Async path — acknowledge now, run in the background, post the result back.\n if (callback) {\n const work = runAndReportCallback(job, ctx, callback, state.dispatchSecret, log);\n if (req.waitUntil) req.waitUntil(work);\n else void work; // fire-and-forget on long-running hosts\n return resp(202, { ok: true, job: key, accepted: true });\n }\n\n // 4b. Sync path — run inline; the result IS the HTTP response Cronvello records.\n const startedAt = Date.now();\n try {\n const result = await job.config.handler(ctx);\n log?.debug?.(`[cronvello] job '${key}' completed in ${Date.now() - startedAt}ms`);\n return resp(200, { ok: true, job: key, result: result ?? null });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n log?.error?.(`[cronvello] job '${key}' failed: ${message}`, { error: message });\n // Non-2xx → Cronvello records a failure and retries per the task's maxRetries.\n return resp(500, { ok: false, job: key, error: message });\n }\n }\n\n return { handle };\n}\n\nasync function runAndReportCallback(\n job: ResolvedJob,\n ctx: CronvelloJobContext,\n callback: CallbackEnvelope,\n secret: string,\n log: CronvelloLogger | undefined,\n): Promise<void> {\n const startedAt = Date.now();\n let payload: Record<string, unknown>;\n try {\n const result = await job.config.handler(ctx);\n payload = {\n runId: callback.runId,\n success: true,\n durationMs: Date.now() - startedAt,\n result: result ?? null,\n };\n } catch (err) {\n payload = {\n runId: callback.runId,\n success: false,\n durationMs: Date.now() - startedAt,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n\n try {\n const bodyStr = JSON.stringify(payload);\n const header = callback.expectedSignatureHeader || \"X-Webhook-Signature\";\n const signature = await signHmacSha256(bodyStr, secret);\n const res = await fetch(callback.url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", [header]: signature },\n body: bodyStr,\n });\n if (!res.ok) {\n log?.warn?.(`[cronvello] callback POST for job '${job.key}' returned ${res.status}`);\n }\n } catch (err) {\n log?.error?.(`[cronvello] failed to deliver callback for job '${job.key}'`, {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\nfunction readCallback(value: unknown): CallbackEnvelope | null {\n if (!value || typeof value !== \"object\") return null;\n const v = value as Record<string, unknown>;\n if (typeof v[\"url\"] !== \"string\" || typeof v[\"runId\"] !== \"string\") return null;\n return {\n url: v[\"url\"] as string,\n runId: v[\"runId\"] as string,\n ...(typeof v[\"expectedSignatureHeader\"] === \"string\"\n ? { expectedSignatureHeader: v[\"expectedSignatureHeader\"] as string }\n : {}),\n ...(typeof v[\"timeoutMs\"] === \"number\" ? { timeoutMs: v[\"timeoutMs\"] as number } : {}),\n };\n}\n\nfunction resp(status: number, body: Record<string, unknown>): DispatchResponse {\n return { status, body };\n}\n","/**\n * Idempotent reconciliation of a code registry into Cronvello.\n *\n * Model: ONE Job container per app (named `appName`), and one Task per registry job. The\n * Task's `name` IS the registry key — the stable identity used for matching, so renaming a\n * job's display/description never breaks the link. On each `sync()` we:\n * 1. ensure the Job container exists,\n * 2. diff registry tasks against the container's current tasks,\n * 3. create missing, patch changed, (optionally) delete removed,\n * 4. start newly-created tasks (Cronvello creates them DISABLED).\n *\n * The container is fully SDK-managed: only tasks inside THIS app's Job are ever touched.\n */\n\nimport type { CronvelloClient } from \"../client/client.js\";\nimport type {\n PublicJob,\n PublicTask,\n SuccessCriteria,\n TaskCreateBody,\n TaskUpdateBody,\n} from \"../internal/wire.js\";\nimport type {\n ReconcileResult,\n ReconcileTaskChange,\n SyncOptions,\n} from \"./types.js\";\nimport type { ResolvedJob } from \"./dispatch.js\";\n\nexport interface ReconcileInput {\n client: CronvelloClient;\n appName: string;\n appDescription?: string;\n dispatchUrl: string;\n dispatchSecret: string;\n defaultTimeZone: string;\n jobs: ResolvedJob[];\n}\n\nexport async function reconcile(input: ReconcileInput, options: SyncOptions = {}): Promise<ReconcileResult> {\n const { client, appName, dispatchUrl, dispatchSecret, defaultTimeZone, jobs } = input;\n const prune = options.prune ?? true;\n const dryRun = options.dryRun ?? false;\n const rotateSecret = options.rotateSecret ?? false;\n\n // 1. Ensure the Job container.\n const { job: container, created: jobCreated } = await ensureContainer(client, appName, input.appDescription, dryRun);\n const jobId = container?.id ?? \"(dry-run)\";\n\n const changes: ReconcileTaskChange[] = [];\n const existingTasks = container && !jobCreated ? await client.jobs.listTasks(container.id) : [];\n const byKey = new Map(existingTasks.map((t) => [t.name, t] as const));\n const registryKeys = new Set(jobs.map((j) => j.key));\n\n // 2. Reconcile each registry job.\n for (const job of jobs) {\n const enabled = job.config.enabled ?? true;\n const existing = byKey.get(job.key);\n const desired = buildDesiredTask({ job, dispatchUrl, dispatchSecret, defaultTimeZone });\n\n if (!enabled) {\n // Keep the task but make sure it is not scheduled.\n if (existing && existing.status === \"ACTIVE\" && !dryRun) await client.tasks.stop(existing.id);\n changes.push({ key: job.key, action: \"skipped\", taskId: existing?.id ?? null, reason: \"disabled in registry\" });\n continue;\n }\n\n if (!existing) {\n if (dryRun || !container) {\n changes.push({ key: job.key, action: \"created\", taskId: null });\n continue;\n }\n const createBody: TaskCreateBody = { ...desired, targetToken: dispatchSecret };\n const task = await client.jobs.createTask(container.id, createBody, { idempotencyKey: `cv-create-${appName}-${job.key}` });\n await client.tasks.start(task.id); // tasks are created DISABLED\n changes.push({ key: job.key, action: \"created\", taskId: task.id });\n continue;\n }\n\n // Existing task — compute the diff.\n const { patch, changedFields } = diffTask(existing, desired, { rotateSecret, dispatchSecret });\n const needsStart = existing.status === \"DISABLED\";\n\n if (changedFields.length === 0 && !needsStart) {\n changes.push({ key: job.key, action: \"unchanged\", taskId: existing.id });\n continue;\n }\n if (!dryRun) {\n if (changedFields.length > 0) await client.tasks.update(existing.id, patch);\n if (needsStart) await client.tasks.start(existing.id);\n }\n changes.push({\n key: job.key,\n action: changedFields.length > 0 ? \"updated\" : \"unchanged\",\n taskId: existing.id,\n ...(changedFields.length > 0 ? { changedFields } : {}),\n ...(needsStart ? { reason: \"re-activated\" } : {}),\n });\n }\n\n // 3. Prune tasks no longer in the registry.\n if (prune) {\n for (const task of existingTasks) {\n if (registryKeys.has(task.name)) continue;\n if (!dryRun) await client.tasks.delete(task.id);\n changes.push({ key: task.name, action: \"deleted\", taskId: task.id });\n }\n }\n\n return summarize(jobId, appName, jobCreated, changes);\n}\n\nasync function ensureContainer(\n client: CronvelloClient,\n appName: string,\n description: string | undefined,\n dryRun: boolean,\n): Promise<{ job: PublicJob | null; created: boolean }> {\n const jobs = await client.jobs.list();\n const found = jobs.find((j) => j.name === appName);\n if (found) return { job: found, created: false };\n if (dryRun) return { job: null, created: true };\n const created = await client.jobs.create(\n { name: appName, ...(description ? { description } : {}) },\n { idempotencyKey: `cv-job-${appName}` },\n );\n return { job: created, created: true };\n}\n\nfunction buildDesiredTask(args: {\n job: ResolvedJob;\n dispatchUrl: string;\n dispatchSecret: string;\n defaultTimeZone: string;\n}): TaskCreateBody {\n const { job, dispatchUrl, defaultTimeZone } = args;\n const cfg = job.config;\n const requestBody = JSON.stringify({ job: job.key, ...(cfg.payload ?? {}) });\n const body: TaskCreateBody = {\n name: job.key,\n schedule: cfg.schedule,\n timeZone: cfg.timeZone ?? defaultTimeZone,\n targetUrl: dispatchUrl,\n method: \"POST\",\n requestBody,\n };\n if (cfg.description !== undefined) body.description = cfg.description;\n if (cfg.urgency !== undefined) body.urgency = cfg.urgency;\n if (cfg.maxRetries !== undefined) body.maxRetries = cfg.maxRetries;\n if (cfg.executionMode !== undefined) body.executionMode = cfg.executionMode;\n if (cfg.callbackTimeoutMs !== undefined) body.callbackTimeoutMs = cfg.callbackTimeoutMs;\n if (cfg.allowConcurrentRuns !== undefined) body.allowConcurrentRuns = cfg.allowConcurrentRuns;\n if (cfg.successCriteria !== undefined) body.successCriteria = cfg.successCriteria;\n return body;\n}\n\nfunction diffTask(\n existing: PublicTask,\n desired: TaskCreateBody,\n opts: { rotateSecret: boolean; dispatchSecret: string },\n): { patch: TaskUpdateBody; changedFields: string[] } {\n const patch: TaskUpdateBody = {};\n const changed: string[] = [];\n\n const set = <K extends keyof TaskUpdateBody>(field: K, value: TaskUpdateBody[K]) => {\n patch[field] = value;\n changed.push(field);\n };\n\n if (existing.schedule !== desired.schedule) set(\"schedule\", desired.schedule);\n if (desired.timeZone !== undefined && existing.timeZone !== desired.timeZone) set(\"timeZone\", desired.timeZone);\n if (existing.targetUrl !== desired.targetUrl) set(\"targetUrl\", desired.targetUrl);\n if (existing.method !== (desired.method ?? \"POST\")) set(\"method\", desired.method ?? \"POST\");\n if (!jsonEqual(existing.requestBody, desired.requestBody)) set(\"requestBody\", desired.requestBody ?? null);\n\n // Optional fields: only reconcile when the registry explicitly sets them.\n if (desired.description !== undefined && (existing.description ?? undefined) !== desired.description) {\n set(\"description\", desired.description);\n }\n if (desired.urgency !== undefined && existing.urgency !== desired.urgency) set(\"urgency\", desired.urgency);\n if (desired.maxRetries !== undefined && existing.maxRetries !== desired.maxRetries) set(\"maxRetries\", desired.maxRetries);\n if (desired.executionMode !== undefined && existing.executionMode !== desired.executionMode) {\n set(\"executionMode\", desired.executionMode);\n }\n if (desired.callbackTimeoutMs !== undefined && existing.callbackTimeoutMs !== desired.callbackTimeoutMs) {\n set(\"callbackTimeoutMs\", desired.callbackTimeoutMs);\n }\n if (desired.allowConcurrentRuns !== undefined && existing.allowConcurrentRuns !== desired.allowConcurrentRuns) {\n set(\"allowConcurrentRuns\", desired.allowConcurrentRuns);\n }\n if (desired.successCriteria !== undefined && !deepEqual(existing.successCriteria, desired.successCriteria)) {\n set(\"successCriteria\", desired.successCriteria as SuccessCriteria);\n }\n\n // The dispatch secret (targetToken) can't be read back — only (re)set it on demand or when absent.\n if (opts.rotateSecret || !existing.hasTargetToken) set(\"targetToken\", opts.dispatchSecret);\n\n return { patch, changedFields: changed };\n}\n\nfunction jsonEqual(a: string | null, b: string | null | undefined): boolean {\n if (a == null || b == null) return a == b;\n try {\n return deepEqual(JSON.parse(a), JSON.parse(b));\n } catch {\n return a === b;\n }\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return a === b;\n if (typeof a !== \"object\" || typeof b !== \"object\") return false;\n const ak = Object.keys(a as object).sort();\n const bk = Object.keys(b as object).sort();\n if (ak.length !== bk.length) return false;\n for (let i = 0; i < ak.length; i++) {\n if (ak[i] !== bk[i]) return false;\n if (!deepEqual((a as Record<string, unknown>)[ak[i]!], (b as Record<string, unknown>)[bk[i]!])) return false;\n }\n return true;\n}\n\nfunction summarize(\n jobId: string,\n jobName: string,\n jobCreated: boolean,\n changes: ReconcileTaskChange[],\n): ReconcileResult {\n const count = (a: ReconcileTaskChange[\"action\"]) => changes.filter((c) => c.action === a).length;\n return {\n jobId,\n jobName,\n jobCreated,\n created: count(\"created\"),\n updated: count(\"updated\"),\n unchanged: count(\"unchanged\"),\n deleted: count(\"deleted\"),\n skipped: count(\"skipped\"),\n changes,\n };\n}\n","/**\n * Express adapter. Zero dependency on `express` itself — the request/response are typed\n * structurally, so this works with Express 4/5 and any Connect-style middleware stack.\n *\n * import { defineCronvello } from \"@cronvello/sdk\";\n * import { expressHandler } from \"@cronvello/sdk/express\";\n *\n * app.post(\"/cronvello/dispatch\", express.json(), expressHandler(cronvello));\n * // …or simply: app.post(cronvello.dispatchPath, express.json(), cronvello.expressHandler());\n *\n * Works with or without `express.json()` — if the body isn't pre-parsed, the raw stream is read.\n */\n\nimport type { DispatchHandler } from \"../registry/dispatch-handler.js\";\n\nexport interface ExpressRequestLike {\n method?: string;\n headers: Record<string, string | string[] | undefined>;\n body?: unknown;\n on?(event: string, listener: (chunk?: unknown) => void): void;\n}\n\nexport interface ExpressResponseLike {\n status(code: number): ExpressResponseLike;\n json(body: unknown): void;\n}\n\nexport type ExpressDispatchHandler = (req: ExpressRequestLike, res: ExpressResponseLike) => Promise<void>;\n\nexport function expressHandler(app: DispatchHandler): ExpressDispatchHandler {\n return async (req, res) => {\n const rawBody = await readBody(req);\n const result = await app.handle({\n method: req.method ?? \"POST\",\n authorization: headerValue(req.headers[\"authorization\"]),\n rawBody,\n headers: flattenHeaders(req.headers),\n });\n res.status(result.status).json(result.body);\n };\n}\n\nasync function readBody(req: ExpressRequestLike): Promise<string> {\n const body = req.body;\n if (body !== undefined && body !== null) {\n if (typeof body === \"string\") return body;\n if (typeof Buffer !== \"undefined\" && Buffer.isBuffer(body)) return body.toString(\"utf8\");\n if (typeof body === \"object\") return JSON.stringify(body);\n }\n if (typeof req.on !== \"function\") return \"\";\n return new Promise<string>((resolve) => {\n let data = \"\";\n req.on!(\"data\", (chunk?: unknown) => {\n data += typeof chunk === \"string\" ? chunk : String(chunk ?? \"\");\n });\n req.on!(\"end\", () => resolve(data));\n req.on!(\"error\", () => resolve(data));\n });\n}\n\nfunction headerValue(value: string | string[] | undefined): string | undefined {\n if (Array.isArray(value)) return value[0];\n return value;\n}\n\nfunction flattenHeaders(headers: Record<string, string | string[] | undefined>): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(headers)) {\n if (v === undefined) continue;\n out[k.toLowerCase()] = Array.isArray(v) ? v.join(\", \") : v;\n }\n return out;\n}\n","/**\n * Next.js App Router adapter (Route Handlers). Zero dependency on `next` — uses the Web\n * Fetch `Request`/`Response` globals (Node 18+ and the edge runtime).\n *\n * // app/cronvello/dispatch/route.ts\n * import { cronvello } from \"@/lib/cronvello\";\n * import { nextHandler } from \"@cronvello/sdk/next\";\n * export const POST = nextHandler(cronvello);\n *\n * On serverless hosts, prefer the default sync execution mode so the work finishes within the\n * request. async_callback needs a host that keeps running after the response (see docs).\n */\n\nimport type { DispatchHandler } from \"../registry/dispatch-handler.js\";\n\n/** Structural subset of the Web Fetch `Request` we rely on. */\nexport interface FetchRequestLike {\n method: string;\n headers: {\n get(name: string): string | null;\n forEach?(cb: (value: string, key: string) => void): void;\n };\n text(): Promise<string>;\n}\n\nexport type NextRouteHandler = (req: FetchRequestLike) => Promise<Response>;\n\nexport function nextHandler(app: DispatchHandler): NextRouteHandler {\n return async (req) => {\n const rawBody = await req.text();\n const headers: Record<string, string> = {};\n req.headers.forEach?.((value, key) => {\n headers[key.toLowerCase()] = value;\n });\n const result = await app.handle({\n method: req.method,\n authorization: req.headers.get(\"authorization\") ?? undefined,\n rawBody,\n headers,\n });\n return new Response(JSON.stringify(result.body), {\n status: result.status,\n headers: { \"content-type\": \"application/json\" },\n });\n };\n}\n","/**\n * `defineCronvello` — the high-level, code-first entry point.\n *\n * export const cronvello = defineCronvello({\n * appName: \"my-app\",\n * appUrl: process.env.APP_URL!,\n * apiKey: process.env.CRONVELLO_API_KEY!,\n * dispatchSecret: process.env.CRONVELLO_DISPATCH_SECRET!,\n * jobs: {\n * \"send-daily-digest\": { schedule: \"0 8 * * *\", handler: async () => { … } },\n * \"cleanup-temp\": { schedule: \"*\\/15 * * * *\", handler: async () => { … } },\n * },\n * });\n *\n * await cronvello.sync(); // reconcile the registry to Cronvello (idempotent)\n * app.post(cronvello.dispatchPath, express.json(), cronvello.expressHandler());\n */\n\nimport { CronvelloClient, CRONVELLO_DEFAULT_BASE_URL } from \"../client/client.js\";\nimport { CronvelloApiError, CronvelloConfigError } from \"../internal/errors.js\";\nimport type { RegistryReconcileRequest, RegistryTaskInput, RunNowResult } from \"../internal/wire.js\";\nimport { createDispatcher, type DispatchRequest, type DispatchResponse, type ResolvedJob } from \"./dispatch.js\";\nimport { reconcile } from \"./reconcile.js\";\nimport { expressHandler, type ExpressDispatchHandler } from \"../adapters/express.js\";\nimport { nextHandler, type NextRouteHandler } from \"../adapters/next.js\";\nimport type {\n CronvelloAppConfig,\n CronvelloJobConfig,\n CronvelloJobsInput,\n ReconcileResult,\n SyncOptions,\n} from \"./types.js\";\n\nconst DEFAULT_DISPATCH_PATH = \"/cronvello/dispatch\";\nconst DEFAULT_TIME_ZONE = \"Europe/Berlin\";\n\nexport interface CronvelloApp {\n /** The underlying low-level client for ad-hoc `/v1` calls. */\n readonly client: CronvelloClient;\n /** Resolved jobs, keyed by their stable registry key. */\n readonly jobs: ReadonlyMap<string, ResolvedJob>;\n /** The app identity / Job-container name. */\n readonly appName: string;\n /** Path the dispatch handler should be mounted at (e.g. \"/cronvello/dispatch\"). */\n readonly dispatchPath: string;\n /** Absolute URL Cronvello calls back (appUrl + dispatchPath). */\n readonly dispatchUrl: string;\n\n /** Reconcile the registry into Cronvello. Idempotent — safe to call on every boot/deploy. */\n sync(options?: SyncOptions): Promise<ReconcileResult>;\n /** Trigger one job immediately via Cronvello (manual run). Requires a prior `sync()`. */\n run(key: string): Promise<RunNowResult>;\n /** Framework-neutral dispatch entry — used by the adapters. */\n handle(req: DispatchRequest): Promise<DispatchResponse>;\n /** Express/Connect request handler for the dispatch endpoint. */\n expressHandler(): ExpressDispatchHandler;\n /** Next.js App Router (Route Handler) for the dispatch endpoint. */\n nextHandler(): NextRouteHandler;\n /** The registry keys, for diagnostics. */\n keys(): string[];\n}\n\nexport function defineCronvello(config: CronvelloAppConfig): CronvelloApp {\n validateConfig(config);\n\n const jobs = normalizeJobs(config.jobs);\n const dispatchPath = normalizePath(config.dispatchPath ?? DEFAULT_DISPATCH_PATH);\n const dispatchUrl = joinUrl(config.appUrl, dispatchPath);\n const defaultTimeZone = config.timeZone ?? DEFAULT_TIME_ZONE;\n\n const client = new CronvelloClient({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? CRONVELLO_DEFAULT_BASE_URL,\n ...(config.timeoutMs !== undefined ? { timeoutMs: config.timeoutMs } : {}),\n ...(config.maxRetries !== undefined ? { maxRetries: config.maxRetries } : {}),\n ...(config.fetch ? { fetch: config.fetch } : {}),\n });\n\n const dispatcher = createDispatcher({\n jobs,\n dispatchSecret: config.dispatchSecret,\n logger: config.logger,\n });\n\n const app: CronvelloApp = {\n client,\n jobs,\n appName: config.appName,\n dispatchPath,\n dispatchUrl,\n\n async sync(options?: SyncOptions): Promise<ReconcileResult> {\n const opts = options ?? {};\n // Prefer the atomic server-side reconcile (one round-trip). dryRun is only supported by\n // the local differ, so it always takes the client-side path.\n if (!opts.dryRun) {\n try {\n const res = await client.reconcileRegistry(\n buildRegistryRequest(config, dispatchUrl, defaultTimeZone, [...jobs.values()], opts),\n );\n return {\n jobId: res.job.id,\n jobName: res.job.name,\n jobCreated: res.jobCreated,\n created: res.created,\n updated: res.updated,\n unchanged: res.unchanged,\n deleted: res.deleted,\n skipped: res.skipped,\n changes: res.changes.map((c) => ({\n key: c.key,\n action: c.action,\n taskId: c.taskId,\n ...(c.changedFields ? { changedFields: c.changedFields } : {}),\n })),\n tasks: res.tasks,\n };\n } catch (e) {\n // Older server without /v1/registry → fall back to the client-side differ.\n if (!(e instanceof CronvelloApiError) || (e.status !== 404 && e.status !== 405)) throw e;\n }\n }\n return reconcile(\n {\n client,\n appName: config.appName,\n dispatchUrl,\n dispatchSecret: config.dispatchSecret,\n defaultTimeZone,\n jobs: [...jobs.values()],\n },\n opts,\n );\n },\n\n async run(key: string): Promise<RunNowResult> {\n if (!jobs.has(key)) {\n throw new CronvelloConfigError(`Unknown job '${key}'. Known: ${[...jobs.keys()].join(\", \") || \"(none)\"}`);\n }\n const containers = await client.jobs.list();\n const container = containers.find((j) => j.name === config.appName);\n if (!container) {\n throw new CronvelloConfigError(`App '${config.appName}' is not synced yet — call sync() first.`);\n }\n const tasks = await client.jobs.listTasks(container.id);\n const task = tasks.find((t) => t.name === key);\n if (!task) {\n throw new CronvelloConfigError(`Job '${key}' has no task yet — call sync() first.`);\n }\n return client.tasks.runNow(task.id);\n },\n\n handle: dispatcher.handle,\n expressHandler: () => expressHandler(app),\n nextHandler: () => nextHandler(app),\n keys: () => [...jobs.keys()],\n };\n\n return app;\n}\n\nfunction validateConfig(config: CronvelloAppConfig): void {\n if (!config) throw new CronvelloConfigError(\"defineCronvello requires a config object.\");\n if (!config.appName || !config.appName.trim()) throw new CronvelloConfigError(\"`appName` is required.\");\n if (!config.appUrl || !/^https?:\\/\\//i.test(config.appUrl)) {\n throw new CronvelloConfigError(\"`appUrl` must be an absolute http(s) URL (the public URL of THIS app).\");\n }\n if (!config.apiKey) throw new CronvelloConfigError(\"`apiKey` (crn_live_…) is required.\");\n if (!config.dispatchSecret || config.dispatchSecret.length < 16) {\n throw new CronvelloConfigError(\"`dispatchSecret` is required and must be at least 16 chars (use a random 32-byte value).\");\n }\n if (!config.jobs) throw new CronvelloConfigError(\"`jobs` is required.\");\n}\n\nfunction normalizeJobs(input: CronvelloJobsInput): Map<string, ResolvedJob> {\n const map = new Map<string, ResolvedJob>();\n const entries: Array<{ key: string; config: CronvelloJobConfig }> = Array.isArray(input)\n ? input.map(({ key, ...rest }) => ({ key, config: rest }))\n : Object.entries(input).map(([key, config]) => ({ key, config }));\n\n for (const { key, config } of entries) {\n const trimmed = (key ?? \"\").trim();\n if (!trimmed) throw new CronvelloConfigError(\"Every job needs a non-empty key.\");\n if (trimmed.length > 255) throw new CronvelloConfigError(`Job key '${trimmed}' exceeds 255 characters.`);\n if (map.has(trimmed)) throw new CronvelloConfigError(`Duplicate job key '${trimmed}'.`);\n if (!config || typeof config.handler !== \"function\") {\n throw new CronvelloConfigError(`Job '${trimmed}' is missing a handler function.`);\n }\n if (!config.schedule || !config.schedule.trim()) {\n throw new CronvelloConfigError(`Job '${trimmed}' is missing a schedule.`);\n }\n map.set(trimmed, { key: trimmed, config });\n }\n if (map.size === 0) throw new CronvelloConfigError(\"At least one job is required.\");\n return map;\n}\n\nfunction normalizePath(path: string): string {\n const trimmed = path.trim();\n return trimmed.startsWith(\"/\") ? trimmed.replace(/\\/+$/, \"\") || \"/\" : `/${trimmed.replace(/\\/+$/, \"\")}`;\n}\n\nfunction joinUrl(base: string, path: string): string {\n return `${base.replace(/\\/+$/, \"\")}${path}`;\n}\n\n/** Build the PUT /v1/registry body from the registry jobs. */\nfunction buildRegistryRequest(\n config: CronvelloAppConfig,\n dispatchUrl: string,\n defaultTimeZone: string,\n jobs: ResolvedJob[],\n opts: SyncOptions,\n): RegistryReconcileRequest {\n const tasks: RegistryTaskInput[] = jobs.map((j) => {\n const cfg = j.config;\n const task: RegistryTaskInput = {\n key: j.key,\n schedule: cfg.schedule,\n targetUrl: dispatchUrl,\n targetToken: config.dispatchSecret,\n method: \"POST\",\n timeZone: cfg.timeZone ?? defaultTimeZone,\n requestBody: JSON.stringify({ job: j.key, ...(cfg.payload ?? {}) }),\n };\n if (cfg.description !== undefined) task.description = cfg.description;\n if (cfg.urgency !== undefined) task.urgency = cfg.urgency;\n if (cfg.maxRetries !== undefined) task.maxRetries = cfg.maxRetries;\n if (cfg.executionMode !== undefined) task.executionMode = cfg.executionMode;\n if (cfg.callbackTimeoutMs !== undefined) task.callbackTimeoutMs = cfg.callbackTimeoutMs;\n if (cfg.allowConcurrentRuns !== undefined) task.allowConcurrentRuns = cfg.allowConcurrentRuns;\n if (cfg.successCriteria !== undefined) task.successCriteria = cfg.successCriteria;\n if (cfg.enabled !== undefined) task.enabled = cfg.enabled;\n return task;\n });\n return {\n appName: config.appName,\n tasks,\n prune: opts.prune ?? true,\n rotateSecret: opts.rotateSecret ?? false,\n };\n}\n","/**\n * @cronvello/sdk — code-first cron jobs for Cronvello.\n *\n * Two layers, one package:\n * • High-level registry: `defineCronvello({ jobs })` → `.sync()` + `.expressHandler()` / `.nextHandler()`.\n * Define jobs in code; the SDK reconciles them to https://api.cronvello.com and runs them.\n * • Low-level client: `new CronvelloClient({ apiKey })` → typed access to the whole `/v1` API.\n */\n\n// ── High-level registry ────────────────────────────────────────────────────\nexport { defineCronvello, type CronvelloApp } from \"./registry/define.js\";\nexport type {\n CronvelloAppConfig,\n CronvelloJobConfig,\n CronvelloJobConfigWithKey,\n CronvelloJobsInput,\n CronvelloJobContext,\n CronvelloJobHandler,\n CronvelloLogger,\n ReconcileResult,\n ReconcileTaskChange,\n SyncOptions,\n} from \"./registry/types.js\";\nexport type { DispatchRequest, DispatchResponse } from \"./registry/dispatch.js\";\n\n// ── Low-level client ───────────────────────────────────────────────────────\nexport {\n CronvelloClient,\n CRONVELLO_DEFAULT_BASE_URL,\n type CronvelloClientOptions,\n} from \"./client/client.js\";\n\n// ── Errors ─────────────────────────────────────────────────────────────────\nexport {\n CronvelloError,\n CronvelloApiError,\n CronvelloNetworkError,\n CronvelloConfigError,\n} from \"./internal/errors.js\";\n\n// ── Wire types ─────────────────────────────────────────────────────────────\nexport type {\n Urgency,\n ExecutionMode,\n HttpMethod,\n JobStatus,\n RunStatus,\n RunType,\n CallbackStatus,\n SuccessCriteria,\n PublicJob,\n PublicTask,\n PublicRun,\n JobCreateBody,\n JobUpdateBody,\n TaskCreateBody,\n TaskUpdateBody,\n RunsPage,\n TasksPage,\n RunNowResult,\n RegistryTaskInput,\n RegistryReconcileRequest,\n RegistryReconcileResponse,\n RegistryReconcileChange,\n MeResponse,\n UsageResponse,\n Pagination,\n RunsQuery,\n AccountTasksQuery,\n AccountRunsQuery,\n} from \"./internal/wire.js\";\n\n/**\n * Generate a strong random dispatch secret (hex). Convenience for setup scripts:\n * node -e \"console.log(require('@cronvello/sdk').generateDispatchSecret())\"\n */\nexport function generateDispatchSecret(bytes = 32): string {\n const buf = new Uint8Array(bytes);\n crypto.getRandomValues(buf);\n return Array.from(buf)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -117,7 +117,7 @@ var Transport = class {
|
|
|
117
117
|
this.onRequest?.({ method: opts.method, path: opts.path, status: res.status, attempt, durationMs });
|
|
118
118
|
const text = await res.text();
|
|
119
119
|
const parsed = text ? safeJson(text) : null;
|
|
120
|
-
if (res.ok) return parsed;
|
|
120
|
+
if (res.ok) return unwrapEnvelope(parsed);
|
|
121
121
|
const retryAfter = parseRetryAfter(res, parsed);
|
|
122
122
|
if (RETRYABLE_STATUS.has(res.status) && attempt < this.maxRetries) {
|
|
123
123
|
await sleep(this.backoff(attempt, retryAfter));
|
|
@@ -182,6 +182,12 @@ function safeJson(text) {
|
|
|
182
182
|
return text;
|
|
183
183
|
}
|
|
184
184
|
}
|
|
185
|
+
function unwrapEnvelope(body) {
|
|
186
|
+
if (body !== null && typeof body === "object" && "success" in body && typeof body.success === "boolean" && "data" in body) {
|
|
187
|
+
return body.data;
|
|
188
|
+
}
|
|
189
|
+
return body;
|
|
190
|
+
}
|
|
185
191
|
function extractMessage(body) {
|
|
186
192
|
if (body && typeof body === "object" && "message" in body) {
|
|
187
193
|
const m = body.message;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/internal/errors.ts","../src/internal/http.ts","../src/client/client.ts","../src/registry/verify.ts","../src/registry/dispatch.ts","../src/registry/reconcile.ts","../src/adapters/express.ts","../src/adapters/next.ts","../src/registry/define.ts","../src/index.ts"],"names":["headerValue"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Error taxonomy for the SDK. Everything thrown by the public surface is a\n * `CronvelloError` (or subclass), so callers can `catch (e) { if (e instanceof CronvelloError) … }`.\n */\n\nexport class CronvelloError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CronvelloError\";\n // Restore prototype chain for instanceof across transpilation targets.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** A non-2xx response from the Cronvello API. */\nexport class CronvelloApiError extends CronvelloError {\n /** HTTP status code. */\n readonly status: number;\n /** Machine-readable error code from the API body, when present. */\n readonly code: string | undefined;\n /** The method + path that failed, e.g. `POST /v1/jobs`. */\n readonly endpoint: string;\n /** Parsed response body (best effort). */\n readonly body: unknown;\n /** Seconds to wait before retrying, parsed from `Retry-After` / rate-limit payload (429 only). */\n readonly retryAfterSeconds: number | undefined;\n\n constructor(args: {\n status: number;\n endpoint: string;\n message: string;\n code?: string;\n body?: unknown;\n retryAfterSeconds?: number;\n }) {\n super(`[${args.status}] ${args.endpoint}: ${args.message}`);\n this.name = \"CronvelloApiError\";\n this.status = args.status;\n this.code = args.code;\n this.endpoint = args.endpoint;\n this.body = args.body;\n this.retryAfterSeconds = args.retryAfterSeconds;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n get isRateLimited(): boolean {\n return this.status === 429;\n }\n\n get isAuthError(): boolean {\n return this.status === 401 || this.status === 403;\n }\n\n get isNotFound(): boolean {\n return this.status === 404;\n }\n}\n\n/** A network/transport failure (DNS, connection reset, timeout) before any HTTP status. */\nexport class CronvelloNetworkError extends CronvelloError {\n readonly endpoint: string;\n override readonly cause: unknown;\n constructor(endpoint: string, cause: unknown) {\n super(`Network error calling ${endpoint}: ${describe(cause)}`);\n this.name = \"CronvelloNetworkError\";\n this.endpoint = endpoint;\n this.cause = cause;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** A misconfiguration caught before any network call (missing apiKey, bad URL, …). */\nexport class CronvelloConfigError extends CronvelloError {\n constructor(message: string) {\n super(message);\n this.name = \"CronvelloConfigError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nfunction describe(cause: unknown): string {\n if (cause instanceof Error) return cause.message;\n return String(cause);\n}\n","/**\n * Minimal HTTP transport over the global `fetch` (Node 18+). No axios, no node-fetch —\n * zero runtime dependencies. Adds bearer auth, JSON (de)serialization, typed error mapping,\n * bounded retries with backoff for transient failures, and optional idempotency keys.\n */\n\nimport {\n CronvelloApiError,\n CronvelloConfigError,\n CronvelloNetworkError,\n} from \"./errors.js\";\n\nexport type FetchLike = (\n input: string,\n init?: {\n method?: string;\n headers?: Record<string, string>;\n body?: string;\n signal?: AbortSignal;\n },\n) => Promise<{\n ok: boolean;\n status: number;\n headers: { get(name: string): string | null };\n text(): Promise<string>;\n}>;\n\nexport interface TransportOptions {\n baseUrl: string;\n apiKey: string;\n /** Per-request timeout in ms. Default 30_000. */\n timeoutMs?: number;\n /** Max retry attempts for 429/5xx/network errors. Default 2 (=> up to 3 tries). */\n maxRetries?: number;\n /** Override the fetch implementation (testing / custom agents). */\n fetch?: FetchLike;\n /** Extra headers sent on every request (e.g. a custom User-Agent). */\n defaultHeaders?: Record<string, string>;\n /** Telemetry hook — called once per completed attempt. */\n onRequest?: (info: { method: string; path: string; status: number; attempt: number; durationMs: number }) => void;\n}\n\nexport interface RequestOptions {\n method: string;\n path: string;\n query?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n /** Idempotency-Key header value — replays of the same key are de-duplicated server-side. */\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nconst RETRYABLE_STATUS = new Set([429, 500, 502, 503, 504]);\n\nexport class Transport {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeoutMs: number;\n private readonly maxRetries: number;\n private readonly fetchImpl: FetchLike;\n private readonly defaultHeaders: Record<string, string>;\n private readonly onRequest: TransportOptions[\"onRequest\"];\n\n constructor(opts: TransportOptions) {\n if (!opts.apiKey) throw new CronvelloConfigError(\"apiKey is required\");\n if (!opts.baseUrl) throw new CronvelloConfigError(\"baseUrl is required\");\n const resolvedFetch = opts.fetch ?? (globalThis.fetch as unknown as FetchLike | undefined);\n if (!resolvedFetch) {\n throw new CronvelloConfigError(\n \"No global fetch found. Use Node 18+ or pass a `fetch` implementation in the client options.\",\n );\n }\n this.baseUrl = opts.baseUrl.replace(/\\/+$/, \"\");\n this.apiKey = opts.apiKey;\n this.timeoutMs = opts.timeoutMs ?? 30_000;\n this.maxRetries = opts.maxRetries ?? 2;\n this.fetchImpl = resolvedFetch;\n this.defaultHeaders = opts.defaultHeaders ?? {};\n this.onRequest = opts.onRequest;\n }\n\n async request<T>(opts: RequestOptions): Promise<T> {\n const url = this.buildUrl(opts.path, opts.query);\n const endpoint = `${opts.method} ${opts.path}`;\n const headers: Record<string, string> = {\n authorization: `Bearer ${this.apiKey}`,\n accept: \"application/json\",\n ...this.defaultHeaders,\n };\n let payload: string | undefined;\n if (opts.body !== undefined) {\n headers[\"content-type\"] = \"application/json\";\n payload = JSON.stringify(opts.body);\n }\n if (opts.idempotencyKey) headers[\"idempotency-key\"] = opts.idempotencyKey;\n\n let lastError: unknown;\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n const startedAt = Date.now();\n const { signal, cancel } = this.withTimeout(opts.signal);\n try {\n const res = await this.fetchImpl(url, {\n method: opts.method,\n headers,\n ...(payload !== undefined ? { body: payload } : {}),\n signal,\n });\n cancel();\n const durationMs = Date.now() - startedAt;\n this.onRequest?.({ method: opts.method, path: opts.path, status: res.status, attempt, durationMs });\n\n const text = await res.text();\n const parsed = text ? safeJson(text) : null;\n\n if (res.ok) return parsed as T;\n\n const retryAfter = parseRetryAfter(res, parsed);\n if (RETRYABLE_STATUS.has(res.status) && attempt < this.maxRetries) {\n await sleep(this.backoff(attempt, retryAfter));\n continue;\n }\n throw new CronvelloApiError({\n status: res.status,\n endpoint,\n message: extractMessage(parsed) ?? `Request failed`,\n code: extractCode(parsed),\n body: parsed,\n ...(retryAfter !== undefined ? { retryAfterSeconds: retryAfter } : {}),\n });\n } catch (err) {\n cancel();\n if (err instanceof CronvelloApiError) throw err;\n // Network/abort error — retry if attempts remain.\n lastError = err;\n if (attempt < this.maxRetries) {\n await sleep(this.backoff(attempt));\n continue;\n }\n throw new CronvelloNetworkError(endpoint, err);\n }\n }\n // Unreachable, but satisfies the type checker.\n throw new CronvelloNetworkError(endpoint, lastError);\n }\n\n private buildUrl(path: string, query?: RequestOptions[\"query\"]): string {\n const base = `${this.baseUrl}${path.startsWith(\"/\") ? path : `/${path}`}`;\n if (!query) return base;\n const params = Object.entries(query)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`);\n return params.length ? `${base}?${params.join(\"&\")}` : base;\n }\n\n private withTimeout(external?: AbortSignal): { signal: AbortSignal; cancel: () => void } {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n const onExternalAbort = () => controller.abort();\n if (external) {\n if (external.aborted) controller.abort();\n else external.addEventListener(\"abort\", onExternalAbort, { once: true });\n }\n return {\n signal: controller.signal,\n cancel: () => {\n clearTimeout(timer);\n external?.removeEventListener(\"abort\", onExternalAbort);\n },\n };\n }\n\n private backoff(attempt: number, retryAfterSeconds?: number): number {\n if (retryAfterSeconds !== undefined) return Math.min(retryAfterSeconds * 1000, 30_000);\n // Exponential backoff with full jitter: base 300ms, capped at 5s.\n const base = Math.min(300 * 2 ** attempt, 5_000);\n return Math.floor(Math.random() * base);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction safeJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nfunction extractMessage(body: unknown): string | undefined {\n if (body && typeof body === \"object\" && \"message\" in body) {\n const m = (body as { message?: unknown }).message;\n if (typeof m === \"string\") return m;\n }\n return undefined;\n}\n\nfunction extractCode(body: unknown): string | undefined {\n if (body && typeof body === \"object\" && \"code\" in body) {\n const c = (body as { code?: unknown }).code;\n if (typeof c === \"string\") return c;\n }\n return undefined;\n}\n\nfunction parseRetryAfter(\n res: { headers: { get(name: string): string | null } },\n body: unknown,\n): number | undefined {\n const header = res.headers.get(\"retry-after\");\n if (header) {\n const n = Number(header);\n if (Number.isFinite(n)) return n;\n }\n if (body && typeof body === \"object\" && \"data\" in body) {\n const data = (body as { data?: { retryAfterSeconds?: unknown } }).data;\n if (data && typeof data.retryAfterSeconds === \"number\") return data.retryAfterSeconds;\n }\n return undefined;\n}\n","/**\n * Low-level, fully-typed client for the Cronvello public `/v1` API.\n *\n * This is the thin REST layer: one method per endpoint, request/response types straight\n * from the server contract. The high-level registry (`defineCronvello`) is built on top of\n * it. Use this directly when you need ad-hoc control beyond the registry model.\n */\n\nimport { Transport, type FetchLike } from \"../internal/http.js\";\nimport { CronvelloConfigError } from \"../internal/errors.js\";\nimport type {\n AccountRunsQuery,\n AccountTasksQuery,\n JobCreateBody,\n JobUpdateBody,\n MeResponse,\n PublicJob,\n PublicRun,\n PublicTask,\n RunNowResult,\n RegistryReconcileRequest,\n RegistryReconcileResponse,\n RunsPage,\n RunsQuery,\n TaskCreateBody,\n TasksPage,\n TaskUpdateBody,\n UsageResponse,\n} from \"../internal/wire.js\";\n\n/** The production Cronvello API. Override `baseUrl` only for self-hosting or testing. */\nexport const CRONVELLO_DEFAULT_BASE_URL = \"https://api.cronvello.com\";\n\nexport interface CronvelloClientOptions {\n /** Account API key (`crn_live_…`). Required. */\n apiKey: string;\n /** API base URL. Defaults to https://api.cronvello.com. */\n baseUrl?: string;\n /** Per-request timeout in ms (default 30_000). */\n timeoutMs?: number;\n /** Retry attempts for 429/5xx/network errors (default 2). */\n maxRetries?: number;\n /** Custom fetch implementation (default: global fetch). */\n fetch?: FetchLike;\n /** Telemetry hook for every request attempt. */\n onRequest?: (info: { method: string; path: string; status: number; attempt: number; durationMs: number }) => void;\n}\n\nexport class CronvelloClient {\n private readonly transport: Transport;\n /** The resolved base URL in use. */\n readonly baseUrl: string;\n\n /** Job container operations. */\n readonly jobs: JobsResource;\n /** Scheduled task operations. */\n readonly tasks: TasksResource;\n /** Execution-history (run) operations. */\n readonly runs: RunsResource;\n /** Account identity + usage. */\n readonly account: AccountResource;\n\n constructor(options: CronvelloClientOptions) {\n if (!options || !options.apiKey) {\n throw new CronvelloConfigError(\"CronvelloClient requires an `apiKey` (crn_live_…).\");\n }\n this.baseUrl = (options.baseUrl ?? CRONVELLO_DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.transport = new Transport({\n baseUrl: this.baseUrl,\n apiKey: options.apiKey,\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n ...(options.maxRetries !== undefined ? { maxRetries: options.maxRetries } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n ...(options.onRequest ? { onRequest: options.onRequest } : {}),\n defaultHeaders: { \"user-agent\": \"cronvello-sdk\" },\n });\n this.jobs = new JobsResource(this.transport);\n this.tasks = new TasksResource(this.transport);\n this.runs = new RunsResource(this.transport);\n this.account = new AccountResource(this.transport);\n }\n\n /**\n * Atomically reconcile a whole code registry server-side (`PUT /v1/registry`): one job\n * container + its tasks, created/updated/pruned/started in a single call. This is what\n * `defineCronvello().sync()` prefers; the high-level API builds the body for you.\n */\n reconcileRegistry(body: RegistryReconcileRequest, opts?: { idempotencyKey?: string }): Promise<RegistryReconcileResponse> {\n return this.transport.request({\n method: \"PUT\",\n path: \"/v1/registry\",\n body,\n ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}),\n });\n }\n\n /**\n * Escape hatch for endpoints not yet wrapped by a typed method (heartbeat monitors,\n * maintenance windows, DLQ, notification channels, audit log, API-key self-service …).\n * `T` is the response shape you expect.\n */\n request<T>(method: string, path: string, opts?: { query?: Record<string, string | number | boolean | undefined>; body?: unknown; idempotencyKey?: string }): Promise<T> {\n return this.transport.request<T>({\n method,\n path,\n ...(opts?.query ? { query: opts.query } : {}),\n ...(opts?.body !== undefined ? { body: opts.body } : {}),\n ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}),\n });\n }\n}\n\nclass JobsResource {\n constructor(private readonly t: Transport) {}\n\n list(): Promise<PublicJob[]> {\n return this.t.request({ method: \"GET\", path: \"/v1/jobs\" });\n }\n get(jobId: string): Promise<PublicJob> {\n return this.t.request({ method: \"GET\", path: `/v1/jobs/${enc(jobId)}` });\n }\n create(body: JobCreateBody, opts?: { idempotencyKey?: string }): Promise<PublicJob> {\n return this.t.request({ method: \"POST\", path: \"/v1/jobs\", body, ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}) });\n }\n update(jobId: string, body: JobUpdateBody): Promise<PublicJob> {\n return this.t.request({ method: \"PATCH\", path: `/v1/jobs/${enc(jobId)}`, body });\n }\n delete(jobId: string): Promise<null> {\n return this.t.request({ method: \"DELETE\", path: `/v1/jobs/${enc(jobId)}` });\n }\n start(jobId: string): Promise<PublicJob> {\n return this.t.request({ method: \"POST\", path: `/v1/jobs/${enc(jobId)}/start` });\n }\n stop(jobId: string): Promise<PublicJob> {\n return this.t.request({ method: \"POST\", path: `/v1/jobs/${enc(jobId)}/stop` });\n }\n listTasks(jobId: string): Promise<PublicTask[]> {\n return this.t.request({ method: \"GET\", path: `/v1/jobs/${enc(jobId)}/tasks` });\n }\n createTask(jobId: string, body: TaskCreateBody, opts?: { idempotencyKey?: string }): Promise<PublicTask> {\n return this.t.request({ method: \"POST\", path: `/v1/jobs/${enc(jobId)}/tasks`, body, ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}) });\n }\n}\n\nclass TasksResource {\n constructor(private readonly t: Transport) {}\n\n /** Account-wide paginated task table. */\n list(query?: AccountTasksQuery): Promise<TasksPage> {\n return this.t.request({ method: \"GET\", path: \"/v1/tasks\", ...(query ? { query: query as Record<string, string | number | boolean | undefined> } : {}) });\n }\n get(taskId: string): Promise<PublicTask> {\n return this.t.request({ method: \"GET\", path: `/v1/tasks/${enc(taskId)}` });\n }\n update(taskId: string, body: TaskUpdateBody): Promise<PublicTask> {\n return this.t.request({ method: \"PATCH\", path: `/v1/tasks/${enc(taskId)}`, body });\n }\n delete(taskId: string): Promise<null> {\n return this.t.request({ method: \"DELETE\", path: `/v1/tasks/${enc(taskId)}` });\n }\n start(taskId: string): Promise<PublicTask> {\n return this.t.request({ method: \"POST\", path: `/v1/tasks/${enc(taskId)}/start` });\n }\n stop(taskId: string): Promise<PublicTask> {\n return this.t.request({ method: \"POST\", path: `/v1/tasks/${enc(taskId)}/stop` });\n }\n /** Trigger a one-off manual execution (does not change the schedule). */\n runNow(taskId: string): Promise<RunNowResult> {\n return this.t.request({ method: \"POST\", path: `/v1/tasks/${enc(taskId)}/run` });\n }\n listRuns(taskId: string, query?: RunsQuery): Promise<RunsPage> {\n return this.t.request({ method: \"GET\", path: `/v1/tasks/${enc(taskId)}/runs`, ...(query ? { query: query as Record<string, string | number | boolean | undefined> } : {}) });\n }\n}\n\nclass RunsResource {\n constructor(private readonly t: Transport) {}\n\n /** Account-wide paginated activity feed. */\n list(query?: AccountRunsQuery): Promise<RunsPage> {\n return this.t.request({ method: \"GET\", path: \"/v1/runs\", ...(query ? { query: query as Record<string, string | number | boolean | undefined> } : {}) });\n }\n get(runId: string): Promise<PublicRun> {\n return this.t.request({ method: \"GET\", path: `/v1/runs/${enc(runId)}` });\n }\n}\n\nclass AccountResource {\n constructor(private readonly t: Transport) {}\n\n me(): Promise<MeResponse> {\n return this.t.request({ method: \"GET\", path: \"/v1/me\" });\n }\n usage(): Promise<UsageResponse> {\n return this.t.request({ method: \"GET\", path: \"/v1/usage\" });\n }\n}\n\nfunction enc(segment: string): string {\n return encodeURIComponent(segment);\n}\n","/**\n * Authentication helpers for the dispatch handler.\n *\n * Inbound (Cronvello → app): a bearer token equal to the configured `dispatchSecret`.\n * We compare it in constant time to avoid leaking the secret through timing.\n *\n * Outbound (app → Cronvello, async_callback only): we sign the callback body with\n * HMAC-SHA256 (`sha256=<hex>`), matching node-cron's `webhook-hmac.service`.\n */\n\nconst encoder = new TextEncoder();\n\n/** Parse `Authorization: Bearer <token>` (scheme is case-insensitive). Returns the token or null. */\nexport function parseBearer(headerValue: string | undefined): string | null {\n if (!headerValue) return null;\n const match = /^bearer\\s+(.+)$/i.exec(headerValue.trim());\n return match ? match[1]!.trim() : null;\n}\n\n/**\n * Constant-time string comparison. Runs in time proportional to the longer input and never\n * short-circuits, so it does not reveal where two values diverge. No `node:crypto` dependency,\n * so it works on edge runtimes too.\n */\nexport function timingSafeEqual(a: string, b: string): boolean {\n const ab = encoder.encode(a);\n const bb = encoder.encode(b);\n const len = Math.max(ab.length, bb.length);\n let diff = ab.length ^ bb.length;\n for (let i = 0; i < len; i++) {\n diff |= (ab[i] ?? 0) ^ (bb[i] ?? 0);\n }\n return diff === 0;\n}\n\n/**\n * HMAC-SHA256 signature in node-cron's wire format: `sha256=<hex>`.\n * Uses WebCrypto (`crypto.subtle`), available on Node 18+ and edge runtimes — no node:crypto.\n */\nexport async function signHmacSha256(payload: string, secret: string): Promise<string> {\n const key = await crypto.subtle.importKey(\n \"raw\",\n encoder.encode(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n const sig = await crypto.subtle.sign(\"HMAC\", key, encoder.encode(payload));\n const hex = Array.from(new Uint8Array(sig))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n return `sha256=${hex}`;\n}\n","/**\n * Framework-neutral dispatch core.\n *\n * Cronvello fires a due task by POSTing to the app's dispatch URL with\n * Authorization: Bearer <dispatchSecret>\n * body: { job: \"<registry-key>\", schedule: \"<cron>\", ...payload, _callback?: {...} }\n *\n * This module verifies the bearer, selects the job by key, runs its handler, and returns a\n * response. The Express/Next adapters are thin shells that translate their request/response\n * objects to/from the neutral shapes below.\n */\n\nimport type { CronvelloJobConfig, CronvelloJobContext, CronvelloLogger } from \"./types.js\";\nimport { parseBearer, signHmacSha256, timingSafeEqual } from \"./verify.js\";\n\nexport interface ResolvedJob {\n key: string;\n config: CronvelloJobConfig;\n}\n\nexport interface DispatcherState {\n jobs: Map<string, ResolvedJob>;\n dispatchSecret: string;\n logger: CronvelloLogger | undefined;\n}\n\nexport interface DispatchRequest {\n method: string;\n /** Value of the Authorization header, if any. */\n authorization: string | undefined;\n /** Raw request body as text. */\n rawBody: string;\n /** Lower-cased request headers. */\n headers: Record<string, string>;\n /** Abort signal for the inbound request, if the host provides one. */\n signal?: AbortSignal;\n /**\n * Optional serverless lifecycle hook (e.g. Vercel/Cloudflare `ctx.waitUntil`). When present,\n * async_callback background work is registered with it so the function stays alive until done.\n */\n waitUntil?: (promise: Promise<unknown>) => void;\n}\n\nexport interface DispatchResponse {\n status: number;\n body: Record<string, unknown>;\n}\n\n/** Async-callback metadata Cronvello injects into the request body. */\ninterface CallbackEnvelope {\n url: string;\n runId: string;\n expectedSignatureHeader?: string;\n timeoutMs?: number;\n}\n\nexport function createDispatcher(state: DispatcherState) {\n const log = state.logger;\n\n async function handle(req: DispatchRequest): Promise<DispatchResponse> {\n if (req.method.toUpperCase() !== \"POST\") {\n return resp(405, { ok: false, error: \"Method not allowed\" });\n }\n\n // 1. Authenticate: bearer must equal the dispatch secret (constant-time).\n const token = parseBearer(req.authorization);\n if (!token || !timingSafeEqual(token, state.dispatchSecret)) {\n log?.warn?.(\"[cronvello] dispatch rejected: bad or missing bearer token\");\n return resp(401, { ok: false, error: \"Unauthorized\" });\n }\n\n // 2. Parse the body.\n let body: Record<string, unknown>;\n try {\n const parsed = req.rawBody ? JSON.parse(req.rawBody) : {};\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return resp(400, { ok: false, error: \"Body must be a JSON object\" });\n }\n body = parsed as Record<string, unknown>;\n } catch {\n return resp(400, { ok: false, error: \"Invalid JSON body\" });\n }\n\n // 3. Select the job by its registry key.\n const key = typeof body[\"job\"] === \"string\" ? (body[\"job\"] as string) : null;\n if (!key) {\n return resp(400, { ok: false, error: \"Missing 'job' key in body\" });\n }\n const job = state.jobs.get(key);\n if (!job) {\n log?.warn?.(`[cronvello] dispatch for unknown job '${key}'`);\n return resp(404, { ok: false, error: `Unknown job: ${key}` });\n }\n\n const callback = readCallback(body[\"_callback\"]);\n const isAsync = callback !== null;\n const ctx: CronvelloJobContext = {\n key,\n schedule: typeof body[\"schedule\"] === \"string\" ? (body[\"schedule\"] as string) : \"\",\n payload: (job.config.payload as Record<string, unknown>) ?? {},\n body,\n headers: req.headers,\n isAsync,\n signal: req.signal,\n };\n\n // 4a. Async path — acknowledge now, run in the background, post the result back.\n if (callback) {\n const work = runAndReportCallback(job, ctx, callback, state.dispatchSecret, log);\n if (req.waitUntil) req.waitUntil(work);\n else void work; // fire-and-forget on long-running hosts\n return resp(202, { ok: true, job: key, accepted: true });\n }\n\n // 4b. Sync path — run inline; the result IS the HTTP response Cronvello records.\n const startedAt = Date.now();\n try {\n const result = await job.config.handler(ctx);\n log?.debug?.(`[cronvello] job '${key}' completed in ${Date.now() - startedAt}ms`);\n return resp(200, { ok: true, job: key, result: result ?? null });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n log?.error?.(`[cronvello] job '${key}' failed: ${message}`, { error: message });\n // Non-2xx → Cronvello records a failure and retries per the task's maxRetries.\n return resp(500, { ok: false, job: key, error: message });\n }\n }\n\n return { handle };\n}\n\nasync function runAndReportCallback(\n job: ResolvedJob,\n ctx: CronvelloJobContext,\n callback: CallbackEnvelope,\n secret: string,\n log: CronvelloLogger | undefined,\n): Promise<void> {\n const startedAt = Date.now();\n let payload: Record<string, unknown>;\n try {\n const result = await job.config.handler(ctx);\n payload = {\n runId: callback.runId,\n success: true,\n durationMs: Date.now() - startedAt,\n result: result ?? null,\n };\n } catch (err) {\n payload = {\n runId: callback.runId,\n success: false,\n durationMs: Date.now() - startedAt,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n\n try {\n const bodyStr = JSON.stringify(payload);\n const header = callback.expectedSignatureHeader || \"X-Webhook-Signature\";\n const signature = await signHmacSha256(bodyStr, secret);\n const res = await fetch(callback.url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", [header]: signature },\n body: bodyStr,\n });\n if (!res.ok) {\n log?.warn?.(`[cronvello] callback POST for job '${job.key}' returned ${res.status}`);\n }\n } catch (err) {\n log?.error?.(`[cronvello] failed to deliver callback for job '${job.key}'`, {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\nfunction readCallback(value: unknown): CallbackEnvelope | null {\n if (!value || typeof value !== \"object\") return null;\n const v = value as Record<string, unknown>;\n if (typeof v[\"url\"] !== \"string\" || typeof v[\"runId\"] !== \"string\") return null;\n return {\n url: v[\"url\"] as string,\n runId: v[\"runId\"] as string,\n ...(typeof v[\"expectedSignatureHeader\"] === \"string\"\n ? { expectedSignatureHeader: v[\"expectedSignatureHeader\"] as string }\n : {}),\n ...(typeof v[\"timeoutMs\"] === \"number\" ? { timeoutMs: v[\"timeoutMs\"] as number } : {}),\n };\n}\n\nfunction resp(status: number, body: Record<string, unknown>): DispatchResponse {\n return { status, body };\n}\n","/**\n * Idempotent reconciliation of a code registry into Cronvello.\n *\n * Model: ONE Job container per app (named `appName`), and one Task per registry job. The\n * Task's `name` IS the registry key — the stable identity used for matching, so renaming a\n * job's display/description never breaks the link. On each `sync()` we:\n * 1. ensure the Job container exists,\n * 2. diff registry tasks against the container's current tasks,\n * 3. create missing, patch changed, (optionally) delete removed,\n * 4. start newly-created tasks (Cronvello creates them DISABLED).\n *\n * The container is fully SDK-managed: only tasks inside THIS app's Job are ever touched.\n */\n\nimport type { CronvelloClient } from \"../client/client.js\";\nimport type {\n PublicJob,\n PublicTask,\n SuccessCriteria,\n TaskCreateBody,\n TaskUpdateBody,\n} from \"../internal/wire.js\";\nimport type {\n ReconcileResult,\n ReconcileTaskChange,\n SyncOptions,\n} from \"./types.js\";\nimport type { ResolvedJob } from \"./dispatch.js\";\n\nexport interface ReconcileInput {\n client: CronvelloClient;\n appName: string;\n appDescription?: string;\n dispatchUrl: string;\n dispatchSecret: string;\n defaultTimeZone: string;\n jobs: ResolvedJob[];\n}\n\nexport async function reconcile(input: ReconcileInput, options: SyncOptions = {}): Promise<ReconcileResult> {\n const { client, appName, dispatchUrl, dispatchSecret, defaultTimeZone, jobs } = input;\n const prune = options.prune ?? true;\n const dryRun = options.dryRun ?? false;\n const rotateSecret = options.rotateSecret ?? false;\n\n // 1. Ensure the Job container.\n const { job: container, created: jobCreated } = await ensureContainer(client, appName, input.appDescription, dryRun);\n const jobId = container?.id ?? \"(dry-run)\";\n\n const changes: ReconcileTaskChange[] = [];\n const existingTasks = container && !jobCreated ? await client.jobs.listTasks(container.id) : [];\n const byKey = new Map(existingTasks.map((t) => [t.name, t] as const));\n const registryKeys = new Set(jobs.map((j) => j.key));\n\n // 2. Reconcile each registry job.\n for (const job of jobs) {\n const enabled = job.config.enabled ?? true;\n const existing = byKey.get(job.key);\n const desired = buildDesiredTask({ job, dispatchUrl, dispatchSecret, defaultTimeZone });\n\n if (!enabled) {\n // Keep the task but make sure it is not scheduled.\n if (existing && existing.status === \"ACTIVE\" && !dryRun) await client.tasks.stop(existing.id);\n changes.push({ key: job.key, action: \"skipped\", taskId: existing?.id ?? null, reason: \"disabled in registry\" });\n continue;\n }\n\n if (!existing) {\n if (dryRun || !container) {\n changes.push({ key: job.key, action: \"created\", taskId: null });\n continue;\n }\n const createBody: TaskCreateBody = { ...desired, targetToken: dispatchSecret };\n const task = await client.jobs.createTask(container.id, createBody, { idempotencyKey: `cv-create-${appName}-${job.key}` });\n await client.tasks.start(task.id); // tasks are created DISABLED\n changes.push({ key: job.key, action: \"created\", taskId: task.id });\n continue;\n }\n\n // Existing task — compute the diff.\n const { patch, changedFields } = diffTask(existing, desired, { rotateSecret, dispatchSecret });\n const needsStart = existing.status === \"DISABLED\";\n\n if (changedFields.length === 0 && !needsStart) {\n changes.push({ key: job.key, action: \"unchanged\", taskId: existing.id });\n continue;\n }\n if (!dryRun) {\n if (changedFields.length > 0) await client.tasks.update(existing.id, patch);\n if (needsStart) await client.tasks.start(existing.id);\n }\n changes.push({\n key: job.key,\n action: changedFields.length > 0 ? \"updated\" : \"unchanged\",\n taskId: existing.id,\n ...(changedFields.length > 0 ? { changedFields } : {}),\n ...(needsStart ? { reason: \"re-activated\" } : {}),\n });\n }\n\n // 3. Prune tasks no longer in the registry.\n if (prune) {\n for (const task of existingTasks) {\n if (registryKeys.has(task.name)) continue;\n if (!dryRun) await client.tasks.delete(task.id);\n changes.push({ key: task.name, action: \"deleted\", taskId: task.id });\n }\n }\n\n return summarize(jobId, appName, jobCreated, changes);\n}\n\nasync function ensureContainer(\n client: CronvelloClient,\n appName: string,\n description: string | undefined,\n dryRun: boolean,\n): Promise<{ job: PublicJob | null; created: boolean }> {\n const jobs = await client.jobs.list();\n const found = jobs.find((j) => j.name === appName);\n if (found) return { job: found, created: false };\n if (dryRun) return { job: null, created: true };\n const created = await client.jobs.create(\n { name: appName, ...(description ? { description } : {}) },\n { idempotencyKey: `cv-job-${appName}` },\n );\n return { job: created, created: true };\n}\n\nfunction buildDesiredTask(args: {\n job: ResolvedJob;\n dispatchUrl: string;\n dispatchSecret: string;\n defaultTimeZone: string;\n}): TaskCreateBody {\n const { job, dispatchUrl, defaultTimeZone } = args;\n const cfg = job.config;\n const requestBody = JSON.stringify({ job: job.key, ...(cfg.payload ?? {}) });\n const body: TaskCreateBody = {\n name: job.key,\n schedule: cfg.schedule,\n timeZone: cfg.timeZone ?? defaultTimeZone,\n targetUrl: dispatchUrl,\n method: \"POST\",\n requestBody,\n };\n if (cfg.description !== undefined) body.description = cfg.description;\n if (cfg.urgency !== undefined) body.urgency = cfg.urgency;\n if (cfg.maxRetries !== undefined) body.maxRetries = cfg.maxRetries;\n if (cfg.executionMode !== undefined) body.executionMode = cfg.executionMode;\n if (cfg.callbackTimeoutMs !== undefined) body.callbackTimeoutMs = cfg.callbackTimeoutMs;\n if (cfg.allowConcurrentRuns !== undefined) body.allowConcurrentRuns = cfg.allowConcurrentRuns;\n if (cfg.successCriteria !== undefined) body.successCriteria = cfg.successCriteria;\n return body;\n}\n\nfunction diffTask(\n existing: PublicTask,\n desired: TaskCreateBody,\n opts: { rotateSecret: boolean; dispatchSecret: string },\n): { patch: TaskUpdateBody; changedFields: string[] } {\n const patch: TaskUpdateBody = {};\n const changed: string[] = [];\n\n const set = <K extends keyof TaskUpdateBody>(field: K, value: TaskUpdateBody[K]) => {\n patch[field] = value;\n changed.push(field);\n };\n\n if (existing.schedule !== desired.schedule) set(\"schedule\", desired.schedule);\n if (desired.timeZone !== undefined && existing.timeZone !== desired.timeZone) set(\"timeZone\", desired.timeZone);\n if (existing.targetUrl !== desired.targetUrl) set(\"targetUrl\", desired.targetUrl);\n if (existing.method !== (desired.method ?? \"POST\")) set(\"method\", desired.method ?? \"POST\");\n if (!jsonEqual(existing.requestBody, desired.requestBody)) set(\"requestBody\", desired.requestBody ?? null);\n\n // Optional fields: only reconcile when the registry explicitly sets them.\n if (desired.description !== undefined && (existing.description ?? undefined) !== desired.description) {\n set(\"description\", desired.description);\n }\n if (desired.urgency !== undefined && existing.urgency !== desired.urgency) set(\"urgency\", desired.urgency);\n if (desired.maxRetries !== undefined && existing.maxRetries !== desired.maxRetries) set(\"maxRetries\", desired.maxRetries);\n if (desired.executionMode !== undefined && existing.executionMode !== desired.executionMode) {\n set(\"executionMode\", desired.executionMode);\n }\n if (desired.callbackTimeoutMs !== undefined && existing.callbackTimeoutMs !== desired.callbackTimeoutMs) {\n set(\"callbackTimeoutMs\", desired.callbackTimeoutMs);\n }\n if (desired.allowConcurrentRuns !== undefined && existing.allowConcurrentRuns !== desired.allowConcurrentRuns) {\n set(\"allowConcurrentRuns\", desired.allowConcurrentRuns);\n }\n if (desired.successCriteria !== undefined && !deepEqual(existing.successCriteria, desired.successCriteria)) {\n set(\"successCriteria\", desired.successCriteria as SuccessCriteria);\n }\n\n // The dispatch secret (targetToken) can't be read back — only (re)set it on demand or when absent.\n if (opts.rotateSecret || !existing.hasTargetToken) set(\"targetToken\", opts.dispatchSecret);\n\n return { patch, changedFields: changed };\n}\n\nfunction jsonEqual(a: string | null, b: string | null | undefined): boolean {\n if (a == null || b == null) return a == b;\n try {\n return deepEqual(JSON.parse(a), JSON.parse(b));\n } catch {\n return a === b;\n }\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return a === b;\n if (typeof a !== \"object\" || typeof b !== \"object\") return false;\n const ak = Object.keys(a as object).sort();\n const bk = Object.keys(b as object).sort();\n if (ak.length !== bk.length) return false;\n for (let i = 0; i < ak.length; i++) {\n if (ak[i] !== bk[i]) return false;\n if (!deepEqual((a as Record<string, unknown>)[ak[i]!], (b as Record<string, unknown>)[bk[i]!])) return false;\n }\n return true;\n}\n\nfunction summarize(\n jobId: string,\n jobName: string,\n jobCreated: boolean,\n changes: ReconcileTaskChange[],\n): ReconcileResult {\n const count = (a: ReconcileTaskChange[\"action\"]) => changes.filter((c) => c.action === a).length;\n return {\n jobId,\n jobName,\n jobCreated,\n created: count(\"created\"),\n updated: count(\"updated\"),\n unchanged: count(\"unchanged\"),\n deleted: count(\"deleted\"),\n skipped: count(\"skipped\"),\n changes,\n };\n}\n","/**\n * Express adapter. Zero dependency on `express` itself — the request/response are typed\n * structurally, so this works with Express 4/5 and any Connect-style middleware stack.\n *\n * import { defineCronvello } from \"@cronvello/sdk\";\n * import { expressHandler } from \"@cronvello/sdk/express\";\n *\n * app.post(\"/cronvello/dispatch\", express.json(), expressHandler(cronvello));\n * // …or simply: app.post(cronvello.dispatchPath, express.json(), cronvello.expressHandler());\n *\n * Works with or without `express.json()` — if the body isn't pre-parsed, the raw stream is read.\n */\n\nimport type { DispatchHandler } from \"../registry/dispatch-handler.js\";\n\nexport interface ExpressRequestLike {\n method?: string;\n headers: Record<string, string | string[] | undefined>;\n body?: unknown;\n on?(event: string, listener: (chunk?: unknown) => void): void;\n}\n\nexport interface ExpressResponseLike {\n status(code: number): ExpressResponseLike;\n json(body: unknown): void;\n}\n\nexport type ExpressDispatchHandler = (req: ExpressRequestLike, res: ExpressResponseLike) => Promise<void>;\n\nexport function expressHandler(app: DispatchHandler): ExpressDispatchHandler {\n return async (req, res) => {\n const rawBody = await readBody(req);\n const result = await app.handle({\n method: req.method ?? \"POST\",\n authorization: headerValue(req.headers[\"authorization\"]),\n rawBody,\n headers: flattenHeaders(req.headers),\n });\n res.status(result.status).json(result.body);\n };\n}\n\nasync function readBody(req: ExpressRequestLike): Promise<string> {\n const body = req.body;\n if (body !== undefined && body !== null) {\n if (typeof body === \"string\") return body;\n if (typeof Buffer !== \"undefined\" && Buffer.isBuffer(body)) return body.toString(\"utf8\");\n if (typeof body === \"object\") return JSON.stringify(body);\n }\n if (typeof req.on !== \"function\") return \"\";\n return new Promise<string>((resolve) => {\n let data = \"\";\n req.on!(\"data\", (chunk?: unknown) => {\n data += typeof chunk === \"string\" ? chunk : String(chunk ?? \"\");\n });\n req.on!(\"end\", () => resolve(data));\n req.on!(\"error\", () => resolve(data));\n });\n}\n\nfunction headerValue(value: string | string[] | undefined): string | undefined {\n if (Array.isArray(value)) return value[0];\n return value;\n}\n\nfunction flattenHeaders(headers: Record<string, string | string[] | undefined>): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(headers)) {\n if (v === undefined) continue;\n out[k.toLowerCase()] = Array.isArray(v) ? v.join(\", \") : v;\n }\n return out;\n}\n","/**\n * Next.js App Router adapter (Route Handlers). Zero dependency on `next` — uses the Web\n * Fetch `Request`/`Response` globals (Node 18+ and the edge runtime).\n *\n * // app/cronvello/dispatch/route.ts\n * import { cronvello } from \"@/lib/cronvello\";\n * import { nextHandler } from \"@cronvello/sdk/next\";\n * export const POST = nextHandler(cronvello);\n *\n * On serverless hosts, prefer the default sync execution mode so the work finishes within the\n * request. async_callback needs a host that keeps running after the response (see docs).\n */\n\nimport type { DispatchHandler } from \"../registry/dispatch-handler.js\";\n\n/** Structural subset of the Web Fetch `Request` we rely on. */\nexport interface FetchRequestLike {\n method: string;\n headers: {\n get(name: string): string | null;\n forEach?(cb: (value: string, key: string) => void): void;\n };\n text(): Promise<string>;\n}\n\nexport type NextRouteHandler = (req: FetchRequestLike) => Promise<Response>;\n\nexport function nextHandler(app: DispatchHandler): NextRouteHandler {\n return async (req) => {\n const rawBody = await req.text();\n const headers: Record<string, string> = {};\n req.headers.forEach?.((value, key) => {\n headers[key.toLowerCase()] = value;\n });\n const result = await app.handle({\n method: req.method,\n authorization: req.headers.get(\"authorization\") ?? undefined,\n rawBody,\n headers,\n });\n return new Response(JSON.stringify(result.body), {\n status: result.status,\n headers: { \"content-type\": \"application/json\" },\n });\n };\n}\n","/**\n * `defineCronvello` — the high-level, code-first entry point.\n *\n * export const cronvello = defineCronvello({\n * appName: \"my-app\",\n * appUrl: process.env.APP_URL!,\n * apiKey: process.env.CRONVELLO_API_KEY!,\n * dispatchSecret: process.env.CRONVELLO_DISPATCH_SECRET!,\n * jobs: {\n * \"send-daily-digest\": { schedule: \"0 8 * * *\", handler: async () => { … } },\n * \"cleanup-temp\": { schedule: \"*\\/15 * * * *\", handler: async () => { … } },\n * },\n * });\n *\n * await cronvello.sync(); // reconcile the registry to Cronvello (idempotent)\n * app.post(cronvello.dispatchPath, express.json(), cronvello.expressHandler());\n */\n\nimport { CronvelloClient, CRONVELLO_DEFAULT_BASE_URL } from \"../client/client.js\";\nimport { CronvelloApiError, CronvelloConfigError } from \"../internal/errors.js\";\nimport type { RegistryReconcileRequest, RegistryTaskInput, RunNowResult } from \"../internal/wire.js\";\nimport { createDispatcher, type DispatchRequest, type DispatchResponse, type ResolvedJob } from \"./dispatch.js\";\nimport { reconcile } from \"./reconcile.js\";\nimport { expressHandler, type ExpressDispatchHandler } from \"../adapters/express.js\";\nimport { nextHandler, type NextRouteHandler } from \"../adapters/next.js\";\nimport type {\n CronvelloAppConfig,\n CronvelloJobConfig,\n CronvelloJobsInput,\n ReconcileResult,\n SyncOptions,\n} from \"./types.js\";\n\nconst DEFAULT_DISPATCH_PATH = \"/cronvello/dispatch\";\nconst DEFAULT_TIME_ZONE = \"Europe/Berlin\";\n\nexport interface CronvelloApp {\n /** The underlying low-level client for ad-hoc `/v1` calls. */\n readonly client: CronvelloClient;\n /** Resolved jobs, keyed by their stable registry key. */\n readonly jobs: ReadonlyMap<string, ResolvedJob>;\n /** The app identity / Job-container name. */\n readonly appName: string;\n /** Path the dispatch handler should be mounted at (e.g. \"/cronvello/dispatch\"). */\n readonly dispatchPath: string;\n /** Absolute URL Cronvello calls back (appUrl + dispatchPath). */\n readonly dispatchUrl: string;\n\n /** Reconcile the registry into Cronvello. Idempotent — safe to call on every boot/deploy. */\n sync(options?: SyncOptions): Promise<ReconcileResult>;\n /** Trigger one job immediately via Cronvello (manual run). Requires a prior `sync()`. */\n run(key: string): Promise<RunNowResult>;\n /** Framework-neutral dispatch entry — used by the adapters. */\n handle(req: DispatchRequest): Promise<DispatchResponse>;\n /** Express/Connect request handler for the dispatch endpoint. */\n expressHandler(): ExpressDispatchHandler;\n /** Next.js App Router (Route Handler) for the dispatch endpoint. */\n nextHandler(): NextRouteHandler;\n /** The registry keys, for diagnostics. */\n keys(): string[];\n}\n\nexport function defineCronvello(config: CronvelloAppConfig): CronvelloApp {\n validateConfig(config);\n\n const jobs = normalizeJobs(config.jobs);\n const dispatchPath = normalizePath(config.dispatchPath ?? DEFAULT_DISPATCH_PATH);\n const dispatchUrl = joinUrl(config.appUrl, dispatchPath);\n const defaultTimeZone = config.timeZone ?? DEFAULT_TIME_ZONE;\n\n const client = new CronvelloClient({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? CRONVELLO_DEFAULT_BASE_URL,\n ...(config.timeoutMs !== undefined ? { timeoutMs: config.timeoutMs } : {}),\n ...(config.maxRetries !== undefined ? { maxRetries: config.maxRetries } : {}),\n ...(config.fetch ? { fetch: config.fetch } : {}),\n });\n\n const dispatcher = createDispatcher({\n jobs,\n dispatchSecret: config.dispatchSecret,\n logger: config.logger,\n });\n\n const app: CronvelloApp = {\n client,\n jobs,\n appName: config.appName,\n dispatchPath,\n dispatchUrl,\n\n async sync(options?: SyncOptions): Promise<ReconcileResult> {\n const opts = options ?? {};\n // Prefer the atomic server-side reconcile (one round-trip). dryRun is only supported by\n // the local differ, so it always takes the client-side path.\n if (!opts.dryRun) {\n try {\n const res = await client.reconcileRegistry(\n buildRegistryRequest(config, dispatchUrl, defaultTimeZone, [...jobs.values()], opts),\n );\n return {\n jobId: res.job.id,\n jobName: res.job.name,\n jobCreated: res.jobCreated,\n created: res.created,\n updated: res.updated,\n unchanged: res.unchanged,\n deleted: res.deleted,\n skipped: res.skipped,\n changes: res.changes.map((c) => ({\n key: c.key,\n action: c.action,\n taskId: c.taskId,\n ...(c.changedFields ? { changedFields: c.changedFields } : {}),\n })),\n tasks: res.tasks,\n };\n } catch (e) {\n // Older server without /v1/registry → fall back to the client-side differ.\n if (!(e instanceof CronvelloApiError) || (e.status !== 404 && e.status !== 405)) throw e;\n }\n }\n return reconcile(\n {\n client,\n appName: config.appName,\n dispatchUrl,\n dispatchSecret: config.dispatchSecret,\n defaultTimeZone,\n jobs: [...jobs.values()],\n },\n opts,\n );\n },\n\n async run(key: string): Promise<RunNowResult> {\n if (!jobs.has(key)) {\n throw new CronvelloConfigError(`Unknown job '${key}'. Known: ${[...jobs.keys()].join(\", \") || \"(none)\"}`);\n }\n const containers = await client.jobs.list();\n const container = containers.find((j) => j.name === config.appName);\n if (!container) {\n throw new CronvelloConfigError(`App '${config.appName}' is not synced yet — call sync() first.`);\n }\n const tasks = await client.jobs.listTasks(container.id);\n const task = tasks.find((t) => t.name === key);\n if (!task) {\n throw new CronvelloConfigError(`Job '${key}' has no task yet — call sync() first.`);\n }\n return client.tasks.runNow(task.id);\n },\n\n handle: dispatcher.handle,\n expressHandler: () => expressHandler(app),\n nextHandler: () => nextHandler(app),\n keys: () => [...jobs.keys()],\n };\n\n return app;\n}\n\nfunction validateConfig(config: CronvelloAppConfig): void {\n if (!config) throw new CronvelloConfigError(\"defineCronvello requires a config object.\");\n if (!config.appName || !config.appName.trim()) throw new CronvelloConfigError(\"`appName` is required.\");\n if (!config.appUrl || !/^https?:\\/\\//i.test(config.appUrl)) {\n throw new CronvelloConfigError(\"`appUrl` must be an absolute http(s) URL (the public URL of THIS app).\");\n }\n if (!config.apiKey) throw new CronvelloConfigError(\"`apiKey` (crn_live_…) is required.\");\n if (!config.dispatchSecret || config.dispatchSecret.length < 16) {\n throw new CronvelloConfigError(\"`dispatchSecret` is required and must be at least 16 chars (use a random 32-byte value).\");\n }\n if (!config.jobs) throw new CronvelloConfigError(\"`jobs` is required.\");\n}\n\nfunction normalizeJobs(input: CronvelloJobsInput): Map<string, ResolvedJob> {\n const map = new Map<string, ResolvedJob>();\n const entries: Array<{ key: string; config: CronvelloJobConfig }> = Array.isArray(input)\n ? input.map(({ key, ...rest }) => ({ key, config: rest }))\n : Object.entries(input).map(([key, config]) => ({ key, config }));\n\n for (const { key, config } of entries) {\n const trimmed = (key ?? \"\").trim();\n if (!trimmed) throw new CronvelloConfigError(\"Every job needs a non-empty key.\");\n if (trimmed.length > 255) throw new CronvelloConfigError(`Job key '${trimmed}' exceeds 255 characters.`);\n if (map.has(trimmed)) throw new CronvelloConfigError(`Duplicate job key '${trimmed}'.`);\n if (!config || typeof config.handler !== \"function\") {\n throw new CronvelloConfigError(`Job '${trimmed}' is missing a handler function.`);\n }\n if (!config.schedule || !config.schedule.trim()) {\n throw new CronvelloConfigError(`Job '${trimmed}' is missing a schedule.`);\n }\n map.set(trimmed, { key: trimmed, config });\n }\n if (map.size === 0) throw new CronvelloConfigError(\"At least one job is required.\");\n return map;\n}\n\nfunction normalizePath(path: string): string {\n const trimmed = path.trim();\n return trimmed.startsWith(\"/\") ? trimmed.replace(/\\/+$/, \"\") || \"/\" : `/${trimmed.replace(/\\/+$/, \"\")}`;\n}\n\nfunction joinUrl(base: string, path: string): string {\n return `${base.replace(/\\/+$/, \"\")}${path}`;\n}\n\n/** Build the PUT /v1/registry body from the registry jobs. */\nfunction buildRegistryRequest(\n config: CronvelloAppConfig,\n dispatchUrl: string,\n defaultTimeZone: string,\n jobs: ResolvedJob[],\n opts: SyncOptions,\n): RegistryReconcileRequest {\n const tasks: RegistryTaskInput[] = jobs.map((j) => {\n const cfg = j.config;\n const task: RegistryTaskInput = {\n key: j.key,\n schedule: cfg.schedule,\n targetUrl: dispatchUrl,\n targetToken: config.dispatchSecret,\n method: \"POST\",\n timeZone: cfg.timeZone ?? defaultTimeZone,\n requestBody: JSON.stringify({ job: j.key, ...(cfg.payload ?? {}) }),\n };\n if (cfg.description !== undefined) task.description = cfg.description;\n if (cfg.urgency !== undefined) task.urgency = cfg.urgency;\n if (cfg.maxRetries !== undefined) task.maxRetries = cfg.maxRetries;\n if (cfg.executionMode !== undefined) task.executionMode = cfg.executionMode;\n if (cfg.callbackTimeoutMs !== undefined) task.callbackTimeoutMs = cfg.callbackTimeoutMs;\n if (cfg.allowConcurrentRuns !== undefined) task.allowConcurrentRuns = cfg.allowConcurrentRuns;\n if (cfg.successCriteria !== undefined) task.successCriteria = cfg.successCriteria;\n if (cfg.enabled !== undefined) task.enabled = cfg.enabled;\n return task;\n });\n return {\n appName: config.appName,\n tasks,\n prune: opts.prune ?? true,\n rotateSecret: opts.rotateSecret ?? false,\n };\n}\n","/**\n * @cronvello/sdk — code-first cron jobs for Cronvello.\n *\n * Two layers, one package:\n * • High-level registry: `defineCronvello({ jobs })` → `.sync()` + `.expressHandler()` / `.nextHandler()`.\n * Define jobs in code; the SDK reconciles them to https://api.cronvello.com and runs them.\n * • Low-level client: `new CronvelloClient({ apiKey })` → typed access to the whole `/v1` API.\n */\n\n// ── High-level registry ────────────────────────────────────────────────────\nexport { defineCronvello, type CronvelloApp } from \"./registry/define.js\";\nexport type {\n CronvelloAppConfig,\n CronvelloJobConfig,\n CronvelloJobConfigWithKey,\n CronvelloJobsInput,\n CronvelloJobContext,\n CronvelloJobHandler,\n CronvelloLogger,\n ReconcileResult,\n ReconcileTaskChange,\n SyncOptions,\n} from \"./registry/types.js\";\nexport type { DispatchRequest, DispatchResponse } from \"./registry/dispatch.js\";\n\n// ── Low-level client ───────────────────────────────────────────────────────\nexport {\n CronvelloClient,\n CRONVELLO_DEFAULT_BASE_URL,\n type CronvelloClientOptions,\n} from \"./client/client.js\";\n\n// ── Errors ─────────────────────────────────────────────────────────────────\nexport {\n CronvelloError,\n CronvelloApiError,\n CronvelloNetworkError,\n CronvelloConfigError,\n} from \"./internal/errors.js\";\n\n// ── Wire types ─────────────────────────────────────────────────────────────\nexport type {\n Urgency,\n ExecutionMode,\n HttpMethod,\n JobStatus,\n RunStatus,\n RunType,\n CallbackStatus,\n SuccessCriteria,\n PublicJob,\n PublicTask,\n PublicRun,\n JobCreateBody,\n JobUpdateBody,\n TaskCreateBody,\n TaskUpdateBody,\n RunsPage,\n TasksPage,\n RunNowResult,\n RegistryTaskInput,\n RegistryReconcileRequest,\n RegistryReconcileResponse,\n RegistryReconcileChange,\n MeResponse,\n UsageResponse,\n Pagination,\n RunsQuery,\n AccountTasksQuery,\n AccountRunsQuery,\n} from \"./internal/wire.js\";\n\n/**\n * Generate a strong random dispatch secret (hex). Convenience for setup scripts:\n * node -e \"console.log(require('@cronvello/sdk').generateDispatchSecret())\"\n */\nexport function generateDispatchSecret(bytes = 32): string {\n const buf = new Uint8Array(bytes);\n crypto.getRandomValues(buf);\n return Array.from(buf)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/internal/errors.ts","../src/internal/http.ts","../src/client/client.ts","../src/registry/verify.ts","../src/registry/dispatch.ts","../src/registry/reconcile.ts","../src/adapters/express.ts","../src/adapters/next.ts","../src/registry/define.ts","../src/index.ts"],"names":["headerValue"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Error taxonomy for the SDK. Everything thrown by the public surface is a\n * `CronvelloError` (or subclass), so callers can `catch (e) { if (e instanceof CronvelloError) … }`.\n */\n\nexport class CronvelloError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CronvelloError\";\n // Restore prototype chain for instanceof across transpilation targets.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** A non-2xx response from the Cronvello API. */\nexport class CronvelloApiError extends CronvelloError {\n /** HTTP status code. */\n readonly status: number;\n /** Machine-readable error code from the API body, when present. */\n readonly code: string | undefined;\n /** The method + path that failed, e.g. `POST /v1/jobs`. */\n readonly endpoint: string;\n /** Parsed response body (best effort). */\n readonly body: unknown;\n /** Seconds to wait before retrying, parsed from `Retry-After` / rate-limit payload (429 only). */\n readonly retryAfterSeconds: number | undefined;\n\n constructor(args: {\n status: number;\n endpoint: string;\n message: string;\n code?: string;\n body?: unknown;\n retryAfterSeconds?: number;\n }) {\n super(`[${args.status}] ${args.endpoint}: ${args.message}`);\n this.name = \"CronvelloApiError\";\n this.status = args.status;\n this.code = args.code;\n this.endpoint = args.endpoint;\n this.body = args.body;\n this.retryAfterSeconds = args.retryAfterSeconds;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n get isRateLimited(): boolean {\n return this.status === 429;\n }\n\n get isAuthError(): boolean {\n return this.status === 401 || this.status === 403;\n }\n\n get isNotFound(): boolean {\n return this.status === 404;\n }\n}\n\n/** A network/transport failure (DNS, connection reset, timeout) before any HTTP status. */\nexport class CronvelloNetworkError extends CronvelloError {\n readonly endpoint: string;\n override readonly cause: unknown;\n constructor(endpoint: string, cause: unknown) {\n super(`Network error calling ${endpoint}: ${describe(cause)}`);\n this.name = \"CronvelloNetworkError\";\n this.endpoint = endpoint;\n this.cause = cause;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** A misconfiguration caught before any network call (missing apiKey, bad URL, …). */\nexport class CronvelloConfigError extends CronvelloError {\n constructor(message: string) {\n super(message);\n this.name = \"CronvelloConfigError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nfunction describe(cause: unknown): string {\n if (cause instanceof Error) return cause.message;\n return String(cause);\n}\n","/**\n * Minimal HTTP transport over the global `fetch` (Node 18+). No axios, no node-fetch —\n * zero runtime dependencies. Adds bearer auth, JSON (de)serialization, typed error mapping,\n * bounded retries with backoff for transient failures, and optional idempotency keys.\n */\n\nimport {\n CronvelloApiError,\n CronvelloConfigError,\n CronvelloNetworkError,\n} from \"./errors.js\";\n\nexport type FetchLike = (\n input: string,\n init?: {\n method?: string;\n headers?: Record<string, string>;\n body?: string;\n signal?: AbortSignal;\n },\n) => Promise<{\n ok: boolean;\n status: number;\n headers: { get(name: string): string | null };\n text(): Promise<string>;\n}>;\n\nexport interface TransportOptions {\n baseUrl: string;\n apiKey: string;\n /** Per-request timeout in ms. Default 30_000. */\n timeoutMs?: number;\n /** Max retry attempts for 429/5xx/network errors. Default 2 (=> up to 3 tries). */\n maxRetries?: number;\n /** Override the fetch implementation (testing / custom agents). */\n fetch?: FetchLike;\n /** Extra headers sent on every request (e.g. a custom User-Agent). */\n defaultHeaders?: Record<string, string>;\n /** Telemetry hook — called once per completed attempt. */\n onRequest?: (info: { method: string; path: string; status: number; attempt: number; durationMs: number }) => void;\n}\n\nexport interface RequestOptions {\n method: string;\n path: string;\n query?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n /** Idempotency-Key header value — replays of the same key are de-duplicated server-side. */\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nconst RETRYABLE_STATUS = new Set([429, 500, 502, 503, 504]);\n\nexport class Transport {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeoutMs: number;\n private readonly maxRetries: number;\n private readonly fetchImpl: FetchLike;\n private readonly defaultHeaders: Record<string, string>;\n private readonly onRequest: TransportOptions[\"onRequest\"];\n\n constructor(opts: TransportOptions) {\n if (!opts.apiKey) throw new CronvelloConfigError(\"apiKey is required\");\n if (!opts.baseUrl) throw new CronvelloConfigError(\"baseUrl is required\");\n const resolvedFetch = opts.fetch ?? (globalThis.fetch as unknown as FetchLike | undefined);\n if (!resolvedFetch) {\n throw new CronvelloConfigError(\n \"No global fetch found. Use Node 18+ or pass a `fetch` implementation in the client options.\",\n );\n }\n this.baseUrl = opts.baseUrl.replace(/\\/+$/, \"\");\n this.apiKey = opts.apiKey;\n this.timeoutMs = opts.timeoutMs ?? 30_000;\n this.maxRetries = opts.maxRetries ?? 2;\n this.fetchImpl = resolvedFetch;\n this.defaultHeaders = opts.defaultHeaders ?? {};\n this.onRequest = opts.onRequest;\n }\n\n async request<T>(opts: RequestOptions): Promise<T> {\n const url = this.buildUrl(opts.path, opts.query);\n const endpoint = `${opts.method} ${opts.path}`;\n const headers: Record<string, string> = {\n authorization: `Bearer ${this.apiKey}`,\n accept: \"application/json\",\n ...this.defaultHeaders,\n };\n let payload: string | undefined;\n if (opts.body !== undefined) {\n headers[\"content-type\"] = \"application/json\";\n payload = JSON.stringify(opts.body);\n }\n if (opts.idempotencyKey) headers[\"idempotency-key\"] = opts.idempotencyKey;\n\n let lastError: unknown;\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n const startedAt = Date.now();\n const { signal, cancel } = this.withTimeout(opts.signal);\n try {\n const res = await this.fetchImpl(url, {\n method: opts.method,\n headers,\n ...(payload !== undefined ? { body: payload } : {}),\n signal,\n });\n cancel();\n const durationMs = Date.now() - startedAt;\n this.onRequest?.({ method: opts.method, path: opts.path, status: res.status, attempt, durationMs });\n\n const text = await res.text();\n const parsed = text ? safeJson(text) : null;\n\n if (res.ok) return unwrapEnvelope(parsed) as T;\n\n const retryAfter = parseRetryAfter(res, parsed);\n if (RETRYABLE_STATUS.has(res.status) && attempt < this.maxRetries) {\n await sleep(this.backoff(attempt, retryAfter));\n continue;\n }\n throw new CronvelloApiError({\n status: res.status,\n endpoint,\n message: extractMessage(parsed) ?? `Request failed`,\n code: extractCode(parsed),\n body: parsed,\n ...(retryAfter !== undefined ? { retryAfterSeconds: retryAfter } : {}),\n });\n } catch (err) {\n cancel();\n if (err instanceof CronvelloApiError) throw err;\n // Network/abort error — retry if attempts remain.\n lastError = err;\n if (attempt < this.maxRetries) {\n await sleep(this.backoff(attempt));\n continue;\n }\n throw new CronvelloNetworkError(endpoint, err);\n }\n }\n // Unreachable, but satisfies the type checker.\n throw new CronvelloNetworkError(endpoint, lastError);\n }\n\n private buildUrl(path: string, query?: RequestOptions[\"query\"]): string {\n const base = `${this.baseUrl}${path.startsWith(\"/\") ? path : `/${path}`}`;\n if (!query) return base;\n const params = Object.entries(query)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`);\n return params.length ? `${base}?${params.join(\"&\")}` : base;\n }\n\n private withTimeout(external?: AbortSignal): { signal: AbortSignal; cancel: () => void } {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n const onExternalAbort = () => controller.abort();\n if (external) {\n if (external.aborted) controller.abort();\n else external.addEventListener(\"abort\", onExternalAbort, { once: true });\n }\n return {\n signal: controller.signal,\n cancel: () => {\n clearTimeout(timer);\n external?.removeEventListener(\"abort\", onExternalAbort);\n },\n };\n }\n\n private backoff(attempt: number, retryAfterSeconds?: number): number {\n if (retryAfterSeconds !== undefined) return Math.min(retryAfterSeconds * 1000, 30_000);\n // Exponential backoff with full jitter: base 300ms, capped at 5s.\n const base = Math.min(300 * 2 ** attempt, 5_000);\n return Math.floor(Math.random() * base);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction safeJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\n/**\n * The Cronvello server wraps every successful `/v1` response in a `{ success, message, data }`\n * envelope, while the typed client methods are declared in terms of the inner payload. Unwrap\n * it here — centrally — so every resource method (and the high-level `sync()`) sees the data it\n * expects. Bodies that aren't enveloped (no boolean `success` + `data`) pass through unchanged,\n * so non-enveloped or future endpoints keep working.\n */\nfunction unwrapEnvelope(body: unknown): unknown {\n if (\n body !== null &&\n typeof body === \"object\" &&\n \"success\" in body &&\n typeof (body as { success: unknown }).success === \"boolean\" &&\n \"data\" in body\n ) {\n return (body as { data: unknown }).data;\n }\n return body;\n}\n\nfunction extractMessage(body: unknown): string | undefined {\n if (body && typeof body === \"object\" && \"message\" in body) {\n const m = (body as { message?: unknown }).message;\n if (typeof m === \"string\") return m;\n }\n return undefined;\n}\n\nfunction extractCode(body: unknown): string | undefined {\n if (body && typeof body === \"object\" && \"code\" in body) {\n const c = (body as { code?: unknown }).code;\n if (typeof c === \"string\") return c;\n }\n return undefined;\n}\n\nfunction parseRetryAfter(\n res: { headers: { get(name: string): string | null } },\n body: unknown,\n): number | undefined {\n const header = res.headers.get(\"retry-after\");\n if (header) {\n const n = Number(header);\n if (Number.isFinite(n)) return n;\n }\n if (body && typeof body === \"object\" && \"data\" in body) {\n const data = (body as { data?: { retryAfterSeconds?: unknown } }).data;\n if (data && typeof data.retryAfterSeconds === \"number\") return data.retryAfterSeconds;\n }\n return undefined;\n}\n","/**\n * Low-level, fully-typed client for the Cronvello public `/v1` API.\n *\n * This is the thin REST layer: one method per endpoint, request/response types straight\n * from the server contract. The high-level registry (`defineCronvello`) is built on top of\n * it. Use this directly when you need ad-hoc control beyond the registry model.\n */\n\nimport { Transport, type FetchLike } from \"../internal/http.js\";\nimport { CronvelloConfigError } from \"../internal/errors.js\";\nimport type {\n AccountRunsQuery,\n AccountTasksQuery,\n JobCreateBody,\n JobUpdateBody,\n MeResponse,\n PublicJob,\n PublicRun,\n PublicTask,\n RunNowResult,\n RegistryReconcileRequest,\n RegistryReconcileResponse,\n RunsPage,\n RunsQuery,\n TaskCreateBody,\n TasksPage,\n TaskUpdateBody,\n UsageResponse,\n} from \"../internal/wire.js\";\n\n/** The production Cronvello API. Override `baseUrl` only for self-hosting or testing. */\nexport const CRONVELLO_DEFAULT_BASE_URL = \"https://api.cronvello.com\";\n\nexport interface CronvelloClientOptions {\n /** Account API key (`crn_live_…`). Required. */\n apiKey: string;\n /** API base URL. Defaults to https://api.cronvello.com. */\n baseUrl?: string;\n /** Per-request timeout in ms (default 30_000). */\n timeoutMs?: number;\n /** Retry attempts for 429/5xx/network errors (default 2). */\n maxRetries?: number;\n /** Custom fetch implementation (default: global fetch). */\n fetch?: FetchLike;\n /** Telemetry hook for every request attempt. */\n onRequest?: (info: { method: string; path: string; status: number; attempt: number; durationMs: number }) => void;\n}\n\nexport class CronvelloClient {\n private readonly transport: Transport;\n /** The resolved base URL in use. */\n readonly baseUrl: string;\n\n /** Job container operations. */\n readonly jobs: JobsResource;\n /** Scheduled task operations. */\n readonly tasks: TasksResource;\n /** Execution-history (run) operations. */\n readonly runs: RunsResource;\n /** Account identity + usage. */\n readonly account: AccountResource;\n\n constructor(options: CronvelloClientOptions) {\n if (!options || !options.apiKey) {\n throw new CronvelloConfigError(\"CronvelloClient requires an `apiKey` (crn_live_…).\");\n }\n this.baseUrl = (options.baseUrl ?? CRONVELLO_DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.transport = new Transport({\n baseUrl: this.baseUrl,\n apiKey: options.apiKey,\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n ...(options.maxRetries !== undefined ? { maxRetries: options.maxRetries } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n ...(options.onRequest ? { onRequest: options.onRequest } : {}),\n defaultHeaders: { \"user-agent\": \"cronvello-sdk\" },\n });\n this.jobs = new JobsResource(this.transport);\n this.tasks = new TasksResource(this.transport);\n this.runs = new RunsResource(this.transport);\n this.account = new AccountResource(this.transport);\n }\n\n /**\n * Atomically reconcile a whole code registry server-side (`PUT /v1/registry`): one job\n * container + its tasks, created/updated/pruned/started in a single call. This is what\n * `defineCronvello().sync()` prefers; the high-level API builds the body for you.\n */\n reconcileRegistry(body: RegistryReconcileRequest, opts?: { idempotencyKey?: string }): Promise<RegistryReconcileResponse> {\n return this.transport.request({\n method: \"PUT\",\n path: \"/v1/registry\",\n body,\n ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}),\n });\n }\n\n /**\n * Escape hatch for endpoints not yet wrapped by a typed method (heartbeat monitors,\n * maintenance windows, DLQ, notification channels, audit log, API-key self-service …).\n * `T` is the response shape you expect.\n */\n request<T>(method: string, path: string, opts?: { query?: Record<string, string | number | boolean | undefined>; body?: unknown; idempotencyKey?: string }): Promise<T> {\n return this.transport.request<T>({\n method,\n path,\n ...(opts?.query ? { query: opts.query } : {}),\n ...(opts?.body !== undefined ? { body: opts.body } : {}),\n ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}),\n });\n }\n}\n\nclass JobsResource {\n constructor(private readonly t: Transport) {}\n\n list(): Promise<PublicJob[]> {\n return this.t.request({ method: \"GET\", path: \"/v1/jobs\" });\n }\n get(jobId: string): Promise<PublicJob> {\n return this.t.request({ method: \"GET\", path: `/v1/jobs/${enc(jobId)}` });\n }\n create(body: JobCreateBody, opts?: { idempotencyKey?: string }): Promise<PublicJob> {\n return this.t.request({ method: \"POST\", path: \"/v1/jobs\", body, ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}) });\n }\n update(jobId: string, body: JobUpdateBody): Promise<PublicJob> {\n return this.t.request({ method: \"PATCH\", path: `/v1/jobs/${enc(jobId)}`, body });\n }\n delete(jobId: string): Promise<null> {\n return this.t.request({ method: \"DELETE\", path: `/v1/jobs/${enc(jobId)}` });\n }\n start(jobId: string): Promise<PublicJob> {\n return this.t.request({ method: \"POST\", path: `/v1/jobs/${enc(jobId)}/start` });\n }\n stop(jobId: string): Promise<PublicJob> {\n return this.t.request({ method: \"POST\", path: `/v1/jobs/${enc(jobId)}/stop` });\n }\n listTasks(jobId: string): Promise<PublicTask[]> {\n return this.t.request({ method: \"GET\", path: `/v1/jobs/${enc(jobId)}/tasks` });\n }\n createTask(jobId: string, body: TaskCreateBody, opts?: { idempotencyKey?: string }): Promise<PublicTask> {\n return this.t.request({ method: \"POST\", path: `/v1/jobs/${enc(jobId)}/tasks`, body, ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}) });\n }\n}\n\nclass TasksResource {\n constructor(private readonly t: Transport) {}\n\n /** Account-wide paginated task table. */\n list(query?: AccountTasksQuery): Promise<TasksPage> {\n return this.t.request({ method: \"GET\", path: \"/v1/tasks\", ...(query ? { query: query as Record<string, string | number | boolean | undefined> } : {}) });\n }\n get(taskId: string): Promise<PublicTask> {\n return this.t.request({ method: \"GET\", path: `/v1/tasks/${enc(taskId)}` });\n }\n update(taskId: string, body: TaskUpdateBody): Promise<PublicTask> {\n return this.t.request({ method: \"PATCH\", path: `/v1/tasks/${enc(taskId)}`, body });\n }\n delete(taskId: string): Promise<null> {\n return this.t.request({ method: \"DELETE\", path: `/v1/tasks/${enc(taskId)}` });\n }\n start(taskId: string): Promise<PublicTask> {\n return this.t.request({ method: \"POST\", path: `/v1/tasks/${enc(taskId)}/start` });\n }\n stop(taskId: string): Promise<PublicTask> {\n return this.t.request({ method: \"POST\", path: `/v1/tasks/${enc(taskId)}/stop` });\n }\n /** Trigger a one-off manual execution (does not change the schedule). */\n runNow(taskId: string): Promise<RunNowResult> {\n return this.t.request({ method: \"POST\", path: `/v1/tasks/${enc(taskId)}/run` });\n }\n listRuns(taskId: string, query?: RunsQuery): Promise<RunsPage> {\n return this.t.request({ method: \"GET\", path: `/v1/tasks/${enc(taskId)}/runs`, ...(query ? { query: query as Record<string, string | number | boolean | undefined> } : {}) });\n }\n}\n\nclass RunsResource {\n constructor(private readonly t: Transport) {}\n\n /** Account-wide paginated activity feed. */\n list(query?: AccountRunsQuery): Promise<RunsPage> {\n return this.t.request({ method: \"GET\", path: \"/v1/runs\", ...(query ? { query: query as Record<string, string | number | boolean | undefined> } : {}) });\n }\n get(runId: string): Promise<PublicRun> {\n return this.t.request({ method: \"GET\", path: `/v1/runs/${enc(runId)}` });\n }\n}\n\nclass AccountResource {\n constructor(private readonly t: Transport) {}\n\n me(): Promise<MeResponse> {\n return this.t.request({ method: \"GET\", path: \"/v1/me\" });\n }\n usage(): Promise<UsageResponse> {\n return this.t.request({ method: \"GET\", path: \"/v1/usage\" });\n }\n}\n\nfunction enc(segment: string): string {\n return encodeURIComponent(segment);\n}\n","/**\n * Authentication helpers for the dispatch handler.\n *\n * Inbound (Cronvello → app): a bearer token equal to the configured `dispatchSecret`.\n * We compare it in constant time to avoid leaking the secret through timing.\n *\n * Outbound (app → Cronvello, async_callback only): we sign the callback body with\n * HMAC-SHA256 (`sha256=<hex>`), matching node-cron's `webhook-hmac.service`.\n */\n\nconst encoder = new TextEncoder();\n\n/** Parse `Authorization: Bearer <token>` (scheme is case-insensitive). Returns the token or null. */\nexport function parseBearer(headerValue: string | undefined): string | null {\n if (!headerValue) return null;\n const match = /^bearer\\s+(.+)$/i.exec(headerValue.trim());\n return match ? match[1]!.trim() : null;\n}\n\n/**\n * Constant-time string comparison. Runs in time proportional to the longer input and never\n * short-circuits, so it does not reveal where two values diverge. No `node:crypto` dependency,\n * so it works on edge runtimes too.\n */\nexport function timingSafeEqual(a: string, b: string): boolean {\n const ab = encoder.encode(a);\n const bb = encoder.encode(b);\n const len = Math.max(ab.length, bb.length);\n let diff = ab.length ^ bb.length;\n for (let i = 0; i < len; i++) {\n diff |= (ab[i] ?? 0) ^ (bb[i] ?? 0);\n }\n return diff === 0;\n}\n\n/**\n * HMAC-SHA256 signature in node-cron's wire format: `sha256=<hex>`.\n * Uses WebCrypto (`crypto.subtle`), available on Node 18+ and edge runtimes — no node:crypto.\n */\nexport async function signHmacSha256(payload: string, secret: string): Promise<string> {\n const key = await crypto.subtle.importKey(\n \"raw\",\n encoder.encode(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n const sig = await crypto.subtle.sign(\"HMAC\", key, encoder.encode(payload));\n const hex = Array.from(new Uint8Array(sig))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n return `sha256=${hex}`;\n}\n","/**\n * Framework-neutral dispatch core.\n *\n * Cronvello fires a due task by POSTing to the app's dispatch URL with\n * Authorization: Bearer <dispatchSecret>\n * body: { job: \"<registry-key>\", schedule: \"<cron>\", ...payload, _callback?: {...} }\n *\n * This module verifies the bearer, selects the job by key, runs its handler, and returns a\n * response. The Express/Next adapters are thin shells that translate their request/response\n * objects to/from the neutral shapes below.\n */\n\nimport type { CronvelloJobConfig, CronvelloJobContext, CronvelloLogger } from \"./types.js\";\nimport { parseBearer, signHmacSha256, timingSafeEqual } from \"./verify.js\";\n\nexport interface ResolvedJob {\n key: string;\n config: CronvelloJobConfig;\n}\n\nexport interface DispatcherState {\n jobs: Map<string, ResolvedJob>;\n dispatchSecret: string;\n logger: CronvelloLogger | undefined;\n}\n\nexport interface DispatchRequest {\n method: string;\n /** Value of the Authorization header, if any. */\n authorization: string | undefined;\n /** Raw request body as text. */\n rawBody: string;\n /** Lower-cased request headers. */\n headers: Record<string, string>;\n /** Abort signal for the inbound request, if the host provides one. */\n signal?: AbortSignal;\n /**\n * Optional serverless lifecycle hook (e.g. Vercel/Cloudflare `ctx.waitUntil`). When present,\n * async_callback background work is registered with it so the function stays alive until done.\n */\n waitUntil?: (promise: Promise<unknown>) => void;\n}\n\nexport interface DispatchResponse {\n status: number;\n body: Record<string, unknown>;\n}\n\n/** Async-callback metadata Cronvello injects into the request body. */\ninterface CallbackEnvelope {\n url: string;\n runId: string;\n expectedSignatureHeader?: string;\n timeoutMs?: number;\n}\n\nexport function createDispatcher(state: DispatcherState) {\n const log = state.logger;\n\n async function handle(req: DispatchRequest): Promise<DispatchResponse> {\n if (req.method.toUpperCase() !== \"POST\") {\n return resp(405, { ok: false, error: \"Method not allowed\" });\n }\n\n // 1. Authenticate: bearer must equal the dispatch secret (constant-time).\n const token = parseBearer(req.authorization);\n if (!token || !timingSafeEqual(token, state.dispatchSecret)) {\n log?.warn?.(\"[cronvello] dispatch rejected: bad or missing bearer token\");\n return resp(401, { ok: false, error: \"Unauthorized\" });\n }\n\n // 2. Parse the body.\n let body: Record<string, unknown>;\n try {\n const parsed = req.rawBody ? JSON.parse(req.rawBody) : {};\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return resp(400, { ok: false, error: \"Body must be a JSON object\" });\n }\n body = parsed as Record<string, unknown>;\n } catch {\n return resp(400, { ok: false, error: \"Invalid JSON body\" });\n }\n\n // 3. Select the job by its registry key.\n const key = typeof body[\"job\"] === \"string\" ? (body[\"job\"] as string) : null;\n if (!key) {\n return resp(400, { ok: false, error: \"Missing 'job' key in body\" });\n }\n const job = state.jobs.get(key);\n if (!job) {\n log?.warn?.(`[cronvello] dispatch for unknown job '${key}'`);\n return resp(404, { ok: false, error: `Unknown job: ${key}` });\n }\n\n const callback = readCallback(body[\"_callback\"]);\n const isAsync = callback !== null;\n const ctx: CronvelloJobContext = {\n key,\n schedule: typeof body[\"schedule\"] === \"string\" ? (body[\"schedule\"] as string) : \"\",\n payload: (job.config.payload as Record<string, unknown>) ?? {},\n body,\n headers: req.headers,\n isAsync,\n signal: req.signal,\n };\n\n // 4a. Async path — acknowledge now, run in the background, post the result back.\n if (callback) {\n const work = runAndReportCallback(job, ctx, callback, state.dispatchSecret, log);\n if (req.waitUntil) req.waitUntil(work);\n else void work; // fire-and-forget on long-running hosts\n return resp(202, { ok: true, job: key, accepted: true });\n }\n\n // 4b. Sync path — run inline; the result IS the HTTP response Cronvello records.\n const startedAt = Date.now();\n try {\n const result = await job.config.handler(ctx);\n log?.debug?.(`[cronvello] job '${key}' completed in ${Date.now() - startedAt}ms`);\n return resp(200, { ok: true, job: key, result: result ?? null });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n log?.error?.(`[cronvello] job '${key}' failed: ${message}`, { error: message });\n // Non-2xx → Cronvello records a failure and retries per the task's maxRetries.\n return resp(500, { ok: false, job: key, error: message });\n }\n }\n\n return { handle };\n}\n\nasync function runAndReportCallback(\n job: ResolvedJob,\n ctx: CronvelloJobContext,\n callback: CallbackEnvelope,\n secret: string,\n log: CronvelloLogger | undefined,\n): Promise<void> {\n const startedAt = Date.now();\n let payload: Record<string, unknown>;\n try {\n const result = await job.config.handler(ctx);\n payload = {\n runId: callback.runId,\n success: true,\n durationMs: Date.now() - startedAt,\n result: result ?? null,\n };\n } catch (err) {\n payload = {\n runId: callback.runId,\n success: false,\n durationMs: Date.now() - startedAt,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n\n try {\n const bodyStr = JSON.stringify(payload);\n const header = callback.expectedSignatureHeader || \"X-Webhook-Signature\";\n const signature = await signHmacSha256(bodyStr, secret);\n const res = await fetch(callback.url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", [header]: signature },\n body: bodyStr,\n });\n if (!res.ok) {\n log?.warn?.(`[cronvello] callback POST for job '${job.key}' returned ${res.status}`);\n }\n } catch (err) {\n log?.error?.(`[cronvello] failed to deliver callback for job '${job.key}'`, {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\nfunction readCallback(value: unknown): CallbackEnvelope | null {\n if (!value || typeof value !== \"object\") return null;\n const v = value as Record<string, unknown>;\n if (typeof v[\"url\"] !== \"string\" || typeof v[\"runId\"] !== \"string\") return null;\n return {\n url: v[\"url\"] as string,\n runId: v[\"runId\"] as string,\n ...(typeof v[\"expectedSignatureHeader\"] === \"string\"\n ? { expectedSignatureHeader: v[\"expectedSignatureHeader\"] as string }\n : {}),\n ...(typeof v[\"timeoutMs\"] === \"number\" ? { timeoutMs: v[\"timeoutMs\"] as number } : {}),\n };\n}\n\nfunction resp(status: number, body: Record<string, unknown>): DispatchResponse {\n return { status, body };\n}\n","/**\n * Idempotent reconciliation of a code registry into Cronvello.\n *\n * Model: ONE Job container per app (named `appName`), and one Task per registry job. The\n * Task's `name` IS the registry key — the stable identity used for matching, so renaming a\n * job's display/description never breaks the link. On each `sync()` we:\n * 1. ensure the Job container exists,\n * 2. diff registry tasks against the container's current tasks,\n * 3. create missing, patch changed, (optionally) delete removed,\n * 4. start newly-created tasks (Cronvello creates them DISABLED).\n *\n * The container is fully SDK-managed: only tasks inside THIS app's Job are ever touched.\n */\n\nimport type { CronvelloClient } from \"../client/client.js\";\nimport type {\n PublicJob,\n PublicTask,\n SuccessCriteria,\n TaskCreateBody,\n TaskUpdateBody,\n} from \"../internal/wire.js\";\nimport type {\n ReconcileResult,\n ReconcileTaskChange,\n SyncOptions,\n} from \"./types.js\";\nimport type { ResolvedJob } from \"./dispatch.js\";\n\nexport interface ReconcileInput {\n client: CronvelloClient;\n appName: string;\n appDescription?: string;\n dispatchUrl: string;\n dispatchSecret: string;\n defaultTimeZone: string;\n jobs: ResolvedJob[];\n}\n\nexport async function reconcile(input: ReconcileInput, options: SyncOptions = {}): Promise<ReconcileResult> {\n const { client, appName, dispatchUrl, dispatchSecret, defaultTimeZone, jobs } = input;\n const prune = options.prune ?? true;\n const dryRun = options.dryRun ?? false;\n const rotateSecret = options.rotateSecret ?? false;\n\n // 1. Ensure the Job container.\n const { job: container, created: jobCreated } = await ensureContainer(client, appName, input.appDescription, dryRun);\n const jobId = container?.id ?? \"(dry-run)\";\n\n const changes: ReconcileTaskChange[] = [];\n const existingTasks = container && !jobCreated ? await client.jobs.listTasks(container.id) : [];\n const byKey = new Map(existingTasks.map((t) => [t.name, t] as const));\n const registryKeys = new Set(jobs.map((j) => j.key));\n\n // 2. Reconcile each registry job.\n for (const job of jobs) {\n const enabled = job.config.enabled ?? true;\n const existing = byKey.get(job.key);\n const desired = buildDesiredTask({ job, dispatchUrl, dispatchSecret, defaultTimeZone });\n\n if (!enabled) {\n // Keep the task but make sure it is not scheduled.\n if (existing && existing.status === \"ACTIVE\" && !dryRun) await client.tasks.stop(existing.id);\n changes.push({ key: job.key, action: \"skipped\", taskId: existing?.id ?? null, reason: \"disabled in registry\" });\n continue;\n }\n\n if (!existing) {\n if (dryRun || !container) {\n changes.push({ key: job.key, action: \"created\", taskId: null });\n continue;\n }\n const createBody: TaskCreateBody = { ...desired, targetToken: dispatchSecret };\n const task = await client.jobs.createTask(container.id, createBody, { idempotencyKey: `cv-create-${appName}-${job.key}` });\n await client.tasks.start(task.id); // tasks are created DISABLED\n changes.push({ key: job.key, action: \"created\", taskId: task.id });\n continue;\n }\n\n // Existing task — compute the diff.\n const { patch, changedFields } = diffTask(existing, desired, { rotateSecret, dispatchSecret });\n const needsStart = existing.status === \"DISABLED\";\n\n if (changedFields.length === 0 && !needsStart) {\n changes.push({ key: job.key, action: \"unchanged\", taskId: existing.id });\n continue;\n }\n if (!dryRun) {\n if (changedFields.length > 0) await client.tasks.update(existing.id, patch);\n if (needsStart) await client.tasks.start(existing.id);\n }\n changes.push({\n key: job.key,\n action: changedFields.length > 0 ? \"updated\" : \"unchanged\",\n taskId: existing.id,\n ...(changedFields.length > 0 ? { changedFields } : {}),\n ...(needsStart ? { reason: \"re-activated\" } : {}),\n });\n }\n\n // 3. Prune tasks no longer in the registry.\n if (prune) {\n for (const task of existingTasks) {\n if (registryKeys.has(task.name)) continue;\n if (!dryRun) await client.tasks.delete(task.id);\n changes.push({ key: task.name, action: \"deleted\", taskId: task.id });\n }\n }\n\n return summarize(jobId, appName, jobCreated, changes);\n}\n\nasync function ensureContainer(\n client: CronvelloClient,\n appName: string,\n description: string | undefined,\n dryRun: boolean,\n): Promise<{ job: PublicJob | null; created: boolean }> {\n const jobs = await client.jobs.list();\n const found = jobs.find((j) => j.name === appName);\n if (found) return { job: found, created: false };\n if (dryRun) return { job: null, created: true };\n const created = await client.jobs.create(\n { name: appName, ...(description ? { description } : {}) },\n { idempotencyKey: `cv-job-${appName}` },\n );\n return { job: created, created: true };\n}\n\nfunction buildDesiredTask(args: {\n job: ResolvedJob;\n dispatchUrl: string;\n dispatchSecret: string;\n defaultTimeZone: string;\n}): TaskCreateBody {\n const { job, dispatchUrl, defaultTimeZone } = args;\n const cfg = job.config;\n const requestBody = JSON.stringify({ job: job.key, ...(cfg.payload ?? {}) });\n const body: TaskCreateBody = {\n name: job.key,\n schedule: cfg.schedule,\n timeZone: cfg.timeZone ?? defaultTimeZone,\n targetUrl: dispatchUrl,\n method: \"POST\",\n requestBody,\n };\n if (cfg.description !== undefined) body.description = cfg.description;\n if (cfg.urgency !== undefined) body.urgency = cfg.urgency;\n if (cfg.maxRetries !== undefined) body.maxRetries = cfg.maxRetries;\n if (cfg.executionMode !== undefined) body.executionMode = cfg.executionMode;\n if (cfg.callbackTimeoutMs !== undefined) body.callbackTimeoutMs = cfg.callbackTimeoutMs;\n if (cfg.allowConcurrentRuns !== undefined) body.allowConcurrentRuns = cfg.allowConcurrentRuns;\n if (cfg.successCriteria !== undefined) body.successCriteria = cfg.successCriteria;\n return body;\n}\n\nfunction diffTask(\n existing: PublicTask,\n desired: TaskCreateBody,\n opts: { rotateSecret: boolean; dispatchSecret: string },\n): { patch: TaskUpdateBody; changedFields: string[] } {\n const patch: TaskUpdateBody = {};\n const changed: string[] = [];\n\n const set = <K extends keyof TaskUpdateBody>(field: K, value: TaskUpdateBody[K]) => {\n patch[field] = value;\n changed.push(field);\n };\n\n if (existing.schedule !== desired.schedule) set(\"schedule\", desired.schedule);\n if (desired.timeZone !== undefined && existing.timeZone !== desired.timeZone) set(\"timeZone\", desired.timeZone);\n if (existing.targetUrl !== desired.targetUrl) set(\"targetUrl\", desired.targetUrl);\n if (existing.method !== (desired.method ?? \"POST\")) set(\"method\", desired.method ?? \"POST\");\n if (!jsonEqual(existing.requestBody, desired.requestBody)) set(\"requestBody\", desired.requestBody ?? null);\n\n // Optional fields: only reconcile when the registry explicitly sets them.\n if (desired.description !== undefined && (existing.description ?? undefined) !== desired.description) {\n set(\"description\", desired.description);\n }\n if (desired.urgency !== undefined && existing.urgency !== desired.urgency) set(\"urgency\", desired.urgency);\n if (desired.maxRetries !== undefined && existing.maxRetries !== desired.maxRetries) set(\"maxRetries\", desired.maxRetries);\n if (desired.executionMode !== undefined && existing.executionMode !== desired.executionMode) {\n set(\"executionMode\", desired.executionMode);\n }\n if (desired.callbackTimeoutMs !== undefined && existing.callbackTimeoutMs !== desired.callbackTimeoutMs) {\n set(\"callbackTimeoutMs\", desired.callbackTimeoutMs);\n }\n if (desired.allowConcurrentRuns !== undefined && existing.allowConcurrentRuns !== desired.allowConcurrentRuns) {\n set(\"allowConcurrentRuns\", desired.allowConcurrentRuns);\n }\n if (desired.successCriteria !== undefined && !deepEqual(existing.successCriteria, desired.successCriteria)) {\n set(\"successCriteria\", desired.successCriteria as SuccessCriteria);\n }\n\n // The dispatch secret (targetToken) can't be read back — only (re)set it on demand or when absent.\n if (opts.rotateSecret || !existing.hasTargetToken) set(\"targetToken\", opts.dispatchSecret);\n\n return { patch, changedFields: changed };\n}\n\nfunction jsonEqual(a: string | null, b: string | null | undefined): boolean {\n if (a == null || b == null) return a == b;\n try {\n return deepEqual(JSON.parse(a), JSON.parse(b));\n } catch {\n return a === b;\n }\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return a === b;\n if (typeof a !== \"object\" || typeof b !== \"object\") return false;\n const ak = Object.keys(a as object).sort();\n const bk = Object.keys(b as object).sort();\n if (ak.length !== bk.length) return false;\n for (let i = 0; i < ak.length; i++) {\n if (ak[i] !== bk[i]) return false;\n if (!deepEqual((a as Record<string, unknown>)[ak[i]!], (b as Record<string, unknown>)[bk[i]!])) return false;\n }\n return true;\n}\n\nfunction summarize(\n jobId: string,\n jobName: string,\n jobCreated: boolean,\n changes: ReconcileTaskChange[],\n): ReconcileResult {\n const count = (a: ReconcileTaskChange[\"action\"]) => changes.filter((c) => c.action === a).length;\n return {\n jobId,\n jobName,\n jobCreated,\n created: count(\"created\"),\n updated: count(\"updated\"),\n unchanged: count(\"unchanged\"),\n deleted: count(\"deleted\"),\n skipped: count(\"skipped\"),\n changes,\n };\n}\n","/**\n * Express adapter. Zero dependency on `express` itself — the request/response are typed\n * structurally, so this works with Express 4/5 and any Connect-style middleware stack.\n *\n * import { defineCronvello } from \"@cronvello/sdk\";\n * import { expressHandler } from \"@cronvello/sdk/express\";\n *\n * app.post(\"/cronvello/dispatch\", express.json(), expressHandler(cronvello));\n * // …or simply: app.post(cronvello.dispatchPath, express.json(), cronvello.expressHandler());\n *\n * Works with or without `express.json()` — if the body isn't pre-parsed, the raw stream is read.\n */\n\nimport type { DispatchHandler } from \"../registry/dispatch-handler.js\";\n\nexport interface ExpressRequestLike {\n method?: string;\n headers: Record<string, string | string[] | undefined>;\n body?: unknown;\n on?(event: string, listener: (chunk?: unknown) => void): void;\n}\n\nexport interface ExpressResponseLike {\n status(code: number): ExpressResponseLike;\n json(body: unknown): void;\n}\n\nexport type ExpressDispatchHandler = (req: ExpressRequestLike, res: ExpressResponseLike) => Promise<void>;\n\nexport function expressHandler(app: DispatchHandler): ExpressDispatchHandler {\n return async (req, res) => {\n const rawBody = await readBody(req);\n const result = await app.handle({\n method: req.method ?? \"POST\",\n authorization: headerValue(req.headers[\"authorization\"]),\n rawBody,\n headers: flattenHeaders(req.headers),\n });\n res.status(result.status).json(result.body);\n };\n}\n\nasync function readBody(req: ExpressRequestLike): Promise<string> {\n const body = req.body;\n if (body !== undefined && body !== null) {\n if (typeof body === \"string\") return body;\n if (typeof Buffer !== \"undefined\" && Buffer.isBuffer(body)) return body.toString(\"utf8\");\n if (typeof body === \"object\") return JSON.stringify(body);\n }\n if (typeof req.on !== \"function\") return \"\";\n return new Promise<string>((resolve) => {\n let data = \"\";\n req.on!(\"data\", (chunk?: unknown) => {\n data += typeof chunk === \"string\" ? chunk : String(chunk ?? \"\");\n });\n req.on!(\"end\", () => resolve(data));\n req.on!(\"error\", () => resolve(data));\n });\n}\n\nfunction headerValue(value: string | string[] | undefined): string | undefined {\n if (Array.isArray(value)) return value[0];\n return value;\n}\n\nfunction flattenHeaders(headers: Record<string, string | string[] | undefined>): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(headers)) {\n if (v === undefined) continue;\n out[k.toLowerCase()] = Array.isArray(v) ? v.join(\", \") : v;\n }\n return out;\n}\n","/**\n * Next.js App Router adapter (Route Handlers). Zero dependency on `next` — uses the Web\n * Fetch `Request`/`Response` globals (Node 18+ and the edge runtime).\n *\n * // app/cronvello/dispatch/route.ts\n * import { cronvello } from \"@/lib/cronvello\";\n * import { nextHandler } from \"@cronvello/sdk/next\";\n * export const POST = nextHandler(cronvello);\n *\n * On serverless hosts, prefer the default sync execution mode so the work finishes within the\n * request. async_callback needs a host that keeps running after the response (see docs).\n */\n\nimport type { DispatchHandler } from \"../registry/dispatch-handler.js\";\n\n/** Structural subset of the Web Fetch `Request` we rely on. */\nexport interface FetchRequestLike {\n method: string;\n headers: {\n get(name: string): string | null;\n forEach?(cb: (value: string, key: string) => void): void;\n };\n text(): Promise<string>;\n}\n\nexport type NextRouteHandler = (req: FetchRequestLike) => Promise<Response>;\n\nexport function nextHandler(app: DispatchHandler): NextRouteHandler {\n return async (req) => {\n const rawBody = await req.text();\n const headers: Record<string, string> = {};\n req.headers.forEach?.((value, key) => {\n headers[key.toLowerCase()] = value;\n });\n const result = await app.handle({\n method: req.method,\n authorization: req.headers.get(\"authorization\") ?? undefined,\n rawBody,\n headers,\n });\n return new Response(JSON.stringify(result.body), {\n status: result.status,\n headers: { \"content-type\": \"application/json\" },\n });\n };\n}\n","/**\n * `defineCronvello` — the high-level, code-first entry point.\n *\n * export const cronvello = defineCronvello({\n * appName: \"my-app\",\n * appUrl: process.env.APP_URL!,\n * apiKey: process.env.CRONVELLO_API_KEY!,\n * dispatchSecret: process.env.CRONVELLO_DISPATCH_SECRET!,\n * jobs: {\n * \"send-daily-digest\": { schedule: \"0 8 * * *\", handler: async () => { … } },\n * \"cleanup-temp\": { schedule: \"*\\/15 * * * *\", handler: async () => { … } },\n * },\n * });\n *\n * await cronvello.sync(); // reconcile the registry to Cronvello (idempotent)\n * app.post(cronvello.dispatchPath, express.json(), cronvello.expressHandler());\n */\n\nimport { CronvelloClient, CRONVELLO_DEFAULT_BASE_URL } from \"../client/client.js\";\nimport { CronvelloApiError, CronvelloConfigError } from \"../internal/errors.js\";\nimport type { RegistryReconcileRequest, RegistryTaskInput, RunNowResult } from \"../internal/wire.js\";\nimport { createDispatcher, type DispatchRequest, type DispatchResponse, type ResolvedJob } from \"./dispatch.js\";\nimport { reconcile } from \"./reconcile.js\";\nimport { expressHandler, type ExpressDispatchHandler } from \"../adapters/express.js\";\nimport { nextHandler, type NextRouteHandler } from \"../adapters/next.js\";\nimport type {\n CronvelloAppConfig,\n CronvelloJobConfig,\n CronvelloJobsInput,\n ReconcileResult,\n SyncOptions,\n} from \"./types.js\";\n\nconst DEFAULT_DISPATCH_PATH = \"/cronvello/dispatch\";\nconst DEFAULT_TIME_ZONE = \"Europe/Berlin\";\n\nexport interface CronvelloApp {\n /** The underlying low-level client for ad-hoc `/v1` calls. */\n readonly client: CronvelloClient;\n /** Resolved jobs, keyed by their stable registry key. */\n readonly jobs: ReadonlyMap<string, ResolvedJob>;\n /** The app identity / Job-container name. */\n readonly appName: string;\n /** Path the dispatch handler should be mounted at (e.g. \"/cronvello/dispatch\"). */\n readonly dispatchPath: string;\n /** Absolute URL Cronvello calls back (appUrl + dispatchPath). */\n readonly dispatchUrl: string;\n\n /** Reconcile the registry into Cronvello. Idempotent — safe to call on every boot/deploy. */\n sync(options?: SyncOptions): Promise<ReconcileResult>;\n /** Trigger one job immediately via Cronvello (manual run). Requires a prior `sync()`. */\n run(key: string): Promise<RunNowResult>;\n /** Framework-neutral dispatch entry — used by the adapters. */\n handle(req: DispatchRequest): Promise<DispatchResponse>;\n /** Express/Connect request handler for the dispatch endpoint. */\n expressHandler(): ExpressDispatchHandler;\n /** Next.js App Router (Route Handler) for the dispatch endpoint. */\n nextHandler(): NextRouteHandler;\n /** The registry keys, for diagnostics. */\n keys(): string[];\n}\n\nexport function defineCronvello(config: CronvelloAppConfig): CronvelloApp {\n validateConfig(config);\n\n const jobs = normalizeJobs(config.jobs);\n const dispatchPath = normalizePath(config.dispatchPath ?? DEFAULT_DISPATCH_PATH);\n const dispatchUrl = joinUrl(config.appUrl, dispatchPath);\n const defaultTimeZone = config.timeZone ?? DEFAULT_TIME_ZONE;\n\n const client = new CronvelloClient({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? CRONVELLO_DEFAULT_BASE_URL,\n ...(config.timeoutMs !== undefined ? { timeoutMs: config.timeoutMs } : {}),\n ...(config.maxRetries !== undefined ? { maxRetries: config.maxRetries } : {}),\n ...(config.fetch ? { fetch: config.fetch } : {}),\n });\n\n const dispatcher = createDispatcher({\n jobs,\n dispatchSecret: config.dispatchSecret,\n logger: config.logger,\n });\n\n const app: CronvelloApp = {\n client,\n jobs,\n appName: config.appName,\n dispatchPath,\n dispatchUrl,\n\n async sync(options?: SyncOptions): Promise<ReconcileResult> {\n const opts = options ?? {};\n // Prefer the atomic server-side reconcile (one round-trip). dryRun is only supported by\n // the local differ, so it always takes the client-side path.\n if (!opts.dryRun) {\n try {\n const res = await client.reconcileRegistry(\n buildRegistryRequest(config, dispatchUrl, defaultTimeZone, [...jobs.values()], opts),\n );\n return {\n jobId: res.job.id,\n jobName: res.job.name,\n jobCreated: res.jobCreated,\n created: res.created,\n updated: res.updated,\n unchanged: res.unchanged,\n deleted: res.deleted,\n skipped: res.skipped,\n changes: res.changes.map((c) => ({\n key: c.key,\n action: c.action,\n taskId: c.taskId,\n ...(c.changedFields ? { changedFields: c.changedFields } : {}),\n })),\n tasks: res.tasks,\n };\n } catch (e) {\n // Older server without /v1/registry → fall back to the client-side differ.\n if (!(e instanceof CronvelloApiError) || (e.status !== 404 && e.status !== 405)) throw e;\n }\n }\n return reconcile(\n {\n client,\n appName: config.appName,\n dispatchUrl,\n dispatchSecret: config.dispatchSecret,\n defaultTimeZone,\n jobs: [...jobs.values()],\n },\n opts,\n );\n },\n\n async run(key: string): Promise<RunNowResult> {\n if (!jobs.has(key)) {\n throw new CronvelloConfigError(`Unknown job '${key}'. Known: ${[...jobs.keys()].join(\", \") || \"(none)\"}`);\n }\n const containers = await client.jobs.list();\n const container = containers.find((j) => j.name === config.appName);\n if (!container) {\n throw new CronvelloConfigError(`App '${config.appName}' is not synced yet — call sync() first.`);\n }\n const tasks = await client.jobs.listTasks(container.id);\n const task = tasks.find((t) => t.name === key);\n if (!task) {\n throw new CronvelloConfigError(`Job '${key}' has no task yet — call sync() first.`);\n }\n return client.tasks.runNow(task.id);\n },\n\n handle: dispatcher.handle,\n expressHandler: () => expressHandler(app),\n nextHandler: () => nextHandler(app),\n keys: () => [...jobs.keys()],\n };\n\n return app;\n}\n\nfunction validateConfig(config: CronvelloAppConfig): void {\n if (!config) throw new CronvelloConfigError(\"defineCronvello requires a config object.\");\n if (!config.appName || !config.appName.trim()) throw new CronvelloConfigError(\"`appName` is required.\");\n if (!config.appUrl || !/^https?:\\/\\//i.test(config.appUrl)) {\n throw new CronvelloConfigError(\"`appUrl` must be an absolute http(s) URL (the public URL of THIS app).\");\n }\n if (!config.apiKey) throw new CronvelloConfigError(\"`apiKey` (crn_live_…) is required.\");\n if (!config.dispatchSecret || config.dispatchSecret.length < 16) {\n throw new CronvelloConfigError(\"`dispatchSecret` is required and must be at least 16 chars (use a random 32-byte value).\");\n }\n if (!config.jobs) throw new CronvelloConfigError(\"`jobs` is required.\");\n}\n\nfunction normalizeJobs(input: CronvelloJobsInput): Map<string, ResolvedJob> {\n const map = new Map<string, ResolvedJob>();\n const entries: Array<{ key: string; config: CronvelloJobConfig }> = Array.isArray(input)\n ? input.map(({ key, ...rest }) => ({ key, config: rest }))\n : Object.entries(input).map(([key, config]) => ({ key, config }));\n\n for (const { key, config } of entries) {\n const trimmed = (key ?? \"\").trim();\n if (!trimmed) throw new CronvelloConfigError(\"Every job needs a non-empty key.\");\n if (trimmed.length > 255) throw new CronvelloConfigError(`Job key '${trimmed}' exceeds 255 characters.`);\n if (map.has(trimmed)) throw new CronvelloConfigError(`Duplicate job key '${trimmed}'.`);\n if (!config || typeof config.handler !== \"function\") {\n throw new CronvelloConfigError(`Job '${trimmed}' is missing a handler function.`);\n }\n if (!config.schedule || !config.schedule.trim()) {\n throw new CronvelloConfigError(`Job '${trimmed}' is missing a schedule.`);\n }\n map.set(trimmed, { key: trimmed, config });\n }\n if (map.size === 0) throw new CronvelloConfigError(\"At least one job is required.\");\n return map;\n}\n\nfunction normalizePath(path: string): string {\n const trimmed = path.trim();\n return trimmed.startsWith(\"/\") ? trimmed.replace(/\\/+$/, \"\") || \"/\" : `/${trimmed.replace(/\\/+$/, \"\")}`;\n}\n\nfunction joinUrl(base: string, path: string): string {\n return `${base.replace(/\\/+$/, \"\")}${path}`;\n}\n\n/** Build the PUT /v1/registry body from the registry jobs. */\nfunction buildRegistryRequest(\n config: CronvelloAppConfig,\n dispatchUrl: string,\n defaultTimeZone: string,\n jobs: ResolvedJob[],\n opts: SyncOptions,\n): RegistryReconcileRequest {\n const tasks: RegistryTaskInput[] = jobs.map((j) => {\n const cfg = j.config;\n const task: RegistryTaskInput = {\n key: j.key,\n schedule: cfg.schedule,\n targetUrl: dispatchUrl,\n targetToken: config.dispatchSecret,\n method: \"POST\",\n timeZone: cfg.timeZone ?? defaultTimeZone,\n requestBody: JSON.stringify({ job: j.key, ...(cfg.payload ?? {}) }),\n };\n if (cfg.description !== undefined) task.description = cfg.description;\n if (cfg.urgency !== undefined) task.urgency = cfg.urgency;\n if (cfg.maxRetries !== undefined) task.maxRetries = cfg.maxRetries;\n if (cfg.executionMode !== undefined) task.executionMode = cfg.executionMode;\n if (cfg.callbackTimeoutMs !== undefined) task.callbackTimeoutMs = cfg.callbackTimeoutMs;\n if (cfg.allowConcurrentRuns !== undefined) task.allowConcurrentRuns = cfg.allowConcurrentRuns;\n if (cfg.successCriteria !== undefined) task.successCriteria = cfg.successCriteria;\n if (cfg.enabled !== undefined) task.enabled = cfg.enabled;\n return task;\n });\n return {\n appName: config.appName,\n tasks,\n prune: opts.prune ?? true,\n rotateSecret: opts.rotateSecret ?? false,\n };\n}\n","/**\n * @cronvello/sdk — code-first cron jobs for Cronvello.\n *\n * Two layers, one package:\n * • High-level registry: `defineCronvello({ jobs })` → `.sync()` + `.expressHandler()` / `.nextHandler()`.\n * Define jobs in code; the SDK reconciles them to https://api.cronvello.com and runs them.\n * • Low-level client: `new CronvelloClient({ apiKey })` → typed access to the whole `/v1` API.\n */\n\n// ── High-level registry ────────────────────────────────────────────────────\nexport { defineCronvello, type CronvelloApp } from \"./registry/define.js\";\nexport type {\n CronvelloAppConfig,\n CronvelloJobConfig,\n CronvelloJobConfigWithKey,\n CronvelloJobsInput,\n CronvelloJobContext,\n CronvelloJobHandler,\n CronvelloLogger,\n ReconcileResult,\n ReconcileTaskChange,\n SyncOptions,\n} from \"./registry/types.js\";\nexport type { DispatchRequest, DispatchResponse } from \"./registry/dispatch.js\";\n\n// ── Low-level client ───────────────────────────────────────────────────────\nexport {\n CronvelloClient,\n CRONVELLO_DEFAULT_BASE_URL,\n type CronvelloClientOptions,\n} from \"./client/client.js\";\n\n// ── Errors ─────────────────────────────────────────────────────────────────\nexport {\n CronvelloError,\n CronvelloApiError,\n CronvelloNetworkError,\n CronvelloConfigError,\n} from \"./internal/errors.js\";\n\n// ── Wire types ─────────────────────────────────────────────────────────────\nexport type {\n Urgency,\n ExecutionMode,\n HttpMethod,\n JobStatus,\n RunStatus,\n RunType,\n CallbackStatus,\n SuccessCriteria,\n PublicJob,\n PublicTask,\n PublicRun,\n JobCreateBody,\n JobUpdateBody,\n TaskCreateBody,\n TaskUpdateBody,\n RunsPage,\n TasksPage,\n RunNowResult,\n RegistryTaskInput,\n RegistryReconcileRequest,\n RegistryReconcileResponse,\n RegistryReconcileChange,\n MeResponse,\n UsageResponse,\n Pagination,\n RunsQuery,\n AccountTasksQuery,\n AccountRunsQuery,\n} from \"./internal/wire.js\";\n\n/**\n * Generate a strong random dispatch secret (hex). Convenience for setup scripts:\n * node -e \"console.log(require('@cronvello/sdk').generateDispatchSecret())\"\n */\nexport function generateDispatchSecret(bytes = 32): string {\n const buf = new Uint8Array(bytes);\n crypto.getRandomValues(buf);\n return Array.from(buf)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cronvello/sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Code-first cron jobs for Cronvello. Define jobs in your code, the SDK syncs them to https://api.cronvello.com and runs them — no dashboard required.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cron",
|
|
@@ -35,16 +35,34 @@
|
|
|
35
35
|
"types": "./dist/index.d.ts",
|
|
36
36
|
"exports": {
|
|
37
37
|
".": {
|
|
38
|
-
"import": {
|
|
39
|
-
|
|
38
|
+
"import": {
|
|
39
|
+
"types": "./dist/index.d.ts",
|
|
40
|
+
"default": "./dist/index.js"
|
|
41
|
+
},
|
|
42
|
+
"require": {
|
|
43
|
+
"types": "./dist/index.d.cts",
|
|
44
|
+
"default": "./dist/index.cjs"
|
|
45
|
+
}
|
|
40
46
|
},
|
|
41
47
|
"./express": {
|
|
42
|
-
"import": {
|
|
43
|
-
|
|
48
|
+
"import": {
|
|
49
|
+
"types": "./dist/express.d.ts",
|
|
50
|
+
"default": "./dist/express.js"
|
|
51
|
+
},
|
|
52
|
+
"require": {
|
|
53
|
+
"types": "./dist/express.d.cts",
|
|
54
|
+
"default": "./dist/express.cjs"
|
|
55
|
+
}
|
|
44
56
|
},
|
|
45
57
|
"./next": {
|
|
46
|
-
"import": {
|
|
47
|
-
|
|
58
|
+
"import": {
|
|
59
|
+
"types": "./dist/next.d.ts",
|
|
60
|
+
"default": "./dist/next.js"
|
|
61
|
+
},
|
|
62
|
+
"require": {
|
|
63
|
+
"types": "./dist/next.d.cts",
|
|
64
|
+
"default": "./dist/next.cjs"
|
|
65
|
+
}
|
|
48
66
|
},
|
|
49
67
|
"./package.json": "./package.json"
|
|
50
68
|
},
|