@spreadspace/embed 0.1.0 → 0.1.2

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
@@ -862,7 +862,10 @@ var SpreadSpaceClient = class {
862
862
  webhooks;
863
863
  embed;
864
864
  // ── Internals ────────────────────────────────────────────────────────────
865
- apiKey;
865
+ // ECMAScript #private (not TS `private`): runtime-invisible, so the
866
+ // credential can never ride JSON.stringify/console.log/spread of the
867
+ // client or anything holding it.
868
+ #apiKey;
866
869
  timeoutMs;
867
870
  fetchImpl;
868
871
  idempotencyKeyGenerator;
@@ -872,7 +875,7 @@ var SpreadSpaceClient = class {
872
875
  "SpreadSpaceClient requires an apiKey. Issue one from the dashboard at /settings/api-keys."
873
876
  );
874
877
  }
875
- this.apiKey = options.apiKey;
878
+ this.#apiKey = options.apiKey;
876
879
  let baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;
877
880
  while (baseUrl.endsWith("/")) baseUrl = baseUrl.slice(0, -1);
878
881
  this.baseUrl = baseUrl;
@@ -982,7 +985,7 @@ var SpreadSpaceClient = class {
982
985
  }
983
986
  buildHeaders(method, options) {
984
987
  const headers = new Headers();
985
- headers.set("Authorization", `Bearer ${this.apiKey}`);
988
+ headers.set("Authorization", `Bearer ${this.#apiKey}`);
986
989
  headers.set("SpreadSpace-Version", options.apiVersion ?? this.apiVersion);
987
990
  headers.set("Accept", "application/json");
988
991
  headers.set("User-Agent", this.buildUserAgent());
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/pagination.ts","../src/resources/borrowers.ts","../src/resources/documents.ts","../src/resources/embed.ts","../src/resources/extractions.ts","../src/resources/jobs.ts","../src/resources/loans.ts","../src/webhook-signature.ts","../src/resources/webhooks.ts","../src/version.ts","../src/client.ts"],"names":["createHmac","timingSafeEqual","randomUUID"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Public error hierarchy for the SpreadSpace SDK.\n *\n * Any non-2xx response from the API is thrown as an instance of one of the\n * subclasses below so integrators can pattern-match on the error type without\n * parsing response bodies. The shape mirrors the canonical\n * `ApiErrorResponse` envelope:\n *\n * { error: { type, message, request_id, details? } }\n *\n * `request_id` is preserved on every thrown error so customers can quote it\n * in support tickets.\n */\n\nexport interface SpreadSpaceErrorParams {\n type: string;\n message: string;\n statusCode: number;\n requestId?: string;\n rawBody?: unknown;\n details?: Record<string, string>;\n}\n\n/**\n * Base class for every error thrown by the SDK in response to a non-2xx\n * API response. Network-layer failures (DNS, TCP reset, fetch abort) are\n * surfaced as `NetworkError`.\n */\nexport class SpreadSpaceError extends Error {\n /**\n * The canonical `error.type` string from the API envelope, e.g.\n * `invalid_request`, `rate_limited`, `idempotency_request_mismatch`.\n * Stable across versions — clients pattern-match on this.\n */\n public readonly type: string;\n\n /** HTTP status code. */\n public readonly statusCode: number;\n\n /** `X-Request-ID` echoed from the server. Quote in support tickets. */\n public readonly requestId?: string;\n\n /** Raw response body for debugging. May be the parsed JSON or a string. */\n public readonly rawBody?: unknown;\n\n /** Optional structured details (e.g. `borrower_id` on `pii_claim_required`). */\n public readonly details?: Record<string, string>;\n\n constructor(params: SpreadSpaceErrorParams) {\n super(params.message);\n this.name = new.target.name;\n this.type = params.type;\n this.statusCode = params.statusCode;\n this.requestId = params.requestId;\n this.rawBody = params.rawBody;\n this.details = params.details;\n\n // Maintain the prototype chain — necessary for `instanceof` to work after\n // transpilation to ES5 (some integrator builds still target older runtimes).\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** 400 Bad Request — typically schema validation. */\nexport class InvalidRequestError extends SpreadSpaceError {}\n\n/** 401 Unauthorized — missing, expired, or invalid API key. */\nexport class AuthenticationError extends SpreadSpaceError {}\n\n/**\n * 403 Forbidden — caller is authenticated but lacks permission. Includes\n * the PII-claim-required and business-email-required cases.\n */\nexport class PermissionError extends SpreadSpaceError {}\n\n/** 404 Not Found. */\nexport class NotFoundError extends SpreadSpaceError {}\n\n/**\n * 409 Conflict — typically `idempotency_request_mismatch` (same key, different\n * body) or a domain-specific conflict (duplicate resource).\n */\nexport class ConflictError extends SpreadSpaceError {}\n\n/**\n * 429 Too Many Requests. The SDK retries automatically up to `maxRetries`,\n * honoring `Retry-After`; this error is only thrown when retries are\n * exhausted.\n */\nexport class RateLimitError extends SpreadSpaceError {}\n\n/**\n * 5xx Server Error. Retries are exhausted by the time this surfaces.\n */\nexport class ServerError extends SpreadSpaceError {}\n\n/**\n * Transport-level failure — DNS, TCP reset, fetch abort, JSON parse failure\n * on a 2xx response. Distinct from API-shaped errors so integrators can\n * decide to retry differently.\n */\nexport class NetworkError extends Error {\n public readonly cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = 'NetworkError';\n this.cause = cause;\n Object.setPrototypeOf(this, NetworkError.prototype);\n }\n}\n\n/**\n * Map an HTTP status code + canonical `error.type` to the right error class.\n *\n * The status is the primary signal (so a 500 with no body still becomes\n * `ServerError`), but the type sharpens the case at the same status — e.g.\n * a 403 `pii_claim_required` is still a `PermissionError`, but a future\n * 403 `embed_session_revoked` would also end up there without a code change.\n */\nexport function classifyError(statusCode: number, _type: string | undefined): typeof SpreadSpaceError {\n if (statusCode === 400) return InvalidRequestError;\n if (statusCode === 401) return AuthenticationError;\n if (statusCode === 403) return PermissionError;\n if (statusCode === 404) return NotFoundError;\n if (statusCode === 409) return ConflictError;\n if (statusCode === 429) return RateLimitError;\n if (statusCode >= 500) return ServerError;\n // 4xx other than the above — surface generically as InvalidRequestError.\n return InvalidRequestError;\n}\n","import type { CursorPaginated, RequestOptions } from './types.js';\n\n/**\n * Pager handed back from resource `.list()` methods. Three ways to consume:\n *\n * 1. **`for await`** — iterate every item across all pages. The most common.\n *\n * for await (const loan of client.loans.list()) { ... }\n *\n * 2. **`.toArray()`** — eagerly drain into a single array. Convenient for\n * small result sets; avoid for unbounded queries (the entire result\n * must fit in memory).\n *\n * const loans = await client.loans.list().toArray();\n *\n * 3. **`for await ... of pager.pages()`** — iterate page-at-a-time, one\n * network round-trip per loop body. Useful when the integrator wants to\n * batch-process results (e.g. write a chunk to a DB, then continue).\n *\n * for await (const page of client.loans.list().pages()) { ... }\n */\nexport interface AsyncPager<T> extends AsyncIterableIterator<T> {\n /**\n * Eagerly consume every page and return all items as a single array.\n * Throws if any underlying request fails.\n */\n toArray(): Promise<T[]>;\n\n /**\n * Page-by-page async iterator. Each yielded value is a\n * `CursorPaginated<T>` envelope — useful when you want to control\n * batch-size flow rather than per-item flow.\n */\n pages(): AsyncIterableIterator<CursorPaginated<T>>;\n}\n\n/**\n * Minimal interface the pager needs from the client. Decoupled from the\n * concrete `SpreadSpaceClient` so this module stays independently testable.\n */\nexport interface PagerClient {\n request<T>(\n method: 'GET',\n path: string,\n options?: { query?: Record<string, string | number | boolean | undefined> } & RequestOptions,\n ): Promise<T>;\n}\n\n/**\n * Build a pager that walks a cursor-paginated list endpoint.\n *\n * Pagination contract — assumed identical for every list endpoint in the\n * API:\n * - GET request, `?cursor=...` carries the opaque next-page token.\n * - Response shape: `{ data: T[], limit: number, next_cursor: string | null }`.\n * - `next_cursor === null` (or absent) means end-of-stream.\n *\n * This function is invoked by every `Resource.list()` method — keeping the\n * pagination logic in one place means we never have to duplicate the\n * cursor-walk loop across resources.\n */\nexport function paginate<T>(\n client: PagerClient,\n path: string,\n params?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions,\n): AsyncPager<T> {\n let cursor: string | undefined;\n let exhausted = false;\n\n async function fetchPage(): Promise<CursorPaginated<T> | null> {\n if (exhausted) return null;\n\n const query: Record<string, string | number | boolean | undefined> = { ...(params ?? {}) };\n if (cursor !== undefined) query.cursor = cursor;\n\n const response = await client.request<CursorPaginated<T>>('GET', path, {\n query,\n ...options,\n });\n\n const next = response.next_cursor ?? null;\n if (!next) {\n exhausted = true;\n } else {\n cursor = next;\n }\n\n return response;\n }\n\n // Per-item async iterator — drains pages internally and yields each item.\n // `for await` over the pager itself ends up here.\n async function* itemIterator(): AsyncGenerator<T, void, undefined> {\n while (true) {\n const page = await fetchPage();\n if (!page) return;\n for (const item of page.data) {\n yield item;\n }\n if (exhausted) return;\n }\n }\n\n // Per-page async iterator — yields the full envelope each iteration.\n async function* pageIterator(): AsyncGenerator<CursorPaginated<T>, void, undefined> {\n while (true) {\n const page = await fetchPage();\n if (!page) return;\n yield page;\n if (exhausted) return;\n }\n }\n\n const iter = itemIterator();\n\n const pager: AsyncPager<T> = {\n async next(): Promise<IteratorResult<T>> {\n return iter.next();\n },\n async return(value?: T): Promise<IteratorResult<T>> {\n // Drop any further pagination — caller is bailing early.\n exhausted = true;\n return { value: value as T, done: true };\n },\n async throw(err?: unknown): Promise<IteratorResult<T>> {\n exhausted = true;\n throw err;\n },\n [Symbol.asyncIterator](): AsyncIterableIterator<T> {\n return pager;\n },\n async toArray(): Promise<T[]> {\n const out: T[] = [];\n for await (const item of pager) {\n out.push(item);\n }\n return out;\n },\n pages(): AsyncIterableIterator<CursorPaginated<T>> {\n return pageIterator();\n },\n };\n\n return pager;\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { AsyncPager } from '../pagination.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Resource facade for `/api/borrowers`. Includes both the standard CRUD\n * verbs and the borrower-specific flows that don't fit `update()` —\n * `claim()` (PII-claim flow, SOC 2 / GLBA) and `grantAudit()` (audit\n * delegation).\n */\nexport class BorrowersResource {\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * Retrieve a borrower by id.\n *\n * GET /api/borrowers/{id}\n */\n async retrieve<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}`,\n options,\n );\n }\n\n /**\n * Create a new borrower.\n *\n * POST /api/borrowers\n */\n async create<T = unknown>(params: Record<string, unknown>, options?: RequestOptions): Promise<T> {\n return this.client.request<T>('POST', '/api/borrowers', { body: params, ...options });\n }\n\n /**\n * Iterate every borrower visible to the calling principal.\n *\n * GET /api/borrowers\n */\n list<T = unknown>(\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n '/api/borrowers',\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Assign a lender to this borrower.\n *\n * POST /api/borrowers/{id}/assign\n */\n async assign<T = unknown>(\n borrowerId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/assign`,\n { body: params, ...options },\n );\n }\n\n /**\n * Claim PII access on a borrower. Required by SOC 2 / GLBA before an\n * admin can view the borrower's extracted financials. Surfaced as a verb\n * method (rather than `update()`) because the audit log records this as\n * a distinct event and integrators reading the SDK want to see the flow\n * by name.\n *\n * POST /api/borrowers/{id}/claim\n */\n async claim<T = unknown>(\n borrowerId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/claim`,\n { body: params, ...options },\n );\n }\n\n /**\n * Fetch the audit log for a borrower (PII access events, claim grants,\n * etc.).\n *\n * GET /api/borrowers/{id}/audit-log\n */\n async auditLog<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/audit-log`,\n options,\n );\n }\n\n /**\n * List loans associated with a borrower.\n *\n * GET /api/borrowers/{borrowerId}/loans\n */\n loans<T = unknown>(\n borrowerId: string,\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n `/api/borrowers/${encodeURIComponent(borrowerId)}/loans`,\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * List jobs (document packages) for a borrower.\n *\n * GET /api/borrowers/{id}/jobs\n */\n jobs<T = unknown>(\n borrowerId: string,\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n `/api/borrowers/${encodeURIComponent(borrowerId)}/jobs`,\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Fetch results for a specific job under a borrower.\n *\n * GET /api/borrowers/{id}/jobs/{jobId}/results\n */\n async jobResults<T = unknown>(\n borrowerId: string,\n jobId: string,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/jobs/${encodeURIComponent(jobId)}/results`,\n options,\n );\n }\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Resource facade for the document upload pipeline. Documents flow:\n *\n * 1. `presignedUrl()` to get a signed S3 PUT URL\n * 2. The integrator's backend uploads bytes directly to S3\n * 3. `confirmUpload()` to kick off the extraction pipeline\n * 4. Webhook `extraction.ready` fires when results are queryable\n *\n * No `update()` — once uploaded, document content is immutable; metadata\n * lives on the parent borrower / loan / job.\n */\nexport class DocumentsResource {\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * Request a presigned S3 PUT URL for a single document upload.\n *\n * POST /api/documents/presigned-url\n */\n async presignedUrl<T = unknown>(\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>('POST', '/api/documents/presigned-url', {\n body: params,\n ...options,\n });\n }\n\n /**\n * Confirm a single uploaded document, kicking off the extraction\n * pipeline.\n *\n * POST /api/documents/{jobId}/confirm-upload\n */\n async confirmUpload<T = unknown>(\n jobId: string,\n params: Record<string, unknown> = {},\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/documents/${encodeURIComponent(jobId)}/confirm-upload`,\n { body: params, ...options },\n );\n }\n\n /**\n * Confirm a batch of uploaded documents in a single request. Faster than\n * looping `confirmUpload()` when the integrator has many files in one\n * package.\n *\n * POST /api/documents/confirm-uploads\n */\n async batchConfirm<T = unknown>(\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>('POST', '/api/documents/confirm-uploads', {\n body: params,\n ...options,\n });\n }\n\n /**\n * Get a presigned S3 GET URL to download a previously-uploaded document.\n *\n * GET /api/documents/{jobId}/download-url\n */\n async downloadUrl<T = unknown>(jobId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/documents/${encodeURIComponent(jobId)}/download-url`,\n options,\n );\n }\n\n /**\n * Fetch processing status for a document upload.\n *\n * GET /api/documents/{jobId}/status\n */\n async status<T = unknown>(jobId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/documents/${encodeURIComponent(jobId)}/status`,\n options,\n );\n }\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Resource facade for embed sessions — short-lived tokens scoped to a\n * single loan. Mint server-side via the integrator's API key, then pass\n * the resulting `embed_token` to the browser to bootstrap the SpreadSpace\n * review widget.\n *\n * Sub-namespace structure (`embed.sessions.create(...)`) mirrors the route\n * shape (`/api/embed/sessions`) and leaves room for future embed\n * resources without crowding the top-level `embed` object.\n */\nexport class EmbedSessionsResource {\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * Mint an embed-session token for a loan. The minted token has a strict\n * subset of the calling API key's scopes and is locked to the supplied\n * `loan_id` — it cannot be used to access other loans or to mint further\n * tokens.\n *\n * POST /api/embed/sessions\n *\n * Body: { loan_id, scopes?, expires_in_seconds? }\n * Returns: { embed_token, expires_at, ... }\n */\n async create<T = unknown>(params: Record<string, unknown>, options?: RequestOptions): Promise<T> {\n return this.client.request<T>('POST', '/api/embed/sessions', { body: params, ...options });\n }\n\n /**\n * Revoke an embed session early — useful when the integrator's UI flow\n * ends before the natural expiry, or when reissuing after a logout.\n *\n * DELETE /api/embed/sessions/{sessionId}\n */\n async revoke<T = unknown>(sessionId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'DELETE',\n `/api/embed/sessions/${encodeURIComponent(sessionId)}`,\n options,\n );\n }\n}\n\n/**\n * Top-level `client.embed` namespace. Currently surfaces only the\n * `sessions` sub-resource; future phases (e.g. embed-only audit logs)\n * land here.\n */\nexport class EmbedResource {\n public readonly sessions: EmbedSessionsResource;\n\n constructor(client: SpreadSpaceClient) {\n this.sessions = new EmbedSessionsResource(client);\n }\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { AsyncPager } from '../pagination.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Resource facade for extracted document data. Extractions are scoped under\n * a borrower (the canonical PII boundary) — every endpoint takes a\n * `borrowerId` path segment so the multi-tenant access checks have an\n * unambiguous scope.\n *\n * Per-document-type endpoints (`balanceSheet`, `pl`, etc.) return\n * roll-ups across all documents of that type uploaded for the borrower.\n * The generic `query()` is the structured-search endpoint —\n * integrators that build their own UIs on top of the extraction data\n * typically want this one.\n *\n * `move()` reassigns a document's loan binding — shipped as a verb method\n * (not `update()`) because it traverses the loan-membership tables, not\n * the extraction row.\n */\nexport class ExtractionsResource {\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * Iterate every extraction for a borrower.\n *\n * GET /api/borrowers/{borrowerId}/extractions\n */\n list<T = unknown>(\n borrowerId: string,\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions`,\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Structured query across a borrower's extractions. Filter by document\n * type, period, and other metadata.\n *\n * POST /api/borrowers/{borrowerId}/extractions/query\n */\n async query<T = unknown>(\n borrowerId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/query`,\n { body: params, ...options },\n );\n }\n\n /**\n * Move an extracted document to a different loan under the same\n * borrower. Use when the user uploaded a doc to the wrong package.\n *\n * POST /api/borrowers/{borrowerId}/extractions/{docId}/move\n */\n async move<T = unknown>(\n borrowerId: string,\n docId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/${encodeURIComponent(docId)}/move`,\n { body: params, ...options },\n );\n }\n\n /**\n * Roll-up of the borrower's bank-statement analyses across all\n * uploaded statements.\n *\n * GET /api/borrowers/{borrowerId}/extractions/bank-statement-analysis\n */\n async bankStatementAnalysis<T = unknown>(\n borrowerId: string,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/bank-statement-analysis`,\n options,\n );\n }\n\n /**\n * Roll-up of the borrower's balance sheet across all uploaded\n * balance-sheet documents.\n */\n async balanceSheet<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/balance-sheet`,\n options,\n );\n }\n\n /** P&L roll-up across uploaded P&L documents. */\n async pl<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/pl`,\n options,\n );\n }\n\n /** Cash-flow roll-up. */\n async cashFlow<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/cash-flow`,\n options,\n );\n }\n\n /** Accounts payable roll-up. */\n async accountsPayable<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/accounts-payable`,\n options,\n );\n }\n\n /** Accounts receivable roll-up. */\n async accountsReceivable<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/accounts-receivable`,\n options,\n );\n }\n\n /**\n * Generic report endpoint — pass the report type as a path segment.\n * Useful for report types added after this SDK release.\n *\n * GET /api/borrowers/{borrowerId}/extractions/reports/{reportType}\n */\n async report<T = unknown>(\n borrowerId: string,\n reportType: string,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/reports/${encodeURIComponent(reportType)}`,\n options,\n );\n }\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { AsyncPager } from '../pagination.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Resource facade for `/api/jobs`. A \"job\" is a document package — a\n * batch of files uploaded together. Read-only from this surface; jobs\n * are created implicitly by the upload pipeline.\n */\nexport class JobsResource {\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * Iterate jobs visible to the calling principal.\n *\n * GET /api/jobs\n */\n list<T = unknown>(\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n '/api/jobs',\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Fetch processing status for a job.\n *\n * GET /api/jobs/{jobId}/status\n */\n async status<T = unknown>(jobId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/jobs/${encodeURIComponent(jobId)}/status`,\n options,\n );\n }\n\n /**\n * Fetch results for a job — the rolled-up extraction outcomes.\n *\n * GET /api/jobs/{jobId}/results\n */\n async results<T = unknown>(jobId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/jobs/${encodeURIComponent(jobId)}/results`,\n options,\n );\n }\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { AsyncPager } from '../pagination.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Resource facade for `/api/loans`. Loans are the top-level package unit —\n * a borrower has many loans, each loan is the scope of a documents bundle.\n */\nexport class LoansResource {\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * Retrieve a loan by id.\n *\n * GET /api/loans/{loanId}\n */\n async retrieve<T = unknown>(loanId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>('GET', `/api/loans/${encodeURIComponent(loanId)}`, options);\n }\n\n /**\n * Create a new loan.\n *\n * POST /api/loans\n */\n async create<T = unknown>(params: Record<string, unknown>, options?: RequestOptions): Promise<T> {\n return this.client.request<T>('POST', '/api/loans', { body: params, ...options });\n }\n\n /**\n * Update an existing loan.\n *\n * PATCH /api/loans/{loanId}\n */\n async update<T = unknown>(\n loanId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>('PATCH', `/api/loans/${encodeURIComponent(loanId)}`, {\n body: params,\n ...options,\n });\n }\n\n /**\n * Iterate every loan visible to the calling principal. Returns an\n * `AsyncPager<T>` — consume with `for await`, `.toArray()`, or\n * `.pages()`.\n *\n * GET /api/loans\n */\n list<T = unknown>(\n params?: { limit?: number; cursor?: string; borrower_id?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n '/api/loans',\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Assign a lender to this loan. Calls `POST /api/loans/{id}/assign`.\n * Surfaced as a verb method rather than forcing it through `update()`\n * because the assignment flow is semantically distinct from a generic\n * field patch (it touches the lender-access table, not the loan row).\n */\n async assign<T = unknown>(\n loanId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>('POST', `/api/loans/${encodeURIComponent(loanId)}/assign`, {\n body: params,\n ...options,\n });\n }\n\n /**\n * Fetch the audit log for a loan.\n *\n * GET /api/loans/{loanId}/audit-log\n */\n async auditLog<T = unknown>(loanId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/loans/${encodeURIComponent(loanId)}/audit-log`,\n options,\n );\n }\n}\n","import { createHmac, timingSafeEqual } from 'node:crypto';\n\nimport type { VerifyAndParseResult, WebhookEvent } from './types.js';\n\n/**\n * Webhook signature verifier — byte-for-byte compatible with\n * `api/src/Webhooks/WebhookSigner.cs` on the API side.\n *\n * Wire format (mirrors Stripe's `Stripe-Signature`):\n *\n * SpreadSpace-Signature: t=<unix_seconds>,v1=<hex_hmac_sha256(secret, \"{t}.{body}\")>\n *\n * The verifier:\n * 1. Parses `t=...` and `v1=...` tokens (tolerant of additional unrecognized\n * pairs to stay forward-compatible with future schemes).\n * 2. Recomputes HMAC-SHA256 over `\"{timestamp}.{rawBody}\"` with the secret.\n * 3. Compares with `crypto.timingSafeEqual` on raw bytes (never on hex\n * strings — string `===` short-circuits and leaks prefix info via timing).\n * 4. Two-sided freshness check: rejects timestamps too far in the past\n * (replay protection) AND too far in the future (attacker-controlled\n * timestamps that would extend the replay window).\n *\n * Verification order matches the C# side: HMAC first, then freshness. That\n * way a forged-but-fresh request and a real-but-stale request fail\n * indistinguishably from the timing perspective.\n */\n\n/** Default freshness tolerance — matches `WebhookSignatureFormat.DefaultFreshnessTolerance`. */\nconst DEFAULT_FRESHNESS_TOLERANCE_SECONDS = 5 * 60;\n\n/** Wire constant for the v1 HMAC-SHA256 scheme. */\nconst VERSION_1_PREFIX = 'v1';\n\nexport interface VerifyOptions {\n /**\n * Maximum age (and maximum future skew) of the timestamp before the\n * signature is rejected as stale. Symmetric — `Math.abs(now - t)` must be\n * ≤ this value.\n *\n * Default: 300 seconds (5 minutes).\n */\n freshnessTolerance?: number;\n\n /**\n * Override the \"current time\" used for the freshness check. Useful in\n * tests; otherwise leave undefined and the verifier reads\n * `Date.now() / 1000`.\n */\n currentTimestamp?: number;\n}\n\n/**\n * Verify a `SpreadSpace-Signature` header against a body and signing\n * secret. Throws on any failure (invalid format, bad HMAC, stale timestamp,\n * wrong secret); returns `true` on success.\n *\n * @param rawBody The exact request body received on the wire — bytes, not\n * re-serialized JSON. Any byte-level transformation between receipt and\n * verification (re-stringification, gzip decode, encoding change) will\n * invalidate the signature.\n * @param signature Contents of the `SpreadSpace-Signature` HTTP header.\n * @param secret The plaintext signing secret (`whsec_...`) issued at\n * webhook endpoint creation. Never log this.\n * @param options Optional overrides — freshness window and clock injection.\n */\nexport function verifyWebhookSignature(\n rawBody: string | Buffer | Uint8Array,\n signature: string,\n secret: string,\n options?: VerifyOptions,\n): true {\n if (typeof signature !== 'string' || signature.length === 0) {\n throw new WebhookSignatureError('SpreadSpace-Signature header is missing or empty.');\n }\n if (typeof secret !== 'string' || secret.length === 0) {\n throw new WebhookSignatureError('Webhook signing secret is missing or empty.');\n }\n if (rawBody === null || rawBody === undefined) {\n throw new WebhookSignatureError('Webhook raw body is missing.');\n }\n\n const parsed = parseSignatureHeader(signature);\n if (!parsed) {\n throw new WebhookSignatureError('Webhook signature header is malformed.');\n }\n const { timestamp, hex } = parsed;\n\n // HMAC FIRST. We never want to leak (via differential timing or distinct\n // error message text) whether a request was a forged signature vs. a real\n // one that aged out — both should be indistinguishable failures.\n const bodyString = bodyToString(rawBody);\n const expectedHex = computeHmacHex(secret, `${timestamp}.${bodyString}`);\n\n if (!hexEquals(expectedHex, hex)) {\n throw new WebhookSignatureError('Webhook signature does not match.');\n }\n\n // Then freshness. Two-sided check: too old OR too far in the future.\n const tolerance = options?.freshnessTolerance ?? DEFAULT_FRESHNESS_TOLERANCE_SECONDS;\n const now = options?.currentTimestamp ?? Math.floor(Date.now() / 1000);\n const age = now - timestamp;\n if (age > tolerance || age < -tolerance) {\n throw new WebhookSignatureError(\n `Webhook timestamp is outside the freshness window of ${tolerance}s.`,\n );\n }\n\n return true;\n}\n\n/**\n * Verify a webhook signature and JSON-parse the body into a typed\n * `WebhookEvent` envelope. Throws on signature failure or invalid JSON.\n *\n * The returned value is a discriminated union over `type` — switch on\n * `event.type` to narrow `event.data` to the matching payload.\n */\nexport function verifyAndParseWebhook(\n rawBody: string | Buffer | Uint8Array,\n signature: string,\n secret: string,\n options?: VerifyOptions,\n): VerifyAndParseResult {\n verifyWebhookSignature(rawBody, signature, secret, options);\n\n const bodyString = bodyToString(rawBody);\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(bodyString);\n } catch (cause) {\n throw new WebhookSignatureError('Webhook body is not valid JSON.', cause);\n }\n\n if (!isPlainObject(parsed)) {\n throw new WebhookSignatureError('Webhook body is not a JSON object.');\n }\n const candidate = parsed as Partial<WebhookEvent>;\n if (typeof candidate.type !== 'string' || candidate.type.length === 0) {\n throw new WebhookSignatureError('Webhook body is missing a `type` field.');\n }\n if (typeof candidate.id !== 'string' || candidate.id.length === 0) {\n throw new WebhookSignatureError('Webhook body is missing an `id` field.');\n }\n if (typeof candidate.created !== 'number') {\n throw new WebhookSignatureError('Webhook body is missing a numeric `created` field.');\n }\n if (typeof candidate.tenant_id !== 'string' || candidate.tenant_id.length === 0) {\n throw new WebhookSignatureError('Webhook body is missing a `tenant_id` field.');\n }\n if (!isPlainObject(candidate.data)) {\n throw new WebhookSignatureError('Webhook body is missing a `data` object.');\n }\n\n return parsed as VerifyAndParseResult;\n}\n\n/**\n * Thrown when a webhook signature fails verification or the envelope is\n * structurally malformed. Distinct from `SpreadSpaceError` because webhook\n * verification is a self-contained primitive — verifiers don't need the\n * full request/response error machinery, just a single failure type they\n * can reject against.\n */\nexport class WebhookSignatureError extends Error {\n public readonly cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = 'WebhookSignatureError';\n this.cause = cause;\n Object.setPrototypeOf(this, WebhookSignatureError.prototype);\n }\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Internals\n// ────────────────────────────────────────────────────────────────────────────\n\ninterface ParsedSignature {\n timestamp: number;\n hex: string;\n}\n\n/**\n * Parse a header in the form `t=<long>,v1=<hex>`. Tolerant of whitespace\n * between segments and of additional unrecognized pairs (e.g. a future\n * `v2=...`) — those are silently ignored, not treated as parse errors, so\n * this verifier remains forward-compatible with new schemes.\n */\nfunction parseSignatureHeader(header: string): ParsedSignature | null {\n const segments = header.split(',').filter((s) => s.length > 0);\n if (segments.length < 2) return null;\n\n let parsedTs: number | null = null;\n let parsedV1: string | null = null;\n\n for (const raw of segments) {\n const segment = raw.trim();\n const eq = segment.indexOf('=');\n if (eq <= 0 || eq === segment.length - 1) {\n // Missing key, missing value, or `=` at the very end (`v1=`).\n return null;\n }\n\n const key = segment.slice(0, eq).trim();\n const value = segment.slice(eq + 1).trim();\n\n if (key === 't') {\n if (parsedTs !== null) return null; // Duplicate `t=`.\n // Strict integer parse — reject `1.5`, `1e3`, leading `+`, etc. The C#\n // verifier uses `long.TryParse(NumberStyles.Integer, Invariant)`,\n // which accepts an optional leading `-` and digits only. We mirror that.\n if (!/^-?\\d+$/.test(value)) return null;\n const ts = Number(value);\n if (!Number.isFinite(ts) || !Number.isInteger(ts)) return null;\n parsedTs = ts;\n } else if (key === VERSION_1_PREFIX) {\n if (parsedV1 !== null) return null; // Duplicate `v1=`.\n if (value.length === 0) return null;\n parsedV1 = value;\n }\n // Any other key — silently ignored for forward compatibility.\n }\n\n if (parsedTs === null || parsedV1 === null) return null;\n return { timestamp: parsedTs, hex: parsedV1 };\n}\n\n/**\n * Compute lowercase hex HMAC-SHA256 digest. Matches the C# side's\n * `Convert.ToHexStringLower(hmac.ComputeHash(...))` exactly.\n */\nfunction computeHmacHex(secret: string, signedPayload: string): string {\n const hmac = createHmac('sha256', Buffer.from(secret, 'utf-8'));\n hmac.update(Buffer.from(signedPayload, 'utf-8'));\n return hmac.digest('hex'); // Node default is lowercase.\n}\n\n/**\n * Constant-time compare of two hex strings. We decode both sides to bytes\n * before calling `timingSafeEqual` — it requires equal-length inputs and\n * we want a length mismatch to fail fast (length is not timing-sensitive\n * since both ends know SHA-256 emits 64 hex chars).\n */\nfunction hexEquals(expectedHex: string, providedHex: string): boolean {\n if (expectedHex.length !== providedHex.length) return false;\n\n let expectedBytes: Buffer;\n let providedBytes: Buffer;\n try {\n expectedBytes = Buffer.from(expectedHex, 'hex');\n providedBytes = Buffer.from(providedHex, 'hex');\n } catch {\n return false;\n }\n\n // `Buffer.from(..., 'hex')` silently stops at the first non-hex character,\n // producing a shorter buffer — guard explicitly against that to avoid a\n // false equality when the provided hex has invalid characters that happen\n // to truncate to an empty buffer the receiver also produced.\n if (expectedBytes.length !== providedBytes.length) return false;\n if (expectedBytes.length * 2 !== expectedHex.length) return false;\n if (providedBytes.length * 2 !== providedHex.length) return false;\n\n return timingSafeEqual(\n new Uint8Array(expectedBytes.buffer, expectedBytes.byteOffset, expectedBytes.byteLength),\n new Uint8Array(providedBytes.buffer, providedBytes.byteOffset, providedBytes.byteLength),\n );\n}\n\nfunction bodyToString(body: string | Buffer | Uint8Array): string {\n if (typeof body === 'string') return body;\n if (Buffer.isBuffer(body)) return body.toString('utf-8');\n return Buffer.from(body).toString('utf-8');\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { AsyncPager } from '../pagination.js';\nimport type { RequestOptions } from '../types.js';\nimport {\n verifyAndParseWebhook as verifyAndParseWebhookFn,\n verifyWebhookSignature as verifyWebhookSignatureFn,\n} from '../webhook-signature.js';\n\n/**\n * Resource facade for webhook endpoints (`/api/webhooks/*`) plus the\n * webhook signature helpers as static methods for discoverability.\n *\n * The verification helpers are also exported as bare functions from\n * `@spreadspace/embed/webhooks` for tree-shakeable import paths in\n * webhook receiver Lambdas (where `SpreadSpaceClient` would otherwise pull\n * in the entire resource layer).\n */\nexport class WebhooksResource {\n /**\n * Verify a `SpreadSpace-Signature` header against a body and signing\n * secret. Throws `WebhookSignatureError` on any failure.\n */\n public static readonly verifySignature = verifyWebhookSignatureFn;\n\n /**\n * Verify a webhook signature and JSON-parse the body into a typed\n * `WebhookEvent`. Throws `WebhookSignatureError` on signature failure or\n * invalid JSON.\n */\n public static readonly verifyAndParse = verifyAndParseWebhookFn;\n\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * List configured webhook endpoints for this organization.\n *\n * GET /api/webhooks\n */\n list<T = unknown>(\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n '/api/webhooks',\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Retrieve a single webhook endpoint.\n *\n * GET /api/webhooks/{id}\n */\n async retrieve<T = unknown>(endpointId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/webhooks/${encodeURIComponent(endpointId)}`,\n options,\n );\n }\n\n /**\n * Create a new webhook endpoint. The response carries the plaintext\n * signing secret exactly once — store it server-side, do not log it.\n *\n * POST /api/webhooks\n */\n async create<T = unknown>(params: Record<string, unknown>, options?: RequestOptions): Promise<T> {\n return this.client.request<T>('POST', '/api/webhooks', { body: params, ...options });\n }\n\n /**\n * Update endpoint metadata (URL, subscribed event types, enabled flag).\n *\n * PATCH /api/webhooks/{id}\n */\n async update<T = unknown>(\n endpointId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'PATCH',\n `/api/webhooks/${encodeURIComponent(endpointId)}`,\n { body: params, ...options },\n );\n }\n\n /**\n * Delete a webhook endpoint.\n *\n * DELETE /api/webhooks/{id}\n */\n async delete<T = unknown>(endpointId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'DELETE',\n `/api/webhooks/${encodeURIComponent(endpointId)}`,\n options,\n );\n }\n\n /**\n * Rotate an endpoint's signing secret. The old secret remains valid for\n * a grace window so deliveries in flight aren't dropped. Returns the new\n * plaintext secret exactly once.\n *\n * POST /api/webhooks/{id}/rotate\n */\n async rotateSecret<T = unknown>(\n endpointId: string,\n params: Record<string, unknown> = {},\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/webhooks/${encodeURIComponent(endpointId)}/rotate`,\n { body: params, ...options },\n );\n }\n\n /**\n * Iterate delivery attempts for an endpoint.\n *\n * GET /api/webhooks/{id}/deliveries\n */\n deliveries<T = unknown>(\n endpointId: string,\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n `/api/webhooks/${encodeURIComponent(endpointId)}/deliveries`,\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Manually replay a delivery (e.g. after fixing a downstream outage).\n *\n * POST /api/webhooks/{id}/deliveries/{deliveryId}/replay\n */\n async replayDelivery<T = unknown>(\n endpointId: string,\n deliveryId: string,\n params: Record<string, unknown> = {},\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/webhooks/${encodeURIComponent(endpointId)}/deliveries/${encodeURIComponent(deliveryId)}/replay`,\n { body: params, ...options },\n );\n }\n}\n","/**\n * The SDK package version. Sent on every outbound request as part of the\n * `User-Agent` string so server-side telemetry can pick up which SDK release\n * a customer is running.\n *\n * Hand-rolled rather than imported from `package.json` because tsup output\n * doesn't include the package manifest — keeping it as a TS literal avoids a\n * runtime `fs` read from the dist bundle.\n *\n * Bump in lockstep with `package.json`.\n */\nexport const SDK_VERSION = '0.1.0';\n\n/**\n * Default API surface version pinned by this SDK release. Sent as the\n * `SpreadSpace-Version` header on every request unless the integrator\n * overrides it via `SpreadSpaceClientOptions.apiVersion`.\n *\n * Once the SDK is published, this value is the contract: the SDK guarantees\n * the request/response shapes match this dated surface. Bumping requires a\n * new SDK release that codegens against the new spec.\n */\nexport const DEFAULT_API_VERSION = '2026-05-03';\n","import { randomUUID } from 'node:crypto';\n\nimport {\n AuthenticationError,\n classifyError,\n ConflictError,\n InvalidRequestError,\n NetworkError,\n NotFoundError,\n PermissionError,\n RateLimitError,\n ServerError,\n SpreadSpaceError,\n} from './errors.js';\nimport { paginate, type AsyncPager } from './pagination.js';\nimport { BorrowersResource } from './resources/borrowers.js';\nimport { DocumentsResource } from './resources/documents.js';\nimport { EmbedResource } from './resources/embed.js';\nimport { ExtractionsResource } from './resources/extractions.js';\nimport { JobsResource } from './resources/jobs.js';\nimport { LoansResource } from './resources/loans.js';\nimport { WebhooksResource } from './resources/webhooks.js';\nimport type { RequestOptions } from './types.js';\nimport { DEFAULT_API_VERSION, SDK_VERSION } from './version.js';\n\n/**\n * Re-export the error classes for `instanceof` checks at integrator callsites\n * without needing a separate `import { ... } from '@spreadspace/embed/errors'`.\n */\nexport {\n SpreadSpaceError,\n InvalidRequestError,\n AuthenticationError,\n PermissionError,\n NotFoundError,\n ConflictError,\n RateLimitError,\n ServerError,\n NetworkError,\n};\n\nexport interface SpreadSpaceClientOptions {\n /**\n * The API key for authentication. Live keys begin with `ss_live_`, test\n * keys with `ss_test_`. Issue and manage keys from the SpreadSpace\n * dashboard.\n */\n apiKey: string;\n\n /**\n * Base URL for the API. Defaults to `https://api.spreadspace.app`.\n * Override for staging (`https://staging-api.spreadspace.app`) or for\n * local development (`http://localhost:8080`).\n */\n baseUrl?: string;\n\n /**\n * Override the SDK-pinned `SpreadSpace-Version` header. Defaults to the\n * version this SDK release was built against. Set this only when\n * intentionally targeting a different surface version than the SDK was\n * tested against.\n */\n apiVersion?: string;\n\n /**\n * Request timeout in milliseconds. Default: 30000 (30s). The timeout is\n * applied per individual HTTP attempt — retries get a fresh window each.\n */\n timeout?: number;\n\n /**\n * Maximum number of retry attempts after the initial request. Default: 3.\n * Retries trigger on:\n * - 429 Rate Limited (honors `Retry-After` if present)\n * - 5xx Server Errors\n * - Transport-level network failures\n * 4xx other than 429 do not retry.\n */\n maxRetries?: number;\n\n /**\n * Custom `fetch` implementation. Defaults to `globalThis.fetch`. Inject a\n * mock here to write hermetic tests without monkey-patching the global.\n */\n fetch?: typeof fetch;\n\n /**\n * Custom idempotency-key generator. Defaults to `crypto.randomUUID()`.\n */\n idempotencyKeyGenerator?: () => string;\n}\n\n/**\n * Internal options for the low-level `request()` method. Resource methods\n * compose these on top of the public `RequestOptions`.\n */\nexport interface InternalRequestOptions extends RequestOptions {\n /**\n * JSON-serializable request body. Encoded as `application/json` with\n * `Content-Type: application/json; charset=utf-8`.\n */\n body?: unknown;\n\n /**\n * Query parameters appended to the URL. `undefined` values are skipped.\n */\n query?: Record<string, string | number | boolean | undefined>;\n}\n\nconst DEFAULT_BASE_URL = 'https://api.spreadspace.app';\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_MAX_RETRIES = 3;\nconst RETRY_BASE_DELAY_MS = 500;\nconst RETRY_MAX_DELAY_MS = 30_000;\n\n/**\n * Top-level entry point of the SpreadSpace SDK.\n *\n * Single instance per integrator process — the resources hanging off it are\n * thin facades, not separate clients, so spinning up multiple\n * `SpreadSpaceClient`s only matters when juggling multiple API keys.\n *\n * Wire-format invariants the client guarantees on every request:\n * - `Authorization: Bearer <apiKey>`\n * - `SpreadSpace-Version: <apiVersion>`\n * - `User-Agent: spreadspace-node/<sdkVersion> node/<nodeVersion>`\n * - `Idempotency-Key: <auto-generated UUID>` on every POST/PATCH/PUT/DELETE\n * unless the caller supplies one explicitly or sets `idempotencyKey: null`\n *\n * Retries on 429, 5xx, and transport failures up to `maxRetries` times with\n * exponential backoff (capped) and jitter; honors `Retry-After`.\n */\nexport class SpreadSpaceClient {\n /** Resolved base URL (no trailing slash). */\n public readonly baseUrl: string;\n\n /** Resolved API version string (the `SpreadSpace-Version` header value). */\n public readonly apiVersion: string;\n\n /** Public so resource files can pull it for `paginate()` URL construction. */\n public readonly maxRetries: number;\n\n // ── Resources ────────────────────────────────────────────────────────────\n public readonly loans: LoansResource;\n public readonly borrowers: BorrowersResource;\n public readonly documents: DocumentsResource;\n public readonly extractions: ExtractionsResource;\n public readonly jobs: JobsResource;\n public readonly webhooks: WebhooksResource;\n public readonly embed: EmbedResource;\n\n // ── Internals ────────────────────────────────────────────────────────────\n private readonly apiKey: string;\n private readonly timeoutMs: number;\n private readonly fetchImpl: typeof fetch;\n private readonly idempotencyKeyGenerator: () => string;\n\n constructor(options: SpreadSpaceClientOptions) {\n if (!options || typeof options.apiKey !== 'string' || options.apiKey.length === 0) {\n throw new TypeError(\n 'SpreadSpaceClient requires an apiKey. Issue one from the dashboard at /settings/api-keys.',\n );\n }\n\n this.apiKey = options.apiKey;\n let baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n while (baseUrl.endsWith('/')) baseUrl = baseUrl.slice(0, -1);\n this.baseUrl = baseUrl;\n this.apiVersion = options.apiVersion ?? DEFAULT_API_VERSION;\n this.timeoutMs = options.timeout ?? DEFAULT_TIMEOUT_MS;\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.fetchImpl = options.fetch ?? globalThis.fetch;\n this.idempotencyKeyGenerator = options.idempotencyKeyGenerator ?? randomUUID;\n\n if (typeof this.fetchImpl !== 'function') {\n throw new TypeError(\n 'SpreadSpaceClient requires a fetch implementation. Node 18+ provides one globally; pass a polyfill via options.fetch otherwise.',\n );\n }\n\n this.loans = new LoansResource(this);\n this.borrowers = new BorrowersResource(this);\n this.documents = new DocumentsResource(this);\n this.extractions = new ExtractionsResource(this);\n this.jobs = new JobsResource(this);\n this.webhooks = new WebhooksResource(this);\n this.embed = new EmbedResource(this);\n }\n\n /**\n * Low-level request method. Resource layer wraps this with ergonomic\n * method names; integrators can call it directly to hit endpoints not yet\n * surfaced via a typed resource.\n *\n * Returns the parsed JSON body. For 204 No Content responses (currently\n * none in the API but reserved), returns `undefined as T`.\n */\n public async request<T>(\n method: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE',\n path: string,\n options: InternalRequestOptions = {},\n ): Promise<T> {\n const url = this.buildUrl(path, options.query);\n const headers = this.buildHeaders(method, options);\n const body = options.body !== undefined ? JSON.stringify(options.body) : undefined;\n const maxRetries = options.maxRetries ?? this.maxRetries;\n\n let attempt = 0;\n let lastError: unknown;\n\n while (attempt <= maxRetries) {\n // Per-attempt timeout. We compose it with any caller-provided\n // `signal` so abort-from-outside still works.\n const controller = new AbortController();\n const timeoutHandle = setTimeout(() => controller.abort(), this.timeoutMs);\n const signal = options.signal\n ? composeAbortSignals(controller.signal, options.signal)\n : controller.signal;\n\n let response: Response;\n try {\n response = await this.fetchImpl(url, {\n method,\n headers,\n body,\n signal,\n });\n } catch (err) {\n clearTimeout(timeoutHandle);\n lastError = err;\n // Transport-layer failures are retryable on the same backoff curve\n // as 5xx — DNS hiccups, TLS handshake failures, intermittent\n // upstream resets are exactly what retries are designed to cover.\n if (attempt < maxRetries) {\n await sleep(this.computeRetryDelay(attempt, undefined));\n attempt += 1;\n continue;\n }\n throw new NetworkError(\n `SpreadSpace request to ${method} ${url} failed: ${describeError(err)}`,\n err,\n );\n }\n\n clearTimeout(timeoutHandle);\n\n const requestId = response.headers.get('X-Request-ID') ?? undefined;\n\n // Successful response — parse body and return.\n if (response.ok) {\n return await this.parseSuccessBody<T>(response);\n }\n\n // Decide retry vs. throw based on status.\n const status = response.status;\n const retryable = status === 429 || (status >= 500 && status <= 599);\n\n if (retryable && attempt < maxRetries) {\n const retryAfterSec = parseRetryAfter(response.headers.get('Retry-After'));\n await sleep(this.computeRetryDelay(attempt, retryAfterSec));\n attempt += 1;\n // Drain the body so the connection can be reused — we don't care\n // about its content on a retryable failure.\n try {\n await response.body?.cancel();\n } catch {\n /* ignore */\n }\n continue;\n }\n\n // Non-retryable, or out of attempts — convert to typed exception.\n throw await this.buildErrorFromResponse(response, requestId);\n }\n\n // Should be unreachable — the loop either returns, throws, or continues.\n throw new NetworkError(\n `SpreadSpace request to ${method} ${url} exhausted retries (last error: ${describeError(lastError)}).`,\n lastError,\n );\n }\n\n /**\n * Convenience wrapper around `paginate()` for resource list methods. Lets\n * each resource simply do `return this.client.paginate(...)` rather than\n * importing the helper directly.\n */\n public paginate<T>(\n path: string,\n params?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions,\n ): AsyncPager<T> {\n return paginate<T>(this, path, params, options);\n }\n\n // ────────────────────────────────────────────────────────────────────────\n // Internals\n // ────────────────────────────────────────────────────────────────────────\n\n private buildUrl(\n path: string,\n query?: Record<string, string | number | boolean | undefined>,\n ): string {\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n const url = new URL(this.baseUrl + normalizedPath);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined) continue;\n url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n }\n\n private buildHeaders(\n method: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE',\n options: InternalRequestOptions,\n ): Headers {\n const headers = new Headers();\n headers.set('Authorization', `Bearer ${this.apiKey}`);\n headers.set('SpreadSpace-Version', options.apiVersion ?? this.apiVersion);\n headers.set('Accept', 'application/json');\n headers.set('User-Agent', this.buildUserAgent());\n\n if (options.body !== undefined) {\n headers.set('Content-Type', 'application/json; charset=utf-8');\n }\n\n // Idempotency-Key on every non-GET unless explicitly suppressed via\n // `idempotencyKey: null` or already provided in options.\n if (method !== 'GET') {\n const explicit = options.idempotencyKey;\n if (explicit === null) {\n // Caller opted out — no header.\n } else if (typeof explicit === 'string' && explicit.length > 0) {\n headers.set('Idempotency-Key', explicit);\n } else {\n headers.set('Idempotency-Key', this.idempotencyKeyGenerator());\n }\n }\n\n return headers;\n }\n\n private buildUserAgent(): string {\n const nodeVersion = typeof process !== 'undefined' ? process.version : 'unknown';\n return `spreadspace-node/${SDK_VERSION} node/${nodeVersion}`;\n }\n\n /**\n * Compute the next retry delay. Exponential backoff with full jitter,\n * floored by `Retry-After` if the server provided one (we never retry\n * faster than the server asked us to).\n *\n * base = min(maxDelay, baseDelay * 2^attempt)\n * delay = random(0, base)\n *\n * Full jitter (vs. equal jitter) is the AWS-recommended default — it\n * minimizes thundering-herd across many concurrent retrying clients.\n */\n private computeRetryDelay(attempt: number, retryAfterSec: number | undefined): number {\n const expBackoff = Math.min(RETRY_MAX_DELAY_MS, RETRY_BASE_DELAY_MS * 2 ** attempt);\n const jittered = Math.floor(Math.random() * expBackoff);\n\n if (retryAfterSec !== undefined && retryAfterSec > 0) {\n const retryAfterMs = retryAfterSec * 1000;\n return Math.max(jittered, retryAfterMs);\n }\n return jittered;\n }\n\n private async parseSuccessBody<T>(response: Response): Promise<T> {\n if (response.status === 204) {\n return undefined as T;\n }\n const text = await response.text();\n if (text.length === 0) {\n return undefined as T;\n }\n try {\n return JSON.parse(text) as T;\n } catch (err) {\n throw new NetworkError(\n `Failed to parse SpreadSpace response as JSON (status=${response.status}): ${describeError(err)}`,\n err,\n );\n }\n }\n\n private async buildErrorFromResponse(\n response: Response,\n requestId: string | undefined,\n ): Promise<SpreadSpaceError> {\n const status = response.status;\n let rawBody: unknown;\n let type = 'unknown';\n let message = `SpreadSpace API request failed with status ${status}.`;\n let details: Record<string, string> | undefined;\n let resolvedRequestId = requestId;\n\n try {\n const text = await response.text();\n if (text.length > 0) {\n try {\n const parsed = JSON.parse(text) as unknown;\n rawBody = parsed;\n if (\n typeof parsed === 'object' &&\n parsed !== null &&\n 'error' in parsed &&\n typeof (parsed as { error: unknown }).error === 'object' &&\n (parsed as { error: object }).error !== null\n ) {\n const errBody = (parsed as { error: Record<string, unknown> }).error;\n if (typeof errBody.type === 'string') type = errBody.type;\n if (typeof errBody.message === 'string') message = errBody.message;\n if (\n errBody.details &&\n typeof errBody.details === 'object' &&\n !Array.isArray(errBody.details)\n ) {\n details = errBody.details as Record<string, string>;\n }\n // Body's request_id is the authoritative source from the\n // ApiErrorResponse envelope. Prefer the X-Request-ID header\n // when both are set (they will be in production), fall through\n // to body when the header is absent (test mocks, proxies that\n // strip headers, etc.).\n if (resolvedRequestId === undefined && typeof errBody.request_id === 'string') {\n resolvedRequestId = errBody.request_id;\n }\n }\n } catch {\n rawBody = text;\n }\n }\n } catch {\n // Body read failure — keep the generic message.\n }\n\n const ErrorClass = classifyError(status, type);\n const ctorParams = {\n type,\n message,\n statusCode: status,\n requestId: resolvedRequestId,\n rawBody,\n details,\n };\n\n return new ErrorClass(ctorParams);\n }\n}\n\n// ──────────────────────────────────────────────────────────────────────────────\n// Helpers — kept module-private; not exported.\n// ──────────────────────────────────────────────────────────────────────────────\n\nfunction sleep(ms: number): Promise<void> {\n if (ms <= 0) return Promise.resolve();\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Parse `Retry-After`. Spec allows either delta-seconds or HTTP-date; we\n * accept both. Returns `undefined` if the header is missing or unparseable.\n */\nfunction parseRetryAfter(value: string | null): number | undefined {\n if (value === null || value.length === 0) return undefined;\n const asInt = Number(value);\n if (Number.isFinite(asInt) && Number.isInteger(asInt) && asInt >= 0) {\n return asInt;\n }\n const asDate = Date.parse(value);\n if (!Number.isNaN(asDate)) {\n const deltaMs = asDate - Date.now();\n if (deltaMs > 0) return Math.ceil(deltaMs / 1000);\n }\n return undefined;\n}\n\nfunction describeError(err: unknown): string {\n if (err instanceof Error) return err.message;\n if (typeof err === 'string') return err;\n return String(err);\n}\n\n/**\n * Compose two `AbortSignal`s — abort either one and the composed signal\n * fires. `AbortSignal.any` is in modern Node but we polyfill manually so\n * the SDK works under Node 18 which predates it.\n */\nfunction composeAbortSignals(a: AbortSignal, b: AbortSignal): AbortSignal {\n // Prefer the standard `AbortSignal.any` when available (Node 20+).\n type AbortSignalAny = (signals: AbortSignal[]) => AbortSignal;\n const maybeAny = (AbortSignal as unknown as { any?: AbortSignalAny }).any;\n if (typeof maybeAny === 'function') {\n return maybeAny([a, b]);\n }\n\n const controller = new AbortController();\n const onAbort = (source: AbortSignal): void => {\n if (controller.signal.aborted) return;\n const reason = (source as { reason?: unknown }).reason;\n controller.abort(reason);\n };\n\n if (a.aborted) {\n onAbort(a);\n } else {\n a.addEventListener('abort', () => onAbort(a), { once: true });\n }\n if (b.aborted) {\n onAbort(b);\n } else {\n b.addEventListener('abort', () => onAbort(b), { once: true });\n }\n return controller.signal;\n}\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/pagination.ts","../src/resources/borrowers.ts","../src/resources/documents.ts","../src/resources/embed.ts","../src/resources/extractions.ts","../src/resources/jobs.ts","../src/resources/loans.ts","../src/webhook-signature.ts","../src/resources/webhooks.ts","../src/version.ts","../src/client.ts"],"names":["createHmac","timingSafeEqual","randomUUID"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Public error hierarchy for the SpreadSpace SDK.\n *\n * Any non-2xx response from the API is thrown as an instance of one of the\n * subclasses below so integrators can pattern-match on the error type without\n * parsing response bodies. The shape mirrors the canonical\n * `ApiErrorResponse` envelope:\n *\n * { error: { type, message, request_id, details? } }\n *\n * `request_id` is preserved on every thrown error so customers can quote it\n * in support tickets.\n */\n\nexport interface SpreadSpaceErrorParams {\n type: string;\n message: string;\n statusCode: number;\n requestId?: string;\n rawBody?: unknown;\n details?: Record<string, string>;\n}\n\n/**\n * Base class for every error thrown by the SDK in response to a non-2xx\n * API response. Network-layer failures (DNS, TCP reset, fetch abort) are\n * surfaced as `NetworkError`.\n */\nexport class SpreadSpaceError extends Error {\n /**\n * The canonical `error.type` string from the API envelope, e.g.\n * `invalid_request`, `rate_limited`, `idempotency_request_mismatch`.\n * Stable across versions — clients pattern-match on this.\n */\n public readonly type: string;\n\n /** HTTP status code. */\n public readonly statusCode: number;\n\n /** `X-Request-ID` echoed from the server. Quote in support tickets. */\n public readonly requestId?: string;\n\n /** Raw response body for debugging. May be the parsed JSON or a string. */\n public readonly rawBody?: unknown;\n\n /** Optional structured details (e.g. `borrower_id` on `pii_claim_required`). */\n public readonly details?: Record<string, string>;\n\n constructor(params: SpreadSpaceErrorParams) {\n super(params.message);\n this.name = new.target.name;\n this.type = params.type;\n this.statusCode = params.statusCode;\n this.requestId = params.requestId;\n this.rawBody = params.rawBody;\n this.details = params.details;\n\n // Maintain the prototype chain — necessary for `instanceof` to work after\n // transpilation to ES5 (some integrator builds still target older runtimes).\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** 400 Bad Request — typically schema validation. */\nexport class InvalidRequestError extends SpreadSpaceError {}\n\n/** 401 Unauthorized — missing, expired, or invalid API key. */\nexport class AuthenticationError extends SpreadSpaceError {}\n\n/**\n * 403 Forbidden — caller is authenticated but lacks permission. Includes\n * the PII-claim-required and business-email-required cases.\n */\nexport class PermissionError extends SpreadSpaceError {}\n\n/** 404 Not Found. */\nexport class NotFoundError extends SpreadSpaceError {}\n\n/**\n * 409 Conflict — typically `idempotency_request_mismatch` (same key, different\n * body) or a domain-specific conflict (duplicate resource).\n */\nexport class ConflictError extends SpreadSpaceError {}\n\n/**\n * 429 Too Many Requests. The SDK retries automatically up to `maxRetries`,\n * honoring `Retry-After`; this error is only thrown when retries are\n * exhausted.\n */\nexport class RateLimitError extends SpreadSpaceError {}\n\n/**\n * 5xx Server Error. Retries are exhausted by the time this surfaces.\n */\nexport class ServerError extends SpreadSpaceError {}\n\n/**\n * Transport-level failure — DNS, TCP reset, fetch abort, JSON parse failure\n * on a 2xx response. Distinct from API-shaped errors so integrators can\n * decide to retry differently.\n */\nexport class NetworkError extends Error {\n public readonly cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = 'NetworkError';\n this.cause = cause;\n Object.setPrototypeOf(this, NetworkError.prototype);\n }\n}\n\n/**\n * Map an HTTP status code + canonical `error.type` to the right error class.\n *\n * The status is the primary signal (so a 500 with no body still becomes\n * `ServerError`), but the type sharpens the case at the same status — e.g.\n * a 403 `pii_claim_required` is still a `PermissionError`, but a future\n * 403 `embed_session_revoked` would also end up there without a code change.\n */\nexport function classifyError(statusCode: number, _type: string | undefined): typeof SpreadSpaceError {\n if (statusCode === 400) return InvalidRequestError;\n if (statusCode === 401) return AuthenticationError;\n if (statusCode === 403) return PermissionError;\n if (statusCode === 404) return NotFoundError;\n if (statusCode === 409) return ConflictError;\n if (statusCode === 429) return RateLimitError;\n if (statusCode >= 500) return ServerError;\n // 4xx other than the above — surface generically as InvalidRequestError.\n return InvalidRequestError;\n}\n","import type { CursorPaginated, RequestOptions } from './types.js';\n\n/**\n * Pager handed back from resource `.list()` methods. Three ways to consume:\n *\n * 1. **`for await`** — iterate every item across all pages. The most common.\n *\n * for await (const loan of client.loans.list()) { ... }\n *\n * 2. **`.toArray()`** — eagerly drain into a single array. Convenient for\n * small result sets; avoid for unbounded queries (the entire result\n * must fit in memory).\n *\n * const loans = await client.loans.list().toArray();\n *\n * 3. **`for await ... of pager.pages()`** — iterate page-at-a-time, one\n * network round-trip per loop body. Useful when the integrator wants to\n * batch-process results (e.g. write a chunk to a DB, then continue).\n *\n * for await (const page of client.loans.list().pages()) { ... }\n */\nexport interface AsyncPager<T> extends AsyncIterableIterator<T> {\n /**\n * Eagerly consume every page and return all items as a single array.\n * Throws if any underlying request fails.\n */\n toArray(): Promise<T[]>;\n\n /**\n * Page-by-page async iterator. Each yielded value is a\n * `CursorPaginated<T>` envelope — useful when you want to control\n * batch-size flow rather than per-item flow.\n */\n pages(): AsyncIterableIterator<CursorPaginated<T>>;\n}\n\n/**\n * Minimal interface the pager needs from the client. Decoupled from the\n * concrete `SpreadSpaceClient` so this module stays independently testable.\n */\nexport interface PagerClient {\n request<T>(\n method: 'GET',\n path: string,\n options?: { query?: Record<string, string | number | boolean | undefined> } & RequestOptions,\n ): Promise<T>;\n}\n\n/**\n * Build a pager that walks a cursor-paginated list endpoint.\n *\n * Pagination contract — assumed identical for every list endpoint in the\n * API:\n * - GET request, `?cursor=...` carries the opaque next-page token.\n * - Response shape: `{ data: T[], limit: number, next_cursor: string | null }`.\n * - `next_cursor === null` (or absent) means end-of-stream.\n *\n * This function is invoked by every `Resource.list()` method — keeping the\n * pagination logic in one place means we never have to duplicate the\n * cursor-walk loop across resources.\n */\nexport function paginate<T>(\n client: PagerClient,\n path: string,\n params?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions,\n): AsyncPager<T> {\n let cursor: string | undefined;\n let exhausted = false;\n\n async function fetchPage(): Promise<CursorPaginated<T> | null> {\n if (exhausted) return null;\n\n const query: Record<string, string | number | boolean | undefined> = { ...(params ?? {}) };\n if (cursor !== undefined) query.cursor = cursor;\n\n const response = await client.request<CursorPaginated<T>>('GET', path, {\n query,\n ...options,\n });\n\n const next = response.next_cursor ?? null;\n if (!next) {\n exhausted = true;\n } else {\n cursor = next;\n }\n\n return response;\n }\n\n // Per-item async iterator — drains pages internally and yields each item.\n // `for await` over the pager itself ends up here.\n async function* itemIterator(): AsyncGenerator<T, void, undefined> {\n while (true) {\n const page = await fetchPage();\n if (!page) return;\n for (const item of page.data) {\n yield item;\n }\n if (exhausted) return;\n }\n }\n\n // Per-page async iterator — yields the full envelope each iteration.\n async function* pageIterator(): AsyncGenerator<CursorPaginated<T>, void, undefined> {\n while (true) {\n const page = await fetchPage();\n if (!page) return;\n yield page;\n if (exhausted) return;\n }\n }\n\n const iter = itemIterator();\n\n const pager: AsyncPager<T> = {\n async next(): Promise<IteratorResult<T>> {\n return iter.next();\n },\n async return(value?: T): Promise<IteratorResult<T>> {\n // Drop any further pagination — caller is bailing early.\n exhausted = true;\n return { value: value as T, done: true };\n },\n async throw(err?: unknown): Promise<IteratorResult<T>> {\n exhausted = true;\n throw err;\n },\n [Symbol.asyncIterator](): AsyncIterableIterator<T> {\n return pager;\n },\n async toArray(): Promise<T[]> {\n const out: T[] = [];\n for await (const item of pager) {\n out.push(item);\n }\n return out;\n },\n pages(): AsyncIterableIterator<CursorPaginated<T>> {\n return pageIterator();\n },\n };\n\n return pager;\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { AsyncPager } from '../pagination.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Resource facade for `/api/borrowers`. Includes both the standard CRUD\n * verbs and the borrower-specific flows that don't fit `update()` —\n * `claim()` (PII-claim flow, SOC 2 / GLBA) and `grantAudit()` (audit\n * delegation).\n */\nexport class BorrowersResource {\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * Retrieve a borrower by id.\n *\n * GET /api/borrowers/{id}\n */\n async retrieve<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}`,\n options,\n );\n }\n\n /**\n * Create a new borrower.\n *\n * POST /api/borrowers\n */\n async create<T = unknown>(params: Record<string, unknown>, options?: RequestOptions): Promise<T> {\n return this.client.request<T>('POST', '/api/borrowers', { body: params, ...options });\n }\n\n /**\n * Iterate every borrower visible to the calling principal.\n *\n * GET /api/borrowers\n */\n list<T = unknown>(\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n '/api/borrowers',\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Assign a lender to this borrower.\n *\n * POST /api/borrowers/{id}/assign\n */\n async assign<T = unknown>(\n borrowerId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/assign`,\n { body: params, ...options },\n );\n }\n\n /**\n * Claim PII access on a borrower. Required by SOC 2 / GLBA before an\n * admin can view the borrower's extracted financials. Surfaced as a verb\n * method (rather than `update()`) because the audit log records this as\n * a distinct event and integrators reading the SDK want to see the flow\n * by name.\n *\n * POST /api/borrowers/{id}/claim\n */\n async claim<T = unknown>(\n borrowerId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/claim`,\n { body: params, ...options },\n );\n }\n\n /**\n * Fetch the audit log for a borrower (PII access events, claim grants,\n * etc.).\n *\n * GET /api/borrowers/{id}/audit-log\n */\n async auditLog<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/audit-log`,\n options,\n );\n }\n\n /**\n * List loans associated with a borrower.\n *\n * GET /api/borrowers/{borrowerId}/loans\n */\n loans<T = unknown>(\n borrowerId: string,\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n `/api/borrowers/${encodeURIComponent(borrowerId)}/loans`,\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * List jobs (document packages) for a borrower.\n *\n * GET /api/borrowers/{id}/jobs\n */\n jobs<T = unknown>(\n borrowerId: string,\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n `/api/borrowers/${encodeURIComponent(borrowerId)}/jobs`,\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Fetch results for a specific job under a borrower.\n *\n * GET /api/borrowers/{id}/jobs/{jobId}/results\n */\n async jobResults<T = unknown>(\n borrowerId: string,\n jobId: string,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/jobs/${encodeURIComponent(jobId)}/results`,\n options,\n );\n }\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Resource facade for the document upload pipeline. Documents flow:\n *\n * 1. `presignedUrl()` to get a signed S3 PUT URL\n * 2. The integrator's backend uploads bytes directly to S3\n * 3. `confirmUpload()` to kick off the extraction pipeline\n * 4. Webhook `extraction.ready` fires when results are queryable\n *\n * No `update()` — once uploaded, document content is immutable; metadata\n * lives on the parent borrower / loan / job.\n */\nexport class DocumentsResource {\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * Request a presigned S3 PUT URL for a single document upload.\n *\n * POST /api/documents/presigned-url\n */\n async presignedUrl<T = unknown>(\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>('POST', '/api/documents/presigned-url', {\n body: params,\n ...options,\n });\n }\n\n /**\n * Confirm a single uploaded document, kicking off the extraction\n * pipeline.\n *\n * POST /api/documents/{jobId}/confirm-upload\n */\n async confirmUpload<T = unknown>(\n jobId: string,\n params: Record<string, unknown> = {},\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/documents/${encodeURIComponent(jobId)}/confirm-upload`,\n { body: params, ...options },\n );\n }\n\n /**\n * Confirm a batch of uploaded documents in a single request. Faster than\n * looping `confirmUpload()` when the integrator has many files in one\n * package.\n *\n * POST /api/documents/confirm-uploads\n */\n async batchConfirm<T = unknown>(\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>('POST', '/api/documents/confirm-uploads', {\n body: params,\n ...options,\n });\n }\n\n /**\n * Get a presigned S3 GET URL to download a previously-uploaded document.\n *\n * GET /api/documents/{jobId}/download-url\n */\n async downloadUrl<T = unknown>(jobId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/documents/${encodeURIComponent(jobId)}/download-url`,\n options,\n );\n }\n\n /**\n * Fetch processing status for a document upload.\n *\n * GET /api/documents/{jobId}/status\n */\n async status<T = unknown>(jobId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/documents/${encodeURIComponent(jobId)}/status`,\n options,\n );\n }\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Resource facade for embed sessions — short-lived tokens scoped to a\n * single loan. Mint server-side via the integrator's API key, then pass\n * the resulting `embed_token` to the browser to bootstrap the SpreadSpace\n * review widget.\n *\n * Sub-namespace structure (`embed.sessions.create(...)`) mirrors the route\n * shape (`/api/embed/sessions`) and leaves room for future embed\n * resources without crowding the top-level `embed` object.\n */\nexport class EmbedSessionsResource {\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * Mint an embed-session token for a loan. The minted token has a strict\n * subset of the calling API key's scopes and is locked to the supplied\n * `loan_id` — it cannot be used to access other loans or to mint further\n * tokens.\n *\n * POST /api/embed/sessions\n *\n * Body: { loan_id, scopes?, expires_in_seconds? }\n * Returns: { embed_token, expires_at, ... }\n */\n async create<T = unknown>(params: Record<string, unknown>, options?: RequestOptions): Promise<T> {\n return this.client.request<T>('POST', '/api/embed/sessions', { body: params, ...options });\n }\n\n /**\n * Revoke an embed session early — useful when the integrator's UI flow\n * ends before the natural expiry, or when reissuing after a logout.\n *\n * DELETE /api/embed/sessions/{sessionId}\n */\n async revoke<T = unknown>(sessionId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'DELETE',\n `/api/embed/sessions/${encodeURIComponent(sessionId)}`,\n options,\n );\n }\n}\n\n/**\n * Top-level `client.embed` namespace. Currently surfaces only the\n * `sessions` sub-resource; future phases (e.g. embed-only audit logs)\n * land here.\n */\nexport class EmbedResource {\n public readonly sessions: EmbedSessionsResource;\n\n constructor(client: SpreadSpaceClient) {\n this.sessions = new EmbedSessionsResource(client);\n }\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { AsyncPager } from '../pagination.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Resource facade for extracted document data. Extractions are scoped under\n * a borrower (the canonical PII boundary) — every endpoint takes a\n * `borrowerId` path segment so the multi-tenant access checks have an\n * unambiguous scope.\n *\n * Per-document-type endpoints (`balanceSheet`, `pl`, etc.) return\n * roll-ups across all documents of that type uploaded for the borrower.\n * The generic `query()` is the structured-search endpoint —\n * integrators that build their own UIs on top of the extraction data\n * typically want this one.\n *\n * `move()` reassigns a document's loan binding — shipped as a verb method\n * (not `update()`) because it traverses the loan-membership tables, not\n * the extraction row.\n */\nexport class ExtractionsResource {\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * Iterate every extraction for a borrower.\n *\n * GET /api/borrowers/{borrowerId}/extractions\n */\n list<T = unknown>(\n borrowerId: string,\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions`,\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Structured query across a borrower's extractions. Filter by document\n * type, period, and other metadata.\n *\n * POST /api/borrowers/{borrowerId}/extractions/query\n */\n async query<T = unknown>(\n borrowerId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/query`,\n { body: params, ...options },\n );\n }\n\n /**\n * Move an extracted document to a different loan under the same\n * borrower. Use when the user uploaded a doc to the wrong package.\n *\n * POST /api/borrowers/{borrowerId}/extractions/{docId}/move\n */\n async move<T = unknown>(\n borrowerId: string,\n docId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/${encodeURIComponent(docId)}/move`,\n { body: params, ...options },\n );\n }\n\n /**\n * Roll-up of the borrower's bank-statement analyses across all\n * uploaded statements.\n *\n * GET /api/borrowers/{borrowerId}/extractions/bank-statement-analysis\n */\n async bankStatementAnalysis<T = unknown>(\n borrowerId: string,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/bank-statement-analysis`,\n options,\n );\n }\n\n /**\n * Roll-up of the borrower's balance sheet across all uploaded\n * balance-sheet documents.\n */\n async balanceSheet<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/balance-sheet`,\n options,\n );\n }\n\n /** P&L roll-up across uploaded P&L documents. */\n async pl<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/pl`,\n options,\n );\n }\n\n /** Cash-flow roll-up. */\n async cashFlow<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/cash-flow`,\n options,\n );\n }\n\n /** Accounts payable roll-up. */\n async accountsPayable<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/accounts-payable`,\n options,\n );\n }\n\n /** Accounts receivable roll-up. */\n async accountsReceivable<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/accounts-receivable`,\n options,\n );\n }\n\n /**\n * Generic report endpoint — pass the report type as a path segment.\n * Useful for report types added after this SDK release.\n *\n * GET /api/borrowers/{borrowerId}/extractions/reports/{reportType}\n */\n async report<T = unknown>(\n borrowerId: string,\n reportType: string,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/reports/${encodeURIComponent(reportType)}`,\n options,\n );\n }\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { AsyncPager } from '../pagination.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Resource facade for `/api/jobs`. A \"job\" is a document package — a\n * batch of files uploaded together. Read-only from this surface; jobs\n * are created implicitly by the upload pipeline.\n */\nexport class JobsResource {\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * Iterate jobs visible to the calling principal.\n *\n * GET /api/jobs\n */\n list<T = unknown>(\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n '/api/jobs',\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Fetch processing status for a job.\n *\n * GET /api/jobs/{jobId}/status\n */\n async status<T = unknown>(jobId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/jobs/${encodeURIComponent(jobId)}/status`,\n options,\n );\n }\n\n /**\n * Fetch results for a job — the rolled-up extraction outcomes.\n *\n * GET /api/jobs/{jobId}/results\n */\n async results<T = unknown>(jobId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/jobs/${encodeURIComponent(jobId)}/results`,\n options,\n );\n }\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { AsyncPager } from '../pagination.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Resource facade for `/api/loans`. Loans are the top-level package unit —\n * a borrower has many loans, each loan is the scope of a documents bundle.\n */\nexport class LoansResource {\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * Retrieve a loan by id.\n *\n * GET /api/loans/{loanId}\n */\n async retrieve<T = unknown>(loanId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>('GET', `/api/loans/${encodeURIComponent(loanId)}`, options);\n }\n\n /**\n * Create a new loan.\n *\n * POST /api/loans\n */\n async create<T = unknown>(params: Record<string, unknown>, options?: RequestOptions): Promise<T> {\n return this.client.request<T>('POST', '/api/loans', { body: params, ...options });\n }\n\n /**\n * Update an existing loan.\n *\n * PATCH /api/loans/{loanId}\n */\n async update<T = unknown>(\n loanId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>('PATCH', `/api/loans/${encodeURIComponent(loanId)}`, {\n body: params,\n ...options,\n });\n }\n\n /**\n * Iterate every loan visible to the calling principal. Returns an\n * `AsyncPager<T>` — consume with `for await`, `.toArray()`, or\n * `.pages()`.\n *\n * GET /api/loans\n */\n list<T = unknown>(\n params?: { limit?: number; cursor?: string; borrower_id?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n '/api/loans',\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Assign a lender to this loan. Calls `POST /api/loans/{id}/assign`.\n * Surfaced as a verb method rather than forcing it through `update()`\n * because the assignment flow is semantically distinct from a generic\n * field patch (it touches the lender-access table, not the loan row).\n */\n async assign<T = unknown>(\n loanId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>('POST', `/api/loans/${encodeURIComponent(loanId)}/assign`, {\n body: params,\n ...options,\n });\n }\n\n /**\n * Fetch the audit log for a loan.\n *\n * GET /api/loans/{loanId}/audit-log\n */\n async auditLog<T = unknown>(loanId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/loans/${encodeURIComponent(loanId)}/audit-log`,\n options,\n );\n }\n}\n","import { createHmac, timingSafeEqual } from 'node:crypto';\n\nimport type { VerifyAndParseResult, WebhookEvent } from './types.js';\n\n/**\n * Webhook signature verifier — byte-for-byte compatible with\n * `api/src/Webhooks/WebhookSigner.cs` on the API side.\n *\n * Wire format (mirrors Stripe's `Stripe-Signature`):\n *\n * SpreadSpace-Signature: t=<unix_seconds>,v1=<hex_hmac_sha256(secret, \"{t}.{body}\")>\n *\n * The verifier:\n * 1. Parses `t=...` and `v1=...` tokens (tolerant of additional unrecognized\n * pairs to stay forward-compatible with future schemes).\n * 2. Recomputes HMAC-SHA256 over `\"{timestamp}.{rawBody}\"` with the secret.\n * 3. Compares with `crypto.timingSafeEqual` on raw bytes (never on hex\n * strings — string `===` short-circuits and leaks prefix info via timing).\n * 4. Two-sided freshness check: rejects timestamps too far in the past\n * (replay protection) AND too far in the future (attacker-controlled\n * timestamps that would extend the replay window).\n *\n * Verification order matches the C# side: HMAC first, then freshness. That\n * way a forged-but-fresh request and a real-but-stale request fail\n * indistinguishably from the timing perspective.\n */\n\n/** Default freshness tolerance — matches `WebhookSignatureFormat.DefaultFreshnessTolerance`. */\nconst DEFAULT_FRESHNESS_TOLERANCE_SECONDS = 5 * 60;\n\n/** Wire constant for the v1 HMAC-SHA256 scheme. */\nconst VERSION_1_PREFIX = 'v1';\n\nexport interface VerifyOptions {\n /**\n * Maximum age (and maximum future skew) of the timestamp before the\n * signature is rejected as stale. Symmetric — `Math.abs(now - t)` must be\n * ≤ this value.\n *\n * Default: 300 seconds (5 minutes).\n */\n freshnessTolerance?: number;\n\n /**\n * Override the \"current time\" used for the freshness check. Useful in\n * tests; otherwise leave undefined and the verifier reads\n * `Date.now() / 1000`.\n */\n currentTimestamp?: number;\n}\n\n/**\n * Verify a `SpreadSpace-Signature` header against a body and signing\n * secret. Throws on any failure (invalid format, bad HMAC, stale timestamp,\n * wrong secret); returns `true` on success.\n *\n * @param rawBody The exact request body received on the wire — bytes, not\n * re-serialized JSON. Any byte-level transformation between receipt and\n * verification (re-stringification, gzip decode, encoding change) will\n * invalidate the signature.\n * @param signature Contents of the `SpreadSpace-Signature` HTTP header.\n * @param secret The plaintext signing secret (`whsec_...`) issued at\n * webhook endpoint creation. Never log this.\n * @param options Optional overrides — freshness window and clock injection.\n */\nexport function verifyWebhookSignature(\n rawBody: string | Buffer | Uint8Array,\n signature: string,\n secret: string,\n options?: VerifyOptions,\n): true {\n if (typeof signature !== 'string' || signature.length === 0) {\n throw new WebhookSignatureError('SpreadSpace-Signature header is missing or empty.');\n }\n if (typeof secret !== 'string' || secret.length === 0) {\n throw new WebhookSignatureError('Webhook signing secret is missing or empty.');\n }\n if (rawBody === null || rawBody === undefined) {\n throw new WebhookSignatureError('Webhook raw body is missing.');\n }\n\n const parsed = parseSignatureHeader(signature);\n if (!parsed) {\n throw new WebhookSignatureError('Webhook signature header is malformed.');\n }\n const { timestamp, hex } = parsed;\n\n // HMAC FIRST. We never want to leak (via differential timing or distinct\n // error message text) whether a request was a forged signature vs. a real\n // one that aged out — both should be indistinguishable failures.\n const bodyString = bodyToString(rawBody);\n const expectedHex = computeHmacHex(secret, `${timestamp}.${bodyString}`);\n\n if (!hexEquals(expectedHex, hex)) {\n throw new WebhookSignatureError('Webhook signature does not match.');\n }\n\n // Then freshness. Two-sided check: too old OR too far in the future.\n const tolerance = options?.freshnessTolerance ?? DEFAULT_FRESHNESS_TOLERANCE_SECONDS;\n const now = options?.currentTimestamp ?? Math.floor(Date.now() / 1000);\n const age = now - timestamp;\n if (age > tolerance || age < -tolerance) {\n throw new WebhookSignatureError(\n `Webhook timestamp is outside the freshness window of ${tolerance}s.`,\n );\n }\n\n return true;\n}\n\n/**\n * Verify a webhook signature and JSON-parse the body into a typed\n * `WebhookEvent` envelope. Throws on signature failure or invalid JSON.\n *\n * The returned value is a discriminated union over `type` — switch on\n * `event.type` to narrow `event.data` to the matching payload.\n */\nexport function verifyAndParseWebhook(\n rawBody: string | Buffer | Uint8Array,\n signature: string,\n secret: string,\n options?: VerifyOptions,\n): VerifyAndParseResult {\n verifyWebhookSignature(rawBody, signature, secret, options);\n\n const bodyString = bodyToString(rawBody);\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(bodyString);\n } catch (cause) {\n throw new WebhookSignatureError('Webhook body is not valid JSON.', cause);\n }\n\n if (!isPlainObject(parsed)) {\n throw new WebhookSignatureError('Webhook body is not a JSON object.');\n }\n const candidate = parsed as Partial<WebhookEvent>;\n if (typeof candidate.type !== 'string' || candidate.type.length === 0) {\n throw new WebhookSignatureError('Webhook body is missing a `type` field.');\n }\n if (typeof candidate.id !== 'string' || candidate.id.length === 0) {\n throw new WebhookSignatureError('Webhook body is missing an `id` field.');\n }\n if (typeof candidate.created !== 'number') {\n throw new WebhookSignatureError('Webhook body is missing a numeric `created` field.');\n }\n if (typeof candidate.tenant_id !== 'string' || candidate.tenant_id.length === 0) {\n throw new WebhookSignatureError('Webhook body is missing a `tenant_id` field.');\n }\n if (!isPlainObject(candidate.data)) {\n throw new WebhookSignatureError('Webhook body is missing a `data` object.');\n }\n\n return parsed as VerifyAndParseResult;\n}\n\n/**\n * Thrown when a webhook signature fails verification or the envelope is\n * structurally malformed. Distinct from `SpreadSpaceError` because webhook\n * verification is a self-contained primitive — verifiers don't need the\n * full request/response error machinery, just a single failure type they\n * can reject against.\n */\nexport class WebhookSignatureError extends Error {\n public readonly cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = 'WebhookSignatureError';\n this.cause = cause;\n Object.setPrototypeOf(this, WebhookSignatureError.prototype);\n }\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Internals\n// ────────────────────────────────────────────────────────────────────────────\n\ninterface ParsedSignature {\n timestamp: number;\n hex: string;\n}\n\n/**\n * Parse a header in the form `t=<long>,v1=<hex>`. Tolerant of whitespace\n * between segments and of additional unrecognized pairs (e.g. a future\n * `v2=...`) — those are silently ignored, not treated as parse errors, so\n * this verifier remains forward-compatible with new schemes.\n */\nfunction parseSignatureHeader(header: string): ParsedSignature | null {\n const segments = header.split(',').filter((s) => s.length > 0);\n if (segments.length < 2) return null;\n\n let parsedTs: number | null = null;\n let parsedV1: string | null = null;\n\n for (const raw of segments) {\n const segment = raw.trim();\n const eq = segment.indexOf('=');\n if (eq <= 0 || eq === segment.length - 1) {\n // Missing key, missing value, or `=` at the very end (`v1=`).\n return null;\n }\n\n const key = segment.slice(0, eq).trim();\n const value = segment.slice(eq + 1).trim();\n\n if (key === 't') {\n if (parsedTs !== null) return null; // Duplicate `t=`.\n // Strict integer parse — reject `1.5`, `1e3`, leading `+`, etc. The C#\n // verifier uses `long.TryParse(NumberStyles.Integer, Invariant)`,\n // which accepts an optional leading `-` and digits only. We mirror that.\n if (!/^-?\\d+$/.test(value)) return null;\n const ts = Number(value);\n if (!Number.isFinite(ts) || !Number.isInteger(ts)) return null;\n parsedTs = ts;\n } else if (key === VERSION_1_PREFIX) {\n if (parsedV1 !== null) return null; // Duplicate `v1=`.\n if (value.length === 0) return null;\n parsedV1 = value;\n }\n // Any other key — silently ignored for forward compatibility.\n }\n\n if (parsedTs === null || parsedV1 === null) return null;\n return { timestamp: parsedTs, hex: parsedV1 };\n}\n\n/**\n * Compute lowercase hex HMAC-SHA256 digest. Matches the C# side's\n * `Convert.ToHexStringLower(hmac.ComputeHash(...))` exactly.\n */\nfunction computeHmacHex(secret: string, signedPayload: string): string {\n const hmac = createHmac('sha256', Buffer.from(secret, 'utf-8'));\n hmac.update(Buffer.from(signedPayload, 'utf-8'));\n return hmac.digest('hex'); // Node default is lowercase.\n}\n\n/**\n * Constant-time compare of two hex strings. We decode both sides to bytes\n * before calling `timingSafeEqual` — it requires equal-length inputs and\n * we want a length mismatch to fail fast (length is not timing-sensitive\n * since both ends know SHA-256 emits 64 hex chars).\n */\nfunction hexEquals(expectedHex: string, providedHex: string): boolean {\n if (expectedHex.length !== providedHex.length) return false;\n\n let expectedBytes: Buffer;\n let providedBytes: Buffer;\n try {\n expectedBytes = Buffer.from(expectedHex, 'hex');\n providedBytes = Buffer.from(providedHex, 'hex');\n } catch {\n return false;\n }\n\n // `Buffer.from(..., 'hex')` silently stops at the first non-hex character,\n // producing a shorter buffer — guard explicitly against that to avoid a\n // false equality when the provided hex has invalid characters that happen\n // to truncate to an empty buffer the receiver also produced.\n if (expectedBytes.length !== providedBytes.length) return false;\n if (expectedBytes.length * 2 !== expectedHex.length) return false;\n if (providedBytes.length * 2 !== providedHex.length) return false;\n\n return timingSafeEqual(\n new Uint8Array(expectedBytes.buffer, expectedBytes.byteOffset, expectedBytes.byteLength),\n new Uint8Array(providedBytes.buffer, providedBytes.byteOffset, providedBytes.byteLength),\n );\n}\n\nfunction bodyToString(body: string | Buffer | Uint8Array): string {\n if (typeof body === 'string') return body;\n if (Buffer.isBuffer(body)) return body.toString('utf-8');\n return Buffer.from(body).toString('utf-8');\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { AsyncPager } from '../pagination.js';\nimport type { RequestOptions } from '../types.js';\nimport {\n verifyAndParseWebhook as verifyAndParseWebhookFn,\n verifyWebhookSignature as verifyWebhookSignatureFn,\n} from '../webhook-signature.js';\n\n/**\n * Resource facade for webhook endpoints (`/api/webhooks/*`) plus the\n * webhook signature helpers as static methods for discoverability.\n *\n * The verification helpers are also exported as bare functions from\n * `@spreadspace/embed/webhooks` for tree-shakeable import paths in\n * webhook receiver Lambdas (where `SpreadSpaceClient` would otherwise pull\n * in the entire resource layer).\n */\nexport class WebhooksResource {\n /**\n * Verify a `SpreadSpace-Signature` header against a body and signing\n * secret. Throws `WebhookSignatureError` on any failure.\n */\n public static readonly verifySignature = verifyWebhookSignatureFn;\n\n /**\n * Verify a webhook signature and JSON-parse the body into a typed\n * `WebhookEvent`. Throws `WebhookSignatureError` on signature failure or\n * invalid JSON.\n */\n public static readonly verifyAndParse = verifyAndParseWebhookFn;\n\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * List configured webhook endpoints for this organization.\n *\n * GET /api/webhooks\n */\n list<T = unknown>(\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n '/api/webhooks',\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Retrieve a single webhook endpoint.\n *\n * GET /api/webhooks/{id}\n */\n async retrieve<T = unknown>(endpointId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/webhooks/${encodeURIComponent(endpointId)}`,\n options,\n );\n }\n\n /**\n * Create a new webhook endpoint. The response carries the plaintext\n * signing secret exactly once — store it server-side, do not log it.\n *\n * POST /api/webhooks\n */\n async create<T = unknown>(params: Record<string, unknown>, options?: RequestOptions): Promise<T> {\n return this.client.request<T>('POST', '/api/webhooks', { body: params, ...options });\n }\n\n /**\n * Update endpoint metadata (URL, subscribed event types, enabled flag).\n *\n * PATCH /api/webhooks/{id}\n */\n async update<T = unknown>(\n endpointId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'PATCH',\n `/api/webhooks/${encodeURIComponent(endpointId)}`,\n { body: params, ...options },\n );\n }\n\n /**\n * Delete a webhook endpoint.\n *\n * DELETE /api/webhooks/{id}\n */\n async delete<T = unknown>(endpointId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'DELETE',\n `/api/webhooks/${encodeURIComponent(endpointId)}`,\n options,\n );\n }\n\n /**\n * Rotate an endpoint's signing secret. The old secret remains valid for\n * a grace window so deliveries in flight aren't dropped. Returns the new\n * plaintext secret exactly once.\n *\n * POST /api/webhooks/{id}/rotate\n */\n async rotateSecret<T = unknown>(\n endpointId: string,\n params: Record<string, unknown> = {},\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/webhooks/${encodeURIComponent(endpointId)}/rotate`,\n { body: params, ...options },\n );\n }\n\n /**\n * Iterate delivery attempts for an endpoint.\n *\n * GET /api/webhooks/{id}/deliveries\n */\n deliveries<T = unknown>(\n endpointId: string,\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n `/api/webhooks/${encodeURIComponent(endpointId)}/deliveries`,\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Manually replay a delivery (e.g. after fixing a downstream outage).\n *\n * POST /api/webhooks/{id}/deliveries/{deliveryId}/replay\n */\n async replayDelivery<T = unknown>(\n endpointId: string,\n deliveryId: string,\n params: Record<string, unknown> = {},\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/webhooks/${encodeURIComponent(endpointId)}/deliveries/${encodeURIComponent(deliveryId)}/replay`,\n { body: params, ...options },\n );\n }\n}\n","/**\n * The SDK package version. Sent on every outbound request as part of the\n * `User-Agent` string so server-side telemetry can pick up which SDK release\n * a customer is running.\n *\n * Hand-rolled rather than imported from `package.json` because tsup output\n * doesn't include the package manifest — keeping it as a TS literal avoids a\n * runtime `fs` read from the dist bundle.\n *\n * Bump in lockstep with `package.json`.\n */\nexport const SDK_VERSION = '0.1.0';\n\n/**\n * Default API surface version pinned by this SDK release. Sent as the\n * `SpreadSpace-Version` header on every request unless the integrator\n * overrides it via `SpreadSpaceClientOptions.apiVersion`.\n *\n * Once the SDK is published, this value is the contract: the SDK guarantees\n * the request/response shapes match this dated surface. Bumping requires a\n * new SDK release that codegens against the new spec.\n */\nexport const DEFAULT_API_VERSION = '2026-05-03';\n","import { randomUUID } from 'node:crypto';\n\nimport {\n AuthenticationError,\n classifyError,\n ConflictError,\n InvalidRequestError,\n NetworkError,\n NotFoundError,\n PermissionError,\n RateLimitError,\n ServerError,\n SpreadSpaceError,\n} from './errors.js';\nimport { paginate, type AsyncPager } from './pagination.js';\nimport { BorrowersResource } from './resources/borrowers.js';\nimport { DocumentsResource } from './resources/documents.js';\nimport { EmbedResource } from './resources/embed.js';\nimport { ExtractionsResource } from './resources/extractions.js';\nimport { JobsResource } from './resources/jobs.js';\nimport { LoansResource } from './resources/loans.js';\nimport { WebhooksResource } from './resources/webhooks.js';\nimport type { RequestOptions } from './types.js';\nimport { DEFAULT_API_VERSION, SDK_VERSION } from './version.js';\n\n/**\n * Re-export the error classes for `instanceof` checks at integrator callsites\n * without needing a separate `import { ... } from '@spreadspace/embed/errors'`.\n */\nexport {\n SpreadSpaceError,\n InvalidRequestError,\n AuthenticationError,\n PermissionError,\n NotFoundError,\n ConflictError,\n RateLimitError,\n ServerError,\n NetworkError,\n};\n\nexport interface SpreadSpaceClientOptions {\n /**\n * The API key for authentication. Live keys begin with `ss_live_`, test\n * keys with `ss_test_`. Issue and manage keys from the SpreadSpace\n * dashboard.\n */\n apiKey: string;\n\n /**\n * Base URL for the API. Defaults to `https://api.spreadspace.app`.\n * Override for staging (`https://staging-api.spreadspace.app`) or for\n * local development (`http://localhost:8080`).\n */\n baseUrl?: string;\n\n /**\n * Override the SDK-pinned `SpreadSpace-Version` header. Defaults to the\n * version this SDK release was built against. Set this only when\n * intentionally targeting a different surface version than the SDK was\n * tested against.\n */\n apiVersion?: string;\n\n /**\n * Request timeout in milliseconds. Default: 30000 (30s). The timeout is\n * applied per individual HTTP attempt — retries get a fresh window each.\n */\n timeout?: number;\n\n /**\n * Maximum number of retry attempts after the initial request. Default: 3.\n * Retries trigger on:\n * - 429 Rate Limited (honors `Retry-After` if present)\n * - 5xx Server Errors\n * - Transport-level network failures\n * 4xx other than 429 do not retry.\n */\n maxRetries?: number;\n\n /**\n * Custom `fetch` implementation. Defaults to `globalThis.fetch`. Inject a\n * mock here to write hermetic tests without monkey-patching the global.\n */\n fetch?: typeof fetch;\n\n /**\n * Custom idempotency-key generator. Defaults to `crypto.randomUUID()`.\n */\n idempotencyKeyGenerator?: () => string;\n}\n\n/**\n * Internal options for the low-level `request()` method. Resource methods\n * compose these on top of the public `RequestOptions`.\n */\nexport interface InternalRequestOptions extends RequestOptions {\n /**\n * JSON-serializable request body. Encoded as `application/json` with\n * `Content-Type: application/json; charset=utf-8`.\n */\n body?: unknown;\n\n /**\n * Query parameters appended to the URL. `undefined` values are skipped.\n */\n query?: Record<string, string | number | boolean | undefined>;\n}\n\nconst DEFAULT_BASE_URL = 'https://api.spreadspace.app';\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_MAX_RETRIES = 3;\nconst RETRY_BASE_DELAY_MS = 500;\nconst RETRY_MAX_DELAY_MS = 30_000;\n\n/**\n * Top-level entry point of the SpreadSpace SDK.\n *\n * Single instance per integrator process — the resources hanging off it are\n * thin facades, not separate clients, so spinning up multiple\n * `SpreadSpaceClient`s only matters when juggling multiple API keys.\n *\n * Wire-format invariants the client guarantees on every request:\n * - `Authorization: Bearer <apiKey>`\n * - `SpreadSpace-Version: <apiVersion>`\n * - `User-Agent: spreadspace-node/<sdkVersion> node/<nodeVersion>`\n * - `Idempotency-Key: <auto-generated UUID>` on every POST/PATCH/PUT/DELETE\n * unless the caller supplies one explicitly or sets `idempotencyKey: null`\n *\n * Retries on 429, 5xx, and transport failures up to `maxRetries` times with\n * exponential backoff (capped) and jitter; honors `Retry-After`.\n */\nexport class SpreadSpaceClient {\n /** Resolved base URL (no trailing slash). */\n public readonly baseUrl: string;\n\n /** Resolved API version string (the `SpreadSpace-Version` header value). */\n public readonly apiVersion: string;\n\n /** Public so resource files can pull it for `paginate()` URL construction. */\n public readonly maxRetries: number;\n\n // ── Resources ────────────────────────────────────────────────────────────\n public readonly loans: LoansResource;\n public readonly borrowers: BorrowersResource;\n public readonly documents: DocumentsResource;\n public readonly extractions: ExtractionsResource;\n public readonly jobs: JobsResource;\n public readonly webhooks: WebhooksResource;\n public readonly embed: EmbedResource;\n\n // ── Internals ────────────────────────────────────────────────────────────\n // ECMAScript #private (not TS `private`): runtime-invisible, so the\n // credential can never ride JSON.stringify/console.log/spread of the\n // client or anything holding it.\n readonly #apiKey: string;\n private readonly timeoutMs: number;\n private readonly fetchImpl: typeof fetch;\n private readonly idempotencyKeyGenerator: () => string;\n\n constructor(options: SpreadSpaceClientOptions) {\n if (!options || typeof options.apiKey !== 'string' || options.apiKey.length === 0) {\n throw new TypeError(\n 'SpreadSpaceClient requires an apiKey. Issue one from the dashboard at /settings/api-keys.',\n );\n }\n\n this.#apiKey = options.apiKey;\n let baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n while (baseUrl.endsWith('/')) baseUrl = baseUrl.slice(0, -1);\n this.baseUrl = baseUrl;\n this.apiVersion = options.apiVersion ?? DEFAULT_API_VERSION;\n this.timeoutMs = options.timeout ?? DEFAULT_TIMEOUT_MS;\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.fetchImpl = options.fetch ?? globalThis.fetch;\n this.idempotencyKeyGenerator = options.idempotencyKeyGenerator ?? randomUUID;\n\n if (typeof this.fetchImpl !== 'function') {\n throw new TypeError(\n 'SpreadSpaceClient requires a fetch implementation. Node 18+ provides one globally; pass a polyfill via options.fetch otherwise.',\n );\n }\n\n this.loans = new LoansResource(this);\n this.borrowers = new BorrowersResource(this);\n this.documents = new DocumentsResource(this);\n this.extractions = new ExtractionsResource(this);\n this.jobs = new JobsResource(this);\n this.webhooks = new WebhooksResource(this);\n this.embed = new EmbedResource(this);\n }\n\n /**\n * Low-level request method. Resource layer wraps this with ergonomic\n * method names; integrators can call it directly to hit endpoints not yet\n * surfaced via a typed resource.\n *\n * Returns the parsed JSON body. For 204 No Content responses (currently\n * none in the API but reserved), returns `undefined as T`.\n */\n public async request<T>(\n method: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE',\n path: string,\n options: InternalRequestOptions = {},\n ): Promise<T> {\n const url = this.buildUrl(path, options.query);\n const headers = this.buildHeaders(method, options);\n const body = options.body !== undefined ? JSON.stringify(options.body) : undefined;\n const maxRetries = options.maxRetries ?? this.maxRetries;\n\n let attempt = 0;\n let lastError: unknown;\n\n while (attempt <= maxRetries) {\n // Per-attempt timeout. We compose it with any caller-provided\n // `signal` so abort-from-outside still works.\n const controller = new AbortController();\n const timeoutHandle = setTimeout(() => controller.abort(), this.timeoutMs);\n const signal = options.signal\n ? composeAbortSignals(controller.signal, options.signal)\n : controller.signal;\n\n let response: Response;\n try {\n response = await this.fetchImpl(url, {\n method,\n headers,\n body,\n signal,\n });\n } catch (err) {\n clearTimeout(timeoutHandle);\n lastError = err;\n // Transport-layer failures are retryable on the same backoff curve\n // as 5xx — DNS hiccups, TLS handshake failures, intermittent\n // upstream resets are exactly what retries are designed to cover.\n if (attempt < maxRetries) {\n await sleep(this.computeRetryDelay(attempt, undefined));\n attempt += 1;\n continue;\n }\n throw new NetworkError(\n `SpreadSpace request to ${method} ${url} failed: ${describeError(err)}`,\n err,\n );\n }\n\n clearTimeout(timeoutHandle);\n\n const requestId = response.headers.get('X-Request-ID') ?? undefined;\n\n // Successful response — parse body and return.\n if (response.ok) {\n return await this.parseSuccessBody<T>(response);\n }\n\n // Decide retry vs. throw based on status.\n const status = response.status;\n const retryable = status === 429 || (status >= 500 && status <= 599);\n\n if (retryable && attempt < maxRetries) {\n const retryAfterSec = parseRetryAfter(response.headers.get('Retry-After'));\n await sleep(this.computeRetryDelay(attempt, retryAfterSec));\n attempt += 1;\n // Drain the body so the connection can be reused — we don't care\n // about its content on a retryable failure.\n try {\n await response.body?.cancel();\n } catch {\n /* ignore */\n }\n continue;\n }\n\n // Non-retryable, or out of attempts — convert to typed exception.\n throw await this.buildErrorFromResponse(response, requestId);\n }\n\n // Should be unreachable — the loop either returns, throws, or continues.\n throw new NetworkError(\n `SpreadSpace request to ${method} ${url} exhausted retries (last error: ${describeError(lastError)}).`,\n lastError,\n );\n }\n\n /**\n * Convenience wrapper around `paginate()` for resource list methods. Lets\n * each resource simply do `return this.client.paginate(...)` rather than\n * importing the helper directly.\n */\n public paginate<T>(\n path: string,\n params?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions,\n ): AsyncPager<T> {\n return paginate<T>(this, path, params, options);\n }\n\n // ────────────────────────────────────────────────────────────────────────\n // Internals\n // ────────────────────────────────────────────────────────────────────────\n\n private buildUrl(\n path: string,\n query?: Record<string, string | number | boolean | undefined>,\n ): string {\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n const url = new URL(this.baseUrl + normalizedPath);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined) continue;\n url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n }\n\n private buildHeaders(\n method: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE',\n options: InternalRequestOptions,\n ): Headers {\n const headers = new Headers();\n headers.set('Authorization', `Bearer ${this.#apiKey}`);\n headers.set('SpreadSpace-Version', options.apiVersion ?? this.apiVersion);\n headers.set('Accept', 'application/json');\n headers.set('User-Agent', this.buildUserAgent());\n\n if (options.body !== undefined) {\n headers.set('Content-Type', 'application/json; charset=utf-8');\n }\n\n // Idempotency-Key on every non-GET unless explicitly suppressed via\n // `idempotencyKey: null` or already provided in options.\n if (method !== 'GET') {\n const explicit = options.idempotencyKey;\n if (explicit === null) {\n // Caller opted out — no header.\n } else if (typeof explicit === 'string' && explicit.length > 0) {\n headers.set('Idempotency-Key', explicit);\n } else {\n headers.set('Idempotency-Key', this.idempotencyKeyGenerator());\n }\n }\n\n return headers;\n }\n\n private buildUserAgent(): string {\n const nodeVersion = typeof process !== 'undefined' ? process.version : 'unknown';\n return `spreadspace-node/${SDK_VERSION} node/${nodeVersion}`;\n }\n\n /**\n * Compute the next retry delay. Exponential backoff with full jitter,\n * floored by `Retry-After` if the server provided one (we never retry\n * faster than the server asked us to).\n *\n * base = min(maxDelay, baseDelay * 2^attempt)\n * delay = random(0, base)\n *\n * Full jitter (vs. equal jitter) is the AWS-recommended default — it\n * minimizes thundering-herd across many concurrent retrying clients.\n */\n private computeRetryDelay(attempt: number, retryAfterSec: number | undefined): number {\n const expBackoff = Math.min(RETRY_MAX_DELAY_MS, RETRY_BASE_DELAY_MS * 2 ** attempt);\n const jittered = Math.floor(Math.random() * expBackoff);\n\n if (retryAfterSec !== undefined && retryAfterSec > 0) {\n const retryAfterMs = retryAfterSec * 1000;\n return Math.max(jittered, retryAfterMs);\n }\n return jittered;\n }\n\n private async parseSuccessBody<T>(response: Response): Promise<T> {\n if (response.status === 204) {\n return undefined as T;\n }\n const text = await response.text();\n if (text.length === 0) {\n return undefined as T;\n }\n try {\n return JSON.parse(text) as T;\n } catch (err) {\n throw new NetworkError(\n `Failed to parse SpreadSpace response as JSON (status=${response.status}): ${describeError(err)}`,\n err,\n );\n }\n }\n\n private async buildErrorFromResponse(\n response: Response,\n requestId: string | undefined,\n ): Promise<SpreadSpaceError> {\n const status = response.status;\n let rawBody: unknown;\n let type = 'unknown';\n let message = `SpreadSpace API request failed with status ${status}.`;\n let details: Record<string, string> | undefined;\n let resolvedRequestId = requestId;\n\n try {\n const text = await response.text();\n if (text.length > 0) {\n try {\n const parsed = JSON.parse(text) as unknown;\n rawBody = parsed;\n if (\n typeof parsed === 'object' &&\n parsed !== null &&\n 'error' in parsed &&\n typeof (parsed as { error: unknown }).error === 'object' &&\n (parsed as { error: object }).error !== null\n ) {\n const errBody = (parsed as { error: Record<string, unknown> }).error;\n if (typeof errBody.type === 'string') type = errBody.type;\n if (typeof errBody.message === 'string') message = errBody.message;\n if (\n errBody.details &&\n typeof errBody.details === 'object' &&\n !Array.isArray(errBody.details)\n ) {\n details = errBody.details as Record<string, string>;\n }\n // Body's request_id is the authoritative source from the\n // ApiErrorResponse envelope. Prefer the X-Request-ID header\n // when both are set (they will be in production), fall through\n // to body when the header is absent (test mocks, proxies that\n // strip headers, etc.).\n if (resolvedRequestId === undefined && typeof errBody.request_id === 'string') {\n resolvedRequestId = errBody.request_id;\n }\n }\n } catch {\n rawBody = text;\n }\n }\n } catch {\n // Body read failure — keep the generic message.\n }\n\n const ErrorClass = classifyError(status, type);\n const ctorParams = {\n type,\n message,\n statusCode: status,\n requestId: resolvedRequestId,\n rawBody,\n details,\n };\n\n return new ErrorClass(ctorParams);\n }\n}\n\n// ──────────────────────────────────────────────────────────────────────────────\n// Helpers — kept module-private; not exported.\n// ──────────────────────────────────────────────────────────────────────────────\n\nfunction sleep(ms: number): Promise<void> {\n if (ms <= 0) return Promise.resolve();\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Parse `Retry-After`. Spec allows either delta-seconds or HTTP-date; we\n * accept both. Returns `undefined` if the header is missing or unparseable.\n */\nfunction parseRetryAfter(value: string | null): number | undefined {\n if (value === null || value.length === 0) return undefined;\n const asInt = Number(value);\n if (Number.isFinite(asInt) && Number.isInteger(asInt) && asInt >= 0) {\n return asInt;\n }\n const asDate = Date.parse(value);\n if (!Number.isNaN(asDate)) {\n const deltaMs = asDate - Date.now();\n if (deltaMs > 0) return Math.ceil(deltaMs / 1000);\n }\n return undefined;\n}\n\nfunction describeError(err: unknown): string {\n if (err instanceof Error) return err.message;\n if (typeof err === 'string') return err;\n return String(err);\n}\n\n/**\n * Compose two `AbortSignal`s — abort either one and the composed signal\n * fires. `AbortSignal.any` is in modern Node but we polyfill manually so\n * the SDK works under Node 18 which predates it.\n */\nfunction composeAbortSignals(a: AbortSignal, b: AbortSignal): AbortSignal {\n // Prefer the standard `AbortSignal.any` when available (Node 20+).\n type AbortSignalAny = (signals: AbortSignal[]) => AbortSignal;\n const maybeAny = (AbortSignal as unknown as { any?: AbortSignalAny }).any;\n if (typeof maybeAny === 'function') {\n return maybeAny([a, b]);\n }\n\n const controller = new AbortController();\n const onAbort = (source: AbortSignal): void => {\n if (controller.signal.aborted) return;\n const reason = (source as { reason?: unknown }).reason;\n controller.abort(reason);\n };\n\n if (a.aborted) {\n onAbort(a);\n } else {\n a.addEventListener('abort', () => onAbort(a), { once: true });\n }\n if (b.aborted) {\n onAbort(b);\n } else {\n b.addEventListener('abort', () => onAbort(b), { once: true });\n }\n return controller.signal;\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -604,6 +604,7 @@ interface InternalRequestOptions extends RequestOptions {
604
604
  * exponential backoff (capped) and jitter; honors `Retry-After`.
605
605
  */
606
606
  declare class SpreadSpaceClient {
607
+ #private;
607
608
  /** Resolved base URL (no trailing slash). */
608
609
  readonly baseUrl: string;
609
610
  /** Resolved API version string (the `SpreadSpace-Version` header value). */
@@ -617,7 +618,6 @@ declare class SpreadSpaceClient {
617
618
  readonly jobs: JobsResource;
618
619
  readonly webhooks: WebhooksResource;
619
620
  readonly embed: EmbedResource;
620
- private readonly apiKey;
621
621
  private readonly timeoutMs;
622
622
  private readonly fetchImpl;
623
623
  private readonly idempotencyKeyGenerator;
package/dist/index.d.ts CHANGED
@@ -604,6 +604,7 @@ interface InternalRequestOptions extends RequestOptions {
604
604
  * exponential backoff (capped) and jitter; honors `Retry-After`.
605
605
  */
606
606
  declare class SpreadSpaceClient {
607
+ #private;
607
608
  /** Resolved base URL (no trailing slash). */
608
609
  readonly baseUrl: string;
609
610
  /** Resolved API version string (the `SpreadSpace-Version` header value). */
@@ -617,7 +618,6 @@ declare class SpreadSpaceClient {
617
618
  readonly jobs: JobsResource;
618
619
  readonly webhooks: WebhooksResource;
619
620
  readonly embed: EmbedResource;
620
- private readonly apiKey;
621
621
  private readonly timeoutMs;
622
622
  private readonly fetchImpl;
623
623
  private readonly idempotencyKeyGenerator;
package/dist/index.js CHANGED
@@ -860,7 +860,10 @@ var SpreadSpaceClient = class {
860
860
  webhooks;
861
861
  embed;
862
862
  // ── Internals ────────────────────────────────────────────────────────────
863
- apiKey;
863
+ // ECMAScript #private (not TS `private`): runtime-invisible, so the
864
+ // credential can never ride JSON.stringify/console.log/spread of the
865
+ // client or anything holding it.
866
+ #apiKey;
864
867
  timeoutMs;
865
868
  fetchImpl;
866
869
  idempotencyKeyGenerator;
@@ -870,7 +873,7 @@ var SpreadSpaceClient = class {
870
873
  "SpreadSpaceClient requires an apiKey. Issue one from the dashboard at /settings/api-keys."
871
874
  );
872
875
  }
873
- this.apiKey = options.apiKey;
876
+ this.#apiKey = options.apiKey;
874
877
  let baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;
875
878
  while (baseUrl.endsWith("/")) baseUrl = baseUrl.slice(0, -1);
876
879
  this.baseUrl = baseUrl;
@@ -980,7 +983,7 @@ var SpreadSpaceClient = class {
980
983
  }
981
984
  buildHeaders(method, options) {
982
985
  const headers = new Headers();
983
- headers.set("Authorization", `Bearer ${this.apiKey}`);
986
+ headers.set("Authorization", `Bearer ${this.#apiKey}`);
984
987
  headers.set("SpreadSpace-Version", options.apiVersion ?? this.apiVersion);
985
988
  headers.set("Accept", "application/json");
986
989
  headers.set("User-Agent", this.buildUserAgent());
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/pagination.ts","../src/resources/borrowers.ts","../src/resources/documents.ts","../src/resources/embed.ts","../src/resources/extractions.ts","../src/resources/jobs.ts","../src/resources/loans.ts","../src/webhook-signature.ts","../src/resources/webhooks.ts","../src/version.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Public error hierarchy for the SpreadSpace SDK.\n *\n * Any non-2xx response from the API is thrown as an instance of one of the\n * subclasses below so integrators can pattern-match on the error type without\n * parsing response bodies. The shape mirrors the canonical\n * `ApiErrorResponse` envelope:\n *\n * { error: { type, message, request_id, details? } }\n *\n * `request_id` is preserved on every thrown error so customers can quote it\n * in support tickets.\n */\n\nexport interface SpreadSpaceErrorParams {\n type: string;\n message: string;\n statusCode: number;\n requestId?: string;\n rawBody?: unknown;\n details?: Record<string, string>;\n}\n\n/**\n * Base class for every error thrown by the SDK in response to a non-2xx\n * API response. Network-layer failures (DNS, TCP reset, fetch abort) are\n * surfaced as `NetworkError`.\n */\nexport class SpreadSpaceError extends Error {\n /**\n * The canonical `error.type` string from the API envelope, e.g.\n * `invalid_request`, `rate_limited`, `idempotency_request_mismatch`.\n * Stable across versions — clients pattern-match on this.\n */\n public readonly type: string;\n\n /** HTTP status code. */\n public readonly statusCode: number;\n\n /** `X-Request-ID` echoed from the server. Quote in support tickets. */\n public readonly requestId?: string;\n\n /** Raw response body for debugging. May be the parsed JSON or a string. */\n public readonly rawBody?: unknown;\n\n /** Optional structured details (e.g. `borrower_id` on `pii_claim_required`). */\n public readonly details?: Record<string, string>;\n\n constructor(params: SpreadSpaceErrorParams) {\n super(params.message);\n this.name = new.target.name;\n this.type = params.type;\n this.statusCode = params.statusCode;\n this.requestId = params.requestId;\n this.rawBody = params.rawBody;\n this.details = params.details;\n\n // Maintain the prototype chain — necessary for `instanceof` to work after\n // transpilation to ES5 (some integrator builds still target older runtimes).\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** 400 Bad Request — typically schema validation. */\nexport class InvalidRequestError extends SpreadSpaceError {}\n\n/** 401 Unauthorized — missing, expired, or invalid API key. */\nexport class AuthenticationError extends SpreadSpaceError {}\n\n/**\n * 403 Forbidden — caller is authenticated but lacks permission. Includes\n * the PII-claim-required and business-email-required cases.\n */\nexport class PermissionError extends SpreadSpaceError {}\n\n/** 404 Not Found. */\nexport class NotFoundError extends SpreadSpaceError {}\n\n/**\n * 409 Conflict — typically `idempotency_request_mismatch` (same key, different\n * body) or a domain-specific conflict (duplicate resource).\n */\nexport class ConflictError extends SpreadSpaceError {}\n\n/**\n * 429 Too Many Requests. The SDK retries automatically up to `maxRetries`,\n * honoring `Retry-After`; this error is only thrown when retries are\n * exhausted.\n */\nexport class RateLimitError extends SpreadSpaceError {}\n\n/**\n * 5xx Server Error. Retries are exhausted by the time this surfaces.\n */\nexport class ServerError extends SpreadSpaceError {}\n\n/**\n * Transport-level failure — DNS, TCP reset, fetch abort, JSON parse failure\n * on a 2xx response. Distinct from API-shaped errors so integrators can\n * decide to retry differently.\n */\nexport class NetworkError extends Error {\n public readonly cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = 'NetworkError';\n this.cause = cause;\n Object.setPrototypeOf(this, NetworkError.prototype);\n }\n}\n\n/**\n * Map an HTTP status code + canonical `error.type` to the right error class.\n *\n * The status is the primary signal (so a 500 with no body still becomes\n * `ServerError`), but the type sharpens the case at the same status — e.g.\n * a 403 `pii_claim_required` is still a `PermissionError`, but a future\n * 403 `embed_session_revoked` would also end up there without a code change.\n */\nexport function classifyError(statusCode: number, _type: string | undefined): typeof SpreadSpaceError {\n if (statusCode === 400) return InvalidRequestError;\n if (statusCode === 401) return AuthenticationError;\n if (statusCode === 403) return PermissionError;\n if (statusCode === 404) return NotFoundError;\n if (statusCode === 409) return ConflictError;\n if (statusCode === 429) return RateLimitError;\n if (statusCode >= 500) return ServerError;\n // 4xx other than the above — surface generically as InvalidRequestError.\n return InvalidRequestError;\n}\n","import type { CursorPaginated, RequestOptions } from './types.js';\n\n/**\n * Pager handed back from resource `.list()` methods. Three ways to consume:\n *\n * 1. **`for await`** — iterate every item across all pages. The most common.\n *\n * for await (const loan of client.loans.list()) { ... }\n *\n * 2. **`.toArray()`** — eagerly drain into a single array. Convenient for\n * small result sets; avoid for unbounded queries (the entire result\n * must fit in memory).\n *\n * const loans = await client.loans.list().toArray();\n *\n * 3. **`for await ... of pager.pages()`** — iterate page-at-a-time, one\n * network round-trip per loop body. Useful when the integrator wants to\n * batch-process results (e.g. write a chunk to a DB, then continue).\n *\n * for await (const page of client.loans.list().pages()) { ... }\n */\nexport interface AsyncPager<T> extends AsyncIterableIterator<T> {\n /**\n * Eagerly consume every page and return all items as a single array.\n * Throws if any underlying request fails.\n */\n toArray(): Promise<T[]>;\n\n /**\n * Page-by-page async iterator. Each yielded value is a\n * `CursorPaginated<T>` envelope — useful when you want to control\n * batch-size flow rather than per-item flow.\n */\n pages(): AsyncIterableIterator<CursorPaginated<T>>;\n}\n\n/**\n * Minimal interface the pager needs from the client. Decoupled from the\n * concrete `SpreadSpaceClient` so this module stays independently testable.\n */\nexport interface PagerClient {\n request<T>(\n method: 'GET',\n path: string,\n options?: { query?: Record<string, string | number | boolean | undefined> } & RequestOptions,\n ): Promise<T>;\n}\n\n/**\n * Build a pager that walks a cursor-paginated list endpoint.\n *\n * Pagination contract — assumed identical for every list endpoint in the\n * API:\n * - GET request, `?cursor=...` carries the opaque next-page token.\n * - Response shape: `{ data: T[], limit: number, next_cursor: string | null }`.\n * - `next_cursor === null` (or absent) means end-of-stream.\n *\n * This function is invoked by every `Resource.list()` method — keeping the\n * pagination logic in one place means we never have to duplicate the\n * cursor-walk loop across resources.\n */\nexport function paginate<T>(\n client: PagerClient,\n path: string,\n params?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions,\n): AsyncPager<T> {\n let cursor: string | undefined;\n let exhausted = false;\n\n async function fetchPage(): Promise<CursorPaginated<T> | null> {\n if (exhausted) return null;\n\n const query: Record<string, string | number | boolean | undefined> = { ...(params ?? {}) };\n if (cursor !== undefined) query.cursor = cursor;\n\n const response = await client.request<CursorPaginated<T>>('GET', path, {\n query,\n ...options,\n });\n\n const next = response.next_cursor ?? null;\n if (!next) {\n exhausted = true;\n } else {\n cursor = next;\n }\n\n return response;\n }\n\n // Per-item async iterator — drains pages internally and yields each item.\n // `for await` over the pager itself ends up here.\n async function* itemIterator(): AsyncGenerator<T, void, undefined> {\n while (true) {\n const page = await fetchPage();\n if (!page) return;\n for (const item of page.data) {\n yield item;\n }\n if (exhausted) return;\n }\n }\n\n // Per-page async iterator — yields the full envelope each iteration.\n async function* pageIterator(): AsyncGenerator<CursorPaginated<T>, void, undefined> {\n while (true) {\n const page = await fetchPage();\n if (!page) return;\n yield page;\n if (exhausted) return;\n }\n }\n\n const iter = itemIterator();\n\n const pager: AsyncPager<T> = {\n async next(): Promise<IteratorResult<T>> {\n return iter.next();\n },\n async return(value?: T): Promise<IteratorResult<T>> {\n // Drop any further pagination — caller is bailing early.\n exhausted = true;\n return { value: value as T, done: true };\n },\n async throw(err?: unknown): Promise<IteratorResult<T>> {\n exhausted = true;\n throw err;\n },\n [Symbol.asyncIterator](): AsyncIterableIterator<T> {\n return pager;\n },\n async toArray(): Promise<T[]> {\n const out: T[] = [];\n for await (const item of pager) {\n out.push(item);\n }\n return out;\n },\n pages(): AsyncIterableIterator<CursorPaginated<T>> {\n return pageIterator();\n },\n };\n\n return pager;\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { AsyncPager } from '../pagination.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Resource facade for `/api/borrowers`. Includes both the standard CRUD\n * verbs and the borrower-specific flows that don't fit `update()` —\n * `claim()` (PII-claim flow, SOC 2 / GLBA) and `grantAudit()` (audit\n * delegation).\n */\nexport class BorrowersResource {\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * Retrieve a borrower by id.\n *\n * GET /api/borrowers/{id}\n */\n async retrieve<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}`,\n options,\n );\n }\n\n /**\n * Create a new borrower.\n *\n * POST /api/borrowers\n */\n async create<T = unknown>(params: Record<string, unknown>, options?: RequestOptions): Promise<T> {\n return this.client.request<T>('POST', '/api/borrowers', { body: params, ...options });\n }\n\n /**\n * Iterate every borrower visible to the calling principal.\n *\n * GET /api/borrowers\n */\n list<T = unknown>(\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n '/api/borrowers',\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Assign a lender to this borrower.\n *\n * POST /api/borrowers/{id}/assign\n */\n async assign<T = unknown>(\n borrowerId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/assign`,\n { body: params, ...options },\n );\n }\n\n /**\n * Claim PII access on a borrower. Required by SOC 2 / GLBA before an\n * admin can view the borrower's extracted financials. Surfaced as a verb\n * method (rather than `update()`) because the audit log records this as\n * a distinct event and integrators reading the SDK want to see the flow\n * by name.\n *\n * POST /api/borrowers/{id}/claim\n */\n async claim<T = unknown>(\n borrowerId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/claim`,\n { body: params, ...options },\n );\n }\n\n /**\n * Fetch the audit log for a borrower (PII access events, claim grants,\n * etc.).\n *\n * GET /api/borrowers/{id}/audit-log\n */\n async auditLog<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/audit-log`,\n options,\n );\n }\n\n /**\n * List loans associated with a borrower.\n *\n * GET /api/borrowers/{borrowerId}/loans\n */\n loans<T = unknown>(\n borrowerId: string,\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n `/api/borrowers/${encodeURIComponent(borrowerId)}/loans`,\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * List jobs (document packages) for a borrower.\n *\n * GET /api/borrowers/{id}/jobs\n */\n jobs<T = unknown>(\n borrowerId: string,\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n `/api/borrowers/${encodeURIComponent(borrowerId)}/jobs`,\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Fetch results for a specific job under a borrower.\n *\n * GET /api/borrowers/{id}/jobs/{jobId}/results\n */\n async jobResults<T = unknown>(\n borrowerId: string,\n jobId: string,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/jobs/${encodeURIComponent(jobId)}/results`,\n options,\n );\n }\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Resource facade for the document upload pipeline. Documents flow:\n *\n * 1. `presignedUrl()` to get a signed S3 PUT URL\n * 2. The integrator's backend uploads bytes directly to S3\n * 3. `confirmUpload()` to kick off the extraction pipeline\n * 4. Webhook `extraction.ready` fires when results are queryable\n *\n * No `update()` — once uploaded, document content is immutable; metadata\n * lives on the parent borrower / loan / job.\n */\nexport class DocumentsResource {\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * Request a presigned S3 PUT URL for a single document upload.\n *\n * POST /api/documents/presigned-url\n */\n async presignedUrl<T = unknown>(\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>('POST', '/api/documents/presigned-url', {\n body: params,\n ...options,\n });\n }\n\n /**\n * Confirm a single uploaded document, kicking off the extraction\n * pipeline.\n *\n * POST /api/documents/{jobId}/confirm-upload\n */\n async confirmUpload<T = unknown>(\n jobId: string,\n params: Record<string, unknown> = {},\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/documents/${encodeURIComponent(jobId)}/confirm-upload`,\n { body: params, ...options },\n );\n }\n\n /**\n * Confirm a batch of uploaded documents in a single request. Faster than\n * looping `confirmUpload()` when the integrator has many files in one\n * package.\n *\n * POST /api/documents/confirm-uploads\n */\n async batchConfirm<T = unknown>(\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>('POST', '/api/documents/confirm-uploads', {\n body: params,\n ...options,\n });\n }\n\n /**\n * Get a presigned S3 GET URL to download a previously-uploaded document.\n *\n * GET /api/documents/{jobId}/download-url\n */\n async downloadUrl<T = unknown>(jobId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/documents/${encodeURIComponent(jobId)}/download-url`,\n options,\n );\n }\n\n /**\n * Fetch processing status for a document upload.\n *\n * GET /api/documents/{jobId}/status\n */\n async status<T = unknown>(jobId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/documents/${encodeURIComponent(jobId)}/status`,\n options,\n );\n }\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Resource facade for embed sessions — short-lived tokens scoped to a\n * single loan. Mint server-side via the integrator's API key, then pass\n * the resulting `embed_token` to the browser to bootstrap the SpreadSpace\n * review widget.\n *\n * Sub-namespace structure (`embed.sessions.create(...)`) mirrors the route\n * shape (`/api/embed/sessions`) and leaves room for future embed\n * resources without crowding the top-level `embed` object.\n */\nexport class EmbedSessionsResource {\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * Mint an embed-session token for a loan. The minted token has a strict\n * subset of the calling API key's scopes and is locked to the supplied\n * `loan_id` — it cannot be used to access other loans or to mint further\n * tokens.\n *\n * POST /api/embed/sessions\n *\n * Body: { loan_id, scopes?, expires_in_seconds? }\n * Returns: { embed_token, expires_at, ... }\n */\n async create<T = unknown>(params: Record<string, unknown>, options?: RequestOptions): Promise<T> {\n return this.client.request<T>('POST', '/api/embed/sessions', { body: params, ...options });\n }\n\n /**\n * Revoke an embed session early — useful when the integrator's UI flow\n * ends before the natural expiry, or when reissuing after a logout.\n *\n * DELETE /api/embed/sessions/{sessionId}\n */\n async revoke<T = unknown>(sessionId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'DELETE',\n `/api/embed/sessions/${encodeURIComponent(sessionId)}`,\n options,\n );\n }\n}\n\n/**\n * Top-level `client.embed` namespace. Currently surfaces only the\n * `sessions` sub-resource; future phases (e.g. embed-only audit logs)\n * land here.\n */\nexport class EmbedResource {\n public readonly sessions: EmbedSessionsResource;\n\n constructor(client: SpreadSpaceClient) {\n this.sessions = new EmbedSessionsResource(client);\n }\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { AsyncPager } from '../pagination.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Resource facade for extracted document data. Extractions are scoped under\n * a borrower (the canonical PII boundary) — every endpoint takes a\n * `borrowerId` path segment so the multi-tenant access checks have an\n * unambiguous scope.\n *\n * Per-document-type endpoints (`balanceSheet`, `pl`, etc.) return\n * roll-ups across all documents of that type uploaded for the borrower.\n * The generic `query()` is the structured-search endpoint —\n * integrators that build their own UIs on top of the extraction data\n * typically want this one.\n *\n * `move()` reassigns a document's loan binding — shipped as a verb method\n * (not `update()`) because it traverses the loan-membership tables, not\n * the extraction row.\n */\nexport class ExtractionsResource {\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * Iterate every extraction for a borrower.\n *\n * GET /api/borrowers/{borrowerId}/extractions\n */\n list<T = unknown>(\n borrowerId: string,\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions`,\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Structured query across a borrower's extractions. Filter by document\n * type, period, and other metadata.\n *\n * POST /api/borrowers/{borrowerId}/extractions/query\n */\n async query<T = unknown>(\n borrowerId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/query`,\n { body: params, ...options },\n );\n }\n\n /**\n * Move an extracted document to a different loan under the same\n * borrower. Use when the user uploaded a doc to the wrong package.\n *\n * POST /api/borrowers/{borrowerId}/extractions/{docId}/move\n */\n async move<T = unknown>(\n borrowerId: string,\n docId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/${encodeURIComponent(docId)}/move`,\n { body: params, ...options },\n );\n }\n\n /**\n * Roll-up of the borrower's bank-statement analyses across all\n * uploaded statements.\n *\n * GET /api/borrowers/{borrowerId}/extractions/bank-statement-analysis\n */\n async bankStatementAnalysis<T = unknown>(\n borrowerId: string,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/bank-statement-analysis`,\n options,\n );\n }\n\n /**\n * Roll-up of the borrower's balance sheet across all uploaded\n * balance-sheet documents.\n */\n async balanceSheet<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/balance-sheet`,\n options,\n );\n }\n\n /** P&L roll-up across uploaded P&L documents. */\n async pl<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/pl`,\n options,\n );\n }\n\n /** Cash-flow roll-up. */\n async cashFlow<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/cash-flow`,\n options,\n );\n }\n\n /** Accounts payable roll-up. */\n async accountsPayable<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/accounts-payable`,\n options,\n );\n }\n\n /** Accounts receivable roll-up. */\n async accountsReceivable<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/accounts-receivable`,\n options,\n );\n }\n\n /**\n * Generic report endpoint — pass the report type as a path segment.\n * Useful for report types added after this SDK release.\n *\n * GET /api/borrowers/{borrowerId}/extractions/reports/{reportType}\n */\n async report<T = unknown>(\n borrowerId: string,\n reportType: string,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/reports/${encodeURIComponent(reportType)}`,\n options,\n );\n }\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { AsyncPager } from '../pagination.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Resource facade for `/api/jobs`. A \"job\" is a document package — a\n * batch of files uploaded together. Read-only from this surface; jobs\n * are created implicitly by the upload pipeline.\n */\nexport class JobsResource {\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * Iterate jobs visible to the calling principal.\n *\n * GET /api/jobs\n */\n list<T = unknown>(\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n '/api/jobs',\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Fetch processing status for a job.\n *\n * GET /api/jobs/{jobId}/status\n */\n async status<T = unknown>(jobId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/jobs/${encodeURIComponent(jobId)}/status`,\n options,\n );\n }\n\n /**\n * Fetch results for a job — the rolled-up extraction outcomes.\n *\n * GET /api/jobs/{jobId}/results\n */\n async results<T = unknown>(jobId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/jobs/${encodeURIComponent(jobId)}/results`,\n options,\n );\n }\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { AsyncPager } from '../pagination.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Resource facade for `/api/loans`. Loans are the top-level package unit —\n * a borrower has many loans, each loan is the scope of a documents bundle.\n */\nexport class LoansResource {\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * Retrieve a loan by id.\n *\n * GET /api/loans/{loanId}\n */\n async retrieve<T = unknown>(loanId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>('GET', `/api/loans/${encodeURIComponent(loanId)}`, options);\n }\n\n /**\n * Create a new loan.\n *\n * POST /api/loans\n */\n async create<T = unknown>(params: Record<string, unknown>, options?: RequestOptions): Promise<T> {\n return this.client.request<T>('POST', '/api/loans', { body: params, ...options });\n }\n\n /**\n * Update an existing loan.\n *\n * PATCH /api/loans/{loanId}\n */\n async update<T = unknown>(\n loanId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>('PATCH', `/api/loans/${encodeURIComponent(loanId)}`, {\n body: params,\n ...options,\n });\n }\n\n /**\n * Iterate every loan visible to the calling principal. Returns an\n * `AsyncPager<T>` — consume with `for await`, `.toArray()`, or\n * `.pages()`.\n *\n * GET /api/loans\n */\n list<T = unknown>(\n params?: { limit?: number; cursor?: string; borrower_id?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n '/api/loans',\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Assign a lender to this loan. Calls `POST /api/loans/{id}/assign`.\n * Surfaced as a verb method rather than forcing it through `update()`\n * because the assignment flow is semantically distinct from a generic\n * field patch (it touches the lender-access table, not the loan row).\n */\n async assign<T = unknown>(\n loanId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>('POST', `/api/loans/${encodeURIComponent(loanId)}/assign`, {\n body: params,\n ...options,\n });\n }\n\n /**\n * Fetch the audit log for a loan.\n *\n * GET /api/loans/{loanId}/audit-log\n */\n async auditLog<T = unknown>(loanId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/loans/${encodeURIComponent(loanId)}/audit-log`,\n options,\n );\n }\n}\n","import { createHmac, timingSafeEqual } from 'node:crypto';\n\nimport type { VerifyAndParseResult, WebhookEvent } from './types.js';\n\n/**\n * Webhook signature verifier — byte-for-byte compatible with\n * `api/src/Webhooks/WebhookSigner.cs` on the API side.\n *\n * Wire format (mirrors Stripe's `Stripe-Signature`):\n *\n * SpreadSpace-Signature: t=<unix_seconds>,v1=<hex_hmac_sha256(secret, \"{t}.{body}\")>\n *\n * The verifier:\n * 1. Parses `t=...` and `v1=...` tokens (tolerant of additional unrecognized\n * pairs to stay forward-compatible with future schemes).\n * 2. Recomputes HMAC-SHA256 over `\"{timestamp}.{rawBody}\"` with the secret.\n * 3. Compares with `crypto.timingSafeEqual` on raw bytes (never on hex\n * strings — string `===` short-circuits and leaks prefix info via timing).\n * 4. Two-sided freshness check: rejects timestamps too far in the past\n * (replay protection) AND too far in the future (attacker-controlled\n * timestamps that would extend the replay window).\n *\n * Verification order matches the C# side: HMAC first, then freshness. That\n * way a forged-but-fresh request and a real-but-stale request fail\n * indistinguishably from the timing perspective.\n */\n\n/** Default freshness tolerance — matches `WebhookSignatureFormat.DefaultFreshnessTolerance`. */\nconst DEFAULT_FRESHNESS_TOLERANCE_SECONDS = 5 * 60;\n\n/** Wire constant for the v1 HMAC-SHA256 scheme. */\nconst VERSION_1_PREFIX = 'v1';\n\nexport interface VerifyOptions {\n /**\n * Maximum age (and maximum future skew) of the timestamp before the\n * signature is rejected as stale. Symmetric — `Math.abs(now - t)` must be\n * ≤ this value.\n *\n * Default: 300 seconds (5 minutes).\n */\n freshnessTolerance?: number;\n\n /**\n * Override the \"current time\" used for the freshness check. Useful in\n * tests; otherwise leave undefined and the verifier reads\n * `Date.now() / 1000`.\n */\n currentTimestamp?: number;\n}\n\n/**\n * Verify a `SpreadSpace-Signature` header against a body and signing\n * secret. Throws on any failure (invalid format, bad HMAC, stale timestamp,\n * wrong secret); returns `true` on success.\n *\n * @param rawBody The exact request body received on the wire — bytes, not\n * re-serialized JSON. Any byte-level transformation between receipt and\n * verification (re-stringification, gzip decode, encoding change) will\n * invalidate the signature.\n * @param signature Contents of the `SpreadSpace-Signature` HTTP header.\n * @param secret The plaintext signing secret (`whsec_...`) issued at\n * webhook endpoint creation. Never log this.\n * @param options Optional overrides — freshness window and clock injection.\n */\nexport function verifyWebhookSignature(\n rawBody: string | Buffer | Uint8Array,\n signature: string,\n secret: string,\n options?: VerifyOptions,\n): true {\n if (typeof signature !== 'string' || signature.length === 0) {\n throw new WebhookSignatureError('SpreadSpace-Signature header is missing or empty.');\n }\n if (typeof secret !== 'string' || secret.length === 0) {\n throw new WebhookSignatureError('Webhook signing secret is missing or empty.');\n }\n if (rawBody === null || rawBody === undefined) {\n throw new WebhookSignatureError('Webhook raw body is missing.');\n }\n\n const parsed = parseSignatureHeader(signature);\n if (!parsed) {\n throw new WebhookSignatureError('Webhook signature header is malformed.');\n }\n const { timestamp, hex } = parsed;\n\n // HMAC FIRST. We never want to leak (via differential timing or distinct\n // error message text) whether a request was a forged signature vs. a real\n // one that aged out — both should be indistinguishable failures.\n const bodyString = bodyToString(rawBody);\n const expectedHex = computeHmacHex(secret, `${timestamp}.${bodyString}`);\n\n if (!hexEquals(expectedHex, hex)) {\n throw new WebhookSignatureError('Webhook signature does not match.');\n }\n\n // Then freshness. Two-sided check: too old OR too far in the future.\n const tolerance = options?.freshnessTolerance ?? DEFAULT_FRESHNESS_TOLERANCE_SECONDS;\n const now = options?.currentTimestamp ?? Math.floor(Date.now() / 1000);\n const age = now - timestamp;\n if (age > tolerance || age < -tolerance) {\n throw new WebhookSignatureError(\n `Webhook timestamp is outside the freshness window of ${tolerance}s.`,\n );\n }\n\n return true;\n}\n\n/**\n * Verify a webhook signature and JSON-parse the body into a typed\n * `WebhookEvent` envelope. Throws on signature failure or invalid JSON.\n *\n * The returned value is a discriminated union over `type` — switch on\n * `event.type` to narrow `event.data` to the matching payload.\n */\nexport function verifyAndParseWebhook(\n rawBody: string | Buffer | Uint8Array,\n signature: string,\n secret: string,\n options?: VerifyOptions,\n): VerifyAndParseResult {\n verifyWebhookSignature(rawBody, signature, secret, options);\n\n const bodyString = bodyToString(rawBody);\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(bodyString);\n } catch (cause) {\n throw new WebhookSignatureError('Webhook body is not valid JSON.', cause);\n }\n\n if (!isPlainObject(parsed)) {\n throw new WebhookSignatureError('Webhook body is not a JSON object.');\n }\n const candidate = parsed as Partial<WebhookEvent>;\n if (typeof candidate.type !== 'string' || candidate.type.length === 0) {\n throw new WebhookSignatureError('Webhook body is missing a `type` field.');\n }\n if (typeof candidate.id !== 'string' || candidate.id.length === 0) {\n throw new WebhookSignatureError('Webhook body is missing an `id` field.');\n }\n if (typeof candidate.created !== 'number') {\n throw new WebhookSignatureError('Webhook body is missing a numeric `created` field.');\n }\n if (typeof candidate.tenant_id !== 'string' || candidate.tenant_id.length === 0) {\n throw new WebhookSignatureError('Webhook body is missing a `tenant_id` field.');\n }\n if (!isPlainObject(candidate.data)) {\n throw new WebhookSignatureError('Webhook body is missing a `data` object.');\n }\n\n return parsed as VerifyAndParseResult;\n}\n\n/**\n * Thrown when a webhook signature fails verification or the envelope is\n * structurally malformed. Distinct from `SpreadSpaceError` because webhook\n * verification is a self-contained primitive — verifiers don't need the\n * full request/response error machinery, just a single failure type they\n * can reject against.\n */\nexport class WebhookSignatureError extends Error {\n public readonly cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = 'WebhookSignatureError';\n this.cause = cause;\n Object.setPrototypeOf(this, WebhookSignatureError.prototype);\n }\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Internals\n// ────────────────────────────────────────────────────────────────────────────\n\ninterface ParsedSignature {\n timestamp: number;\n hex: string;\n}\n\n/**\n * Parse a header in the form `t=<long>,v1=<hex>`. Tolerant of whitespace\n * between segments and of additional unrecognized pairs (e.g. a future\n * `v2=...`) — those are silently ignored, not treated as parse errors, so\n * this verifier remains forward-compatible with new schemes.\n */\nfunction parseSignatureHeader(header: string): ParsedSignature | null {\n const segments = header.split(',').filter((s) => s.length > 0);\n if (segments.length < 2) return null;\n\n let parsedTs: number | null = null;\n let parsedV1: string | null = null;\n\n for (const raw of segments) {\n const segment = raw.trim();\n const eq = segment.indexOf('=');\n if (eq <= 0 || eq === segment.length - 1) {\n // Missing key, missing value, or `=` at the very end (`v1=`).\n return null;\n }\n\n const key = segment.slice(0, eq).trim();\n const value = segment.slice(eq + 1).trim();\n\n if (key === 't') {\n if (parsedTs !== null) return null; // Duplicate `t=`.\n // Strict integer parse — reject `1.5`, `1e3`, leading `+`, etc. The C#\n // verifier uses `long.TryParse(NumberStyles.Integer, Invariant)`,\n // which accepts an optional leading `-` and digits only. We mirror that.\n if (!/^-?\\d+$/.test(value)) return null;\n const ts = Number(value);\n if (!Number.isFinite(ts) || !Number.isInteger(ts)) return null;\n parsedTs = ts;\n } else if (key === VERSION_1_PREFIX) {\n if (parsedV1 !== null) return null; // Duplicate `v1=`.\n if (value.length === 0) return null;\n parsedV1 = value;\n }\n // Any other key — silently ignored for forward compatibility.\n }\n\n if (parsedTs === null || parsedV1 === null) return null;\n return { timestamp: parsedTs, hex: parsedV1 };\n}\n\n/**\n * Compute lowercase hex HMAC-SHA256 digest. Matches the C# side's\n * `Convert.ToHexStringLower(hmac.ComputeHash(...))` exactly.\n */\nfunction computeHmacHex(secret: string, signedPayload: string): string {\n const hmac = createHmac('sha256', Buffer.from(secret, 'utf-8'));\n hmac.update(Buffer.from(signedPayload, 'utf-8'));\n return hmac.digest('hex'); // Node default is lowercase.\n}\n\n/**\n * Constant-time compare of two hex strings. We decode both sides to bytes\n * before calling `timingSafeEqual` — it requires equal-length inputs and\n * we want a length mismatch to fail fast (length is not timing-sensitive\n * since both ends know SHA-256 emits 64 hex chars).\n */\nfunction hexEquals(expectedHex: string, providedHex: string): boolean {\n if (expectedHex.length !== providedHex.length) return false;\n\n let expectedBytes: Buffer;\n let providedBytes: Buffer;\n try {\n expectedBytes = Buffer.from(expectedHex, 'hex');\n providedBytes = Buffer.from(providedHex, 'hex');\n } catch {\n return false;\n }\n\n // `Buffer.from(..., 'hex')` silently stops at the first non-hex character,\n // producing a shorter buffer — guard explicitly against that to avoid a\n // false equality when the provided hex has invalid characters that happen\n // to truncate to an empty buffer the receiver also produced.\n if (expectedBytes.length !== providedBytes.length) return false;\n if (expectedBytes.length * 2 !== expectedHex.length) return false;\n if (providedBytes.length * 2 !== providedHex.length) return false;\n\n return timingSafeEqual(\n new Uint8Array(expectedBytes.buffer, expectedBytes.byteOffset, expectedBytes.byteLength),\n new Uint8Array(providedBytes.buffer, providedBytes.byteOffset, providedBytes.byteLength),\n );\n}\n\nfunction bodyToString(body: string | Buffer | Uint8Array): string {\n if (typeof body === 'string') return body;\n if (Buffer.isBuffer(body)) return body.toString('utf-8');\n return Buffer.from(body).toString('utf-8');\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { AsyncPager } from '../pagination.js';\nimport type { RequestOptions } from '../types.js';\nimport {\n verifyAndParseWebhook as verifyAndParseWebhookFn,\n verifyWebhookSignature as verifyWebhookSignatureFn,\n} from '../webhook-signature.js';\n\n/**\n * Resource facade for webhook endpoints (`/api/webhooks/*`) plus the\n * webhook signature helpers as static methods for discoverability.\n *\n * The verification helpers are also exported as bare functions from\n * `@spreadspace/embed/webhooks` for tree-shakeable import paths in\n * webhook receiver Lambdas (where `SpreadSpaceClient` would otherwise pull\n * in the entire resource layer).\n */\nexport class WebhooksResource {\n /**\n * Verify a `SpreadSpace-Signature` header against a body and signing\n * secret. Throws `WebhookSignatureError` on any failure.\n */\n public static readonly verifySignature = verifyWebhookSignatureFn;\n\n /**\n * Verify a webhook signature and JSON-parse the body into a typed\n * `WebhookEvent`. Throws `WebhookSignatureError` on signature failure or\n * invalid JSON.\n */\n public static readonly verifyAndParse = verifyAndParseWebhookFn;\n\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * List configured webhook endpoints for this organization.\n *\n * GET /api/webhooks\n */\n list<T = unknown>(\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n '/api/webhooks',\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Retrieve a single webhook endpoint.\n *\n * GET /api/webhooks/{id}\n */\n async retrieve<T = unknown>(endpointId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/webhooks/${encodeURIComponent(endpointId)}`,\n options,\n );\n }\n\n /**\n * Create a new webhook endpoint. The response carries the plaintext\n * signing secret exactly once — store it server-side, do not log it.\n *\n * POST /api/webhooks\n */\n async create<T = unknown>(params: Record<string, unknown>, options?: RequestOptions): Promise<T> {\n return this.client.request<T>('POST', '/api/webhooks', { body: params, ...options });\n }\n\n /**\n * Update endpoint metadata (URL, subscribed event types, enabled flag).\n *\n * PATCH /api/webhooks/{id}\n */\n async update<T = unknown>(\n endpointId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'PATCH',\n `/api/webhooks/${encodeURIComponent(endpointId)}`,\n { body: params, ...options },\n );\n }\n\n /**\n * Delete a webhook endpoint.\n *\n * DELETE /api/webhooks/{id}\n */\n async delete<T = unknown>(endpointId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'DELETE',\n `/api/webhooks/${encodeURIComponent(endpointId)}`,\n options,\n );\n }\n\n /**\n * Rotate an endpoint's signing secret. The old secret remains valid for\n * a grace window so deliveries in flight aren't dropped. Returns the new\n * plaintext secret exactly once.\n *\n * POST /api/webhooks/{id}/rotate\n */\n async rotateSecret<T = unknown>(\n endpointId: string,\n params: Record<string, unknown> = {},\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/webhooks/${encodeURIComponent(endpointId)}/rotate`,\n { body: params, ...options },\n );\n }\n\n /**\n * Iterate delivery attempts for an endpoint.\n *\n * GET /api/webhooks/{id}/deliveries\n */\n deliveries<T = unknown>(\n endpointId: string,\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n `/api/webhooks/${encodeURIComponent(endpointId)}/deliveries`,\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Manually replay a delivery (e.g. after fixing a downstream outage).\n *\n * POST /api/webhooks/{id}/deliveries/{deliveryId}/replay\n */\n async replayDelivery<T = unknown>(\n endpointId: string,\n deliveryId: string,\n params: Record<string, unknown> = {},\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/webhooks/${encodeURIComponent(endpointId)}/deliveries/${encodeURIComponent(deliveryId)}/replay`,\n { body: params, ...options },\n );\n }\n}\n","/**\n * The SDK package version. Sent on every outbound request as part of the\n * `User-Agent` string so server-side telemetry can pick up which SDK release\n * a customer is running.\n *\n * Hand-rolled rather than imported from `package.json` because tsup output\n * doesn't include the package manifest — keeping it as a TS literal avoids a\n * runtime `fs` read from the dist bundle.\n *\n * Bump in lockstep with `package.json`.\n */\nexport const SDK_VERSION = '0.1.0';\n\n/**\n * Default API surface version pinned by this SDK release. Sent as the\n * `SpreadSpace-Version` header on every request unless the integrator\n * overrides it via `SpreadSpaceClientOptions.apiVersion`.\n *\n * Once the SDK is published, this value is the contract: the SDK guarantees\n * the request/response shapes match this dated surface. Bumping requires a\n * new SDK release that codegens against the new spec.\n */\nexport const DEFAULT_API_VERSION = '2026-05-03';\n","import { randomUUID } from 'node:crypto';\n\nimport {\n AuthenticationError,\n classifyError,\n ConflictError,\n InvalidRequestError,\n NetworkError,\n NotFoundError,\n PermissionError,\n RateLimitError,\n ServerError,\n SpreadSpaceError,\n} from './errors.js';\nimport { paginate, type AsyncPager } from './pagination.js';\nimport { BorrowersResource } from './resources/borrowers.js';\nimport { DocumentsResource } from './resources/documents.js';\nimport { EmbedResource } from './resources/embed.js';\nimport { ExtractionsResource } from './resources/extractions.js';\nimport { JobsResource } from './resources/jobs.js';\nimport { LoansResource } from './resources/loans.js';\nimport { WebhooksResource } from './resources/webhooks.js';\nimport type { RequestOptions } from './types.js';\nimport { DEFAULT_API_VERSION, SDK_VERSION } from './version.js';\n\n/**\n * Re-export the error classes for `instanceof` checks at integrator callsites\n * without needing a separate `import { ... } from '@spreadspace/embed/errors'`.\n */\nexport {\n SpreadSpaceError,\n InvalidRequestError,\n AuthenticationError,\n PermissionError,\n NotFoundError,\n ConflictError,\n RateLimitError,\n ServerError,\n NetworkError,\n};\n\nexport interface SpreadSpaceClientOptions {\n /**\n * The API key for authentication. Live keys begin with `ss_live_`, test\n * keys with `ss_test_`. Issue and manage keys from the SpreadSpace\n * dashboard.\n */\n apiKey: string;\n\n /**\n * Base URL for the API. Defaults to `https://api.spreadspace.app`.\n * Override for staging (`https://staging-api.spreadspace.app`) or for\n * local development (`http://localhost:8080`).\n */\n baseUrl?: string;\n\n /**\n * Override the SDK-pinned `SpreadSpace-Version` header. Defaults to the\n * version this SDK release was built against. Set this only when\n * intentionally targeting a different surface version than the SDK was\n * tested against.\n */\n apiVersion?: string;\n\n /**\n * Request timeout in milliseconds. Default: 30000 (30s). The timeout is\n * applied per individual HTTP attempt — retries get a fresh window each.\n */\n timeout?: number;\n\n /**\n * Maximum number of retry attempts after the initial request. Default: 3.\n * Retries trigger on:\n * - 429 Rate Limited (honors `Retry-After` if present)\n * - 5xx Server Errors\n * - Transport-level network failures\n * 4xx other than 429 do not retry.\n */\n maxRetries?: number;\n\n /**\n * Custom `fetch` implementation. Defaults to `globalThis.fetch`. Inject a\n * mock here to write hermetic tests without monkey-patching the global.\n */\n fetch?: typeof fetch;\n\n /**\n * Custom idempotency-key generator. Defaults to `crypto.randomUUID()`.\n */\n idempotencyKeyGenerator?: () => string;\n}\n\n/**\n * Internal options for the low-level `request()` method. Resource methods\n * compose these on top of the public `RequestOptions`.\n */\nexport interface InternalRequestOptions extends RequestOptions {\n /**\n * JSON-serializable request body. Encoded as `application/json` with\n * `Content-Type: application/json; charset=utf-8`.\n */\n body?: unknown;\n\n /**\n * Query parameters appended to the URL. `undefined` values are skipped.\n */\n query?: Record<string, string | number | boolean | undefined>;\n}\n\nconst DEFAULT_BASE_URL = 'https://api.spreadspace.app';\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_MAX_RETRIES = 3;\nconst RETRY_BASE_DELAY_MS = 500;\nconst RETRY_MAX_DELAY_MS = 30_000;\n\n/**\n * Top-level entry point of the SpreadSpace SDK.\n *\n * Single instance per integrator process — the resources hanging off it are\n * thin facades, not separate clients, so spinning up multiple\n * `SpreadSpaceClient`s only matters when juggling multiple API keys.\n *\n * Wire-format invariants the client guarantees on every request:\n * - `Authorization: Bearer <apiKey>`\n * - `SpreadSpace-Version: <apiVersion>`\n * - `User-Agent: spreadspace-node/<sdkVersion> node/<nodeVersion>`\n * - `Idempotency-Key: <auto-generated UUID>` on every POST/PATCH/PUT/DELETE\n * unless the caller supplies one explicitly or sets `idempotencyKey: null`\n *\n * Retries on 429, 5xx, and transport failures up to `maxRetries` times with\n * exponential backoff (capped) and jitter; honors `Retry-After`.\n */\nexport class SpreadSpaceClient {\n /** Resolved base URL (no trailing slash). */\n public readonly baseUrl: string;\n\n /** Resolved API version string (the `SpreadSpace-Version` header value). */\n public readonly apiVersion: string;\n\n /** Public so resource files can pull it for `paginate()` URL construction. */\n public readonly maxRetries: number;\n\n // ── Resources ────────────────────────────────────────────────────────────\n public readonly loans: LoansResource;\n public readonly borrowers: BorrowersResource;\n public readonly documents: DocumentsResource;\n public readonly extractions: ExtractionsResource;\n public readonly jobs: JobsResource;\n public readonly webhooks: WebhooksResource;\n public readonly embed: EmbedResource;\n\n // ── Internals ────────────────────────────────────────────────────────────\n private readonly apiKey: string;\n private readonly timeoutMs: number;\n private readonly fetchImpl: typeof fetch;\n private readonly idempotencyKeyGenerator: () => string;\n\n constructor(options: SpreadSpaceClientOptions) {\n if (!options || typeof options.apiKey !== 'string' || options.apiKey.length === 0) {\n throw new TypeError(\n 'SpreadSpaceClient requires an apiKey. Issue one from the dashboard at /settings/api-keys.',\n );\n }\n\n this.apiKey = options.apiKey;\n let baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n while (baseUrl.endsWith('/')) baseUrl = baseUrl.slice(0, -1);\n this.baseUrl = baseUrl;\n this.apiVersion = options.apiVersion ?? DEFAULT_API_VERSION;\n this.timeoutMs = options.timeout ?? DEFAULT_TIMEOUT_MS;\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.fetchImpl = options.fetch ?? globalThis.fetch;\n this.idempotencyKeyGenerator = options.idempotencyKeyGenerator ?? randomUUID;\n\n if (typeof this.fetchImpl !== 'function') {\n throw new TypeError(\n 'SpreadSpaceClient requires a fetch implementation. Node 18+ provides one globally; pass a polyfill via options.fetch otherwise.',\n );\n }\n\n this.loans = new LoansResource(this);\n this.borrowers = new BorrowersResource(this);\n this.documents = new DocumentsResource(this);\n this.extractions = new ExtractionsResource(this);\n this.jobs = new JobsResource(this);\n this.webhooks = new WebhooksResource(this);\n this.embed = new EmbedResource(this);\n }\n\n /**\n * Low-level request method. Resource layer wraps this with ergonomic\n * method names; integrators can call it directly to hit endpoints not yet\n * surfaced via a typed resource.\n *\n * Returns the parsed JSON body. For 204 No Content responses (currently\n * none in the API but reserved), returns `undefined as T`.\n */\n public async request<T>(\n method: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE',\n path: string,\n options: InternalRequestOptions = {},\n ): Promise<T> {\n const url = this.buildUrl(path, options.query);\n const headers = this.buildHeaders(method, options);\n const body = options.body !== undefined ? JSON.stringify(options.body) : undefined;\n const maxRetries = options.maxRetries ?? this.maxRetries;\n\n let attempt = 0;\n let lastError: unknown;\n\n while (attempt <= maxRetries) {\n // Per-attempt timeout. We compose it with any caller-provided\n // `signal` so abort-from-outside still works.\n const controller = new AbortController();\n const timeoutHandle = setTimeout(() => controller.abort(), this.timeoutMs);\n const signal = options.signal\n ? composeAbortSignals(controller.signal, options.signal)\n : controller.signal;\n\n let response: Response;\n try {\n response = await this.fetchImpl(url, {\n method,\n headers,\n body,\n signal,\n });\n } catch (err) {\n clearTimeout(timeoutHandle);\n lastError = err;\n // Transport-layer failures are retryable on the same backoff curve\n // as 5xx — DNS hiccups, TLS handshake failures, intermittent\n // upstream resets are exactly what retries are designed to cover.\n if (attempt < maxRetries) {\n await sleep(this.computeRetryDelay(attempt, undefined));\n attempt += 1;\n continue;\n }\n throw new NetworkError(\n `SpreadSpace request to ${method} ${url} failed: ${describeError(err)}`,\n err,\n );\n }\n\n clearTimeout(timeoutHandle);\n\n const requestId = response.headers.get('X-Request-ID') ?? undefined;\n\n // Successful response — parse body and return.\n if (response.ok) {\n return await this.parseSuccessBody<T>(response);\n }\n\n // Decide retry vs. throw based on status.\n const status = response.status;\n const retryable = status === 429 || (status >= 500 && status <= 599);\n\n if (retryable && attempt < maxRetries) {\n const retryAfterSec = parseRetryAfter(response.headers.get('Retry-After'));\n await sleep(this.computeRetryDelay(attempt, retryAfterSec));\n attempt += 1;\n // Drain the body so the connection can be reused — we don't care\n // about its content on a retryable failure.\n try {\n await response.body?.cancel();\n } catch {\n /* ignore */\n }\n continue;\n }\n\n // Non-retryable, or out of attempts — convert to typed exception.\n throw await this.buildErrorFromResponse(response, requestId);\n }\n\n // Should be unreachable — the loop either returns, throws, or continues.\n throw new NetworkError(\n `SpreadSpace request to ${method} ${url} exhausted retries (last error: ${describeError(lastError)}).`,\n lastError,\n );\n }\n\n /**\n * Convenience wrapper around `paginate()` for resource list methods. Lets\n * each resource simply do `return this.client.paginate(...)` rather than\n * importing the helper directly.\n */\n public paginate<T>(\n path: string,\n params?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions,\n ): AsyncPager<T> {\n return paginate<T>(this, path, params, options);\n }\n\n // ────────────────────────────────────────────────────────────────────────\n // Internals\n // ────────────────────────────────────────────────────────────────────────\n\n private buildUrl(\n path: string,\n query?: Record<string, string | number | boolean | undefined>,\n ): string {\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n const url = new URL(this.baseUrl + normalizedPath);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined) continue;\n url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n }\n\n private buildHeaders(\n method: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE',\n options: InternalRequestOptions,\n ): Headers {\n const headers = new Headers();\n headers.set('Authorization', `Bearer ${this.apiKey}`);\n headers.set('SpreadSpace-Version', options.apiVersion ?? this.apiVersion);\n headers.set('Accept', 'application/json');\n headers.set('User-Agent', this.buildUserAgent());\n\n if (options.body !== undefined) {\n headers.set('Content-Type', 'application/json; charset=utf-8');\n }\n\n // Idempotency-Key on every non-GET unless explicitly suppressed via\n // `idempotencyKey: null` or already provided in options.\n if (method !== 'GET') {\n const explicit = options.idempotencyKey;\n if (explicit === null) {\n // Caller opted out — no header.\n } else if (typeof explicit === 'string' && explicit.length > 0) {\n headers.set('Idempotency-Key', explicit);\n } else {\n headers.set('Idempotency-Key', this.idempotencyKeyGenerator());\n }\n }\n\n return headers;\n }\n\n private buildUserAgent(): string {\n const nodeVersion = typeof process !== 'undefined' ? process.version : 'unknown';\n return `spreadspace-node/${SDK_VERSION} node/${nodeVersion}`;\n }\n\n /**\n * Compute the next retry delay. Exponential backoff with full jitter,\n * floored by `Retry-After` if the server provided one (we never retry\n * faster than the server asked us to).\n *\n * base = min(maxDelay, baseDelay * 2^attempt)\n * delay = random(0, base)\n *\n * Full jitter (vs. equal jitter) is the AWS-recommended default — it\n * minimizes thundering-herd across many concurrent retrying clients.\n */\n private computeRetryDelay(attempt: number, retryAfterSec: number | undefined): number {\n const expBackoff = Math.min(RETRY_MAX_DELAY_MS, RETRY_BASE_DELAY_MS * 2 ** attempt);\n const jittered = Math.floor(Math.random() * expBackoff);\n\n if (retryAfterSec !== undefined && retryAfterSec > 0) {\n const retryAfterMs = retryAfterSec * 1000;\n return Math.max(jittered, retryAfterMs);\n }\n return jittered;\n }\n\n private async parseSuccessBody<T>(response: Response): Promise<T> {\n if (response.status === 204) {\n return undefined as T;\n }\n const text = await response.text();\n if (text.length === 0) {\n return undefined as T;\n }\n try {\n return JSON.parse(text) as T;\n } catch (err) {\n throw new NetworkError(\n `Failed to parse SpreadSpace response as JSON (status=${response.status}): ${describeError(err)}`,\n err,\n );\n }\n }\n\n private async buildErrorFromResponse(\n response: Response,\n requestId: string | undefined,\n ): Promise<SpreadSpaceError> {\n const status = response.status;\n let rawBody: unknown;\n let type = 'unknown';\n let message = `SpreadSpace API request failed with status ${status}.`;\n let details: Record<string, string> | undefined;\n let resolvedRequestId = requestId;\n\n try {\n const text = await response.text();\n if (text.length > 0) {\n try {\n const parsed = JSON.parse(text) as unknown;\n rawBody = parsed;\n if (\n typeof parsed === 'object' &&\n parsed !== null &&\n 'error' in parsed &&\n typeof (parsed as { error: unknown }).error === 'object' &&\n (parsed as { error: object }).error !== null\n ) {\n const errBody = (parsed as { error: Record<string, unknown> }).error;\n if (typeof errBody.type === 'string') type = errBody.type;\n if (typeof errBody.message === 'string') message = errBody.message;\n if (\n errBody.details &&\n typeof errBody.details === 'object' &&\n !Array.isArray(errBody.details)\n ) {\n details = errBody.details as Record<string, string>;\n }\n // Body's request_id is the authoritative source from the\n // ApiErrorResponse envelope. Prefer the X-Request-ID header\n // when both are set (they will be in production), fall through\n // to body when the header is absent (test mocks, proxies that\n // strip headers, etc.).\n if (resolvedRequestId === undefined && typeof errBody.request_id === 'string') {\n resolvedRequestId = errBody.request_id;\n }\n }\n } catch {\n rawBody = text;\n }\n }\n } catch {\n // Body read failure — keep the generic message.\n }\n\n const ErrorClass = classifyError(status, type);\n const ctorParams = {\n type,\n message,\n statusCode: status,\n requestId: resolvedRequestId,\n rawBody,\n details,\n };\n\n return new ErrorClass(ctorParams);\n }\n}\n\n// ──────────────────────────────────────────────────────────────────────────────\n// Helpers — kept module-private; not exported.\n// ──────────────────────────────────────────────────────────────────────────────\n\nfunction sleep(ms: number): Promise<void> {\n if (ms <= 0) return Promise.resolve();\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Parse `Retry-After`. Spec allows either delta-seconds or HTTP-date; we\n * accept both. Returns `undefined` if the header is missing or unparseable.\n */\nfunction parseRetryAfter(value: string | null): number | undefined {\n if (value === null || value.length === 0) return undefined;\n const asInt = Number(value);\n if (Number.isFinite(asInt) && Number.isInteger(asInt) && asInt >= 0) {\n return asInt;\n }\n const asDate = Date.parse(value);\n if (!Number.isNaN(asDate)) {\n const deltaMs = asDate - Date.now();\n if (deltaMs > 0) return Math.ceil(deltaMs / 1000);\n }\n return undefined;\n}\n\nfunction describeError(err: unknown): string {\n if (err instanceof Error) return err.message;\n if (typeof err === 'string') return err;\n return String(err);\n}\n\n/**\n * Compose two `AbortSignal`s — abort either one and the composed signal\n * fires. `AbortSignal.any` is in modern Node but we polyfill manually so\n * the SDK works under Node 18 which predates it.\n */\nfunction composeAbortSignals(a: AbortSignal, b: AbortSignal): AbortSignal {\n // Prefer the standard `AbortSignal.any` when available (Node 20+).\n type AbortSignalAny = (signals: AbortSignal[]) => AbortSignal;\n const maybeAny = (AbortSignal as unknown as { any?: AbortSignalAny }).any;\n if (typeof maybeAny === 'function') {\n return maybeAny([a, b]);\n }\n\n const controller = new AbortController();\n const onAbort = (source: AbortSignal): void => {\n if (controller.signal.aborted) return;\n const reason = (source as { reason?: unknown }).reason;\n controller.abort(reason);\n };\n\n if (a.aborted) {\n onAbort(a);\n } else {\n a.addEventListener('abort', () => onAbort(a), { once: true });\n }\n if (b.aborted) {\n onAbort(b);\n } else {\n b.addEventListener('abort', () => onAbort(b), { once: true });\n }\n return controller.signal;\n}\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/pagination.ts","../src/resources/borrowers.ts","../src/resources/documents.ts","../src/resources/embed.ts","../src/resources/extractions.ts","../src/resources/jobs.ts","../src/resources/loans.ts","../src/webhook-signature.ts","../src/resources/webhooks.ts","../src/version.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Public error hierarchy for the SpreadSpace SDK.\n *\n * Any non-2xx response from the API is thrown as an instance of one of the\n * subclasses below so integrators can pattern-match on the error type without\n * parsing response bodies. The shape mirrors the canonical\n * `ApiErrorResponse` envelope:\n *\n * { error: { type, message, request_id, details? } }\n *\n * `request_id` is preserved on every thrown error so customers can quote it\n * in support tickets.\n */\n\nexport interface SpreadSpaceErrorParams {\n type: string;\n message: string;\n statusCode: number;\n requestId?: string;\n rawBody?: unknown;\n details?: Record<string, string>;\n}\n\n/**\n * Base class for every error thrown by the SDK in response to a non-2xx\n * API response. Network-layer failures (DNS, TCP reset, fetch abort) are\n * surfaced as `NetworkError`.\n */\nexport class SpreadSpaceError extends Error {\n /**\n * The canonical `error.type` string from the API envelope, e.g.\n * `invalid_request`, `rate_limited`, `idempotency_request_mismatch`.\n * Stable across versions — clients pattern-match on this.\n */\n public readonly type: string;\n\n /** HTTP status code. */\n public readonly statusCode: number;\n\n /** `X-Request-ID` echoed from the server. Quote in support tickets. */\n public readonly requestId?: string;\n\n /** Raw response body for debugging. May be the parsed JSON or a string. */\n public readonly rawBody?: unknown;\n\n /** Optional structured details (e.g. `borrower_id` on `pii_claim_required`). */\n public readonly details?: Record<string, string>;\n\n constructor(params: SpreadSpaceErrorParams) {\n super(params.message);\n this.name = new.target.name;\n this.type = params.type;\n this.statusCode = params.statusCode;\n this.requestId = params.requestId;\n this.rawBody = params.rawBody;\n this.details = params.details;\n\n // Maintain the prototype chain — necessary for `instanceof` to work after\n // transpilation to ES5 (some integrator builds still target older runtimes).\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** 400 Bad Request — typically schema validation. */\nexport class InvalidRequestError extends SpreadSpaceError {}\n\n/** 401 Unauthorized — missing, expired, or invalid API key. */\nexport class AuthenticationError extends SpreadSpaceError {}\n\n/**\n * 403 Forbidden — caller is authenticated but lacks permission. Includes\n * the PII-claim-required and business-email-required cases.\n */\nexport class PermissionError extends SpreadSpaceError {}\n\n/** 404 Not Found. */\nexport class NotFoundError extends SpreadSpaceError {}\n\n/**\n * 409 Conflict — typically `idempotency_request_mismatch` (same key, different\n * body) or a domain-specific conflict (duplicate resource).\n */\nexport class ConflictError extends SpreadSpaceError {}\n\n/**\n * 429 Too Many Requests. The SDK retries automatically up to `maxRetries`,\n * honoring `Retry-After`; this error is only thrown when retries are\n * exhausted.\n */\nexport class RateLimitError extends SpreadSpaceError {}\n\n/**\n * 5xx Server Error. Retries are exhausted by the time this surfaces.\n */\nexport class ServerError extends SpreadSpaceError {}\n\n/**\n * Transport-level failure — DNS, TCP reset, fetch abort, JSON parse failure\n * on a 2xx response. Distinct from API-shaped errors so integrators can\n * decide to retry differently.\n */\nexport class NetworkError extends Error {\n public readonly cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = 'NetworkError';\n this.cause = cause;\n Object.setPrototypeOf(this, NetworkError.prototype);\n }\n}\n\n/**\n * Map an HTTP status code + canonical `error.type` to the right error class.\n *\n * The status is the primary signal (so a 500 with no body still becomes\n * `ServerError`), but the type sharpens the case at the same status — e.g.\n * a 403 `pii_claim_required` is still a `PermissionError`, but a future\n * 403 `embed_session_revoked` would also end up there without a code change.\n */\nexport function classifyError(statusCode: number, _type: string | undefined): typeof SpreadSpaceError {\n if (statusCode === 400) return InvalidRequestError;\n if (statusCode === 401) return AuthenticationError;\n if (statusCode === 403) return PermissionError;\n if (statusCode === 404) return NotFoundError;\n if (statusCode === 409) return ConflictError;\n if (statusCode === 429) return RateLimitError;\n if (statusCode >= 500) return ServerError;\n // 4xx other than the above — surface generically as InvalidRequestError.\n return InvalidRequestError;\n}\n","import type { CursorPaginated, RequestOptions } from './types.js';\n\n/**\n * Pager handed back from resource `.list()` methods. Three ways to consume:\n *\n * 1. **`for await`** — iterate every item across all pages. The most common.\n *\n * for await (const loan of client.loans.list()) { ... }\n *\n * 2. **`.toArray()`** — eagerly drain into a single array. Convenient for\n * small result sets; avoid for unbounded queries (the entire result\n * must fit in memory).\n *\n * const loans = await client.loans.list().toArray();\n *\n * 3. **`for await ... of pager.pages()`** — iterate page-at-a-time, one\n * network round-trip per loop body. Useful when the integrator wants to\n * batch-process results (e.g. write a chunk to a DB, then continue).\n *\n * for await (const page of client.loans.list().pages()) { ... }\n */\nexport interface AsyncPager<T> extends AsyncIterableIterator<T> {\n /**\n * Eagerly consume every page and return all items as a single array.\n * Throws if any underlying request fails.\n */\n toArray(): Promise<T[]>;\n\n /**\n * Page-by-page async iterator. Each yielded value is a\n * `CursorPaginated<T>` envelope — useful when you want to control\n * batch-size flow rather than per-item flow.\n */\n pages(): AsyncIterableIterator<CursorPaginated<T>>;\n}\n\n/**\n * Minimal interface the pager needs from the client. Decoupled from the\n * concrete `SpreadSpaceClient` so this module stays independently testable.\n */\nexport interface PagerClient {\n request<T>(\n method: 'GET',\n path: string,\n options?: { query?: Record<string, string | number | boolean | undefined> } & RequestOptions,\n ): Promise<T>;\n}\n\n/**\n * Build a pager that walks a cursor-paginated list endpoint.\n *\n * Pagination contract — assumed identical for every list endpoint in the\n * API:\n * - GET request, `?cursor=...` carries the opaque next-page token.\n * - Response shape: `{ data: T[], limit: number, next_cursor: string | null }`.\n * - `next_cursor === null` (or absent) means end-of-stream.\n *\n * This function is invoked by every `Resource.list()` method — keeping the\n * pagination logic in one place means we never have to duplicate the\n * cursor-walk loop across resources.\n */\nexport function paginate<T>(\n client: PagerClient,\n path: string,\n params?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions,\n): AsyncPager<T> {\n let cursor: string | undefined;\n let exhausted = false;\n\n async function fetchPage(): Promise<CursorPaginated<T> | null> {\n if (exhausted) return null;\n\n const query: Record<string, string | number | boolean | undefined> = { ...(params ?? {}) };\n if (cursor !== undefined) query.cursor = cursor;\n\n const response = await client.request<CursorPaginated<T>>('GET', path, {\n query,\n ...options,\n });\n\n const next = response.next_cursor ?? null;\n if (!next) {\n exhausted = true;\n } else {\n cursor = next;\n }\n\n return response;\n }\n\n // Per-item async iterator — drains pages internally and yields each item.\n // `for await` over the pager itself ends up here.\n async function* itemIterator(): AsyncGenerator<T, void, undefined> {\n while (true) {\n const page = await fetchPage();\n if (!page) return;\n for (const item of page.data) {\n yield item;\n }\n if (exhausted) return;\n }\n }\n\n // Per-page async iterator — yields the full envelope each iteration.\n async function* pageIterator(): AsyncGenerator<CursorPaginated<T>, void, undefined> {\n while (true) {\n const page = await fetchPage();\n if (!page) return;\n yield page;\n if (exhausted) return;\n }\n }\n\n const iter = itemIterator();\n\n const pager: AsyncPager<T> = {\n async next(): Promise<IteratorResult<T>> {\n return iter.next();\n },\n async return(value?: T): Promise<IteratorResult<T>> {\n // Drop any further pagination — caller is bailing early.\n exhausted = true;\n return { value: value as T, done: true };\n },\n async throw(err?: unknown): Promise<IteratorResult<T>> {\n exhausted = true;\n throw err;\n },\n [Symbol.asyncIterator](): AsyncIterableIterator<T> {\n return pager;\n },\n async toArray(): Promise<T[]> {\n const out: T[] = [];\n for await (const item of pager) {\n out.push(item);\n }\n return out;\n },\n pages(): AsyncIterableIterator<CursorPaginated<T>> {\n return pageIterator();\n },\n };\n\n return pager;\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { AsyncPager } from '../pagination.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Resource facade for `/api/borrowers`. Includes both the standard CRUD\n * verbs and the borrower-specific flows that don't fit `update()` —\n * `claim()` (PII-claim flow, SOC 2 / GLBA) and `grantAudit()` (audit\n * delegation).\n */\nexport class BorrowersResource {\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * Retrieve a borrower by id.\n *\n * GET /api/borrowers/{id}\n */\n async retrieve<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}`,\n options,\n );\n }\n\n /**\n * Create a new borrower.\n *\n * POST /api/borrowers\n */\n async create<T = unknown>(params: Record<string, unknown>, options?: RequestOptions): Promise<T> {\n return this.client.request<T>('POST', '/api/borrowers', { body: params, ...options });\n }\n\n /**\n * Iterate every borrower visible to the calling principal.\n *\n * GET /api/borrowers\n */\n list<T = unknown>(\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n '/api/borrowers',\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Assign a lender to this borrower.\n *\n * POST /api/borrowers/{id}/assign\n */\n async assign<T = unknown>(\n borrowerId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/assign`,\n { body: params, ...options },\n );\n }\n\n /**\n * Claim PII access on a borrower. Required by SOC 2 / GLBA before an\n * admin can view the borrower's extracted financials. Surfaced as a verb\n * method (rather than `update()`) because the audit log records this as\n * a distinct event and integrators reading the SDK want to see the flow\n * by name.\n *\n * POST /api/borrowers/{id}/claim\n */\n async claim<T = unknown>(\n borrowerId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/claim`,\n { body: params, ...options },\n );\n }\n\n /**\n * Fetch the audit log for a borrower (PII access events, claim grants,\n * etc.).\n *\n * GET /api/borrowers/{id}/audit-log\n */\n async auditLog<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/audit-log`,\n options,\n );\n }\n\n /**\n * List loans associated with a borrower.\n *\n * GET /api/borrowers/{borrowerId}/loans\n */\n loans<T = unknown>(\n borrowerId: string,\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n `/api/borrowers/${encodeURIComponent(borrowerId)}/loans`,\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * List jobs (document packages) for a borrower.\n *\n * GET /api/borrowers/{id}/jobs\n */\n jobs<T = unknown>(\n borrowerId: string,\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n `/api/borrowers/${encodeURIComponent(borrowerId)}/jobs`,\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Fetch results for a specific job under a borrower.\n *\n * GET /api/borrowers/{id}/jobs/{jobId}/results\n */\n async jobResults<T = unknown>(\n borrowerId: string,\n jobId: string,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/jobs/${encodeURIComponent(jobId)}/results`,\n options,\n );\n }\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Resource facade for the document upload pipeline. Documents flow:\n *\n * 1. `presignedUrl()` to get a signed S3 PUT URL\n * 2. The integrator's backend uploads bytes directly to S3\n * 3. `confirmUpload()` to kick off the extraction pipeline\n * 4. Webhook `extraction.ready` fires when results are queryable\n *\n * No `update()` — once uploaded, document content is immutable; metadata\n * lives on the parent borrower / loan / job.\n */\nexport class DocumentsResource {\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * Request a presigned S3 PUT URL for a single document upload.\n *\n * POST /api/documents/presigned-url\n */\n async presignedUrl<T = unknown>(\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>('POST', '/api/documents/presigned-url', {\n body: params,\n ...options,\n });\n }\n\n /**\n * Confirm a single uploaded document, kicking off the extraction\n * pipeline.\n *\n * POST /api/documents/{jobId}/confirm-upload\n */\n async confirmUpload<T = unknown>(\n jobId: string,\n params: Record<string, unknown> = {},\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/documents/${encodeURIComponent(jobId)}/confirm-upload`,\n { body: params, ...options },\n );\n }\n\n /**\n * Confirm a batch of uploaded documents in a single request. Faster than\n * looping `confirmUpload()` when the integrator has many files in one\n * package.\n *\n * POST /api/documents/confirm-uploads\n */\n async batchConfirm<T = unknown>(\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>('POST', '/api/documents/confirm-uploads', {\n body: params,\n ...options,\n });\n }\n\n /**\n * Get a presigned S3 GET URL to download a previously-uploaded document.\n *\n * GET /api/documents/{jobId}/download-url\n */\n async downloadUrl<T = unknown>(jobId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/documents/${encodeURIComponent(jobId)}/download-url`,\n options,\n );\n }\n\n /**\n * Fetch processing status for a document upload.\n *\n * GET /api/documents/{jobId}/status\n */\n async status<T = unknown>(jobId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/documents/${encodeURIComponent(jobId)}/status`,\n options,\n );\n }\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Resource facade for embed sessions — short-lived tokens scoped to a\n * single loan. Mint server-side via the integrator's API key, then pass\n * the resulting `embed_token` to the browser to bootstrap the SpreadSpace\n * review widget.\n *\n * Sub-namespace structure (`embed.sessions.create(...)`) mirrors the route\n * shape (`/api/embed/sessions`) and leaves room for future embed\n * resources without crowding the top-level `embed` object.\n */\nexport class EmbedSessionsResource {\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * Mint an embed-session token for a loan. The minted token has a strict\n * subset of the calling API key's scopes and is locked to the supplied\n * `loan_id` — it cannot be used to access other loans or to mint further\n * tokens.\n *\n * POST /api/embed/sessions\n *\n * Body: { loan_id, scopes?, expires_in_seconds? }\n * Returns: { embed_token, expires_at, ... }\n */\n async create<T = unknown>(params: Record<string, unknown>, options?: RequestOptions): Promise<T> {\n return this.client.request<T>('POST', '/api/embed/sessions', { body: params, ...options });\n }\n\n /**\n * Revoke an embed session early — useful when the integrator's UI flow\n * ends before the natural expiry, or when reissuing after a logout.\n *\n * DELETE /api/embed/sessions/{sessionId}\n */\n async revoke<T = unknown>(sessionId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'DELETE',\n `/api/embed/sessions/${encodeURIComponent(sessionId)}`,\n options,\n );\n }\n}\n\n/**\n * Top-level `client.embed` namespace. Currently surfaces only the\n * `sessions` sub-resource; future phases (e.g. embed-only audit logs)\n * land here.\n */\nexport class EmbedResource {\n public readonly sessions: EmbedSessionsResource;\n\n constructor(client: SpreadSpaceClient) {\n this.sessions = new EmbedSessionsResource(client);\n }\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { AsyncPager } from '../pagination.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Resource facade for extracted document data. Extractions are scoped under\n * a borrower (the canonical PII boundary) — every endpoint takes a\n * `borrowerId` path segment so the multi-tenant access checks have an\n * unambiguous scope.\n *\n * Per-document-type endpoints (`balanceSheet`, `pl`, etc.) return\n * roll-ups across all documents of that type uploaded for the borrower.\n * The generic `query()` is the structured-search endpoint —\n * integrators that build their own UIs on top of the extraction data\n * typically want this one.\n *\n * `move()` reassigns a document's loan binding — shipped as a verb method\n * (not `update()`) because it traverses the loan-membership tables, not\n * the extraction row.\n */\nexport class ExtractionsResource {\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * Iterate every extraction for a borrower.\n *\n * GET /api/borrowers/{borrowerId}/extractions\n */\n list<T = unknown>(\n borrowerId: string,\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions`,\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Structured query across a borrower's extractions. Filter by document\n * type, period, and other metadata.\n *\n * POST /api/borrowers/{borrowerId}/extractions/query\n */\n async query<T = unknown>(\n borrowerId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/query`,\n { body: params, ...options },\n );\n }\n\n /**\n * Move an extracted document to a different loan under the same\n * borrower. Use when the user uploaded a doc to the wrong package.\n *\n * POST /api/borrowers/{borrowerId}/extractions/{docId}/move\n */\n async move<T = unknown>(\n borrowerId: string,\n docId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/${encodeURIComponent(docId)}/move`,\n { body: params, ...options },\n );\n }\n\n /**\n * Roll-up of the borrower's bank-statement analyses across all\n * uploaded statements.\n *\n * GET /api/borrowers/{borrowerId}/extractions/bank-statement-analysis\n */\n async bankStatementAnalysis<T = unknown>(\n borrowerId: string,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/bank-statement-analysis`,\n options,\n );\n }\n\n /**\n * Roll-up of the borrower's balance sheet across all uploaded\n * balance-sheet documents.\n */\n async balanceSheet<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/balance-sheet`,\n options,\n );\n }\n\n /** P&L roll-up across uploaded P&L documents. */\n async pl<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/pl`,\n options,\n );\n }\n\n /** Cash-flow roll-up. */\n async cashFlow<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/cash-flow`,\n options,\n );\n }\n\n /** Accounts payable roll-up. */\n async accountsPayable<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/accounts-payable`,\n options,\n );\n }\n\n /** Accounts receivable roll-up. */\n async accountsReceivable<T = unknown>(borrowerId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/accounts-receivable`,\n options,\n );\n }\n\n /**\n * Generic report endpoint — pass the report type as a path segment.\n * Useful for report types added after this SDK release.\n *\n * GET /api/borrowers/{borrowerId}/extractions/reports/{reportType}\n */\n async report<T = unknown>(\n borrowerId: string,\n reportType: string,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/borrowers/${encodeURIComponent(borrowerId)}/extractions/reports/${encodeURIComponent(reportType)}`,\n options,\n );\n }\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { AsyncPager } from '../pagination.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Resource facade for `/api/jobs`. A \"job\" is a document package — a\n * batch of files uploaded together. Read-only from this surface; jobs\n * are created implicitly by the upload pipeline.\n */\nexport class JobsResource {\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * Iterate jobs visible to the calling principal.\n *\n * GET /api/jobs\n */\n list<T = unknown>(\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n '/api/jobs',\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Fetch processing status for a job.\n *\n * GET /api/jobs/{jobId}/status\n */\n async status<T = unknown>(jobId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/jobs/${encodeURIComponent(jobId)}/status`,\n options,\n );\n }\n\n /**\n * Fetch results for a job — the rolled-up extraction outcomes.\n *\n * GET /api/jobs/{jobId}/results\n */\n async results<T = unknown>(jobId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/jobs/${encodeURIComponent(jobId)}/results`,\n options,\n );\n }\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { AsyncPager } from '../pagination.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Resource facade for `/api/loans`. Loans are the top-level package unit —\n * a borrower has many loans, each loan is the scope of a documents bundle.\n */\nexport class LoansResource {\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * Retrieve a loan by id.\n *\n * GET /api/loans/{loanId}\n */\n async retrieve<T = unknown>(loanId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>('GET', `/api/loans/${encodeURIComponent(loanId)}`, options);\n }\n\n /**\n * Create a new loan.\n *\n * POST /api/loans\n */\n async create<T = unknown>(params: Record<string, unknown>, options?: RequestOptions): Promise<T> {\n return this.client.request<T>('POST', '/api/loans', { body: params, ...options });\n }\n\n /**\n * Update an existing loan.\n *\n * PATCH /api/loans/{loanId}\n */\n async update<T = unknown>(\n loanId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>('PATCH', `/api/loans/${encodeURIComponent(loanId)}`, {\n body: params,\n ...options,\n });\n }\n\n /**\n * Iterate every loan visible to the calling principal. Returns an\n * `AsyncPager<T>` — consume with `for await`, `.toArray()`, or\n * `.pages()`.\n *\n * GET /api/loans\n */\n list<T = unknown>(\n params?: { limit?: number; cursor?: string; borrower_id?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n '/api/loans',\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Assign a lender to this loan. Calls `POST /api/loans/{id}/assign`.\n * Surfaced as a verb method rather than forcing it through `update()`\n * because the assignment flow is semantically distinct from a generic\n * field patch (it touches the lender-access table, not the loan row).\n */\n async assign<T = unknown>(\n loanId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>('POST', `/api/loans/${encodeURIComponent(loanId)}/assign`, {\n body: params,\n ...options,\n });\n }\n\n /**\n * Fetch the audit log for a loan.\n *\n * GET /api/loans/{loanId}/audit-log\n */\n async auditLog<T = unknown>(loanId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/loans/${encodeURIComponent(loanId)}/audit-log`,\n options,\n );\n }\n}\n","import { createHmac, timingSafeEqual } from 'node:crypto';\n\nimport type { VerifyAndParseResult, WebhookEvent } from './types.js';\n\n/**\n * Webhook signature verifier — byte-for-byte compatible with\n * `api/src/Webhooks/WebhookSigner.cs` on the API side.\n *\n * Wire format (mirrors Stripe's `Stripe-Signature`):\n *\n * SpreadSpace-Signature: t=<unix_seconds>,v1=<hex_hmac_sha256(secret, \"{t}.{body}\")>\n *\n * The verifier:\n * 1. Parses `t=...` and `v1=...` tokens (tolerant of additional unrecognized\n * pairs to stay forward-compatible with future schemes).\n * 2. Recomputes HMAC-SHA256 over `\"{timestamp}.{rawBody}\"` with the secret.\n * 3. Compares with `crypto.timingSafeEqual` on raw bytes (never on hex\n * strings — string `===` short-circuits and leaks prefix info via timing).\n * 4. Two-sided freshness check: rejects timestamps too far in the past\n * (replay protection) AND too far in the future (attacker-controlled\n * timestamps that would extend the replay window).\n *\n * Verification order matches the C# side: HMAC first, then freshness. That\n * way a forged-but-fresh request and a real-but-stale request fail\n * indistinguishably from the timing perspective.\n */\n\n/** Default freshness tolerance — matches `WebhookSignatureFormat.DefaultFreshnessTolerance`. */\nconst DEFAULT_FRESHNESS_TOLERANCE_SECONDS = 5 * 60;\n\n/** Wire constant for the v1 HMAC-SHA256 scheme. */\nconst VERSION_1_PREFIX = 'v1';\n\nexport interface VerifyOptions {\n /**\n * Maximum age (and maximum future skew) of the timestamp before the\n * signature is rejected as stale. Symmetric — `Math.abs(now - t)` must be\n * ≤ this value.\n *\n * Default: 300 seconds (5 minutes).\n */\n freshnessTolerance?: number;\n\n /**\n * Override the \"current time\" used for the freshness check. Useful in\n * tests; otherwise leave undefined and the verifier reads\n * `Date.now() / 1000`.\n */\n currentTimestamp?: number;\n}\n\n/**\n * Verify a `SpreadSpace-Signature` header against a body and signing\n * secret. Throws on any failure (invalid format, bad HMAC, stale timestamp,\n * wrong secret); returns `true` on success.\n *\n * @param rawBody The exact request body received on the wire — bytes, not\n * re-serialized JSON. Any byte-level transformation between receipt and\n * verification (re-stringification, gzip decode, encoding change) will\n * invalidate the signature.\n * @param signature Contents of the `SpreadSpace-Signature` HTTP header.\n * @param secret The plaintext signing secret (`whsec_...`) issued at\n * webhook endpoint creation. Never log this.\n * @param options Optional overrides — freshness window and clock injection.\n */\nexport function verifyWebhookSignature(\n rawBody: string | Buffer | Uint8Array,\n signature: string,\n secret: string,\n options?: VerifyOptions,\n): true {\n if (typeof signature !== 'string' || signature.length === 0) {\n throw new WebhookSignatureError('SpreadSpace-Signature header is missing or empty.');\n }\n if (typeof secret !== 'string' || secret.length === 0) {\n throw new WebhookSignatureError('Webhook signing secret is missing or empty.');\n }\n if (rawBody === null || rawBody === undefined) {\n throw new WebhookSignatureError('Webhook raw body is missing.');\n }\n\n const parsed = parseSignatureHeader(signature);\n if (!parsed) {\n throw new WebhookSignatureError('Webhook signature header is malformed.');\n }\n const { timestamp, hex } = parsed;\n\n // HMAC FIRST. We never want to leak (via differential timing or distinct\n // error message text) whether a request was a forged signature vs. a real\n // one that aged out — both should be indistinguishable failures.\n const bodyString = bodyToString(rawBody);\n const expectedHex = computeHmacHex(secret, `${timestamp}.${bodyString}`);\n\n if (!hexEquals(expectedHex, hex)) {\n throw new WebhookSignatureError('Webhook signature does not match.');\n }\n\n // Then freshness. Two-sided check: too old OR too far in the future.\n const tolerance = options?.freshnessTolerance ?? DEFAULT_FRESHNESS_TOLERANCE_SECONDS;\n const now = options?.currentTimestamp ?? Math.floor(Date.now() / 1000);\n const age = now - timestamp;\n if (age > tolerance || age < -tolerance) {\n throw new WebhookSignatureError(\n `Webhook timestamp is outside the freshness window of ${tolerance}s.`,\n );\n }\n\n return true;\n}\n\n/**\n * Verify a webhook signature and JSON-parse the body into a typed\n * `WebhookEvent` envelope. Throws on signature failure or invalid JSON.\n *\n * The returned value is a discriminated union over `type` — switch on\n * `event.type` to narrow `event.data` to the matching payload.\n */\nexport function verifyAndParseWebhook(\n rawBody: string | Buffer | Uint8Array,\n signature: string,\n secret: string,\n options?: VerifyOptions,\n): VerifyAndParseResult {\n verifyWebhookSignature(rawBody, signature, secret, options);\n\n const bodyString = bodyToString(rawBody);\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(bodyString);\n } catch (cause) {\n throw new WebhookSignatureError('Webhook body is not valid JSON.', cause);\n }\n\n if (!isPlainObject(parsed)) {\n throw new WebhookSignatureError('Webhook body is not a JSON object.');\n }\n const candidate = parsed as Partial<WebhookEvent>;\n if (typeof candidate.type !== 'string' || candidate.type.length === 0) {\n throw new WebhookSignatureError('Webhook body is missing a `type` field.');\n }\n if (typeof candidate.id !== 'string' || candidate.id.length === 0) {\n throw new WebhookSignatureError('Webhook body is missing an `id` field.');\n }\n if (typeof candidate.created !== 'number') {\n throw new WebhookSignatureError('Webhook body is missing a numeric `created` field.');\n }\n if (typeof candidate.tenant_id !== 'string' || candidate.tenant_id.length === 0) {\n throw new WebhookSignatureError('Webhook body is missing a `tenant_id` field.');\n }\n if (!isPlainObject(candidate.data)) {\n throw new WebhookSignatureError('Webhook body is missing a `data` object.');\n }\n\n return parsed as VerifyAndParseResult;\n}\n\n/**\n * Thrown when a webhook signature fails verification or the envelope is\n * structurally malformed. Distinct from `SpreadSpaceError` because webhook\n * verification is a self-contained primitive — verifiers don't need the\n * full request/response error machinery, just a single failure type they\n * can reject against.\n */\nexport class WebhookSignatureError extends Error {\n public readonly cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = 'WebhookSignatureError';\n this.cause = cause;\n Object.setPrototypeOf(this, WebhookSignatureError.prototype);\n }\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Internals\n// ────────────────────────────────────────────────────────────────────────────\n\ninterface ParsedSignature {\n timestamp: number;\n hex: string;\n}\n\n/**\n * Parse a header in the form `t=<long>,v1=<hex>`. Tolerant of whitespace\n * between segments and of additional unrecognized pairs (e.g. a future\n * `v2=...`) — those are silently ignored, not treated as parse errors, so\n * this verifier remains forward-compatible with new schemes.\n */\nfunction parseSignatureHeader(header: string): ParsedSignature | null {\n const segments = header.split(',').filter((s) => s.length > 0);\n if (segments.length < 2) return null;\n\n let parsedTs: number | null = null;\n let parsedV1: string | null = null;\n\n for (const raw of segments) {\n const segment = raw.trim();\n const eq = segment.indexOf('=');\n if (eq <= 0 || eq === segment.length - 1) {\n // Missing key, missing value, or `=` at the very end (`v1=`).\n return null;\n }\n\n const key = segment.slice(0, eq).trim();\n const value = segment.slice(eq + 1).trim();\n\n if (key === 't') {\n if (parsedTs !== null) return null; // Duplicate `t=`.\n // Strict integer parse — reject `1.5`, `1e3`, leading `+`, etc. The C#\n // verifier uses `long.TryParse(NumberStyles.Integer, Invariant)`,\n // which accepts an optional leading `-` and digits only. We mirror that.\n if (!/^-?\\d+$/.test(value)) return null;\n const ts = Number(value);\n if (!Number.isFinite(ts) || !Number.isInteger(ts)) return null;\n parsedTs = ts;\n } else if (key === VERSION_1_PREFIX) {\n if (parsedV1 !== null) return null; // Duplicate `v1=`.\n if (value.length === 0) return null;\n parsedV1 = value;\n }\n // Any other key — silently ignored for forward compatibility.\n }\n\n if (parsedTs === null || parsedV1 === null) return null;\n return { timestamp: parsedTs, hex: parsedV1 };\n}\n\n/**\n * Compute lowercase hex HMAC-SHA256 digest. Matches the C# side's\n * `Convert.ToHexStringLower(hmac.ComputeHash(...))` exactly.\n */\nfunction computeHmacHex(secret: string, signedPayload: string): string {\n const hmac = createHmac('sha256', Buffer.from(secret, 'utf-8'));\n hmac.update(Buffer.from(signedPayload, 'utf-8'));\n return hmac.digest('hex'); // Node default is lowercase.\n}\n\n/**\n * Constant-time compare of two hex strings. We decode both sides to bytes\n * before calling `timingSafeEqual` — it requires equal-length inputs and\n * we want a length mismatch to fail fast (length is not timing-sensitive\n * since both ends know SHA-256 emits 64 hex chars).\n */\nfunction hexEquals(expectedHex: string, providedHex: string): boolean {\n if (expectedHex.length !== providedHex.length) return false;\n\n let expectedBytes: Buffer;\n let providedBytes: Buffer;\n try {\n expectedBytes = Buffer.from(expectedHex, 'hex');\n providedBytes = Buffer.from(providedHex, 'hex');\n } catch {\n return false;\n }\n\n // `Buffer.from(..., 'hex')` silently stops at the first non-hex character,\n // producing a shorter buffer — guard explicitly against that to avoid a\n // false equality when the provided hex has invalid characters that happen\n // to truncate to an empty buffer the receiver also produced.\n if (expectedBytes.length !== providedBytes.length) return false;\n if (expectedBytes.length * 2 !== expectedHex.length) return false;\n if (providedBytes.length * 2 !== providedHex.length) return false;\n\n return timingSafeEqual(\n new Uint8Array(expectedBytes.buffer, expectedBytes.byteOffset, expectedBytes.byteLength),\n new Uint8Array(providedBytes.buffer, providedBytes.byteOffset, providedBytes.byteLength),\n );\n}\n\nfunction bodyToString(body: string | Buffer | Uint8Array): string {\n if (typeof body === 'string') return body;\n if (Buffer.isBuffer(body)) return body.toString('utf-8');\n return Buffer.from(body).toString('utf-8');\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n","import type { SpreadSpaceClient } from '../client.js';\nimport type { AsyncPager } from '../pagination.js';\nimport type { RequestOptions } from '../types.js';\nimport {\n verifyAndParseWebhook as verifyAndParseWebhookFn,\n verifyWebhookSignature as verifyWebhookSignatureFn,\n} from '../webhook-signature.js';\n\n/**\n * Resource facade for webhook endpoints (`/api/webhooks/*`) plus the\n * webhook signature helpers as static methods for discoverability.\n *\n * The verification helpers are also exported as bare functions from\n * `@spreadspace/embed/webhooks` for tree-shakeable import paths in\n * webhook receiver Lambdas (where `SpreadSpaceClient` would otherwise pull\n * in the entire resource layer).\n */\nexport class WebhooksResource {\n /**\n * Verify a `SpreadSpace-Signature` header against a body and signing\n * secret. Throws `WebhookSignatureError` on any failure.\n */\n public static readonly verifySignature = verifyWebhookSignatureFn;\n\n /**\n * Verify a webhook signature and JSON-parse the body into a typed\n * `WebhookEvent`. Throws `WebhookSignatureError` on signature failure or\n * invalid JSON.\n */\n public static readonly verifyAndParse = verifyAndParseWebhookFn;\n\n constructor(private readonly client: SpreadSpaceClient) {}\n\n /**\n * List configured webhook endpoints for this organization.\n *\n * GET /api/webhooks\n */\n list<T = unknown>(\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n '/api/webhooks',\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Retrieve a single webhook endpoint.\n *\n * GET /api/webhooks/{id}\n */\n async retrieve<T = unknown>(endpointId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'GET',\n `/api/webhooks/${encodeURIComponent(endpointId)}`,\n options,\n );\n }\n\n /**\n * Create a new webhook endpoint. The response carries the plaintext\n * signing secret exactly once — store it server-side, do not log it.\n *\n * POST /api/webhooks\n */\n async create<T = unknown>(params: Record<string, unknown>, options?: RequestOptions): Promise<T> {\n return this.client.request<T>('POST', '/api/webhooks', { body: params, ...options });\n }\n\n /**\n * Update endpoint metadata (URL, subscribed event types, enabled flag).\n *\n * PATCH /api/webhooks/{id}\n */\n async update<T = unknown>(\n endpointId: string,\n params: Record<string, unknown>,\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'PATCH',\n `/api/webhooks/${encodeURIComponent(endpointId)}`,\n { body: params, ...options },\n );\n }\n\n /**\n * Delete a webhook endpoint.\n *\n * DELETE /api/webhooks/{id}\n */\n async delete<T = unknown>(endpointId: string, options?: RequestOptions): Promise<T> {\n return this.client.request<T>(\n 'DELETE',\n `/api/webhooks/${encodeURIComponent(endpointId)}`,\n options,\n );\n }\n\n /**\n * Rotate an endpoint's signing secret. The old secret remains valid for\n * a grace window so deliveries in flight aren't dropped. Returns the new\n * plaintext secret exactly once.\n *\n * POST /api/webhooks/{id}/rotate\n */\n async rotateSecret<T = unknown>(\n endpointId: string,\n params: Record<string, unknown> = {},\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/webhooks/${encodeURIComponent(endpointId)}/rotate`,\n { body: params, ...options },\n );\n }\n\n /**\n * Iterate delivery attempts for an endpoint.\n *\n * GET /api/webhooks/{id}/deliveries\n */\n deliveries<T = unknown>(\n endpointId: string,\n params?: { limit?: number; cursor?: string },\n options?: RequestOptions,\n ): AsyncPager<T> {\n return this.client.paginate<T>(\n `/api/webhooks/${encodeURIComponent(endpointId)}/deliveries`,\n params as Record<string, string | number | undefined>,\n options,\n );\n }\n\n /**\n * Manually replay a delivery (e.g. after fixing a downstream outage).\n *\n * POST /api/webhooks/{id}/deliveries/{deliveryId}/replay\n */\n async replayDelivery<T = unknown>(\n endpointId: string,\n deliveryId: string,\n params: Record<string, unknown> = {},\n options?: RequestOptions,\n ): Promise<T> {\n return this.client.request<T>(\n 'POST',\n `/api/webhooks/${encodeURIComponent(endpointId)}/deliveries/${encodeURIComponent(deliveryId)}/replay`,\n { body: params, ...options },\n );\n }\n}\n","/**\n * The SDK package version. Sent on every outbound request as part of the\n * `User-Agent` string so server-side telemetry can pick up which SDK release\n * a customer is running.\n *\n * Hand-rolled rather than imported from `package.json` because tsup output\n * doesn't include the package manifest — keeping it as a TS literal avoids a\n * runtime `fs` read from the dist bundle.\n *\n * Bump in lockstep with `package.json`.\n */\nexport const SDK_VERSION = '0.1.0';\n\n/**\n * Default API surface version pinned by this SDK release. Sent as the\n * `SpreadSpace-Version` header on every request unless the integrator\n * overrides it via `SpreadSpaceClientOptions.apiVersion`.\n *\n * Once the SDK is published, this value is the contract: the SDK guarantees\n * the request/response shapes match this dated surface. Bumping requires a\n * new SDK release that codegens against the new spec.\n */\nexport const DEFAULT_API_VERSION = '2026-05-03';\n","import { randomUUID } from 'node:crypto';\n\nimport {\n AuthenticationError,\n classifyError,\n ConflictError,\n InvalidRequestError,\n NetworkError,\n NotFoundError,\n PermissionError,\n RateLimitError,\n ServerError,\n SpreadSpaceError,\n} from './errors.js';\nimport { paginate, type AsyncPager } from './pagination.js';\nimport { BorrowersResource } from './resources/borrowers.js';\nimport { DocumentsResource } from './resources/documents.js';\nimport { EmbedResource } from './resources/embed.js';\nimport { ExtractionsResource } from './resources/extractions.js';\nimport { JobsResource } from './resources/jobs.js';\nimport { LoansResource } from './resources/loans.js';\nimport { WebhooksResource } from './resources/webhooks.js';\nimport type { RequestOptions } from './types.js';\nimport { DEFAULT_API_VERSION, SDK_VERSION } from './version.js';\n\n/**\n * Re-export the error classes for `instanceof` checks at integrator callsites\n * without needing a separate `import { ... } from '@spreadspace/embed/errors'`.\n */\nexport {\n SpreadSpaceError,\n InvalidRequestError,\n AuthenticationError,\n PermissionError,\n NotFoundError,\n ConflictError,\n RateLimitError,\n ServerError,\n NetworkError,\n};\n\nexport interface SpreadSpaceClientOptions {\n /**\n * The API key for authentication. Live keys begin with `ss_live_`, test\n * keys with `ss_test_`. Issue and manage keys from the SpreadSpace\n * dashboard.\n */\n apiKey: string;\n\n /**\n * Base URL for the API. Defaults to `https://api.spreadspace.app`.\n * Override for staging (`https://staging-api.spreadspace.app`) or for\n * local development (`http://localhost:8080`).\n */\n baseUrl?: string;\n\n /**\n * Override the SDK-pinned `SpreadSpace-Version` header. Defaults to the\n * version this SDK release was built against. Set this only when\n * intentionally targeting a different surface version than the SDK was\n * tested against.\n */\n apiVersion?: string;\n\n /**\n * Request timeout in milliseconds. Default: 30000 (30s). The timeout is\n * applied per individual HTTP attempt — retries get a fresh window each.\n */\n timeout?: number;\n\n /**\n * Maximum number of retry attempts after the initial request. Default: 3.\n * Retries trigger on:\n * - 429 Rate Limited (honors `Retry-After` if present)\n * - 5xx Server Errors\n * - Transport-level network failures\n * 4xx other than 429 do not retry.\n */\n maxRetries?: number;\n\n /**\n * Custom `fetch` implementation. Defaults to `globalThis.fetch`. Inject a\n * mock here to write hermetic tests without monkey-patching the global.\n */\n fetch?: typeof fetch;\n\n /**\n * Custom idempotency-key generator. Defaults to `crypto.randomUUID()`.\n */\n idempotencyKeyGenerator?: () => string;\n}\n\n/**\n * Internal options for the low-level `request()` method. Resource methods\n * compose these on top of the public `RequestOptions`.\n */\nexport interface InternalRequestOptions extends RequestOptions {\n /**\n * JSON-serializable request body. Encoded as `application/json` with\n * `Content-Type: application/json; charset=utf-8`.\n */\n body?: unknown;\n\n /**\n * Query parameters appended to the URL. `undefined` values are skipped.\n */\n query?: Record<string, string | number | boolean | undefined>;\n}\n\nconst DEFAULT_BASE_URL = 'https://api.spreadspace.app';\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_MAX_RETRIES = 3;\nconst RETRY_BASE_DELAY_MS = 500;\nconst RETRY_MAX_DELAY_MS = 30_000;\n\n/**\n * Top-level entry point of the SpreadSpace SDK.\n *\n * Single instance per integrator process — the resources hanging off it are\n * thin facades, not separate clients, so spinning up multiple\n * `SpreadSpaceClient`s only matters when juggling multiple API keys.\n *\n * Wire-format invariants the client guarantees on every request:\n * - `Authorization: Bearer <apiKey>`\n * - `SpreadSpace-Version: <apiVersion>`\n * - `User-Agent: spreadspace-node/<sdkVersion> node/<nodeVersion>`\n * - `Idempotency-Key: <auto-generated UUID>` on every POST/PATCH/PUT/DELETE\n * unless the caller supplies one explicitly or sets `idempotencyKey: null`\n *\n * Retries on 429, 5xx, and transport failures up to `maxRetries` times with\n * exponential backoff (capped) and jitter; honors `Retry-After`.\n */\nexport class SpreadSpaceClient {\n /** Resolved base URL (no trailing slash). */\n public readonly baseUrl: string;\n\n /** Resolved API version string (the `SpreadSpace-Version` header value). */\n public readonly apiVersion: string;\n\n /** Public so resource files can pull it for `paginate()` URL construction. */\n public readonly maxRetries: number;\n\n // ── Resources ────────────────────────────────────────────────────────────\n public readonly loans: LoansResource;\n public readonly borrowers: BorrowersResource;\n public readonly documents: DocumentsResource;\n public readonly extractions: ExtractionsResource;\n public readonly jobs: JobsResource;\n public readonly webhooks: WebhooksResource;\n public readonly embed: EmbedResource;\n\n // ── Internals ────────────────────────────────────────────────────────────\n // ECMAScript #private (not TS `private`): runtime-invisible, so the\n // credential can never ride JSON.stringify/console.log/spread of the\n // client or anything holding it.\n readonly #apiKey: string;\n private readonly timeoutMs: number;\n private readonly fetchImpl: typeof fetch;\n private readonly idempotencyKeyGenerator: () => string;\n\n constructor(options: SpreadSpaceClientOptions) {\n if (!options || typeof options.apiKey !== 'string' || options.apiKey.length === 0) {\n throw new TypeError(\n 'SpreadSpaceClient requires an apiKey. Issue one from the dashboard at /settings/api-keys.',\n );\n }\n\n this.#apiKey = options.apiKey;\n let baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n while (baseUrl.endsWith('/')) baseUrl = baseUrl.slice(0, -1);\n this.baseUrl = baseUrl;\n this.apiVersion = options.apiVersion ?? DEFAULT_API_VERSION;\n this.timeoutMs = options.timeout ?? DEFAULT_TIMEOUT_MS;\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.fetchImpl = options.fetch ?? globalThis.fetch;\n this.idempotencyKeyGenerator = options.idempotencyKeyGenerator ?? randomUUID;\n\n if (typeof this.fetchImpl !== 'function') {\n throw new TypeError(\n 'SpreadSpaceClient requires a fetch implementation. Node 18+ provides one globally; pass a polyfill via options.fetch otherwise.',\n );\n }\n\n this.loans = new LoansResource(this);\n this.borrowers = new BorrowersResource(this);\n this.documents = new DocumentsResource(this);\n this.extractions = new ExtractionsResource(this);\n this.jobs = new JobsResource(this);\n this.webhooks = new WebhooksResource(this);\n this.embed = new EmbedResource(this);\n }\n\n /**\n * Low-level request method. Resource layer wraps this with ergonomic\n * method names; integrators can call it directly to hit endpoints not yet\n * surfaced via a typed resource.\n *\n * Returns the parsed JSON body. For 204 No Content responses (currently\n * none in the API but reserved), returns `undefined as T`.\n */\n public async request<T>(\n method: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE',\n path: string,\n options: InternalRequestOptions = {},\n ): Promise<T> {\n const url = this.buildUrl(path, options.query);\n const headers = this.buildHeaders(method, options);\n const body = options.body !== undefined ? JSON.stringify(options.body) : undefined;\n const maxRetries = options.maxRetries ?? this.maxRetries;\n\n let attempt = 0;\n let lastError: unknown;\n\n while (attempt <= maxRetries) {\n // Per-attempt timeout. We compose it with any caller-provided\n // `signal` so abort-from-outside still works.\n const controller = new AbortController();\n const timeoutHandle = setTimeout(() => controller.abort(), this.timeoutMs);\n const signal = options.signal\n ? composeAbortSignals(controller.signal, options.signal)\n : controller.signal;\n\n let response: Response;\n try {\n response = await this.fetchImpl(url, {\n method,\n headers,\n body,\n signal,\n });\n } catch (err) {\n clearTimeout(timeoutHandle);\n lastError = err;\n // Transport-layer failures are retryable on the same backoff curve\n // as 5xx — DNS hiccups, TLS handshake failures, intermittent\n // upstream resets are exactly what retries are designed to cover.\n if (attempt < maxRetries) {\n await sleep(this.computeRetryDelay(attempt, undefined));\n attempt += 1;\n continue;\n }\n throw new NetworkError(\n `SpreadSpace request to ${method} ${url} failed: ${describeError(err)}`,\n err,\n );\n }\n\n clearTimeout(timeoutHandle);\n\n const requestId = response.headers.get('X-Request-ID') ?? undefined;\n\n // Successful response — parse body and return.\n if (response.ok) {\n return await this.parseSuccessBody<T>(response);\n }\n\n // Decide retry vs. throw based on status.\n const status = response.status;\n const retryable = status === 429 || (status >= 500 && status <= 599);\n\n if (retryable && attempt < maxRetries) {\n const retryAfterSec = parseRetryAfter(response.headers.get('Retry-After'));\n await sleep(this.computeRetryDelay(attempt, retryAfterSec));\n attempt += 1;\n // Drain the body so the connection can be reused — we don't care\n // about its content on a retryable failure.\n try {\n await response.body?.cancel();\n } catch {\n /* ignore */\n }\n continue;\n }\n\n // Non-retryable, or out of attempts — convert to typed exception.\n throw await this.buildErrorFromResponse(response, requestId);\n }\n\n // Should be unreachable — the loop either returns, throws, or continues.\n throw new NetworkError(\n `SpreadSpace request to ${method} ${url} exhausted retries (last error: ${describeError(lastError)}).`,\n lastError,\n );\n }\n\n /**\n * Convenience wrapper around `paginate()` for resource list methods. Lets\n * each resource simply do `return this.client.paginate(...)` rather than\n * importing the helper directly.\n */\n public paginate<T>(\n path: string,\n params?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions,\n ): AsyncPager<T> {\n return paginate<T>(this, path, params, options);\n }\n\n // ────────────────────────────────────────────────────────────────────────\n // Internals\n // ────────────────────────────────────────────────────────────────────────\n\n private buildUrl(\n path: string,\n query?: Record<string, string | number | boolean | undefined>,\n ): string {\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n const url = new URL(this.baseUrl + normalizedPath);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined) continue;\n url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n }\n\n private buildHeaders(\n method: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE',\n options: InternalRequestOptions,\n ): Headers {\n const headers = new Headers();\n headers.set('Authorization', `Bearer ${this.#apiKey}`);\n headers.set('SpreadSpace-Version', options.apiVersion ?? this.apiVersion);\n headers.set('Accept', 'application/json');\n headers.set('User-Agent', this.buildUserAgent());\n\n if (options.body !== undefined) {\n headers.set('Content-Type', 'application/json; charset=utf-8');\n }\n\n // Idempotency-Key on every non-GET unless explicitly suppressed via\n // `idempotencyKey: null` or already provided in options.\n if (method !== 'GET') {\n const explicit = options.idempotencyKey;\n if (explicit === null) {\n // Caller opted out — no header.\n } else if (typeof explicit === 'string' && explicit.length > 0) {\n headers.set('Idempotency-Key', explicit);\n } else {\n headers.set('Idempotency-Key', this.idempotencyKeyGenerator());\n }\n }\n\n return headers;\n }\n\n private buildUserAgent(): string {\n const nodeVersion = typeof process !== 'undefined' ? process.version : 'unknown';\n return `spreadspace-node/${SDK_VERSION} node/${nodeVersion}`;\n }\n\n /**\n * Compute the next retry delay. Exponential backoff with full jitter,\n * floored by `Retry-After` if the server provided one (we never retry\n * faster than the server asked us to).\n *\n * base = min(maxDelay, baseDelay * 2^attempt)\n * delay = random(0, base)\n *\n * Full jitter (vs. equal jitter) is the AWS-recommended default — it\n * minimizes thundering-herd across many concurrent retrying clients.\n */\n private computeRetryDelay(attempt: number, retryAfterSec: number | undefined): number {\n const expBackoff = Math.min(RETRY_MAX_DELAY_MS, RETRY_BASE_DELAY_MS * 2 ** attempt);\n const jittered = Math.floor(Math.random() * expBackoff);\n\n if (retryAfterSec !== undefined && retryAfterSec > 0) {\n const retryAfterMs = retryAfterSec * 1000;\n return Math.max(jittered, retryAfterMs);\n }\n return jittered;\n }\n\n private async parseSuccessBody<T>(response: Response): Promise<T> {\n if (response.status === 204) {\n return undefined as T;\n }\n const text = await response.text();\n if (text.length === 0) {\n return undefined as T;\n }\n try {\n return JSON.parse(text) as T;\n } catch (err) {\n throw new NetworkError(\n `Failed to parse SpreadSpace response as JSON (status=${response.status}): ${describeError(err)}`,\n err,\n );\n }\n }\n\n private async buildErrorFromResponse(\n response: Response,\n requestId: string | undefined,\n ): Promise<SpreadSpaceError> {\n const status = response.status;\n let rawBody: unknown;\n let type = 'unknown';\n let message = `SpreadSpace API request failed with status ${status}.`;\n let details: Record<string, string> | undefined;\n let resolvedRequestId = requestId;\n\n try {\n const text = await response.text();\n if (text.length > 0) {\n try {\n const parsed = JSON.parse(text) as unknown;\n rawBody = parsed;\n if (\n typeof parsed === 'object' &&\n parsed !== null &&\n 'error' in parsed &&\n typeof (parsed as { error: unknown }).error === 'object' &&\n (parsed as { error: object }).error !== null\n ) {\n const errBody = (parsed as { error: Record<string, unknown> }).error;\n if (typeof errBody.type === 'string') type = errBody.type;\n if (typeof errBody.message === 'string') message = errBody.message;\n if (\n errBody.details &&\n typeof errBody.details === 'object' &&\n !Array.isArray(errBody.details)\n ) {\n details = errBody.details as Record<string, string>;\n }\n // Body's request_id is the authoritative source from the\n // ApiErrorResponse envelope. Prefer the X-Request-ID header\n // when both are set (they will be in production), fall through\n // to body when the header is absent (test mocks, proxies that\n // strip headers, etc.).\n if (resolvedRequestId === undefined && typeof errBody.request_id === 'string') {\n resolvedRequestId = errBody.request_id;\n }\n }\n } catch {\n rawBody = text;\n }\n }\n } catch {\n // Body read failure — keep the generic message.\n }\n\n const ErrorClass = classifyError(status, type);\n const ctorParams = {\n type,\n message,\n statusCode: status,\n requestId: resolvedRequestId,\n rawBody,\n details,\n };\n\n return new ErrorClass(ctorParams);\n }\n}\n\n// ──────────────────────────────────────────────────────────────────────────────\n// Helpers — kept module-private; not exported.\n// ──────────────────────────────────────────────────────────────────────────────\n\nfunction sleep(ms: number): Promise<void> {\n if (ms <= 0) return Promise.resolve();\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Parse `Retry-After`. Spec allows either delta-seconds or HTTP-date; we\n * accept both. Returns `undefined` if the header is missing or unparseable.\n */\nfunction parseRetryAfter(value: string | null): number | undefined {\n if (value === null || value.length === 0) return undefined;\n const asInt = Number(value);\n if (Number.isFinite(asInt) && Number.isInteger(asInt) && asInt >= 0) {\n return asInt;\n }\n const asDate = Date.parse(value);\n if (!Number.isNaN(asDate)) {\n const deltaMs = asDate - Date.now();\n if (deltaMs > 0) return Math.ceil(deltaMs / 1000);\n }\n return undefined;\n}\n\nfunction describeError(err: unknown): string {\n if (err instanceof Error) return err.message;\n if (typeof err === 'string') return err;\n return String(err);\n}\n\n/**\n * Compose two `AbortSignal`s — abort either one and the composed signal\n * fires. `AbortSignal.any` is in modern Node but we polyfill manually so\n * the SDK works under Node 18 which predates it.\n */\nfunction composeAbortSignals(a: AbortSignal, b: AbortSignal): AbortSignal {\n // Prefer the standard `AbortSignal.any` when available (Node 20+).\n type AbortSignalAny = (signals: AbortSignal[]) => AbortSignal;\n const maybeAny = (AbortSignal as unknown as { any?: AbortSignalAny }).any;\n if (typeof maybeAny === 'function') {\n return maybeAny([a, b]);\n }\n\n const controller = new AbortController();\n const onAbort = (source: AbortSignal): void => {\n if (controller.signal.aborted) return;\n const reason = (source as { reason?: unknown }).reason;\n controller.abort(reason);\n };\n\n if (a.aborted) {\n onAbort(a);\n } else {\n a.addEventListener('abort', () => onAbort(a), { once: true });\n }\n if (b.aborted) {\n onAbort(b);\n } else {\n b.addEventListener('abort', () => onAbort(b), { once: true });\n }\n return controller.signal;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spreadspace/embed",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Server-side Node.js SDK for SpreadSpace embeds — mint embed sessions and verify webhooks.",
5
5
  "license": "MIT",
6
6
  "sideEffects": false,
@@ -25,6 +25,17 @@
25
25
  "README.md",
26
26
  "LICENSE"
27
27
  ],
28
+ "scripts": {
29
+ "codegen": "bash ../../fern/build-public-spec.sh && openapi-typescript ../../fern/api-public.json -o src/generated/api-types.ts && pnpm run check:no-internal-paths",
30
+ "check:no-internal-paths": "node scripts/check-no-internal-paths.mjs",
31
+ "clean": "rimraf dist",
32
+ "build": "pnpm run clean && tsup && node scripts/check-no-internal-paths.mjs --dist",
33
+ "dev": "tsup --watch",
34
+ "test": "vitest run",
35
+ "test:watch": "vitest",
36
+ "lint": "eslint \"src/**/*.ts\" \"test/**/*.ts\"",
37
+ "typecheck": "tsc --noEmit"
38
+ },
28
39
  "dependencies": {},
29
40
  "devDependencies": {
30
41
  "@types/node": "^25.8.0",
@@ -50,16 +61,5 @@
50
61
  "typescript",
51
62
  "lending",
52
63
  "documents"
53
- ],
54
- "scripts": {
55
- "codegen": "bash ../../fern/build-public-spec.sh && openapi-typescript ../../fern/api-public.json -o src/generated/api-types.ts && pnpm run check:no-internal-paths",
56
- "check:no-internal-paths": "node scripts/check-no-internal-paths.mjs",
57
- "clean": "rimraf dist",
58
- "build": "pnpm run clean && tsup && node scripts/check-no-internal-paths.mjs --dist",
59
- "dev": "tsup --watch",
60
- "test": "vitest run",
61
- "test:watch": "vitest",
62
- "lint": "eslint \"src/**/*.ts\" \"test/**/*.ts\"",
63
- "typecheck": "tsc --noEmit"
64
- }
65
- }
64
+ ]
65
+ }