@splitin/verification-adapter-plaid-idv 0.1.0-beta.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/configuration.ts","../src/constants.ts","../src/manifest.ts","../src/status.ts","../src/webhook-crypto.ts","../src/webhook-key-cache.ts","../src/webhook.ts","../src/adapter.ts"],"names":["ProviderError","VERIFICATION_ADAPTER_CONTRACT_VERSION"],"mappings":"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","file":"index.js","sourcesContent":["import { ProviderError } from '@splitin/verification-adapter-sdk';\n\nexport interface PlaidIdvAdapterConfiguration {\n clientId: string;\n secret: string;\n templateId: string;\n clientName: string;\n webhookUrl?: string;\n}\n\n/**\n * CLI/env mapping helper. Adapter logic never reads process.env.\n * Production vs sandbox secrets are selected by the caller; the adapter\n * never accepts an arbitrary API origin.\n */\nexport function createPlaidIdvConfiguration(\n values: Record<string, string | undefined>,\n environment: 'sandbox' | 'production',\n): PlaidIdvAdapterConfiguration {\n const secret = environment === 'production'\n ? values.secret ?? values.PLAID_PRODUCTION_SECRET ?? values.PLAID_SECRET\n : values.secret ?? values.PLAID_SANDBOX_SECRET ?? values.PLAID_SECRET;\n const templateId = environment === 'production'\n ? values.templateId ?? values.PLAID_IDV_TEMPLATE_ID ?? values.PLAID_TEMPLATE_ID\n : values.templateId ?? values.PLAID_SANDBOX_TEMPLATE_ID ?? values.PLAID_IDV_TEMPLATE_ID ?? values.PLAID_TEMPLATE_ID;\n return Object.freeze({\n clientId: values.clientId ?? values.PLAID_CLIENT_ID ?? '',\n secret: secret ?? '',\n templateId: templateId ?? '',\n clientName: values.clientName ?? values.PLAID_CLIENT_NAME ?? '',\n webhookUrl: values.webhookUrl ?? values.PLAID_IDV_WEBHOOK_URL,\n });\n}\n\nexport function validatePlaidIdvConfiguration(config: PlaidIdvAdapterConfiguration): void {\n if (!config.clientId.trim() || !config.secret.trim() || !config.templateId.trim() || !config.clientName.trim()) {\n throw new ProviderError('INVALID_CONFIGURATION', 'Plaid Identity Verification is not configured.', {\n safeCode: 'plaid_idv_not_configured',\n });\n }\n if (config.webhookUrl) {\n let url: URL;\n try {\n url = new URL(config.webhookUrl);\n } catch {\n throw new ProviderError('INVALID_CONFIGURATION', 'Plaid webhook URL is invalid.', {\n safeCode: 'plaid_webhook_url_invalid',\n });\n }\n if (url.protocol !== 'https:' || url.username || url.password) {\n throw new ProviderError('INVALID_CONFIGURATION', 'Plaid webhook URL is invalid.', {\n safeCode: 'plaid_webhook_url_invalid',\n });\n }\n }\n}\n","export const PLAID_SANDBOX_HOST = 'sandbox.plaid.com';\nexport const PLAID_PRODUCTION_HOST = 'production.plaid.com';\nexport const PLAID_HOSTED_HOST = 'verify.plaid.com';\nexport const PLAID_API_VERSION = '2020-09-14';\nexport const PLAID_DISCLOSURE = 'Powered by Plaid';\nexport const PLAID_NORMALIZATION_VERSION = 'plaid-idv-v1';\nexport const PLAID_IDV_WEBHOOK_TYPE = 'IDENTITY_VERIFICATION';\nexport const PLAID_IDV_WEBHOOK_CODES = new Set(['STATUS_UPDATED', 'STEP_UPDATED', 'RETRIED']);\n","import {\n VERIFICATION_ADAPTER_CONTRACT_VERSION,\n defineProviderManifest,\n plainStringProperty,\n secretStringProperty,\n type ProviderManifestV1,\n} from '@splitin/verification-adapter-sdk';\n\nimport { PLAID_API_VERSION, PLAID_PRODUCTION_HOST, PLAID_SANDBOX_HOST } from './constants.ts';\n\nexport const plaidIdvProviderManifest: Readonly<ProviderManifestV1> = defineProviderManifest({\n contractVersion: VERIFICATION_ADAPTER_CONTRACT_VERSION,\n adapterVersion: '1.0.0',\n engineCompatibility: '1.0.0',\n provider: 'plaid',\n displayName: 'Plaid Identity Verification',\n description: 'Plaid Identity Verification only. Auth, Identity (non-IDV), Monitor, and payments are out of scope. Redaction is not applicable; Plaid does not expose an IDV redaction API.',\n supportedPackages: ['human_idv'],\n supportedCountries: ['US'],\n environments: ['sandbox', 'production'],\n capabilities: {\n presentations: ['embedded', 'hosted'],\n canResume: true,\n canRetry: true,\n canCancel: false,\n canRedact: false,\n },\n launcherKeys: ['plaid_link', 'hosted'],\n launchPresentations: ['embedded', 'hosted'],\n configurationSchemaVersion: 'urn:splitin:verification:config:plaid-idv:v1',\n configurationSchema: {\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n type: 'object',\n additionalProperties: false,\n required: ['clientId', 'secret', 'templateId', 'clientName'],\n properties: {\n clientId: secretStringProperty(),\n secret: secretStringProperty(),\n templateId: plainStringProperty(),\n clientName: plainStringProperty(),\n webhookUrl: { type: 'string', format: 'uri', 'x-secret': false },\n },\n },\n webhook: {\n protocol: 'plaid_es256_jwk',\n eventFamilies: ['IDENTITY_VERIFICATION'],\n toleranceSeconds: 300,\n },\n dataPolicy: {\n classifications: ['provider_resource_id', 'normalized_status', 'reason_codes'],\n prohibitedPersistence: ['raw_webhook', 'launch_secret', 'document', 'selfie', 'link_token'],\n rawPayloadPersistence: false,\n browserSecretPersistence: false,\n governmentIdentifierPersistence: false,\n },\n retry: { sameResourceWhenResumable: true, newAttemptAfterTerminal: true },\n cancellation: { supported: false, terminal: true },\n redaction: { supported: false, asynchronous: false, notApplicable: true },\n apiHosts: [PLAID_SANDBOX_HOST, PLAID_PRODUCTION_HOST],\n testedApiVersions: [PLAID_API_VERSION],\n});\n","import type { VerificationCanonicalStatus } from '@splitin/verification-adapter-sdk';\n\nexport function normalizePlaidIdentityStatus(value: unknown): {\n status: VerificationCanonicalStatus;\n reasonCodes: string[];\n} {\n switch (String(value ?? '').trim().toLowerCase()) {\n case 'active':\n case 'pending': return { status: 'pending_user_input', reasonCodes: [] };\n case 'processing': return { status: 'processing', reasonCodes: [] };\n case 'success':\n case 'passed': return { status: 'verified', reasonCodes: [] };\n case 'pending_review':\n case 'review_needed': return { status: 'manual_review_required', reasonCodes: ['plaid_pending_review'] };\n case 'failed': return { status: 'failed', reasonCodes: ['plaid_verification_failed'] };\n case 'expired': return { status: 'expired', reasonCodes: ['plaid_attempt_expired'] };\n case 'canceled':\n case 'cancelled': return { status: 'canceled', reasonCodes: ['plaid_attempt_canceled'] };\n default: return { status: 'manual_review_required', reasonCodes: ['plaid_status_ambiguous'] };\n }\n}\n","export function constantTimeEqual(left: string, right: string): boolean {\n const maxLength = Math.max(left.length, right.length);\n let difference = left.length ^ right.length;\n for (let index = 0; index < maxLength; index += 1) {\n difference |= (left.charCodeAt(index) || 0) ^ (right.charCodeAt(index) || 0);\n }\n return difference === 0;\n}\n\nexport async function sha256Hex(crypto: Crypto, value: string | Uint8Array): Promise<string> {\n const bytes = typeof value === 'string' ? new TextEncoder().encode(value) : value;\n const digest = new Uint8Array(await crypto.subtle.digest('SHA-256', Uint8Array.from(bytes)));\n return Array.from(digest, (byte) => byte.toString(16).padStart(2, '0')).join('');\n}\n","export type PlaidVerificationJwk = JsonWebKey & {\n alg?: string;\n kid?: string;\n use?: string;\n created_at?: number | string | null;\n expired_at?: number | string | null;\n};\n\nexport class PlaidWebhookVerificationError extends Error {\n constructor(public readonly code: string, message: string) {\n super(message);\n this.name = 'PlaidWebhookVerificationError';\n }\n}\n\ninterface CachedKey {\n key: PlaidVerificationJwk;\n fetchedAtMs: number;\n}\n\nexport interface PlaidVerificationKeyCacheOptions {\n ttlMs?: number;\n now?: () => number;\n}\n\n/**\n * Per-isolate JWK cache. Keyed by kid, expires on a bounded local TTL and\n * Plaid's expired_at, and coalesces concurrent misses. Fetch failures never\n * return a stale key.\n */\nexport class PlaidVerificationKeyCache {\n private readonly entries = new Map<string, CachedKey>();\n private readonly inFlight = new Map<string, Promise<PlaidVerificationJwk>>();\n private readonly ttlMs: number;\n private readonly now: () => number;\n\n constructor(options: PlaidVerificationKeyCacheOptions = {}) {\n this.ttlMs = Math.min(Math.max(options.ttlMs ?? 15 * 60_000, 10_000), 60 * 60_000);\n this.now = options.now ?? Date.now;\n }\n\n async get(\n keyId: string,\n loader: (keyId: string) => Promise<PlaidVerificationJwk>,\n ): Promise<PlaidVerificationJwk> {\n assertKeyId(keyId);\n const nowMs = this.now();\n const cached = this.entries.get(keyId);\n if (cached && nowMs - cached.fetchedAtMs < this.ttlMs && !isExpired(cached.key, nowMs)) {\n validatePlaidJwk(cached.key, keyId, nowMs);\n return cached.key;\n }\n this.entries.delete(keyId);\n\n const existing = this.inFlight.get(keyId);\n if (existing) return existing;\n\n const pending = (async () => {\n const key = await loader(keyId);\n validatePlaidJwk(key, keyId, this.now());\n this.entries.set(keyId, { key, fetchedAtMs: this.now() });\n return key;\n })();\n this.inFlight.set(keyId, pending);\n try {\n return await pending;\n } finally {\n this.inFlight.delete(keyId);\n }\n }\n\n clear(keyId?: string): void {\n if (keyId) this.entries.delete(keyId);\n else this.entries.clear();\n }\n}\n\nexport function assertKeyId(keyId: string): void {\n if (!/^[A-Za-z0-9_-]{1,256}$/.test(keyId)) {\n throw new PlaidWebhookVerificationError('INVALID_KEY_ID', 'Webhook key ID is invalid');\n }\n}\n\nexport function validatePlaidJwk(key: PlaidVerificationJwk, keyId: string, nowMs: number): void {\n if (!key || key.kid !== keyId || key.kty !== 'EC' || key.crv !== 'P-256'\n || key.alg !== 'ES256' || key.use !== 'sig'\n || typeof key.x !== 'string' || typeof key.y !== 'string'\n || !/^[A-Za-z0-9_-]{40,64}$/.test(key.x) || !/^[A-Za-z0-9_-]{40,64}$/.test(key.y)) {\n throw new PlaidWebhookVerificationError('INVALID_KEY', 'Webhook verification key is invalid');\n }\n const nowSeconds = Math.floor(nowMs / 1000);\n const createdAt = timestampSeconds(key.created_at);\n if (createdAt === null || createdAt > nowSeconds + 60) {\n throw new PlaidWebhookVerificationError('INVALID_KEY', 'Webhook verification key creation time is invalid');\n }\n if (isExpired(key, nowMs)) {\n throw new PlaidWebhookVerificationError('EXPIRED_KEY', 'Webhook verification key is expired');\n }\n}\n\nfunction isExpired(key: PlaidVerificationJwk, nowMs: number): boolean {\n if (key.expired_at == null) return false;\n const expiry = timestampSeconds(key.expired_at);\n return expiry === null || expiry <= Math.floor(nowMs / 1000);\n}\n\nfunction timestampSeconds(value: number | string | null | undefined): number | null {\n if (typeof value === 'number') return Number.isInteger(value) && value > 0 ? value : null;\n if (typeof value !== 'string' || !value) return null;\n const numeric = Number(value);\n if (Number.isInteger(numeric) && numeric > 0) return numeric;\n const parsed = Date.parse(value);\n return Number.isFinite(parsed) ? Math.floor(parsed / 1000) : null;\n}\n","import { decodeProtectedHeader, importJWK, jwtVerify, type JWTPayload } from 'jose';\n\nimport { ProviderError } from '@splitin/verification-adapter-sdk';\n\nimport { constantTimeEqual, sha256Hex } from './webhook-crypto.ts';\nimport {\n PlaidWebhookVerificationError,\n assertKeyId,\n validatePlaidJwk,\n type PlaidVerificationJwk,\n} from './webhook-key-cache.ts';\n\nexport interface VerifyPlaidWebhookOptions {\n rawBody: Uint8Array;\n verificationHeader: string | null;\n getKey: (keyId: string) => Promise<PlaidVerificationJwk>;\n crypto: Crypto;\n nowMs?: number;\n maxTokenAgeSeconds?: number;\n maxFutureSkewSeconds?: number;\n}\n\nexport async function verifyPlaidWebhook(options: VerifyPlaidWebhookOptions): Promise<{\n bodySha256: string;\n issuedAt: number;\n keyId: string;\n}> {\n try {\n return await verifyPlaidWebhookInner(options);\n } catch (error) {\n if (error instanceof ProviderError) throw error;\n const code = error instanceof PlaidWebhookVerificationError ? error.code : 'INVALID_SIGNATURE';\n const retryable = code === 'KEY_FETCH_FAILED';\n throw new ProviderError(\n retryable ? 'RETRYABLE_PROVIDER_FAILURE' : 'SIGNATURE_INVALID',\n 'Plaid webhook signature is invalid.',\n {\n retryable,\n safeCode: `plaid_webhook_${code.toLowerCase()}`,\n cause: error,\n },\n );\n }\n}\n\nasync function verifyPlaidWebhookInner(options: VerifyPlaidWebhookOptions): Promise<{\n bodySha256: string;\n issuedAt: number;\n keyId: string;\n}> {\n const token = options.verificationHeader?.trim();\n if (!token) {\n throw new PlaidWebhookVerificationError('MISSING_HEADER', 'Missing Plaid-Verification header');\n }\n\n const parts = token.split('.');\n if (parts.length !== 3 || parts.some((part) => part.length === 0)) {\n throw new PlaidWebhookVerificationError('MALFORMED_JWT', 'Malformed webhook verification token');\n }\n\n let header: ReturnType<typeof decodeProtectedHeader>;\n try {\n header = decodeProtectedHeader(token);\n } catch {\n throw new PlaidWebhookVerificationError('MALFORMED_JWT', 'Malformed webhook verification token');\n }\n if (header.alg !== 'ES256') {\n throw new PlaidWebhookVerificationError('WRONG_ALGORITHM', 'Webhook token must use ES256');\n }\n if (typeof header.kid !== 'string' || !header.kid) {\n throw new PlaidWebhookVerificationError('MISSING_KEY_ID', 'Webhook token is missing its key ID');\n }\n assertKeyId(header.kid);\n\n let jwk: PlaidVerificationJwk;\n try {\n jwk = await options.getKey(header.kid);\n } catch (error) {\n if (error instanceof PlaidWebhookVerificationError) throw error;\n throw new PlaidWebhookVerificationError('KEY_FETCH_FAILED', 'Unable to retrieve webhook verification key');\n }\n\n const nowMs = options.nowMs ?? Date.now();\n validatePlaidJwk(jwk, header.kid, nowMs);\n\n let payload: JWTPayload;\n try {\n const key = await importJWK(jwk, 'ES256');\n const result = await jwtVerify(token, key, {\n algorithms: ['ES256'],\n currentDate: new Date(nowMs),\n });\n payload = result.payload;\n } catch {\n throw new PlaidWebhookVerificationError('INVALID_SIGNATURE', 'Webhook signature is invalid');\n }\n\n if (!Number.isInteger(payload.iat)) {\n throw new PlaidWebhookVerificationError('MISSING_ISSUED_AT', 'Webhook token is missing a valid issued-at time');\n }\n const nowSeconds = Math.floor(nowMs / 1000);\n const maxAge = options.maxTokenAgeSeconds ?? 300;\n const futureSkew = options.maxFutureSkewSeconds ?? 60;\n if (nowSeconds - payload.iat! > maxAge) {\n throw new PlaidWebhookVerificationError('STALE_TOKEN', 'Webhook token is older than five minutes');\n }\n if (payload.iat! - nowSeconds > futureSkew) {\n throw new PlaidWebhookVerificationError('FUTURE_TOKEN', 'Webhook token issued-at time is in the future');\n }\n\n const claimedBodyHash = payload.request_body_sha256;\n if (typeof claimedBodyHash !== 'string' || !/^[a-f0-9]{64}$/i.test(claimedBodyHash)) {\n throw new PlaidWebhookVerificationError('MISSING_BODY_HASH', 'Webhook token is missing a valid body hash');\n }\n const bodySha256 = await sha256Hex(options.crypto, options.rawBody);\n if (!constantTimeEqual(bodySha256.toLowerCase(), claimedBodyHash.toLowerCase())) {\n throw new PlaidWebhookVerificationError('BODY_MISMATCH', 'Webhook body does not match its signed digest');\n }\n\n return { bodySha256, issuedAt: payload.iat!, keyId: header.kid };\n}\n","import {\n ProviderError,\n ProviderUnavailableError,\n VERIFICATION_ADAPTER_CONTRACT_VERSION,\n isOpaqueSubjectReference,\n metadataContainsForbiddenIdentifier,\n type NormalizedProviderEvent,\n type NormalizedProviderSnapshot,\n type ProviderAttemptCommand,\n type ProviderAttemptResult,\n type ProviderLaunchEnvelope,\n type ProviderOperation,\n type ProviderOperationResult,\n type ProviderRedactionCommand,\n type ProviderRedactionResult,\n type ProviderResourceCommand,\n type ProviderResumeCommand,\n type ProviderRetryCommand,\n type ProviderRuntimeContext,\n type VerificationAdapterV1,\n type VerifiedWebhookEnvelope,\n} from '@splitin/verification-adapter-sdk';\n\nimport {\n type PlaidIdvAdapterConfiguration,\n validatePlaidIdvConfiguration,\n} from './configuration.ts';\nimport {\n PLAID_API_VERSION,\n PLAID_DISCLOSURE,\n PLAID_HOSTED_HOST,\n PLAID_IDV_WEBHOOK_CODES,\n PLAID_IDV_WEBHOOK_TYPE,\n PLAID_NORMALIZATION_VERSION,\n PLAID_PRODUCTION_HOST,\n PLAID_SANDBOX_HOST,\n} from './constants.ts';\nimport { plaidIdvProviderManifest } from './manifest.ts';\nimport { normalizePlaidIdentityStatus } from './status.ts';\nimport { sha256Hex } from './webhook-crypto.ts';\nimport {\n PlaidVerificationKeyCache,\n type PlaidVerificationJwk,\n} from './webhook-key-cache.ts';\nimport { verifyPlaidWebhook } from './webhook.ts';\n\ninterface PlaidIdentitySnapshot {\n id: string;\n client_user_id: string;\n status: string;\n created_at?: string;\n completed_at?: string | null;\n shareable_url?: string | null;\n}\n\nexport class PlaidIdvVerificationAdapter implements VerificationAdapterV1<PlaidIdvAdapterConfiguration> {\n readonly contractVersion = VERIFICATION_ADAPTER_CONTRACT_VERSION;\n readonly manifest = plaidIdvProviderManifest;\n readonly provider = 'plaid' as const;\n readonly environment: 'sandbox' | 'production';\n readonly runtime: ProviderRuntimeContext<PlaidIdvAdapterConfiguration>;\n private readonly verificationKeyCache: PlaidVerificationKeyCache;\n\n constructor(runtime: ProviderRuntimeContext<PlaidIdvAdapterConfiguration>) {\n this.runtime = runtime;\n this.environment = runtime.environment;\n this.verificationKeyCache = new PlaidVerificationKeyCache({\n now: () => this.runtime.now().getTime(),\n });\n this.validateConfiguration();\n }\n\n validateConfiguration(): void {\n validatePlaidIdvConfiguration(this.runtime.configuration);\n }\n\n async createAttempt(command: ProviderAttemptCommand): Promise<ProviderAttemptResult> {\n this.assertCommand(command);\n this.requireIdempotencyKey('create', command.attemptId, command.idempotencyKey);\n const identity = await this.call<PlaidIdentitySnapshot>('create', '/identity_verification/create', {\n client_user_id: command.subjectReference,\n template_id: this.runtime.configuration.templateId,\n is_shareable: true,\n gave_consent: false,\n is_idempotent: true,\n });\n return this.toAttemptResult(command.attemptId, identity, 'create');\n }\n\n async resumeAttempt(command: ProviderResumeCommand): Promise<ProviderLaunchEnvelope> {\n const identity = await this.getIdentity(command.providerResourceId, 'resume');\n this.assertSubject(identity.client_user_id);\n return this.createLaunch(command.attemptId, identity, 'resume');\n }\n\n async retrieveAttempt(command: ProviderResourceCommand): Promise<NormalizedProviderSnapshot> {\n return this.normalizeSnapshot(await this.getIdentity(command.providerResourceId, 'retrieve'));\n }\n\n async retryAttempt(command: ProviderRetryCommand): Promise<ProviderAttemptResult> {\n this.assertCommand(command);\n this.requireIdempotencyKey('retry', command.attemptId, command.idempotencyKey);\n if (!command.previousProviderResourceId) {\n return this.createAttempt(command);\n }\n const previous = await this.getIdentity(command.previousProviderResourceId, 'retry');\n this.assertSubject(previous.client_user_id);\n if (previous.client_user_id !== command.subjectReference) {\n throw new ProviderError('TERMINAL_INPUT_FAILURE', 'The prior Plaid attempt does not match this subject.', {\n safeCode: 'plaid_subject_mismatch',\n });\n }\n const normalized = normalizePlaidIdentityStatus(previous.status);\n if (normalized.status === 'pending_user_input' || normalized.status === 'created') {\n return this.toAttemptResult(command.attemptId, previous, 'retry');\n }\n if (normalized.status === 'processing') {\n throw new ProviderError('RETRYABLE_PROVIDER_FAILURE', 'Plaid is still processing this attempt.', {\n retryable: true,\n retryAfterSeconds: 15,\n safeCode: 'plaid_attempt_processing',\n });\n }\n if (normalized.status === 'manual_review_required' || normalized.status === 'verified') {\n throw new ProviderError('TERMINAL_INPUT_FAILURE', 'Plaid review state cannot be retried.', {\n safeCode: normalized.status === 'verified'\n ? 'plaid_attempt_already_verified'\n : 'plaid_manual_review_pending',\n });\n }\n const identity = await this.call<PlaidIdentitySnapshot>('retry', '/identity_verification/retry', {\n client_user_id: command.subjectReference,\n template_id: this.runtime.configuration.templateId,\n strategy: 'reset',\n });\n const result = await this.toAttemptResult(command.attemptId, identity, 'retry');\n result.linkedResources = [{\n resourceType: 'identity_verification',\n resourceId: requiredProviderId(previous.id),\n relationshipCode: 'retried_from',\n providerStatus: requiredStatus(previous.status),\n occurredAt: safeDate(previous.created_at, this.runtime.now()),\n }];\n return result;\n }\n\n async cancelAttempt(_command: ProviderResourceCommand): Promise<ProviderOperationResult> {\n throw new ProviderError('UNSUPPORTED_CAPABILITY', 'Plaid Identity Verification does not expose a cancel API.', {\n safeCode: 'plaid_cancel_unsupported',\n });\n }\n\n async redactSubject(_command: ProviderRedactionCommand): Promise<ProviderRedactionResult> {\n return { completed: true, retryable: false, disposition: 'not_applicable' };\n }\n\n async verifyWebhook(request: Request): Promise<VerifiedWebhookEnvelope> {\n const rawBody = new Uint8Array(await request.arrayBuffer());\n if (rawBody.byteLength === 0 || rawBody.byteLength > 1_048_576) {\n throw new ProviderError('SIGNATURE_INVALID', 'Plaid webhook body size is invalid.', {\n safeCode: 'plaid_webhook_body_invalid',\n });\n }\n const verified = await verifyPlaidWebhook({\n rawBody,\n verificationHeader: request.headers.get('Plaid-Verification'),\n crypto: this.runtime.crypto,\n nowMs: this.runtime.now().getTime(),\n getKey: async (keyId) => this.verificationKeyCache.get(\n keyId,\n async (uncachedKeyId) => this.getVerificationKey(uncachedKeyId),\n ),\n });\n return {\n providerEventKey: `plaid_${verified.bodySha256}`,\n receivedAt: this.runtime.now().toISOString(),\n bodySha256: verified.bodySha256,\n signatureIssuedAt: new Date(verified.issuedAt * 1000).toISOString(),\n opaquePayload: rawBody,\n };\n }\n\n async normalizeWebhook(input: VerifiedWebhookEnvelope): Promise<NormalizedProviderEvent> {\n let webhook: Record<string, unknown>;\n try {\n webhook = JSON.parse(new TextDecoder().decode(input.opaquePayload)) as Record<string, unknown>;\n } catch {\n throw new ProviderError('TERMINAL_INPUT_FAILURE', 'Plaid webhook JSON is invalid.', {\n safeCode: 'plaid_webhook_payload_invalid',\n });\n }\n const webhookType = requiredText(webhook.webhook_type, 'webhook_type');\n const webhookCode = requiredText(webhook.webhook_code, 'webhook_code');\n if (webhookType !== PLAID_IDV_WEBHOOK_TYPE || !PLAID_IDV_WEBHOOK_CODES.has(webhookCode)) {\n throw new ProviderError('TERMINAL_INPUT_FAILURE', 'Plaid webhook is outside Identity Verification scope.', {\n safeCode: 'plaid_webhook_scope_denied',\n });\n }\n const providerResourceId = requiredProviderId(webhook.identity_verification_id);\n const webhookEnvironment = requiredText(webhook.environment, 'environment');\n if (webhookEnvironment !== this.environment) {\n throw new ProviderError('TERMINAL_INPUT_FAILURE', 'Plaid webhook environment does not match the configured adapter.', {\n safeCode: 'plaid_environment_mismatch',\n });\n }\n const status = typeof webhook.status === 'string' ? normalizePlaidIdentityStatus(webhook.status) : null;\n const providerEventKey = `plaid_${await sha256Hex(this.runtime.crypto, [\n this.environment,\n webhookType,\n webhookCode,\n providerResourceId,\n input.bodySha256,\n ].join(':'))}`;\n return {\n providerEventKey,\n providerResourceId,\n eventType: status ? `verification.provider_event.${status.status}` : 'verification.provider_event.processing',\n providerEventType: `${webhookType}.${webhookCode}`,\n canonicalStatus: status?.status,\n occurredAt: input.receivedAt,\n normalizedReasonCodes: status?.reasonCodes ?? ['plaid_webhook_requires_reconciliation'],\n safeMetadata: {\n adapter_version: this.manifest.adapterVersion,\n normalization_version: PLAID_NORMALIZATION_VERSION,\n provider_event_category: webhookCode.toLowerCase(),\n provider_environment: this.environment,\n },\n };\n }\n\n private assertCommand(command: ProviderAttemptCommand): void {\n if (command.packageCode !== 'human_idv') {\n throw new ProviderError('UNSUPPORTED_CAPABILITY', 'Plaid Identity Verification does not support this package.', {\n safeCode: 'unsupported_package',\n });\n }\n this.assertSubject(command.subjectReference);\n if (metadataContainsForbiddenIdentifier(command.metadata)) {\n throw new ProviderError('TERMINAL_INPUT_FAILURE', 'Attempt metadata contains a forbidden identifier.', {\n safeCode: 'forbidden_identifier',\n });\n }\n }\n\n private assertSubject(value: string): void {\n if (!isOpaqueSubjectReference(value)) {\n throw new ProviderError('TERMINAL_INPUT_FAILURE', 'The subject reference is not an opaque identifier.', {\n safeCode: 'subject_reference_invalid',\n });\n }\n }\n\n private async getIdentity(providerResourceId: string, operation: ProviderOperation): Promise<PlaidIdentitySnapshot> {\n return this.call<PlaidIdentitySnapshot>(operation, '/identity_verification/get', {\n identity_verification_id: requiredProviderId(providerResourceId),\n });\n }\n\n private async toAttemptResult(\n attemptId: string,\n identity: PlaidIdentitySnapshot,\n operation: ProviderOperation,\n ): Promise<ProviderAttemptResult> {\n const normalized = normalizePlaidIdentityStatus(identity.status);\n return {\n attemptId,\n providerResourceId: requiredProviderId(identity.id),\n providerStatus: requiredStatus(identity.status),\n canonicalStatus: normalized.status,\n launch: await this.createLaunch(attemptId, identity, operation),\n };\n }\n\n private normalizeSnapshot(identity: PlaidIdentitySnapshot): NormalizedProviderSnapshot {\n const normalized = normalizePlaidIdentityStatus(identity.status);\n const unknownStatus = normalized.reasonCodes.includes('plaid_status_ambiguous');\n if (unknownStatus) {\n this.runtime.logger.error('verification_provider_status_unknown', {\n provider: this.provider,\n environment: this.environment,\n safe_code: 'PLAID_STATUS_UNRECOGNIZED',\n });\n }\n return {\n providerResourceId: requiredProviderId(identity.id),\n providerStatus: requiredStatus(identity.status),\n canonicalStatus: normalized.status,\n occurredAt: safeDate(identity.completed_at ?? identity.created_at, this.runtime.now()),\n normalizedReasonCodes: normalized.reasonCodes,\n safeMetadata: {\n source: 'retrieve',\n adapter_version: this.manifest.adapterVersion,\n normalization_version: PLAID_NORMALIZATION_VERSION,\n ...(unknownStatus ? { unknown_reason: 'provider_status_not_allowlisted' } : {}),\n },\n };\n }\n\n private async createLaunch(\n attemptId: string,\n identity: PlaidIdentitySnapshot,\n operation: ProviderOperation,\n ): Promise<ProviderLaunchEnvelope> {\n this.assertSubject(identity.client_user_id);\n const payload: Record<string, unknown> = {\n user: { client_user_id: identity.client_user_id },\n client_name: this.runtime.configuration.clientName,\n products: ['identity_verification'],\n country_codes: ['US'],\n language: 'en',\n identity_verification: { template_id: this.runtime.configuration.templateId, gave_consent: false },\n };\n if (this.runtime.configuration.webhookUrl) payload.webhook = this.runtime.configuration.webhookUrl;\n const result = await this.call<{ link_token?: unknown; expiration?: unknown }>(operation, '/link/token/create', payload);\n if (typeof result.link_token !== 'string' || result.link_token.length < 8) {\n throw new ProviderUnavailableError('Plaid did not return launch material.', {\n safeCode: 'plaid_launch_material_missing',\n });\n }\n const canonical = normalizePlaidIdentityStatus(identity.status).status;\n const hostedUrl = safeHttpsUrl(identity.shareable_url, PLAID_HOSTED_HOST);\n return {\n attemptId,\n canonicalStatus: canonical,\n presentation: 'embedded',\n launcherKey: 'plaid_link',\n providerDisclosure: PLAID_DISCLOSURE,\n transientSecret: result.link_token,\n transientSecretExpiresAt: safeDate(result.expiration, new Date(this.runtime.now().getTime() + 30 * 60_000)),\n hostedUrl,\n hostedFallbackExpiresAt: hostedUrl\n ? safeDate(result.expiration, new Date(this.runtime.now().getTime() + 30 * 60_000))\n : undefined,\n continuationReference: requiredProviderId(identity.id),\n };\n }\n\n private async getVerificationKey(keyId: string): Promise<PlaidVerificationJwk> {\n const response = await this.call<{ key?: PlaidVerificationJwk }>(\n 'webhook_verify',\n '/webhook_verification_key/get',\n { key_id: keyId },\n );\n if (!response.key || response.key.kid !== keyId) {\n throw new ProviderError('SIGNATURE_INVALID', 'Plaid returned an unknown webhook key.', {\n safeCode: 'plaid_webhook_invalid_key',\n });\n }\n return response.key;\n }\n\n private async call<T>(\n operation: ProviderOperation,\n endpoint: string,\n body: Record<string, unknown>,\n ): Promise<T> {\n if (this.runtime.rateBudget) {\n const budget = await this.runtime.rateBudget.acquire(operation);\n if (!budget.allowed) {\n throw new ProviderError('RATE_LIMITED', 'Plaid rate budget is exhausted.', {\n retryable: true,\n retryAfterSeconds: budget.retryAfterSeconds,\n safeCode: 'plaid_rate_limited',\n });\n }\n }\n const startedAt = this.runtime.now().getTime();\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10_000);\n const host = this.environment === 'production' ? PLAID_PRODUCTION_HOST : PLAID_SANDBOX_HOST;\n try {\n const response = await this.runtime.http.fetch(`https://${host}${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'PLAID-CLIENT-ID': this.runtime.configuration.clientId,\n 'PLAID-SECRET': this.runtime.configuration.secret,\n 'Plaid-Version': PLAID_API_VERSION,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!response.ok) {\n const retryAfter = parseRetryAfter(response.headers.get('retry-after'));\n const code = response.status === 401 || response.status === 403 ? 'AUTHENTICATION_FAILED'\n : response.status === 429 ? 'RATE_LIMITED'\n : response.status === 408 || response.status === 504 ? 'TIMEOUT'\n : response.status >= 500 ? 'RETRYABLE_PROVIDER_FAILURE' : 'TERMINAL_INPUT_FAILURE';\n throw new ProviderError(code, 'Plaid request failed.', {\n retryable: response.status === 408 || response.status === 429 || response.status >= 500,\n retryAfterSeconds: retryAfter,\n safeCode: code === 'AUTHENTICATION_FAILED' ? 'plaid_authentication_failed'\n : code === 'RATE_LIMITED' ? 'plaid_rate_limited'\n : code === 'TIMEOUT' ? 'plaid_timeout'\n : code === 'RETRYABLE_PROVIDER_FAILURE' ? 'plaid_provider_failure'\n : 'plaid_terminal_input_failure',\n });\n }\n const result = await response.json().catch(() => {\n throw new ProviderError('UNKNOWN_PROVIDER_STATE', 'Plaid returned a malformed response.', {\n safeCode: 'malformed_provider_response',\n });\n }) as T;\n const unknown = isRecordWithStringStatus(result)\n && normalizePlaidIdentityStatus(result.status).reasonCodes.includes('plaid_status_ambiguous');\n await this.recordObservation(\n operation,\n unknown ? 'unknown_status' : 'success',\n unknown ? 'plaid_unknown_status' : `plaid_${operation}_ok`,\n startedAt,\n );\n return result;\n } catch (error) {\n const failure = error instanceof ProviderError\n ? error\n : error instanceof DOMException && error.name === 'AbortError'\n ? new ProviderError('TIMEOUT', 'Plaid request timed out.', {\n retryable: true, safeCode: 'plaid_timeout',\n })\n : new ProviderError('RETRYABLE_PROVIDER_FAILURE', 'Plaid Identity Verification is temporarily unavailable.', {\n retryable: true, safeCode: 'plaid_provider_failure', cause: error,\n });\n await this.recordObservation(\n operation,\n failure.retryable ? 'retryable_failure' : 'terminal_failure',\n failure.safeCode,\n startedAt,\n );\n throw failure;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n private requireIdempotencyKey(operation: ProviderOperation, attemptId: string, suppliedKey?: string): string {\n const key = this.runtime.idempotency.keyFor(operation, attemptId, suppliedKey);\n if (!key || key.length > 255) {\n throw new ProviderError('INVALID_CONFIGURATION', 'Plaid idempotency configuration is invalid.', {\n safeCode: 'plaid_idempotency_invalid',\n });\n }\n return key;\n }\n\n private async recordObservation(\n operation: ProviderOperation,\n outcome: 'success' | 'retryable_failure' | 'terminal_failure' | 'unknown_status',\n safeCode: string,\n startedAt: number,\n ): Promise<void> {\n const observedAt = this.runtime.now();\n const latencyMs = Math.max(0, observedAt.getTime() - startedAt);\n const metadata = {\n provider: this.provider,\n environment: this.environment,\n operation,\n outcome,\n safe_code: safeCode,\n latency_ms: latencyMs,\n };\n try {\n await this.runtime.recordHealth({\n operation, outcome, safeCode, observedAt: observedAt.toISOString(), latencyMs,\n });\n if (outcome === 'success') this.runtime.logger.info('verification_provider_operation', metadata);\n else this.runtime.logger.warn('verification_provider_operation', metadata);\n } catch {\n this.runtime.logger.warn('verification_provider_health_record_failed', {\n provider: this.provider,\n environment: this.environment,\n operation,\n });\n }\n }\n}\n\nfunction requiredProviderId(value: unknown): string {\n if (typeof value !== 'string' || !/^[A-Za-z0-9_.:-]{3,256}$/.test(value)) {\n throw new ProviderError('UNKNOWN_PROVIDER_STATE', 'Plaid resource identifier is invalid.', {\n safeCode: 'malformed_provider_response',\n });\n }\n return value;\n}\n\nfunction requiredStatus(value: unknown): string {\n if (typeof value !== 'string' || value.length < 1 || value.length > 128) {\n throw new ProviderError('UNKNOWN_PROVIDER_STATE', 'Plaid status is invalid.', {\n safeCode: 'malformed_provider_response',\n });\n }\n return value;\n}\n\nfunction requiredText(value: unknown, field: string): string {\n if (typeof value !== 'string' || value.length < 1 || value.length > 128) {\n throw new ProviderError('TERMINAL_INPUT_FAILURE', `Plaid ${field} is invalid.`, {\n safeCode: 'plaid_webhook_payload_invalid',\n });\n }\n return value;\n}\n\nfunction safeDate(value: unknown, fallback: Date): string {\n if (typeof value === 'string') {\n const parsed = Date.parse(value);\n if (Number.isFinite(parsed)) return new Date(parsed).toISOString();\n }\n return fallback.toISOString();\n}\n\nfunction safeHttpsUrl(value: unknown, hostedHost: string): string | undefined {\n if (typeof value !== 'string') return undefined;\n try {\n const url = new URL(value);\n return url.protocol === 'https:' && url.hostname === hostedHost && !url.username && !url.password\n ? url.toString()\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction parseRetryAfter(value: string | null): number | undefined {\n if (!value || !/^\\d{1,6}$/.test(value)) return undefined;\n return Math.min(Number(value), 3600);\n}\n\nfunction isRecordWithStringStatus(value: unknown): value is Record<string, unknown> & { status: string } {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n && typeof (value as Record<string, unknown>).status === 'string';\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@splitin/verification-adapter-plaid-idv",
3
+ "version": "0.1.0-beta.0",
4
+ "description": "Official Plaid Identity Verification adapter for the Universal Open-Source Verification Adapter SDK. IDV only — not Auth, Identity, Monitor, or payments.",
5
+ "license": "MIT",
6
+ "author": "SplitInTech, @ojchavan",
7
+ "homepage": "https://github.com/splitintech/open-internal-tools/tree/main/verification-adapter-sdk/packages/verification-adapter-plaid-idv#readme",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/splitintech/open-internal-tools.git",
11
+ "directory": "verification-adapter-sdk/packages/verification-adapter-plaid-idv"
12
+ },
13
+ "type": "module",
14
+ "sideEffects": false,
15
+ "engines": { "node": ">=20" },
16
+ "main": "./dist/index.cjs",
17
+ "module": "./dist/index.js",
18
+ "types": "./dist/index.d.ts",
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/index.d.ts",
22
+ "import": "./dist/index.js",
23
+ "require": "./dist/index.cjs"
24
+ },
25
+ "./browser": {
26
+ "types": "./dist/browser.d.ts",
27
+ "import": "./dist/browser.js",
28
+ "require": "./dist/browser.cjs"
29
+ }
30
+ },
31
+ "files": ["dist", "LICENSE", "NOTICE", "README.md", "package.json"],
32
+ "publishConfig": { "access": "public" },
33
+ "scripts": {
34
+ "build": "tsup",
35
+ "test": "vitest run",
36
+ "typecheck": "tsc --noEmit -p tsconfig.json"
37
+ },
38
+ "dependencies": {
39
+ "@splitin/verification-adapter-sdk": "0.1.0-beta.0",
40
+ "jose": "^6.1.0"
41
+ },
42
+ "peerDependencies": {
43
+ "react-plaid-link": "^4.0.0"
44
+ },
45
+ "peerDependenciesMeta": {
46
+ "react-plaid-link": { "optional": true }
47
+ },
48
+ "optionalPeerDependencies": {
49
+ "react-plaid-link": "^4.0.0"
50
+ },
51
+ "devDependencies": {
52
+ "tsup": "^8.5.0",
53
+ "typescript": "^5.8.3",
54
+ "vitest": "^3.2.4"
55
+ }
56
+ }