@clocknext/sdk 0.1.0
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/README.md +161 -0
- package/dist/index.cjs +596 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +580 -0
- package/dist/index.d.ts +580 -0
- package/dist/index.js +582 -0
- package/dist/index.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/queue.ts","../src/flusher.ts","../src/errors.ts","../src/retry.ts","../src/http.ts","../src/resources/customers.ts","../src/resources/portal.ts","../src/idempotency.ts","../src/resources/signals.ts","../src/client.ts"],"names":["message"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ClockNextConfig, FetchLike, ResolvedConfig } from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"https://app.clocknext.com\";\n\n/** Use `value` only if it's a finite number `>= min`; otherwise fall back. */\nfunction num(value: number | undefined, fallback: number, min: number): number {\n return typeof value === \"number\" && Number.isFinite(value) && value >= min\n ? value\n : fallback;\n}\n\n/** Applies defaults and validates required config. */\nexport function resolveConfig(config: ClockNextConfig): ResolvedConfig {\n if (!config.apiKey || typeof config.apiKey !== \"string\") {\n throw new Error(\"ClockNext: `apiKey` is required.\");\n }\n\n const fetchImpl: FetchLike | undefined =\n config.fetch ??\n (typeof globalThis.fetch === \"function\"\n ? (globalThis.fetch.bind(globalThis) as FetchLike)\n : undefined);\n if (!fetchImpl) {\n throw new Error(\n \"ClockNext: no global `fetch` found. Use Node 18+, or pass a `fetch` implementation.\",\n );\n }\n\n return {\n apiKey: config.apiKey,\n baseUrl: (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\"),\n mode: config.mode ?? \"async\",\n timeoutMs: num(config.timeoutMs, 10_000, 1),\n batch: {\n maxSize: num(config.batch?.maxSize, 20, 1),\n maxIntervalMs: num(config.batch?.maxIntervalMs, 2000, 0),\n maxConcurrency: num(config.batch?.maxConcurrency, 5, 1),\n maxQueueSize: num(config.batch?.maxQueueSize, 10_000, 1),\n },\n retry: {\n maxAttempts: num(config.retry?.maxAttempts, 5, 1),\n baseDelayMs: num(config.retry?.baseDelayMs, 200, 0),\n maxDelayMs: num(config.retry?.maxDelayMs, 10_000, 0),\n },\n fetch: fetchImpl,\n logger: config.logger ?? {},\n onError: config.onError,\n onFlush: config.onFlush,\n onRetry: config.onRetry,\n onDrop: config.onDrop,\n };\n}\n","import type { Signal } from \"./types.js\";\n\n/** One buffered, wire-ready signal awaiting a background flush. */\nexport interface QueuedSignal {\n /** The exact JSON body to POST to /api/v1/usage. */\n body: Record<string, unknown>;\n /** Reused across retries. */\n idempotencyKey: string;\n /** The original signal — passed to onError/onDrop hooks. */\n signal: Signal;\n}\n\n/**\n * Pluggable buffer. The default is in-memory; a host that needs to survive a\n * crash *before* send can implement this against disk/Redis/SQLite.\n */\nexport interface QueueStore {\n push(item: QueuedSignal): void;\n /** Remove and return up to `n` items (FIFO). */\n take(n: number): QueuedSignal[];\n size(): number;\n}\n\nexport class InMemoryQueue implements QueueStore {\n private items: QueuedSignal[] = [];\n\n push(item: QueuedSignal): void {\n this.items.push(item);\n }\n\n take(n: number): QueuedSignal[] {\n return this.items.splice(0, n);\n }\n\n size(): number {\n return this.items.length;\n }\n}\n","import type { Transport } from \"./http.js\";\nimport { InMemoryQueue, type QueueStore, type QueuedSignal } from \"./queue.js\";\nimport type { ResolvedConfig } from \"./types.js\";\n\n/**\n * Background send engine for async-mode signals. Buffers wire-ready signals and\n * flushes them when the buffer reaches `maxSize` OR every `maxIntervalMs`,\n * whichever comes first — the Segment/Amberflo pattern. The Transport owns\n * retries; `close()` drains and awaits in-flight sends so a serverless process\n * can flush before it freezes.\n */\nexport class Flusher {\n private readonly queue: QueueStore = new InMemoryQueue();\n private timer: ReturnType<typeof setTimeout> | null = null;\n private draining: Promise<void> | null = null;\n private closed = false;\n\n constructor(\n private readonly transport: Transport,\n private readonly cfg: ResolvedConfig,\n ) {}\n\n /** Buffer one signal. Drops (with onDrop) when closed or the queue is full. */\n enqueue(item: QueuedSignal): void {\n if (this.closed) {\n this.cfg.onDrop?.(item.signal, \"send_failed\");\n return;\n }\n if (this.queue.size() >= this.cfg.batch.maxQueueSize) {\n this.cfg.logger.warn?.(\"[clocknext] queue full — dropping signal\");\n this.cfg.onDrop?.(item.signal, \"queue_full\");\n return;\n }\n this.queue.push(item);\n if (this.queue.size() >= this.cfg.batch.maxSize) void this.flush();\n else this.arm();\n }\n\n /** Arm the interval timer if it isn't already running. */\n private arm(): void {\n if (this.timer || this.closed) return;\n this.timer = setTimeout(() => {\n this.timer = null;\n void this.flush();\n }, this.cfg.batch.maxIntervalMs);\n // Don't keep the event loop alive just for the flush timer.\n (this.timer as { unref?: () => void }).unref?.();\n }\n\n /**\n * Send everything currently buffered. Overlapping calls share the single\n * in-progress drain, so total in-flight sends never exceed `maxConcurrency`.\n */\n flush(): Promise<void> {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n if (!this.draining) {\n this.draining = this.drain().finally(() => {\n this.draining = null;\n });\n }\n return this.draining;\n }\n\n /** Drain the buffer in concurrency-bounded waves until it's empty. */\n private async drain(): Promise<void> {\n let sent = 0;\n while (this.queue.size() > 0) {\n const wave = this.queue.take(this.cfg.batch.maxConcurrency);\n const results = await Promise.all(wave.map((item) => this.send(item)));\n sent += results.filter(Boolean).length;\n }\n if (sent > 0) this.cfg.onFlush?.(sent);\n }\n\n /** Send one item; never throws — failures surface via onError/onDrop. */\n private async send(item: QueuedSignal): Promise<boolean> {\n try {\n await this.transport.request({\n method: \"POST\",\n path: \"/api/v1/usage\",\n body: item.body,\n idempotencyKey: item.idempotencyKey,\n });\n return true;\n } catch (error) {\n this.cfg.onError?.(error, item.signal);\n this.cfg.onDrop?.(item.signal, \"send_failed\");\n return false;\n }\n }\n\n get size(): number {\n return this.queue.size();\n }\n\n /** Flush remaining signals, then refuse further enqueues. */\n async close(): Promise<void> {\n this.closed = true;\n await this.flush();\n }\n}\n","/**\n * Typed error hierarchy. The server returns `{ ok: false, error }` with a\n * meaningful HTTP status; we map that status to a class so callers can branch\n * on the *kind* of failure (e.g. allowance exhausted ⇒ upsell; network ⇒ ignore,\n * it's queued) rather than string-matching messages.\n */\n\nexport class ClockNextError extends Error {\n /** HTTP status, when the failure came from a server response. */\n readonly status?: number;\n /** The idempotency key of the offending signal, when applicable. */\n readonly idempotencyKey?: string;\n /** Whether the SDK considers this failure worth retrying. */\n readonly retryable: boolean;\n\n constructor(\n message: string,\n opts: { status?: number; idempotencyKey?: string; retryable?: boolean } = {},\n ) {\n super(message);\n this.name = new.target.name;\n this.status = opts.status;\n this.idempotencyKey = opts.idempotencyKey;\n this.retryable = opts.retryable ?? false;\n // Restore prototype chain for instanceof across transpile targets.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** 401 — missing / invalid / expired API key. */\nexport class AuthError extends ClockNextError {}\n\n/** 400 — malformed request / schema validation failure. */\nexport class ValidationError extends ClockNextError {}\n\n/** 404 — unknown customer (also returned for cross-org access). */\nexport class NotFoundError extends ClockNextError {}\n\n/** 422 — no active plan, meter not in plan, model not enabled, member missing. */\nexport class PlanError extends ClockNextError {}\n\n/** 422 — insufficient credits / units / outcomes for the call. */\nexport class AllowanceError extends ClockNextError {}\n\n/** 409 — conflict (e.g. idempotency-key reuse with a different payload). */\nexport class ConflictError extends ClockNextError {}\n\n/** 429 — rate limited. */\nexport class RateLimitError extends ClockNextError {\n readonly retryAfterMs?: number;\n constructor(\n message: string,\n opts: { idempotencyKey?: string; retryAfterMs?: number } = {},\n ) {\n super(message, { status: 429, idempotencyKey: opts.idempotencyKey, retryable: true });\n this.retryAfterMs = opts.retryAfterMs;\n }\n}\n\n/** 5xx — server-side error. */\nexport class ServerError extends ClockNextError {}\n\n/** fetch threw / request timed out — request never completed. */\nexport class NetworkError extends ClockNextError {\n constructor(message: string, opts: { idempotencyKey?: string } = {}) {\n super(message, { idempotencyKey: opts.idempotencyKey, retryable: true });\n }\n}\n\n/**\n * Maps a server response (status + parsed `error` message) to a typed error.\n * 422 is split into AllowanceError vs PlanError by sniffing the message, since\n * the server uses the same status for both.\n */\nexport function errorFromResponse(\n status: number,\n message: string,\n idempotencyKey?: string,\n retryAfterMs?: number,\n): ClockNextError {\n const msg = message || `Request failed with status ${status}.`;\n const opts = { status, idempotencyKey };\n\n if (status === 400) return new ValidationError(msg, opts);\n if (status === 401) return new AuthError(msg, opts);\n if (status === 404) return new NotFoundError(msg, opts);\n if (status === 409) return new ConflictError(msg, { ...opts, retryable: true });\n if (status === 422) {\n return /insufficient/i.test(msg)\n ? new AllowanceError(msg, opts)\n : new PlanError(msg, opts);\n }\n if (status === 429) return new RateLimitError(msg, { idempotencyKey, retryAfterMs });\n if (status >= 500) return new ServerError(msg, { ...opts, retryable: true });\n return new ClockNextError(msg, opts);\n}\n","import { ClockNextError } from \"./errors.js\";\n\n/**\n * Retry classification + backoff. Mirrors the convergent industry policy\n * (Stripe / Stainless clients): retry transient transport failures\n * (network, timeout, 408/409/429/5xx); never retry deterministic 4xx\n * (400/401/404 and 422 validation/plan/allowance). Exponential backoff with\n * full jitter, honoring a server `Retry-After`.\n */\n\n/** Whether an error should be retried. NetworkError/Server/RateLimit/Conflict\n * carry `retryable: true`; everything else is permanent. */\nexport function isRetryable(error: unknown): boolean {\n return error instanceof ClockNextError && error.retryable;\n}\n\n/** Parses `Retry-After` (seconds or HTTP-date) and `retry-after-ms` headers. */\nexport function parseRetryAfter(headers: Headers): number | undefined {\n const ms = headers.get(\"retry-after-ms\");\n if (ms) {\n const n = Number(ms);\n if (Number.isFinite(n) && n >= 0) return n;\n }\n const ra = headers.get(\"retry-after\");\n if (ra) {\n const secs = Number(ra);\n if (Number.isFinite(secs)) return Math.max(0, secs * 1000);\n const date = Date.parse(ra);\n if (!Number.isNaN(date)) return Math.max(0, date - Date.now());\n }\n return undefined;\n}\n\n/**\n * Backoff for a given attempt (1-based). Exponential `base * 2^(attempt-1)`,\n * capped at `maxDelayMs`, with equal jitter (×[0.5, 1.0]). A server-provided\n * `retryAfterMs` overrides the computed value.\n */\nexport function computeBackoff(\n attempt: number,\n opts: { baseDelayMs: number; maxDelayMs: number },\n retryAfterMs?: number,\n rand: () => number = Math.random,\n): number {\n if (retryAfterMs != null) return Math.min(retryAfterMs, opts.maxDelayMs);\n const raw = opts.baseDelayMs * Math.pow(2, Math.max(0, attempt - 1));\n const capped = Math.min(raw, opts.maxDelayMs);\n // Equal jitter: a random point in [0.5, 1.0] of the capped delay.\n return Math.round(capped * (0.5 + rand() * 0.5));\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { NetworkError, RateLimitError, errorFromResponse } from \"./errors.js\";\nimport { computeBackoff, isRetryable, parseRetryAfter, sleep } from \"./retry.js\";\nimport type { ResolvedConfig } from \"./types.js\";\n\n/** Bumped on release; sent in the User-Agent for server-side debugging. */\nconst SDK_VERSION = \"0.1.0\";\n\ninterface RequestOptions {\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\";\n path: string;\n query?: Record<string, string | number | undefined>;\n body?: unknown;\n /** Reused across retries — what makes a retried write safe. */\n idempotencyKey?: string;\n /** Disable retries for this call (rarely needed). */\n retry?: boolean;\n}\n\n/**\n * The single HTTP seam. Builds the authenticated request, enforces a timeout,\n * unwraps the `{ ok, ... }` envelope, maps failures to typed errors, and retries\n * transient ones with backoff + jitter — reusing the same idempotency key on\n * every attempt.\n */\nexport class Transport {\n constructor(private readonly cfg: ResolvedConfig) {}\n\n async request<T = unknown>(opts: RequestOptions): Promise<T> {\n const url = this.buildUrl(opts.path, opts.query);\n // Only auto-retry replay-safe requests: reads (GET), idempotent deletes,\n // and writes carrying an Idempotency-Key. This keeps a transient failure\n // from duplicating a non-idempotent write (e.g. customers.create).\n const replaySafe =\n opts.method === \"GET\" ||\n opts.method === \"DELETE\" ||\n opts.idempotencyKey != null;\n const maxAttempts =\n opts.retry === false || !replaySafe ? 1 : this.cfg.retry.maxAttempts;\n\n let attempt = 0;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n attempt++;\n try {\n return await this.once<T>(url, opts);\n } catch (error) {\n const canRetry = attempt < maxAttempts && isRetryable(error);\n if (!canRetry) throw error;\n const retryAfterMs =\n error instanceof RateLimitError ? error.retryAfterMs : undefined;\n const delayMs = computeBackoff(attempt, this.cfg.retry, retryAfterMs);\n this.cfg.onRetry?.({ attempt, delayMs, error });\n this.cfg.logger.debug?.(\n `[clocknext] retry ${attempt}/${maxAttempts - 1} in ${delayMs}ms`,\n error instanceof Error ? error.message : error,\n );\n await sleep(delayMs);\n }\n }\n }\n\n /** One attempt: fetch + timeout + envelope/status handling. */\n private async once<T>(url: string, opts: RequestOptions): Promise<T> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.cfg.timeoutMs);\n\n let res: Response;\n try {\n res = await this.cfg.fetch(url, {\n method: opts.method,\n headers: this.headers(opts),\n body: opts.body === undefined ? undefined : JSON.stringify(opts.body),\n signal: controller.signal,\n });\n } catch (err) {\n const message =\n controller.signal.aborted\n ? `Request to ${opts.path} timed out after ${this.cfg.timeoutMs}ms.`\n : `Network error calling ${opts.path}: ${\n err instanceof Error ? err.message : String(err)\n }`;\n throw new NetworkError(message, { idempotencyKey: opts.idempotencyKey });\n } finally {\n clearTimeout(timer);\n }\n\n const text = await res.text();\n let json: unknown = undefined;\n if (text) {\n try {\n json = JSON.parse(text);\n } catch {\n // Non-JSON body — only an error if the status is also bad.\n }\n }\n\n // Two envelope shapes coexist during the v1 migration:\n // new: { statusCode, statusDetail: { status, message }, result }\n // old: { ok: boolean, error?, ...payload }\n const obj = (json ?? {}) as Record<string, unknown>;\n const isNew = typeof obj === \"object\" && obj !== null && \"statusDetail\" in obj;\n\n if (isNew) {\n const detail = obj.statusDetail as\n | { status?: string; message?: string }\n | undefined;\n if (res.ok && detail?.status === \"SUCCESS\") {\n return ((obj.result as T | undefined) ?? ({} as T));\n }\n const message =\n detail?.message ?? `Request failed with status ${res.status}.`;\n throw errorFromResponse(\n res.status,\n message,\n opts.idempotencyKey,\n parseRetryAfter(res.headers),\n );\n }\n\n // Old envelope.\n const envelope = obj as { ok?: boolean; error?: string };\n if (res.ok && envelope.ok !== false) {\n return envelope as T;\n }\n const message =\n envelope.error ?? text ?? `Request failed with status ${res.status}.`;\n throw errorFromResponse(\n res.status,\n message,\n opts.idempotencyKey,\n parseRetryAfter(res.headers),\n );\n }\n\n private headers(opts: RequestOptions): Record<string, string> {\n const h: Record<string, string> = {\n Authorization: `Bearer ${this.cfg.apiKey}`,\n \"User-Agent\": `clocknext-sdk-js/${SDK_VERSION}`,\n };\n if (opts.body !== undefined) h[\"Content-Type\"] = \"application/json\";\n if (opts.idempotencyKey) h[\"Idempotency-Key\"] = opts.idempotencyKey;\n return h;\n }\n\n private buildUrl(\n path: string,\n query?: Record<string, string | number | undefined>,\n ): string {\n // baseUrl already has trailing slashes stripped in resolveConfig.\n let url = `${this.cfg.baseUrl}${path}`;\n if (query) {\n const params = new URLSearchParams();\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined && v !== \"\") params.set(k, String(v));\n }\n const qs = params.toString();\n if (qs) url += `?${qs}`;\n }\n return url;\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type {\n ApiCustomer,\n CreateCustomerInput,\n CustomerBalances,\n CustomerList,\n CustomerPlan,\n CustomerProfileInput,\n CustomerRevenue,\n RevenueRange,\n UsageList,\n} from \"../types.js\";\n\n/**\n * The `customers` resource — full CRUD over the org's customers plus the\n * read-only insight endpoints (usage / balances / plan / revenue). Every call\n * is scoped to the API key's organisation server-side; a customer in another\n * org resolves as a NotFoundError.\n */\nexport class Customers {\n constructor(private readonly transport: Transport) {}\n\n /** Create a customer. `POST /api/v1/customers`. */\n async create(input: CreateCustomerInput): Promise<ApiCustomer> {\n const res = await this.transport.request<{ customer: ApiCustomer }>({\n method: \"POST\",\n path: \"/api/v1/customers\",\n body: input,\n });\n return res.customer;\n }\n\n /** List customers, most-recent first (cursor-paginated). `GET /api/v1/customers`. */\n async list(params: {\n limit?: number;\n q?: string;\n cursor?: string;\n } = {}): Promise<CustomerList> {\n const res = await this.transport.request<CustomerList & { ok: true }>({\n method: \"GET\",\n path: \"/api/v1/customers\",\n query: { limit: params.limit, q: params.q, cursor: params.cursor },\n });\n return { customers: res.customers, nextCursor: res.nextCursor };\n }\n\n /**\n * Async iterator over ALL customers, transparently following the cursor.\n * `for await (const c of cnk.customers.iterate()) { … }`\n */\n async *iterate(params: { limit?: number; q?: string } = {}): AsyncGenerator<\n ApiCustomer\n > {\n let cursor: string | undefined;\n do {\n const page = await this.list({ ...params, cursor });\n for (const c of page.customers) yield c;\n cursor = page.nextCursor ?? undefined;\n } while (cursor);\n }\n\n /** Fetch one customer. `GET /api/v1/customers/:id`. */\n async get(id: string): Promise<ApiCustomer> {\n const res = await this.transport.request<{ customer: ApiCustomer }>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}`,\n });\n return res.customer;\n }\n\n /** Update a customer (partial). `PATCH /api/v1/customers/:id`. */\n async update(\n id: string,\n input: CustomerProfileInput,\n ): Promise<ApiCustomer> {\n const res = await this.transport.request<{ customer: ApiCustomer }>({\n method: \"PATCH\",\n path: `/api/v1/customers/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.customer;\n }\n\n /** Delete a customer (members, invitations, usage logs cascade). */\n async delete(id: string): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/customers/${encodeURIComponent(id)}`,\n });\n }\n\n /** A customer's usage history. `GET /api/v1/customers/:id/usage`. */\n async usage(id: string, params: { limit?: number } = {}): Promise<UsageList> {\n const res = await this.transport.request<UsageList & { ok: true }>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/usage`,\n query: { limit: params.limit },\n });\n return { customer: res.customer, totals: res.totals, logs: res.logs };\n }\n\n /** Wallet / credit / outcome / unit balances. `GET …/:id/balances`. */\n balances(id: string): Promise<CustomerBalances> {\n return this.transport.request<CustomerBalances>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/balances`,\n });\n }\n\n /** The customer's current plan. `GET …/:id/plan`. */\n plan(id: string): Promise<CustomerPlan> {\n return this.transport.request<CustomerPlan>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/plan`,\n });\n }\n\n /** Revenue / cost / profit / margin over a window. `GET …/:id/revenue`. */\n revenue(\n id: string,\n params: { range?: RevenueRange } = {},\n ): Promise<CustomerRevenue> {\n return this.transport.request<CustomerRevenue>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/revenue`,\n query: { range: params.range },\n });\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type { PortalToken, PortalTokenInput } from \"../types.js\";\n\n/**\n * The `portal` resource — mint a short-lived embed token for one of your\n * customers, then render `<iframe src=\".../portal/embed?token=<token>\">`. The\n * HS256 signing secret never leaves ClockNext; your backend only needs its API\n * key. `POST /api/v1/portal/token`.\n */\nexport class Portal {\n constructor(private readonly transport: Transport) {}\n\n async createToken(input: PortalTokenInput): Promise<PortalToken> {\n const res = await this.transport.request<\n { token: string; expiresAt: number; expiresIn: number }\n >({\n method: \"POST\",\n path: \"/api/v1/portal/token\",\n body: {\n customerId: input.customerId,\n ttlSeconds: input.ttlSeconds,\n memberEmail: input.memberEmail,\n },\n });\n return {\n token: res.token,\n expiresAt: res.expiresAt,\n expiresIn: res.expiresIn,\n };\n }\n}\n","/**\n * Generates a stable idempotency key for one logical event. Generated ONCE at\n * enqueue/track time and reused across every retry of that event — regenerating\n * per HTTP attempt would defeat dedup (the documented foot-gun in most usage\n * SDKs).\n *\n * Uses the Web Crypto global (`globalThis.crypto`), which is present on Node 18+\n * and every edge runtime — and, unlike a static `node:crypto` import, never\n * fails to load on runtimes that lack Node built-ins. Degrades through\n * `getRandomValues` to `Math.random` so it always returns a v4 UUID.\n */\nexport function newIdempotencyKey(): string {\n const webcrypto = globalThis.crypto;\n if (webcrypto?.randomUUID) return webcrypto.randomUUID();\n\n const b = new Uint8Array(16);\n if (webcrypto?.getRandomValues) {\n webcrypto.getRandomValues(b);\n } else {\n for (let i = 0; i < 16; i++) b[i] = Math.floor(Math.random() * 256);\n }\n // RFC 4122 v4: set version (4) and variant (10xx) bits.\n b[6] = (b[6]! & 0x0f) | 0x40;\n b[8] = (b[8]! & 0x3f) | 0x80;\n\n const hex = Array.from(b, (n) => n.toString(16).padStart(2, \"0\")).join(\"\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n","import type { Transport } from \"../http.js\";\nimport type { Flusher } from \"../flusher.js\";\nimport { newIdempotencyKey } from \"../idempotency.js\";\nimport type {\n CreditInput,\n OutcomeInput,\n ResolvedConfig,\n Signal,\n TrackResult,\n UsageList,\n WalletInput,\n} from \"../types.js\";\n\n/** Builds the `POST /api/v1/usage` body from a typed Signal. */\nexport function signalToWire(signal: Signal): Record<string, unknown> {\n const body: Record<string, unknown> = {\n customerId: signal.customerId,\n type: signal.type,\n model: signal.model,\n };\n if (signal.member) body.member = signal.member;\n if (signal.status) body.status = signal.status;\n if (signal.custom) body.custom = signal.custom;\n if (signal.idempotencyKey) body.idempotencyKey = signal.idempotencyKey;\n\n const t = signal.tokens;\n if (t) {\n if (t.input != null) body.inputTokens = t.input;\n if (t.output != null) body.outputTokens = t.output;\n if (t.cache != null) body.cacheTokens = t.cache;\n }\n\n // credit + outcome both resolve their target via the stable `key`.\n if (signal.type === \"credit\" || signal.type === \"outcome\") {\n body.key = signal.key;\n }\n return body;\n}\n\n/**\n * The `signals` resource: record usage signals and read them back.\n *\n * In async mode (default), `track()` buffers the signal and returns immediately\n * with `{ queued: true }`. Pass `{ wait: true }` (or construct the client in\n * `sync` mode) to await the send and receive the computed `usageLog`.\n */\nexport class Signals {\n constructor(\n private readonly transport: Transport,\n private readonly flusher: Flusher,\n private readonly cfg: ResolvedConfig,\n ) {}\n\n async track(\n signal: Signal,\n opts: { wait?: boolean } = {},\n ): Promise<TrackResult> {\n const idempotencyKey = signal.idempotencyKey ?? newIdempotencyKey();\n const body = signalToWire({ ...signal, idempotencyKey });\n\n const sendNow = opts.wait || this.cfg.mode === \"sync\";\n if (!sendNow) {\n this.flusher.enqueue({ body, idempotencyKey, signal });\n return { idempotencyKey, queued: true };\n }\n\n const res = await this.transport.request<{\n usageLog?: TrackResult[\"usageLog\"];\n }>({\n method: \"POST\",\n path: \"/api/v1/usage\",\n body,\n idempotencyKey,\n });\n return {\n idempotencyKey,\n queued: false,\n usageLog: res.usageLog ?? null,\n };\n }\n\n /** Meter a named credit. */\n credit(input: CreditInput, opts?: { wait?: boolean }): Promise<TrackResult> {\n return this.track({ ...input, type: \"credit\" }, opts);\n }\n\n /** Debit the customer's wallet at model cost. */\n wallet(input: WalletInput, opts?: { wait?: boolean }): Promise<TrackResult> {\n return this.track({ ...input, type: \"wallet\" }, opts);\n }\n\n /** Advance one step of an outcome workflow. */\n outcome(\n input: OutcomeInput,\n opts?: { wait?: boolean },\n ): Promise<TrackResult> {\n return this.track({ ...input, type: \"outcome\" }, opts);\n }\n\n /** Recent usage logs + totals for a customer. `GET /api/v1/usage`. */\n async list(params: {\n customerId: string;\n limit?: number;\n }): Promise<UsageList> {\n const res = await this.transport.request<UsageList & { ok: true }>({\n method: \"GET\",\n path: \"/api/v1/usage\",\n query: { customerId: params.customerId, limit: params.limit },\n });\n return { customer: res.customer, totals: res.totals, logs: res.logs };\n }\n}\n","import { resolveConfig } from \"./config.js\";\nimport { Flusher } from \"./flusher.js\";\nimport { Transport } from \"./http.js\";\nimport { Customers } from \"./resources/customers.js\";\nimport { Portal } from \"./resources/portal.js\";\nimport { Signals } from \"./resources/signals.js\";\nimport type { ClockNextConfig, ResolvedConfig } from \"./types.js\";\n\n/**\n * The ClockNext client.\n *\n * ```ts\n * const cnk = new ClockNext({ apiKey: process.env.CLOCKNEXT_API_KEY! });\n *\n * await cnk.signals.credit({\n * customerId: \"cus_123\",\n * model: \"gpt-4o\", // catalog model id\n * key: \"api_credit\", // the credit's stable key\n * tokens: { input: 1200, output: 340 },\n * });\n *\n * // before a serverless function returns / on shutdown:\n * await cnk.flush();\n * ```\n */\nexport class ClockNext {\n /** Record + read usage signals. */\n readonly signals: Signals;\n /** Manage customers and read their insights. */\n readonly customers: Customers;\n /** Mint customer-portal embed tokens. */\n readonly portal: Portal;\n\n private readonly cfg: ResolvedConfig;\n private readonly flusher: Flusher;\n\n constructor(config: ClockNextConfig) {\n this.cfg = resolveConfig(config);\n\n if (typeof window !== \"undefined\") {\n this.cfg.logger.warn?.(\n \"[clocknext] Running in a browser exposes your secret API key. Use this SDK only on a server/backend.\",\n );\n }\n\n const transport = new Transport(this.cfg);\n this.flusher = new Flusher(transport, this.cfg);\n this.signals = new Signals(transport, this.flusher, this.cfg);\n this.customers = new Customers(transport);\n this.portal = new Portal(transport);\n }\n\n /** Number of signals currently buffered (async mode). */\n get pending(): number {\n return this.flusher.size;\n }\n\n /** Force-send all buffered signals now. Await before a serverless return. */\n flush(): Promise<void> {\n return this.flusher.flush();\n }\n\n /** Flush and stop the background timer. Call on graceful shutdown. */\n close(): Promise<void> {\n return this.flusher.close();\n }\n}\n"]}
|