@happyvertical/signatures 0.80.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/AGENT.md +49 -0
- package/LICENSE +7 -0
- package/README.md +129 -0
- package/dist/adapters/boldsign.d.ts +48 -0
- package/dist/adapters/boldsign.d.ts.map +1 -0
- package/dist/adapters/boldsign.js +1443 -0
- package/dist/adapters/boldsign.js.map +1 -0
- package/dist/chunks/errors-Bnx7QrSA.js +59 -0
- package/dist/chunks/errors-Bnx7QrSA.js.map +1 -0
- package/dist/errors.d.ts +46 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/factory.d.ts +7 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/shared.d.ts +12 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/types.d.ts +173 -0
- package/dist/types.d.ts.map +1 -0
- package/metadata.json +28 -0
- package/package.json +62 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boldsign.js","sources":["../../src/shared.ts","../../src/adapters/boldsign.ts"],"sourcesContent":["import { SignatureInputError, SignatureProviderError } from './errors.js';\n\nexport type SignatureFetch = (\n input: string | URL | Request,\n init?: RequestInit,\n) => Promise<Response>;\n\nexport function getSignatureFetch(fetchLike?: SignatureFetch): SignatureFetch {\n const resolved = fetchLike ?? globalThis.fetch;\n\n if (typeof resolved !== 'function') {\n throw new SignatureProviderError(\n 'A fetch implementation is required in this runtime.',\n );\n }\n\n return resolved.bind(globalThis) as SignatureFetch;\n}\n\nexport function requireNonEmptyString(value: unknown, context: string): string {\n if (typeof value !== 'string' || !value.trim()) {\n throw new SignatureInputError(`${context} must be a non-empty string.`);\n }\n\n return value.trim();\n}\n\nexport function requireRecord(\n value: unknown,\n context: string,\n): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new SignatureProviderError(`${context} must be an object.`);\n }\n\n return value as Record<string, unknown>;\n}\n\nexport function readString(\n value: Record<string, unknown> | undefined,\n key: string,\n): string | undefined {\n const item = value?.[key];\n\n return typeof item === 'string' ? item : undefined;\n}\n\nexport function readNumber(\n value: Record<string, unknown> | undefined,\n key: string,\n): number | undefined {\n const item = value?.[key];\n\n return typeof item === 'number' && Number.isFinite(item) ? item : undefined;\n}\n\nexport function readBoolean(\n value: Record<string, unknown> | undefined,\n key: string,\n): boolean | undefined {\n const item = value?.[key];\n\n return typeof item === 'boolean' ? item : undefined;\n}\n\nexport function readRecord(\n value: Record<string, unknown> | undefined,\n key: string,\n): Record<string, unknown> | undefined {\n const item = value?.[key];\n\n return item && typeof item === 'object' && !Array.isArray(item)\n ? (item as Record<string, unknown>)\n : undefined;\n}\n\nexport function readRecords(\n value: Record<string, unknown> | undefined,\n key: string,\n): Record<string, unknown>[] {\n const item = value?.[key];\n\n return Array.isArray(item)\n ? item.filter(\n (candidate): candidate is Record<string, unknown> =>\n Boolean(candidate) &&\n typeof candidate === 'object' &&\n !Array.isArray(candidate),\n )\n : [];\n}\n\nexport function normalizeDate(value: Date | string, context: string): Date {\n if (!(value instanceof Date) && typeof value !== 'string') {\n throw new SignatureInputError(`${context} must be a Date or ISO string.`);\n }\n\n const date = value instanceof Date ? new Date(value) : new Date(value);\n\n if (Number.isNaN(date.getTime())) {\n throw new SignatureInputError(`${context} must be a valid date.`);\n }\n\n return date;\n}\n\nexport function parseOptionalEpochSeconds(value: unknown): Date | undefined {\n return typeof value === 'number' && Number.isFinite(value)\n ? new Date(value * 1_000)\n : undefined;\n}\n","// biome-ignore-all lint/style/useNamingConvention: BoldSign's documented JSON wire fields use PascalCase.\nimport { Buffer } from 'node:buffer';\nimport { createHash, createHmac, timingSafeEqual } from 'node:crypto';\nimport {\n SignatureConfigurationError,\n SignatureInputError,\n SignatureProviderError,\n SignatureTenantMismatchError,\n SignatureVerificationError,\n} from '../errors.js';\nimport {\n getSignatureFetch,\n normalizeDate,\n parseOptionalEpochSeconds,\n readBoolean,\n readNumber,\n readRecord,\n readRecords,\n readString,\n requireNonEmptyString,\n requireRecord,\n type SignatureFetch,\n} from '../shared.js';\nimport type {\n CancelSignatureRequestInput,\n CreateSignatureRequestInput,\n DownloadSignatureArtifactInput,\n ExtendSignatureRequestExpiryInput,\n ParseSignatureWebhookInput,\n SignatureArtifact,\n SignatureAuthentication,\n SignatureAuthenticationMethod,\n SignatureField,\n SignatureProvider,\n SignatureProviderCapabilities,\n SignatureRequest,\n SignatureRequestReference,\n SignatureRequestStatus,\n SignatureSigner,\n SignatureSignerInput,\n SignatureSignerStatus,\n SignatureWebhookEvent,\n} from '../types.js';\n\nexport const BOLDSIGN_PROVIDER_ID = 'boldsign';\nexport const BOLDSIGN_TENANT_METADATA_KEY = 'hvTenantId';\nexport const BOLDSIGN_IDEMPOTENCY_METADATA_KEY = 'hvIdempotencyKey';\n\nconst DEFAULT_WEBHOOK_TOLERANCE_SECONDS = 300;\nconst MAX_BOLDSIGN_METADATA_ENTRIES = 50;\nconst MAX_BOLDSIGN_METADATA_KEY_LENGTH = 50;\nconst MAX_BOLDSIGN_METADATA_VALUE_LENGTH = 500;\nconst MAX_BOLDSIGN_DOCUMENT_BYTES = 25 * 1024 * 1024;\nconst MIN_EXPIRY_DAYS = 1;\nconst MAX_EXPIRY_DAYS = 180;\n\nconst SUPPORTED_BOLDSIGN_DOCUMENT_EVENTS = new Set([\n 'sent',\n 'signed',\n 'completed',\n 'declined',\n 'revoked',\n 'expired',\n 'viewed',\n 'deliveryfailed',\n 'sendfailed',\n]);\n\nexport type BoldSignRegion = 'us' | 'eu' | 'ca' | 'au';\n\nconst REGION_URLS: Readonly<Record<BoldSignRegion, string>> = {\n us: 'https://api.boldsign.com/v1',\n eu: 'https://api-eu.boldsign.com/v1',\n ca: 'https://api-ca.boldsign.com/v1',\n au: 'https://api-au.boldsign.com/v1',\n};\n\nexport interface BoldSignAdapterOptions {\n /** Bind one adapter and its credential/webhook secret to one tenant. */\n tenantId: string;\n apiKey?: string;\n accessToken?: string;\n /** Defaults to Canada for HappyVertical's first deployment. */\n region?: BoldSignRegion;\n apiBaseUrl?: string;\n webhookSecrets?: string | readonly string[];\n webhookToleranceSeconds?: number;\n fetch?: SignatureFetch;\n /** Testable wall clock used for replay checks and evidence timestamps. */\n now?: () => Date;\n}\n\ninterface BoldSignRequestOptions {\n method?: string;\n body?: unknown;\n signal?: AbortSignal;\n operation?: 'create' | 'read' | 'mutate';\n expect?: 'json' | 'empty' | 'stream';\n}\n\nexport class BoldSignAdapter implements SignatureProvider {\n readonly capabilities: SignatureProviderCapabilities;\n\n private readonly tenantId: string;\n private readonly apiKey?: string;\n private readonly accessToken?: string;\n private readonly apiBaseUrl: string;\n private readonly webhookSecrets: readonly string[];\n private readonly webhookToleranceSeconds: number;\n private readonly fetch: SignatureFetch;\n private readonly now: () => Date;\n\n constructor(options: BoldSignAdapterOptions) {\n if (!options || typeof options !== 'object' || Array.isArray(options)) {\n throw new SignatureConfigurationError(\n 'BoldSignAdapter options must be an object.',\n );\n }\n\n this.tenantId = configurationString(\n options.tenantId,\n 'BoldSignAdapter tenantId',\n );\n this.apiKey = optionalConfigurationString(\n options.apiKey,\n 'BoldSignAdapter apiKey',\n );\n this.accessToken = optionalConfigurationString(\n options.accessToken,\n 'BoldSignAdapter accessToken',\n );\n\n if (Boolean(this.apiKey) === Boolean(this.accessToken)) {\n throw new SignatureConfigurationError(\n 'BoldSignAdapter requires exactly one of apiKey or accessToken.',\n );\n }\n\n const region = options.region ?? 'ca';\n\n if (!(region in REGION_URLS)) {\n throw new SignatureConfigurationError(\n `BoldSignAdapter region must be one of ${Object.keys(REGION_URLS).join(', ')}.`,\n );\n }\n\n this.apiBaseUrl = normalizeBaseUrl(\n options.apiBaseUrl ?? REGION_URLS[region],\n );\n this.webhookSecrets = normalizeWebhookSecrets(options.webhookSecrets);\n this.webhookToleranceSeconds = normalizeWebhookTolerance(\n options.webhookToleranceSeconds,\n );\n this.fetch = getSignatureFetch(options.fetch);\n this.now = options.now ?? (() => new Date());\n\n if (typeof this.now !== 'function') {\n throw new SignatureConfigurationError(\n 'BoldSignAdapter now must be a function.',\n );\n }\n\n this.capabilities = {\n id: BOLDSIGN_PROVIDER_ID,\n displayName: 'BoldSign',\n region,\n supportsWebhooks: true,\n supportsCancellation: true,\n supportsExpiryExtension: true,\n supportsSignedDocument: true,\n supportsAuditTrail: true,\n providerEnforcedIdempotency: false,\n authenticationMethods: [\n 'none',\n 'access_code',\n 'email_otp',\n 'sms_otp',\n 'identity_verification',\n ],\n };\n }\n\n async createRequest(\n input: CreateSignatureRequestInput,\n ): Promise<SignatureRequest> {\n this.assertTenant(input.tenantId);\n const idempotencyKey = requireNonEmptyString(\n input.idempotencyKey,\n 'BoldSign idempotencyKey',\n );\n const title = requireNonEmptyString(input.title, 'BoldSign title');\n const documents = await normalizeDocuments(input.documents, input.signal);\n const signers = normalizeSignerInputs(input.signers);\n const metadata = normalizeMetadata(input.metadata, {\n [BOLDSIGN_TENANT_METADATA_KEY]: this.tenantId,\n [BOLDSIGN_IDEMPOTENCY_METADATA_KEY]: idempotencyKey,\n });\n const expiresInDays = normalizeExpiryDays(input.expiresInDays);\n\n const response = (await this.request('/document/send', {\n method: 'POST',\n operation: 'create',\n signal: input.signal,\n body: {\n Title: title,\n Message: optionalTrimmedString(input.message),\n Files: documents.map((document) => ({\n base64: `data:${document.mediaType};base64,${Buffer.from(document.data).toString('base64')}`,\n fileName: document.name,\n })),\n Signers: signers.map(toBoldSignSigner),\n EnableSigningOrder: input.signingOrder ?? false,\n ExpiryDateType: 'Days',\n ExpiryDays: expiresInDays,\n ExpiryValue: expiresInDays,\n MetaData: metadata,\n },\n })) as Record<string, unknown>;\n\n const id = requireProviderString(\n readString(response, 'documentId'),\n 'BoldSign send response documentId',\n );\n\n return {\n provider: BOLDSIGN_PROVIDER_ID,\n tenantId: this.tenantId,\n id,\n status: 'prepared',\n title,\n signers: signers.map(inputSignerToResult),\n expiresAt: new Date(\n this.now().getTime() + expiresInDays * 24 * 60 * 60 * 1_000,\n ),\n metadata,\n raw: response,\n };\n }\n\n async getRequest(\n input: SignatureRequestReference,\n ): Promise<SignatureRequest> {\n this.assertTenant(input.tenantId);\n const requestId = requireNonEmptyString(\n input.requestId,\n 'BoldSign requestId',\n );\n const response = (await this.request(\n `/document/properties?documentId=${encodeURIComponent(requestId)}`,\n { signal: input.signal, operation: 'read' },\n )) as Record<string, unknown>;\n\n this.assertProviderTenant(response);\n\n return mapBoldSignRequest(response, this.tenantId);\n }\n\n async cancelRequest(\n input: CancelSignatureRequestInput,\n ): Promise<SignatureRequest> {\n const reason = requireNonEmptyString(\n input.reason,\n 'BoldSign cancellation reason',\n );\n const current = await this.getRequest(input);\n\n if (isTerminalStatus(current.status)) {\n throw new SignatureInputError(\n `BoldSign request ${current.id} cannot be cancelled from ${current.status}.`,\n );\n }\n\n await this.request(\n `/document/revoke?documentId=${encodeURIComponent(current.id)}`,\n {\n method: 'POST',\n operation: 'mutate',\n expect: 'empty',\n signal: input.signal,\n body: { Message: reason },\n },\n );\n\n return { ...current, status: 'cancelled' };\n }\n\n async extendExpiry(\n input: ExtendSignatureRequestExpiryInput,\n ): Promise<SignatureRequest> {\n const current = await this.getRequest(input);\n const expiresAt = normalizeDate(input.expiresAt, 'BoldSign expiresAt');\n\n if (isTerminalStatus(current.status)) {\n throw new SignatureInputError(\n `BoldSign request ${current.id} expiry cannot be extended from ${current.status}.`,\n );\n }\n\n if (expiresAt.getTime() <= this.now().getTime()) {\n throw new SignatureInputError(\n 'BoldSign expiresAt must be in the future.',\n );\n }\n\n if (\n current.expiresAt &&\n expiresAt.getTime() <= current.expiresAt.getTime()\n ) {\n throw new SignatureInputError(\n 'BoldSign expiresAt must extend the current expiry date.',\n );\n }\n\n if (\n current.createdAt &&\n expiresAt.getTime() >\n current.createdAt.getTime() + MAX_EXPIRY_DAYS * 24 * 60 * 60 * 1_000\n ) {\n throw new SignatureInputError(\n `BoldSign expiresAt cannot exceed ${MAX_EXPIRY_DAYS} days from document creation.`,\n );\n }\n\n await this.request(\n `/document/extendExpiry?documentId=${encodeURIComponent(current.id)}`,\n {\n method: 'PATCH',\n operation: 'mutate',\n expect: 'empty',\n signal: input.signal,\n body: {\n // We create requests with BoldSign's `Days` expiry type, whose\n // extendExpiry endpoint requires a yyyy-MM-dd value.\n NewExpiryValue: expiresAt.toISOString().slice(0, 10),\n WarnPrior: input.warnPrior,\n },\n },\n );\n\n return { ...current, expiresAt };\n }\n\n async downloadArtifact(\n input: DownloadSignatureArtifactInput,\n ): Promise<SignatureArtifact> {\n if (!['signed_document', 'audit_trail'].includes(input.kind)) {\n throw new SignatureInputError(\n 'BoldSign artifact kind must be signed_document or audit_trail.',\n );\n }\n\n const current = await this.getRequest(input);\n\n if (current.status !== 'completed') {\n throw new SignatureInputError(\n 'BoldSign execution artifacts may only be downloaded after completion.',\n );\n }\n\n const endpoint =\n input.kind === 'signed_document'\n ? '/document/download'\n : '/document/downloadAuditLog';\n const response = (await this.request(\n `${endpoint}?documentId=${encodeURIComponent(current.id)}`,\n {\n signal: input.signal,\n operation: 'read',\n expect: 'stream',\n },\n )) as ReadableStream<Uint8Array>;\n const suffix = input.kind === 'signed_document' ? 'signed' : 'audit';\n const hashed = createSha256Stream(response);\n\n return {\n provider: BOLDSIGN_PROVIDER_ID,\n tenantId: this.tenantId,\n requestId: current.id,\n kind: input.kind,\n filename: `${safeFilename(current.id)}-${suffix}.pdf`,\n mediaType: 'application/pdf',\n stream: hashed.stream,\n sha256: hashed.sha256,\n retrievedAt: new Date(this.now()),\n };\n }\n\n parseWebhook(input: ParseSignatureWebhookInput): SignatureWebhookEvent {\n if (this.webhookSecrets.length === 0) {\n throw new SignatureConfigurationError(\n 'BoldSignAdapter parseWebhook requires webhookSecrets.',\n );\n }\n\n verifyBoldSignWebhookSignature({\n ...input,\n secrets: this.webhookSecrets,\n toleranceSeconds: this.webhookToleranceSeconds,\n now: this.now(),\n });\n\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(input.payload);\n } catch (error) {\n throw new SignatureVerificationError(\n 'BoldSign webhook payload is not valid JSON.',\n { cause: error },\n );\n }\n\n const body = verificationRecord(parsed, 'BoldSign webhook payload');\n const event = verificationRecord(\n body.event,\n 'BoldSign webhook event metadata',\n );\n const data = verificationRecord(body.data, 'BoldSign webhook data');\n this.assertProviderTenant(data);\n\n const id = requireVerificationString(\n readString(event, 'id'),\n 'BoldSign webhook event id',\n );\n const type = requireVerificationString(\n readString(event, 'eventType'),\n 'BoldSign webhook event type',\n );\n const normalizedType = type.toLowerCase();\n\n if (!SUPPORTED_BOLDSIGN_DOCUMENT_EVENTS.has(normalizedType)) {\n throw new SignatureVerificationError(\n `Unsupported BoldSign webhook event type: ${type}`,\n );\n }\n const requestId = requireVerificationString(\n readString(data, 'documentId'),\n 'BoldSign webhook documentId',\n );\n const created = readNumber(event, 'created');\n\n if (\n created === undefined ||\n !Number.isSafeInteger(created) ||\n created < 0 ||\n Number.isNaN(new Date(created * 1_000).getTime())\n ) {\n throw new SignatureVerificationError(\n 'BoldSign webhook event created must be an epoch timestamp.',\n );\n }\n\n return {\n id,\n provider: BOLDSIGN_PROVIDER_ID,\n tenantId: this.tenantId,\n requestId,\n type,\n status: mapBoldSignWebhookStatus(type, readString(data, 'status')),\n createdAt: new Date(created * 1_000),\n environment: optionalTrimmedString(readString(event, 'environment')),\n signers: mapBoldSignSigners(data),\n replay: {\n deduplicationKey: `${BOLDSIGN_PROVIDER_ID}:${this.tenantId}:${id}`,\n orderingKey: `${BOLDSIGN_PROVIDER_ID}:${this.tenantId}:${requestId}`,\n },\n raw: body,\n };\n }\n\n private assertTenant(tenantId: string): void {\n const normalized = requireNonEmptyString(tenantId, 'BoldSign tenantId');\n\n if (normalized !== this.tenantId) {\n throw new SignatureTenantMismatchError(\n 'Signature request tenant does not match the configured BoldSign tenant.',\n );\n }\n }\n\n private assertProviderTenant(value: Record<string, unknown>): void {\n const metadata = readBoldSignMetadata(value);\n const providerTenantId = metadata[BOLDSIGN_TENANT_METADATA_KEY];\n\n if (providerTenantId !== this.tenantId) {\n throw new SignatureTenantMismatchError(\n 'BoldSign resource is missing the configured tenant binding or belongs to another tenant.',\n );\n }\n }\n\n private async request(\n path: string,\n options: BoldSignRequestOptions = {},\n ): Promise<Record<string, unknown> | ReadableStream<Uint8Array> | undefined> {\n const headers = new Headers({ Accept: 'application/json' });\n\n if (this.apiKey) {\n headers.set('X-API-KEY', this.apiKey);\n } else if (this.accessToken) {\n headers.set('Authorization', `Bearer ${this.accessToken}`);\n }\n\n if (options.body !== undefined) {\n headers.set('Content-Type', 'application/json');\n }\n\n let response: Response;\n\n try {\n response = await this.fetch(`${this.apiBaseUrl}${path}`, {\n method: options.method ?? 'GET',\n headers,\n body:\n options.body === undefined ? undefined : JSON.stringify(options.body),\n signal: options.signal,\n });\n } catch (error) {\n if (error instanceof SignatureProviderError) {\n throw error;\n }\n\n throw new SignatureProviderError('BoldSign API request failed.', {\n cause: error,\n retryable: true,\n requestMayHaveSucceeded: options.operation === 'create',\n });\n }\n\n if (!response.ok) {\n throw await boldSignResponseError(\n response,\n options.operation === 'create',\n );\n }\n\n if (options.expect === 'empty' || response.status === 204) {\n return undefined;\n }\n\n if (options.expect === 'stream') {\n if (!response.body) {\n throw new SignatureProviderError(\n 'BoldSign API returned an empty artifact stream.',\n );\n }\n\n return response.body;\n }\n\n const text = await response.text();\n\n if (!text) {\n throw new SignatureProviderError(\n 'BoldSign API returned an empty JSON response.',\n );\n }\n\n try {\n return requireRecord(JSON.parse(text), 'BoldSign API response');\n } catch (error) {\n if (error instanceof SignatureProviderError) {\n throw error;\n }\n\n throw new SignatureProviderError('BoldSign API returned invalid JSON.', {\n cause: error,\n });\n }\n }\n}\n\nexport interface VerifyBoldSignWebhookSignatureInput\n extends ParseSignatureWebhookInput {\n secrets: string | readonly string[];\n toleranceSeconds?: number;\n now?: Date;\n}\n\nexport function verifyBoldSignWebhookSignature(\n input: VerifyBoldSignWebhookSignatureInput,\n): void {\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n throw new SignatureVerificationError(\n 'BoldSign webhook verification input must be an object.',\n );\n }\n\n if (typeof input.payload !== 'string') {\n throw new SignatureVerificationError(\n 'BoldSign webhook payload must be a string.',\n );\n }\n\n const header = verificationString(\n input.signature,\n 'BoldSign signature header',\n );\n const secrets = normalizeVerificationSecrets(input.secrets);\n const toleranceSeconds = normalizeWebhookTolerance(input.toleranceSeconds);\n const now = input.now ?? new Date();\n\n if (!(now instanceof Date) || Number.isNaN(now.getTime())) {\n throw new SignatureVerificationError(\n 'BoldSign webhook verification now must be a valid Date.',\n );\n }\n\n const timestamps: string[] = [];\n const signatures: string[] = [];\n\n for (const part of header.split(',')) {\n const [rawKey, ...rawValue] = part.split('=');\n const key = rawKey?.trim();\n const value = rawValue.join('=').trim();\n\n if (!key || !value) {\n continue;\n }\n\n if (key === 't') {\n timestamps.push(value);\n } else if (key === 's0' || key === 's1') {\n signatures.push(value);\n }\n }\n\n if (timestamps.length !== 1 || signatures.length === 0) {\n throw new SignatureVerificationError('Invalid BoldSign signature header.');\n }\n\n const timestampText = timestamps[0] ?? '';\n\n if (!/^\\d+$/.test(timestampText)) {\n throw new SignatureVerificationError('Invalid BoldSign webhook timestamp.');\n }\n\n const timestamp = Number(timestampText);\n\n if (!Number.isSafeInteger(timestamp)) {\n throw new SignatureVerificationError('Invalid BoldSign webhook timestamp.');\n }\n\n const ageSeconds = Math.abs(Math.floor(now.getTime() / 1_000) - timestamp);\n\n if (ageSeconds > toleranceSeconds) {\n throw new SignatureVerificationError(\n 'BoldSign webhook timestamp is outside the allowed tolerance.',\n );\n }\n\n const signedPayload = `${timestampText}.${input.payload}`;\n const matched = secrets.some((secret) => {\n const expected = Buffer.from(\n createHmac('sha256', secret).update(signedPayload).digest('hex'),\n 'utf8',\n );\n\n return signatures.some((signature) => {\n if (!/^[a-f\\d]{64}$/i.test(signature)) {\n return false;\n }\n\n const received = Buffer.from(signature.toLowerCase(), 'utf8');\n\n return (\n received.length === expected.length &&\n timingSafeEqual(received, expected)\n );\n });\n });\n\n if (!matched) {\n throw new SignatureVerificationError(\n 'BoldSign webhook signature did not match.',\n );\n }\n}\n\nfunction configurationString(value: unknown, context: string): string {\n if (typeof value !== 'string' || !value.trim()) {\n throw new SignatureConfigurationError(\n `${context} must be a non-empty string.`,\n );\n }\n\n return value.trim();\n}\n\nfunction optionalConfigurationString(\n value: unknown,\n context: string,\n): string | undefined {\n return value === undefined ? undefined : configurationString(value, context);\n}\n\nfunction normalizeBaseUrl(value: string): string {\n const raw = configurationString(value, 'BoldSignAdapter apiBaseUrl');\n let url: URL;\n\n try {\n url = new URL(raw);\n } catch (error) {\n throw new SignatureConfigurationError(\n 'BoldSignAdapter apiBaseUrl must be a valid URL.',\n { cause: error },\n );\n }\n\n if (url.protocol !== 'https:') {\n throw new SignatureConfigurationError(\n 'BoldSignAdapter apiBaseUrl must use HTTPS.',\n );\n }\n\n if (url.username || url.password || url.search || url.hash) {\n throw new SignatureConfigurationError(\n 'BoldSignAdapter apiBaseUrl must not contain credentials, query parameters, or a fragment.',\n );\n }\n\n return url.toString().replace(/\\/+$/, '');\n}\n\nfunction normalizeWebhookSecrets(\n value: string | readonly string[] | undefined,\n): readonly string[] {\n if (value === undefined) {\n return [];\n }\n\n try {\n return normalizeVerificationSecrets(value);\n } catch (error) {\n throw new SignatureConfigurationError(\n 'BoldSignAdapter webhookSecrets must contain non-empty strings.',\n { cause: error },\n );\n }\n}\n\nfunction normalizeVerificationSecrets(\n value: string | readonly string[],\n): readonly string[] {\n const candidates = typeof value === 'string' ? [value] : value;\n\n if (!Array.isArray(candidates) || candidates.length === 0) {\n throw new SignatureVerificationError(\n 'BoldSign webhook secrets must contain at least one secret.',\n );\n }\n\n return candidates.map((secret) =>\n verificationString(secret, 'BoldSign webhook secret'),\n );\n}\n\nfunction normalizeWebhookTolerance(value: number | undefined): number {\n const tolerance = value ?? DEFAULT_WEBHOOK_TOLERANCE_SECONDS;\n\n if (!Number.isFinite(tolerance) || tolerance <= 0) {\n throw new SignatureConfigurationError(\n 'BoldSign webhook tolerance must be a positive finite number.',\n );\n }\n\n return tolerance;\n}\n\nasync function normalizeDocuments(\n documents: readonly CreateSignatureRequestInput['documents'][number][],\n signal?: AbortSignal,\n): Promise<readonly NormalizedSignatureDocument[]> {\n if (!Array.isArray(documents) || documents.length === 0) {\n throw new SignatureInputError(\n 'BoldSign createRequest requires at least one document.',\n );\n }\n\n if (documents.length > 25) {\n throw new SignatureInputError(\n 'BoldSign createRequest supports at most 25 documents.',\n );\n }\n\n const normalized: NormalizedSignatureDocument[] = [];\n let totalBytes = 0;\n\n for (const [index, document] of documents.entries()) {\n if (!document || typeof document !== 'object') {\n throw new SignatureInputError(\n `BoldSign document ${index + 1} must be an object.`,\n );\n }\n\n const name = requireNonEmptyString(\n document.name,\n `BoldSign document ${index + 1} name`,\n );\n const mediaType = requireNonEmptyString(\n document.mediaType,\n `BoldSign document ${index + 1} mediaType`,\n );\n const data = await readByteSource(\n document.data,\n `BoldSign document ${index + 1} data`,\n signal,\n );\n totalBytes += data.length;\n\n if (totalBytes > MAX_BOLDSIGN_DOCUMENT_BYTES) {\n throw new SignatureInputError(\n 'BoldSign document files exceed the 25 MB aggregate limit.',\n );\n }\n\n normalized.push({ name, mediaType, data });\n }\n\n return normalized;\n}\n\nfunction normalizeSignerInputs(\n signers: readonly SignatureSignerInput[],\n): readonly SignatureSignerInput[] {\n if (!Array.isArray(signers) || signers.length === 0) {\n throw new SignatureInputError(\n 'BoldSign createRequest requires at least one signer.',\n );\n }\n\n const normalized = signers.map((signer, index) => {\n if (!signer || typeof signer !== 'object') {\n throw new SignatureInputError(\n `BoldSign signer ${index + 1} must be an object.`,\n );\n }\n\n const name = requireNonEmptyString(\n signer.name,\n `BoldSign signer ${index + 1} name`,\n );\n const email = requireNonEmptyString(\n signer.email,\n `BoldSign signer ${index + 1} email`,\n );\n\n if (!/^\\S+@\\S+\\.\\S+$/.test(email)) {\n throw new SignatureInputError(\n `BoldSign signer ${index + 1} email must be valid.`,\n );\n }\n\n if (!Array.isArray(signer.fields) || signer.fields.length === 0) {\n throw new SignatureInputError(\n `BoldSign signer ${index + 1} requires at least one field.`,\n );\n }\n\n const fields = (signer.fields as readonly SignatureField[]).map(\n (field: SignatureField, fieldIndex: number) =>\n normalizeField(field, index, fieldIndex),\n );\n const order = normalizeOptionalPositiveInteger(\n signer.order,\n `BoldSign signer ${index + 1} order`,\n );\n\n return {\n ...signer,\n name,\n email,\n role: optionalTrimmedString(signer.role),\n privateMessage: optionalTrimmedString(signer.privateMessage),\n order,\n authentication: normalizeAuthentication(signer.authentication, index),\n fields,\n };\n });\n\n const emails = new Set<string>();\n\n for (const signer of normalized) {\n const email = signer.email.toLowerCase();\n\n if (emails.has(email)) {\n throw new SignatureInputError(\n 'BoldSign createRequest signer emails must be unique.',\n );\n }\n\n emails.add(email);\n }\n\n return normalized;\n}\n\nfunction normalizeField(\n field: SignatureField,\n signerIndex: number,\n fieldIndex: number,\n): SignatureField {\n const context = `BoldSign signer ${signerIndex + 1} field ${fieldIndex + 1}`;\n\n if (!field || typeof field !== 'object') {\n throw new SignatureInputError(`${context} must be an object.`);\n }\n\n const id = requireNonEmptyString(field.id, `${context} id`);\n\n if (!/^[A-Za-z_]\\w*$/.test(id)) {\n throw new SignatureInputError(\n `${context} id must start with a letter or underscore and contain only letters, digits, and underscores.`,\n );\n }\n\n if (!['signature', 'initial', 'date_signed', 'text'].includes(field.type)) {\n throw new SignatureInputError(`${context} has an unsupported type.`);\n }\n\n const page = normalizePositiveInteger(field.page, `${context} page`);\n\n if (!field.bounds || typeof field.bounds !== 'object') {\n throw new SignatureInputError(`${context} bounds must be an object.`);\n }\n\n const bounds = {\n x: normalizeNonNegativeFinite(field.bounds.x, `${context} bounds.x`),\n y: normalizeNonNegativeFinite(field.bounds.y, `${context} bounds.y`),\n width: normalizePositiveFinite(\n field.bounds.width,\n `${context} bounds.width`,\n ),\n height: normalizePositiveFinite(\n field.bounds.height,\n `${context} bounds.height`,\n ),\n };\n\n return {\n id,\n type: field.type,\n page,\n bounds,\n required: field.required ?? true,\n value: optionalTrimmedString(field.value),\n };\n}\n\nfunction normalizeAuthentication(\n value: SignatureAuthentication | undefined,\n signerIndex: number,\n): SignatureAuthentication {\n const authentication = value ?? { method: 'none' };\n const context = `BoldSign signer ${signerIndex + 1} authentication`;\n\n if (!authentication || typeof authentication !== 'object') {\n throw new SignatureInputError(`${context} must be an object.`);\n }\n\n if (\n ![\n 'none',\n 'access_code',\n 'email_otp',\n 'sms_otp',\n 'identity_verification',\n ].includes(authentication.method)\n ) {\n throw new SignatureInputError(`${context} method is unsupported.`);\n }\n\n if (authentication.method === 'access_code') {\n return {\n method: 'access_code',\n accessCode: requireNonEmptyString(\n authentication.accessCode,\n `${context} accessCode`,\n ),\n };\n }\n\n if (authentication.method === 'sms_otp') {\n const phone = authentication.phone;\n\n if (!phone || typeof phone !== 'object') {\n throw new SignatureInputError(\n `${context} phone is required for sms_otp.`,\n );\n }\n\n const countryCode = requireNonEmptyString(\n phone.countryCode,\n `${context} phone.countryCode`,\n );\n const number = requireNonEmptyString(\n phone.number,\n `${context} phone.number`,\n );\n\n if (\n !/^\\+\\d{1,3}$/.test(countryCode) ||\n !/^\\d{4,15}$/.test(number) ||\n countryCode.length - 1 + number.length > 15\n ) {\n throw new SignatureInputError(\n `${context} phone must contain an E.164 country code and national number.`,\n );\n }\n\n return { method: 'sms_otp', phone: { countryCode, number } };\n }\n\n if (authentication.method === 'identity_verification') {\n const settings = authentication.identityVerification ?? {};\n const frequency = normalizeOptionalEnum(\n settings.frequency,\n ['every_access', 'until_signed', 'once_per_document'] as const,\n `${context} frequency`,\n );\n const nameMatch = normalizeOptionalEnum(\n settings.nameMatch,\n ['strict', 'moderate', 'lenient'] as const,\n `${context} nameMatch`,\n );\n const maximumRetryCount = normalizeOptionalIntegerRange(\n settings.maximumRetryCount,\n 1,\n 10,\n `${context} maximumRetryCount`,\n );\n const allowedDocumentTypes = normalizeOptionalEnumArray(\n settings.allowedDocumentTypes,\n ['passport', 'identity_card', 'driver_license'] as const,\n `${context} allowedDocumentTypes`,\n );\n\n if (\n settings.allowedCountries !== undefined &&\n !Array.isArray(settings.allowedCountries)\n ) {\n throw new SignatureInputError(\n `${context} allowedCountries must be an array.`,\n );\n }\n\n const allowedCountries = settings.allowedCountries?.map((country) => {\n const normalized = requireNonEmptyString(\n country,\n `${context} allowed country`,\n ).toUpperCase();\n\n if (!/^[A-Z]{2}$/.test(normalized)) {\n throw new SignatureInputError(\n `${context} allowed countries must be ISO 3166-1 alpha-2 codes.`,\n );\n }\n\n return normalized;\n });\n\n return {\n method: 'identity_verification',\n identityVerification: {\n ...settings,\n frequency,\n nameMatch,\n maximumRetryCount,\n requireLiveCapture: normalizeOptionalBoolean(\n settings.requireLiveCapture,\n `${context} requireLiveCapture`,\n ),\n requireMatchingSelfie: normalizeOptionalBoolean(\n settings.requireMatchingSelfie,\n `${context} requireMatchingSelfie`,\n ),\n allowedDocumentTypes,\n allowedCountries,\n },\n };\n }\n\n return { method: authentication.method };\n}\n\nfunction normalizeMetadata(\n metadata: Readonly<Record<string, string>> | undefined,\n reserved: Record<string, string>,\n): Readonly<Record<string, string>> {\n if (\n metadata !== undefined &&\n (!metadata || typeof metadata !== 'object' || Array.isArray(metadata))\n ) {\n throw new SignatureInputError('BoldSign metadata must be an object.');\n }\n\n const result: Record<string, string> = {};\n const reservedKeys = new Set(Object.keys(reserved));\n\n for (const [key, value] of Object.entries(metadata ?? {})) {\n const normalizedKey = requireNonEmptyString(key, 'BoldSign metadata key');\n\n if (reservedKeys.has(normalizedKey)) {\n throw new SignatureInputError(\n `BoldSign metadata key ${normalizedKey} is reserved.`,\n );\n }\n\n if (normalizedKey.length > MAX_BOLDSIGN_METADATA_KEY_LENGTH) {\n throw new SignatureInputError(\n `BoldSign metadata key ${normalizedKey} exceeds ${MAX_BOLDSIGN_METADATA_KEY_LENGTH} characters.`,\n );\n }\n\n if (typeof value !== 'string') {\n throw new SignatureInputError(\n `BoldSign metadata value for ${normalizedKey} must be a string.`,\n );\n }\n\n if (value.length > MAX_BOLDSIGN_METADATA_VALUE_LENGTH) {\n throw new SignatureInputError(\n `BoldSign metadata value for ${normalizedKey} exceeds ${MAX_BOLDSIGN_METADATA_VALUE_LENGTH} characters.`,\n );\n }\n\n result[normalizedKey] = value;\n }\n\n for (const [key, value] of Object.entries(reserved)) {\n if (value.length > MAX_BOLDSIGN_METADATA_VALUE_LENGTH) {\n throw new SignatureInputError(\n `BoldSign ${key} exceeds ${MAX_BOLDSIGN_METADATA_VALUE_LENGTH} characters.`,\n );\n }\n\n result[key] = value;\n }\n\n if (Object.keys(result).length > MAX_BOLDSIGN_METADATA_ENTRIES) {\n throw new SignatureInputError(\n `BoldSign metadata supports at most ${MAX_BOLDSIGN_METADATA_ENTRIES} entries including tenant and idempotency bindings.`,\n );\n }\n\n return result;\n}\n\nfunction normalizeExpiryDays(value: number | undefined): number {\n const days = value ?? 60;\n\n if (\n !Number.isSafeInteger(days) ||\n days < MIN_EXPIRY_DAYS ||\n days > MAX_EXPIRY_DAYS\n ) {\n throw new SignatureInputError(\n `BoldSign expiresInDays must be an integer from ${MIN_EXPIRY_DAYS} to ${MAX_EXPIRY_DAYS}.`,\n );\n }\n\n return days;\n}\n\nfunction toBoldSignSigner(\n signer: SignatureSignerInput,\n): Record<string, unknown> {\n const authentication = signer.authentication ?? { method: 'none' as const };\n const result: Record<string, unknown> = {\n Name: signer.name,\n EmailAddress: signer.email,\n SignerType: 'Signer',\n SignerRole: signer.role,\n Order: signer.order,\n PrivateMessage: signer.privateMessage,\n Locale: 'EN',\n FormFields: signer.fields.map((field) => ({\n Id: field.id,\n Name: field.id,\n FieldType: toBoldSignFieldType(field.type),\n PageNumber: field.page,\n Bounds: {\n X: field.bounds.x,\n Y: field.bounds.y,\n Width: field.bounds.width,\n Height: field.bounds.height,\n },\n IsRequired: field.required ?? true,\n Value: field.value,\n })),\n ...toBoldSignAuthentication(authentication),\n };\n\n return withoutUndefined(result);\n}\n\nfunction toBoldSignFieldType(type: SignatureField['type']): string {\n switch (type) {\n case 'signature':\n return 'Signature';\n case 'initial':\n return 'Initial';\n case 'date_signed':\n return 'DateSigned';\n case 'text':\n return 'TextBox';\n }\n}\n\nfunction toBoldSignAuthentication(\n authentication: SignatureAuthentication,\n): Record<string, unknown> {\n switch (authentication.method) {\n case 'access_code':\n return {\n AuthenticationType: 'AccessCode',\n AuthenticationCode: authentication.accessCode,\n };\n case 'email_otp':\n return { AuthenticationType: 'EmailOTP', EnableEmailOTP: true };\n case 'sms_otp':\n return {\n AuthenticationType: 'SMSOTP',\n PhoneNumber: authentication.phone\n ? {\n CountryCode: authentication.phone.countryCode,\n Number: authentication.phone.number,\n }\n : undefined,\n };\n case 'identity_verification':\n return {\n AuthenticationType: 'IdVerification',\n IdentityVerificationSettings: toBoldSignIdentityVerification(\n authentication.identityVerification,\n ),\n };\n case 'none':\n return { AuthenticationType: 'None' };\n }\n}\n\nfunction toBoldSignIdentityVerification(\n settings: SignatureAuthentication['identityVerification'],\n): Record<string, unknown> {\n return withoutUndefined({\n Type:\n settings?.frequency === undefined\n ? undefined\n : {\n every_access: 'EveryAccess',\n until_signed: 'UntilSignCompleted',\n once_per_document: 'OncePerDocument',\n }[settings.frequency],\n MaximumRetryCount: settings?.maximumRetryCount,\n RequireLiveCapture: settings?.requireLiveCapture,\n RequireMatchingSelfie: settings?.requireMatchingSelfie,\n NameMatcher:\n settings?.nameMatch === undefined\n ? undefined\n : {\n strict: 'Strict',\n moderate: 'Moderate',\n lenient: 'Lenient',\n }[settings.nameMatch],\n AllowedDocumentTypes: settings?.allowedDocumentTypes?.map(\n (type) =>\n ({\n passport: 'Passport',\n identity_card: 'IDCard',\n driver_license: 'DriverLicense',\n })[type],\n ),\n AllowedCountries: settings?.allowedCountries,\n });\n}\n\nfunction inputSignerToResult(signer: SignatureSignerInput): SignatureSigner {\n return {\n name: signer.name,\n email: signer.email,\n role: signer.role,\n order: signer.order,\n status: 'pending',\n authenticationMethod: signer.authentication?.method ?? 'none',\n };\n}\n\nfunction mapBoldSignRequest(\n value: Record<string, unknown>,\n tenantId: string,\n): SignatureRequest {\n const id = requireProviderString(\n readString(value, 'documentId'),\n 'BoldSign document properties documentId',\n );\n const createdAt = parseOptionalEpochSeconds(value.createdDate);\n const expiresAt = parseBoldSignExpiry(value, createdAt);\n\n return {\n provider: BOLDSIGN_PROVIDER_ID,\n tenantId,\n id,\n status: mapBoldSignStatus(readString(value, 'status')),\n title: optionalTrimmedString(readString(value, 'messageTitle')),\n signers: mapBoldSignSigners(value),\n createdAt,\n expiresAt,\n metadata: readBoldSignMetadata(value),\n raw: value,\n };\n}\n\nfunction mapBoldSignSigners(value: Record<string, unknown>): SignatureSigner[] {\n return readRecords(value, 'signerDetails').map((signer) => ({\n id: optionalTrimmedString(readString(signer, 'id')),\n name: requireProviderString(\n readString(signer, 'signerName'),\n 'BoldSign signer name',\n ),\n email: requireProviderString(\n readString(signer, 'signerEmail'),\n 'BoldSign signer email',\n ),\n role: optionalTrimmedString(readString(signer, 'signerRole')),\n order: readNumber(signer, 'order'),\n status: mapBoldSignSignerStatus(\n readString(signer, 'status'),\n readBoolean(signer, 'isDeliveryFailed'),\n readBoolean(signer, 'isViewed'),\n readBoolean(signer, 'isAuthenticationFailed') === true ||\n readString(readRecord(signer, 'idVerification'), 'status')\n ?.trim()\n .toLowerCase() === 'failed',\n ),\n authenticationMethod: mapBoldSignAuthentication(\n readString(signer, 'authenticationType'),\n ),\n viewed: readBoolean(signer, 'isViewed'),\n deliveryFailed: readBoolean(signer, 'isDeliveryFailed'),\n }));\n}\n\nfunction mapBoldSignStatus(value: string | undefined): SignatureRequestStatus {\n switch (value?.trim().toLowerCase()) {\n case 'draft':\n return 'prepared';\n case 'inprogress':\n case 'in_progress':\n case 'sent':\n case 'needsattention':\n case 'needs_attention':\n case 'needs attention':\n return 'sent';\n case 'viewed':\n return 'viewed';\n case 'partiallysigned':\n case 'partially_signed':\n return 'partially_signed';\n case 'completed':\n return 'completed';\n case 'declined':\n return 'declined';\n case 'revoked':\n case 'cancelled':\n case 'canceled':\n return 'cancelled';\n case 'expired':\n return 'expired';\n case 'failed':\n case 'sendfailed':\n return 'failed';\n default:\n throw new SignatureProviderError(\n `Unsupported BoldSign document status: ${value ?? '<missing>'}`,\n );\n }\n}\n\nfunction mapBoldSignWebhookStatus(\n eventType: string,\n documentStatus: string | undefined,\n): SignatureRequestStatus {\n switch (eventType.trim().toLowerCase()) {\n case 'sent':\n return 'sent';\n case 'viewed':\n return 'viewed';\n case 'signed':\n return documentStatus?.toLowerCase() === 'completed'\n ? 'completed'\n : 'partially_signed';\n case 'completed':\n return 'completed';\n case 'declined':\n return 'declined';\n case 'revoked':\n return 'cancelled';\n case 'expired':\n return 'expired';\n case 'sendfailed':\n return 'failed';\n default:\n return mapBoldSignStatus(documentStatus);\n }\n}\n\nfunction mapBoldSignSignerStatus(\n value: string | undefined,\n deliveryFailed: boolean | undefined,\n viewed: boolean | undefined,\n authenticationFailed = false,\n): SignatureSignerStatus {\n if (deliveryFailed || authenticationFailed) {\n return 'failed';\n }\n\n switch (value?.trim().toLowerCase()) {\n case 'notcompleted':\n case 'not_completed':\n case 'pending':\n return viewed ? 'viewed' : 'pending';\n case 'completed':\n case 'signed':\n return 'signed';\n case 'declined':\n return 'declined';\n case 'expired':\n return 'expired';\n case 'failed':\n case 'authenticationfailed':\n return 'failed';\n default:\n throw new SignatureProviderError(\n `Unsupported BoldSign signer status: ${value ?? '<missing>'}`,\n );\n }\n}\n\nfunction mapBoldSignAuthentication(\n value: string | undefined,\n): SignatureAuthenticationMethod | undefined {\n switch (value?.trim().toLowerCase()) {\n case 'none':\n return 'none';\n case 'accesscode':\n return 'access_code';\n case 'emailotp':\n return 'email_otp';\n case 'smsotp':\n return 'sms_otp';\n case 'idverification':\n return 'identity_verification';\n default:\n return undefined;\n }\n}\n\nfunction readBoldSignMetadata(\n value: Record<string, unknown>,\n): Record<string, string> {\n const metadata =\n readRecord(value, 'metaData') ??\n readRecord(value, 'metadata') ??\n readRecord(value, 'MetaData') ??\n {};\n const result: Record<string, string> = {};\n\n for (const [key, item] of Object.entries(metadata)) {\n if (typeof item === 'string') {\n result[key] = item;\n }\n }\n\n return result;\n}\n\nfunction parseBoldSignExpiry(\n value: Record<string, unknown>,\n createdAt: Date | undefined,\n): Date | undefined {\n const raw = value.expiryDate;\n\n if (typeof raw === 'number' && Number.isFinite(raw)) {\n return new Date(raw * 1_000);\n }\n\n if (typeof raw === 'string' && raw.trim()) {\n const date = new Date(raw);\n\n if (!Number.isNaN(date.getTime())) {\n return date;\n }\n }\n\n const expiryDays = readNumber(value, 'expiryDays');\n\n return createdAt && expiryDays !== undefined\n ? new Date(createdAt.getTime() + expiryDays * 24 * 60 * 60 * 1_000)\n : undefined;\n}\n\nasync function boldSignResponseError(\n response: Response,\n createOperation: boolean,\n): Promise<SignatureProviderError> {\n const text = await response.text();\n let body: Record<string, unknown> | undefined;\n\n if (text) {\n try {\n const parsed = JSON.parse(text) as unknown;\n body =\n parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : undefined;\n } catch {\n body = undefined;\n }\n }\n\n const nestedError = body ? readRecord(body, 'error') : undefined;\n const message =\n optionalTrimmedString(readString(body, 'message')) ??\n optionalTrimmedString(readString(nestedError, 'message')) ??\n `HTTP ${response.status}`;\n const retryable =\n response.status === 408 ||\n response.status === 425 ||\n response.status === 429 ||\n response.status >= 500;\n\n return new SignatureProviderError(`BoldSign API: ${message}`, {\n status: response.status,\n retryable,\n retryAfterMs: parseRetryAfter(response.headers.get('Retry-After')),\n requestMayHaveSucceeded:\n createOperation && (response.status === 408 || response.status >= 500),\n });\n}\n\nfunction parseRetryAfter(value: string | null): number | undefined {\n if (!value) {\n return undefined;\n }\n\n const seconds = Number(value);\n\n if (Number.isFinite(seconds) && seconds >= 0) {\n return Math.round(seconds * 1_000);\n }\n\n const date = new Date(value);\n\n return Number.isNaN(date.getTime())\n ? undefined\n : Math.max(0, date.getTime() - Date.now());\n}\n\nfunction normalizePositiveInteger(value: number, context: string): number {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new SignatureInputError(`${context} must be a positive integer.`);\n }\n\n return value;\n}\n\nfunction normalizeOptionalPositiveInteger(\n value: number | undefined,\n context: string,\n): number | undefined {\n return value === undefined\n ? undefined\n : normalizePositiveInteger(value, context);\n}\n\nfunction normalizeOptionalIntegerRange(\n value: number | undefined,\n min: number,\n max: number,\n context: string,\n): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!Number.isSafeInteger(value) || value < min || value > max) {\n throw new SignatureInputError(\n `${context} must be an integer from ${min} to ${max}.`,\n );\n }\n\n return value;\n}\n\nfunction normalizeOptionalBoolean(\n value: boolean | undefined,\n context: string,\n): boolean | undefined {\n if (value !== undefined && typeof value !== 'boolean') {\n throw new SignatureInputError(`${context} must be a boolean.`);\n }\n\n return value;\n}\n\nfunction normalizeOptionalEnum<const T extends string>(\n value: T | undefined,\n allowed: readonly T[],\n context: string,\n): T | undefined {\n if (value !== undefined && !allowed.includes(value)) {\n throw new SignatureInputError(\n `${context} must be one of ${allowed.join(', ')}.`,\n );\n }\n\n return value;\n}\n\nfunction normalizeOptionalEnumArray<const T extends string>(\n value: readonly T[] | undefined,\n allowed: readonly T[],\n context: string,\n): readonly T[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!Array.isArray(value)) {\n throw new SignatureInputError(`${context} must be an array.`);\n }\n\n return value.map((item) => {\n const normalized = normalizeOptionalEnum(item, allowed, context);\n\n if (normalized === undefined) {\n throw new SignatureInputError(`${context} must not contain undefined.`);\n }\n\n return normalized;\n });\n}\n\nfunction normalizeNonNegativeFinite(value: number, context: string): number {\n if (!Number.isFinite(value) || value < 0) {\n throw new SignatureInputError(\n `${context} must be a non-negative finite number.`,\n );\n }\n\n return value;\n}\n\nfunction normalizePositiveFinite(value: number, context: string): number {\n if (!Number.isFinite(value) || value <= 0) {\n throw new SignatureInputError(\n `${context} must be a positive finite number.`,\n );\n }\n\n return value;\n}\n\nfunction optionalTrimmedString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction requireProviderString(\n value: string | undefined,\n context: string,\n): string {\n if (!value?.trim()) {\n throw new SignatureProviderError(`${context} must be a non-empty string.`);\n }\n\n return value.trim();\n}\n\nfunction verificationString(value: unknown, context: string): string {\n if (typeof value !== 'string' || !value.trim()) {\n throw new SignatureVerificationError(\n `${context} must be a non-empty string.`,\n );\n }\n\n return value.trim();\n}\n\nfunction requireVerificationString(\n value: string | undefined,\n context: string,\n): string {\n return verificationString(value, context);\n}\n\nfunction verificationRecord(\n value: unknown,\n context: string,\n): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new SignatureVerificationError(`${context} must be an object.`);\n }\n\n return value as Record<string, unknown>;\n}\n\nfunction withoutUndefined(\n value: Record<string, unknown>,\n): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(value).filter(([, item]) => item !== undefined),\n );\n}\n\nfunction safeFilename(value: string): string {\n return value.replace(/[^A-Za-z0-9_-]+/g, '_').slice(0, 120) || 'document';\n}\n\ninterface NormalizedSignatureDocument {\n name: string;\n mediaType: string;\n data: Uint8Array;\n}\n\nasync function readByteSource(\n source: CreateSignatureRequestInput['documents'][number]['data'],\n context: string,\n signal?: AbortSignal,\n): Promise<Uint8Array> {\n if (source instanceof Uint8Array) {\n if (source.length === 0) {\n throw new SignatureInputError(`${context} must not be empty.`);\n }\n\n if (source.length > MAX_BOLDSIGN_DOCUMENT_BYTES) {\n throw new SignatureInputError(\n `${context} exceeds BoldSign's 25 MB limit.`,\n );\n }\n\n return source;\n }\n\n const chunks: Uint8Array[] = [];\n let total = 0;\n const append = (chunk: unknown) => {\n signal?.throwIfAborted();\n\n if (!(chunk instanceof Uint8Array) || chunk.length === 0) {\n throw new SignatureInputError(\n `${context} stream must yield non-empty Uint8Array chunks.`,\n );\n }\n\n total += chunk.length;\n\n if (total > MAX_BOLDSIGN_DOCUMENT_BYTES) {\n throw new SignatureInputError(\n `${context} exceeds BoldSign's 25 MB limit.`,\n );\n }\n\n chunks.push(chunk);\n };\n\n signal?.throwIfAborted();\n\n if (isReadableStream(source)) {\n const reader = source.getReader();\n\n try {\n while (true) {\n const result = await reader.read();\n\n if (result.done) {\n break;\n }\n\n append(result.value);\n }\n } finally {\n reader.releaseLock();\n }\n } else if (isAsyncIterable(source)) {\n for await (const chunk of source) {\n append(chunk);\n }\n } else {\n throw new SignatureInputError(\n `${context} must be a Uint8Array, ReadableStream, or AsyncIterable.`,\n );\n }\n\n if (total === 0) {\n throw new SignatureInputError(`${context} must not be empty.`);\n }\n\n const result = new Uint8Array(total);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result;\n}\n\nfunction isReadableStream(value: unknown): value is ReadableStream<Uint8Array> {\n return (\n Boolean(value) &&\n typeof value === 'object' &&\n typeof (value as { getReader?: unknown }).getReader === 'function'\n );\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<Uint8Array> {\n return (\n value !== null &&\n value !== undefined &&\n typeof value === 'object' &&\n Symbol.asyncIterator in value\n );\n}\n\nfunction createSha256Stream(source: ReadableStream<Uint8Array>): {\n stream: ReadableStream<Uint8Array>;\n sha256: Promise<string>;\n} {\n const reader = source.getReader();\n const hash = createHash('sha256');\n let settled = false;\n let resolveHash: (value: string) => void;\n let rejectHash: (reason?: unknown) => void;\n const sha256 = new Promise<string>((resolve, reject) => {\n resolveHash = resolve;\n rejectHash = reject;\n });\n const stream = new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const result = await reader.read();\n\n if (result.done) {\n settled = true;\n resolveHash(hash.digest('hex'));\n controller.close();\n return;\n }\n\n hash.update(result.value);\n controller.enqueue(result.value);\n } catch (error) {\n settled = true;\n rejectHash(error);\n controller.error(error);\n }\n },\n async cancel(reason) {\n try {\n await reader.cancel(reason);\n } finally {\n if (!settled) {\n settled = true;\n rejectHash(\n new SignatureProviderError(\n 'BoldSign artifact stream was cancelled before hashing completed.',\n ),\n );\n }\n }\n },\n });\n\n return { stream, sha256 };\n}\n\nfunction isTerminalStatus(status: SignatureRequestStatus): boolean {\n return ['completed', 'declined', 'cancelled', 'expired', 'failed'].includes(\n status,\n );\n}\n"],"names":["result"],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
class SignatureError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
retryable;
|
|
4
|
+
status;
|
|
5
|
+
retryAfterMs;
|
|
6
|
+
/** A failed create call may have reached the provider and must be reconciled. */
|
|
7
|
+
requestMayHaveSucceeded;
|
|
8
|
+
constructor(message, code, options = {}) {
|
|
9
|
+
super(
|
|
10
|
+
message,
|
|
11
|
+
options.cause === void 0 ? void 0 : { cause: options.cause }
|
|
12
|
+
);
|
|
13
|
+
this.name = "SignatureError";
|
|
14
|
+
this.code = code;
|
|
15
|
+
this.retryable = options.retryable ?? false;
|
|
16
|
+
this.status = options.status;
|
|
17
|
+
this.retryAfterMs = options.retryAfterMs;
|
|
18
|
+
this.requestMayHaveSucceeded = options.requestMayHaveSucceeded ?? false;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
class SignatureConfigurationError extends SignatureError {
|
|
22
|
+
constructor(message, options = {}) {
|
|
23
|
+
super(message, "SIGNATURE_CONFIGURATION_ERROR", options);
|
|
24
|
+
this.name = "SignatureConfigurationError";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
class SignatureInputError extends SignatureError {
|
|
28
|
+
constructor(message, options = {}) {
|
|
29
|
+
super(message, "SIGNATURE_INVALID_INPUT", options);
|
|
30
|
+
this.name = "SignatureInputError";
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
class SignatureProviderError extends SignatureError {
|
|
34
|
+
constructor(message, options = {}) {
|
|
35
|
+
super(message, "SIGNATURE_PROVIDER_ERROR", options);
|
|
36
|
+
this.name = "SignatureProviderError";
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
class SignatureVerificationError extends SignatureError {
|
|
40
|
+
constructor(message, options = {}) {
|
|
41
|
+
super(message, "SIGNATURE_VERIFICATION_FAILED", options);
|
|
42
|
+
this.name = "SignatureVerificationError";
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
class SignatureTenantMismatchError extends SignatureError {
|
|
46
|
+
constructor(message, options = {}) {
|
|
47
|
+
super(message, "SIGNATURE_TENANT_MISMATCH", options);
|
|
48
|
+
this.name = "SignatureTenantMismatchError";
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export {
|
|
52
|
+
SignatureConfigurationError as S,
|
|
53
|
+
SignatureError as a,
|
|
54
|
+
SignatureInputError as b,
|
|
55
|
+
SignatureProviderError as c,
|
|
56
|
+
SignatureTenantMismatchError as d,
|
|
57
|
+
SignatureVerificationError as e
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=errors-Bnx7QrSA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors-Bnx7QrSA.js","sources":["../../src/errors.ts"],"sourcesContent":["export type SignatureErrorCode =\n | 'SIGNATURE_CONFIGURATION_ERROR'\n | 'SIGNATURE_INVALID_INPUT'\n | 'SIGNATURE_PROVIDER_ERROR'\n | 'SIGNATURE_VERIFICATION_FAILED'\n | 'SIGNATURE_TENANT_MISMATCH';\n\nexport class SignatureError extends Error {\n readonly code: SignatureErrorCode;\n readonly retryable: boolean;\n readonly status?: number;\n readonly retryAfterMs?: number;\n /** A failed create call may have reached the provider and must be reconciled. */\n readonly requestMayHaveSucceeded: boolean;\n\n constructor(\n message: string,\n code: SignatureErrorCode,\n options: {\n cause?: unknown;\n retryable?: boolean;\n status?: number;\n retryAfterMs?: number;\n requestMayHaveSucceeded?: boolean;\n } = {},\n ) {\n super(\n message,\n options.cause === undefined ? undefined : { cause: options.cause },\n );\n this.name = 'SignatureError';\n this.code = code;\n this.retryable = options.retryable ?? false;\n this.status = options.status;\n this.retryAfterMs = options.retryAfterMs;\n this.requestMayHaveSucceeded = options.requestMayHaveSucceeded ?? false;\n }\n}\n\nexport class SignatureConfigurationError extends SignatureError {\n constructor(message: string, options: { cause?: unknown } = {}) {\n super(message, 'SIGNATURE_CONFIGURATION_ERROR', options);\n this.name = 'SignatureConfigurationError';\n }\n}\n\nexport class SignatureInputError extends SignatureError {\n constructor(message: string, options: { cause?: unknown } = {}) {\n super(message, 'SIGNATURE_INVALID_INPUT', options);\n this.name = 'SignatureInputError';\n }\n}\n\nexport class SignatureProviderError extends SignatureError {\n constructor(\n message: string,\n options: {\n cause?: unknown;\n retryable?: boolean;\n status?: number;\n retryAfterMs?: number;\n requestMayHaveSucceeded?: boolean;\n } = {},\n ) {\n super(message, 'SIGNATURE_PROVIDER_ERROR', options);\n this.name = 'SignatureProviderError';\n }\n}\n\nexport class SignatureVerificationError extends SignatureError {\n constructor(message: string, options: { cause?: unknown } = {}) {\n super(message, 'SIGNATURE_VERIFICATION_FAILED', options);\n this.name = 'SignatureVerificationError';\n }\n}\n\nexport class SignatureTenantMismatchError extends SignatureError {\n constructor(message: string, options: { cause?: unknown } = {}) {\n super(message, 'SIGNATURE_TENANT_MISMATCH', options);\n this.name = 'SignatureTenantMismatchError';\n }\n}\n"],"names":[],"mappings":"AAOO,MAAM,uBAAuB,MAAM;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EAET,YACE,SACA,MACA,UAMI,CAAA,GACJ;AACA;AAAA,MACE;AAAA,MACA,QAAQ,UAAU,SAAY,SAAY,EAAE,OAAO,QAAQ,MAAA;AAAA,IAAM;AAEnE,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,YAAY,QAAQ,aAAa;AACtC,SAAK,SAAS,QAAQ;AACtB,SAAK,eAAe,QAAQ;AAC5B,SAAK,0BAA0B,QAAQ,2BAA2B;AAAA,EACpE;AACF;AAEO,MAAM,oCAAoC,eAAe;AAAA,EAC9D,YAAY,SAAiB,UAA+B,IAAI;AAC9D,UAAM,SAAS,iCAAiC,OAAO;AACvD,SAAK,OAAO;AAAA,EACd;AACF;AAEO,MAAM,4BAA4B,eAAe;AAAA,EACtD,YAAY,SAAiB,UAA+B,IAAI;AAC9D,UAAM,SAAS,2BAA2B,OAAO;AACjD,SAAK,OAAO;AAAA,EACd;AACF;AAEO,MAAM,+BAA+B,eAAe;AAAA,EACzD,YACE,SACA,UAMI,IACJ;AACA,UAAM,SAAS,4BAA4B,OAAO;AAClD,SAAK,OAAO;AAAA,EACd;AACF;AAEO,MAAM,mCAAmC,eAAe;AAAA,EAC7D,YAAY,SAAiB,UAA+B,IAAI;AAC9D,UAAM,SAAS,iCAAiC,OAAO;AACvD,SAAK,OAAO;AAAA,EACd;AACF;AAEO,MAAM,qCAAqC,eAAe;AAAA,EAC/D,YAAY,SAAiB,UAA+B,IAAI;AAC9D,UAAM,SAAS,6BAA6B,OAAO;AACnD,SAAK,OAAO;AAAA,EACd;AACF;"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export type SignatureErrorCode = 'SIGNATURE_CONFIGURATION_ERROR' | 'SIGNATURE_INVALID_INPUT' | 'SIGNATURE_PROVIDER_ERROR' | 'SIGNATURE_VERIFICATION_FAILED' | 'SIGNATURE_TENANT_MISMATCH';
|
|
2
|
+
export declare class SignatureError extends Error {
|
|
3
|
+
readonly code: SignatureErrorCode;
|
|
4
|
+
readonly retryable: boolean;
|
|
5
|
+
readonly status?: number;
|
|
6
|
+
readonly retryAfterMs?: number;
|
|
7
|
+
/** A failed create call may have reached the provider and must be reconciled. */
|
|
8
|
+
readonly requestMayHaveSucceeded: boolean;
|
|
9
|
+
constructor(message: string, code: SignatureErrorCode, options?: {
|
|
10
|
+
cause?: unknown;
|
|
11
|
+
retryable?: boolean;
|
|
12
|
+
status?: number;
|
|
13
|
+
retryAfterMs?: number;
|
|
14
|
+
requestMayHaveSucceeded?: boolean;
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
export declare class SignatureConfigurationError extends SignatureError {
|
|
18
|
+
constructor(message: string, options?: {
|
|
19
|
+
cause?: unknown;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export declare class SignatureInputError extends SignatureError {
|
|
23
|
+
constructor(message: string, options?: {
|
|
24
|
+
cause?: unknown;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
export declare class SignatureProviderError extends SignatureError {
|
|
28
|
+
constructor(message: string, options?: {
|
|
29
|
+
cause?: unknown;
|
|
30
|
+
retryable?: boolean;
|
|
31
|
+
status?: number;
|
|
32
|
+
retryAfterMs?: number;
|
|
33
|
+
requestMayHaveSucceeded?: boolean;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export declare class SignatureVerificationError extends SignatureError {
|
|
37
|
+
constructor(message: string, options?: {
|
|
38
|
+
cause?: unknown;
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
export declare class SignatureTenantMismatchError extends SignatureError {
|
|
42
|
+
constructor(message: string, options?: {
|
|
43
|
+
cause?: unknown;
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAC1B,+BAA+B,GAC/B,yBAAyB,GACzB,0BAA0B,GAC1B,+BAA+B,GAC/B,2BAA2B,CAAC;AAEhC,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,iFAAiF;IACjF,QAAQ,CAAC,uBAAuB,EAAE,OAAO,CAAC;gBAGxC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,kBAAkB,EACxB,OAAO,GAAE;QACP,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,uBAAuB,CAAC,EAAE,OAAO,CAAC;KAC9B;CAaT;AAED,qBAAa,2BAA4B,SAAQ,cAAc;gBACjD,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO;CAI/D;AAED,qBAAa,mBAAoB,SAAQ,cAAc;gBACzC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO;CAI/D;AAED,qBAAa,sBAAuB,SAAQ,cAAc;gBAEtD,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QACP,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,uBAAuB,CAAC,EAAE,OAAO,CAAC;KAC9B;CAKT;AAED,qBAAa,0BAA2B,SAAQ,cAAc;gBAChD,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO;CAI/D;AAED,qBAAa,4BAA6B,SAAQ,cAAc;gBAClD,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO;CAI/D"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { BoldSignAdapterOptions } from './adapters/boldsign.js';
|
|
2
|
+
import { SignatureProvider } from './types.js';
|
|
3
|
+
export type SignatureProviderOptions = {
|
|
4
|
+
type: 'boldsign';
|
|
5
|
+
} & BoldSignAdapterOptions;
|
|
6
|
+
export declare function createSignatureProvider(options: SignatureProviderOptions): Promise<SignatureProvider>;
|
|
7
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAErE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,UAAU,CAAC;CAClB,GAAG,sBAAsB,CAAC;AAE3B,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,iBAAiB,CAAC,CAyB5B"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider-neutral e-signature request, webhook, and evidence contracts.
|
|
3
|
+
*
|
|
4
|
+
* Adapter implementations are available from provider subpath exports.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
export type { BoldSignAdapterOptions, BoldSignRegion, } from './adapters/boldsign.js';
|
|
9
|
+
export * from './errors.js';
|
|
10
|
+
export * from './factory.js';
|
|
11
|
+
export type { SignatureFetch } from './shared.js';
|
|
12
|
+
export * from './types.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,YAAY,EACV,sBAAsB,EACtB,cAAc,GACf,MAAM,wBAAwB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,cAAc,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { S as SignatureConfigurationError } from "./chunks/errors-Bnx7QrSA.js";
|
|
2
|
+
import { a, b, c, d, e } from "./chunks/errors-Bnx7QrSA.js";
|
|
3
|
+
async function createSignatureProvider(options) {
|
|
4
|
+
if (!options || typeof options !== "object" || Array.isArray(options)) {
|
|
5
|
+
throw new SignatureConfigurationError(
|
|
6
|
+
"Signature provider options must be an object."
|
|
7
|
+
);
|
|
8
|
+
}
|
|
9
|
+
const type = options.type;
|
|
10
|
+
if (typeof type !== "string" || !type.trim()) {
|
|
11
|
+
throw new SignatureConfigurationError(
|
|
12
|
+
"Signature provider type must be a non-empty string."
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
switch (type.trim()) {
|
|
16
|
+
case "boldsign": {
|
|
17
|
+
const { BoldSignAdapter } = await import("./adapters/boldsign.js");
|
|
18
|
+
return new BoldSignAdapter(options);
|
|
19
|
+
}
|
|
20
|
+
default:
|
|
21
|
+
throw new SignatureConfigurationError(
|
|
22
|
+
`Unknown signature provider type: ${type.trim()}`
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
SignatureConfigurationError,
|
|
28
|
+
a as SignatureError,
|
|
29
|
+
b as SignatureInputError,
|
|
30
|
+
c as SignatureProviderError,
|
|
31
|
+
d as SignatureTenantMismatchError,
|
|
32
|
+
e as SignatureVerificationError,
|
|
33
|
+
createSignatureProvider
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/factory.ts"],"sourcesContent":["import type { BoldSignAdapterOptions } from './adapters/boldsign.js';\nimport { SignatureConfigurationError } from './errors.js';\nimport type { SignatureProvider } from './types.js';\n\nexport type SignatureProviderOptions = {\n type: 'boldsign';\n} & BoldSignAdapterOptions;\n\nexport async function createSignatureProvider(\n options: SignatureProviderOptions,\n): Promise<SignatureProvider> {\n if (!options || typeof options !== 'object' || Array.isArray(options)) {\n throw new SignatureConfigurationError(\n 'Signature provider options must be an object.',\n );\n }\n\n const type = (options as { type?: unknown }).type;\n\n if (typeof type !== 'string' || !type.trim()) {\n throw new SignatureConfigurationError(\n 'Signature provider type must be a non-empty string.',\n );\n }\n\n switch (type.trim()) {\n case 'boldsign': {\n const { BoldSignAdapter } = await import('./adapters/boldsign.js');\n return new BoldSignAdapter(options);\n }\n default:\n throw new SignatureConfigurationError(\n `Unknown signature provider type: ${type.trim()}`,\n );\n }\n}\n"],"names":[],"mappings":";;AAQA,eAAsB,wBACpB,SAC4B;AAC5B,MAAI,CAAC,WAAW,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,GAAG;AACrE,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAAA,EAEJ;AAEA,QAAM,OAAQ,QAA+B;AAE7C,MAAI,OAAO,SAAS,YAAY,CAAC,KAAK,QAAQ;AAC5C,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAAA,EAEJ;AAEA,UAAQ,KAAK,QAAK;AAAA,IAChB,KAAK,YAAY;AACf,YAAM,EAAE,gBAAA,IAAoB,MAAM,OAAO,wBAAwB;AACjE,aAAO,IAAI,gBAAgB,OAAO;AAAA,IACpC;AAAA,IACA;AACE,YAAM,IAAI;AAAA,QACR,oCAAoC,KAAK,MAAM;AAAA,MAAA;AAAA,EACjD;AAEN;"}
|
package/dist/shared.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type SignatureFetch = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
|
|
2
|
+
export declare function getSignatureFetch(fetchLike?: SignatureFetch): SignatureFetch;
|
|
3
|
+
export declare function requireNonEmptyString(value: unknown, context: string): string;
|
|
4
|
+
export declare function requireRecord(value: unknown, context: string): Record<string, unknown>;
|
|
5
|
+
export declare function readString(value: Record<string, unknown> | undefined, key: string): string | undefined;
|
|
6
|
+
export declare function readNumber(value: Record<string, unknown> | undefined, key: string): number | undefined;
|
|
7
|
+
export declare function readBoolean(value: Record<string, unknown> | undefined, key: string): boolean | undefined;
|
|
8
|
+
export declare function readRecord(value: Record<string, unknown> | undefined, key: string): Record<string, unknown> | undefined;
|
|
9
|
+
export declare function readRecords(value: Record<string, unknown> | undefined, key: string): Record<string, unknown>[];
|
|
10
|
+
export declare function normalizeDate(value: Date | string, context: string): Date;
|
|
11
|
+
export declare function parseOptionalEpochSeconds(value: unknown): Date | undefined;
|
|
12
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG,CAC3B,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,EAC7B,IAAI,CAAC,EAAE,WAAW,KACf,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvB,wBAAgB,iBAAiB,CAAC,SAAS,CAAC,EAAE,cAAc,GAAG,cAAc,CAU5E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAM7E;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMzB;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC1C,GAAG,EAAE,MAAM,GACV,MAAM,GAAG,SAAS,CAIpB;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC1C,GAAG,EAAE,MAAM,GACV,MAAM,GAAG,SAAS,CAIpB;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC1C,GAAG,EAAE,MAAM,GACV,OAAO,GAAG,SAAS,CAIrB;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC1C,GAAG,EAAE,MAAM,GACV,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAMrC;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC1C,GAAG,EAAE,MAAM,GACV,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAW3B;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAYzE;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,CAI1E"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
export type SignatureProviderType = 'boldsign';
|
|
2
|
+
export type SignatureRequestStatus = 'prepared' | 'sent' | 'delivered' | 'viewed' | 'partially_signed' | 'completed' | 'declined' | 'cancelled' | 'expired' | 'failed';
|
|
3
|
+
export type SignatureSignerStatus = 'pending' | 'viewed' | 'signed' | 'declined' | 'expired' | 'failed';
|
|
4
|
+
export type SignatureAuthenticationMethod = 'none' | 'access_code' | 'email_otp' | 'sms_otp' | 'identity_verification';
|
|
5
|
+
export type SignatureFieldType = 'signature' | 'initial' | 'date_signed' | 'text';
|
|
6
|
+
export type SignatureArtifactKind = 'signed_document' | 'audit_trail';
|
|
7
|
+
export interface SignatureProviderCapabilities {
|
|
8
|
+
id: string;
|
|
9
|
+
displayName: string;
|
|
10
|
+
region: string;
|
|
11
|
+
supportsWebhooks: boolean;
|
|
12
|
+
supportsCancellation: boolean;
|
|
13
|
+
supportsExpiryExtension: boolean;
|
|
14
|
+
supportsSignedDocument: boolean;
|
|
15
|
+
supportsAuditTrail: boolean;
|
|
16
|
+
/** Whether the remote API provides atomic request-creation idempotency. */
|
|
17
|
+
providerEnforcedIdempotency: boolean;
|
|
18
|
+
authenticationMethods: readonly SignatureAuthenticationMethod[];
|
|
19
|
+
}
|
|
20
|
+
export type SignatureByteSource = Uint8Array | ReadableStream<Uint8Array> | AsyncIterable<Uint8Array>;
|
|
21
|
+
export interface SignatureDocument {
|
|
22
|
+
name: string;
|
|
23
|
+
mediaType: string;
|
|
24
|
+
data: SignatureByteSource;
|
|
25
|
+
}
|
|
26
|
+
export interface SignatureFieldBounds {
|
|
27
|
+
x: number;
|
|
28
|
+
y: number;
|
|
29
|
+
width: number;
|
|
30
|
+
height: number;
|
|
31
|
+
}
|
|
32
|
+
export interface SignatureField {
|
|
33
|
+
id: string;
|
|
34
|
+
type: SignatureFieldType;
|
|
35
|
+
/** One-based page number in the provider's combined document. */
|
|
36
|
+
page: number;
|
|
37
|
+
bounds: SignatureFieldBounds;
|
|
38
|
+
required?: boolean;
|
|
39
|
+
value?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface SignaturePhoneNumber {
|
|
42
|
+
/** E.164 country calling code, including the leading `+`. */
|
|
43
|
+
countryCode: string;
|
|
44
|
+
/** National phone number, without the country calling code. */
|
|
45
|
+
number: string;
|
|
46
|
+
}
|
|
47
|
+
export interface SignatureIdentityVerificationOptions {
|
|
48
|
+
frequency?: 'every_access' | 'until_signed' | 'once_per_document';
|
|
49
|
+
maximumRetryCount?: number;
|
|
50
|
+
requireLiveCapture?: boolean;
|
|
51
|
+
requireMatchingSelfie?: boolean;
|
|
52
|
+
nameMatch?: 'strict' | 'moderate' | 'lenient';
|
|
53
|
+
allowedDocumentTypes?: readonly ('passport' | 'identity_card' | 'driver_license')[];
|
|
54
|
+
allowedCountries?: readonly string[];
|
|
55
|
+
}
|
|
56
|
+
export interface SignatureAuthentication {
|
|
57
|
+
method: SignatureAuthenticationMethod;
|
|
58
|
+
/** Required only for `access_code`; never returned by provider reads/events. */
|
|
59
|
+
accessCode?: string;
|
|
60
|
+
/** Required only for `sms_otp`. */
|
|
61
|
+
phone?: SignaturePhoneNumber;
|
|
62
|
+
identityVerification?: SignatureIdentityVerificationOptions;
|
|
63
|
+
}
|
|
64
|
+
export interface SignatureSignerInput {
|
|
65
|
+
name: string;
|
|
66
|
+
email: string;
|
|
67
|
+
role?: string;
|
|
68
|
+
order?: number;
|
|
69
|
+
privateMessage?: string;
|
|
70
|
+
authentication?: SignatureAuthentication;
|
|
71
|
+
fields: readonly SignatureField[];
|
|
72
|
+
}
|
|
73
|
+
export interface SignatureSigner {
|
|
74
|
+
id?: string;
|
|
75
|
+
name: string;
|
|
76
|
+
email: string;
|
|
77
|
+
role?: string;
|
|
78
|
+
order?: number;
|
|
79
|
+
status: SignatureSignerStatus;
|
|
80
|
+
authenticationMethod?: SignatureAuthenticationMethod;
|
|
81
|
+
viewed?: boolean;
|
|
82
|
+
deliveryFailed?: boolean;
|
|
83
|
+
}
|
|
84
|
+
export interface CreateSignatureRequestInput {
|
|
85
|
+
/** Tenant boundary for the credential-bearing provider instance. */
|
|
86
|
+
tenantId: string;
|
|
87
|
+
/** Stable caller key persisted with the remote request for reconciliation. */
|
|
88
|
+
idempotencyKey: string;
|
|
89
|
+
title: string;
|
|
90
|
+
message?: string;
|
|
91
|
+
documents: readonly SignatureDocument[];
|
|
92
|
+
signers: readonly SignatureSignerInput[];
|
|
93
|
+
signingOrder?: boolean;
|
|
94
|
+
/** Provider document lifetime. BoldSign accepts 1–180 days. */
|
|
95
|
+
expiresInDays?: number;
|
|
96
|
+
metadata?: Readonly<Record<string, string>>;
|
|
97
|
+
signal?: AbortSignal;
|
|
98
|
+
}
|
|
99
|
+
export interface SignatureRequestReference {
|
|
100
|
+
tenantId: string;
|
|
101
|
+
requestId: string;
|
|
102
|
+
signal?: AbortSignal;
|
|
103
|
+
}
|
|
104
|
+
export interface SignatureRequest {
|
|
105
|
+
provider: string;
|
|
106
|
+
tenantId: string;
|
|
107
|
+
id: string;
|
|
108
|
+
status: SignatureRequestStatus;
|
|
109
|
+
title?: string;
|
|
110
|
+
signers: readonly SignatureSigner[];
|
|
111
|
+
createdAt?: Date;
|
|
112
|
+
expiresAt?: Date;
|
|
113
|
+
metadata?: Readonly<Record<string, string>>;
|
|
114
|
+
raw?: unknown;
|
|
115
|
+
}
|
|
116
|
+
export interface CancelSignatureRequestInput extends SignatureRequestReference {
|
|
117
|
+
reason: string;
|
|
118
|
+
}
|
|
119
|
+
export interface ExtendSignatureRequestExpiryInput extends SignatureRequestReference {
|
|
120
|
+
expiresAt: Date | string;
|
|
121
|
+
warnPrior?: boolean;
|
|
122
|
+
}
|
|
123
|
+
export interface DownloadSignatureArtifactInput extends SignatureRequestReference {
|
|
124
|
+
kind: SignatureArtifactKind;
|
|
125
|
+
}
|
|
126
|
+
export interface SignatureArtifact {
|
|
127
|
+
provider: string;
|
|
128
|
+
tenantId: string;
|
|
129
|
+
requestId: string;
|
|
130
|
+
kind: SignatureArtifactKind;
|
|
131
|
+
filename: string;
|
|
132
|
+
mediaType: string;
|
|
133
|
+
/** Single-use stream of the exact provider response bytes. */
|
|
134
|
+
stream: ReadableStream<Uint8Array>;
|
|
135
|
+
/** Resolves after `stream` is fully consumed with its lowercase SHA-256. */
|
|
136
|
+
sha256: Promise<string>;
|
|
137
|
+
retrievedAt: Date;
|
|
138
|
+
}
|
|
139
|
+
export interface SignatureWebhookReplayMetadata {
|
|
140
|
+
/** Persist under a unique constraint before applying the event. */
|
|
141
|
+
deduplicationKey: string;
|
|
142
|
+
/** Partition ordering comparisons by this provider request key. */
|
|
143
|
+
orderingKey: string;
|
|
144
|
+
}
|
|
145
|
+
export interface SignatureWebhookEvent {
|
|
146
|
+
/** Provider event identifier; consumers must persist it as a unique key. */
|
|
147
|
+
id: string;
|
|
148
|
+
provider: string;
|
|
149
|
+
tenantId: string;
|
|
150
|
+
requestId: string;
|
|
151
|
+
type: string;
|
|
152
|
+
status: SignatureRequestStatus;
|
|
153
|
+
createdAt: Date;
|
|
154
|
+
environment?: string;
|
|
155
|
+
signers: readonly SignatureSigner[];
|
|
156
|
+
replay: SignatureWebhookReplayMetadata;
|
|
157
|
+
raw: unknown;
|
|
158
|
+
}
|
|
159
|
+
export interface ParseSignatureWebhookInput {
|
|
160
|
+
/** Exact, unmodified UTF-8 request body. */
|
|
161
|
+
payload: string;
|
|
162
|
+
signature: string;
|
|
163
|
+
}
|
|
164
|
+
export interface SignatureProvider {
|
|
165
|
+
readonly capabilities: SignatureProviderCapabilities;
|
|
166
|
+
createRequest(input: CreateSignatureRequestInput): Promise<SignatureRequest>;
|
|
167
|
+
getRequest(input: SignatureRequestReference): Promise<SignatureRequest>;
|
|
168
|
+
cancelRequest(input: CancelSignatureRequestInput): Promise<SignatureRequest>;
|
|
169
|
+
extendExpiry(input: ExtendSignatureRequestExpiryInput): Promise<SignatureRequest>;
|
|
170
|
+
downloadArtifact(input: DownloadSignatureArtifactInput): Promise<SignatureArtifact>;
|
|
171
|
+
parseWebhook(input: ParseSignatureWebhookInput): SignatureWebhookEvent;
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|