@arcanetech/privacy-sdk-relay 0.2.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/README.md +59 -0
- package/dist/index.d.ts +297 -0
- package/dist/index.js +881 -0
- package/dist/index.js.map +1 -0
- package/package.json +33 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/json-safe.ts","../src/relay-config.ts","../src/reasons.ts","../src/relay-api-error.ts","../src/relay-api.ts","../src/types.ts","../src/fallback-policy.ts","../src/is-unfinalized-relay-operation.ts","../src/complete-succeeded-operation.ts","../src/submit-prepared-private-operation.ts","../src/poll-pending-operation.ts","../src/retry-and-resume.ts","../src/submit-direct-fallback.ts","../src/await-relay-settlement.ts","../src/protocol-relay-client-error.ts","../src/serialize.ts"],"sourcesContent":["export function jsonSafeClone(value: unknown): unknown {\n return JSON.parse(JSON.stringify(value, jsonSafeReplacer)) as unknown;\n}\n\nfunction jsonSafeReplacer(_key: string, value: unknown): unknown {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n if (value instanceof Uint8Array) {\n return { type: 'Buffer', data: [...value] };\n }\n return value;\n}\n","export function resolveRelayOrigin(origin?: string): string | undefined {\n const trimmed = origin?.trim().replace(/\\/$/u, '');\n if (!trimmed) {\n return undefined;\n }\n return trimmed;\n}\n\nexport function isRelayConfigured(config?: { origin?: string }): boolean {\n return Boolean(resolveRelayOrigin(config?.origin));\n}\n\nexport function requireRelayOrigin(origin?: string): string {\n const resolved = resolveRelayOrigin(origin);\n if (!resolved) {\n throw new Error('Relay API origin is not configured.');\n }\n return resolved;\n}\n\nexport function requireRelayApi<T>(ports: { relayApi?: T }): T {\n if (!ports.relayApi) {\n throw new Error('Relay API is not configured.');\n }\n return ports.relayApi;\n}\n","export const RELAY_PUBLIC_REASON = {\n invalidPackage: 'invalid_package',\n unsupportedSignalShape: 'unsupported_signal_shape',\n positivePublicDeposit: 'positive_public_deposit',\n zkConfigMissing: 'zk_config_missing',\n zkConfigDeprecated: 'zk_config_deprecated',\n zkConfigIncompatible: 'zk_config_incompatible',\n invalidProof: 'invalid_proof',\n kytRejected: 'kyt_rejected',\n kytAuthorizationMismatch: 'kyt_authorization_mismatch',\n escrowRelayUnconfigured: 'escrow_relay_unconfigured',\n escrowAuthorizationMismatch: 'escrow_authorization_mismatch',\n nullifiersSpent: 'nullifiers_spent',\n simulationFailed: 'simulation_failed',\n resourceFeeExceeded: 'resource_fee_exceeded',\n resourceLimitExceeded: 'resource_limit_exceeded',\n sendFailed: 'send_failed',\n transactionFailed: 'transaction_failed',\n infrastructureFailed: 'infrastructure_failed',\n} as const;\n\nexport type RelayPublicReason =\n (typeof RELAY_PUBLIC_REASON)[keyof typeof RELAY_PUBLIC_REASON];\n\nexport const RELAY_HTTP_REASON = {\n payloadTooLarge: 'payload_too_large',\n rateLimited: 'rate_limited',\n unsupportedPool: 'unsupported_pool',\n queueAtCapacity: 'queue_at_capacity',\n lowBalance: 'low_balance',\n conflictingPayload: 'conflicting_payload',\n retryNotAllowed: 'retry_not_allowed',\n notFound: 'not_found',\n relayerUnavailable: 'relayer_unavailable',\n invalidPackage: 'invalid_package',\n unsupportedSignalShape: 'unsupported_signal_shape',\n} as const;\n\nexport type RelayHttpReason =\n (typeof RELAY_HTTP_REASON)[keyof typeof RELAY_HTTP_REASON];\n\nconst REJECTION_REASONS: ReadonlySet<string> = new Set([\n RELAY_PUBLIC_REASON.invalidPackage,\n RELAY_PUBLIC_REASON.unsupportedSignalShape,\n RELAY_PUBLIC_REASON.positivePublicDeposit,\n RELAY_PUBLIC_REASON.zkConfigMissing,\n RELAY_PUBLIC_REASON.zkConfigDeprecated,\n RELAY_PUBLIC_REASON.zkConfigIncompatible,\n RELAY_PUBLIC_REASON.invalidProof,\n RELAY_PUBLIC_REASON.kytRejected,\n RELAY_PUBLIC_REASON.kytAuthorizationMismatch,\n RELAY_PUBLIC_REASON.escrowRelayUnconfigured,\n RELAY_PUBLIC_REASON.escrowAuthorizationMismatch,\n RELAY_PUBLIC_REASON.nullifiersSpent,\n RELAY_PUBLIC_REASON.simulationFailed,\n RELAY_PUBLIC_REASON.resourceFeeExceeded,\n RELAY_PUBLIC_REASON.resourceLimitExceeded,\n]);\n\nconst RETRYABLE_FAILURE_REASONS: ReadonlySet<string> = new Set([\n RELAY_PUBLIC_REASON.sendFailed,\n RELAY_PUBLIC_REASON.transactionFailed,\n RELAY_PUBLIC_REASON.infrastructureFailed,\n]);\n\nexport const RELAY_INFRASTRUCTURE_HTTP_REASONS: ReadonlySet<string> = new Set([\n RELAY_HTTP_REASON.rateLimited,\n RELAY_HTTP_REASON.queueAtCapacity,\n RELAY_HTTP_REASON.lowBalance,\n RELAY_HTTP_REASON.relayerUnavailable,\n RELAY_HTTP_REASON.payloadTooLarge,\n]);\n\nexport function isRetryableFailureReason(reason: string | null | undefined): boolean {\n if (!reason) {\n return false;\n }\n return RETRYABLE_FAILURE_REASONS.has(reason);\n}\n\nexport function isRejectionReason(reason: string): boolean {\n return REJECTION_REASONS.has(reason);\n}\n","import { RELAY_INFRASTRUCTURE_HTTP_REASONS } from './reasons.js';\n\nexport class RelayApiError extends Error {\n readonly reason: string;\n readonly httpStatus: number;\n\n constructor(input: { reason: string; httpStatus: number }) {\n super(input.reason);\n this.name = 'RelayApiError';\n this.reason = input.reason;\n this.httpStatus = input.httpStatus;\n }\n}\n\nexport function isInfrastructureRelayFailure(error: RelayApiError): boolean {\n return RELAY_INFRASTRUCTURE_HTTP_REASONS.has(error.reason);\n}\n\nexport function isRelayApiError(error: unknown): error is RelayApiError {\n return error instanceof RelayApiError;\n}\n","import { requireRelayOrigin } from './relay-config.js';\nimport { RelayApiError } from './relay-api-error.js';\nimport { RELAY_PUBLIC_REASON } from './reasons.js';\nimport type {\n CreateRelayApiInput,\n RelayApi,\n RelayPackageJson,\n RelayRequestAccepted,\n RelayRequestStatus,\n} from './types.js';\n\nconst HTTP_OK = 200;\nconst HTTP_ACCEPTED = 202;\n\ntype JsonRecord = Record<string, unknown>;\ntype RelayFetcher = typeof globalThis.fetch;\n\nfunction asRecord(value: unknown): JsonRecord {\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n return value as JsonRecord;\n }\n return {};\n}\n\nfunction readReason(payload: unknown, fallback: string): string {\n const record = asRecord(payload);\n return typeof record.reason === 'string' && record.reason.trim()\n ? record.reason\n : fallback;\n}\n\nasync function parseJson(response: Response): Promise<unknown> {\n try {\n return await response.json();\n } catch {\n return {};\n }\n}\n\nasync function requestJson(input: {\n fetch: RelayFetcher;\n url: string;\n method: 'GET' | 'POST';\n body?: RelayPackageJson;\n}): Promise<{ httpStatus: number; payload: unknown }> {\n const init: RequestInit = {\n method: input.method,\n headers: { Accept: 'application/json' },\n };\n if (input.body) {\n init.headers = {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n };\n init.body = JSON.stringify(input.body);\n }\n const response = await input.fetch(input.url, init);\n const payload = await parseJson(response);\n return { httpStatus: response.status, payload };\n}\n\nfunction requireOkStatus(input: {\n httpStatus: number;\n payload: unknown;\n allowed: number[];\n}): JsonRecord {\n if (input.allowed.includes(input.httpStatus)) {\n return asRecord(input.payload);\n }\n throw new RelayApiError({\n reason: readReason(input.payload, RELAY_PUBLIC_REASON.infrastructureFailed),\n httpStatus: input.httpStatus,\n });\n}\n\nfunction mapAccepted(record: JsonRecord): RelayRequestAccepted {\n return {\n relayRequestId: String(record.relayRequestId ?? ''),\n status: String(record.status ?? 'accepted'),\n createdAt: String(record.createdAt ?? ''),\n statusUrl: String(record.statusUrl ?? ''),\n };\n}\n\nfunction mapStatus(record: JsonRecord): RelayRequestStatus {\n const status: RelayRequestStatus = {\n relayRequestId: String(record.relayRequestId ?? ''),\n status: String(record.status ?? ''),\n createdAt: String(record.createdAt ?? ''),\n updatedAt: String(record.updatedAt ?? ''),\n retryAllowed: record.retryAllowed === true,\n };\n if (typeof record.attemptNumber === 'number') {\n status.attemptNumber = record.attemptNumber;\n }\n if (typeof record.transactionHash === 'string') {\n status.transactionHash = record.transactionHash;\n }\n if (typeof record.publicReason === 'string') {\n status.publicReason = record.publicReason;\n }\n return status;\n}\n\nfunction resolveFetcher(input: CreateRelayApiInput): RelayFetcher {\n return input.fetch ?? globalThis.fetch.bind(globalThis);\n}\n\nexport function createRelayApi(input: CreateRelayApiInput): RelayApi {\n const origin = requireRelayOrigin(input.origin);\n const fetchImpl = resolveFetcher(input);\n return {\n async createRequest(body) {\n const result = await requestJson({\n fetch: fetchImpl,\n url: `${origin}/relay-requests`,\n method: 'POST',\n body,\n });\n return mapAccepted(\n requireOkStatus({\n httpStatus: result.httpStatus,\n payload: result.payload,\n allowed: [HTTP_ACCEPTED],\n }),\n );\n },\n async readStatus(relayRequestId) {\n const result = await requestJson({\n fetch: fetchImpl,\n url: `${origin}/relay-requests/${relayRequestId}`,\n method: 'GET',\n });\n return mapStatus(\n requireOkStatus({\n httpStatus: result.httpStatus,\n payload: result.payload,\n allowed: [HTTP_OK],\n }),\n );\n },\n async retryAttempt(relayRequestId) {\n const result = await requestJson({\n fetch: fetchImpl,\n url: `${origin}/relay-requests/${relayRequestId}/attempts`,\n method: 'POST',\n });\n return mapStatus(\n requireOkStatus({\n httpStatus: result.httpStatus,\n payload: result.payload,\n allowed: [HTTP_OK],\n }),\n );\n },\n };\n}\n","export const SUBMISSION_PATH = {\n direct: 'direct',\n relay: 'relay',\n} as const;\n\nexport type SubmissionPath = (typeof SUBMISSION_PATH)[keyof typeof SUBMISSION_PATH];\n\nexport const RELAY_STATUS = {\n accepted: 'accepted',\n validating: 'validating',\n queued: 'queued',\n submitted: 'submitted',\n reconciling: 'reconciling',\n succeeded: 'succeeded',\n rejected: 'rejected',\n failed: 'failed',\n} as const;\n\nexport type RelayLifecycleStatus = (typeof RELAY_STATUS)[keyof typeof RELAY_STATUS];\n\nexport const PENDING_OPERATION_PHASE = {\n prepared: 'prepared',\n relayAccepted: 'relay_accepted',\n admissionFailed: 'admission_failed',\n succeeded: 'succeeded',\n rejected: 'rejected',\n failed: 'failed',\n settlementTimedOut: 'settlement_timed_out',\n} as const;\n\nexport type PendingOperationPhase =\n (typeof PENDING_OPERATION_PHASE)[keyof typeof PENDING_OPERATION_PHASE];\n\nexport type RelayPackageJson = {\n version: number;\n poolSelector: string;\n zkConfigNonce: string;\n proofBytes: string;\n publicSignals: string;\n applicationIdHints: string[];\n ciphertextBytes?: string;\n outputNoteEphemeralScalars?: string[];\n escrowAuthorization?: string;\n keyVersionHints?: Array<number | undefined>;\n};\n\nexport type SafeDisplayMetadata = {\n kind: 'deposit' | 'transfer' | 'withdraw';\n assetId: string;\n amountDisplay: number;\n counterparty: string;\n senderPrivateAddress: string;\n};\n\nexport type DeliveryOutboxEntry = {\n recipientPrivateAddress: string;\n commitmentHex: string;\n coinNote: Record<string, string>;\n depositScalarHex: string;\n precommitementHex?: string;\n assetId: string;\n amountDisplay: number;\n};\n\nexport type SdkFinalizationSnapshot = {\n consumedRecordIds: string[];\n outputRecords: DeliveryOutboxEntry[];\n};\n\nexport type PendingPrivateOperation = {\n id: string;\n walletPublicKey: string;\n phase: PendingOperationPhase;\n retryAllowed: boolean;\n display: SafeDisplayMetadata;\n snapshot: SdkFinalizationSnapshot;\n deliveryOutbox: DeliveryOutboxEntry[];\n relayPackage: RelayPackageJson;\n finalized: boolean;\n deliveriesDrained: boolean;\n transactionPersisted: boolean;\n escrowSend?: boolean;\n relayRequestId?: string;\n relayStatus?: RelayLifecycleStatus;\n publicReason?: string;\n transactionHash?: string;\n};\n\nexport type RelayRequestAccepted = {\n relayRequestId: string;\n status: string;\n createdAt: string;\n statusUrl: string;\n};\n\nexport type RelayRequestStatus = {\n relayRequestId: string;\n status: string;\n createdAt: string;\n updatedAt: string;\n retryAllowed: boolean;\n attemptNumber?: number;\n transactionHash?: string;\n publicReason?: string;\n};\n\nexport type RelayApi = {\n createRequest: (body: RelayPackageJson) => Promise<RelayRequestAccepted>;\n readStatus: (relayRequestId: string) => Promise<RelayRequestStatus>;\n retryAttempt: (relayRequestId: string) => Promise<RelayRequestStatus>;\n};\n\nexport type PendingPrivateOperationStore = {\n save: (operation: PendingPrivateOperation) => Promise<void>;\n list: (walletPublicKey: string) => Promise<PendingPrivateOperation[]>;\n read: (input: {\n walletPublicKey: string;\n operationId: string;\n }) => Promise<PendingPrivateOperation | undefined>;\n};\n\nexport type RelayRuntimeConfig = {\n origin: string;\n};\n\nexport type ProtocolRelayPorts = {\n relayApi?: RelayApi;\n relayConfig?: RelayRuntimeConfig;\n store: PendingPrivateOperationStore;\n submitDirect: (operation: PendingPrivateOperation) => Promise<{ txId: string }>;\n finalizeLocalState: (input: {\n operation: PendingPrivateOperation;\n txId: string;\n }) => Promise<void>;\n drainDeliveries: (input: {\n operation: PendingPrivateOperation;\n txId: string;\n }) => Promise<string | undefined>;\n persistUserTransaction: (input: {\n operation: PendingPrivateOperation;\n txId: string;\n }) => void;\n};\n\nexport type NewPrivateOperation = {\n id: string;\n walletPublicKey: string;\n submissionPath: SubmissionPath;\n display: SafeDisplayMetadata;\n snapshot: SdkFinalizationSnapshot;\n deliveryOutbox: DeliveryOutboxEntry[];\n relayPackage: RelayPackageJson;\n escrowSend?: boolean;\n};\n\nexport type SubmitPrivateOperationResult = {\n outcome: PendingOperationPhase;\n operation: PendingPrivateOperation;\n txId?: string;\n coinDeliveryWarning?: string;\n fallbackAllowed: boolean;\n retryAllowed: boolean;\n};\n\nexport type CreateRelayApiInput = {\n origin: string;\n fetch?: typeof globalThis.fetch;\n};\n","import {\n PENDING_OPERATION_PHASE,\n RELAY_STATUS,\n type PendingPrivateOperation,\n} from './types.js';\n\nconst BLOCKED_DIRECT_STATUSES = new Set<string>([\n RELAY_STATUS.submitted,\n RELAY_STATUS.reconciling,\n RELAY_STATUS.rejected,\n RELAY_STATUS.succeeded,\n]);\n\nexport function canOfferDirectSubmission(operation: PendingPrivateOperation): boolean {\n if (operation.escrowSend) {\n return false;\n }\n if (operation.finalized) {\n return false;\n }\n if (operation.relayStatus && BLOCKED_DIRECT_STATUSES.has(operation.relayStatus)) {\n return false;\n }\n if (operation.phase === PENDING_OPERATION_PHASE.rejected) {\n return false;\n }\n if (operation.phase === PENDING_OPERATION_PHASE.failed) {\n return false;\n }\n if (operation.relayRequestId) {\n return false;\n }\n return (\n operation.phase === PENDING_OPERATION_PHASE.prepared ||\n operation.phase === PENDING_OPERATION_PHASE.admissionFailed\n );\n}\n\nexport function canRetryRelayAttempt(operation: PendingPrivateOperation): boolean {\n if (operation.finalized || !operation.relayRequestId) {\n return false;\n }\n return operation.phase === PENDING_OPERATION_PHASE.failed && operation.retryAllowed;\n}\n","export function isUnfinalizedRelayOperation(operation: {\n relayRequestId?: string;\n finalized: boolean;\n}): boolean {\n return Boolean(operation.relayRequestId) && !operation.finalized;\n}\n","import {\n PENDING_OPERATION_PHASE,\n type PendingPrivateOperation,\n type ProtocolRelayPorts,\n type SubmitPrivateOperationResult,\n} from './types.js';\nimport { canOfferDirectSubmission, canRetryRelayAttempt } from './fallback-policy.js';\n\nconst inFlightCompletions = new Map<string, Promise<SubmitPrivateOperationResult>>();\n\nexport function toSubmitResult(\n operation: PendingPrivateOperation,\n extras?: {\n txId?: string;\n coinDeliveryWarning?: string;\n },\n): SubmitPrivateOperationResult {\n const result: SubmitPrivateOperationResult = {\n outcome: operation.phase,\n operation,\n fallbackAllowed: canOfferDirectSubmission(operation),\n retryAllowed: canRetryRelayAttempt(operation),\n };\n if (extras?.txId) {\n result.txId = extras.txId;\n }\n if (extras?.coinDeliveryWarning) {\n result.coinDeliveryWarning = extras.coinDeliveryWarning;\n }\n return result;\n}\n\nexport async function requireStoredOperation(input: {\n ports: ProtocolRelayPorts;\n walletPublicKey: string;\n operationId: string;\n}): Promise<PendingPrivateOperation> {\n const operation = await input.ports.store.read({\n walletPublicKey: input.walletPublicKey,\n operationId: input.operationId,\n });\n if (!operation) {\n throw new Error('Pending private operation was not found.');\n }\n return operation;\n}\n\nfunction successKey(operation: PendingPrivateOperation, txId: string): string {\n return `${operation.walletPublicKey}:${operation.id}:${txId}`;\n}\n\nfunction withSucceededPhase(\n operation: PendingPrivateOperation,\n txId: string,\n): PendingPrivateOperation {\n return {\n ...operation,\n phase: PENDING_OPERATION_PHASE.succeeded,\n relayStatus: 'succeeded',\n transactionHash: txId,\n retryAllowed: false,\n };\n}\n\nfunction isAlreadyCompleted(operation: PendingPrivateOperation): boolean {\n return (\n operation.finalized && operation.deliveriesDrained && operation.transactionPersisted\n );\n}\n\nasync function applySuccessSideEffects(input: {\n ports: ProtocolRelayPorts;\n operation: PendingPrivateOperation;\n txId: string;\n}): Promise<{ operation: PendingPrivateOperation; warning?: string }> {\n let current = input.operation;\n let warning: string | undefined;\n if (!current.finalized) {\n await input.ports.finalizeLocalState({\n operation: current,\n txId: input.txId,\n });\n current = { ...current, finalized: true };\n await input.ports.store.save(current);\n }\n if (!current.deliveriesDrained) {\n warning = await input.ports.drainDeliveries({\n operation: current,\n txId: input.txId,\n });\n current = { ...current, deliveriesDrained: true };\n await input.ports.store.save(current);\n }\n if (!current.transactionPersisted) {\n input.ports.persistUserTransaction({\n operation: current,\n txId: input.txId,\n });\n current = { ...current, transactionPersisted: true };\n await input.ports.store.save(current);\n }\n return warning === undefined\n ? { operation: current }\n : { operation: current, warning };\n}\n\nasync function applySucceededCompletion(input: {\n ports: ProtocolRelayPorts;\n operation: PendingPrivateOperation;\n txId: string;\n}): Promise<SubmitPrivateOperationResult> {\n const applied = await applySuccessSideEffects(input);\n await input.ports.store.save(applied.operation);\n return toSubmitResult(applied.operation, {\n txId: input.txId,\n ...(applied.warning ? { coinDeliveryWarning: applied.warning } : {}),\n });\n}\n\nexport async function completeSucceededOperation(input: {\n ports: ProtocolRelayPorts;\n operation: PendingPrivateOperation;\n txId: string;\n}): Promise<SubmitPrivateOperationResult> {\n const stored = await input.ports.store.read({\n walletPublicKey: input.operation.walletPublicKey,\n operationId: input.operation.id,\n });\n const succeeded = withSucceededPhase(stored ?? input.operation, input.txId);\n const key = successKey(succeeded, input.txId);\n if (isAlreadyCompleted(succeeded)) {\n await input.ports.store.save(succeeded);\n return toSubmitResult(succeeded, { txId: input.txId });\n }\n const existing = inFlightCompletions.get(key);\n if (existing) {\n return existing;\n }\n const completion = applySucceededCompletion({\n ports: input.ports,\n operation: succeeded,\n txId: input.txId,\n });\n inFlightCompletions.set(key, completion);\n try {\n return await completion;\n } finally {\n inFlightCompletions.delete(key);\n }\n}\n","import { completeSucceededOperation } from './complete-succeeded-operation.js';\nimport { toSubmitResult } from './complete-succeeded-operation.js';\nimport { isRelayConfigured, requireRelayApi } from './relay-config.js';\nimport {\n PENDING_OPERATION_PHASE,\n RELAY_STATUS,\n SUBMISSION_PATH,\n type NewPrivateOperation,\n type PendingPrivateOperation,\n type ProtocolRelayPorts,\n type SubmitPrivateOperationResult,\n} from './types.js';\nimport { RelayApiError, isInfrastructureRelayFailure } from './relay-api-error.js';\nimport { RELAY_PUBLIC_REASON } from './reasons.js';\n\nfunction buildPreparedOperation(input: NewPrivateOperation): PendingPrivateOperation {\n return {\n id: input.id,\n walletPublicKey: input.walletPublicKey,\n phase: PENDING_OPERATION_PHASE.prepared,\n retryAllowed: false,\n display: input.display,\n snapshot: input.snapshot,\n deliveryOutbox: input.deliveryOutbox,\n relayPackage: input.relayPackage,\n finalized: false,\n deliveriesDrained: false,\n transactionPersisted: false,\n ...(input.escrowSend ? { escrowSend: true } : {}),\n };\n}\n\nasync function submitDirectPath(input: {\n ports: ProtocolRelayPorts;\n operation: PendingPrivateOperation;\n}): Promise<SubmitPrivateOperationResult> {\n const receipt = await input.ports.submitDirect(input.operation);\n return completeSucceededOperation({\n ports: input.ports,\n operation: input.operation,\n txId: receipt.txId,\n });\n}\n\nasync function saveAdmissionFailure(input: {\n ports: ProtocolRelayPorts;\n operation: PendingPrivateOperation;\n reason: string;\n}): Promise<SubmitPrivateOperationResult> {\n const failed: PendingPrivateOperation = {\n ...input.operation,\n phase: PENDING_OPERATION_PHASE.admissionFailed,\n publicReason: input.reason,\n retryAllowed: false,\n };\n await input.ports.store.save(failed);\n return toSubmitResult(failed);\n}\n\nasync function saveRejectedWithoutRequest(input: {\n ports: ProtocolRelayPorts;\n operation: PendingPrivateOperation;\n reason: string;\n}): Promise<SubmitPrivateOperationResult> {\n const rejected: PendingPrivateOperation = {\n ...input.operation,\n phase: PENDING_OPERATION_PHASE.rejected,\n publicReason: input.reason,\n retryAllowed: false,\n };\n await input.ports.store.save(rejected);\n return toSubmitResult(rejected);\n}\n\nasync function createRelayRequest(input: {\n ports: ProtocolRelayPorts;\n operation: PendingPrivateOperation;\n}): Promise<SubmitPrivateOperationResult> {\n const relayApi = requireRelayApi(input.ports);\n await input.ports.store.save(input.operation);\n try {\n const accepted = await relayApi.createRequest(input.operation.relayPackage);\n const stored: PendingPrivateOperation = {\n ...input.operation,\n phase: PENDING_OPERATION_PHASE.relayAccepted,\n relayRequestId: accepted.relayRequestId,\n relayStatus: RELAY_STATUS.accepted,\n retryAllowed: false,\n };\n await input.ports.store.save(stored);\n return toSubmitResult(stored);\n } catch (error: unknown) {\n const reason =\n error instanceof RelayApiError\n ? error.reason\n : RELAY_PUBLIC_REASON.infrastructureFailed;\n if (error instanceof RelayApiError && !isInfrastructureRelayFailure(error)) {\n return saveRejectedWithoutRequest({\n ports: input.ports,\n operation: input.operation,\n reason,\n });\n }\n return saveAdmissionFailure({\n ports: input.ports,\n operation: input.operation,\n reason,\n });\n }\n}\n\nfunction shouldSubmitDirect(input: {\n ports: ProtocolRelayPorts;\n operation: NewPrivateOperation;\n}): boolean {\n if (input.operation.escrowSend) {\n return false;\n }\n return (\n input.operation.submissionPath === SUBMISSION_PATH.direct ||\n !isRelayConfigured(input.ports.relayConfig)\n );\n}\n\nexport async function submitPreparedPrivateOperation(input: {\n ports: ProtocolRelayPorts;\n operation: NewPrivateOperation;\n}): Promise<SubmitPrivateOperationResult> {\n const prepared = buildPreparedOperation(input.operation);\n if (input.operation.escrowSend && !isRelayConfigured(input.ports.relayConfig)) {\n return saveRejectedWithoutRequest({\n ports: input.ports,\n operation: prepared,\n reason: RELAY_PUBLIC_REASON.escrowRelayUnconfigured,\n });\n }\n if (shouldSubmitDirect(input)) {\n return submitDirectPath({\n ports: input.ports,\n operation: prepared,\n });\n }\n return createRelayRequest({\n ports: input.ports,\n operation: prepared,\n });\n}\n","import {\n completeSucceededOperation,\n requireStoredOperation,\n toSubmitResult,\n} from './complete-succeeded-operation.js';\nimport { requireRelayApi } from './relay-config.js';\nimport {\n PENDING_OPERATION_PHASE,\n RELAY_STATUS,\n type PendingPrivateOperation,\n type ProtocolRelayPorts,\n type RelayLifecycleStatus,\n type RelayRequestStatus,\n type SubmitPrivateOperationResult,\n} from './types.js';\n\nconst TERMINAL_STATUSES = new Set<string>([\n RELAY_STATUS.succeeded,\n RELAY_STATUS.rejected,\n RELAY_STATUS.failed,\n]);\n\nfunction isRelayStatus(value: string): value is RelayLifecycleStatus {\n return Object.values(RELAY_STATUS).includes(value as RelayLifecycleStatus);\n}\n\nfunction applyStatus(\n operation: PendingPrivateOperation,\n status: RelayRequestStatus,\n): PendingPrivateOperation {\n const next: PendingPrivateOperation = {\n ...operation,\n retryAllowed: status.retryAllowed,\n };\n if (isRelayStatus(status.status)) {\n next.relayStatus = status.status;\n }\n if (status.publicReason) {\n next.publicReason = status.publicReason;\n }\n if (status.transactionHash) {\n next.transactionHash = status.transactionHash;\n }\n if (status.status === RELAY_STATUS.rejected) {\n next.phase = PENDING_OPERATION_PHASE.rejected;\n next.retryAllowed = false;\n }\n if (status.status === RELAY_STATUS.failed) {\n next.phase = PENDING_OPERATION_PHASE.failed;\n }\n return next;\n}\n\nexport async function pollPendingOperation(input: {\n ports: ProtocolRelayPorts;\n walletPublicKey: string;\n operationId: string;\n}): Promise<SubmitPrivateOperationResult> {\n const operation = await requireStoredOperation(input);\n if (!operation.relayRequestId) {\n return toSubmitResult(operation);\n }\n const status = await requireRelayApi(input.ports).readStatus(\n operation.relayRequestId,\n );\n const updated = applyStatus(operation, status);\n await input.ports.store.save(updated);\n if (status.status === RELAY_STATUS.succeeded && status.transactionHash) {\n return completeSucceededOperation({\n ports: input.ports,\n operation: updated,\n txId: status.transactionHash,\n });\n }\n return toSubmitResult(updated, {\n ...(updated.transactionHash ? { txId: updated.transactionHash } : {}),\n });\n}\n\nexport function isTerminalRelayStatus(status: string | undefined): boolean {\n return Boolean(status && TERMINAL_STATUSES.has(status));\n}\n","import { requireStoredOperation } from './complete-succeeded-operation.js';\nimport { isUnfinalizedRelayOperation } from './is-unfinalized-relay-operation.js';\nimport { canRetryRelayAttempt } from './fallback-policy.js';\nimport { pollPendingOperation } from './poll-pending-operation.js';\nimport { requireRelayApi } from './relay-config.js';\nimport {\n PENDING_OPERATION_PHASE,\n RELAY_STATUS,\n type PendingPrivateOperation,\n type ProtocolRelayPorts,\n type SubmitPrivateOperationResult,\n} from './types.js';\n\nfunction withoutPublicReason(\n operation: PendingPrivateOperation,\n): PendingPrivateOperation {\n const next = { ...operation };\n delete next.publicReason;\n return next;\n}\n\nexport async function retryFailedRelayAttempt(input: {\n ports: ProtocolRelayPorts;\n walletPublicKey: string;\n operationId: string;\n}): Promise<SubmitPrivateOperationResult> {\n const operation = await requireStoredOperation(input);\n if (!canRetryRelayAttempt(operation) || !operation.relayRequestId) {\n throw new Error('Relay retry is not allowed for this operation.');\n }\n await requireRelayApi(input.ports).retryAttempt(operation.relayRequestId);\n await input.ports.store.save({\n ...withoutPublicReason(operation),\n phase: PENDING_OPERATION_PHASE.relayAccepted,\n relayStatus: RELAY_STATUS.accepted,\n retryAllowed: false,\n });\n return pollPendingOperation(input);\n}\n\nexport async function resumePendingOperations(input: {\n ports: ProtocolRelayPorts;\n walletPublicKey: string;\n}): Promise<SubmitPrivateOperationResult[]> {\n const listed = await input.ports.store.list(input.walletPublicKey);\n const pending = listed.filter((operation) => isUnfinalizedRelayOperation(operation));\n const results: SubmitPrivateOperationResult[] = [];\n for (const operation of pending) {\n results.push(\n await pollPendingOperation({\n ports: input.ports,\n walletPublicKey: input.walletPublicKey,\n operationId: operation.id,\n }),\n );\n }\n return results;\n}\n","import { completeSucceededOperation } from './complete-succeeded-operation.js';\nimport { canOfferDirectSubmission } from './fallback-policy.js';\nimport { requireStoredOperation } from './complete-succeeded-operation.js';\nimport type { ProtocolRelayPorts, SubmitPrivateOperationResult } from './types.js';\n\nexport async function submitDirectFallback(input: {\n ports: ProtocolRelayPorts;\n walletPublicKey: string;\n operationId: string;\n consent: boolean;\n}): Promise<SubmitPrivateOperationResult> {\n const operation = await requireStoredOperation(input);\n if (!input.consent || !canOfferDirectSubmission(operation)) {\n throw new Error('Direct submission fallback is not allowed.');\n }\n const receipt = await input.ports.submitDirect(operation);\n return completeSucceededOperation({\n ports: input.ports,\n operation,\n txId: receipt.txId,\n });\n}\n","import { pollPendingOperation } from './poll-pending-operation.js';\nimport { isTerminalRelayStatus } from './poll-pending-operation.js';\nimport { toSubmitResult } from './complete-succeeded-operation.js';\nimport { submitPreparedPrivateOperation } from './submit-prepared-private-operation.js';\nimport {\n PENDING_OPERATION_PHASE,\n type NewPrivateOperation,\n type PendingPrivateOperation,\n type ProtocolRelayPorts,\n type SubmitPrivateOperationResult,\n} from './types.js';\n\nexport const DEFAULT_SETTLEMENT_POLL_INTERVAL_MS = 2000;\nexport const DEFAULT_SETTLEMENT_MAX_ATTEMPTS = 15;\nconst DEFAULT_SETTLEMENT_BACKOFF_MULTIPLIER = 2;\nconst DEFAULT_SETTLEMENT_MAX_INTERVAL_MS = 30_000;\n\ntype SettlementPollBounds = {\n ports: ProtocolRelayPorts;\n walletPublicKey: string;\n operationId: string;\n pollIntervalMs: number;\n maxAttempts: number;\n backoffMultiplier: number;\n maxPollIntervalMs: number;\n delay: (ms: number) => Promise<void>;\n};\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction isSettled(result: SubmitPrivateOperationResult): boolean {\n return (\n result.outcome === PENDING_OPERATION_PHASE.succeeded ||\n result.outcome === PENDING_OPERATION_PHASE.rejected ||\n result.outcome === PENDING_OPERATION_PHASE.failed ||\n result.outcome === PENDING_OPERATION_PHASE.admissionFailed ||\n result.outcome === PENDING_OPERATION_PHASE.settlementTimedOut ||\n isTerminalRelayStatus(result.operation.relayStatus)\n );\n}\n\nfunction nextPollDelayMs(input: {\n attemptIndex: number;\n pollIntervalMs: number;\n backoffMultiplier: number;\n maxPollIntervalMs: number;\n}): number {\n return Math.min(\n input.pollIntervalMs * input.backoffMultiplier ** input.attemptIndex,\n input.maxPollIntervalMs,\n );\n}\n\nasync function markSettlementTimedOut(input: {\n ports: ProtocolRelayPorts;\n operation: PendingPrivateOperation;\n}): Promise<SubmitPrivateOperationResult> {\n const timedOut: PendingPrivateOperation = {\n ...input.operation,\n phase: PENDING_OPERATION_PHASE.settlementTimedOut,\n };\n await input.ports.store.save(timedOut);\n return toSubmitResult(timedOut);\n}\n\nasync function pollUntilBound(\n input: SettlementPollBounds,\n): Promise<SubmitPrivateOperationResult> {\n let result = await pollPendingOperation(input);\n let attemptIndex = 0;\n while (!isSettled(result) && attemptIndex + 1 < input.maxAttempts) {\n await input.delay(\n nextPollDelayMs({\n attemptIndex,\n pollIntervalMs: input.pollIntervalMs,\n backoffMultiplier: input.backoffMultiplier,\n maxPollIntervalMs: input.maxPollIntervalMs,\n }),\n );\n result = await pollPendingOperation(input);\n attemptIndex += 1;\n }\n return result;\n}\n\nfunction resolvePollBounds(input: {\n ports: ProtocolRelayPorts;\n walletPublicKey: string;\n operationId: string;\n pollIntervalMs?: number;\n maxAttempts?: number;\n backoffMultiplier?: number;\n maxPollIntervalMs?: number;\n delay?: (ms: number) => Promise<void>;\n}): SettlementPollBounds {\n return {\n ports: input.ports,\n walletPublicKey: input.walletPublicKey,\n operationId: input.operationId,\n pollIntervalMs: input.pollIntervalMs ?? DEFAULT_SETTLEMENT_POLL_INTERVAL_MS,\n maxAttempts: input.maxAttempts ?? DEFAULT_SETTLEMENT_MAX_ATTEMPTS,\n backoffMultiplier: input.backoffMultiplier ?? DEFAULT_SETTLEMENT_BACKOFF_MULTIPLIER,\n maxPollIntervalMs: input.maxPollIntervalMs ?? DEFAULT_SETTLEMENT_MAX_INTERVAL_MS,\n delay: input.delay ?? delay,\n };\n}\n\nexport async function awaitRelaySettlement(input: {\n ports: ProtocolRelayPorts;\n walletPublicKey: string;\n operationId: string;\n pollIntervalMs?: number;\n maxAttempts?: number;\n backoffMultiplier?: number;\n maxPollIntervalMs?: number;\n delay?: (ms: number) => Promise<void>;\n}): Promise<SubmitPrivateOperationResult> {\n const result = await pollUntilBound(resolvePollBounds(input));\n if (isSettled(result)) {\n return result;\n }\n return markSettlementTimedOut({\n ports: input.ports,\n operation: result.operation,\n });\n}\n\nexport async function submitAndAwaitPrivateOperation(input: {\n ports: ProtocolRelayPorts;\n operation: NewPrivateOperation;\n pollIntervalMs?: number;\n maxAttempts?: number;\n}): Promise<SubmitPrivateOperationResult> {\n const submitted = await submitPreparedPrivateOperation(input);\n if (submitted.outcome !== PENDING_OPERATION_PHASE.relayAccepted) {\n return submitted;\n }\n return awaitRelaySettlement({\n ports: input.ports,\n walletPublicKey: input.operation.walletPublicKey,\n operationId: input.operation.id,\n ...(input.pollIntervalMs === undefined\n ? {}\n : { pollIntervalMs: input.pollIntervalMs }),\n ...(input.maxAttempts === undefined ? {} : { maxAttempts: input.maxAttempts }),\n });\n}\n","import type { SubmitPrivateOperationResult } from './types.js';\nimport { PENDING_OPERATION_PHASE } from './types.js';\n\nexport class ProtocolRelayClientError extends Error {\n readonly outcome: SubmitPrivateOperationResult['outcome'];\n readonly fallbackAllowed: boolean;\n readonly retryAllowed: boolean;\n readonly operationId: string;\n readonly publicReason?: string;\n\n constructor(result: SubmitPrivateOperationResult) {\n super(result.operation.publicReason ?? result.outcome);\n this.name = 'ProtocolRelayClientError';\n this.outcome = result.outcome;\n this.fallbackAllowed = result.fallbackAllowed;\n this.retryAllowed = result.retryAllowed;\n this.operationId = result.operation.id;\n if (result.operation.publicReason) {\n this.publicReason = result.operation.publicReason;\n }\n }\n}\n\nexport function throwIfRelayUnsuccessful(result: SubmitPrivateOperationResult): {\n txId: string;\n coinDeliveryWarning?: string;\n} {\n if (result.outcome === PENDING_OPERATION_PHASE.succeeded && result.txId) {\n return {\n txId: result.txId,\n ...(result.coinDeliveryWarning\n ? { coinDeliveryWarning: result.coinDeliveryWarning }\n : {}),\n };\n }\n throw new ProtocolRelayClientError(result);\n}\n","import type { RelayPackageJson } from './types.js';\n\nexport const RELAY_PACKAGE_VERSION_V1 = 1;\n\nexport type RelayPackageSerializable = {\n version: number;\n poolSelector: string;\n zkConfigNonce: { toString(): string } | string | number;\n proofBytes: string;\n publicSignals: string;\n applicationIdHints: string[];\n ciphertextBytes?: string;\n outputNoteEphemeralScalars?: string[];\n escrowAuthorization?: string;\n keyVersionHints?: Array<number | undefined | null>;\n};\n\nfunction nonceToString(value: RelayPackageSerializable['zkConfigNonce']): string {\n return typeof value === 'string' ? value : value.toString();\n}\n\nfunction copyKeyVersionHints(\n hints: NonNullable<RelayPackageSerializable['keyVersionHints']>,\n): Array<number | undefined> {\n return hints.map((value) => (typeof value === 'number' ? value : undefined));\n}\n\nexport function serializeRelayPackage(\n source: RelayPackageSerializable,\n): RelayPackageJson {\n const body: RelayPackageJson = {\n version: source.version,\n poolSelector: source.poolSelector,\n zkConfigNonce: nonceToString(source.zkConfigNonce),\n proofBytes: source.proofBytes,\n publicSignals: source.publicSignals,\n applicationIdHints: [...source.applicationIdHints],\n };\n if (source.ciphertextBytes !== undefined) {\n body.ciphertextBytes = source.ciphertextBytes;\n }\n if (source.outputNoteEphemeralScalars !== undefined) {\n body.outputNoteEphemeralScalars = [...source.outputNoteEphemeralScalars];\n }\n if (source.escrowAuthorization !== undefined) {\n body.escrowAuthorization = source.escrowAuthorization;\n }\n if (source.keyVersionHints) {\n body.keyVersionHints = copyKeyVersionHints(source.keyVersionHints);\n }\n return body;\n}\n\nfunction readNonce(value: unknown): string | undefined {\n if (typeof value === 'string' || typeof value === 'number') {\n return value.toString();\n }\n if (typeof value === 'bigint') {\n return value.toString();\n }\n return undefined;\n}\n\nfunction readHints(value: unknown): Array<number | undefined> | undefined {\n if (!Array.isArray(value)) {\n return undefined;\n }\n return value.map((entry) => (typeof entry === 'number' ? entry : undefined));\n}\n\nfunction readStringArray(value: unknown): string[] | undefined {\n if (!Array.isArray(value) || value.length === 0) {\n return undefined;\n }\n if (!value.every((entry) => typeof entry === 'string')) {\n return undefined;\n }\n return value;\n}\n\nfunction readApplicationIdHints(\n value: unknown,\n): RelayPackageJson['applicationIdHints'] | undefined {\n return readStringArray(value);\n}\n\nfunction readWireRecord(payload: unknown): Record<string, unknown> | undefined {\n if (typeof payload !== 'object' || payload === null) {\n return undefined;\n }\n return payload as Record<string, unknown>;\n}\n\nexport function deserializeRelayPackage(\n payload: unknown,\n): RelayPackageJson | undefined {\n const record = readWireRecord(payload);\n if (\n !record ||\n record.version !== RELAY_PACKAGE_VERSION_V1 ||\n typeof record.proofBytes !== 'string'\n ) {\n return undefined;\n }\n if (\n typeof record.poolSelector !== 'string' ||\n typeof record.publicSignals !== 'string'\n ) {\n return undefined;\n }\n const zkConfigNonce = readNonce(record.zkConfigNonce);\n const applicationIdHints = readApplicationIdHints(record.applicationIdHints);\n if (!zkConfigNonce || !applicationIdHints) {\n return undefined;\n }\n const body: RelayPackageJson = {\n version: RELAY_PACKAGE_VERSION_V1,\n poolSelector: record.poolSelector,\n zkConfigNonce,\n proofBytes: record.proofBytes,\n publicSignals: record.publicSignals,\n applicationIdHints,\n };\n if (typeof record.ciphertextBytes === 'string') {\n body.ciphertextBytes = record.ciphertextBytes;\n }\n const outputNoteEphemeralScalars = readStringArray(record.outputNoteEphemeralScalars);\n if (outputNoteEphemeralScalars) {\n body.outputNoteEphemeralScalars = outputNoteEphemeralScalars;\n }\n if (typeof record.escrowAuthorization === 'string') {\n body.escrowAuthorization = record.escrowAuthorization;\n }\n const keyVersionHints = readHints(record.keyVersionHints);\n if (keyVersionHints) {\n body.keyVersionHints = keyVersionHints;\n }\n return body;\n}\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@arcanetech/privacy-sdk-relay",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Chain-agnostic protocol relay runtime: admission, polling, retry, and fallback over caller-supplied ports",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsup",
|
|
21
|
+
"typecheck": "tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.test.json"
|
|
22
|
+
},
|
|
23
|
+
"sideEffects": false,
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "git+https://github.com/Polynom-Labs/privacy-layer-confidential-sdk.git",
|
|
27
|
+
"directory": "packages/relay"
|
|
28
|
+
},
|
|
29
|
+
"license": "UNLICENSED",
|
|
30
|
+
"publishConfig": {
|
|
31
|
+
"access": "public"
|
|
32
|
+
}
|
|
33
|
+
}
|