@stripe/link-sdk 0.5.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts +5 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1220 -113
- package/dist/index.js.map +1 -1
- package/dist/resources/__tests__/attestations-crypto.test.d.ts +2 -0
- package/dist/resources/__tests__/attestations-crypto.test.d.ts.map +1 -0
- package/dist/resources/__tests__/attestations.test.d.ts +2 -0
- package/dist/resources/__tests__/attestations.test.d.ts.map +1 -0
- package/dist/resources/__tests__/credentials.test.d.ts +2 -0
- package/dist/resources/__tests__/credentials.test.d.ts.map +1 -0
- package/dist/resources/__tests__/holder-jwk.test.d.ts +2 -0
- package/dist/resources/__tests__/holder-jwk.test.d.ts.map +1 -0
- package/dist/resources/__tests__/summaries.test.d.ts +2 -0
- package/dist/resources/__tests__/summaries.test.d.ts.map +1 -0
- package/dist/resources/__tests__/ucp.test.d.ts +2 -0
- package/dist/resources/__tests__/ucp.test.d.ts.map +1 -0
- package/dist/resources/attestations-crypto.d.ts +35 -0
- package/dist/resources/attestations-crypto.d.ts.map +1 -0
- package/dist/resources/attestations.d.ts +14 -0
- package/dist/resources/attestations.d.ts.map +1 -0
- package/dist/resources/balances.d.ts.map +1 -1
- package/dist/resources/base.d.ts +1 -0
- package/dist/resources/base.d.ts.map +1 -1
- package/dist/resources/holder-jwk.d.ts +11 -0
- package/dist/resources/holder-jwk.d.ts.map +1 -0
- package/dist/resources/identity-credentials.d.ts +9 -0
- package/dist/resources/identity-credentials.d.ts.map +1 -0
- package/dist/resources/interfaces.d.ts +86 -1
- package/dist/resources/interfaces.d.ts.map +1 -1
- package/dist/resources/summaries.d.ts +10 -0
- package/dist/resources/summaries.d.ts.map +1 -0
- package/dist/resources/ucp.d.ts +25 -0
- package/dist/resources/ucp.d.ts.map +1 -0
- package/dist/resources/user-info.d.ts.map +1 -1
- package/dist/types/index.d.ts +151 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/resources/balances.ts","../src/errors.ts","../src/config.ts","../src/resources/base.ts","../src/resources/payment-methods.ts","../src/resources/report.ts","../src/resources/shipping-address.ts","../src/resources/sources.ts","../src/resources/spend-request.ts","../src/resources/transactions.ts","../src/resources/user-info.ts","../src/resources/web-bot-auth.ts","../src/client.ts","../src/resources/interfaces.ts"],"sourcesContent":["import { z } from 'zod';\nimport type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type {\n IBalancesResource,\n ListBalancesParams,\n} from '@/resources/interfaces';\nimport type { BalancesPage } from '@/types/index';\n\nconst currencyAmountsSchema = z.record(z.string(), z.number());\nconst balanceSchema = z.looseObject({\n source_id: z.string(),\n type: z.enum(['cash', 'credit']),\n cash: z\n .looseObject({ available: currencyAmountsSchema })\n .nullable()\n .optional(),\n credit: z.looseObject({ used: currencyAmountsSchema }).nullable().optional(),\n current: z.number(),\n currency: z.string(),\n as_of: z.string(),\n});\nconst balancesPageSchema = z.looseObject({\n data: z.array(balanceSchema),\n has_more: z.boolean().optional(),\n});\n\nexport class BalancesResource\n extends BaseResource\n implements IBalancesResource\n{\n constructor(options: LinkOptions) {\n super(options, '/balances');\n }\n\n private buildUrl(params: ListBalancesParams): string {\n const url = new URL(this.endpoint);\n\n if (params.sources !== undefined) {\n for (const source of params.sources) {\n url.searchParams.append('sources[]', source);\n }\n }\n if (params.limit !== undefined) {\n url.searchParams.set('limit', String(params.limit));\n }\n if (params.starting_after !== undefined) {\n url.searchParams.set('starting_after', params.starting_after);\n }\n if (params.ending_before !== undefined) {\n url.searchParams.set('ending_before', params.ending_before);\n }\n\n return url.toString();\n }\n\n async list(params: ListBalancesParams = {}): Promise<BalancesPage> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.buildUrl(params),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('list balances', status, data, rawBody);\n }\n\n return this.parseResponse(\n 'list balances',\n status,\n () => balancesPageSchema.parse(data) as BalancesPage,\n );\n }\n}\n","import { prettifyError, ZodError } from 'zod';\n\nexport class LinkSdkError extends Error {\n readonly code: string;\n\n constructor(message: string, options?: { code?: string; cause?: unknown }) {\n super(message, { cause: options?.cause });\n this.name = new.target.name;\n this.code = options?.code ?? 'sdk_error';\n }\n}\n\nexport class LinkResponseError extends LinkSdkError {\n readonly status: number;\n\n constructor(\n operation: string,\n status: number,\n options?: { cause?: unknown },\n ) {\n const detail =\n options?.cause instanceof ZodError\n ? `: ${prettifyError(options.cause)}`\n : options?.cause instanceof Error\n ? `: ${options.cause.message}`\n : '';\n super(\n `Invalid response while attempting to ${operation} (${status})${detail}`,\n { code: 'invalid_response', cause: options?.cause },\n );\n this.status = status;\n }\n}\n\nexport class LinkConfigurationError extends LinkSdkError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, { code: 'configuration_error', ...options });\n }\n}\n\nexport class LinkTransportError extends LinkSdkError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, { code: 'transport_error', ...options });\n }\n}\n\nexport class LinkApiError extends LinkSdkError {\n readonly status: number;\n readonly rawBody: string | undefined;\n readonly details?: unknown;\n\n constructor(\n message: string,\n options: {\n status: number;\n code?: string;\n rawBody?: string;\n details?: unknown;\n cause?: unknown;\n },\n ) {\n super(message, { code: options.code ?? 'api_error', cause: options.cause });\n this.status = options.status;\n this.rawBody = options.rawBody;\n this.details = options.details;\n }\n}\n","import { LinkConfigurationError } from '@/errors';\nimport type { AccessTokenProvider } from '@/resources/interfaces';\n\nexport interface LinkSdkLogger {\n debug(message: string): void;\n}\n\ninterface LinkClientOptions {\n verbose?: boolean;\n defaultHeaders?: Record<string, string>;\n fetch?: typeof globalThis.fetch;\n apiBaseUrl?: string;\n spendRequestBaseUrl?: string;\n logger?: LinkSdkLogger;\n}\n\nexport type LinkOptions = LinkClientOptions &\n (\n | { accessToken: string; getAccessToken?: never }\n | { accessToken?: never; getAccessToken: AccessTokenProvider }\n );\n\nexport interface ResolvedLinkSdkConfig {\n verbose: boolean;\n getAccessToken: AccessTokenProvider;\n canRefreshAccessToken: boolean;\n fetch?: typeof globalThis.fetch;\n apiBaseUrl: string;\n spendRequestBaseUrl: string;\n logger: LinkSdkLogger;\n}\n\nconst DEFAULT_API_BASE_URL = 'https://api.link.com';\n\nfunction createDefaultHeadersFetch(\n baseFetch: typeof globalThis.fetch,\n defaultHeaders: Record<string, string>,\n): typeof globalThis.fetch {\n return ((input: RequestInfo | URL, init?: RequestInit) => {\n const headers = new Headers(init?.headers);\n for (const [key, value] of Object.entries(defaultHeaders)) {\n if (!headers.has(key)) {\n headers.set(key, value);\n }\n }\n return baseFetch(input, { ...init, headers });\n }) as typeof globalThis.fetch;\n}\n\nexport interface LinkSdkConfigDefaults {\n apiBaseUrl?: string;\n spendRequestBaseUrl?: string;\n}\n\nfunction createDefaultLogger(): LinkSdkLogger {\n return {\n debug() {},\n };\n}\n\nexport function resolveLinkSdkConfig(\n options: LinkOptions,\n defaults: LinkSdkConfigDefaults = {},\n): ResolvedLinkSdkConfig {\n const verbose = options.verbose ?? false;\n const logger = options.logger ?? createDefaultLogger();\n if (\n options.accessToken !== undefined &&\n options.getAccessToken !== undefined\n ) {\n throw new LinkConfigurationError(\n 'Pass either `accessToken` or `getAccessToken`, not both.',\n );\n }\n\n let getAccessToken: AccessTokenProvider;\n let canRefreshAccessToken: boolean;\n if (options.accessToken !== undefined) {\n if (options.accessToken.trim().length === 0) {\n throw new LinkConfigurationError('`accessToken` cannot be empty.');\n }\n const accessToken = options.accessToken;\n getAccessToken = () => accessToken;\n canRefreshAccessToken = false;\n } else if (typeof options.getAccessToken === 'function') {\n getAccessToken = options.getAccessToken;\n canRefreshAccessToken = true;\n } else {\n throw new LinkConfigurationError(\n 'Pass `accessToken` or `getAccessToken` to the Link client.',\n );\n }\n\n const apiBaseUrl =\n options.apiBaseUrl ?? defaults.apiBaseUrl ?? DEFAULT_API_BASE_URL;\n const spendRequestBaseUrl =\n options.spendRequestBaseUrl ?? defaults.spendRequestBaseUrl ?? apiBaseUrl;\n\n const baseFetch = options.fetch ?? globalThis.fetch;\n const effectiveFetch =\n options.defaultHeaders && Object.keys(options.defaultHeaders).length > 0\n ? createDefaultHeadersFetch(baseFetch, options.defaultHeaders)\n : baseFetch;\n\n return {\n verbose,\n getAccessToken,\n canRefreshAccessToken,\n fetch: effectiveFetch,\n apiBaseUrl,\n spendRequestBaseUrl,\n logger,\n };\n}\n\nexport function requireFetchImplementation(\n config: Pick<ResolvedLinkSdkConfig, 'fetch'>,\n): typeof globalThis.fetch {\n if (!config.fetch) {\n throw new LinkConfigurationError(\n 'No fetch implementation available. Pass `fetch` in Link SDK options.',\n );\n }\n\n return config.fetch;\n}\n","import {\n type LinkOptions,\n requireFetchImplementation,\n resolveLinkSdkConfig,\n} from '@/config';\nimport { LinkApiError, LinkResponseError, LinkTransportError } from '@/errors';\nimport type { AccessTokenProvider } from '@/resources/interfaces';\n\nexport interface ApiFetchOptions {\n method: string;\n url: string;\n headers?: Record<string, string>;\n body?: string;\n signal?: AbortSignal;\n}\n\nexport interface ApiFetchResult {\n status: number;\n data: unknown;\n rawBody: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nexport function extractErrorMessage(data: unknown, rawBody: string): string {\n if (isRecord(data)) {\n if (typeof data.error === 'string') {\n return data.error;\n }\n if (isRecord(data.error)) {\n const nested = data.error;\n if (typeof nested.message === 'string') {\n return nested.message;\n }\n if (typeof nested.code === 'string') {\n return nested.code;\n }\n }\n if (typeof data.message === 'string') {\n return data.message;\n }\n }\n\n return rawBody || 'unknown error';\n}\n\nexport abstract class BaseResource {\n protected readonly verbose: boolean;\n protected readonly getAccessToken: AccessTokenProvider;\n protected readonly canRefreshAccessToken: boolean;\n protected readonly fetchImpl: typeof globalThis.fetch;\n protected readonly endpoint: string;\n protected readonly logger: { debug(message: string): void };\n\n constructor(\n options: LinkOptions,\n endpointPath: string,\n base: 'api' | 'spend' = 'api',\n ) {\n const config = resolveLinkSdkConfig(options);\n this.verbose = config.verbose;\n this.getAccessToken = config.getAccessToken;\n this.canRefreshAccessToken = config.canRefreshAccessToken;\n this.fetchImpl = requireFetchImplementation(config);\n const baseUrl =\n base === 'spend' ? config.spendRequestBaseUrl : config.apiBaseUrl;\n this.endpoint = `${baseUrl}${endpointPath}`;\n this.logger = config.logger;\n }\n\n protected async rawFetch(opts: ApiFetchOptions): Promise<ApiFetchResult> {\n if (this.verbose) {\n this.logger.debug(`> ${opts.method} ${opts.url}`);\n }\n\n let response: Response;\n try {\n const init: RequestInit = {\n method: opts.method,\n ...(opts.headers !== undefined && { headers: opts.headers }),\n ...(opts.body !== undefined && { body: opts.body }),\n ...(opts.signal !== undefined && { signal: opts.signal }),\n };\n response = await this.fetchImpl(opts.url, init);\n } catch (error) {\n throw new LinkTransportError(\n `Request failed: ${opts.method} ${opts.url}`,\n { cause: error },\n );\n }\n const rawBody = await response.text();\n\n let data: unknown = null;\n try {\n data = JSON.parse(rawBody);\n } catch {\n // non-JSON response (e.g., from load balancer)\n }\n\n if (this.verbose) {\n this.logger.debug(`< ${response.status} ${response.statusText}`);\n }\n\n return { status: response.status, data, rawBody };\n }\n\n protected async apiFetch(opts: ApiFetchOptions): Promise<ApiFetchResult> {\n const token = await this.getAccessToken();\n const authedOpts = {\n ...opts,\n headers: {\n ...opts.headers,\n Authorization: `Bearer ${token}`,\n },\n };\n\n const res = await this.rawFetch(authedOpts);\n\n if (res.status === 401 && this.canRefreshAccessToken) {\n const refreshedToken = await this.getAccessToken({ forceRefresh: true });\n authedOpts.headers.Authorization = `Bearer ${refreshedToken}`;\n return this.rawFetch(authedOpts);\n }\n\n return res;\n }\n\n protected throwApiError(\n operation: string,\n status: number,\n data: unknown,\n rawBody: string,\n cause?: unknown,\n ): never {\n const msg = extractErrorMessage(data, rawBody);\n throw new LinkApiError(`Failed to ${operation} (${status}): ${msg}`, {\n status,\n rawBody,\n details: data,\n cause,\n });\n }\n\n protected parseResponse<T>(\n operation: string,\n status: number,\n parser: () => T,\n ): T {\n try {\n return parser();\n } catch (error) {\n throw new LinkResponseError(operation, status, { cause: error });\n }\n }\n}\n","import { z } from 'zod';\nimport type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type { IPaymentMethodsResource } from '@/resources/interfaces';\nimport type { PaymentMethod } from '@/types/index';\n\nconst paymentMethodSchema = z.looseObject({\n id: z.string(),\n type: z.string(),\n is_default: z.boolean(),\n name: z.string(),\n nickname: z.optional(z.string().nullable()),\n});\nconst paymentMethodsResponseSchema = z.looseObject({\n payment_details: z.array(paymentMethodSchema),\n});\n\nexport class PaymentMethodsResource\n extends BaseResource\n implements IPaymentMethodsResource\n{\n constructor(options: LinkOptions) {\n super(options, '/payment-details');\n }\n\n async list(): Promise<PaymentMethod[]> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.endpoint,\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('list payment methods', status, data, rawBody);\n }\n\n return this.parseResponse(\n 'list payment methods',\n status,\n () =>\n paymentMethodsResponseSchema.parse(data)\n .payment_details as PaymentMethod[],\n );\n }\n}\n","import { z } from 'zod';\nimport type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type {\n CreateReportParams,\n IReportResource,\n ReportRecord,\n} from '@/resources/interfaces';\n\nconst reportRecordSchema = z.looseObject({\n object: z.string(),\n created_at: z.string(),\n domain: z.string(),\n outcome: z.string(),\n spend_request_id: z.string(),\n status: z.string(),\n});\n\nexport class ReportResource extends BaseResource implements IReportResource {\n constructor(options: LinkOptions) {\n super(options, '/agent_observations');\n }\n\n async create(params: CreateReportParams): Promise<ReportRecord> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url: this.endpoint,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(params),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('create report', status, data, rawBody);\n }\n\n return this.parseResponse('create report', status, () =>\n reportRecordSchema.parse(data),\n );\n }\n}\n","import { z } from 'zod';\nimport type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type { IShippingAddressResource } from '@/resources/interfaces';\nimport type { ShippingAddressRecord } from '@/types/index';\n\nconst shippingAddressSchema = z.looseObject({\n id: z.string(),\n is_default: z.boolean(),\n nickname: z.optional(z.string().nullable()),\n address: z.looseObject({}).nullable(),\n});\nconst shippingAddressesResponseSchema = z.looseObject({\n shipping_addresses: z.array(shippingAddressSchema),\n});\n\nexport class ShippingAddressResource\n extends BaseResource\n implements IShippingAddressResource\n{\n constructor(options: LinkOptions) {\n super(options, '/shipping_addresses');\n }\n\n async list(): Promise<ShippingAddressRecord[]> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.endpoint,\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('list shipping addresses', status, data, rawBody);\n }\n\n return this.parseResponse(\n 'list shipping addresses',\n status,\n () =>\n shippingAddressesResponseSchema.parse(data)\n .shipping_addresses as ShippingAddressRecord[],\n );\n }\n}\n","import { z } from 'zod';\nimport type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type {\n ISourcesResource,\n ListSourcesParams,\n} from '@/resources/interfaces';\nimport type { SourcesPage } from '@/types/index';\n\nconst nullableRecordSchema = z\n .record(z.string(), z.unknown())\n .nullable()\n .optional();\nconst sourceSchema = z.looseObject({\n id: z.string().nullable().optional(),\n name: z.string().nullable().optional(),\n type: z.string().nullable().optional(),\n capabilities: nullableRecordSchema,\n external_connection: nullableRecordSchema,\n granted_actions: z.array(z.string()).nullable().optional(),\n bank_account: nullableRecordSchema,\n card: nullableRecordSchema,\n});\nconst sourcesPageSchema = z.looseObject({\n data: z.array(sourceSchema),\n has_more: z.boolean().optional(),\n});\n\nexport class SourcesResource extends BaseResource implements ISourcesResource {\n constructor(options: LinkOptions) {\n super(options, '/sources');\n }\n\n private buildUrl(params: ListSourcesParams): string {\n const url = new URL(this.endpoint);\n\n if (params.limit !== undefined) {\n url.searchParams.set('limit', String(params.limit));\n }\n if (params.starting_after !== undefined) {\n url.searchParams.set('starting_after', params.starting_after);\n }\n if (params.ending_before !== undefined) {\n url.searchParams.set('ending_before', params.ending_before);\n }\n\n return url.toString();\n }\n\n async list(params: ListSourcesParams = {}): Promise<SourcesPage> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.buildUrl(params),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('list sources', status, data, rawBody);\n }\n\n return this.parseResponse(\n 'list sources',\n status,\n () => sourcesPageSchema.parse(data) as SourcesPage,\n );\n }\n}\n","import { z } from 'zod';\nimport type { LinkOptions } from '@/config';\nimport { LinkApiError } from '@/errors';\nimport { BaseResource } from '@/resources/base';\nimport type {\n CreateSpendRequestParams,\n ISpendRequestResource,\n UpdateSpendRequestParams,\n} from '@/resources/interfaces';\nimport type { RequestApprovalResponse, SpendRequest } from '@/types/index';\n\nconst sharedPaymentTokenSchema = z.union([\n z.string().transform((id) => ({ id })),\n z.looseObject({ id: z.string() }),\n]);\n\nconst spendRequestSchema = z.looseObject({\n id: z.string(),\n payment_details: z.string().optional(),\n status: z.string(),\n line_items: z.array(z.unknown()).optional(),\n totals: z.array(z.unknown()).optional(),\n created_at: z.string(),\n updated_at: z.string(),\n shared_payment_token: sharedPaymentTokenSchema.nullable().optional(),\n});\n\nconst spendRequestsResponseSchema = z.looseObject({\n data: z.array(spendRequestSchema),\n});\n\nconst requestApprovalResponseSchema = z\n .looseObject({\n id: z.string(),\n approval_link: z.string(),\n })\n .transform(({ approval_link, ...response }) => ({\n ...response,\n approval_url: approval_link,\n }));\n\nconst duplicateSpendRequestErrorSchema = z.looseObject({\n error: z.looseObject({\n duplicate_spend_request: z.unknown().optional(),\n }),\n});\n\ntype InternalCreateSpendRequestParams = CreateSpendRequestParams & {\n approve?: boolean;\n expires_at?: number;\n};\n\ntype InternalUpdateSpendRequestParams = UpdateSpendRequestParams & {\n approve?: boolean;\n};\n\n/** Normalizes the legacy string SPT response into the current object shape. */\nfunction parseSpendRequest(value: unknown): SpendRequest {\n return spendRequestSchema.parse(value) as SpendRequest;\n}\n\nexport function getDuplicateSpendRequest(error: unknown): SpendRequest | null {\n if (!(error instanceof LinkApiError)) return null;\n const details = duplicateSpendRequestErrorSchema.safeParse(error.details);\n if (!details.success) return null;\n\n const duplicate = spendRequestSchema.safeParse(\n details.data.error.duplicate_spend_request,\n );\n return duplicate.success ? (duplicate.data as SpendRequest) : null;\n}\n\nexport class SpendRequestResource\n extends BaseResource\n implements ISpendRequestResource\n{\n constructor(options: LinkOptions) {\n super(options, '/spend_requests', 'spend');\n }\n\n async list(opts?: { includeHistory?: boolean }): Promise<SpendRequest[]> {\n const url = opts?.includeHistory\n ? `${this.endpoint}?include_history=true`\n : this.endpoint;\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url,\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('list spend requests', status, data, rawBody);\n }\n\n return this.parseResponse(\n 'list spend requests',\n status,\n () => spendRequestsResponseSchema.parse(data).data as SpendRequest[],\n );\n }\n\n async create(\n params: InternalCreateSpendRequestParams,\n ): Promise<SpendRequest> {\n const { approve, ...body } = params;\n const url = approve ? `${this.endpoint}/create_delegated` : this.endpoint;\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('create spend request', status, data, rawBody);\n }\n return this.parseResponse('create spend request', status, () =>\n parseSpendRequest(data),\n );\n }\n\n async update(\n id: string,\n params: InternalUpdateSpendRequestParams,\n ): Promise<SpendRequest> {\n const { approve, ...body } = params;\n const url = approve\n ? `${this.endpoint}/${id}/update_delegated`\n : `${this.endpoint}/${id}`;\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('update spend request', status, data, rawBody);\n }\n return this.parseResponse('update spend request', status, () =>\n parseSpendRequest(data),\n );\n }\n\n async cancel(id: string): Promise<SpendRequest> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url: `${this.endpoint}/${id}/cancel`,\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('cancel spend request', status, data, rawBody);\n }\n return this.parseResponse('cancel spend request', status, () =>\n parseSpendRequest(data),\n );\n }\n\n async requestApproval(id: string): Promise<RequestApprovalResponse> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url: `${this.endpoint}/${id}/request_approval`,\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('request approval', status, data, rawBody);\n }\n return this.parseResponse('request approval', status, () =>\n requestApprovalResponseSchema.parse(data),\n );\n }\n\n async retrieve(\n id: string,\n opts?: { include?: string[] },\n ): Promise<SpendRequest | null> {\n const url = new URL(`${this.endpoint}/${id}`);\n if (opts?.include?.length) {\n url.searchParams.set('include', opts.include.join(','));\n }\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: url.toString(),\n });\n\n if (status === 404) return null;\n if (status < 200 || status >= 300) {\n this.throwApiError('retrieve spend request', status, data, rawBody);\n }\n return this.parseResponse('retrieve spend request', status, () =>\n parseSpendRequest(data),\n );\n }\n}\n","import { z } from 'zod';\nimport type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type {\n ITransactionsResource,\n ListTransactionsParams,\n} from '@/resources/interfaces';\nimport type { TransactionsPage } from '@/types/index';\n\nconst transactionSchema = z.looseObject({\n id: z.string(),\n source_id: z.string().nullable(),\n amount: z.number(),\n currency: z.string(),\n created_date: z.string(),\n description: z.string(),\n origin: z.enum(['link', 'external_connection']),\n category: z.string().nullable(),\n status: z.string(),\n});\nconst transactionsPageSchema = z.union([\n z.array(transactionSchema).transform((data) => ({ data })),\n z.looseObject({\n data: z.array(transactionSchema),\n has_more: z.boolean().optional(),\n }),\n]);\n\nexport class TransactionsResource\n extends BaseResource\n implements ITransactionsResource\n{\n constructor(options: LinkOptions) {\n super(options, '/transactions');\n }\n\n private buildUrl(params: ListTransactionsParams): string {\n const url = new URL(this.endpoint);\n\n if (params.limit !== undefined) {\n url.searchParams.set('limit', String(params.limit));\n }\n if (params.starting_after !== undefined) {\n url.searchParams.set('starting_after', params.starting_after);\n }\n if (params.ending_before !== undefined) {\n url.searchParams.set('ending_before', params.ending_before);\n }\n if (params.start_date !== undefined) {\n url.searchParams.set('date_start', params.start_date);\n }\n if (params.end_date !== undefined) {\n url.searchParams.set('date_end', params.end_date);\n }\n if (params.category !== undefined) {\n url.searchParams.set('category', params.category);\n }\n if (params.origin !== undefined) {\n url.searchParams.set('origin', params.origin);\n }\n if (params.sources !== undefined) {\n for (const source of params.sources) {\n url.searchParams.append('sources[]', source);\n }\n }\n\n return url.toString();\n }\n\n async list(params: ListTransactionsParams = {}): Promise<TransactionsPage> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.buildUrl(params),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('list transactions', status, data, rawBody);\n }\n\n return this.parseResponse(\n 'list transactions',\n status,\n () => transactionsPageSchema.parse(data) as TransactionsPage,\n );\n }\n}\n","import { z } from 'zod';\nimport type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type { IUserInfoResource } from '@/resources/interfaces';\nimport type { UserInfo } from '@/types/index';\n\nconst rollingSpendLimitSchema = z.object({\n limit: z.number().int().nullable(),\n used: z.number().int(),\n remaining: z.number().int().nullable(),\n});\n\nconst agentWalletSpendLimitsSchema = z.object({\n per_transaction: z.object({\n limit: z.number().int().nullable(),\n }),\n daily: rollingSpendLimitSchema,\n thirty_day: rollingSpendLimitSchema,\n});\n\nconst agentWalletVerificationRequirementSchema = z.object({\n status: z.enum([\n 'not_required',\n 'ssn_verification',\n 'identity_verification',\n 'contact_support',\n 'complete',\n ]),\n action_url: z.string().nullable(),\n});\n\nconst userInfoSchema = z\n .looseObject({\n email: z.string().nullable().optional(),\n name: z.string().nullable().optional(),\n first_name: z.string().nullable().optional(),\n last_name: z.string().nullable().optional(),\n phone: z.string().nullable().optional(),\n agent_wallet_spend_limits: agentWalletSpendLimitsSchema.optional(),\n agent_wallet_step_up: agentWalletVerificationRequirementSchema.optional(),\n })\n .transform(\n ({\n email,\n name,\n first_name,\n last_name,\n phone,\n agent_wallet_spend_limits,\n agent_wallet_step_up,\n }) => ({\n email: email ?? null,\n name: name ?? null,\n first_name: first_name ?? null,\n last_name: last_name ?? null,\n phone: phone ?? null,\n ...(agent_wallet_spend_limits === undefined\n ? {}\n : { agent_wallet_spend_limits }),\n ...(agent_wallet_step_up === undefined\n ? {}\n : { agent_wallet_verification_requirement: agent_wallet_step_up }),\n }),\n );\n\nexport class UserInfoResource\n extends BaseResource\n implements IUserInfoResource\n{\n constructor(options: LinkOptions) {\n super(options, '/userinfo');\n }\n\n async retrieve(): Promise<UserInfo> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.endpoint,\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('retrieve user info', status, data, rawBody);\n }\n\n return this.parseResponse('retrieve user info', status, () =>\n userInfoSchema.parse(data),\n );\n }\n}\n","import { z } from 'zod';\nimport type { LinkOptions } from '@/config';\nimport { LinkSdkError } from '@/errors';\nimport { BaseResource } from '@/resources/base';\nimport type { IWebBotAuthResource } from '@/resources/interfaces';\nimport type { WebBotAuthBlock } from '@/types/index';\n\ninterface CacheEntry {\n block: WebBotAuthBlock;\n expiresAt: number;\n}\n\nconst EXPIRY_BUFFER_MS = 30_000;\n\nconst webBotAuthBlockSchema = z.looseObject({\n signature: z.string(),\n signature_input: z.string(),\n signature_agent: z.string(),\n authority: z.string(),\n expires_at: z.string(),\n});\nconst webBotAuthResponseSchema = z.looseObject({\n web_bot_auth: webBotAuthBlockSchema,\n});\n\nexport class WebBotAuthResource\n extends BaseResource\n implements IWebBotAuthResource\n{\n private readonly cache = new Map<string, CacheEntry>();\n\n constructor(options: LinkOptions) {\n super(options, '/web_bot_auth/sign');\n }\n\n async signUrl(url: string): Promise<WebBotAuthBlock> {\n let authority: string;\n try {\n authority = new URL(url).hostname;\n } catch (error) {\n throw new LinkSdkError(`Invalid URL: ${url}`, { cause: error });\n }\n\n const cached = this.cache.get(authority);\n if (cached && Date.now() < cached.expiresAt - EXPIRY_BUFFER_MS) {\n return cached.block;\n }\n\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url: this.endpoint,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ url }),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('get web bot auth headers', status, data, rawBody);\n }\n\n const webBotAuth = this.parseResponse(\n 'get web bot auth headers',\n status,\n () => webBotAuthResponseSchema.parse(data).web_bot_auth,\n );\n const expiresAt = Date.parse(webBotAuth.expires_at);\n if (Number.isNaN(expiresAt)) {\n throw new LinkSdkError(\n `Credentials response has invalid expires_at: ${webBotAuth.expires_at}`,\n );\n }\n\n this.cache.set(authority, { block: webBotAuth, expiresAt });\n return webBotAuth;\n }\n}\n","import type { LinkOptions } from '@/config';\nimport { BalancesResource } from '@/resources/balances';\nimport type {\n IBalancesResource,\n IPaymentMethodsResource,\n IReportResource,\n IShippingAddressResource,\n ISourcesResource,\n ISpendRequestResource,\n ITransactionsResource,\n IUserInfoResource,\n IWebBotAuthResource,\n} from '@/resources/interfaces';\nimport { PaymentMethodsResource } from '@/resources/payment-methods';\nimport { ReportResource } from '@/resources/report';\nimport { ShippingAddressResource } from '@/resources/shipping-address';\nimport { SourcesResource } from '@/resources/sources';\nimport { SpendRequestResource } from '@/resources/spend-request';\nimport { TransactionsResource } from '@/resources/transactions';\nimport { UserInfoResource } from '@/resources/user-info';\nimport { WebBotAuthResource } from '@/resources/web-bot-auth';\n\nexport class Link {\n readonly spendRequests: ISpendRequestResource;\n readonly paymentMethods: IPaymentMethodsResource;\n readonly shippingAddresses: IShippingAddressResource;\n readonly userInfo: IUserInfoResource;\n readonly transactions: ITransactionsResource;\n readonly sources: ISourcesResource;\n readonly balances: IBalancesResource;\n readonly webBotAuth: IWebBotAuthResource;\n readonly reports: IReportResource;\n\n constructor(options: LinkOptions) {\n this.spendRequests = new SpendRequestResource(options);\n this.paymentMethods = new PaymentMethodsResource(options);\n this.shippingAddresses = new ShippingAddressResource(options);\n this.userInfo = new UserInfoResource(options);\n this.transactions = new TransactionsResource(options);\n this.sources = new SourcesResource(options);\n this.balances = new BalancesResource(options);\n this.webBotAuth = new WebBotAuthResource(options);\n this.reports = new ReportResource(options);\n }\n}\n\nexport default Link;\n","import type {\n ApprovalDetail,\n BalancesPage,\n CredentialType,\n LineItem,\n PaymentMethod,\n RequestApprovalResponse,\n ShippingAddressRecord,\n SourcesPage,\n SpendRequest,\n Total,\n TransactionOrigin,\n TransactionsPage,\n UserInfo,\n WebBotAuthBlock,\n} from '@/types/index';\n\nexport interface GetAccessTokenOptions {\n forceRefresh?: boolean;\n}\n\nexport type AccessTokenProvider = (\n options?: GetAccessTokenOptions,\n) => Promise<string> | string;\n\nexport interface CreateSpendRequestParams {\n idempotency_key?: string;\n payment_details?: string;\n credential_type?: CredentialType;\n network_id?: string;\n execution_method?: 'link_pay_token';\n merchant_account_id?: string;\n amount?: number;\n currency?: string;\n merchant_name?: string;\n merchant_url?: string;\n context: string;\n line_items?: LineItem[];\n totals?: Total[];\n request_approval?: boolean;\n test?: boolean;\n approval_details?: ApprovalDetail;\n metadata?: Record<string, string>;\n}\n\nexport interface UpdateSpendRequestParams {\n payment_details?: string;\n amount?: number;\n merchant_url?: string;\n profile_id?: string;\n merchant_id?: string;\n currency?: string;\n line_items?: LineItem[];\n totals?: Total[];\n}\n\nexport interface ISpendRequestResource {\n list(opts?: { includeHistory?: boolean }): Promise<SpendRequest[]>;\n create(params: CreateSpendRequestParams): Promise<SpendRequest>;\n update(id: string, params: UpdateSpendRequestParams): Promise<SpendRequest>;\n requestApproval(id: string): Promise<RequestApprovalResponse>;\n cancel(id: string): Promise<SpendRequest>;\n retrieve(\n id: string,\n opts?: { include?: string[] },\n ): Promise<SpendRequest | null>;\n}\n\nexport interface IPaymentMethodsResource {\n list(): Promise<PaymentMethod[]>;\n}\n\nexport interface IShippingAddressResource {\n list(): Promise<ShippingAddressRecord[]>;\n}\n\nexport interface IUserInfoResource {\n retrieve(): Promise<UserInfo>;\n}\n\nexport interface IWebBotAuthResource {\n signUrl(url: string): Promise<WebBotAuthBlock>;\n}\n\nexport interface ListTransactionsParams {\n limit?: number;\n starting_after?: string;\n ending_before?: string;\n start_date?: string;\n end_date?: string;\n category?: string;\n origin?: TransactionOrigin;\n sources?: string[];\n}\n\nexport interface ITransactionsResource {\n list(params?: ListTransactionsParams): Promise<TransactionsPage>;\n}\n\nexport interface ListSourcesParams {\n limit?: number;\n starting_after?: string;\n ending_before?: string;\n}\n\nexport interface ISourcesResource {\n list(params?: ListSourcesParams): Promise<SourcesPage>;\n}\n\nexport interface ListBalancesParams {\n sources?: string[];\n limit?: number;\n starting_after?: string;\n ending_before?: string;\n}\n\nexport interface IBalancesResource {\n list(params?: ListBalancesParams): Promise<BalancesPage>;\n}\n\nexport const REPORT_OUTCOMES = ['success', 'blocked', 'abandoned'] as const;\nexport type ReportOutcome = (typeof REPORT_OUTCOMES)[number];\n\nexport const REPORT_TAGS = [\n 'stripe_checkout',\n 'captcha',\n 'anti_bot_script',\n 'cdn_block',\n 'waf_block',\n 'dns_block',\n 'rate_limited',\n 'login_required',\n '3ds_challenge',\n 'page_inaccessible',\n 'timeout',\n 'site_error',\n 'payment_declined',\n 'other',\n] as const;\nexport type ReportTag = (typeof REPORT_TAGS)[number];\n\n/**\n * Server-side cap on `attempt_trace`. Longer values are truncated by the API\n * rather than rejected, so callers do not need to pre-trim.\n */\nexport const REPORT_ATTEMPT_TRACE_MAX_LENGTH = 8000;\n\nexport interface CreateReportParams {\n domain: string;\n outcome: ReportOutcome;\n spend_request_id: string;\n tags?: ReportTag[];\n step?: string;\n freeform_context?: string;\n attempt_trace?: string;\n}\n\nexport interface ReportRecord {\n object: string;\n created_at: string;\n domain: string;\n outcome: string;\n spend_request_id: string;\n status: string;\n}\n\nexport interface IReportResource {\n create(params: CreateReportParams): Promise<ReportRecord>;\n}\n"],"mappings":"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","names":["z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z"]}
|
|
1
|
+
{"version":3,"sources":["../src/resources/attestations.ts","../src/errors.ts","../src/resources/attestations-crypto.ts","../src/config.ts","../src/resources/base.ts","../src/resources/balances.ts","../src/resources/identity-credentials.ts","../src/resources/holder-jwk.ts","../src/resources/payment-methods.ts","../src/resources/report.ts","../src/resources/shipping-address.ts","../src/resources/sources.ts","../src/resources/spend-request.ts","../src/resources/summaries.ts","../src/resources/transactions.ts","../src/resources/ucp.ts","../src/resources/user-info.ts","../src/resources/web-bot-auth.ts","../src/client.ts","../src/resources/interfaces.ts"],"sourcesContent":["/**\n * Fetches and issues Blind RSA attestations exclusively through api.link.com.\n * This module handles discovery and batch wire formats; the cryptographic\n * operations live in attestations-crypto.ts.\n */\nimport { createHash } from 'node:crypto';\nimport { z } from 'zod';\nimport type { LinkOptions } from '@/config';\nimport {\n LinkApiError,\n LinkConfigurationError,\n LinkResponseError,\n LinkTransportError,\n} from '@/errors';\nimport {\n base64urlEncode,\n computeChallengeDigest,\n type FinalToken,\n generateBlindedMessages,\n unblindSignatures,\n} from '@/resources/attestations-crypto';\nimport { BaseResource } from '@/resources/base';\nimport type {\n AttestationRequestParams,\n AttestationRequestResult,\n IAttestationsResource,\n} from '@/resources/interfaces';\n\nconst TOKEN_TYPE_BLIND_RSA = 0x0002;\nconst CONTENT_TYPE_TOKEN_REQUEST =\n 'application/private-token-generic-batch-request';\nconst CONTENT_TYPE_TOKEN_RESPONSE =\n 'application/private-token-generic-batch-response';\nconst LINK_ISSUER = 'https://api.link.com';\nconst LINK_ISSUER_HOSTNAME = 'api.link.com';\nconst LINK_ISSUER_METADATA_URL = `${LINK_ISSUER}/.well-known/aap-issuer`;\n\nconst issuerMetadataSchema = z.looseObject({\n issuer: z.literal(LINK_ISSUER),\n token_issuance_endpoint: z.string(),\n token_keys: z.string(),\n});\n\nconst tokenKeyDirectorySchema = z.looseObject({\n 'token-keys': z.array(\n z.looseObject({\n 'token-type': z.number(),\n 'token-key': z.string(),\n 'not-before': z.number().int().nonnegative().optional(),\n }),\n ),\n});\n\n/** Decodes a standard or URL-safe base64 key value. */\nfunction base64ToBytes(value: string): Uint8Array {\n const normalized = value.replace(/-/g, '+').replace(/_/g, '/');\n return new Uint8Array(Buffer.from(normalized, 'base64'));\n}\n\n/** Returns the shortest QUIC varint width that can hold a value. */\nfunction minQuicVarintLength(value: number): 1 | 2 | 4 | 8 {\n if (value < 2 ** 6) return 1;\n if (value < 2 ** 14) return 2;\n if (value < 2 ** 30) return 4;\n return 8;\n}\n\n/** Encodes a non-negative integer using the QUIC variable-length format. */\nfunction encodeQuicVarint(value: number): Buffer {\n if (!Number.isSafeInteger(value) || value < 0 || value >= 2 ** 62) {\n throw new Error(`Cannot encode ${value} as a QUIC variable-length integer`);\n }\n const length = minQuicVarintLength(value);\n const encoded = Buffer.alloc(length);\n let remaining = BigInt(value);\n for (let index = length - 1; index >= 0; index--) {\n encoded[index] = Number(remaining & 0xffn);\n remaining >>= 8n;\n }\n encoded[0] = encoded.readUInt8(0) | (Math.log2(length) << 6);\n return encoded;\n}\n\n/** Reads one minimally encoded QUIC variable-length integer. */\nfunction readQuicVarint(\n body: Buffer,\n offset = 0,\n): { value: number; length: number } {\n const first = body[offset];\n if (first === undefined) throw new Error('QUIC varint is absent');\n const length = 1 << (first >> 6);\n if (body.length < offset + length)\n throw new Error('QUIC varint is truncated');\n\n let value = BigInt(first & 0x3f);\n for (let index = 1; index < length; index++) {\n value = (value << 8n) | BigInt(body.readUInt8(offset + index));\n }\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error('QUIC varint exceeds the JavaScript safe integer range');\n }\n const numeric = Number(value);\n if (minQuicVarintLength(numeric) !== length) {\n throw new Error('QUIC varint is not minimally encoded');\n }\n return { value: numeric, length };\n}\n\n/** Encodes blinded messages as one generic batch token request. */\nfunction encodeBatchTokenRequest(\n blindedMessages: Uint8Array[],\n truncatedTokenKeyId: number,\n): Buffer {\n const entries = blindedMessages.map((blindedMessage) => {\n const entry = Buffer.alloc(3 + blindedMessage.length);\n entry.writeUInt16BE(TOKEN_TYPE_BLIND_RSA, 0);\n entry.writeUInt8(truncatedTokenKeyId, 2);\n Buffer.from(blindedMessage).copy(entry, 3);\n return entry;\n });\n\n const vector = Buffer.concat(entries);\n return Buffer.concat([encodeQuicVarint(vector.length), vector]);\n}\n\n/** Extracts the Blind RSA signatures from a generic batch response. */\nfunction decodeBatchTokenResponse(\n body: Buffer,\n elementSize: number,\n expectedCount: number,\n): string[] {\n const prefix = readQuicVarint(body);\n const vector = body.subarray(prefix.length);\n if (vector.length !== prefix.value) {\n throw new Error(\n `BatchTokenResponse length prefix says ${prefix.value} bytes but ${vector.length} bytes follow`,\n );\n }\n if (vector.length === 0)\n throw new Error('BatchTokenResponse vector is empty');\n\n const signatures: string[] = [];\n let offset = 0;\n while (offset < vector.length) {\n const present = vector[offset++];\n if (present === 0) {\n throw new Error(\n `Issuer refused token request at index ${signatures.length}`,\n );\n }\n if (present !== 1) {\n throw new Error(`Invalid OptionalTokenResponse presence byte ${present}`);\n }\n if (offset + 2 + elementSize > vector.length) {\n throw new Error('Present GenericTokenResponse is truncated');\n }\n const tokenType = vector.readUInt16BE(offset);\n offset += 2;\n if (tokenType !== TOKEN_TYPE_BLIND_RSA) {\n throw new Error(\n `GenericTokenResponse has unsupported token type 0x${tokenType.toString(16).padStart(4, '0')}`,\n );\n }\n signatures.push(\n base64urlEncode(\n new Uint8Array(vector.subarray(offset, offset + elementSize)),\n ),\n );\n offset += elementSize;\n }\n if (signatures.length !== expectedCount) {\n throw new Error(\n `Issuer returned ${signatures.length} token responses for ${expectedCount} token requests`,\n );\n }\n return signatures;\n}\n\n/** Accepts a discovered endpoint only when it remains on api.link.com. */\nfunction requireLinkEndpoint(value: string, field: string): string {\n let url: URL;\n try {\n url = new URL(value);\n } catch (error) {\n throw new TypeError(`${field} is not a valid URL`, { cause: error });\n }\n if (\n url.protocol !== 'https:' ||\n url.origin !== LINK_ISSUER ||\n url.username ||\n url.password\n ) {\n throw new TypeError(`${field} must be an HTTPS URL on ${LINK_ISSUER}`);\n }\n return url.href;\n}\n\nexport class AttestationsResource\n extends BaseResource\n implements IAttestationsResource\n{\n /** Creates an attestation resource using the SDK's authentication config. */\n constructor(options: LinkOptions) {\n super(options, '');\n }\n\n /** Fetches JSON without following redirects and normalizes API errors. */\n private async fetchJson(\n url: string,\n operation: string,\n ): Promise<{ data: unknown; status: number }> {\n let response: Response;\n try {\n response = await this.fetchImpl(url, { redirect: 'manual' });\n } catch (error) {\n throw new LinkTransportError(`Request failed: GET ${url}`, {\n cause: error,\n });\n }\n\n const rawBody = await response.text();\n if (response.status >= 300 && response.status < 400) {\n throw new LinkApiError(\n `Refused redirect while attempting to ${operation} (${response.status})`,\n {\n status: response.status,\n rawBody,\n },\n );\n }\n let data: unknown = null;\n try {\n data = JSON.parse(rawBody);\n } catch (error) {\n if (response.ok) {\n throw new LinkResponseError(operation, response.status, {\n cause: error,\n });\n }\n }\n\n if (!response.ok) {\n throw new LinkApiError(\n `Failed to ${operation} (${response.status}): ${rawBody}`,\n {\n status: response.status,\n rawBody,\n details: data,\n },\n );\n }\n return { data, status: response.status };\n }\n\n /** Sends a blinded batch with the current or refreshed access token. */\n private async issueTokens(\n url: string,\n body: Uint8Array,\n forceRefresh = false,\n ): Promise<Response> {\n const token = await this.getAccessToken(\n forceRefresh ? { forceRefresh: true } : undefined,\n );\n const requestBody = new ArrayBuffer(body.byteLength);\n new Uint8Array(requestBody).set(body);\n try {\n return await this.fetchImpl(url, {\n method: 'POST',\n redirect: 'manual',\n headers: {\n 'Content-Type': CONTENT_TYPE_TOKEN_REQUEST,\n Accept: CONTENT_TYPE_TOKEN_RESPONSE,\n Authorization: `Bearer ${token}`,\n },\n body: requestBody,\n });\n } catch (error) {\n throw new LinkTransportError(`Request failed: POST ${url}`, {\n cause: error,\n });\n }\n }\n\n /** Requests, verifies, and returns a batch of Link attestation tokens. */\n async request(\n params: AttestationRequestParams,\n ): Promise<AttestationRequestResult> {\n const { count } = params;\n if (!Number.isInteger(count) || count < 1 || count > 100) {\n throw new LinkConfigurationError(\n 'Attestation token count must be an integer from 1 to 100',\n );\n }\n const metadataResponse = await this.fetchJson(\n LINK_ISSUER_METADATA_URL,\n 'fetch issuer metadata',\n );\n const metadata = this.parseResponse(\n 'parse issuer metadata',\n metadataResponse.status,\n () => issuerMetadataSchema.parse(metadataResponse.data),\n );\n let tokenKeysUrl: string;\n let issuanceUrl: string;\n try {\n tokenKeysUrl = requireLinkEndpoint(metadata.token_keys, 'token_keys');\n issuanceUrl = requireLinkEndpoint(\n metadata.token_issuance_endpoint,\n 'token_issuance_endpoint',\n );\n } catch (error) {\n throw new LinkResponseError(\n 'validate issuer metadata',\n metadataResponse.status,\n { cause: error },\n );\n }\n const directoryResponse = await this.fetchJson(\n tokenKeysUrl,\n 'fetch token keys',\n );\n const directory = this.parseResponse(\n 'parse token key directory',\n directoryResponse.status,\n () => tokenKeyDirectorySchema.parse(directoryResponse.data),\n );\n const now = Math.floor(Date.now() / 1000);\n const tokenKey = directory['token-keys'].find(\n (entry) =>\n entry['token-type'] === TOKEN_TYPE_BLIND_RSA &&\n (entry['not-before'] === undefined || entry['not-before'] <= now),\n );\n if (!tokenKey) {\n throw new LinkResponseError(\n 'select Blind RSA token key',\n directoryResponse.status,\n {\n cause: new Error(\n 'No active token key with type 0x0002 found in directory',\n ),\n },\n );\n }\n\n const spkiDer = base64ToBytes(tokenKey['token-key']);\n const challengeDigest = computeChallengeDigest(\n TOKEN_TYPE_BLIND_RSA,\n LINK_ISSUER_HOSTNAME,\n );\n const blindingState = generateBlindedMessages(\n spkiDer,\n count,\n challengeDigest,\n );\n const tokenKeyIdBytes = new Uint8Array(\n createHash('sha256').update(spkiDer).digest(),\n );\n const truncatedTokenKeyId = tokenKeyIdBytes.at(-1);\n if (truncatedTokenKeyId === undefined) {\n throw new LinkResponseError('derive Blind RSA token key ID', 200);\n }\n const requestBody = encodeBatchTokenRequest(\n blindingState.tokens.map((token) => token.blindedMsg),\n truncatedTokenKeyId,\n );\n\n let issueResponse = await this.issueTokens(\n issuanceUrl,\n new Uint8Array(requestBody),\n );\n if (issueResponse.status === 401 && this.canRefreshAccessToken) {\n issueResponse = await this.issueTokens(\n issuanceUrl,\n new Uint8Array(requestBody),\n true,\n );\n }\n\n if (!issueResponse.ok) {\n const rawBody = await issueResponse.text();\n throw new LinkApiError(\n `Failed to issue attestation tokens (${issueResponse.status}): ${rawBody}`,\n {\n status: issueResponse.status,\n rawBody,\n },\n );\n }\n\n let blindSignatures: string[];\n try {\n blindSignatures = decodeBatchTokenResponse(\n Buffer.from(await issueResponse.arrayBuffer()),\n blindingState.publicKey.nLen,\n count,\n );\n } catch (error) {\n throw new LinkResponseError(\n 'decode attestation token response',\n issueResponse.status,\n { cause: error },\n );\n }\n const finalTokens: FinalToken[] = unblindSignatures(\n blindingState,\n blindSignatures,\n );\n\n return {\n tokens: finalTokens.map((finalToken) => finalToken.base64url),\n issuer: LINK_ISSUER,\n token_key_id: base64urlEncode(blindingState.tokenKeyId),\n count: finalTokens.length,\n };\n }\n}\n","import { prettifyError, ZodError } from 'zod';\n\nexport class LinkSdkError extends Error {\n readonly code: string;\n\n constructor(message: string, options?: { code?: string; cause?: unknown }) {\n super(message, { cause: options?.cause });\n this.name = new.target.name;\n this.code = options?.code ?? 'sdk_error';\n }\n}\n\nexport class LinkResponseError extends LinkSdkError {\n readonly status: number;\n\n constructor(\n operation: string,\n status: number,\n options?: { cause?: unknown },\n ) {\n const detail =\n options?.cause instanceof ZodError\n ? `: ${prettifyError(options.cause)}`\n : options?.cause instanceof Error\n ? `: ${options.cause.message}`\n : '';\n super(\n `Invalid response while attempting to ${operation} (${status})${detail}`,\n { code: 'invalid_response', cause: options?.cause },\n );\n this.status = status;\n }\n}\n\nexport class LinkConfigurationError extends LinkSdkError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, { code: 'configuration_error', ...options });\n }\n}\n\nexport class LinkTransportError extends LinkSdkError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, { code: 'transport_error', ...options });\n }\n}\n\nexport class LinkApiError extends LinkSdkError {\n readonly status: number;\n readonly rawBody: string | undefined;\n readonly details?: unknown;\n\n constructor(\n message: string,\n options: {\n status: number;\n code?: string;\n rawBody?: string;\n details?: unknown;\n cause?: unknown;\n },\n ) {\n super(message, { code: options.code ?? 'api_error', cause: options.cause });\n this.status = options.status;\n this.rawBody = options.rawBody;\n this.details = options.details;\n }\n}\n","/**\n * Client-side Blind RSA for Privacy Pass token type 0x0002.\n *\n * The client builds the token input, PSS-encodes and blinds it, then sends\n * only the blinded message to the issuer. After signing, the client unblinds\n * and verifies the signature before assembling the final token. This module\n * implements only the RFC 9578 profile: 2048-bit RSA, SHA-384, and a 48-byte\n * PSS salt.\n */\nimport {\n createHash,\n createPublicKey,\n randomBytes,\n timingSafeEqual,\n} from 'node:crypto';\n\nconst TOKEN_TYPE = 0x0002;\nconst NONCE_SIZE = 32;\nconst CHALLENGE_DIGEST_SIZE = 32;\nconst TOKEN_KEY_ID_SIZE = 32;\n\n/** RSA public values needed by the blinding and verification operations. */\ninterface RsaPublicKey {\n n: bigint;\n e: bigint;\n nLen: number;\n}\n\n/** Per-token secrets retained locally while the issuer signs the blind. */\ninterface BlindedToken {\n nonce: Uint8Array;\n blindedMsg: Uint8Array;\n blindInverse: bigint;\n encodedMessage: Uint8Array;\n}\n\n/** Local state needed to finalize a batch of blinded token requests. */\nexport interface BlindingState {\n tokens: BlindedToken[];\n publicKey: RsaPublicKey;\n challengeDigest: Uint8Array;\n tokenKeyId: Uint8Array;\n}\n\n/** A complete binary token and its base64url transport form. */\nexport interface FinalToken {\n raw: Uint8Array;\n base64url: string;\n}\n\n/** Encodes bytes as unpadded base64url. */\nexport function base64urlEncode(buf: Uint8Array): string {\n return Buffer.from(buf).toString('base64url');\n}\n\n/** Decodes an unpadded base64url value into bytes. */\nfunction base64urlDecode(str: string): Uint8Array {\n return new Uint8Array(Buffer.from(str, 'base64url'));\n}\n\n/** Interprets big-endian bytes as a non-negative integer. */\nfunction bytesToBigInt(bytes: Uint8Array): bigint {\n let hex = '';\n for (const b of bytes) {\n hex += b.toString(16).padStart(2, '0');\n }\n return hex.length === 0 ? 0n : BigInt(`0x${hex}`);\n}\n\n/** Serializes a non-negative integer to an exact-length big-endian buffer. */\nfunction bigIntToBytes(n: bigint, length: number): Uint8Array {\n if (!Number.isInteger(length) || length < 0) {\n throw new Error('Integer encoding length must be a non-negative integer');\n }\n if (n < 0n || n >= 1n << BigInt(length * 8)) {\n throw new Error(`Integer does not fit in ${length} bytes`);\n }\n const hex = n.toString(16).padStart(length * 2, '0');\n const bytes = new Uint8Array(length);\n for (let i = 0; i < length; i++) {\n bytes[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n}\n\n/** Returns the number of significant bits in a positive integer. */\nfunction bitLength(value: bigint): number {\n if (value <= 0n) throw new Error('Bit length requires a positive integer');\n return value.toString(2).length;\n}\n\n/** Computes base^exp modulo mod with square-and-multiply. */\nfunction modPow(base: bigint, exp: bigint, mod: bigint): bigint {\n let result = 1n;\n let b = ((base % mod) + mod) % mod;\n let e = exp;\n while (e > 0n) {\n if (e & 1n) {\n result = (result * b) % mod;\n }\n e >>= 1n;\n b = (b * b) % mod;\n }\n return result;\n}\n\n/** Computes a modular inverse, failing when the values are not coprime. */\nfunction modInverse(a: bigint, m: bigint): bigint {\n let [oldR, r] = [a, m];\n let [oldS, s] = [1n, 0n];\n while (r !== 0n) {\n const q = oldR / r;\n [oldR, r] = [r, oldR - q * r];\n [oldS, s] = [s, oldS - q * s];\n }\n if (oldR !== 1n) {\n throw new Error('Value has no modular inverse');\n }\n return ((oldS % m) + m) % m;\n}\n\n/** Computes the greatest common divisor with Euclid's algorithm. */\nfunction greatestCommonDivisor(a: bigint, b: bigint): bigint {\n let x = a < 0n ? -a : a;\n let y = b < 0n ? -b : b;\n while (y !== 0n) {\n [x, y] = [y, x % y];\n }\n return x;\n}\n\n/** Extracts the RSA modulus and exponent from a DER-encoded SPKI key. */\nfunction parseSpkiPublicKey(spkiDer: Uint8Array): RsaPublicKey {\n let keyObject: ReturnType<typeof createPublicKey>;\n try {\n keyObject = createPublicKey({\n key: Buffer.from(spkiDer),\n format: 'der',\n type: 'spki',\n });\n } catch (error) {\n throw new Error('Invalid RSA issuer public key', { cause: error });\n }\n const details = keyObject.asymmetricKeyDetails;\n if (\n keyObject.asymmetricKeyType !== 'rsa-pss' ||\n details?.modulusLength !== 2048 ||\n details.hashAlgorithm !== 'sha384' ||\n details.mgf1HashAlgorithm !== 'sha384' ||\n details.saltLength !== 48\n ) {\n throw new Error(\n 'Issuer key must use 2048-bit RSA-PSS with SHA-384, MGF1-SHA-384, and a 48-byte salt',\n );\n }\n\n // SubjectPublicKeyInfo ::= SEQUENCE { algorithm AlgorithmIdentifier, subjectPublicKey BIT STRING }\n // RSAPublicKey ::= SEQUENCE { modulus INTEGER, publicExponent INTEGER }\n //\n // The DER must be walked structurally, not scanned for tag bytes: an\n // id-RSASSA-PSS AlgorithmIdentifier carries nested hash/MGF1/saltLength\n // parameters whose bytes include values that look like BIT STRING and\n // INTEGER tags.\n const spki = readSequence(spkiDer, 0);\n\n // Skip the AlgorithmIdentifier, then read the BIT STRING that follows it.\n const algorithm = readTlv(spkiDer, spki.contentStart);\n const bitString = readTlv(spkiDer, algorithm.end);\n if (bitString.tag !== 0x03) {\n throw new Error(\n `Expected BIT STRING in SPKI, got 0x${bitString.tag.toString(16)}`,\n );\n }\n if (\n bitString.contentStart >= bitString.end ||\n spkiDer[bitString.contentStart] !== 0\n ) {\n throw new Error('RSA SPKI BIT STRING must have zero unused bits');\n }\n\n // First content byte of a BIT STRING is the unused-bits count (0 here).\n const rsaPublicKeyDer = spkiDer.slice(\n bitString.contentStart + 1,\n bitString.end,\n );\n\n const rsaPublicKey = readSequence(rsaPublicKeyDer, 0);\n const modulus = readInteger(rsaPublicKeyDer, rsaPublicKey.contentStart);\n const exponent = readInteger(rsaPublicKeyDer, modulus.end);\n const n = bytesToBigInt(modulus.value);\n const e = bytesToBigInt(exponent.value);\n\n if (modulus.value.length !== 256 || bitLength(n) !== 2048) {\n throw new Error('Token type 0x0002 requires a 2048-bit RSA modulus');\n }\n if (e < 3n || e % 2n === 0n) {\n throw new Error('RSA public exponent must be an odd integer of at least 3');\n }\n\n return {\n n,\n e,\n nLen: modulus.value.length,\n };\n}\n\n/** Bounds for a parsed DER tag-length-value element. */\ninterface Tlv {\n tag: number;\n contentStart: number;\n end: number;\n}\n\n/** Reads one DER tag-length-value element and checks its bounds. */\nfunction readTlv(data: Uint8Array, offset: number): Tlv {\n if (offset >= data.length) {\n throw new Error(`Unexpected end of DER at offset ${offset}`);\n }\n const tag = data[offset];\n if (tag === undefined) {\n throw new Error(`Unexpected end of DER at offset ${offset}`);\n }\n const { value: length, bytesRead } = parseDerLength(data, offset + 1);\n const contentStart = offset + 1 + bytesRead;\n const end = contentStart + length;\n if (end > data.length) {\n throw new Error(`DER element at offset ${offset} overruns the buffer`);\n }\n return { tag, contentStart, end };\n}\n\n/** Reads a DER SEQUENCE element. */\nfunction readSequence(data: Uint8Array, offset: number): Tlv {\n const tlv = readTlv(data, offset);\n if (tlv.tag !== 0x30) {\n throw new Error(\n `Expected SEQUENCE at offset ${offset}, got 0x${tlv.tag.toString(16)}`,\n );\n }\n return tlv;\n}\n\n/** Reads a positive DER INTEGER and removes its optional sign byte. */\nfunction readInteger(\n data: Uint8Array,\n offset: number,\n): { value: Uint8Array; end: number } {\n const tlv = readTlv(data, offset);\n if (tlv.tag !== 0x02) {\n throw new Error(\n `Expected INTEGER at offset ${offset}, got 0x${tlv.tag.toString(16)}`,\n );\n }\n let value = data.slice(tlv.contentStart, tlv.end);\n // Strip the DER sign byte.\n if (value.length > 1 && value[0] === 0x00) {\n value = value.slice(1);\n }\n return { value, end: tlv.end };\n}\n\n/** Decodes a DER short- or long-form length. */\nfunction parseDerLength(\n data: Uint8Array,\n offset: number,\n): { value: number; bytesRead: number } {\n const first = data[offset];\n if (first === undefined) {\n throw new Error(`Unexpected end of DER at offset ${offset}`);\n }\n if (first < 0x80) {\n return { value: first, bytesRead: 1 };\n }\n const numBytes = first & 0x7f;\n if (numBytes === 0 || offset + numBytes >= data.length) {\n throw new Error(`Invalid DER length at offset ${offset}`);\n }\n let value = 0;\n for (let i = 0; i < numBytes; i++) {\n const byte = data[offset + 1 + i];\n if (byte === undefined) {\n throw new Error(`Unexpected end of DER at offset ${offset + 1 + i}`);\n }\n value = value * 256 + byte;\n }\n return { value, bytesRead: 1 + numBytes };\n}\n\n/** PSS-encodes a message with SHA-384 and a fresh 48-byte salt. */\nfunction emsaPssEncode(message: Uint8Array, emBits: number): Uint8Array {\n const hashAlg = 'sha384';\n const hLen = 48; // SHA-384 output\n const sLen = 48; // salt length = hash length for RSABSSA-SHA384-PSS\n const emLen = Math.ceil(emBits / 8);\n\n const mHash = createHash(hashAlg).update(message).digest();\n if (emLen < hLen + sLen + 2) {\n throw new Error('Encoding error: emLen too small');\n }\n\n const salt = randomBytes(sLen);\n // M' = (0x)00 00 00 00 00 00 00 00 || mHash || salt\n const mPrime = Buffer.concat([Buffer.alloc(8), mHash, salt]);\n const h = createHash(hashAlg).update(mPrime).digest();\n\n const ps = Buffer.alloc(emLen - sLen - hLen - 2);\n const db = Buffer.concat([ps, Buffer.from([0x01]), salt]);\n\n const dbMask = mgf1(h, db.length, hashAlg);\n const maskedDb = Buffer.alloc(db.length);\n for (let i = 0; i < db.length; i++) {\n maskedDb.writeUInt8(db.readUInt8(i) ^ dbMask.readUInt8(i), i);\n }\n\n // Set the leftmost bits to zero.\n const topBits = 8 * emLen - emBits;\n maskedDb.writeUInt8(maskedDb.readUInt8(0) & (0xff >> topBits), 0);\n\n return new Uint8Array(Buffer.concat([maskedDb, h, Buffer.from([0xbc])]));\n}\n\n/** Expands a seed with MGF1 to the requested number of bytes. */\nfunction mgf1(seed: Buffer, length: number, hashAlg: string): Buffer {\n const hLen = hashAlg === 'sha384' ? 48 : 32;\n const result = Buffer.alloc(length);\n let offset = 0;\n let counter = 0;\n\n while (offset < length) {\n const c = Buffer.alloc(4);\n c.writeUInt32BE(counter);\n const hash = createHash(hashAlg).update(seed).update(c).digest();\n const toCopy = Math.min(hLen, length - offset);\n hash.copy(result, offset, 0, toCopy);\n offset += toCopy;\n counter++;\n }\n\n return result;\n}\n\n/** Samples a uniform invertible blinding factor from [1, n). */\nfunction generateBlindingFactor(\n n: bigint,\n nLen: number,\n): { r: bigint; rInv: bigint } {\n while (true) {\n const rBytes = randomBytes(nLen);\n const r = bytesToBigInt(new Uint8Array(rBytes));\n if (r < 1n || r >= n) continue;\n try {\n const rInv = modInverse(r, n);\n return { r, rInv };\n } catch {\n // A non-invertible sample is negligible for an honest RSA modulus.\n }\n }\n}\n\n/** Creates blinded issuer requests and retains the state needed to finalize them. */\nexport function generateBlindedMessages(\n spkiDer: Uint8Array,\n count: number,\n challengeDigest: Uint8Array,\n): BlindingState {\n if (!Number.isInteger(count) || count < 1 || count > 100) {\n throw new Error('Token count must be an integer from 1 to 100');\n }\n if (challengeDigest.length !== CHALLENGE_DIGEST_SIZE) {\n throw new Error('Challenge digest must be exactly 32 bytes');\n }\n\n const publicKey = parseSpkiPublicKey(spkiDer);\n const tokenKeyId = new Uint8Array(\n createHash('sha256').update(spkiDer).digest(),\n );\n\n const emBits = bitLength(publicKey.n) - 1;\n const tokens: BlindedToken[] = [];\n\n for (let i = 0; i < count; i++) {\n const nonce = new Uint8Array(randomBytes(NONCE_SIZE));\n const tokenInput = new Uint8Array(\n 2 + NONCE_SIZE + CHALLENGE_DIGEST_SIZE + TOKEN_KEY_ID_SIZE,\n );\n tokenInput[0] = (TOKEN_TYPE >> 8) & 0xff;\n tokenInput[1] = TOKEN_TYPE & 0xff;\n tokenInput.set(nonce, 2);\n tokenInput.set(challengeDigest, 2 + NONCE_SIZE);\n tokenInput.set(tokenKeyId, 2 + NONCE_SIZE + CHALLENGE_DIGEST_SIZE);\n\n const encoded = emsaPssEncode(tokenInput, emBits);\n const message = bytesToBigInt(encoded);\n if (greatestCommonDivisor(message, publicKey.n) !== 1n) {\n throw new Error(\n 'PSS-encoded token input is not coprime to the RSA modulus',\n );\n }\n const { r, rInv } = generateBlindingFactor(publicKey.n, publicKey.nLen);\n const blindedMessage =\n (message * modPow(r, publicKey.e, publicKey.n)) % publicKey.n;\n\n tokens.push({\n nonce,\n blindedMsg: bigIntToBytes(blindedMessage, publicKey.nLen),\n blindInverse: rInv,\n encodedMessage: encoded,\n });\n }\n\n return { tokens, publicKey, challengeDigest, tokenKeyId };\n}\n\n/** Unblinds issuer responses, verifies them, and assembles complete tokens. */\nexport function unblindSignatures(\n state: BlindingState,\n blindSigs: string[],\n): FinalToken[] {\n const { tokens, publicKey, tokenKeyId } = state;\n\n if (blindSigs.length !== tokens.length) {\n throw new Error(\n `Expected ${tokens.length} blind signatures, got ${blindSigs.length}`,\n );\n }\n\n const results: FinalToken[] = [];\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n const blindSignature = blindSigs[i];\n if (!token || blindSignature === undefined) {\n throw new Error(`Missing blind signature state at index ${i}`);\n }\n const blindSigBytes = base64urlDecode(blindSignature);\n if (blindSigBytes.length !== publicKey.nLen) {\n throw new Error(\n `Blind signature ${i} must be exactly ${publicKey.nLen} bytes`,\n );\n }\n const blindSigInt = bytesToBigInt(blindSigBytes);\n const sigInt = (blindSigInt * token.blindInverse) % publicKey.n;\n const authenticator = bigIntToBytes(sigInt, publicKey.nLen);\n const recoveredMessage = bigIntToBytes(\n modPow(sigInt, publicKey.e, publicKey.n),\n publicKey.nLen,\n );\n if (\n !timingSafeEqual(\n Buffer.from(recoveredMessage),\n Buffer.from(token.encodedMessage),\n )\n ) {\n throw new Error(`Blind signature ${i} failed verification`);\n }\n\n const raw = new Uint8Array(\n 2 +\n NONCE_SIZE +\n CHALLENGE_DIGEST_SIZE +\n TOKEN_KEY_ID_SIZE +\n publicKey.nLen,\n );\n raw[0] = (TOKEN_TYPE >> 8) & 0xff;\n raw[1] = TOKEN_TYPE & 0xff;\n raw.set(token.nonce, 2);\n raw.set(state.challengeDigest, 2 + NONCE_SIZE);\n raw.set(tokenKeyId, 2 + NONCE_SIZE + CHALLENGE_DIGEST_SIZE);\n raw.set(\n authenticator,\n 2 + NONCE_SIZE + CHALLENGE_DIGEST_SIZE + TOKEN_KEY_ID_SIZE,\n );\n\n results.push({\n raw,\n base64url: base64urlEncode(raw),\n });\n }\n\n return results;\n}\n\n/** Hashes the canonical empty-context TokenChallenge used for issuance. */\nexport function computeChallengeDigest(\n tokenType: number,\n issuerName: string,\n): Uint8Array {\n const issuerBytes = Buffer.from(issuerName, 'utf-8');\n const originBytes = Buffer.alloc(0);\n\n if (!Number.isInteger(tokenType) || tokenType < 0 || tokenType > 0xffff) {\n throw new Error('Token type must fit in an unsigned 16-bit integer');\n }\n if (issuerBytes.length > 0xffff) {\n throw new Error('Issuer name must fit in an unsigned 16-bit length');\n }\n\n const challenge = Buffer.alloc(\n 2 + 2 + issuerBytes.length + 1 + 2 + originBytes.length,\n );\n let offset = 0;\n\n challenge.writeUInt16BE(tokenType, offset);\n offset += 2;\n challenge.writeUInt16BE(issuerBytes.length, offset);\n offset += 2;\n issuerBytes.copy(challenge, offset);\n offset += issuerBytes.length;\n challenge.writeUInt8(0, offset);\n offset += 1;\n challenge.writeUInt16BE(originBytes.length, offset);\n offset += 2;\n if (originBytes.length > 0) {\n originBytes.copy(challenge, offset);\n }\n\n return new Uint8Array(createHash('sha256').update(challenge).digest());\n}\n","import { LinkConfigurationError } from '@/errors';\nimport type { AccessTokenProvider } from '@/resources/interfaces';\n\nexport interface LinkSdkLogger {\n debug(message: string): void;\n}\n\ninterface LinkClientOptions {\n verbose?: boolean;\n defaultHeaders?: Record<string, string>;\n fetch?: typeof globalThis.fetch;\n apiBaseUrl?: string;\n spendRequestBaseUrl?: string;\n logger?: LinkSdkLogger;\n}\n\nexport type LinkOptions = LinkClientOptions &\n (\n | { accessToken: string; getAccessToken?: never }\n | { accessToken?: never; getAccessToken: AccessTokenProvider }\n );\n\nexport interface ResolvedLinkSdkConfig {\n verbose: boolean;\n getAccessToken: AccessTokenProvider;\n canRefreshAccessToken: boolean;\n fetch?: typeof globalThis.fetch;\n apiBaseUrl: string;\n spendRequestBaseUrl: string;\n logger: LinkSdkLogger;\n}\n\nconst DEFAULT_API_BASE_URL = 'https://api.link.com';\n\nfunction createDefaultHeadersFetch(\n baseFetch: typeof globalThis.fetch,\n defaultHeaders: Record<string, string>,\n): typeof globalThis.fetch {\n return ((input: RequestInfo | URL, init?: RequestInit) => {\n const headers = new Headers(init?.headers);\n for (const [key, value] of Object.entries(defaultHeaders)) {\n if (!headers.has(key)) {\n headers.set(key, value);\n }\n }\n return baseFetch(input, { ...init, headers });\n }) as typeof globalThis.fetch;\n}\n\nexport interface LinkSdkConfigDefaults {\n apiBaseUrl?: string;\n spendRequestBaseUrl?: string;\n}\n\nfunction createDefaultLogger(): LinkSdkLogger {\n return {\n debug() {},\n };\n}\n\nexport function resolveLinkSdkConfig(\n options: LinkOptions,\n defaults: LinkSdkConfigDefaults = {},\n): ResolvedLinkSdkConfig {\n const verbose = options.verbose ?? false;\n const logger = options.logger ?? createDefaultLogger();\n if (\n options.accessToken !== undefined &&\n options.getAccessToken !== undefined\n ) {\n throw new LinkConfigurationError(\n 'Pass either `accessToken` or `getAccessToken`, not both.',\n );\n }\n\n let getAccessToken: AccessTokenProvider;\n let canRefreshAccessToken: boolean;\n if (options.accessToken !== undefined) {\n if (options.accessToken.trim().length === 0) {\n throw new LinkConfigurationError('`accessToken` cannot be empty.');\n }\n const accessToken = options.accessToken;\n getAccessToken = () => accessToken;\n canRefreshAccessToken = false;\n } else if (typeof options.getAccessToken === 'function') {\n getAccessToken = options.getAccessToken;\n canRefreshAccessToken = true;\n } else {\n throw new LinkConfigurationError(\n 'Pass `accessToken` or `getAccessToken` to the Link client.',\n );\n }\n\n const apiBaseUrl =\n options.apiBaseUrl ?? defaults.apiBaseUrl ?? DEFAULT_API_BASE_URL;\n const spendRequestBaseUrl =\n options.spendRequestBaseUrl ?? defaults.spendRequestBaseUrl ?? apiBaseUrl;\n\n const baseFetch = options.fetch ?? globalThis.fetch;\n const effectiveFetch =\n options.defaultHeaders && Object.keys(options.defaultHeaders).length > 0\n ? createDefaultHeadersFetch(baseFetch, options.defaultHeaders)\n : baseFetch;\n\n return {\n verbose,\n getAccessToken,\n canRefreshAccessToken,\n fetch: effectiveFetch,\n apiBaseUrl,\n spendRequestBaseUrl,\n logger,\n };\n}\n\nexport function requireFetchImplementation(\n config: Pick<ResolvedLinkSdkConfig, 'fetch'>,\n): typeof globalThis.fetch {\n if (!config.fetch) {\n throw new LinkConfigurationError(\n 'No fetch implementation available. Pass `fetch` in Link SDK options.',\n );\n }\n\n return config.fetch;\n}\n","import {\n type LinkOptions,\n requireFetchImplementation,\n resolveLinkSdkConfig,\n} from '@/config';\nimport { LinkApiError, LinkResponseError, LinkTransportError } from '@/errors';\nimport type { AccessTokenProvider } from '@/resources/interfaces';\n\nexport interface ApiFetchOptions {\n method: string;\n url: string;\n headers?: Record<string, string>;\n body?: string;\n signal?: AbortSignal;\n redirect?: RequestRedirect;\n}\n\nexport interface ApiFetchResult {\n status: number;\n data: unknown;\n rawBody: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nexport function extractErrorMessage(data: unknown, rawBody: string): string {\n if (isRecord(data)) {\n if (typeof data.error === 'string') {\n return data.error;\n }\n if (isRecord(data.error)) {\n const nested = data.error;\n if (typeof nested.message === 'string') {\n return nested.message;\n }\n if (typeof nested.code === 'string') {\n return nested.code;\n }\n }\n if (typeof data.message === 'string') {\n return data.message;\n }\n }\n\n return rawBody || 'unknown error';\n}\n\nexport abstract class BaseResource {\n protected readonly verbose: boolean;\n protected readonly getAccessToken: AccessTokenProvider;\n protected readonly canRefreshAccessToken: boolean;\n protected readonly fetchImpl: typeof globalThis.fetch;\n protected readonly endpoint: string;\n protected readonly logger: { debug(message: string): void };\n\n constructor(\n options: LinkOptions,\n endpointPath: string,\n base: 'api' | 'spend' = 'api',\n ) {\n const config = resolveLinkSdkConfig(options);\n this.verbose = config.verbose;\n this.getAccessToken = config.getAccessToken;\n this.canRefreshAccessToken = config.canRefreshAccessToken;\n this.fetchImpl = requireFetchImplementation(config);\n const baseUrl =\n base === 'spend' ? config.spendRequestBaseUrl : config.apiBaseUrl;\n this.endpoint = `${baseUrl}${endpointPath}`;\n this.logger = config.logger;\n }\n\n protected async rawFetch(opts: ApiFetchOptions): Promise<ApiFetchResult> {\n if (this.verbose) {\n this.logger.debug(`> ${opts.method} ${opts.url}`);\n }\n\n let response: Response;\n try {\n const init: RequestInit = {\n method: opts.method,\n ...(opts.headers !== undefined && { headers: opts.headers }),\n ...(opts.body !== undefined && { body: opts.body }),\n ...(opts.signal !== undefined && { signal: opts.signal }),\n ...(opts.redirect !== undefined && { redirect: opts.redirect }),\n };\n response = await this.fetchImpl(opts.url, init);\n } catch (error) {\n throw new LinkTransportError(\n `Request failed: ${opts.method} ${opts.url}`,\n { cause: error },\n );\n }\n const rawBody = await response.text();\n\n let data: unknown = null;\n try {\n data = JSON.parse(rawBody);\n } catch {\n // non-JSON response (e.g., from load balancer)\n }\n\n if (this.verbose) {\n this.logger.debug(`< ${response.status} ${response.statusText}`);\n }\n\n return { status: response.status, data, rawBody };\n }\n\n protected async apiFetch(opts: ApiFetchOptions): Promise<ApiFetchResult> {\n const token = await this.getAccessToken();\n const authedOpts = {\n ...opts,\n headers: {\n ...opts.headers,\n Authorization: `Bearer ${token}`,\n },\n };\n\n const res = await this.rawFetch(authedOpts);\n\n if (res.status === 401 && this.canRefreshAccessToken) {\n const refreshedToken = await this.getAccessToken({ forceRefresh: true });\n return this.rawFetch({\n ...opts,\n headers: {\n ...opts.headers,\n Authorization: `Bearer ${refreshedToken}`,\n },\n });\n }\n\n return res;\n }\n\n protected throwApiError(\n operation: string,\n status: number,\n data: unknown,\n rawBody: string,\n cause?: unknown,\n ): never {\n const msg = extractErrorMessage(data, rawBody);\n throw new LinkApiError(`Failed to ${operation} (${status}): ${msg}`, {\n status,\n rawBody,\n details: data,\n cause,\n });\n }\n\n protected parseResponse<T>(\n operation: string,\n status: number,\n parser: () => T,\n ): T {\n try {\n return parser();\n } catch (error) {\n throw new LinkResponseError(operation, status, { cause: error });\n }\n }\n}\n","import { z } from 'zod';\nimport type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type {\n IBalancesResource,\n ListBalancesParams,\n} from '@/resources/interfaces';\nimport type { BalancesPage } from '@/types/index';\n\nconst currencyAmountsSchema = z.record(z.string(), z.number());\nconst balanceSchema = z.looseObject({\n source_id: z.string(),\n type: z.enum(['cash', 'credit']),\n cash: z\n .looseObject({ available: currencyAmountsSchema })\n .nullable()\n .optional(),\n credit: z\n .looseObject({ used: currencyAmountsSchema.nullable() })\n .nullable()\n .optional(),\n current: z.number(),\n currency: z.string(),\n as_of: z.string(),\n});\nconst balancesPageSchema = z.looseObject({\n data: z.array(balanceSchema),\n has_more: z.boolean().optional(),\n});\n\nexport class BalancesResource\n extends BaseResource\n implements IBalancesResource\n{\n constructor(options: LinkOptions) {\n super(options, '/balances');\n }\n\n private buildUrl(params: ListBalancesParams): string {\n const url = new URL(this.endpoint);\n\n if (params.sources !== undefined) {\n for (const source of params.sources) {\n url.searchParams.append('sources[]', source);\n }\n }\n if (params.limit !== undefined) {\n url.searchParams.set('limit', String(params.limit));\n }\n if (params.starting_after !== undefined) {\n url.searchParams.set('starting_after', params.starting_after);\n }\n if (params.ending_before !== undefined) {\n url.searchParams.set('ending_before', params.ending_before);\n }\n\n return url.toString();\n }\n\n async list(params: ListBalancesParams = {}): Promise<BalancesPage> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.buildUrl(params),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('list balances', status, data, rawBody);\n }\n\n return this.parseResponse(\n 'list balances',\n status,\n () => balancesPageSchema.parse(data) as BalancesPage,\n );\n }\n}\n","import { z } from 'zod';\nimport type { LinkOptions } from '@/config';\nimport { LinkApiError } from '@/errors';\nimport { BaseResource } from '@/resources/base';\nimport { parseHolderPublicJwk } from '@/resources/holder-jwk';\nimport type {\n IIdentityCredentialsResource,\n IssueIdentityCredentialParams,\n IssueIdentityCredentialResponse,\n} from '@/resources/interfaces';\n\nconst LINK_ISSUER = 'https://api.link.com';\nconst LINK_ISSUER_METADATA_URL = `${LINK_ISSUER}/.well-known/aap-issuer`;\n\nconst identityCredentialIssuerMetadataSchema = z.looseObject({\n issuer: z.literal(LINK_ISSUER),\n credential_endpoint: z.string(),\n});\n\nconst issueIdentityCredentialResponseSchema = z.looseObject({\n credential: z.string(),\n issuer: z.literal(LINK_ISSUER),\n expires_at: z.string(),\n});\n\n/** Accepts a discovered endpoint only when it remains on api.link.com. */\nfunction requireLinkEndpoint(value: string, field: string): string {\n let url: URL;\n try {\n url = new URL(value);\n } catch (error) {\n throw new TypeError(`${field} is not a valid URL`, { cause: error });\n }\n if (\n url.protocol !== 'https:' ||\n url.origin !== LINK_ISSUER ||\n url.username ||\n url.password\n ) {\n throw new TypeError(`${field} must be an HTTPS URL on ${LINK_ISSUER}`);\n }\n return url.href;\n}\n\nexport class IdentityCredentialsResource\n extends BaseResource\n implements IIdentityCredentialsResource\n{\n constructor(options: LinkOptions) {\n super(options, '');\n }\n\n private async discoverCredentialEndpoint(): Promise<string> {\n const { status, data, rawBody } = await this.rawFetch({\n method: 'GET',\n url: LINK_ISSUER_METADATA_URL,\n redirect: 'manual',\n });\n if (status >= 300 && status < 400) {\n throw new LinkApiError(\n `Refused redirect while fetching identity credential issuer metadata (${status})`,\n { status, rawBody },\n );\n }\n\n if (status < 200 || status >= 300) {\n this.throwApiError(\n 'fetch identity credential issuer metadata',\n status,\n data,\n rawBody,\n );\n }\n\n const metadata = this.parseResponse(\n 'parse identity credential issuer metadata',\n status,\n () => identityCredentialIssuerMetadataSchema.parse(data),\n );\n return this.parseResponse(\n 'validate identity credential issuer metadata',\n status,\n () =>\n requireLinkEndpoint(\n metadata.credential_endpoint,\n 'credential_endpoint',\n ),\n );\n }\n\n async issue(\n params: IssueIdentityCredentialParams,\n ): Promise<IssueIdentityCredentialResponse> {\n const publicJwk = parseHolderPublicJwk(params.cnf.jwk);\n const endpoint = await this.discoverCredentialEndpoint();\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url: endpoint,\n redirect: 'manual',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify({ cnf: { jwk: publicJwk } }),\n });\n\n if (status >= 300 && status < 400) {\n throw new LinkApiError(\n `Refused redirect while issuing identity credential (${status})`,\n { status, rawBody },\n );\n }\n\n if (status < 200 || status >= 300) {\n this.throwApiError('issue identity credential', status, data, rawBody);\n }\n\n return this.parseResponse('issue identity credential', status, () =>\n issueIdentityCredentialResponseSchema.parse(data),\n );\n }\n}\n","import { createHash } from 'node:crypto';\nimport { LinkConfigurationError } from '@/errors';\nimport type { HolderPublicJwk } from '@/resources/interfaces';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * RFC 7638 SHA-256 thumbprint of a holder public JWK, base64url-encoded.\n */\nexport function holderJwkThumbprint(jwk: HolderPublicJwk): string {\n const canonical = JSON.stringify({\n crv: jwk.crv,\n kty: jwk.kty,\n x: jwk.x,\n });\n return createHash('sha256').update(canonical).digest('base64url');\n}\n\nexport function holderJwksEqual(\n left: HolderPublicJwk,\n right: HolderPublicJwk,\n): boolean {\n return holderJwkThumbprint(left) === holderJwkThumbprint(right);\n}\n\n/**\n * Normalizes a supported holder JWK to its public members.\n */\nexport function parseHolderPublicJwk(value: unknown): HolderPublicJwk {\n if (!isRecord(value)) {\n throw new LinkConfigurationError('Holder public key must be a JWK object');\n }\n if (typeof value.kty !== 'string') {\n throw new LinkConfigurationError('Holder public key is missing kty');\n }\n\n if (\n value.kty !== 'OKP' ||\n value.crv !== 'Ed25519' ||\n typeof value.x !== 'string' ||\n value.x.length === 0\n ) {\n throw new LinkConfigurationError(\n 'Holder public key must be an Ed25519 OKP JWK with an x member',\n );\n }\n return { kty: 'OKP', crv: 'Ed25519', x: value.x };\n}\n","import { z } from 'zod';\nimport type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type { IPaymentMethodsResource } from '@/resources/interfaces';\nimport type { PaymentMethod } from '@/types/index';\n\nconst paymentMethodSchema = z.looseObject({\n id: z.string(),\n type: z.string(),\n is_default: z.boolean(),\n name: z.string(),\n nickname: z.optional(z.string().nullable()),\n});\nconst paymentMethodsResponseSchema = z.looseObject({\n payment_details: z.array(paymentMethodSchema),\n});\n\nexport class PaymentMethodsResource\n extends BaseResource\n implements IPaymentMethodsResource\n{\n constructor(options: LinkOptions) {\n super(options, '/payment-details');\n }\n\n async list(): Promise<PaymentMethod[]> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.endpoint,\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('list payment methods', status, data, rawBody);\n }\n\n return this.parseResponse(\n 'list payment methods',\n status,\n () =>\n paymentMethodsResponseSchema.parse(data)\n .payment_details as PaymentMethod[],\n );\n }\n}\n","import { z } from 'zod';\nimport type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type {\n CreateReportParams,\n IReportResource,\n ReportRecord,\n} from '@/resources/interfaces';\n\nconst reportRecordSchema = z.looseObject({\n object: z.string(),\n created_at: z.string(),\n domain: z.string(),\n outcome: z.string(),\n spend_request_id: z.string(),\n status: z.string(),\n});\n\nexport class ReportResource extends BaseResource implements IReportResource {\n constructor(options: LinkOptions) {\n super(options, '/agent_observations');\n }\n\n async create(params: CreateReportParams): Promise<ReportRecord> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url: this.endpoint,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(params),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('create report', status, data, rawBody);\n }\n\n return this.parseResponse('create report', status, () =>\n reportRecordSchema.parse(data),\n );\n }\n}\n","import { z } from 'zod';\nimport type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type { IShippingAddressResource } from '@/resources/interfaces';\nimport type { ShippingAddressRecord } from '@/types/index';\n\nconst shippingAddressSchema = z.looseObject({\n id: z.string(),\n is_default: z.boolean(),\n nickname: z.optional(z.string().nullable()),\n address: z.looseObject({}).nullable(),\n});\nconst shippingAddressesResponseSchema = z.looseObject({\n shipping_addresses: z.array(shippingAddressSchema),\n});\n\nexport class ShippingAddressResource\n extends BaseResource\n implements IShippingAddressResource\n{\n constructor(options: LinkOptions) {\n super(options, '/shipping_addresses');\n }\n\n async list(): Promise<ShippingAddressRecord[]> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.endpoint,\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('list shipping addresses', status, data, rawBody);\n }\n\n return this.parseResponse(\n 'list shipping addresses',\n status,\n () =>\n shippingAddressesResponseSchema.parse(data)\n .shipping_addresses as ShippingAddressRecord[],\n );\n }\n}\n","import { z } from 'zod';\nimport type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type {\n ISourcesResource,\n ListSourcesParams,\n} from '@/resources/interfaces';\nimport type { SourcesPage } from '@/types/index';\n\nconst nullableRecordSchema = z\n .record(z.string(), z.unknown())\n .nullable()\n .optional();\nconst sourceSchema = z.looseObject({\n id: z.string().nullable().optional(),\n name: z.string().nullable().optional(),\n type: z.string().nullable().optional(),\n capabilities: nullableRecordSchema,\n external_connection: nullableRecordSchema,\n granted_actions: z.array(z.string()).nullable().optional(),\n bank_account: nullableRecordSchema,\n card: nullableRecordSchema,\n});\nconst sourcesPageSchema = z.looseObject({\n data: z.array(sourceSchema),\n has_more: z.boolean().optional(),\n});\n\nexport class SourcesResource extends BaseResource implements ISourcesResource {\n constructor(options: LinkOptions) {\n super(options, '/sources');\n }\n\n private buildUrl(params: ListSourcesParams): string {\n const url = new URL(this.endpoint);\n\n if (params.limit !== undefined) {\n url.searchParams.set('limit', String(params.limit));\n }\n if (params.starting_after !== undefined) {\n url.searchParams.set('starting_after', params.starting_after);\n }\n if (params.ending_before !== undefined) {\n url.searchParams.set('ending_before', params.ending_before);\n }\n\n return url.toString();\n }\n\n async list(params: ListSourcesParams = {}): Promise<SourcesPage> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.buildUrl(params),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('list sources', status, data, rawBody);\n }\n\n return this.parseResponse(\n 'list sources',\n status,\n () => sourcesPageSchema.parse(data) as SourcesPage,\n );\n }\n}\n","import { z } from 'zod';\nimport type { LinkOptions } from '@/config';\nimport { LinkApiError } from '@/errors';\nimport { BaseResource } from '@/resources/base';\nimport type {\n CreateSpendRequestParams,\n ISpendRequestResource,\n UpdateSpendRequestParams,\n} from '@/resources/interfaces';\nimport type { RequestApprovalResponse, SpendRequest } from '@/types/index';\n\nconst sharedPaymentTokenSchema = z.union([\n z.string().transform((id) => ({ id })),\n z.looseObject({ id: z.string() }),\n]);\n\nconst spendRequestSchema = z.looseObject({\n id: z.string(),\n payment_details: z.string().optional(),\n status: z.string(),\n line_items: z.array(z.unknown()).optional(),\n totals: z.array(z.unknown()).optional(),\n created_at: z.string(),\n updated_at: z.string(),\n shared_payment_token: sharedPaymentTokenSchema.nullable().optional(),\n});\n\nconst spendRequestsResponseSchema = z.looseObject({\n data: z.array(spendRequestSchema),\n});\n\nconst requestApprovalResponseSchema = z\n .looseObject({\n id: z.string(),\n approval_link: z.string(),\n })\n .transform(({ approval_link, ...response }) => ({\n ...response,\n approval_url: approval_link,\n }));\n\nconst duplicateSpendRequestErrorSchema = z.looseObject({\n error: z.looseObject({\n duplicate_spend_request: z.unknown().optional(),\n }),\n});\n\ntype InternalCreateSpendRequestParams = CreateSpendRequestParams & {\n approve?: boolean;\n expires_at?: number;\n};\n\ntype InternalUpdateSpendRequestParams = UpdateSpendRequestParams & {\n approve?: boolean;\n};\n\n/** Normalizes the legacy string SPT response into the current object shape. */\nfunction parseSpendRequest(value: unknown): SpendRequest {\n return spendRequestSchema.parse(value) as SpendRequest;\n}\n\nexport function getDuplicateSpendRequest(error: unknown): SpendRequest | null {\n if (!(error instanceof LinkApiError)) return null;\n const details = duplicateSpendRequestErrorSchema.safeParse(error.details);\n if (!details.success) return null;\n\n const duplicate = spendRequestSchema.safeParse(\n details.data.error.duplicate_spend_request,\n );\n return duplicate.success ? (duplicate.data as SpendRequest) : null;\n}\n\nexport class SpendRequestResource\n extends BaseResource\n implements ISpendRequestResource\n{\n constructor(options: LinkOptions) {\n super(options, '/spend_requests', 'spend');\n }\n\n async list(opts?: { includeHistory?: boolean }): Promise<SpendRequest[]> {\n const url = opts?.includeHistory\n ? `${this.endpoint}?include_history=true`\n : this.endpoint;\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url,\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('list spend requests', status, data, rawBody);\n }\n\n return this.parseResponse(\n 'list spend requests',\n status,\n () => spendRequestsResponseSchema.parse(data).data as SpendRequest[],\n );\n }\n\n async create(\n params: InternalCreateSpendRequestParams,\n ): Promise<SpendRequest> {\n const { approve, ...body } = params;\n const url = approve ? `${this.endpoint}/create_delegated` : this.endpoint;\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('create spend request', status, data, rawBody);\n }\n return this.parseResponse('create spend request', status, () =>\n parseSpendRequest(data),\n );\n }\n\n async update(\n id: string,\n params: InternalUpdateSpendRequestParams,\n ): Promise<SpendRequest> {\n const { approve, ...body } = params;\n const url = approve\n ? `${this.endpoint}/${id}/update_delegated`\n : `${this.endpoint}/${id}`;\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('update spend request', status, data, rawBody);\n }\n return this.parseResponse('update spend request', status, () =>\n parseSpendRequest(data),\n );\n }\n\n async cancel(id: string): Promise<SpendRequest> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url: `${this.endpoint}/${id}/cancel`,\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('cancel spend request', status, data, rawBody);\n }\n return this.parseResponse('cancel spend request', status, () =>\n parseSpendRequest(data),\n );\n }\n\n async requestApproval(id: string): Promise<RequestApprovalResponse> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url: `${this.endpoint}/${id}/request_approval`,\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('request approval', status, data, rawBody);\n }\n return this.parseResponse('request approval', status, () =>\n requestApprovalResponseSchema.parse(data),\n );\n }\n\n async retrieve(\n id: string,\n opts?: { include?: string[] },\n ): Promise<SpendRequest | null> {\n const url = new URL(`${this.endpoint}/${id}`);\n if (opts?.include?.length) {\n url.searchParams.set('include', opts.include.join(','));\n }\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: url.toString(),\n });\n\n if (status === 404) return null;\n if (status < 200 || status >= 300) {\n this.throwApiError('retrieve spend request', status, data, rawBody);\n }\n return this.parseResponse('retrieve spend request', status, () =>\n parseSpendRequest(data),\n );\n }\n}\n","import { z } from 'zod';\nimport type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type {\n ISummariesResource,\n ListSummariesParams,\n} from '@/resources/interfaces';\nimport type { SummariesPage } from '@/types/index';\n\nconst summaryValueSchema = z.discriminatedUnion('unit', [\n z.looseObject({ unit: z.literal('count'), count: z.number() }),\n z.looseObject({\n unit: z.literal('payment_volume'),\n amount: z.number(),\n currency: z.string(),\n }),\n]);\nconst summaryDataValueSchema = z.discriminatedUnion('unit', [\n z.looseObject({ unit: z.literal('count'), amount: z.number() }),\n z.looseObject({\n unit: z.literal('payment_volume'),\n amount: z.number(),\n currency: z.string(),\n }),\n]);\nconst summarySchema = z.looseObject({\n id: z.string(),\n description: z.string(),\n created_at: z.string().nullable().optional(),\n status: z.enum(['ready', 'pending', 'no_data']),\n entries: z\n .array(z.looseObject({ label: z.string(), value: summaryValueSchema }))\n .default([]),\n as_of: z.number().optional(),\n data: z\n .array(z.looseObject({ label: z.string(), value: summaryDataValueSchema }))\n .nullable()\n .optional(),\n});\nconst summariesPageSchema = z.looseObject({\n data: z.array(summarySchema),\n has_more: z.boolean().optional(),\n});\n\nexport class SummariesResource\n extends BaseResource\n implements ISummariesResource\n{\n constructor(options: LinkOptions) {\n super(options, '/summaries');\n }\n\n private buildUrl(params: ListSummariesParams): string {\n const url = new URL(this.endpoint);\n if (params.starting_after !== undefined)\n url.searchParams.set('starting_after', params.starting_after);\n if (params.summaries !== undefined)\n for (const summary of params.summaries)\n url.searchParams.append('summaries[]', summary);\n return url.toString();\n }\n\n async list(params: ListSummariesParams = {}): Promise<SummariesPage> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.buildUrl(params),\n });\n if (status < 200 || status >= 300)\n this.throwApiError('list summaries', status, data, rawBody);\n return this.parseResponse(\n 'list summaries',\n status,\n () => summariesPageSchema.parse(data) as SummariesPage,\n );\n }\n}\n","import { z } from 'zod';\nimport type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type {\n ITransactionsResource,\n ListTransactionsParams,\n} from '@/resources/interfaces';\nimport type { TransactionsPage } from '@/types/index';\n\nconst transactionSchema = z.looseObject({\n id: z.string(),\n source_id: z.string().nullable(),\n amount: z.number(),\n currency: z.string(),\n created_date: z.string(),\n description: z.string(),\n origin: z.enum(['link', 'external_connection']),\n category: z.string().nullable(),\n status: z.string(),\n});\nconst transactionsPageSchema = z.union([\n z.array(transactionSchema).transform((data) => ({ data })),\n z.looseObject({\n data: z.array(transactionSchema),\n has_more: z.boolean().optional(),\n }),\n]);\n\nexport class TransactionsResource\n extends BaseResource\n implements ITransactionsResource\n{\n constructor(options: LinkOptions) {\n super(options, '/transactions');\n }\n\n private buildUrl(params: ListTransactionsParams): string {\n const url = new URL(this.endpoint);\n\n if (params.limit !== undefined) {\n url.searchParams.set('limit', String(params.limit));\n }\n if (params.starting_after !== undefined) {\n url.searchParams.set('starting_after', params.starting_after);\n }\n if (params.ending_before !== undefined) {\n url.searchParams.set('ending_before', params.ending_before);\n }\n if (params.start_date !== undefined) {\n url.searchParams.set('date_start', params.start_date);\n }\n if (params.end_date !== undefined) {\n url.searchParams.set('date_end', params.end_date);\n }\n if (params.category !== undefined) {\n url.searchParams.set('category', params.category);\n }\n if (params.origin !== undefined) {\n url.searchParams.set('origin', params.origin);\n }\n if (params.sources !== undefined) {\n for (const source of params.sources) {\n url.searchParams.append('sources[]', source);\n }\n }\n\n return url.toString();\n }\n\n async list(params: ListTransactionsParams = {}): Promise<TransactionsPage> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.buildUrl(params),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('list transactions', status, data, rawBody);\n }\n\n return this.parseResponse(\n 'list transactions',\n status,\n () => transactionsPageSchema.parse(data) as TransactionsPage,\n );\n }\n}\n","import {\n type LinkOptions,\n requireFetchImplementation,\n resolveLinkSdkConfig,\n} from '@/config';\nimport { LinkApiError, LinkTransportError } from '@/errors';\nimport type {\n AccessTokenProvider,\n CompleteUcpCheckoutParams,\n CreateUcpCheckoutParams,\n IUcpResource,\n RetrieveUcpCheckoutParams,\n SearchUcpCatalogParams,\n} from '@/resources/interfaces';\nimport type {\n UcpCheckout,\n UcpCheckoutWithSpendRequest,\n UcpProduct,\n UcpSearchResult,\n} from '@/types/index';\n\ninterface ApiFetchOptions {\n method: string;\n url: string;\n headers?: Record<string, string>;\n body?: string;\n}\n\nfunction extractApiError(data: unknown, rawBody: string): string {\n if (data && typeof data === 'object') {\n const body = data as Record<string, unknown>;\n if (body.error && typeof body.error === 'object') {\n const err = body.error as { message?: string; code?: string };\n if (typeof err.message === 'string') return err.message;\n }\n if (typeof body.error === 'string') return body.error;\n if (typeof body.message === 'string') return body.message;\n }\n return rawBody || 'unknown error';\n}\n\nfunction normalizeSearchResult(data: unknown): UcpSearchResult {\n const body = (data ?? {}) as Record<string, unknown>;\n const items = Array.isArray(body.data) ? (body.data as UcpProduct[]) : [];\n return { ...body, data: items } as UcpSearchResult;\n}\n\nfunction normalizeCheckout(data: unknown): UcpCheckout {\n const body = (data ?? {}) as Record<string, unknown>;\n return { ...body, id: String(body.id ?? '') } as UcpCheckout;\n}\n\n/**\n * UCP (Universal Commerce Protocol) endpoints on api.link.com — gated proxies\n * over the Delegated Checkout / Commerce APIs. Every endpoint accepts `test`,\n * which routes to a self-contained demo response upstream (no live checkout).\n */\nexport class UcpResource implements IUcpResource {\n private readonly verbose: boolean;\n private readonly getAccessToken: AccessTokenProvider;\n private readonly fetchImpl: typeof globalThis.fetch;\n private readonly ucpEndpoint: string;\n private readonly logger: { debug(message: string): void };\n\n constructor(options: LinkOptions) {\n const config = resolveLinkSdkConfig(options);\n this.verbose = config.verbose;\n this.getAccessToken = config.getAccessToken;\n this.fetchImpl = requireFetchImplementation(config);\n this.ucpEndpoint = `${config.apiBaseUrl}/ucp`;\n this.logger = config.logger;\n }\n\n private async rawFetch(\n opts: ApiFetchOptions,\n ): Promise<{ status: number; data: unknown; rawBody: string }> {\n if (this.verbose) {\n const redactedHeaders = { ...opts.headers };\n if (redactedHeaders.Authorization)\n redactedHeaders.Authorization = 'Bearer <redacted>';\n this.logger.debug(`> ${opts.method} ${opts.url}`);\n this.logger.debug(` Headers: ${JSON.stringify(redactedHeaders)}`);\n if (opts.body) this.logger.debug(opts.body);\n }\n\n const fetchOpts: RequestInit = {\n method: opts.method,\n ...(opts.headers ? { headers: opts.headers } : {}),\n };\n if (opts.body) fetchOpts.body = opts.body;\n\n let response: Response;\n try {\n response = await this.fetchImpl(opts.url, fetchOpts);\n } catch (error) {\n throw new LinkTransportError(\n `Request failed: ${opts.method} ${opts.url}`,\n {\n cause: error,\n },\n );\n }\n const rawBody = await response.text();\n\n let data: unknown = null;\n try {\n data = JSON.parse(rawBody);\n } catch {\n // non-JSON response (e.g., from load balancer)\n }\n\n if (this.verbose) {\n this.logger.debug(`< ${response.status} ${response.statusText}`);\n response.headers.forEach((value, key) => {\n this.logger.debug(` ${key}: ${value}`);\n });\n this.logger.debug(JSON.stringify(data, null, 2) ?? rawBody);\n }\n\n return { status: response.status, data, rawBody };\n }\n\n /** Injects the Bearer token; retries once on 401 after refreshing. */\n private async apiFetch(\n opts: ApiFetchOptions,\n ): Promise<{ status: number; data: unknown; rawBody: string }> {\n const token = await this.getAccessToken();\n const authedOpts = {\n ...opts,\n headers: { ...opts.headers, Authorization: `Bearer ${token}` },\n };\n\n const res = await this.rawFetch(authedOpts);\n if (res.status === 401) {\n const refreshedToken = await this.getAccessToken({ forceRefresh: true });\n authedOpts.headers.Authorization = `Bearer ${refreshedToken}`;\n return this.rawFetch(authedOpts);\n }\n return res;\n }\n\n private buildSearchUrl(params: SearchUcpCatalogParams): string {\n const url = new URL(`${this.ucpEndpoint}/catalog/search`);\n const setIf = (key: string, value: string | number | undefined) => {\n if (value !== undefined) url.searchParams.set(key, String(value));\n };\n setIf('query', params.query);\n setIf('profile_id', params.profile_id);\n setIf('sku', params.sku);\n setIf('price_min', params.price_min);\n setIf('price_max', params.price_max);\n setIf('currency', params.currency);\n setIf('availability', params.availability);\n setIf('sort', params.sort);\n setIf('group_by', params.group_by);\n setIf('limit', params.limit);\n setIf('offset', params.offset);\n if (params.include_facets) url.searchParams.set('include_facets', 'true');\n\n const arrays: Array<[string, string[] | undefined]> = [\n ['brand', params.brand],\n ['category', params.category],\n ['color', params.color],\n ['size', params.size],\n ['material', params.material],\n ['gender', params.gender],\n ['condition', params.condition],\n ];\n for (const [key, values] of arrays) {\n if (values)\n for (const value of values) url.searchParams.append(`${key}[]`, value);\n }\n\n if (params.test) url.searchParams.set('test', 'true');\n return url.toString();\n }\n\n async searchCatalog(\n params: SearchUcpCatalogParams,\n ): Promise<UcpSearchResult> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.buildSearchUrl(params),\n });\n\n if (status < 200 || status >= 300) {\n throw new LinkApiError(\n `Failed to search UCP catalog (${status}): ${extractApiError(data, rawBody)}`,\n { status, rawBody, details: data },\n );\n }\n\n return normalizeSearchResult(data);\n }\n\n async createCheckout(params: CreateUcpCheckoutParams): Promise<UcpCheckout> {\n const body: Record<string, unknown> = {\n profile_id: params.profile_id,\n line_items: params.line_items,\n };\n if (params.currency !== undefined) body.currency = params.currency;\n if (params.fulfillment_details !== undefined)\n body.fulfillment_details = params.fulfillment_details;\n if (params.test) body.test = true;\n\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url: `${this.ucpEndpoint}/checkout`,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (status < 200 || status >= 300) {\n throw new LinkApiError(\n `Failed to create UCP checkout (${status}): ${extractApiError(data, rawBody)}`,\n { status, rawBody, details: data },\n );\n }\n\n return normalizeCheckout(data);\n }\n\n async completeCheckout(\n id: string,\n params: CompleteUcpCheckoutParams,\n ): Promise<UcpCheckout> {\n const body: Record<string, unknown> = {\n spend_request_id: params.spend_request_id,\n profile_id: params.profile_id,\n };\n if (params.test) body.test = true;\n\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url: `${this.ucpEndpoint}/checkout/${encodeURIComponent(id)}/complete`,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (status < 200 || status >= 300) {\n throw new LinkApiError(\n `Failed to complete UCP checkout (${status}): ${extractApiError(data, rawBody)}`,\n { status, rawBody, details: data },\n );\n }\n\n return normalizeCheckout(data);\n }\n\n async retrieveCheckout(\n id: string,\n params: RetrieveUcpCheckoutParams,\n ): Promise<UcpCheckoutWithSpendRequest> {\n const url = new URL(\n `${this.ucpEndpoint}/checkout/${encodeURIComponent(id)}`,\n );\n url.searchParams.set('spend_request_id', params.spend_request_id);\n if (params.test) url.searchParams.set('test', 'true');\n\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: url.toString(),\n });\n\n if (status < 200 || status >= 300) {\n throw new LinkApiError(\n `Failed to retrieve UCP checkout (${status}): ${extractApiError(data, rawBody)}`,\n { status, rawBody, details: data },\n );\n }\n\n return normalizeCheckout(data) as UcpCheckoutWithSpendRequest;\n }\n}\n","import { z } from 'zod';\nimport type { LinkOptions } from '@/config';\nimport { BaseResource } from '@/resources/base';\nimport type { IUserInfoResource } from '@/resources/interfaces';\nimport type { UserInfo } from '@/types/index';\n\nconst rollingSpendLimitSchema = z.object({\n limit: z.number().int().nullable(),\n used: z.number().int(),\n remaining: z.number().int().nullable(),\n});\n\nconst agentWalletSpendLimitsSchema = z.object({\n per_transaction: z.object({\n limit: z.number().int().nullable(),\n }),\n daily: rollingSpendLimitSchema,\n thirty_day: rollingSpendLimitSchema,\n});\n\nconst agentWalletVerificationRequirementSchema = z.object({\n status: z.enum([\n 'not_required',\n 'ssn_verification',\n 'identity_verification',\n 'contact_support',\n 'complete',\n ]),\n action_url: z.string().nullable(),\n});\n\nconst userInfoAddressSchema = z.object({\n line1: z.string().nullable(),\n line2: z.string().nullable(),\n city: z.string().nullable(),\n state: z.string().nullable(),\n postal_code: z.string().nullable(),\n country: z.string().nullable(),\n});\n\nconst userInfoSchema = z\n .looseObject({\n email: z.string().nullable().optional(),\n name: z.string().nullable().optional(),\n first_name: z.string().nullable().optional(),\n last_name: z.string().nullable().optional(),\n phone: z.string().nullable().optional(),\n address: userInfoAddressSchema.nullable().optional(),\n eligible_for_balance: z.boolean().optional(),\n agent_wallet_spend_limits: agentWalletSpendLimitsSchema.optional(),\n agent_wallet_step_up: agentWalletVerificationRequirementSchema.optional(),\n })\n .transform(\n ({\n email,\n name,\n first_name,\n last_name,\n phone,\n address,\n eligible_for_balance,\n agent_wallet_spend_limits,\n agent_wallet_step_up,\n }) => ({\n email: email ?? null,\n name: name ?? null,\n first_name: first_name ?? null,\n last_name: last_name ?? null,\n phone: phone ?? null,\n ...(address === undefined ? {} : { address }),\n ...(eligible_for_balance === undefined ? {} : { eligible_for_balance }),\n ...(agent_wallet_spend_limits === undefined\n ? {}\n : { agent_wallet_spend_limits }),\n ...(agent_wallet_step_up === undefined\n ? {}\n : { agent_wallet_verification_requirement: agent_wallet_step_up }),\n }),\n );\n\nexport class UserInfoResource\n extends BaseResource\n implements IUserInfoResource\n{\n constructor(options: LinkOptions) {\n super(options, '/userinfo');\n }\n\n async retrieve(): Promise<UserInfo> {\n const { status, data, rawBody } = await this.apiFetch({\n method: 'GET',\n url: this.endpoint,\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('retrieve user info', status, data, rawBody);\n }\n\n return this.parseResponse('retrieve user info', status, () =>\n userInfoSchema.parse(data),\n );\n }\n}\n","import { z } from 'zod';\nimport type { LinkOptions } from '@/config';\nimport { LinkSdkError } from '@/errors';\nimport { BaseResource } from '@/resources/base';\nimport type { IWebBotAuthResource } from '@/resources/interfaces';\nimport type { WebBotAuthBlock } from '@/types/index';\n\ninterface CacheEntry {\n block: WebBotAuthBlock;\n expiresAt: number;\n}\n\nconst EXPIRY_BUFFER_MS = 30_000;\n\nconst webBotAuthBlockSchema = z.looseObject({\n signature: z.string(),\n signature_input: z.string(),\n signature_agent: z.string(),\n authority: z.string(),\n expires_at: z.string(),\n});\nconst webBotAuthResponseSchema = z.looseObject({\n web_bot_auth: webBotAuthBlockSchema,\n});\n\nexport class WebBotAuthResource\n extends BaseResource\n implements IWebBotAuthResource\n{\n private readonly cache = new Map<string, CacheEntry>();\n\n constructor(options: LinkOptions) {\n super(options, '/web_bot_auth/sign');\n }\n\n async signUrl(url: string): Promise<WebBotAuthBlock> {\n let authority: string;\n try {\n authority = new URL(url).hostname;\n } catch (error) {\n throw new LinkSdkError(`Invalid URL: ${url}`, { cause: error });\n }\n\n const cached = this.cache.get(authority);\n if (cached && Date.now() < cached.expiresAt - EXPIRY_BUFFER_MS) {\n return cached.block;\n }\n\n const { status, data, rawBody } = await this.apiFetch({\n method: 'POST',\n url: this.endpoint,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ url }),\n });\n\n if (status < 200 || status >= 300) {\n this.throwApiError('get web bot auth headers', status, data, rawBody);\n }\n\n const webBotAuth = this.parseResponse(\n 'get web bot auth headers',\n status,\n () => webBotAuthResponseSchema.parse(data).web_bot_auth,\n );\n const expiresAt = Date.parse(webBotAuth.expires_at);\n if (Number.isNaN(expiresAt)) {\n throw new LinkSdkError(\n `Credentials response has invalid expires_at: ${webBotAuth.expires_at}`,\n );\n }\n\n this.cache.set(authority, { block: webBotAuth, expiresAt });\n return webBotAuth;\n }\n}\n","import type { LinkOptions } from '@/config';\nimport { AttestationsResource } from '@/resources/attestations';\nimport { BalancesResource } from '@/resources/balances';\nimport { IdentityCredentialsResource } from '@/resources/identity-credentials';\nimport type {\n IAttestationsResource,\n IBalancesResource,\n IIdentityCredentialsResource,\n IPaymentMethodsResource,\n IReportResource,\n IShippingAddressResource,\n ISourcesResource,\n ISpendRequestResource,\n ISummariesResource,\n ITransactionsResource,\n IUcpResource,\n IUserInfoResource,\n IWebBotAuthResource,\n} from '@/resources/interfaces';\nimport { PaymentMethodsResource } from '@/resources/payment-methods';\nimport { ReportResource } from '@/resources/report';\nimport { ShippingAddressResource } from '@/resources/shipping-address';\nimport { SourcesResource } from '@/resources/sources';\nimport { SpendRequestResource } from '@/resources/spend-request';\nimport { SummariesResource } from '@/resources/summaries';\nimport { TransactionsResource } from '@/resources/transactions';\nimport { UcpResource } from '@/resources/ucp';\nimport { UserInfoResource } from '@/resources/user-info';\nimport { WebBotAuthResource } from '@/resources/web-bot-auth';\n\nexport class Link {\n readonly attestations: IAttestationsResource;\n readonly identityCredentials: IIdentityCredentialsResource;\n readonly spendRequests: ISpendRequestResource;\n readonly paymentMethods: IPaymentMethodsResource;\n readonly shippingAddresses: IShippingAddressResource;\n readonly userInfo: IUserInfoResource;\n readonly transactions: ITransactionsResource;\n readonly sources: ISourcesResource;\n readonly balances: IBalancesResource;\n readonly summaries: ISummariesResource;\n readonly webBotAuth: IWebBotAuthResource;\n readonly reports: IReportResource;\n readonly ucp: IUcpResource;\n\n constructor(options: LinkOptions) {\n this.attestations = new AttestationsResource(options);\n this.identityCredentials = new IdentityCredentialsResource(options);\n this.spendRequests = new SpendRequestResource(options);\n this.paymentMethods = new PaymentMethodsResource(options);\n this.shippingAddresses = new ShippingAddressResource(options);\n this.userInfo = new UserInfoResource(options);\n this.transactions = new TransactionsResource(options);\n this.sources = new SourcesResource(options);\n this.balances = new BalancesResource(options);\n this.summaries = new SummariesResource(options);\n this.webBotAuth = new WebBotAuthResource(options);\n this.reports = new ReportResource(options);\n this.ucp = new UcpResource(options);\n }\n}\n\nexport default Link;\n","import type {\n ApprovalDetail,\n BalancesPage,\n CredentialType,\n LineItem,\n PaymentMethod,\n RequestApprovalResponse,\n ShippingAddressRecord,\n SourcesPage,\n SpendRequest,\n SummariesPage,\n Total,\n TransactionOrigin,\n TransactionsPage,\n UcpCheckout,\n UcpCheckoutWithSpendRequest,\n UcpSearchResult,\n UserInfo,\n WebBotAuthBlock,\n} from '@/types/index';\n\nexport interface GetAccessTokenOptions {\n forceRefresh?: boolean;\n}\n\nexport type AccessTokenProvider = (\n options?: GetAccessTokenOptions,\n) => Promise<string> | string;\n\nexport interface AttestationRequestParams {\n count: number;\n}\n\nexport interface AttestationRequestResult {\n tokens: string[];\n issuer: string;\n token_key_id: string;\n count: number;\n}\n\nexport interface IAttestationsResource {\n request(params: AttestationRequestParams): Promise<AttestationRequestResult>;\n}\n\nexport type HolderPublicJwk = { kty: 'OKP'; crv: 'Ed25519'; x: string };\n\nexport interface IssueIdentityCredentialParams {\n cnf: { jwk: HolderPublicJwk };\n}\n\nexport interface IssueIdentityCredentialResponse {\n credential: string;\n issuer: string;\n expires_at: string;\n}\n\nexport interface IIdentityCredentialsResource {\n issue(\n params: IssueIdentityCredentialParams,\n ): Promise<IssueIdentityCredentialResponse>;\n}\n\nexport interface CreateSpendRequestParams {\n idempotency_key?: string;\n payment_details?: string;\n credential_type?: CredentialType;\n network_id?: string;\n execution_method?: 'link_pay_token';\n merchant_account_id?: string;\n amount?: number;\n currency?: string;\n merchant_name?: string;\n merchant_url?: string;\n context: string;\n line_items?: LineItem[];\n totals?: Total[];\n request_approval?: boolean;\n test?: boolean;\n approval_details?: ApprovalDetail;\n metadata?: Record<string, string>;\n}\n\nexport interface UpdateSpendRequestParams {\n payment_details?: string;\n amount?: number;\n merchant_url?: string;\n profile_id?: string;\n merchant_id?: string;\n currency?: string;\n line_items?: LineItem[];\n totals?: Total[];\n}\n\nexport interface ISpendRequestResource {\n list(opts?: { includeHistory?: boolean }): Promise<SpendRequest[]>;\n create(params: CreateSpendRequestParams): Promise<SpendRequest>;\n update(id: string, params: UpdateSpendRequestParams): Promise<SpendRequest>;\n requestApproval(id: string): Promise<RequestApprovalResponse>;\n cancel(id: string): Promise<SpendRequest>;\n retrieve(\n id: string,\n opts?: { include?: string[] },\n ): Promise<SpendRequest | null>;\n}\n\nexport interface IPaymentMethodsResource {\n list(): Promise<PaymentMethod[]>;\n}\n\nexport interface IShippingAddressResource {\n list(): Promise<ShippingAddressRecord[]>;\n}\n\nexport interface IUserInfoResource {\n retrieve(): Promise<UserInfo>;\n}\n\nexport interface IWebBotAuthResource {\n signUrl(url: string): Promise<WebBotAuthBlock>;\n}\n\nexport interface ListTransactionsParams {\n limit?: number;\n starting_after?: string;\n ending_before?: string;\n start_date?: string;\n end_date?: string;\n category?: string;\n origin?: TransactionOrigin;\n sources?: string[];\n}\n\nexport interface ITransactionsResource {\n list(params?: ListTransactionsParams): Promise<TransactionsPage>;\n}\n\nexport interface ListSourcesParams {\n limit?: number;\n starting_after?: string;\n ending_before?: string;\n}\n\nexport interface ISourcesResource {\n list(params?: ListSourcesParams): Promise<SourcesPage>;\n}\n\nexport interface ListBalancesParams {\n sources?: string[];\n limit?: number;\n starting_after?: string;\n ending_before?: string;\n}\n\nexport interface IBalancesResource {\n list(params?: ListBalancesParams): Promise<BalancesPage>;\n}\n\nexport interface ListSummariesParams {\n starting_after?: string;\n summaries?: string[];\n}\nexport interface ISummariesResource {\n list(params?: ListSummariesParams): Promise<SummariesPage>;\n}\n\nexport const REPORT_OUTCOMES = ['success', 'blocked', 'abandoned'] as const;\nexport type ReportOutcome = (typeof REPORT_OUTCOMES)[number];\n\nexport const REPORT_TAGS = [\n 'stripe_checkout',\n 'captcha',\n 'anti_bot_script',\n 'cdn_block',\n 'waf_block',\n 'dns_block',\n 'rate_limited',\n 'login_required',\n '3ds_challenge',\n 'page_inaccessible',\n 'timeout',\n 'site_error',\n 'payment_declined',\n 'other',\n] as const;\nexport type ReportTag = (typeof REPORT_TAGS)[number];\n\n/**\n * Server-side cap on `attempt_trace`. Longer values are truncated by the API\n * rather than rejected, so callers do not need to pre-trim.\n */\nexport const REPORT_ATTEMPT_TRACE_MAX_LENGTH = 8000;\n\nexport interface CreateReportParams {\n domain: string;\n outcome: ReportOutcome;\n spend_request_id: string;\n tags?: ReportTag[];\n step?: string;\n freeform_context?: string;\n attempt_trace?: string;\n}\n\nexport interface ReportRecord {\n object: string;\n created_at: string;\n domain: string;\n outcome: string;\n spend_request_id: string;\n status: string;\n}\n\nexport interface IReportResource {\n create(params: CreateReportParams): Promise<ReportRecord>;\n}\n\nexport interface SearchUcpCatalogParams {\n query?: string;\n profile_id?: string;\n sku?: string;\n brand?: string[];\n category?: string[];\n color?: string[];\n size?: string[];\n material?: string[];\n gender?: string[];\n condition?: string[];\n price_min?: number;\n price_max?: number;\n currency?: string;\n availability?: string;\n sort?: string;\n group_by?: string;\n limit?: number;\n offset?: number;\n include_facets?: boolean;\n test?: boolean;\n}\n\nexport interface UcpLineItem {\n sku_id: string;\n quantity: number;\n}\n\nexport interface CreateUcpCheckoutParams {\n profile_id: string;\n line_items: UcpLineItem[];\n currency?: string;\n fulfillment_details?: Record<string, unknown>;\n test?: boolean;\n}\n\nexport interface CompleteUcpCheckoutParams {\n spend_request_id: string;\n profile_id: string;\n test?: boolean;\n}\n\nexport interface RetrieveUcpCheckoutParams {\n spend_request_id: string;\n test?: boolean;\n}\n\nexport interface IUcpResource {\n searchCatalog(params: SearchUcpCatalogParams): Promise<UcpSearchResult>;\n createCheckout(params: CreateUcpCheckoutParams): Promise<UcpCheckout>;\n completeCheckout(\n id: string,\n params: CompleteUcpCheckoutParams,\n ): Promise<UcpCheckout>;\n retrieveCheckout(\n id: string,\n params: RetrieveUcpCheckoutParams,\n ): Promise<UcpCheckoutWithSpendRequest>;\n}\n"],"mappings":"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","names":["createHash","createHash","z","z","z","createHash","isRecord","createHash","LINK_ISSUER","LINK_ISSUER_METADATA_URL","z","requireLinkEndpoint","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attestations-crypto.test.d.ts","sourceRoot":"","sources":["../../../src/resources/__tests__/attestations-crypto.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attestations.test.d.ts","sourceRoot":"","sources":["../../../src/resources/__tests__/attestations.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.test.d.ts","sourceRoot":"","sources":["../../../src/resources/__tests__/credentials.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"holder-jwk.test.d.ts","sourceRoot":"","sources":["../../../src/resources/__tests__/holder-jwk.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summaries.test.d.ts","sourceRoot":"","sources":["../../../src/resources/__tests__/summaries.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ucp.test.d.ts","sourceRoot":"","sources":["../../../src/resources/__tests__/ucp.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** RSA public values needed by the blinding and verification operations. */
|
|
2
|
+
interface RsaPublicKey {
|
|
3
|
+
n: bigint;
|
|
4
|
+
e: bigint;
|
|
5
|
+
nLen: number;
|
|
6
|
+
}
|
|
7
|
+
/** Per-token secrets retained locally while the issuer signs the blind. */
|
|
8
|
+
interface BlindedToken {
|
|
9
|
+
nonce: Uint8Array;
|
|
10
|
+
blindedMsg: Uint8Array;
|
|
11
|
+
blindInverse: bigint;
|
|
12
|
+
encodedMessage: Uint8Array;
|
|
13
|
+
}
|
|
14
|
+
/** Local state needed to finalize a batch of blinded token requests. */
|
|
15
|
+
export interface BlindingState {
|
|
16
|
+
tokens: BlindedToken[];
|
|
17
|
+
publicKey: RsaPublicKey;
|
|
18
|
+
challengeDigest: Uint8Array;
|
|
19
|
+
tokenKeyId: Uint8Array;
|
|
20
|
+
}
|
|
21
|
+
/** A complete binary token and its base64url transport form. */
|
|
22
|
+
export interface FinalToken {
|
|
23
|
+
raw: Uint8Array;
|
|
24
|
+
base64url: string;
|
|
25
|
+
}
|
|
26
|
+
/** Encodes bytes as unpadded base64url. */
|
|
27
|
+
export declare function base64urlEncode(buf: Uint8Array): string;
|
|
28
|
+
/** Creates blinded issuer requests and retains the state needed to finalize them. */
|
|
29
|
+
export declare function generateBlindedMessages(spkiDer: Uint8Array, count: number, challengeDigest: Uint8Array): BlindingState;
|
|
30
|
+
/** Unblinds issuer responses, verifies them, and assembles complete tokens. */
|
|
31
|
+
export declare function unblindSignatures(state: BlindingState, blindSigs: string[]): FinalToken[];
|
|
32
|
+
/** Hashes the canonical empty-context TokenChallenge used for issuance. */
|
|
33
|
+
export declare function computeChallengeDigest(tokenType: number, issuerName: string): Uint8Array;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=attestations-crypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attestations-crypto.d.ts","sourceRoot":"","sources":["../../src/resources/attestations-crypto.ts"],"names":[],"mappings":"AAqBA,4EAA4E;AAC5E,UAAU,YAAY;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;CACd;AAED,2EAA2E;AAC3E,UAAU,YAAY;IACpB,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,UAAU,CAAC;CAC5B;AAED,wEAAwE;AACxE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,SAAS,EAAE,YAAY,CAAC;IACxB,eAAe,EAAE,UAAU,CAAC;IAC5B,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,gEAAgE;AAChE,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,UAAU,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,2CAA2C;AAC3C,wBAAgB,eAAe,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAEvD;AAkTD,qFAAqF;AACrF,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,UAAU,GAC1B,aAAa,CA+Cf;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,aAAa,EACpB,SAAS,EAAE,MAAM,EAAE,GAClB,UAAU,EAAE,CA+Dd;AAED,2EAA2E;AAC3E,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,UAAU,CA+BZ"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { LinkOptions } from '@/config';
|
|
2
|
+
import { BaseResource } from '@/resources/base';
|
|
3
|
+
import type { AttestationRequestParams, AttestationRequestResult, IAttestationsResource } from '@/resources/interfaces';
|
|
4
|
+
export declare class AttestationsResource extends BaseResource implements IAttestationsResource {
|
|
5
|
+
/** Creates an attestation resource using the SDK's authentication config. */
|
|
6
|
+
constructor(options: LinkOptions);
|
|
7
|
+
/** Fetches JSON without following redirects and normalizes API errors. */
|
|
8
|
+
private fetchJson;
|
|
9
|
+
/** Sends a blinded batch with the current or refreshed access token. */
|
|
10
|
+
private issueTokens;
|
|
11
|
+
/** Requests, verifies, and returns a batch of Link attestation tokens. */
|
|
12
|
+
request(params: AttestationRequestParams): Promise<AttestationRequestResult>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=attestations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attestations.d.ts","sourceRoot":"","sources":["../../src/resources/attestations.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAc5C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EACV,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,EACtB,MAAM,wBAAwB,CAAC;AA2KhC,qBAAa,oBACX,SAAQ,YACR,YAAW,qBAAqB;IAEhC,6EAA6E;IAC7E,YAAY,OAAO,EAAE,WAAW,EAE/B;IAED,0EAA0E;YAC5D,SAAS;IA+CvB,wEAAwE;YAC1D,WAAW;IA4BzB,0EAA0E;IACpE,OAAO,CACX,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,wBAAwB,CAAC,CAgInC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"balances.d.ts","sourceRoot":"","sources":["../../src/resources/balances.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"balances.d.ts","sourceRoot":"","sources":["../../src/resources/balances.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAuBlD,qBAAa,gBACX,SAAQ,YACR,YAAW,iBAAiB;IAE5B,YAAY,OAAO,EAAE,WAAW,EAE/B;IAED,OAAO,CAAC,QAAQ;IAqBV,IAAI,CAAC,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC,CAejE;CACF"}
|
package/dist/resources/base.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/resources/base.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAGjB,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/resources/base.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAGjB,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAoB1E;AAED,8BAAsB,YAAY;IAChC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IACpC,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,mBAAmB,CAAC;IACvD,SAAS,CAAC,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;IAClD,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IACtD,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IACpC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE;QAAE,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAE5D,YACE,OAAO,EAAE,WAAW,EACpB,YAAY,EAAE,MAAM,EACpB,IAAI,GAAE,KAAK,GAAG,OAAe,EAW9B;IAED,UAAgB,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAmCvE;IAED,UAAgB,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAwBvE;IAED,SAAS,CAAC,aAAa,CACrB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,OAAO,GACd,KAAK,CAQP;IAED,SAAS,CAAC,aAAa,CAAC,CAAC,EACvB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,CAAC,GACd,CAAC,CAMH;CACF"}
|