@productcraft/core 1.0.1 → 1.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/dist/index.cjs CHANGED
@@ -9,7 +9,7 @@ var createClient__default = /*#__PURE__*/_interopDefault(createClient);
9
9
  // src/legacy.ts
10
10
 
11
11
  // src/version.ts
12
- var CORE_VERSION = "1.0.1" ;
12
+ var CORE_VERSION = "1.1.0" ;
13
13
 
14
14
  // src/legacy.ts
15
15
  var PC_BASE_URL = {
@@ -335,20 +335,37 @@ var Page = class {
335
335
  has_more;
336
336
  next_cursor;
337
337
  #fetchPage;
338
- constructor(body, fetchPage) {
338
+ #usedCursors;
339
+ /**
340
+ * @param usedCursors The cursors already sent to reach this page (this
341
+ * page's own included). A `next_cursor` among them means the API is
342
+ * handing back a page it already returned, and following it would loop.
343
+ */
344
+ constructor(body, fetchPage, usedCursors = []) {
339
345
  this.data = Array.isArray(body?.data) ? body.data : [];
340
346
  this.next_cursor = body?.pagination?.next_cursor ?? null;
341
347
  this.has_more = Boolean(body?.pagination?.has_more) && this.next_cursor !== null;
342
348
  this.#fetchPage = fetchPage;
349
+ this.#usedCursors = new Set(usedCursors);
343
350
  }
344
351
  hasNextPage() {
345
352
  return this.has_more;
346
353
  }
347
- /** Fetch the following page. Throws when there is none (check `hasNextPage()` first). */
354
+ /**
355
+ * Fetch the following page. Throws when there is none (check `hasNextPage()` first),
356
+ * and when the API returns a `next_cursor` this walk already sent: that would
357
+ * fetch the same page forever, so `for await` stops with an error instead.
358
+ */
348
359
  getNextPage() {
349
360
  if (!this.has_more || this.next_cursor === null) {
350
361
  throw new ProductCraftError("No next page; check hasNextPage() before calling getNextPage().");
351
362
  }
363
+ if (this.#usedCursors.has(this.next_cursor)) {
364
+ const requestId = this.lastResponse?.requestId;
365
+ throw new ProductCraftError(
366
+ "The API returned a next_cursor this list already used, so the next page would repeat an earlier one. Stopped instead of looping; this is an API bug" + (requestId ? ` (request id ${requestId}).` : ".")
367
+ );
368
+ }
352
369
  return this.#fetchPage(this.next_cursor);
353
370
  }
354
371
  /** The wire shape, so `JSON.stringify(page)` matches the API response. */
@@ -535,6 +552,34 @@ async function verifyWebhook(params) {
535
552
  throw new WebhookVerificationError("Webhook payload is not valid JSON.", { cause });
536
553
  }
537
554
  }
555
+ async function signWebhook(params) {
556
+ const { secret } = params;
557
+ if (typeof secret !== "string" || secret === "") throw new WebhookVerificationError("No webhook secret was given.");
558
+ const raw = params.payload;
559
+ const payload = typeof raw === "string" ? raw : raw instanceof Uint8Array || raw instanceof ArrayBuffer ? decoder.decode(raw) : JSON.stringify(raw);
560
+ const id = params.id ?? `msg_${randomHex(16)}`;
561
+ const timestamp = Math.floor(params.timestamp ?? Date.now() / 1e3);
562
+ const mac = await hmacSha256(standardKey(secret), encoder.encode(`${id}.${timestamp}.${payload}`));
563
+ return {
564
+ payload,
565
+ headers: {
566
+ "content-type": "application/json",
567
+ "webhook-id": id,
568
+ "webhook-timestamp": String(timestamp),
569
+ "webhook-signature": `v1,${bytesToBase64(mac)}`
570
+ }
571
+ };
572
+ }
573
+ function bytesToBase64(bytes) {
574
+ let bin = "";
575
+ for (const b of bytes) bin += String.fromCharCode(b);
576
+ return btoa(bin);
577
+ }
578
+ function randomHex(bytes) {
579
+ const buf = new Uint8Array(bytes);
580
+ globalThis.crypto.getRandomValues(buf);
581
+ return [...buf].map((b) => b.toString(16).padStart(2, "0")).join("");
582
+ }
538
583
 
539
584
  // src/client.ts
540
585
  var DEFAULT_TIMEOUT_MS = 6e4;
@@ -649,15 +694,16 @@ var APIClient = class {
649
694
  }
650
695
  /** A paginated list call. `await` for one page, `for await` for every item. */
651
696
  list(spec, options = {}) {
652
- const at = (cursor) => {
697
+ const at = (cursor, used) => {
653
698
  const pageSpec = cursor === void 0 ? spec : { ...spec, query: { ...spec.query, cursor } };
654
699
  return new PagePromise(this.#send(pageSpec, options), async (raw) => {
655
700
  const body = await this.#parseBody(pageSpec, raw);
656
- const page = new Page(body, (next) => at(next));
701
+ const page = new Page(body, (next) => at(next, [...used, next]), used);
657
702
  return attachLastResponse(page, this.#meta(raw));
658
703
  });
659
704
  };
660
- return at();
705
+ const first = spec.query?.cursor;
706
+ return at(void 0, typeof first === "string" && first !== "" ? [first] : []);
661
707
  }
662
708
  /** Retrieve repeatedly until `config.field` reaches a terminal value. */
663
709
  async poll(spec, config, options = {}) {
@@ -698,6 +744,17 @@ var APIClient = class {
698
744
  }
699
745
  return verifyWebhook({ ...params, secret });
700
746
  }
747
+ /** Sign a test payload with `params.secret`, else `webhookSecret`, else `envVar` (`webhooks.sign`). */
748
+ async signWebhook(params, envVar) {
749
+ const fallback = Array.isArray(this.webhookSecret) ? this.webhookSecret[0] : this.webhookSecret;
750
+ const secret = params.secret ?? fallback ?? (envVar ? readEnv(envVar) : void 0);
751
+ if (!secret) {
752
+ throw new ConfigurationError(
753
+ `No webhook secret: pass { secret }, set webhookSecret on the client${envVar ? ` or ${envVar}` : ""}.`
754
+ );
755
+ }
756
+ return signWebhook({ ...params, secret });
757
+ }
701
758
  #meta(raw) {
702
759
  return { requestId: raw.requestId, status: raw.response.status, headers: raw.response.headers };
703
760
  }
@@ -899,6 +956,7 @@ exports.parseRateLimit = parseRateLimit;
899
956
  exports.parseRetryAfterMs = parseRetryAfterMs;
900
957
  exports.readEnv = readEnv;
901
958
  exports.resolveAuth = resolveAuth;
959
+ exports.signWebhook = signWebhook;
902
960
  exports.timingSafeEqual = timingSafeEqual;
903
961
  exports.verifyWebhook = verifyWebhook;
904
962
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/version.ts","../src/legacy.ts","../src/errors.ts","../src/api-promise.ts","../src/pagination.ts","../src/webhooks.ts","../src/client.ts"],"names":["createClient","body","error","wait"],"mappings":"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","file":"index.cjs","sourcesContent":["declare const __PC_CORE_VERSION__: string | undefined;\n\n/** This package's version, injected at build time from package.json. */\nexport const CORE_VERSION: string =\n typeof __PC_CORE_VERSION__ === \"string\" ? __PC_CORE_VERSION__ : \"0.0.0-dev\";\n","/**\n * The 0.x primitives: credential types, environment helpers, base URLs\n * and the `openapi-fetch` client builder behind every product's\n * `.client` escape hatch. Kept exported for compatibility; new code\n * goes through `APIClient` (see `client.ts`).\n */\n\nimport createClient, { type Client, type Middleware } from \"openapi-fetch\";\nimport { CORE_VERSION } from \"./version.js\";\n\n/**\n * The auth credential the SDK presents to ProductCraft APIs.\n *\n * - `apiKey` — Platform API Key (`pcft_live_*`). Server-side only;\n * never embed in a shipped browser bundle.\n * - `bearer` — pre-resolved JWT (e.g. an Auth app-scoped EndUser\n * token your backend minted and shipped to the device).\n * - `cookie` — captured `auth_token` cookie value. Mostly useful in\n * dev / E2E tests where you've already signed in.\n */\nexport type PCAuth =\n | { type: \"apiKey\"; key: string }\n | { type: \"bearer\"; token: string }\n | { type: \"cookie\"; value: string };\n\nexport interface PCClientConfig {\n /**\n * Credential for every request. Server-side, omit it to fall back to\n * the `PRODUCTCRAFT_API_KEY` environment variable (your `pcft_`\n * workspace key). An explicit value always wins over the environment.\n */\n auth?: PCAuth;\n /** Override the prod base URL — useful for dev / staging. */\n baseUrl?: string;\n /** Custom fetch (e.g. node-fetch with retries, undici, ...). */\n fetch?: typeof fetch;\n}\n\n/**\n * Default prod base URL per surface.\n *\n * Keys use the rebranded product names (Auth, Mail, Waitlist, Social)\n * matching the package + class names since the 2026-07 SDK rename.\n * Prior releases (`@productcraft/heimdall` 0.x etc.) exposed the same\n * hosts under the old keys (heimdall/envoi/rally/agora).\n */\nexport const PC_BASE_URL = {\n // platformAuth is the platform identity layer (workspaces, PATs);\n // it vacated api.auth so the customer-facing Auth product could\n // take that host.\n platformAuth: \"https://api.platform-auth.productcraft.co\",\n auth: \"https://api.auth.productcraft.co\",\n mail: \"https://api.mail.productcraft.co\",\n waitlist: \"https://api.waitlist.productcraft.co\",\n social: \"https://social.productcraft.co\",\n trawl: \"https://api.trawl.productcraft.co\",\n} as const;\n\n/** Environment variable holding the `pcft_` workspace API key. */\nexport const PC_API_KEY_ENV = \"PRODUCTCRAFT_API_KEY\";\n/** Environment variable holding the default Auth app slug for `auth.consumer()`. */\nexport const PC_AUTH_APP_ENV = \"PRODUCTCRAFT_AUTH_APP\";\n\n/**\n * Read an environment variable when running somewhere with a `process`\n * global (Node, Bun, Deno's Node compat). Returns `undefined` in the\n * browser or edge runtimes without `process`, and for empty values.\n * Never throws.\n */\nexport function readEnv(name: string): string | undefined {\n const proc = (globalThis as { process?: { env?: Record<string, string | undefined> } })\n .process;\n if (typeof proc === \"undefined\" || !proc || !proc.env) return undefined;\n const value = proc.env[name];\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed === \"\" ? undefined : trimmed;\n}\n\n/**\n * Resolve the credential a server-side client should present: the\n * explicit `auth` when given, otherwise `PRODUCTCRAFT_API_KEY` from the\n * environment, otherwise none. Hosts are never read from the\n * environment; override them in code with `baseUrl`.\n */\nexport function resolveAuth(auth: PCAuth | undefined): PCAuth | undefined {\n if (auth) return auth;\n const key = readEnv(PC_API_KEY_ENV);\n return key ? { type: \"apiKey\", key } : undefined;\n}\n\n/**\n * Build an `openapi-fetch` middleware that adds the configured auth\n * credential as a header on every outbound request.\n */\nexport function authMiddleware(auth: PCAuth | undefined): Middleware {\n return {\n async onRequest({ request }) {\n if (!auth) return undefined;\n switch (auth.type) {\n case \"apiKey\":\n request.headers.set(\"Authorization\", `Bearer ${auth.key}`);\n break;\n case \"bearer\":\n request.headers.set(\"Authorization\", `Bearer ${auth.token}`);\n break;\n case \"cookie\":\n request.headers.set(\"Cookie\", `auth_token=${auth.value}`);\n break;\n }\n return request;\n },\n };\n}\n\n/**\n * Construct an `openapi-fetch` client for a surface. Each surface\n * package calls this with its own generated `paths` type and default\n * base URL. The returned client is the v0 surface — every endpoint is\n * reachable through `client.GET(...)`, `client.POST(...)`, etc.\n *\n * When `config.auth` is omitted the client falls back to\n * `PRODUCTCRAFT_API_KEY` (see `resolveAuth`).\n *\n * @deprecated Build the runtime with `new APIClient(options, baseUrl)`\n * and take the typed escape hatch from `createOpenAPIClient<paths>(apiClient)`,\n * which shares its credential and base URL. Kept for the 0.x product\n * packages; removed no earlier than core 2.0.\n */\nexport function makeClient<TPaths extends object>(\n defaultBaseUrl: string,\n config: PCClientConfig = {},\n): Client<TPaths> {\n const client = createClient<TPaths>({\n baseUrl: config.baseUrl ?? defaultBaseUrl,\n fetch: config.fetch,\n });\n client.use(authMiddleware(resolveAuth(config.auth)));\n client.use(userAgentMiddleware());\n return client;\n}\n\n/**\n * Identify `.client` calls as the SDK (`productcraft-node/core@<version>\n * node/<version>`), as `APIClient` does, outside the browser (where\n * `User-Agent` cannot be set) and unless the caller set one. APIs key\n * SDK-only behaviour on it: Platform's `GET …/api-keys` always answers\n * the paged envelope the generated types describe to an SDK.\n */\nfunction userAgentMiddleware(): Middleware {\n const g = globalThis as {\n window?: { document?: unknown };\n navigator?: unknown;\n process?: { versions?: { node?: string } };\n };\n const browser = typeof g.window?.document !== \"undefined\" && typeof g.navigator !== \"undefined\";\n const node = g.process?.versions?.node;\n const userAgent = `productcraft-node/core@${CORE_VERSION}${node ? ` node/${node}` : \"\"}`;\n return {\n onRequest({ request }) {\n if (browser || request.headers.has(\"user-agent\")) return undefined;\n request.headers.set(\"User-Agent\", userAgent);\n return request;\n },\n };\n}\n","/**\n * The error hierarchy every ProductCraft SDK throws.\n *\n * Every class is branded with `Symbol.for(\"productcraft.error.<Name>\")`\n * and answers `instanceof` through `static [Symbol.hasInstance]`, so a\n * check like `err instanceof NotFoundError` holds even when the error\n * was thrown by the CJS build and the check runs against the ESM build,\n * or when two copies of `@productcraft/core` are installed.\n */\n\n/** Base URL of the public error-code catalogue. */\nexport const ERROR_DOCS_URL = \"https://productcraft.co/docs/errors\";\n\n/** A string-literal union that also accepts values this SDK version does not know. */\nexport type OpenEnum<T extends string> = T | (string & {});\n\n/** One invalid request field, from the error envelope's `errors` list. */\nexport interface ErrorParam {\n /** The request field, e.g. `to` or `domains[0].name`. */\n param: string;\n message: string;\n code?: string;\n}\n\nconst brandKey = (name: string): symbol => Symbol.for(`productcraft.error.${name}`);\n\nfunction stamp(instance: object, ctor: unknown): void {\n // Walk the constructor chain and stamp one brand per class, so the\n // instance answers `instanceof` for itself and every ancestor.\n let current = ctor as { brandName?: string } | null;\n while (current && current !== Error && current !== Function.prototype) {\n if (Object.prototype.hasOwnProperty.call(current, \"brandName\") && current.brandName) {\n Object.defineProperty(instance, brandKey(current.brandName), {\n value: true,\n enumerable: false,\n });\n }\n current = Object.getPrototypeOf(current);\n }\n}\n\n/** Base class of every error the SDK throws. */\nexport class ProductCraftError extends Error {\n static readonly brandName: string = \"ProductCraftError\";\n\n static override [Symbol.hasInstance](instance: unknown): boolean {\n if (typeof instance !== \"object\" || instance === null) return false;\n return (instance as Record<symbol, unknown>)[brandKey(this.brandName)] === true;\n }\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n const ctor = new.target as unknown as { brandName: string };\n Object.defineProperty(this, \"name\", {\n value: ctor.brandName,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n stamp(this, new.target);\n }\n}\n\n/** The client was configured in a way that cannot work (missing `workspaceId`, a key in a browser, ...). */\nexport class ConfigurationError extends ProductCraftError {\n static override readonly brandName: string = \"ConfigurationError\";\n}\n\n/** A webhook payload failed signature or timestamp verification. */\nexport class WebhookVerificationError extends ProductCraftError {\n static override readonly brandName: string = \"WebhookVerificationError\";\n}\n\n/** The request never produced an HTTP response (DNS, TLS, reset connection, ...). */\nexport class APIConnectionError extends ProductCraftError {\n static override readonly brandName: string = \"APIConnectionError\";\n constructor(message = \"Connection error.\", options?: { cause?: unknown }) {\n super(message, options);\n }\n}\n\n/** An attempt (or a poll) ran past its timeout. */\nexport class APITimeoutError extends APIConnectionError {\n static override readonly brandName: string = \"APITimeoutError\";\n constructor(message = \"Request timed out.\", options?: { cause?: unknown }) {\n super(message, options);\n }\n}\n\n/** The caller's `AbortSignal` fired. Never retried. */\nexport class APIUserAbortError extends ProductCraftError {\n static override readonly brandName: string = \"APIUserAbortError\";\n constructor(message = \"Request was aborted.\", options?: { cause?: unknown }) {\n super(message, options);\n }\n}\n\ninterface ErrorEnvelope {\n message?: unknown;\n code?: unknown;\n request_id?: unknown;\n errors?: unknown;\n details?: unknown;\n error?: unknown;\n}\n\nfunction envelopeMessage(body: unknown, status: number): string {\n if (body && typeof body === \"object\") {\n const msg = (body as ErrorEnvelope).message;\n if (typeof msg === \"string\" && msg !== \"\") return msg;\n if (Array.isArray(msg) && msg.length > 0) return msg.map(String).join(\"; \");\n const err = (body as ErrorEnvelope).error;\n if (typeof err === \"string\" && err !== \"\") return err;\n }\n if (typeof body === \"string\" && body.trim() !== \"\" && body.length <= 500) return body.trim();\n return `${status} status code`;\n}\n\nfunction envelopeErrors(body: unknown): ErrorParam[] {\n if (!body || typeof body !== \"object\") return [];\n const list = (body as ErrorEnvelope).errors;\n if (!Array.isArray(list)) return [];\n return list\n .filter((e): e is Record<string, unknown> => !!e && typeof e === \"object\")\n .map((e) => {\n const out: ErrorParam = {\n param: typeof e.param === \"string\" ? e.param : \"\",\n message: typeof e.message === \"string\" ? e.message : \"\",\n };\n if (typeof e.code === \"string\") out.code = e.code;\n return out;\n });\n}\n\n/** A non-2xx HTTP response. Subclassed by status. */\nexport class APIError extends ProductCraftError {\n static override readonly brandName: string = \"APIError\";\n\n /** HTTP status of the response. */\n readonly status: number;\n /** Stable, machine-readable code from the error envelope (branch on this, not on `message`). */\n readonly code: string | undefined;\n /** Per-field validation errors from the envelope's `errors`; empty when absent. */\n readonly errors: ErrorParam[];\n /** The envelope's route-specific `details` object (e.g. `{ fqdn, reason }`), when present. */\n readonly details: Record<string, unknown> | undefined;\n /** `https://productcraft.co/docs/errors#<code>`, when there is a code. */\n readonly docUrl: string | undefined;\n /** `X-Request-Id` response header, else the envelope's `request_id`. Quote it to support. */\n readonly requestId: string | undefined;\n /** Response headers. */\n readonly headers: Headers;\n /** Parsed response body (JSON when it parses, otherwise the text). */\n readonly body: unknown;\n\n constructor(status: number, body: unknown, headers: Headers, message?: string) {\n super(message ?? envelopeMessage(body, status));\n this.status = status;\n this.headers = headers;\n this.body = body;\n const env = (body && typeof body === \"object\" ? body : {}) as ErrorEnvelope;\n this.code = typeof env.code === \"string\" && env.code !== \"\" ? env.code : undefined;\n this.errors = envelopeErrors(body);\n this.details =\n env.details && typeof env.details === \"object\" && !Array.isArray(env.details)\n ? (env.details as Record<string, unknown>)\n : undefined;\n this.docUrl = this.code ? `${ERROR_DOCS_URL}#${this.code}` : undefined;\n this.requestId =\n headers.get(\"x-request-id\") ??\n (typeof env.request_id === \"string\" ? env.request_id : undefined);\n }\n\n /** Build the right subclass for a status and envelope. */\n static generate(status: number, body: unknown, headers: Headers): APIError {\n const code =\n body && typeof body === \"object\" && typeof (body as ErrorEnvelope).code === \"string\"\n ? ((body as ErrorEnvelope).code as string)\n : undefined;\n switch (status) {\n case 400:\n return new BadRequestError(status, body, headers);\n case 401:\n return new AuthenticationError(status, body, headers);\n case 403:\n return new PermissionDeniedError(status, body, headers);\n case 404:\n return new NotFoundError(status, body, headers);\n case 409:\n return code === \"IDEMPOTENCY_KEY_REUSE\"\n ? new IdempotencyKeyReuseError(status, body, headers)\n : new ConflictError(status, body, headers);\n case 422:\n return new UnprocessableEntityError(status, body, headers);\n case 429:\n return new RateLimitError(status, body, headers);\n }\n if (status >= 500) return new InternalServerError(status, body, headers);\n return new APIError(status, body, headers);\n }\n}\n\nexport class BadRequestError extends APIError {\n static override readonly brandName: string = \"BadRequestError\";\n}\nexport class AuthenticationError extends APIError {\n static override readonly brandName: string = \"AuthenticationError\";\n}\nexport class PermissionDeniedError extends APIError {\n static override readonly brandName: string = \"PermissionDeniedError\";\n}\nexport class NotFoundError extends APIError {\n static override readonly brandName: string = \"NotFoundError\";\n}\nexport class ConflictError extends APIError {\n static override readonly brandName: string = \"ConflictError\";\n}\n/** 409 `IDEMPOTENCY_KEY_REUSE`: the same Idempotency-Key was sent with a different body. */\nexport class IdempotencyKeyReuseError extends ConflictError {\n static override readonly brandName: string = \"IdempotencyKeyReuseError\";\n}\nexport class UnprocessableEntityError extends APIError {\n static override readonly brandName: string = \"UnprocessableEntityError\";\n}\n/** 429. `retryAfter` is the server's `Retry-After`, in seconds, when sent. */\nexport class RateLimitError extends APIError {\n static override readonly brandName: string = \"RateLimitError\";\n readonly retryAfter: number | undefined;\n constructor(status: number, body: unknown, headers: Headers, message?: string) {\n super(status, body, headers, message);\n const ms = parseRetryAfterMs(headers, Date.now());\n this.retryAfter = ms === undefined ? undefined : ms / 1000;\n }\n}\n/** Any 5xx. */\nexport class InternalServerError extends APIError {\n static override readonly brandName: string = \"InternalServerError\";\n}\n\n/**\n * Milliseconds the server asked us to wait: `retry-after-ms`, else\n * `Retry-After` as seconds or an HTTP date. `undefined` when absent or\n * unparseable; negative dates clamp to 0.\n */\nexport function parseRetryAfterMs(headers: Headers, now: number): number | undefined {\n const ms = headers.get(\"retry-after-ms\");\n if (ms !== null && ms.trim() !== \"\") {\n const n = Number(ms);\n if (Number.isFinite(n) && n >= 0) return n;\n }\n const value = headers.get(\"retry-after\");\n if (value === null || value.trim() === \"\") return undefined;\n const seconds = Number(value);\n if (Number.isFinite(seconds)) return seconds >= 0 ? seconds * 1000 : undefined;\n const date = Date.parse(value);\n if (Number.isNaN(date)) return undefined;\n return Math.max(0, date - now);\n}\n","/**\n * `APIPromise`: what every SDK method returns. Await it for the parsed\n * body, or call `.withResponse()` / `.asResponse()` for the HTTP layer.\n */\n\n/** Metadata attached (non-enumerable) to every object an SDK method returns. */\nexport interface LastResponse {\n requestId: string | undefined;\n status: number;\n headers: Headers;\n}\n\n/** Parsed `X-RateLimit-*` headers. Fields are `undefined` when the header is absent. */\nexport interface RateLimitInfo {\n limit: number | undefined;\n remaining: number | undefined;\n /** As sent by the server (seconds until reset, or a unix timestamp, per API). */\n reset: number | undefined;\n}\n\nexport interface WithResponse<T> {\n data: T;\n response: Response;\n requestId: string | undefined;\n rateLimit: RateLimitInfo | undefined;\n}\n\n/** What the transport hands to an `APIPromise`: a successful response plus how to parse it. */\nexport interface RawResult {\n response: Response;\n requestId: string | undefined;\n}\n\nfunction num(v: string | null): number | undefined {\n if (v === null || v.trim() === \"\") return undefined;\n const n = Number(v);\n return Number.isFinite(n) ? n : undefined;\n}\n\nexport function parseRateLimit(headers: Headers): RateLimitInfo | undefined {\n const limit = num(headers.get(\"x-ratelimit-limit\"));\n const remaining = num(headers.get(\"x-ratelimit-remaining\"));\n const reset = num(headers.get(\"x-ratelimit-reset\"));\n if (limit === undefined && remaining === undefined && reset === undefined) return undefined;\n return { limit, remaining, reset };\n}\n\n/** Attach `lastResponse` to an object without it showing up in `JSON.stringify`, spreads or `Object.keys`. */\nexport function attachLastResponse<T>(data: T, meta: LastResponse): T {\n if (data && typeof data === \"object\" && Object.isExtensible(data) && !(data instanceof Response)) {\n Object.defineProperty(data, \"lastResponse\", {\n value: meta,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n }\n return data;\n}\n\nexport class APIPromise<T> extends Promise<T> {\n #raw: Promise<RawResult>;\n #parse: (raw: RawResult) => Promise<T>;\n #parsed: Promise<WithResponse<T>> | undefined;\n\n constructor(raw: Promise<RawResult>, parse: (raw: RawResult) => Promise<T>) {\n // The executor is a placeholder: then/catch/finally below delegate to\n // the parsed result, so this base promise never carries the value.\n super((resolve) => resolve(null as T));\n this.#raw = raw;\n this.#parse = parse;\n }\n\n // `.then()` on a subclass must produce plain promises, not new APIPromises.\n static override get [Symbol.species]() {\n return Promise;\n }\n\n #withParsed(): Promise<WithResponse<T>> {\n if (!this.#parsed) {\n this.#parsed = this.#raw.then(async (raw) => ({\n data: await this.#parse(raw),\n response: raw.response,\n requestId: raw.requestId,\n rateLimit: parseRateLimit(raw.response.headers),\n }));\n }\n return this.#parsed;\n }\n\n /** The parsed body plus the `Response`, request id and rate-limit headers. */\n withResponse(): Promise<WithResponse<T>> {\n return this.#withParsed();\n }\n\n /** The raw `Response`, body unread. Use instead of awaiting (the body can only be read once). */\n asResponse(): Promise<Response> {\n return this.#raw.then((r) => r.response);\n }\n\n override then<R1 = T, R2 = never>(\n onfulfilled?: ((value: T) => R1 | PromiseLike<R1>) | null,\n onrejected?: ((reason: unknown) => R2 | PromiseLike<R2>) | null,\n ): Promise<R1 | R2> {\n return this.#withParsed().then((r) => r.data).then(onfulfilled, onrejected);\n }\n\n override catch<R = never>(onrejected?: ((reason: unknown) => R | PromiseLike<R>) | null): Promise<T | R> {\n return this.then(undefined, onrejected);\n }\n\n override finally(onfinally?: (() => void) | null): Promise<T> {\n return this.then().finally(onfinally);\n }\n}\n","/**\n * Cursor pagination over the uniform `{ data, pagination: { next_cursor, has_more } }` shape.\n */\n\nimport { APIPromise, type RawResult, type LastResponse } from \"./api-promise.js\";\nimport { ProductCraftError } from \"./errors.js\";\n\n/** The wire shape of every paginated list response. */\nexport interface PageResponse<Item> {\n data: Item[];\n pagination?: { next_cursor?: string | null; has_more?: boolean };\n}\n\n/** One page of a list. `await`ing a list call gives you this. */\nexport class Page<Item> {\n readonly data: Item[];\n readonly has_more: boolean;\n readonly next_cursor: string | null;\n declare readonly lastResponse: LastResponse;\n #fetchPage: (cursor: string) => PagePromise<Item>;\n\n constructor(body: PageResponse<Item>, fetchPage: (cursor: string) => PagePromise<Item>) {\n this.data = Array.isArray(body?.data) ? body.data : [];\n this.next_cursor = body?.pagination?.next_cursor ?? null;\n this.has_more = Boolean(body?.pagination?.has_more) && this.next_cursor !== null;\n this.#fetchPage = fetchPage;\n }\n\n hasNextPage(): boolean {\n return this.has_more;\n }\n\n /** Fetch the following page. Throws when there is none (check `hasNextPage()` first). */\n getNextPage(): PagePromise<Item> {\n if (!this.has_more || this.next_cursor === null) {\n throw new ProductCraftError(\"No next page; check hasNextPage() before calling getNextPage().\");\n }\n return this.#fetchPage(this.next_cursor);\n }\n\n /** The wire shape, so `JSON.stringify(page)` matches the API response. */\n toJSON(): PageResponse<Item> {\n return { data: this.data, pagination: { next_cursor: this.next_cursor, has_more: this.has_more } };\n }\n}\n\nexport interface ToArrayOptions {\n /** Required cap on how many items to collect across pages. `limit` stays the page size. */\n maxItems: number;\n}\n\n/**\n * Returned by paginated list methods. `await` it for the first `Page`;\n * `for await` over it for every item across pages; `.pages()` for pages.\n */\nexport class PagePromise<Item> extends APIPromise<Page<Item>> implements AsyncIterable<Item> {\n constructor(raw: Promise<RawResult>, parse: (raw: RawResult) => Promise<Page<Item>>) {\n super(raw, parse);\n }\n\n /** Iterate pages, starting with this one. */\n async *pages(): AsyncGenerator<Page<Item>, void, undefined> {\n let page: Page<Item> = await this;\n for (;;) {\n yield page;\n if (!page.hasNextPage()) return;\n page = await page.getNextPage();\n }\n }\n\n async *[Symbol.asyncIterator](): AsyncGenerator<Item, void, undefined> {\n for await (const page of this.pages()) {\n for (const item of page.data) yield item;\n }\n }\n\n /** Collect items across pages, stopping at `maxItems`. */\n async toArray(options: ToArrayOptions): Promise<Item[]> {\n const max = options?.maxItems;\n if (typeof max !== \"number\" || !(max >= 0)) {\n throw new ProductCraftError(\"toArray() needs { maxItems }, a non-negative number.\");\n }\n const out: Item[] = [];\n if (max === 0) return out;\n for await (const item of this) {\n out.push(item);\n if (out.length >= max) break;\n }\n return out;\n }\n}\n","/**\n * Webhook signature verification, shared by every product.\n *\n * Two schemes are accepted:\n *\n * - **Standard Webhooks** (`webhook-id`, `webhook-timestamp`,\n * `webhook-signature: v1,<base64> [v1,<base64> ...]`), HMAC-SHA256 over\n * `<id>.<timestamp>.<body>`. A `whsec_` secret is base64 key bytes; any\n * other secret is used as its UTF-8 bytes (Mail secrets minted before\n * Standard Webhooks support).\n * - **Legacy** `X-<Product>-Signature: t=<unix>,v1=<hex>`, HMAC-SHA256\n * over `<t>.<body>` with the secret's UTF-8 bytes (Auth audit sink,\n * Trawl, Social, Mail's first scheme).\n *\n * Uses `crypto.subtle` only (Node 20.3+, Bun, Deno, edge) and compares in\n * constant time.\n */\n\nimport { WebhookVerificationError } from \"./errors.js\";\n\n/** Node `IncomingHttpHeaders`, a Fetch `Headers`, or any plain header record. */\nexport type WebhookHeaders =\n | Headers\n | Record<string, string | string[] | undefined>\n | Iterable<[string, string]>;\n\n/** The raw request body, exactly as received. Never a parsed object. */\nexport type WebhookPayload = string | Uint8Array | ArrayBuffer;\n\nexport interface VerifyWebhookParams {\n payload: WebhookPayload;\n headers: WebhookHeaders;\n /** One secret, or several (Mail: default, per-domain and endpoint secrets; rotation). */\n secret: string | readonly string[];\n /** Maximum age (and clock skew) of the timestamp, in seconds. Default 300. */\n toleranceSeconds?: number;\n /** Override \"now\" (ms since epoch), for tests. */\n now?: number;\n}\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\n/** Lower-case header lookup over every supported header shape. */\nexport function normalizeHeaders(headers: WebhookHeaders): Map<string, string> {\n const out = new Map<string, string>();\n if (!headers) return out;\n const put = (k: string, v: unknown) => {\n if (v === undefined || v === null) return;\n const value = Array.isArray(v) ? v.map(String).join(\" \") : String(v);\n out.set(k.toLowerCase(), value);\n };\n if (typeof (headers as Headers).forEach === \"function\" && typeof (headers as Headers).get === \"function\") {\n (headers as Headers).forEach((v, k) => put(k, v));\n return out;\n }\n if (typeof (headers as Iterable<[string, string]>)[Symbol.iterator] === \"function\") {\n for (const [k, v] of headers as Iterable<[string, string]>) put(k, v);\n return out;\n }\n for (const [k, v] of Object.entries(headers as Record<string, unknown>)) put(k, v);\n return out;\n}\n\nfunction payloadBytes(payload: unknown): Uint8Array {\n if (typeof payload === \"string\") return encoder.encode(payload);\n if (payload instanceof Uint8Array) return payload;\n if (payload instanceof ArrayBuffer) return new Uint8Array(payload);\n throw new WebhookVerificationError(\n \"Webhook payload must be the raw request body (string, Buffer, Uint8Array or ArrayBuffer), not a parsed object. \" +\n \"Read the body before any JSON parser runs (express.raw(), `await req.text()`).\",\n );\n}\n\nfunction base64ToBytes(b64: string): Uint8Array | undefined {\n try {\n const bin = atob(b64);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n } catch {\n return undefined;\n }\n}\n\nfunction hexToBytes(hex: string): Uint8Array | undefined {\n if (hex.length % 2 !== 0 || !/^[0-9a-fA-F]*$/.test(hex)) return undefined;\n const out = new Uint8Array(hex.length / 2);\n for (let i = 0; i < out.length; i++) out[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n return out;\n}\n\n/** Constant-time comparison of two byte strings (length is not secret). */\nexport function timingSafeEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= (a[i] as number) ^ (b[i] as number);\n return diff === 0;\n}\n\nfunction concat(...parts: Uint8Array[]): Uint8Array {\n const len = parts.reduce((n, p) => n + p.length, 0);\n const out = new Uint8Array(len);\n let off = 0;\n for (const p of parts) {\n out.set(p, off);\n off += p.length;\n }\n return out;\n}\n\nasync function hmacSha256(key: Uint8Array, data: Uint8Array): Promise<Uint8Array> {\n const subtle = globalThis.crypto?.subtle;\n if (!subtle) {\n throw new WebhookVerificationError(\"crypto.subtle is unavailable in this runtime (Node 20.3+ required).\");\n }\n type Bytes = Parameters<typeof subtle.sign>[2];\n const k = await subtle.importKey(\"raw\", key as Bytes, { name: \"HMAC\", hash: \"SHA-256\" }, false, [\"sign\"]);\n return new Uint8Array(await subtle.sign(\"HMAC\", k, data as Bytes));\n}\n\nfunction standardKey(secret: string): Uint8Array {\n if (secret.startsWith(\"whsec_\")) {\n const bytes = base64ToBytes(secret.slice(\"whsec_\".length));\n if (!bytes) throw new WebhookVerificationError(\"Webhook secret is not valid base64 after the whsec_ prefix.\");\n return bytes;\n }\n return encoder.encode(secret);\n}\n\nfunction checkTimestamp(ts: number, toleranceSeconds: number, now: number): void {\n const nowSeconds = Math.floor(now / 1000);\n if (nowSeconds - ts > toleranceSeconds) throw new WebhookVerificationError(\"Webhook timestamp is too old.\");\n if (ts - nowSeconds > toleranceSeconds) throw new WebhookVerificationError(\"Webhook timestamp is too far in the future.\");\n}\n\nfunction parseTimestamp(raw: string): number {\n if (!/^\\d+$/.test(raw.trim())) throw new WebhookVerificationError(\"Webhook timestamp header is not a unix timestamp.\");\n return Number(raw.trim());\n}\n\nfunction findLegacyHeader(h: Map<string, string>): string | undefined {\n for (const [k, v] of h) if (/^x-[a-z0-9-]+-signature$/.test(k)) return v;\n return undefined;\n}\n\n/**\n * Verify a webhook's signature and timestamp, then return the parsed\n * JSON payload. Throws `WebhookVerificationError` on any failure.\n *\n * @example\n * const event = await verifyWebhook({ payload: rawBody, headers: req.headers, secret: process.env.WEBHOOK_SECRET! });\n */\nexport async function verifyWebhook<T = unknown>(params: VerifyWebhookParams): Promise<T> {\n const { headers, toleranceSeconds = 300 } = params;\n const now = params.now ?? Date.now();\n const secrets = (typeof params.secret === \"string\" ? [params.secret] : [...(params.secret ?? [])]).filter(\n (s) => typeof s === \"string\" && s !== \"\",\n );\n if (secrets.length === 0) throw new WebhookVerificationError(\"No webhook secret was given.\");\n const body = payloadBytes(params.payload);\n const h = normalizeHeaders(headers);\n\n const id = h.get(\"webhook-id\");\n const timestamp = h.get(\"webhook-timestamp\");\n const signature = h.get(\"webhook-signature\");\n let verified = false;\n\n if (id !== undefined || timestamp !== undefined || signature !== undefined) {\n if (!id || !timestamp || !signature) {\n throw new WebhookVerificationError(\"Missing webhook-id, webhook-timestamp or webhook-signature header.\");\n }\n const ts = parseTimestamp(timestamp);\n checkTimestamp(ts, toleranceSeconds, now);\n const candidates = signature\n .split(\" \")\n .map((entry) => entry.split(\",\", 2))\n .filter(([version, sig]) => version === \"v1\" && !!sig)\n .map(([, sig]) => base64ToBytes(sig as string))\n .filter((b): b is Uint8Array => !!b);\n const signed = concat(encoder.encode(`${id}.${ts}.`), body);\n for (const secret of secrets) {\n const expected = await hmacSha256(standardKey(secret), signed);\n // Compare against every candidate so timing does not reveal which matched.\n for (const c of candidates) if (timingSafeEqual(expected, c)) verified = true;\n }\n } else {\n const legacy = findLegacyHeader(h);\n if (!legacy) throw new WebhookVerificationError(\"No webhook signature header found.\");\n let t: string | undefined;\n const sigs: Uint8Array[] = [];\n for (const part of legacy.split(\",\").map((p) => p.trim())) {\n if (part.startsWith(\"t=\")) t = part.slice(2);\n else if (part.startsWith(\"v1=\")) {\n const b = hexToBytes(part.slice(3));\n if (b) sigs.push(b);\n }\n }\n if (t === undefined || sigs.length === 0) throw new WebhookVerificationError(\"Malformed signature header.\");\n const ts = parseTimestamp(t);\n checkTimestamp(ts, toleranceSeconds, now);\n const signed = concat(encoder.encode(`${ts}.`), body);\n for (const secret of secrets) {\n const expected = await hmacSha256(encoder.encode(secret), signed);\n for (const c of sigs) if (timingSafeEqual(expected, c)) verified = true;\n }\n }\n\n if (!verified) throw new WebhookVerificationError(\"Webhook signature does not match.\");\n const text = decoder.decode(body);\n try {\n return JSON.parse(text) as T;\n } catch (cause) {\n throw new WebhookVerificationError(\"Webhook payload is not valid JSON.\", { cause });\n }\n}\n","/**\n * `APIClient`: the hand-written runtime every generated resource method\n * calls. Nothing per-endpoint lives here (docs/sdk-standard.md section 4).\n */\n\nimport createClient, { type Client } from \"openapi-fetch\";\nimport {\n APIPromise,\n attachLastResponse,\n type LastResponse,\n type RawResult,\n} from \"./api-promise.js\";\nimport {\n APIConnectionError,\n APIError,\n APITimeoutError,\n APIUserAbortError,\n ConfigurationError,\n ProductCraftError,\n parseRetryAfterMs,\n} from \"./errors.js\";\nimport { authMiddleware, PC_BASE_URL, readEnv, resolveAuth, type PCAuth } from \"./legacy.js\";\nimport { Page, PagePromise, type PageResponse } from \"./pagination.js\";\nimport { CORE_VERSION } from \"./version.js\";\nimport { verifyWebhook, type WebhookHeaders, type WebhookPayload } from \"./webhooks.js\";\n\nexport type HTTPMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\nexport type LogLevel = \"off\" | \"warn\" | \"debug\";\n\n/** Anything with pino- or console-shaped methods. */\nexport interface Logger {\n debug(...args: unknown[]): void;\n info(...args: unknown[]): void;\n warn(...args: unknown[]): void;\n error(...args: unknown[]): void;\n}\n\nexport interface ClientOptions {\n /** Workspace API key (`pcft_live_…`). Falls back to `PRODUCTCRAFT_API_KEY`. Shorthand for `auth: { type: \"apiKey\", key }`. */\n apiKey?: string;\n /** Explicit credential (API key, bearer token or cookie). Wins over `apiKey`. */\n auth?: PCAuth;\n /** Override the product's base URL. */\n baseUrl?: string;\n /**\n * Default `{workspace_id}`. Falls back to `PRODUCTCRAFT_WORKSPACE_ID`, then (workspace API keys only)\n * one cached `GET /v1/api-keys/self` lookup per process.\n */\n workspaceId?: string;\n /** Per-attempt timeout in ms. Default 60 000. */\n timeout?: number;\n /** Retries after the first attempt. Default 2. */\n maxRetries?: number;\n /** Custom `fetch` (custom transports, tracing). Defaults to the global `fetch`. */\n fetch?: typeof fetch;\n /** Headers sent on every request. */\n defaultHeaders?: Record<string, string>;\n /** Allow a workspace API key in a browser. Leaks the key to anyone who loads the page. */\n dangerouslyAllowBrowser?: boolean;\n /** `off` (default), `warn` or `debug`. Falls back to `PRODUCTCRAFT_LOG`. */\n logLevel?: LogLevel;\n /** Where log lines go. Default `console`. Never receives headers or bodies. */\n logger?: Logger;\n /** Default secret(s) for `webhooks.unwrap`. */\n webhookSecret?: string | readonly string[];\n /** Platform-auth host used for the workspace lookup. */\n platformAuthBaseUrl?: string;\n /**\n * Read `PRODUCTCRAFT_API_KEY` when neither `auth` nor `apiKey` is passed. Default `true`.\n * Auth's consumer scope sets `false`: routes acting for an end user never pick up a workspace key.\n */\n credentialFromEnv?: boolean;\n}\n\n/** Per-request options: always the last argument of an SDK method. */\nexport interface RequestOptions {\n /** Overrides the automatic Idempotency-Key (and makes a POST/PATCH retryable). */\n idempotencyKey?: string;\n /** Per-attempt timeout in ms. */\n timeout?: number;\n maxRetries?: number;\n headers?: Record<string, string | undefined>;\n signal?: AbortSignal;\n /** `{workspace_id}` for this call (bearer tokens that span workspaces). */\n workspaceId?: string;\n fetch?: typeof fetch;\n}\n\n/** What a generated method hands to `request()`. */\nexport interface RequestSpec {\n method: HTTPMethod;\n /** Path template, e.g. `/v1/workspaces/{workspace_id}/domains/{id}`. */\n path: string;\n pathParams?: Record<string, string | number | undefined>;\n query?: Record<string, unknown>;\n body?: unknown;\n headers?: Record<string, string | undefined>;\n /** The spec declares an `Idempotency-Key` header on this operation. */\n idempotent?: boolean;\n /** The success response is not JSON: resolve to the raw `Response`. */\n raw?: boolean;\n /** Keyless, browser-safe route: send no credential. */\n public?: boolean;\n}\n\nexport interface PollConfig {\n /** Field whose value decides completion, e.g. `status`. */\n field: string;\n /** Values that end the poll. */\n terminal: readonly string[];\n}\n\nexport interface PollOptions extends RequestOptions {\n /** Delay between polls in ms, unless the server sends `Retry-After`. Default 2 000. */\n intervalMs?: number;\n /** Give up after this many ms. Default 300 000. */\n timeoutMs?: number;\n}\n\n/** Identifies the product package in `User-Agent`. */\nexport interface SDKIdentity {\n name: string;\n version: string;\n}\n\nexport const DEFAULT_TIMEOUT_MS = 60_000;\nexport const DEFAULT_MAX_RETRIES = 2;\n/** Retry-After above this fails fast instead of waiting. */\nexport const MAX_RETRY_AFTER_MS = 60_000;\nexport const PC_WORKSPACE_ID_ENV = \"PRODUCTCRAFT_WORKSPACE_ID\";\nexport const PC_LOG_ENV = \"PRODUCTCRAFT_LOG\";\nconst WORKSPACE_LOOKUP_TIMEOUT_MS = 5_000;\n\nconst RETRY_STATUSES = new Set([408, 429, 500, 502, 503, 504]);\nconst SAFE_METHODS = new Set<HTTPMethod>([\"GET\", \"PUT\", \"DELETE\"]);\n\n/** Full-jitter exponential backoff: random in [0, min(8 s, 0.5 s * 2^attempt)). */\nexport function backoffMs(attempt: number): number {\n return Math.random() * Math.min(8_000, 500 * 2 ** attempt);\n}\n\nfunction isBrowser(): boolean {\n const g = globalThis as { window?: { document?: unknown }; navigator?: unknown };\n return typeof g.window !== \"undefined\" && typeof g.window?.document !== \"undefined\" && typeof g.navigator !== \"undefined\";\n}\n\nfunction runtimeTag(): string {\n const g = globalThis as {\n Bun?: { version?: string };\n Deno?: { version?: { deno?: string } };\n process?: { versions?: { node?: string } };\n };\n if (g.Bun?.version) return `bun/${g.Bun.version}`;\n if (g.Deno?.version?.deno) return `deno/${g.Deno.version.deno}`;\n if (g.process?.versions?.node) return `node/${g.process.versions.node}`;\n return \"runtime/unknown\";\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(new APIUserAbortError());\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(new APIUserAbortError());\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nfunction isBodyInit(body: unknown): boolean {\n return (\n typeof body === \"string\" ||\n body instanceof ArrayBuffer ||\n ArrayBuffer.isView(body) ||\n (typeof Blob !== \"undefined\" && body instanceof Blob) ||\n (typeof FormData !== \"undefined\" && body instanceof FormData) ||\n (typeof URLSearchParams !== \"undefined\" && body instanceof URLSearchParams) ||\n (typeof ReadableStream !== \"undefined\" && body instanceof ReadableStream)\n );\n}\n\nasync function readErrorBody(res: Response): Promise<unknown> {\n const text = await res.text().catch(() => \"\");\n if (text === \"\") return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\n// The client's custom fetch, for createOpenAPIClient (kept off the instance's public surface).\nconst customFetch = new WeakMap<object, typeof fetch | undefined>();\n\n/**\n * The typed `openapi-fetch` escape hatch (`.client` on every product), over\n * the same credential and base URL as `api`. It does not retry.\n * A standalone function so bundles that never use it leave openapi-fetch out.\n */\nexport function createOpenAPIClient<TPaths extends object>(api: APIClient): Client<TPaths> {\n const client = createClient<TPaths>({ baseUrl: api.baseUrl, fetch: customFetch.get(api) });\n client.use(authMiddleware(api.auth));\n return client;\n}\n\n// One shared lookup per (platform host, key) per process, kept on a global symbol so\n// duplicate copies of core (two product packages on different core versions) share it too.\nconst workspaceCache: Map<string, Promise<string>> = ((globalThis as Record<symbol, unknown>)[\n Symbol.for(\"productcraft.workspaceCache\")\n] ??= new Map<string, Promise<string>>()) as Map<string, Promise<string>>;\n\n/** Clears the per-process workspace lookup cache. For tests. */\nexport function _resetWorkspaceCache(): void {\n workspaceCache.clear();\n}\n\nexport class APIClient {\n readonly baseUrl: string;\n /** The resolved credential. Non-enumerable, so logging the client does not print the key. */\n declare readonly auth: PCAuth | undefined;\n readonly workspaceId: string | undefined;\n readonly timeout: number;\n readonly maxRetries: number;\n readonly webhookSecret: string | readonly string[] | undefined;\n readonly #fetch: typeof fetch | undefined;\n readonly #defaultHeaders: Record<string, string>;\n readonly #platformAuthBaseUrl: string;\n readonly #logLevel: LogLevel;\n readonly #logger: Logger;\n readonly #userAgent: string;\n\n constructor(options: ClientOptions = {}, defaultBaseUrl: string, sdk?: SDKIdentity) {\n this.baseUrl = (options.baseUrl ?? defaultBaseUrl).replace(/\\/+$/, \"\");\n Object.defineProperty(this, \"auth\", {\n value: ((explicit: PCAuth | undefined) => (options.credentialFromEnv === false ? explicit : resolveAuth(explicit)))(\n options.auth ?? (options.apiKey ? { type: \"apiKey\", key: options.apiKey } : undefined),\n ),\n enumerable: false,\n writable: false,\n });\n if (this.auth?.type === \"apiKey\" && isBrowser() && !options.dangerouslyAllowBrowser) {\n throw new ConfigurationError(\n \"A workspace API key was used in a browser, where anyone who loads the page can read it. \" +\n \"Call ProductCraft from your server, or pass dangerouslyAllowBrowser: true if you accept that risk.\",\n );\n }\n this.workspaceId = options.workspaceId ?? readEnv(PC_WORKSPACE_ID_ENV);\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.webhookSecret = options.webhookSecret;\n this.#fetch = options.fetch;\n customFetch.set(this, options.fetch);\n this.#defaultHeaders = { ...options.defaultHeaders };\n this.#platformAuthBaseUrl = (options.platformAuthBaseUrl ?? PC_BASE_URL.platformAuth).replace(/\\/+$/, \"\");\n const level = options.logLevel ?? (readEnv(PC_LOG_ENV) as LogLevel | undefined);\n this.#logLevel = level === \"debug\" || level === \"warn\" ? level : \"off\";\n this.#logger = options.logger ?? console;\n const product = sdk ? `${sdk.name}@${sdk.version}` : `core@${CORE_VERSION}`;\n this.#userAgent = `productcraft-node/${product} ${runtimeTag()}`;\n }\n\n #log(level: \"debug\" | \"warn\", message: string, fields: Record<string, unknown>): void {\n if (this.#logLevel === \"off\") return;\n if (level === \"debug\" && this.#logLevel !== \"debug\") return;\n try {\n this.#logger[level](`[productcraft] ${message}`, fields);\n } catch {\n // A broken logger must never break a request.\n }\n }\n\n /** Send one logical API call (with retries). Resolves to the parsed body. */\n request<T>(spec: RequestSpec, options: RequestOptions = {}): APIPromise<T> {\n return new APIPromise<T>(this.#send(spec, options), (raw) => this.#parseBody<T>(spec, raw));\n }\n\n /** A paginated list call. `await` for one page, `for await` for every item. */\n list<Item>(spec: RequestSpec, options: RequestOptions = {}): PagePromise<Item> {\n const at = (cursor?: string): PagePromise<Item> => {\n const pageSpec: RequestSpec = cursor === undefined ? spec : { ...spec, query: { ...spec.query, cursor } };\n return new PagePromise<Item>(this.#send(pageSpec, options), async (raw) => {\n const body = await this.#parseBody<PageResponse<Item>>(pageSpec, raw);\n const page = new Page<Item>(body as PageResponse<Item>, (next) => at(next));\n return attachLastResponse(page, this.#meta(raw));\n });\n };\n return at();\n }\n\n /** Retrieve repeatedly until `config.field` reaches a terminal value. */\n async poll<T>(spec: RequestSpec, config: PollConfig, options: PollOptions = {}): Promise<T> {\n const { intervalMs = 2_000, timeoutMs = 300_000, ...requestOptions } = options;\n const deadline = Date.now() + timeoutMs;\n for (;;) {\n const { data, response } = await this.request<T>(spec, requestOptions).withResponse();\n const value = (data as Record<string, unknown> | undefined)?.[config.field];\n if (typeof value === \"string\" && config.terminal.includes(value)) return data;\n const retryAfter = parseRetryAfterMs(response.headers, Date.now());\n const wait = retryAfter !== undefined && retryAfter <= MAX_RETRY_AFTER_MS ? retryAfter : intervalMs;\n if (Date.now() + wait > deadline) {\n throw new APITimeoutError(\n `Polling ${spec.path} timed out after ${timeoutMs} ms; last ${config.field} was ${JSON.stringify(value)}.`,\n );\n }\n this.#log(\"debug\", \"poll\", { path: spec.path, [config.field]: value, wait_ms: wait });\n await sleep(wait, options.signal);\n }\n }\n\n /** Create, then poll the created object to a terminal state. */\n async createAndPoll<T>(\n createSpec: RequestSpec,\n retrieveSpec: (created: T) => RequestSpec,\n config: PollConfig,\n options: PollOptions = {},\n ): Promise<T> {\n const { intervalMs, timeoutMs, ...requestOptions } = options;\n const created = await this.request<T>(createSpec, requestOptions);\n const value = (created as Record<string, unknown> | undefined)?.[config.field];\n if (typeof value === \"string\" && config.terminal.includes(value)) return created;\n // The create's idempotency key must not leak into the retrieves.\n const pollOptions: PollOptions = { ...requestOptions, intervalMs, timeoutMs };\n delete pollOptions.idempotencyKey;\n return this.poll<T>(retrieveSpec(created), config, pollOptions);\n }\n\n /** Verify a webhook with the given secret, the client's `webhookSecret`, or `envVar`. */\n async unwrapWebhook<T = unknown>(\n params: { payload: WebhookPayload; headers: WebhookHeaders; secret?: string | readonly string[]; toleranceSeconds?: number },\n envVar?: string,\n ): Promise<T> {\n const secret = params.secret ?? this.webhookSecret ?? (envVar ? readEnv(envVar) : undefined);\n if (!secret || (Array.isArray(secret) && secret.length === 0)) {\n throw new ConfigurationError(\n `No webhook secret: pass { secret }, set webhookSecret on the client${envVar ? ` or ${envVar}` : \"\"}.`,\n );\n }\n return verifyWebhook<T>({ ...params, secret });\n }\n\n #meta(raw: RawResult): LastResponse {\n return { requestId: raw.requestId, status: raw.response.status, headers: raw.response.headers };\n }\n\n async #parseBody<T>(spec: RequestSpec, raw: RawResult): Promise<T> {\n const res = raw.response;\n if (spec.raw) return res as T;\n if (res.status === 204 || res.status === 205) return undefined as T;\n const type = res.headers.get(\"content-type\") ?? \"\";\n if (!/[/+]json\\b/i.test(type)) {\n // An empty body with no content type is a void success; anything else non-JSON is handed back raw.\n if (res.headers.get(\"content-length\") === \"0\") return undefined as T;\n return res as T;\n }\n const text = await res.text();\n if (text === \"\") return undefined as T;\n const data = JSON.parse(text) as T;\n return attachLastResponse(data, this.#meta(raw));\n }\n\n async #resolveWorkspaceId(options: RequestOptions, fetchImpl: typeof fetch): Promise<string> {\n if (options.workspaceId) return options.workspaceId;\n if (this.workspaceId) return this.workspaceId;\n if (this.auth?.type !== \"apiKey\") {\n throw new ConfigurationError(\n \"pass workspaceId: this call is workspace-scoped and the credential is not a workspace API key \" +\n \"(bearer and cookie credentials can span workspaces, so the SDK never guesses).\",\n );\n }\n const key = this.auth.key;\n const cacheKey = `${this.#platformAuthBaseUrl}\\u0000${key}`;\n let pending = workspaceCache.get(cacheKey);\n if (!pending) {\n pending = this.#lookupWorkspace(key, fetchImpl);\n workspaceCache.set(cacheKey, pending);\n pending.catch(() => workspaceCache.delete(cacheKey));\n }\n return pending;\n }\n\n async #lookupWorkspace(key: string, fetchImpl: typeof fetch): Promise<string> {\n this.#log(\"debug\", \"resolving workspaceId\", { path: \"/v1/api-keys/self\" });\n let res: Response;\n try {\n res = await fetchImpl(`${this.#platformAuthBaseUrl}/v1/api-keys/self`, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${key}`, Accept: \"application/json\", \"User-Agent\": this.#userAgent },\n signal: AbortSignal.timeout(WORKSPACE_LOOKUP_TIMEOUT_MS),\n });\n } catch (cause) {\n throw new ConfigurationError(\"pass workspaceId: looking it up from the API key failed.\", { cause });\n }\n if (!res.ok) {\n const body = await readErrorBody(res);\n throw new ConfigurationError(\n `pass workspaceId: looking it up from the API key failed with ${res.status}.`,\n { cause: APIError.generate(res.status, body, res.headers) },\n );\n }\n const body = (await res.json().catch(() => undefined)) as { workspace?: { id?: unknown } } | undefined;\n const id = body?.workspace?.id;\n if (typeof id !== \"string\" || id === \"\") {\n throw new ConfigurationError(\"pass workspaceId: the API key lookup returned no workspace id.\");\n }\n return id;\n }\n\n async #buildUrl(spec: RequestSpec, options: RequestOptions, fetchImpl: typeof fetch): Promise<string> {\n const params: Record<string, string | number | undefined> = { ...spec.pathParams };\n if (spec.path.includes(\"{workspace_id}\") && params.workspace_id === undefined) {\n params.workspace_id = await this.#resolveWorkspaceId(options, fetchImpl);\n }\n const path = spec.path.replace(/\\{([^}]+)\\}/g, (_, name: string) => {\n const value = params[name];\n if (value === undefined || value === null || value === \"\") {\n throw new ProductCraftError(`Missing path parameter \"${name}\" for ${spec.method} ${spec.path}.`);\n }\n return encodeURIComponent(String(value));\n });\n const search = new URLSearchParams();\n for (const [k, v] of Object.entries(spec.query ?? {})) {\n if (v === undefined || v === null) continue;\n for (const item of Array.isArray(v) ? v : [v]) {\n if (item === undefined || item === null) continue;\n search.append(k, item instanceof Date ? item.toISOString() : typeof item === \"object\" ? JSON.stringify(item) : String(item));\n }\n }\n const qs = search.toString();\n return `${this.baseUrl}${path}${qs ? `?${qs}` : \"\"}`;\n }\n\n async #send(spec: RequestSpec, options: RequestOptions): Promise<RawResult> {\n const fetchImpl = options.fetch ?? this.#fetch ?? globalThis.fetch;\n if (typeof fetchImpl !== \"function\") {\n throw new ConfigurationError(\"No fetch implementation: pass { fetch } or use Node 20.3+.\");\n }\n if (options.signal?.aborted) throw new APIUserAbortError();\n const url = await this.#buildUrl(spec, options, fetchImpl);\n\n const headers = new Headers();\n headers.set(\"Accept\", \"application/json\");\n if (!isBrowser()) headers.set(\"User-Agent\", this.#userAgent);\n for (const source of [this.#defaultHeaders, spec.headers, options.headers]) {\n for (const [k, v] of Object.entries(source ?? {})) {\n if (v === undefined) headers.delete(k);\n else headers.set(k, v);\n }\n }\n if (!spec.public && this.auth) {\n if (this.auth.type === \"cookie\") headers.set(\"Cookie\", `auth_token=${this.auth.value}`);\n else headers.set(\"Authorization\", `Bearer ${this.auth.type === \"apiKey\" ? this.auth.key : this.auth.token}`);\n }\n\n // One key per logical call, reused on every retry.\n if (options.idempotencyKey) headers.set(\"Idempotency-Key\", options.idempotencyKey);\n else if (spec.idempotent && !headers.has(\"Idempotency-Key\")) headers.set(\"Idempotency-Key\", `pc_${crypto.randomUUID()}`);\n\n let body: RequestInit[\"body\"];\n if (spec.body !== undefined) {\n if (isBodyInit(spec.body)) body = spec.body as RequestInit[\"body\"];\n else {\n body = JSON.stringify(spec.body);\n if (!headers.has(\"Content-Type\")) headers.set(\"Content-Type\", \"application/json\");\n }\n }\n\n // A POST/PATCH without a key is never retried: fetch cannot tell whether the bytes were sent.\n const retryable = SAFE_METHODS.has(spec.method) || headers.has(\"Idempotency-Key\");\n const maxRetries = Math.max(0, options.maxRetries ?? this.maxRetries);\n const timeout = options.timeout ?? this.timeout;\n\n for (let attempt = 0; ; attempt++) {\n if (attempt > 0) headers.set(\"X-PC-SDK-Retry-Count\", String(attempt));\n const timeoutCtl = new AbortController();\n const timer = setTimeout(() => timeoutCtl.abort(), timeout);\n const signal = options.signal ? AbortSignal.any([options.signal, timeoutCtl.signal]) : timeoutCtl.signal;\n const canRetry = retryable && attempt < maxRetries;\n this.#log(\"debug\", \"request\", { method: spec.method, path: spec.path, attempt });\n\n let res: Response;\n try {\n res = await fetchImpl(url, { method: spec.method, headers, body, signal });\n } catch (cause) {\n clearTimeout(timer);\n if (options.signal?.aborted) throw new APIUserAbortError(undefined, { cause });\n const error = timeoutCtl.signal.aborted\n ? new APITimeoutError(`Request timed out after ${timeout} ms.`, { cause })\n : new APIConnectionError(`Connection error: ${(cause as Error)?.message ?? String(cause)}`, { cause });\n if (!canRetry) throw error;\n const wait = backoffMs(attempt);\n this.#log(\"debug\", \"retrying after connection error\", { method: spec.method, path: spec.path, attempt, wait_ms: Math.round(wait) });\n await sleep(wait, options.signal);\n continue;\n }\n clearTimeout(timer);\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n\n if (res.ok) {\n this.#log(\"debug\", \"response\", { method: spec.method, path: spec.path, status: res.status, request_id: requestId, attempt });\n return { response: res, requestId };\n }\n\n const errorBody = await readErrorBody(res);\n const error = APIError.generate(res.status, errorBody, res.headers);\n this.#log(\"debug\", \"response\", { method: spec.method, path: spec.path, status: res.status, request_id: error.requestId, attempt });\n const statusRetryable =\n RETRY_STATUSES.has(res.status) || (res.status === 409 && error.code === \"IDEMPOTENCY_IN_PROGRESS\");\n if (!canRetry || !statusRetryable) throw error;\n const retryAfter = parseRetryAfterMs(res.headers, Date.now());\n if (retryAfter !== undefined && retryAfter > MAX_RETRY_AFTER_MS) {\n this.#log(\"warn\", \"Retry-After above 60 s, not retrying\", { path: spec.path, status: res.status, request_id: error.requestId });\n throw error;\n }\n const wait = retryAfter ?? backoffMs(attempt);\n this.#log(\"debug\", \"retrying\", { method: spec.method, path: spec.path, status: res.status, attempt, wait_ms: Math.round(wait) });\n await sleep(wait, options.signal);\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/version.ts","../src/legacy.ts","../src/errors.ts","../src/api-promise.ts","../src/pagination.ts","../src/webhooks.ts","../src/client.ts"],"names":["createClient","body","error","wait"],"mappings":"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","file":"index.cjs","sourcesContent":["declare const __PC_CORE_VERSION__: string | undefined;\n\n/** This package's version, injected at build time from package.json. */\nexport const CORE_VERSION: string =\n typeof __PC_CORE_VERSION__ === \"string\" ? __PC_CORE_VERSION__ : \"0.0.0-dev\";\n","/**\n * The 0.x primitives: credential types, environment helpers, base URLs\n * and the `openapi-fetch` client builder behind every product's\n * `.client` escape hatch. Kept exported for compatibility; new code\n * goes through `APIClient` (see `client.ts`).\n */\n\nimport createClient, { type Client, type Middleware } from \"openapi-fetch\";\nimport { CORE_VERSION } from \"./version.js\";\n\n/**\n * The auth credential the SDK presents to ProductCraft APIs.\n *\n * - `apiKey` — Platform API Key (`pcft_live_*`). Server-side only;\n * never embed in a shipped browser bundle.\n * - `bearer` — pre-resolved JWT (e.g. an Auth app-scoped EndUser\n * token your backend minted and shipped to the device).\n * - `cookie` — captured `auth_token` cookie value. Mostly useful in\n * dev / E2E tests where you've already signed in.\n */\nexport type PCAuth =\n | { type: \"apiKey\"; key: string }\n | { type: \"bearer\"; token: string }\n | { type: \"cookie\"; value: string };\n\nexport interface PCClientConfig {\n /**\n * Credential for every request. Server-side, omit it to fall back to\n * the `PRODUCTCRAFT_API_KEY` environment variable (your `pcft_`\n * workspace key). An explicit value always wins over the environment.\n */\n auth?: PCAuth;\n /** Override the prod base URL — useful for dev / staging. */\n baseUrl?: string;\n /** Custom fetch (e.g. node-fetch with retries, undici, ...). */\n fetch?: typeof fetch;\n}\n\n/**\n * Default prod base URL per surface.\n *\n * Keys use the rebranded product names (Auth, Mail, Waitlist, Social)\n * matching the package + class names since the 2026-07 SDK rename.\n * Prior releases (`@productcraft/heimdall` 0.x etc.) exposed the same\n * hosts under the old keys (heimdall/envoi/rally/agora).\n */\nexport const PC_BASE_URL = {\n // platformAuth is the platform identity layer (workspaces, PATs);\n // it vacated api.auth so the customer-facing Auth product could\n // take that host.\n platformAuth: \"https://api.platform-auth.productcraft.co\",\n auth: \"https://api.auth.productcraft.co\",\n mail: \"https://api.mail.productcraft.co\",\n waitlist: \"https://api.waitlist.productcraft.co\",\n social: \"https://social.productcraft.co\",\n trawl: \"https://api.trawl.productcraft.co\",\n} as const;\n\n/** Environment variable holding the `pcft_` workspace API key. */\nexport const PC_API_KEY_ENV = \"PRODUCTCRAFT_API_KEY\";\n/** Environment variable holding the default Auth app slug for `auth.consumer()`. */\nexport const PC_AUTH_APP_ENV = \"PRODUCTCRAFT_AUTH_APP\";\n\n/**\n * Read an environment variable when running somewhere with a `process`\n * global (Node, Bun, Deno's Node compat). Returns `undefined` in the\n * browser or edge runtimes without `process`, and for empty values.\n * Never throws.\n */\nexport function readEnv(name: string): string | undefined {\n const proc = (globalThis as { process?: { env?: Record<string, string | undefined> } })\n .process;\n if (typeof proc === \"undefined\" || !proc || !proc.env) return undefined;\n const value = proc.env[name];\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed === \"\" ? undefined : trimmed;\n}\n\n/**\n * Resolve the credential a server-side client should present: the\n * explicit `auth` when given, otherwise `PRODUCTCRAFT_API_KEY` from the\n * environment, otherwise none. Hosts are never read from the\n * environment; override them in code with `baseUrl`.\n */\nexport function resolveAuth(auth: PCAuth | undefined): PCAuth | undefined {\n if (auth) return auth;\n const key = readEnv(PC_API_KEY_ENV);\n return key ? { type: \"apiKey\", key } : undefined;\n}\n\n/**\n * Build an `openapi-fetch` middleware that adds the configured auth\n * credential as a header on every outbound request.\n */\nexport function authMiddleware(auth: PCAuth | undefined): Middleware {\n return {\n async onRequest({ request }) {\n if (!auth) return undefined;\n switch (auth.type) {\n case \"apiKey\":\n request.headers.set(\"Authorization\", `Bearer ${auth.key}`);\n break;\n case \"bearer\":\n request.headers.set(\"Authorization\", `Bearer ${auth.token}`);\n break;\n case \"cookie\":\n request.headers.set(\"Cookie\", `auth_token=${auth.value}`);\n break;\n }\n return request;\n },\n };\n}\n\n/**\n * Construct an `openapi-fetch` client for a surface. Each surface\n * package calls this with its own generated `paths` type and default\n * base URL. The returned client is the v0 surface — every endpoint is\n * reachable through `client.GET(...)`, `client.POST(...)`, etc.\n *\n * When `config.auth` is omitted the client falls back to\n * `PRODUCTCRAFT_API_KEY` (see `resolveAuth`).\n *\n * @deprecated Build the runtime with `new APIClient(options, baseUrl)`\n * and take the typed escape hatch from `createOpenAPIClient<paths>(apiClient)`,\n * which shares its credential and base URL. Kept for the 0.x product\n * packages; removed no earlier than core 2.0.\n */\nexport function makeClient<TPaths extends object>(\n defaultBaseUrl: string,\n config: PCClientConfig = {},\n): Client<TPaths> {\n const client = createClient<TPaths>({\n baseUrl: config.baseUrl ?? defaultBaseUrl,\n fetch: config.fetch,\n });\n client.use(authMiddleware(resolveAuth(config.auth)));\n client.use(userAgentMiddleware());\n return client;\n}\n\n/**\n * Identify `.client` calls as the SDK (`productcraft-node/core@<version>\n * node/<version>`), as `APIClient` does, outside the browser (where\n * `User-Agent` cannot be set) and unless the caller set one. APIs key\n * SDK-only behaviour on it: Platform's `GET …/api-keys` always answers\n * the paged envelope the generated types describe to an SDK.\n */\nfunction userAgentMiddleware(): Middleware {\n const g = globalThis as {\n window?: { document?: unknown };\n navigator?: unknown;\n process?: { versions?: { node?: string } };\n };\n const browser = typeof g.window?.document !== \"undefined\" && typeof g.navigator !== \"undefined\";\n const node = g.process?.versions?.node;\n const userAgent = `productcraft-node/core@${CORE_VERSION}${node ? ` node/${node}` : \"\"}`;\n return {\n onRequest({ request }) {\n if (browser || request.headers.has(\"user-agent\")) return undefined;\n request.headers.set(\"User-Agent\", userAgent);\n return request;\n },\n };\n}\n","/**\n * The error hierarchy every ProductCraft SDK throws.\n *\n * Every class is branded with `Symbol.for(\"productcraft.error.<Name>\")`\n * and answers `instanceof` through `static [Symbol.hasInstance]`, so a\n * check like `err instanceof NotFoundError` holds even when the error\n * was thrown by the CJS build and the check runs against the ESM build,\n * or when two copies of `@productcraft/core` are installed.\n */\n\n/** Base URL of the public error-code catalogue. */\nexport const ERROR_DOCS_URL = \"https://productcraft.co/docs/errors\";\n\n/** A string-literal union that also accepts values this SDK version does not know. */\nexport type OpenEnum<T extends string> = T | (string & {});\n\n/** One invalid request field, from the error envelope's `errors` list. */\nexport interface ErrorParam {\n /** The request field, e.g. `to` or `domains[0].name`. */\n param: string;\n message: string;\n code?: string;\n}\n\nconst brandKey = (name: string): symbol => Symbol.for(`productcraft.error.${name}`);\n\nfunction stamp(instance: object, ctor: unknown): void {\n // Walk the constructor chain and stamp one brand per class, so the\n // instance answers `instanceof` for itself and every ancestor.\n let current = ctor as { brandName?: string } | null;\n while (current && current !== Error && current !== Function.prototype) {\n if (Object.prototype.hasOwnProperty.call(current, \"brandName\") && current.brandName) {\n Object.defineProperty(instance, brandKey(current.brandName), {\n value: true,\n enumerable: false,\n });\n }\n current = Object.getPrototypeOf(current);\n }\n}\n\n/** Base class of every error the SDK throws. */\nexport class ProductCraftError extends Error {\n static readonly brandName: string = \"ProductCraftError\";\n\n static override [Symbol.hasInstance](instance: unknown): boolean {\n if (typeof instance !== \"object\" || instance === null) return false;\n return (instance as Record<symbol, unknown>)[brandKey(this.brandName)] === true;\n }\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n const ctor = new.target as unknown as { brandName: string };\n Object.defineProperty(this, \"name\", {\n value: ctor.brandName,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n stamp(this, new.target);\n }\n}\n\n/** The client was configured in a way that cannot work (missing `workspaceId`, a key in a browser, ...). */\nexport class ConfigurationError extends ProductCraftError {\n static override readonly brandName: string = \"ConfigurationError\";\n}\n\n/** A webhook payload failed signature or timestamp verification. */\nexport class WebhookVerificationError extends ProductCraftError {\n static override readonly brandName: string = \"WebhookVerificationError\";\n}\n\n/** The request never produced an HTTP response (DNS, TLS, reset connection, ...). */\nexport class APIConnectionError extends ProductCraftError {\n static override readonly brandName: string = \"APIConnectionError\";\n constructor(message = \"Connection error.\", options?: { cause?: unknown }) {\n super(message, options);\n }\n}\n\n/** An attempt (or a poll) ran past its timeout. */\nexport class APITimeoutError extends APIConnectionError {\n static override readonly brandName: string = \"APITimeoutError\";\n constructor(message = \"Request timed out.\", options?: { cause?: unknown }) {\n super(message, options);\n }\n}\n\n/** The caller's `AbortSignal` fired. Never retried. */\nexport class APIUserAbortError extends ProductCraftError {\n static override readonly brandName: string = \"APIUserAbortError\";\n constructor(message = \"Request was aborted.\", options?: { cause?: unknown }) {\n super(message, options);\n }\n}\n\ninterface ErrorEnvelope {\n message?: unknown;\n code?: unknown;\n request_id?: unknown;\n errors?: unknown;\n details?: unknown;\n error?: unknown;\n}\n\nfunction envelopeMessage(body: unknown, status: number): string {\n if (body && typeof body === \"object\") {\n const msg = (body as ErrorEnvelope).message;\n if (typeof msg === \"string\" && msg !== \"\") return msg;\n if (Array.isArray(msg) && msg.length > 0) return msg.map(String).join(\"; \");\n const err = (body as ErrorEnvelope).error;\n if (typeof err === \"string\" && err !== \"\") return err;\n }\n if (typeof body === \"string\" && body.trim() !== \"\" && body.length <= 500) return body.trim();\n return `${status} status code`;\n}\n\nfunction envelopeErrors(body: unknown): ErrorParam[] {\n if (!body || typeof body !== \"object\") return [];\n const list = (body as ErrorEnvelope).errors;\n if (!Array.isArray(list)) return [];\n return list\n .filter((e): e is Record<string, unknown> => !!e && typeof e === \"object\")\n .map((e) => {\n const out: ErrorParam = {\n param: typeof e.param === \"string\" ? e.param : \"\",\n message: typeof e.message === \"string\" ? e.message : \"\",\n };\n if (typeof e.code === \"string\") out.code = e.code;\n return out;\n });\n}\n\n/** A non-2xx HTTP response. Subclassed by status. */\nexport class APIError extends ProductCraftError {\n static override readonly brandName: string = \"APIError\";\n\n /** HTTP status of the response. */\n readonly status: number;\n /** Stable, machine-readable code from the error envelope (branch on this, not on `message`). */\n readonly code: string | undefined;\n /** Per-field validation errors from the envelope's `errors`; empty when absent. */\n readonly errors: ErrorParam[];\n /** The envelope's route-specific `details` object (e.g. `{ fqdn, reason }`), when present. */\n readonly details: Record<string, unknown> | undefined;\n /** `https://productcraft.co/docs/errors#<code>`, when there is a code. */\n readonly docUrl: string | undefined;\n /** `X-Request-Id` response header, else the envelope's `request_id`. Quote it to support. */\n readonly requestId: string | undefined;\n /** Response headers. */\n readonly headers: Headers;\n /** Parsed response body (JSON when it parses, otherwise the text). */\n readonly body: unknown;\n\n constructor(status: number, body: unknown, headers: Headers, message?: string) {\n super(message ?? envelopeMessage(body, status));\n this.status = status;\n this.headers = headers;\n this.body = body;\n const env = (body && typeof body === \"object\" ? body : {}) as ErrorEnvelope;\n this.code = typeof env.code === \"string\" && env.code !== \"\" ? env.code : undefined;\n this.errors = envelopeErrors(body);\n this.details =\n env.details && typeof env.details === \"object\" && !Array.isArray(env.details)\n ? (env.details as Record<string, unknown>)\n : undefined;\n this.docUrl = this.code ? `${ERROR_DOCS_URL}#${this.code}` : undefined;\n this.requestId =\n headers.get(\"x-request-id\") ??\n (typeof env.request_id === \"string\" ? env.request_id : undefined);\n }\n\n /** Build the right subclass for a status and envelope. */\n static generate(status: number, body: unknown, headers: Headers): APIError {\n const code =\n body && typeof body === \"object\" && typeof (body as ErrorEnvelope).code === \"string\"\n ? ((body as ErrorEnvelope).code as string)\n : undefined;\n switch (status) {\n case 400:\n return new BadRequestError(status, body, headers);\n case 401:\n return new AuthenticationError(status, body, headers);\n case 403:\n return new PermissionDeniedError(status, body, headers);\n case 404:\n return new NotFoundError(status, body, headers);\n case 409:\n return code === \"IDEMPOTENCY_KEY_REUSE\"\n ? new IdempotencyKeyReuseError(status, body, headers)\n : new ConflictError(status, body, headers);\n case 422:\n return new UnprocessableEntityError(status, body, headers);\n case 429:\n return new RateLimitError(status, body, headers);\n }\n if (status >= 500) return new InternalServerError(status, body, headers);\n return new APIError(status, body, headers);\n }\n}\n\nexport class BadRequestError extends APIError {\n static override readonly brandName: string = \"BadRequestError\";\n}\nexport class AuthenticationError extends APIError {\n static override readonly brandName: string = \"AuthenticationError\";\n}\nexport class PermissionDeniedError extends APIError {\n static override readonly brandName: string = \"PermissionDeniedError\";\n}\nexport class NotFoundError extends APIError {\n static override readonly brandName: string = \"NotFoundError\";\n}\nexport class ConflictError extends APIError {\n static override readonly brandName: string = \"ConflictError\";\n}\n/** 409 `IDEMPOTENCY_KEY_REUSE`: the same Idempotency-Key was sent with a different body. */\nexport class IdempotencyKeyReuseError extends ConflictError {\n static override readonly brandName: string = \"IdempotencyKeyReuseError\";\n}\nexport class UnprocessableEntityError extends APIError {\n static override readonly brandName: string = \"UnprocessableEntityError\";\n}\n/** 429. `retryAfter` is the server's `Retry-After`, in seconds, when sent. */\nexport class RateLimitError extends APIError {\n static override readonly brandName: string = \"RateLimitError\";\n readonly retryAfter: number | undefined;\n constructor(status: number, body: unknown, headers: Headers, message?: string) {\n super(status, body, headers, message);\n const ms = parseRetryAfterMs(headers, Date.now());\n this.retryAfter = ms === undefined ? undefined : ms / 1000;\n }\n}\n/** Any 5xx. */\nexport class InternalServerError extends APIError {\n static override readonly brandName: string = \"InternalServerError\";\n}\n\n/**\n * Milliseconds the server asked us to wait: `retry-after-ms`, else\n * `Retry-After` as seconds or an HTTP date. `undefined` when absent or\n * unparseable; negative dates clamp to 0.\n */\nexport function parseRetryAfterMs(headers: Headers, now: number): number | undefined {\n const ms = headers.get(\"retry-after-ms\");\n if (ms !== null && ms.trim() !== \"\") {\n const n = Number(ms);\n if (Number.isFinite(n) && n >= 0) return n;\n }\n const value = headers.get(\"retry-after\");\n if (value === null || value.trim() === \"\") return undefined;\n const seconds = Number(value);\n if (Number.isFinite(seconds)) return seconds >= 0 ? seconds * 1000 : undefined;\n const date = Date.parse(value);\n if (Number.isNaN(date)) return undefined;\n return Math.max(0, date - now);\n}\n","/**\n * `APIPromise`: what every SDK method returns. Await it for the parsed\n * body, or call `.withResponse()` / `.asResponse()` for the HTTP layer.\n */\n\n/** Metadata attached (non-enumerable) to every object an SDK method returns. */\nexport interface LastResponse {\n requestId: string | undefined;\n status: number;\n headers: Headers;\n}\n\n/** Parsed `X-RateLimit-*` headers. Fields are `undefined` when the header is absent. */\nexport interface RateLimitInfo {\n limit: number | undefined;\n remaining: number | undefined;\n /** As sent by the server (seconds until reset, or a unix timestamp, per API). */\n reset: number | undefined;\n}\n\nexport interface WithResponse<T> {\n data: T;\n response: Response;\n requestId: string | undefined;\n rateLimit: RateLimitInfo | undefined;\n}\n\n/** What the transport hands to an `APIPromise`: a successful response plus how to parse it. */\nexport interface RawResult {\n response: Response;\n requestId: string | undefined;\n}\n\nfunction num(v: string | null): number | undefined {\n if (v === null || v.trim() === \"\") return undefined;\n const n = Number(v);\n return Number.isFinite(n) ? n : undefined;\n}\n\nexport function parseRateLimit(headers: Headers): RateLimitInfo | undefined {\n const limit = num(headers.get(\"x-ratelimit-limit\"));\n const remaining = num(headers.get(\"x-ratelimit-remaining\"));\n const reset = num(headers.get(\"x-ratelimit-reset\"));\n if (limit === undefined && remaining === undefined && reset === undefined) return undefined;\n return { limit, remaining, reset };\n}\n\n/** Attach `lastResponse` to an object without it showing up in `JSON.stringify`, spreads or `Object.keys`. */\nexport function attachLastResponse<T>(data: T, meta: LastResponse): T {\n if (data && typeof data === \"object\" && Object.isExtensible(data) && !(data instanceof Response)) {\n Object.defineProperty(data, \"lastResponse\", {\n value: meta,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n }\n return data;\n}\n\nexport class APIPromise<T> extends Promise<T> {\n #raw: Promise<RawResult>;\n #parse: (raw: RawResult) => Promise<T>;\n #parsed: Promise<WithResponse<T>> | undefined;\n\n constructor(raw: Promise<RawResult>, parse: (raw: RawResult) => Promise<T>) {\n // The executor is a placeholder: then/catch/finally below delegate to\n // the parsed result, so this base promise never carries the value.\n super((resolve) => resolve(null as T));\n this.#raw = raw;\n this.#parse = parse;\n }\n\n // `.then()` on a subclass must produce plain promises, not new APIPromises.\n static override get [Symbol.species]() {\n return Promise;\n }\n\n #withParsed(): Promise<WithResponse<T>> {\n if (!this.#parsed) {\n this.#parsed = this.#raw.then(async (raw) => ({\n data: await this.#parse(raw),\n response: raw.response,\n requestId: raw.requestId,\n rateLimit: parseRateLimit(raw.response.headers),\n }));\n }\n return this.#parsed;\n }\n\n /** The parsed body plus the `Response`, request id and rate-limit headers. */\n withResponse(): Promise<WithResponse<T>> {\n return this.#withParsed();\n }\n\n /** The raw `Response`, body unread. Use instead of awaiting (the body can only be read once). */\n asResponse(): Promise<Response> {\n return this.#raw.then((r) => r.response);\n }\n\n override then<R1 = T, R2 = never>(\n onfulfilled?: ((value: T) => R1 | PromiseLike<R1>) | null,\n onrejected?: ((reason: unknown) => R2 | PromiseLike<R2>) | null,\n ): Promise<R1 | R2> {\n return this.#withParsed().then((r) => r.data).then(onfulfilled, onrejected);\n }\n\n override catch<R = never>(onrejected?: ((reason: unknown) => R | PromiseLike<R>) | null): Promise<T | R> {\n return this.then(undefined, onrejected);\n }\n\n override finally(onfinally?: (() => void) | null): Promise<T> {\n return this.then().finally(onfinally);\n }\n}\n","/**\n * Cursor pagination over the uniform `{ data, pagination: { next_cursor, has_more } }` shape.\n */\n\nimport { APIPromise, type RawResult, type LastResponse } from \"./api-promise.js\";\nimport { ProductCraftError } from \"./errors.js\";\n\n/** The wire shape of every paginated list response. */\nexport interface PageResponse<Item> {\n data: Item[];\n pagination?: { next_cursor?: string | null; has_more?: boolean };\n}\n\n/** One page of a list. `await`ing a list call gives you this. */\nexport class Page<Item> {\n readonly data: Item[];\n readonly has_more: boolean;\n readonly next_cursor: string | null;\n declare readonly lastResponse: LastResponse;\n #fetchPage: (cursor: string) => PagePromise<Item>;\n #usedCursors: ReadonlySet<string>;\n\n /**\n * @param usedCursors The cursors already sent to reach this page (this\n * page's own included). A `next_cursor` among them means the API is\n * handing back a page it already returned, and following it would loop.\n */\n constructor(\n body: PageResponse<Item>,\n fetchPage: (cursor: string) => PagePromise<Item>,\n usedCursors: Iterable<string> = [],\n ) {\n this.data = Array.isArray(body?.data) ? body.data : [];\n this.next_cursor = body?.pagination?.next_cursor ?? null;\n this.has_more = Boolean(body?.pagination?.has_more) && this.next_cursor !== null;\n this.#fetchPage = fetchPage;\n this.#usedCursors = new Set(usedCursors);\n }\n\n hasNextPage(): boolean {\n return this.has_more;\n }\n\n /**\n * Fetch the following page. Throws when there is none (check `hasNextPage()` first),\n * and when the API returns a `next_cursor` this walk already sent: that would\n * fetch the same page forever, so `for await` stops with an error instead.\n */\n getNextPage(): PagePromise<Item> {\n if (!this.has_more || this.next_cursor === null) {\n throw new ProductCraftError(\"No next page; check hasNextPage() before calling getNextPage().\");\n }\n if (this.#usedCursors.has(this.next_cursor)) {\n const requestId = this.lastResponse?.requestId;\n throw new ProductCraftError(\n \"The API returned a next_cursor this list already used, so the next page would repeat an earlier one. \" +\n \"Stopped instead of looping; this is an API bug\" +\n (requestId ? ` (request id ${requestId}).` : \".\"),\n );\n }\n return this.#fetchPage(this.next_cursor);\n }\n\n /** The wire shape, so `JSON.stringify(page)` matches the API response. */\n toJSON(): PageResponse<Item> {\n return { data: this.data, pagination: { next_cursor: this.next_cursor, has_more: this.has_more } };\n }\n}\n\nexport interface ToArrayOptions {\n /** Required cap on how many items to collect across pages. `limit` stays the page size. */\n maxItems: number;\n}\n\n/**\n * Returned by paginated list methods. `await` it for the first `Page`;\n * `for await` over it for every item across pages; `.pages()` for pages.\n */\nexport class PagePromise<Item> extends APIPromise<Page<Item>> implements AsyncIterable<Item> {\n constructor(raw: Promise<RawResult>, parse: (raw: RawResult) => Promise<Page<Item>>) {\n super(raw, parse);\n }\n\n /** Iterate pages, starting with this one. */\n async *pages(): AsyncGenerator<Page<Item>, void, undefined> {\n let page: Page<Item> = await this;\n for (;;) {\n yield page;\n if (!page.hasNextPage()) return;\n page = await page.getNextPage();\n }\n }\n\n async *[Symbol.asyncIterator](): AsyncGenerator<Item, void, undefined> {\n for await (const page of this.pages()) {\n for (const item of page.data) yield item;\n }\n }\n\n /** Collect items across pages, stopping at `maxItems`. */\n async toArray(options: ToArrayOptions): Promise<Item[]> {\n const max = options?.maxItems;\n if (typeof max !== \"number\" || !(max >= 0)) {\n throw new ProductCraftError(\"toArray() needs { maxItems }, a non-negative number.\");\n }\n const out: Item[] = [];\n if (max === 0) return out;\n for await (const item of this) {\n out.push(item);\n if (out.length >= max) break;\n }\n return out;\n }\n}\n","/**\n * Webhook signature verification, shared by every product.\n *\n * Two schemes are accepted:\n *\n * - **Standard Webhooks** (`webhook-id`, `webhook-timestamp`,\n * `webhook-signature: v1,<base64> [v1,<base64> ...]`), HMAC-SHA256 over\n * `<id>.<timestamp>.<body>`. A `whsec_` secret is base64 key bytes; any\n * other secret is used as its UTF-8 bytes (Mail secrets minted before\n * Standard Webhooks support).\n * - **Legacy** `X-<Product>-Signature: t=<unix>,v1=<hex>`, HMAC-SHA256\n * over `<t>.<body>` with the secret's UTF-8 bytes (Auth audit sink,\n * Trawl, Social, Mail's first scheme).\n *\n * Uses `crypto.subtle` only (Node 20.3+, Bun, Deno, edge) and compares in\n * constant time.\n */\n\nimport { WebhookVerificationError } from \"./errors.js\";\n\n/** Node `IncomingHttpHeaders`, a Fetch `Headers`, or any plain header record. */\nexport type WebhookHeaders =\n | Headers\n | Record<string, string | string[] | undefined>\n | Iterable<[string, string]>;\n\n/** The raw request body, exactly as received. Never a parsed object. */\nexport type WebhookPayload = string | Uint8Array | ArrayBuffer;\n\nexport interface VerifyWebhookParams {\n payload: WebhookPayload;\n headers: WebhookHeaders;\n /** One secret, or several (Mail: default, per-domain and endpoint secrets; rotation). */\n secret: string | readonly string[];\n /** Maximum age (and clock skew) of the timestamp, in seconds. Default 300. */\n toleranceSeconds?: number;\n /** Override \"now\" (ms since epoch), for tests. */\n now?: number;\n}\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\n/** Lower-case header lookup over every supported header shape. */\nexport function normalizeHeaders(headers: WebhookHeaders): Map<string, string> {\n const out = new Map<string, string>();\n if (!headers) return out;\n const put = (k: string, v: unknown) => {\n if (v === undefined || v === null) return;\n const value = Array.isArray(v) ? v.map(String).join(\" \") : String(v);\n out.set(k.toLowerCase(), value);\n };\n if (typeof (headers as Headers).forEach === \"function\" && typeof (headers as Headers).get === \"function\") {\n (headers as Headers).forEach((v, k) => put(k, v));\n return out;\n }\n if (typeof (headers as Iterable<[string, string]>)[Symbol.iterator] === \"function\") {\n for (const [k, v] of headers as Iterable<[string, string]>) put(k, v);\n return out;\n }\n for (const [k, v] of Object.entries(headers as Record<string, unknown>)) put(k, v);\n return out;\n}\n\nfunction payloadBytes(payload: unknown): Uint8Array {\n if (typeof payload === \"string\") return encoder.encode(payload);\n if (payload instanceof Uint8Array) return payload;\n if (payload instanceof ArrayBuffer) return new Uint8Array(payload);\n throw new WebhookVerificationError(\n \"Webhook payload must be the raw request body (string, Buffer, Uint8Array or ArrayBuffer), not a parsed object. \" +\n \"Read the body before any JSON parser runs (express.raw(), `await req.text()`).\",\n );\n}\n\nfunction base64ToBytes(b64: string): Uint8Array | undefined {\n try {\n const bin = atob(b64);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n } catch {\n return undefined;\n }\n}\n\nfunction hexToBytes(hex: string): Uint8Array | undefined {\n if (hex.length % 2 !== 0 || !/^[0-9a-fA-F]*$/.test(hex)) return undefined;\n const out = new Uint8Array(hex.length / 2);\n for (let i = 0; i < out.length; i++) out[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n return out;\n}\n\n/** Constant-time comparison of two byte strings (length is not secret). */\nexport function timingSafeEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= (a[i] as number) ^ (b[i] as number);\n return diff === 0;\n}\n\nfunction concat(...parts: Uint8Array[]): Uint8Array {\n const len = parts.reduce((n, p) => n + p.length, 0);\n const out = new Uint8Array(len);\n let off = 0;\n for (const p of parts) {\n out.set(p, off);\n off += p.length;\n }\n return out;\n}\n\nasync function hmacSha256(key: Uint8Array, data: Uint8Array): Promise<Uint8Array> {\n const subtle = globalThis.crypto?.subtle;\n if (!subtle) {\n throw new WebhookVerificationError(\"crypto.subtle is unavailable in this runtime (Node 20.3+ required).\");\n }\n type Bytes = Parameters<typeof subtle.sign>[2];\n const k = await subtle.importKey(\"raw\", key as Bytes, { name: \"HMAC\", hash: \"SHA-256\" }, false, [\"sign\"]);\n return new Uint8Array(await subtle.sign(\"HMAC\", k, data as Bytes));\n}\n\nfunction standardKey(secret: string): Uint8Array {\n if (secret.startsWith(\"whsec_\")) {\n const bytes = base64ToBytes(secret.slice(\"whsec_\".length));\n if (!bytes) throw new WebhookVerificationError(\"Webhook secret is not valid base64 after the whsec_ prefix.\");\n return bytes;\n }\n return encoder.encode(secret);\n}\n\nfunction checkTimestamp(ts: number, toleranceSeconds: number, now: number): void {\n const nowSeconds = Math.floor(now / 1000);\n if (nowSeconds - ts > toleranceSeconds) throw new WebhookVerificationError(\"Webhook timestamp is too old.\");\n if (ts - nowSeconds > toleranceSeconds) throw new WebhookVerificationError(\"Webhook timestamp is too far in the future.\");\n}\n\nfunction parseTimestamp(raw: string): number {\n if (!/^\\d+$/.test(raw.trim())) throw new WebhookVerificationError(\"Webhook timestamp header is not a unix timestamp.\");\n return Number(raw.trim());\n}\n\nfunction findLegacyHeader(h: Map<string, string>): string | undefined {\n for (const [k, v] of h) if (/^x-[a-z0-9-]+-signature$/.test(k)) return v;\n return undefined;\n}\n\n/**\n * Verify a webhook's signature and timestamp, then return the parsed\n * JSON payload. Throws `WebhookVerificationError` on any failure.\n *\n * @example\n * const event = await verifyWebhook({ payload: rawBody, headers: req.headers, secret: process.env.WEBHOOK_SECRET! });\n */\nexport async function verifyWebhook<T = unknown>(params: VerifyWebhookParams): Promise<T> {\n const { headers, toleranceSeconds = 300 } = params;\n const now = params.now ?? Date.now();\n const secrets = (typeof params.secret === \"string\" ? [params.secret] : [...(params.secret ?? [])]).filter(\n (s) => typeof s === \"string\" && s !== \"\",\n );\n if (secrets.length === 0) throw new WebhookVerificationError(\"No webhook secret was given.\");\n const body = payloadBytes(params.payload);\n const h = normalizeHeaders(headers);\n\n const id = h.get(\"webhook-id\");\n const timestamp = h.get(\"webhook-timestamp\");\n const signature = h.get(\"webhook-signature\");\n let verified = false;\n\n if (id !== undefined || timestamp !== undefined || signature !== undefined) {\n if (!id || !timestamp || !signature) {\n throw new WebhookVerificationError(\"Missing webhook-id, webhook-timestamp or webhook-signature header.\");\n }\n const ts = parseTimestamp(timestamp);\n checkTimestamp(ts, toleranceSeconds, now);\n const candidates = signature\n .split(\" \")\n .map((entry) => entry.split(\",\", 2))\n .filter(([version, sig]) => version === \"v1\" && !!sig)\n .map(([, sig]) => base64ToBytes(sig as string))\n .filter((b): b is Uint8Array => !!b);\n const signed = concat(encoder.encode(`${id}.${ts}.`), body);\n for (const secret of secrets) {\n const expected = await hmacSha256(standardKey(secret), signed);\n // Compare against every candidate so timing does not reveal which matched.\n for (const c of candidates) if (timingSafeEqual(expected, c)) verified = true;\n }\n } else {\n const legacy = findLegacyHeader(h);\n if (!legacy) throw new WebhookVerificationError(\"No webhook signature header found.\");\n let t: string | undefined;\n const sigs: Uint8Array[] = [];\n for (const part of legacy.split(\",\").map((p) => p.trim())) {\n if (part.startsWith(\"t=\")) t = part.slice(2);\n else if (part.startsWith(\"v1=\")) {\n const b = hexToBytes(part.slice(3));\n if (b) sigs.push(b);\n }\n }\n if (t === undefined || sigs.length === 0) throw new WebhookVerificationError(\"Malformed signature header.\");\n const ts = parseTimestamp(t);\n checkTimestamp(ts, toleranceSeconds, now);\n const signed = concat(encoder.encode(`${ts}.`), body);\n for (const secret of secrets) {\n const expected = await hmacSha256(encoder.encode(secret), signed);\n for (const c of sigs) if (timingSafeEqual(expected, c)) verified = true;\n }\n }\n\n if (!verified) throw new WebhookVerificationError(\"Webhook signature does not match.\");\n const text = decoder.decode(body);\n try {\n return JSON.parse(text) as T;\n } catch (cause) {\n throw new WebhookVerificationError(\"Webhook payload is not valid JSON.\", { cause });\n }\n}\n\nexport interface SignWebhookParams {\n /**\n * The event to sign: a string or bytes are signed as-is; any other value is\n * `JSON.stringify`-ed first (the returned `payload` is that exact string).\n */\n payload: WebhookPayload | Record<string, unknown> | unknown[];\n /** The endpoint's signing secret (`whsec_…`, or a plain pre-Standard-Webhooks secret). */\n secret: string;\n /** `webhook-id`. Default: a random `msg_…` id. */\n id?: string;\n /** Unix seconds for `webhook-timestamp`. Default: now. */\n timestamp?: number;\n}\n\nexport interface SignedWebhook {\n /** The exact body that was signed: send or verify this, byte for byte. */\n payload: string;\n /** `webhook-id`, `webhook-timestamp`, `webhook-signature` (and `content-type`). */\n headers: Record<string, string>;\n}\n\n/**\n * Sign a payload the way ProductCraft signs webhooks (Standard Webhooks,\n * `v1,<base64 HMAC-SHA256>` over `<id>.<timestamp>.<body>`), for testing your\n * handler without a live delivery. `verifyWebhook` and `webhooks.unwrap`\n * accept the result.\n *\n * @example\n * const { payload, headers } = await signWebhook({ payload: { id: \"evt_1\", type: \"user.signup\", data: {} }, secret });\n * const event = await verifyWebhook({ payload, headers, secret });\n */\nexport async function signWebhook(params: SignWebhookParams): Promise<SignedWebhook> {\n const { secret } = params;\n if (typeof secret !== \"string\" || secret === \"\") throw new WebhookVerificationError(\"No webhook secret was given.\");\n const raw = params.payload;\n const payload =\n typeof raw === \"string\"\n ? raw\n : raw instanceof Uint8Array || raw instanceof ArrayBuffer\n ? decoder.decode(raw)\n : JSON.stringify(raw);\n const id = params.id ?? `msg_${randomHex(16)}`;\n const timestamp = Math.floor(params.timestamp ?? Date.now() / 1000);\n const mac = await hmacSha256(standardKey(secret), encoder.encode(`${id}.${timestamp}.${payload}`));\n return {\n payload,\n headers: {\n \"content-type\": \"application/json\",\n \"webhook-id\": id,\n \"webhook-timestamp\": String(timestamp),\n \"webhook-signature\": `v1,${bytesToBase64(mac)}`,\n },\n };\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let bin = \"\";\n for (const b of bytes) bin += String.fromCharCode(b);\n return btoa(bin);\n}\n\nfunction randomHex(bytes: number): string {\n const buf = new Uint8Array(bytes);\n globalThis.crypto.getRandomValues(buf);\n return [...buf].map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n","/**\n * `APIClient`: the hand-written runtime every generated resource method\n * calls. Nothing per-endpoint lives here (docs/sdk-standard.md section 4).\n */\n\nimport createClient, { type Client } from \"openapi-fetch\";\nimport {\n APIPromise,\n attachLastResponse,\n type LastResponse,\n type RawResult,\n} from \"./api-promise.js\";\nimport {\n APIConnectionError,\n APIError,\n APITimeoutError,\n APIUserAbortError,\n ConfigurationError,\n ProductCraftError,\n parseRetryAfterMs,\n} from \"./errors.js\";\nimport { authMiddleware, PC_BASE_URL, readEnv, resolveAuth, type PCAuth } from \"./legacy.js\";\nimport { Page, PagePromise, type PageResponse } from \"./pagination.js\";\nimport { CORE_VERSION } from \"./version.js\";\nimport {\n signWebhook,\n verifyWebhook,\n type SignedWebhook,\n type SignWebhookParams,\n type WebhookHeaders,\n type WebhookPayload,\n} from \"./webhooks.js\";\n\nexport type HTTPMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\nexport type LogLevel = \"off\" | \"warn\" | \"debug\";\n\n/** Anything with pino- or console-shaped methods. */\nexport interface Logger {\n debug(...args: unknown[]): void;\n info(...args: unknown[]): void;\n warn(...args: unknown[]): void;\n error(...args: unknown[]): void;\n}\n\nexport interface ClientOptions {\n /** Workspace API key (`pcft_live_…`). Falls back to `PRODUCTCRAFT_API_KEY`. Shorthand for `auth: { type: \"apiKey\", key }`. */\n apiKey?: string;\n /** Explicit credential (API key, bearer token or cookie). Wins over `apiKey`. */\n auth?: PCAuth;\n /** Override the product's base URL. */\n baseUrl?: string;\n /**\n * Default `{workspace_id}`. Falls back to `PRODUCTCRAFT_WORKSPACE_ID`, then (workspace API keys only)\n * one cached `GET /v1/api-keys/self` lookup per process.\n */\n workspaceId?: string;\n /** Per-attempt timeout in ms. Default 60 000. */\n timeout?: number;\n /** Retries after the first attempt. Default 2. */\n maxRetries?: number;\n /** Custom `fetch` (custom transports, tracing). Defaults to the global `fetch`. */\n fetch?: typeof fetch;\n /** Headers sent on every request. */\n defaultHeaders?: Record<string, string>;\n /** Allow a workspace API key in a browser. Leaks the key to anyone who loads the page. */\n dangerouslyAllowBrowser?: boolean;\n /** `off` (default), `warn` or `debug`. Falls back to `PRODUCTCRAFT_LOG`. */\n logLevel?: LogLevel;\n /** Where log lines go. Default `console`. Never receives headers or bodies. */\n logger?: Logger;\n /** Default secret(s) for `webhooks.unwrap`. */\n webhookSecret?: string | readonly string[];\n /** Platform-auth host used for the workspace lookup. */\n platformAuthBaseUrl?: string;\n /**\n * Read `PRODUCTCRAFT_API_KEY` when neither `auth` nor `apiKey` is passed. Default `true`.\n * Auth's consumer scope sets `false`: routes acting for an end user never pick up a workspace key.\n */\n credentialFromEnv?: boolean;\n}\n\n/** Per-request options: always the last argument of an SDK method. */\nexport interface RequestOptions {\n /** Overrides the automatic Idempotency-Key (and makes a POST/PATCH retryable). */\n idempotencyKey?: string;\n /** Per-attempt timeout in ms. */\n timeout?: number;\n maxRetries?: number;\n headers?: Record<string, string | undefined>;\n signal?: AbortSignal;\n /** `{workspace_id}` for this call (bearer tokens that span workspaces). */\n workspaceId?: string;\n fetch?: typeof fetch;\n}\n\n/** What a generated method hands to `request()`. */\nexport interface RequestSpec {\n method: HTTPMethod;\n /** Path template, e.g. `/v1/workspaces/{workspace_id}/domains/{id}`. */\n path: string;\n pathParams?: Record<string, string | number | undefined>;\n query?: Record<string, unknown>;\n body?: unknown;\n headers?: Record<string, string | undefined>;\n /** The spec declares an `Idempotency-Key` header on this operation. */\n idempotent?: boolean;\n /** The success response is not JSON: resolve to the raw `Response`. */\n raw?: boolean;\n /** Keyless, browser-safe route: send no credential. */\n public?: boolean;\n}\n\nexport interface PollConfig {\n /** Field whose value decides completion, e.g. `status`. */\n field: string;\n /** Values that end the poll. */\n terminal: readonly string[];\n}\n\nexport interface PollOptions extends RequestOptions {\n /** Delay between polls in ms, unless the server sends `Retry-After`. Default 2 000. */\n intervalMs?: number;\n /** Give up after this many ms. Default 300 000. */\n timeoutMs?: number;\n}\n\n/** Identifies the product package in `User-Agent`. */\nexport interface SDKIdentity {\n name: string;\n version: string;\n}\n\nexport const DEFAULT_TIMEOUT_MS = 60_000;\nexport const DEFAULT_MAX_RETRIES = 2;\n/** Retry-After above this fails fast instead of waiting. */\nexport const MAX_RETRY_AFTER_MS = 60_000;\nexport const PC_WORKSPACE_ID_ENV = \"PRODUCTCRAFT_WORKSPACE_ID\";\nexport const PC_LOG_ENV = \"PRODUCTCRAFT_LOG\";\nconst WORKSPACE_LOOKUP_TIMEOUT_MS = 5_000;\n\nconst RETRY_STATUSES = new Set([408, 429, 500, 502, 503, 504]);\nconst SAFE_METHODS = new Set<HTTPMethod>([\"GET\", \"PUT\", \"DELETE\"]);\n\n/** Full-jitter exponential backoff: random in [0, min(8 s, 0.5 s * 2^attempt)). */\nexport function backoffMs(attempt: number): number {\n return Math.random() * Math.min(8_000, 500 * 2 ** attempt);\n}\n\nfunction isBrowser(): boolean {\n const g = globalThis as { window?: { document?: unknown }; navigator?: unknown };\n return typeof g.window !== \"undefined\" && typeof g.window?.document !== \"undefined\" && typeof g.navigator !== \"undefined\";\n}\n\nfunction runtimeTag(): string {\n const g = globalThis as {\n Bun?: { version?: string };\n Deno?: { version?: { deno?: string } };\n process?: { versions?: { node?: string } };\n };\n if (g.Bun?.version) return `bun/${g.Bun.version}`;\n if (g.Deno?.version?.deno) return `deno/${g.Deno.version.deno}`;\n if (g.process?.versions?.node) return `node/${g.process.versions.node}`;\n return \"runtime/unknown\";\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(new APIUserAbortError());\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(new APIUserAbortError());\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nfunction isBodyInit(body: unknown): boolean {\n return (\n typeof body === \"string\" ||\n body instanceof ArrayBuffer ||\n ArrayBuffer.isView(body) ||\n (typeof Blob !== \"undefined\" && body instanceof Blob) ||\n (typeof FormData !== \"undefined\" && body instanceof FormData) ||\n (typeof URLSearchParams !== \"undefined\" && body instanceof URLSearchParams) ||\n (typeof ReadableStream !== \"undefined\" && body instanceof ReadableStream)\n );\n}\n\nasync function readErrorBody(res: Response): Promise<unknown> {\n const text = await res.text().catch(() => \"\");\n if (text === \"\") return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\n// The client's custom fetch, for createOpenAPIClient (kept off the instance's public surface).\nconst customFetch = new WeakMap<object, typeof fetch | undefined>();\n\n/**\n * The typed `openapi-fetch` escape hatch (`.client` on every product), over\n * the same credential and base URL as `api`. It does not retry.\n * A standalone function so bundles that never use it leave openapi-fetch out.\n */\nexport function createOpenAPIClient<TPaths extends object>(api: APIClient): Client<TPaths> {\n const client = createClient<TPaths>({ baseUrl: api.baseUrl, fetch: customFetch.get(api) });\n client.use(authMiddleware(api.auth));\n return client;\n}\n\n// One shared lookup per (platform host, key) per process, kept on a global symbol so\n// duplicate copies of core (two product packages on different core versions) share it too.\nconst workspaceCache: Map<string, Promise<string>> = ((globalThis as Record<symbol, unknown>)[\n Symbol.for(\"productcraft.workspaceCache\")\n] ??= new Map<string, Promise<string>>()) as Map<string, Promise<string>>;\n\n/** Clears the per-process workspace lookup cache. For tests. */\nexport function _resetWorkspaceCache(): void {\n workspaceCache.clear();\n}\n\nexport class APIClient {\n readonly baseUrl: string;\n /** The resolved credential. Non-enumerable, so logging the client does not print the key. */\n declare readonly auth: PCAuth | undefined;\n readonly workspaceId: string | undefined;\n readonly timeout: number;\n readonly maxRetries: number;\n readonly webhookSecret: string | readonly string[] | undefined;\n readonly #fetch: typeof fetch | undefined;\n readonly #defaultHeaders: Record<string, string>;\n readonly #platformAuthBaseUrl: string;\n readonly #logLevel: LogLevel;\n readonly #logger: Logger;\n readonly #userAgent: string;\n\n constructor(options: ClientOptions = {}, defaultBaseUrl: string, sdk?: SDKIdentity) {\n this.baseUrl = (options.baseUrl ?? defaultBaseUrl).replace(/\\/+$/, \"\");\n Object.defineProperty(this, \"auth\", {\n value: ((explicit: PCAuth | undefined) => (options.credentialFromEnv === false ? explicit : resolveAuth(explicit)))(\n options.auth ?? (options.apiKey ? { type: \"apiKey\", key: options.apiKey } : undefined),\n ),\n enumerable: false,\n writable: false,\n });\n if (this.auth?.type === \"apiKey\" && isBrowser() && !options.dangerouslyAllowBrowser) {\n throw new ConfigurationError(\n \"A workspace API key was used in a browser, where anyone who loads the page can read it. \" +\n \"Call ProductCraft from your server, or pass dangerouslyAllowBrowser: true if you accept that risk.\",\n );\n }\n this.workspaceId = options.workspaceId ?? readEnv(PC_WORKSPACE_ID_ENV);\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.webhookSecret = options.webhookSecret;\n this.#fetch = options.fetch;\n customFetch.set(this, options.fetch);\n this.#defaultHeaders = { ...options.defaultHeaders };\n this.#platformAuthBaseUrl = (options.platformAuthBaseUrl ?? PC_BASE_URL.platformAuth).replace(/\\/+$/, \"\");\n const level = options.logLevel ?? (readEnv(PC_LOG_ENV) as LogLevel | undefined);\n this.#logLevel = level === \"debug\" || level === \"warn\" ? level : \"off\";\n this.#logger = options.logger ?? console;\n const product = sdk ? `${sdk.name}@${sdk.version}` : `core@${CORE_VERSION}`;\n this.#userAgent = `productcraft-node/${product} ${runtimeTag()}`;\n }\n\n #log(level: \"debug\" | \"warn\", message: string, fields: Record<string, unknown>): void {\n if (this.#logLevel === \"off\") return;\n if (level === \"debug\" && this.#logLevel !== \"debug\") return;\n try {\n this.#logger[level](`[productcraft] ${message}`, fields);\n } catch {\n // A broken logger must never break a request.\n }\n }\n\n /** Send one logical API call (with retries). Resolves to the parsed body. */\n request<T>(spec: RequestSpec, options: RequestOptions = {}): APIPromise<T> {\n return new APIPromise<T>(this.#send(spec, options), (raw) => this.#parseBody<T>(spec, raw));\n }\n\n /** A paginated list call. `await` for one page, `for await` for every item. */\n list<Item>(spec: RequestSpec, options: RequestOptions = {}): PagePromise<Item> {\n // `used`: every cursor sent on the way to this page, so a repeated\n // `next_cursor` (an API that ignores the cursor) stops the walk.\n const at = (cursor: string | undefined, used: readonly string[]): PagePromise<Item> => {\n const pageSpec: RequestSpec = cursor === undefined ? spec : { ...spec, query: { ...spec.query, cursor } };\n return new PagePromise<Item>(this.#send(pageSpec, options), async (raw) => {\n const body = await this.#parseBody<PageResponse<Item>>(pageSpec, raw);\n const page = new Page<Item>(body as PageResponse<Item>, (next) => at(next, [...used, next]), used);\n return attachLastResponse(page, this.#meta(raw));\n });\n };\n const first = spec.query?.cursor;\n return at(undefined, typeof first === \"string\" && first !== \"\" ? [first] : []);\n }\n\n /** Retrieve repeatedly until `config.field` reaches a terminal value. */\n async poll<T>(spec: RequestSpec, config: PollConfig, options: PollOptions = {}): Promise<T> {\n const { intervalMs = 2_000, timeoutMs = 300_000, ...requestOptions } = options;\n const deadline = Date.now() + timeoutMs;\n for (;;) {\n const { data, response } = await this.request<T>(spec, requestOptions).withResponse();\n const value = (data as Record<string, unknown> | undefined)?.[config.field];\n if (typeof value === \"string\" && config.terminal.includes(value)) return data;\n const retryAfter = parseRetryAfterMs(response.headers, Date.now());\n const wait = retryAfter !== undefined && retryAfter <= MAX_RETRY_AFTER_MS ? retryAfter : intervalMs;\n if (Date.now() + wait > deadline) {\n throw new APITimeoutError(\n `Polling ${spec.path} timed out after ${timeoutMs} ms; last ${config.field} was ${JSON.stringify(value)}.`,\n );\n }\n this.#log(\"debug\", \"poll\", { path: spec.path, [config.field]: value, wait_ms: wait });\n await sleep(wait, options.signal);\n }\n }\n\n /** Create, then poll the created object to a terminal state. */\n async createAndPoll<T>(\n createSpec: RequestSpec,\n retrieveSpec: (created: T) => RequestSpec,\n config: PollConfig,\n options: PollOptions = {},\n ): Promise<T> {\n const { intervalMs, timeoutMs, ...requestOptions } = options;\n const created = await this.request<T>(createSpec, requestOptions);\n const value = (created as Record<string, unknown> | undefined)?.[config.field];\n if (typeof value === \"string\" && config.terminal.includes(value)) return created;\n // The create's idempotency key must not leak into the retrieves.\n const pollOptions: PollOptions = { ...requestOptions, intervalMs, timeoutMs };\n delete pollOptions.idempotencyKey;\n return this.poll<T>(retrieveSpec(created), config, pollOptions);\n }\n\n /** Verify a webhook with the given secret, the client's `webhookSecret`, or `envVar`. */\n async unwrapWebhook<T = unknown>(\n params: { payload: WebhookPayload; headers: WebhookHeaders; secret?: string | readonly string[]; toleranceSeconds?: number },\n envVar?: string,\n ): Promise<T> {\n const secret = params.secret ?? this.webhookSecret ?? (envVar ? readEnv(envVar) : undefined);\n if (!secret || (Array.isArray(secret) && secret.length === 0)) {\n throw new ConfigurationError(\n `No webhook secret: pass { secret }, set webhookSecret on the client${envVar ? ` or ${envVar}` : \"\"}.`,\n );\n }\n return verifyWebhook<T>({ ...params, secret });\n }\n\n /** Sign a test payload with `params.secret`, else `webhookSecret`, else `envVar` (`webhooks.sign`). */\n async signWebhook(\n params: Omit<SignWebhookParams, \"secret\"> & { secret?: string },\n envVar?: string,\n ): Promise<SignedWebhook> {\n const fallback = Array.isArray(this.webhookSecret) ? this.webhookSecret[0] : this.webhookSecret;\n const secret = params.secret ?? (fallback as string | undefined) ?? (envVar ? readEnv(envVar) : undefined);\n if (!secret) {\n throw new ConfigurationError(\n `No webhook secret: pass { secret }, set webhookSecret on the client${envVar ? ` or ${envVar}` : \"\"}.`,\n );\n }\n return signWebhook({ ...params, secret });\n }\n\n #meta(raw: RawResult): LastResponse {\n return { requestId: raw.requestId, status: raw.response.status, headers: raw.response.headers };\n }\n\n async #parseBody<T>(spec: RequestSpec, raw: RawResult): Promise<T> {\n const res = raw.response;\n if (spec.raw) return res as T;\n if (res.status === 204 || res.status === 205) return undefined as T;\n const type = res.headers.get(\"content-type\") ?? \"\";\n if (!/[/+]json\\b/i.test(type)) {\n // An empty body with no content type is a void success; anything else non-JSON is handed back raw.\n if (res.headers.get(\"content-length\") === \"0\") return undefined as T;\n return res as T;\n }\n const text = await res.text();\n if (text === \"\") return undefined as T;\n const data = JSON.parse(text) as T;\n return attachLastResponse(data, this.#meta(raw));\n }\n\n async #resolveWorkspaceId(options: RequestOptions, fetchImpl: typeof fetch): Promise<string> {\n if (options.workspaceId) return options.workspaceId;\n if (this.workspaceId) return this.workspaceId;\n if (this.auth?.type !== \"apiKey\") {\n throw new ConfigurationError(\n \"pass workspaceId: this call is workspace-scoped and the credential is not a workspace API key \" +\n \"(bearer and cookie credentials can span workspaces, so the SDK never guesses).\",\n );\n }\n const key = this.auth.key;\n const cacheKey = `${this.#platformAuthBaseUrl}\\u0000${key}`;\n let pending = workspaceCache.get(cacheKey);\n if (!pending) {\n pending = this.#lookupWorkspace(key, fetchImpl);\n workspaceCache.set(cacheKey, pending);\n pending.catch(() => workspaceCache.delete(cacheKey));\n }\n return pending;\n }\n\n async #lookupWorkspace(key: string, fetchImpl: typeof fetch): Promise<string> {\n this.#log(\"debug\", \"resolving workspaceId\", { path: \"/v1/api-keys/self\" });\n let res: Response;\n try {\n res = await fetchImpl(`${this.#platformAuthBaseUrl}/v1/api-keys/self`, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${key}`, Accept: \"application/json\", \"User-Agent\": this.#userAgent },\n signal: AbortSignal.timeout(WORKSPACE_LOOKUP_TIMEOUT_MS),\n });\n } catch (cause) {\n throw new ConfigurationError(\"pass workspaceId: looking it up from the API key failed.\", { cause });\n }\n if (!res.ok) {\n const body = await readErrorBody(res);\n throw new ConfigurationError(\n `pass workspaceId: looking it up from the API key failed with ${res.status}.`,\n { cause: APIError.generate(res.status, body, res.headers) },\n );\n }\n const body = (await res.json().catch(() => undefined)) as { workspace?: { id?: unknown } } | undefined;\n const id = body?.workspace?.id;\n if (typeof id !== \"string\" || id === \"\") {\n throw new ConfigurationError(\"pass workspaceId: the API key lookup returned no workspace id.\");\n }\n return id;\n }\n\n async #buildUrl(spec: RequestSpec, options: RequestOptions, fetchImpl: typeof fetch): Promise<string> {\n const params: Record<string, string | number | undefined> = { ...spec.pathParams };\n if (spec.path.includes(\"{workspace_id}\") && params.workspace_id === undefined) {\n params.workspace_id = await this.#resolveWorkspaceId(options, fetchImpl);\n }\n const path = spec.path.replace(/\\{([^}]+)\\}/g, (_, name: string) => {\n const value = params[name];\n if (value === undefined || value === null || value === \"\") {\n throw new ProductCraftError(`Missing path parameter \"${name}\" for ${spec.method} ${spec.path}.`);\n }\n return encodeURIComponent(String(value));\n });\n const search = new URLSearchParams();\n for (const [k, v] of Object.entries(spec.query ?? {})) {\n if (v === undefined || v === null) continue;\n for (const item of Array.isArray(v) ? v : [v]) {\n if (item === undefined || item === null) continue;\n search.append(k, item instanceof Date ? item.toISOString() : typeof item === \"object\" ? JSON.stringify(item) : String(item));\n }\n }\n const qs = search.toString();\n return `${this.baseUrl}${path}${qs ? `?${qs}` : \"\"}`;\n }\n\n async #send(spec: RequestSpec, options: RequestOptions): Promise<RawResult> {\n const fetchImpl = options.fetch ?? this.#fetch ?? globalThis.fetch;\n if (typeof fetchImpl !== \"function\") {\n throw new ConfigurationError(\"No fetch implementation: pass { fetch } or use Node 20.3+.\");\n }\n if (options.signal?.aborted) throw new APIUserAbortError();\n const url = await this.#buildUrl(spec, options, fetchImpl);\n\n const headers = new Headers();\n headers.set(\"Accept\", \"application/json\");\n if (!isBrowser()) headers.set(\"User-Agent\", this.#userAgent);\n for (const source of [this.#defaultHeaders, spec.headers, options.headers]) {\n for (const [k, v] of Object.entries(source ?? {})) {\n if (v === undefined) headers.delete(k);\n else headers.set(k, v);\n }\n }\n if (!spec.public && this.auth) {\n if (this.auth.type === \"cookie\") headers.set(\"Cookie\", `auth_token=${this.auth.value}`);\n else headers.set(\"Authorization\", `Bearer ${this.auth.type === \"apiKey\" ? this.auth.key : this.auth.token}`);\n }\n\n // One key per logical call, reused on every retry.\n if (options.idempotencyKey) headers.set(\"Idempotency-Key\", options.idempotencyKey);\n else if (spec.idempotent && !headers.has(\"Idempotency-Key\")) headers.set(\"Idempotency-Key\", `pc_${crypto.randomUUID()}`);\n\n let body: RequestInit[\"body\"];\n if (spec.body !== undefined) {\n if (isBodyInit(spec.body)) body = spec.body as RequestInit[\"body\"];\n else {\n body = JSON.stringify(spec.body);\n if (!headers.has(\"Content-Type\")) headers.set(\"Content-Type\", \"application/json\");\n }\n }\n\n // A POST/PATCH without a key is never retried: fetch cannot tell whether the bytes were sent.\n const retryable = SAFE_METHODS.has(spec.method) || headers.has(\"Idempotency-Key\");\n const maxRetries = Math.max(0, options.maxRetries ?? this.maxRetries);\n const timeout = options.timeout ?? this.timeout;\n\n for (let attempt = 0; ; attempt++) {\n if (attempt > 0) headers.set(\"X-PC-SDK-Retry-Count\", String(attempt));\n const timeoutCtl = new AbortController();\n const timer = setTimeout(() => timeoutCtl.abort(), timeout);\n const signal = options.signal ? AbortSignal.any([options.signal, timeoutCtl.signal]) : timeoutCtl.signal;\n const canRetry = retryable && attempt < maxRetries;\n this.#log(\"debug\", \"request\", { method: spec.method, path: spec.path, attempt });\n\n let res: Response;\n try {\n res = await fetchImpl(url, { method: spec.method, headers, body, signal });\n } catch (cause) {\n clearTimeout(timer);\n if (options.signal?.aborted) throw new APIUserAbortError(undefined, { cause });\n const error = timeoutCtl.signal.aborted\n ? new APITimeoutError(`Request timed out after ${timeout} ms.`, { cause })\n : new APIConnectionError(`Connection error: ${(cause as Error)?.message ?? String(cause)}`, { cause });\n if (!canRetry) throw error;\n const wait = backoffMs(attempt);\n this.#log(\"debug\", \"retrying after connection error\", { method: spec.method, path: spec.path, attempt, wait_ms: Math.round(wait) });\n await sleep(wait, options.signal);\n continue;\n }\n clearTimeout(timer);\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n\n if (res.ok) {\n this.#log(\"debug\", \"response\", { method: spec.method, path: spec.path, status: res.status, request_id: requestId, attempt });\n return { response: res, requestId };\n }\n\n const errorBody = await readErrorBody(res);\n const error = APIError.generate(res.status, errorBody, res.headers);\n this.#log(\"debug\", \"response\", { method: spec.method, path: spec.path, status: res.status, request_id: error.requestId, attempt });\n const statusRetryable =\n RETRY_STATUSES.has(res.status) || (res.status === 409 && error.code === \"IDEMPOTENCY_IN_PROGRESS\");\n if (!canRetry || !statusRetryable) throw error;\n const retryAfter = parseRetryAfterMs(res.headers, Date.now());\n if (retryAfter !== undefined && retryAfter > MAX_RETRY_AFTER_MS) {\n this.#log(\"warn\", \"Retry-After above 60 s, not retrying\", { path: spec.path, status: res.status, request_id: error.requestId });\n throw error;\n }\n const wait = retryAfter ?? backoffMs(attempt);\n this.#log(\"debug\", \"retrying\", { method: spec.method, path: spec.path, status: res.status, attempt, wait_ms: Math.round(wait) });\n await sleep(wait, options.signal);\n }\n }\n}\n"]}