@opendatalabs/vana-sdk 0.1.0-alpha.f2a82f7 → 0.1.0-alpha.f35bb9c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/controllers/base.cjs +0 -33
- package/dist/controllers/base.cjs.map +1 -1
- package/dist/controllers/base.d.ts +0 -10
- package/dist/controllers/base.js +0 -33
- package/dist/controllers/base.js.map +1 -1
- package/dist/controllers/data.cjs +19 -26
- package/dist/controllers/data.cjs.map +1 -1
- package/dist/controllers/data.d.ts +9 -9
- package/dist/controllers/data.js +19 -26
- package/dist/controllers/data.js.map +1 -1
- package/dist/controllers/permissions.cjs +65 -124
- package/dist/controllers/permissions.cjs.map +1 -1
- package/dist/controllers/permissions.d.ts +11 -20
- package/dist/controllers/permissions.js +65 -124
- package/dist/controllers/permissions.js.map +1 -1
- package/dist/core.cjs +1 -4
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.ts +1 -2
- package/dist/core.js +1 -4
- package/dist/core.js.map +1 -1
- package/dist/index.node.cjs +0 -2
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.d.ts +4 -27
- package/dist/index.node.js +0 -2
- package/dist/index.node.js.map +1 -1
- package/dist/server/relayerHandler.cjs +87 -201
- package/dist/server/relayerHandler.cjs.map +1 -1
- package/dist/server/relayerHandler.d.ts +1 -3
- package/dist/server/relayerHandler.js +87 -201
- package/dist/server/relayerHandler.js.map +1 -1
- package/dist/types/config.cjs.map +1 -1
- package/dist/types/config.d.ts +0 -32
- package/dist/types/config.js.map +1 -1
- package/dist/types/controller-context.cjs.map +1 -1
- package/dist/types/controller-context.d.ts +1 -3
- package/dist/types/generics.cjs.map +1 -1
- package/dist/types/generics.d.ts +1 -1
- package/dist/types/index.cjs.map +1 -1
- package/dist/types/index.d.ts +2 -3
- package/dist/types/index.js.map +1 -1
- package/dist/types/operations.cjs.map +1 -1
- package/dist/types/operations.d.ts +0 -46
- package/dist/types/operations.js.map +1 -1
- package/dist/types/relayer.cjs.map +1 -1
- package/dist/types/relayer.d.ts +8 -19
- package/dist/utils/ipfs.cjs +4 -2
- package/dist/utils/ipfs.cjs.map +1 -1
- package/dist/utils/ipfs.d.ts +1 -1
- package/dist/utils/ipfs.js +4 -2
- package/dist/utils/ipfs.js.map +1 -1
- package/package.json +1 -3
package/dist/types/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/types/config.ts"],"sourcesContent":["import type { WalletClient, PublicClient, Account, Address, Chain } from \"viem\";\nimport type { VanaChainId, VanaChain } from \"./chains\";\nimport type {\n StorageProvider,\n StorageUploadResult,\n StorageListOptions,\n} from \"./storage\";\n\nimport type { RelayerConfig } from \"./relayer\";\nimport type { IOperationStore } from \"./operations\";\n\n/**\n * Marker interface to indicate that a Vana instance has storage configured.\n * Used for compile-time type safety to ensure storage-dependent methods\n * are only called on properly configured instances.\n *\n * @category Configuration\n */\nexport interface StorageRequiredMarker {\n readonly __storageRequired: true;\n}\n\n/**\n * Configures storage providers for SDK file operations.\n *\n * @remarks\n * Supports multiple backends with automatic fallback.\n * IPFS for decentralization, Pinata for reliability,\n * Google Drive for development, custom for flexibility.\n *\n * **Provider Selection:**\n * - IPFS: Decentralized, permanent storage ideal for production\n * - Pinata: Managed IPFS with guaranteed availability\n * - Google Drive: Centralized, suitable for development/testing\n * - Custom providers: Implement StorageProvider interface\n *\n * @category Configuration\n * @example\n * ```typescript\n * const storage: StorageConfig = {\n * providers: {\n * ipfs: new IPFSStorage({ gateway: 'https://gateway.pinata.cloud' }),\n * pinata: new PinataStorage({ apiKey: 'key', secretKey: 'secret' })\n * },\n * defaultProvider: 'ipfs'\n * };\n * ```\n */\nexport interface StorageConfig {\n /**\n * Map of provider name to storage provider instance.\n * Common provider names: \"ipfs\", \"pinata\", \"googledrive\", \"s3\".\n * Custom names allowed for custom provider implementations.\n */\n providers: Record<string, StorageProvider>;\n /**\n * Default provider name to use when none specified.\n * Must match a key in the providers map. Falls back to first provider if not specified.\n */\n defaultProvider?: string;\n}\n\n/**\n * Download relayer callbacks for proxying CORS-restricted downloads.\n *\n * Provides a callback to proxy download requests through your application server\n * when direct browser access fails due to CORS restrictions (e.g., Google Drive).\n *\n * IMPORTANT SECURITY REQUIREMENTS for your proxy endpoint:\n * 1. MUST block requests to private/internal IPs (SSRF protection)\n * 2. SHOULD NOT restrict domains (files can be hosted anywhere)\n *\n * @category Configuration\n * @example Client-side implementation:\n * ```typescript\n * const downloadRelayer: DownloadRelayerCallbacks = {\n * async proxyDownload(url) {\n * const response = await fetch('/api/proxy', {\n * method: 'POST',\n * headers: { 'Content-Type': 'application/json' },\n * body: JSON.stringify({ url })\n * });\n * return response.blob();\n * }\n * };\n * ```\n *\n * @example Server-side proxy endpoint (Next.js):\n * ```typescript\n * // /api/proxy/route.ts\n * import { promises as dns } from 'dns';\n * import { isIPv4 } from 'net';\n *\n * async function handleProxy(url: string) {\n * const { hostname } = new URL(url);\n *\n * // Resolve hostname to IP (handle localhost specially)\n * const ip = hostname === 'localhost' ? '127.0.0.1' :\n * isIPv4(hostname) ? hostname :\n * await dns.lookup(hostname).then(r => r.address);\n *\n * // SSRF Protection: Block private/internal IPs\n * if (isIPv4(ip)) {\n * const [a, b] = ip.split('.').map(Number);\n * if (a === 10 || a === 127 || a === 0 ||\n * (a === 172 && b >= 16 && b <= 31) ||\n * (a === 192 && b === 168) ||\n * (a === 169 && b === 254) ||\n * a >= 224) { // Also block multicast/reserved\n * return new Response('Private/internal addresses not allowed', { status: 403 });\n * }\n * }\n *\n * // Proxy the request\n * const response = await fetch(url, { redirect: 'manual' });\n *\n * // Handle redirects (with recursion limit)\n * if (response.status >= 301 && response.status <= 308) {\n * const location = response.headers.get('location');\n * if (location) return handleProxy(new URL(location, url).href);\n * }\n *\n * const data = await response.arrayBuffer();\n * return new Response(data, {\n * headers: {\n * 'Content-Type': response.headers.get('content-type') || 'application/octet-stream',\n * 'Access-Control-Allow-Origin': '*'\n * }\n * });\n * }\n * ```\n */\nexport interface DownloadRelayerCallbacks {\n /**\n * Proxy a download request through your application server\n *\n * @param url - The URL to download from\n * @returns Promise resolving to the downloaded content as a Blob\n */\n proxyDownload: (url: string) => Promise<Blob>;\n}\n\n/**\n * Storage callback functions for flexible storage operations.\n *\n * Instead of hardcoding storage behavior (HTTP endpoints, etc.), users can provide\n * custom callback functions to handle storage operations in any way they choose.\n * This pattern matches the relayer callbacks approach, providing maximum flexibility.\n *\n * @category Configuration\n * @example\n * ```typescript\n * const storageCallbacks: StorageCallbacks = {\n * async upload(blob, filename, metadata) {\n * // Custom implementation - could be HTTP, S3, local filesystem, etc.\n * const formData = new FormData();\n * formData.append('file', blob, filename);\n * const response = await fetch('/api/storage/upload', {\n * method: 'POST',\n * body: formData\n * });\n * const data = await response.json();\n * return {\n * url: data.url,\n * size: blob.size,\n * contentType: blob.type,\n * metadata: data.metadata\n * };\n * },\n *\n * async download(identifier) {\n * const response = await fetch(`/api/storage/download/${identifier}`);\n * return response.blob();\n * }\n * };\n * ```\n */\nexport interface StorageCallbacks {\n /**\n * Upload a blob to storage\n *\n * @param blob - The data to upload\n * @param filename - Optional filename hint\n * @param metadata - Optional metadata for the upload\n * @returns Upload result with identifier and metadata\n */\n upload: (\n blob: Blob,\n filename?: string,\n metadata?: Record<string, unknown>,\n ) => Promise<StorageUploadResult>;\n\n /**\n * Download data from storage\n *\n * @param identifier - The storage identifier (could be URL, hash, path, or any unique ID)\n * @param options - Optional download options\n * @returns The downloaded data as a Blob\n */\n download: (\n identifier: string,\n options?: StorageDownloadOptions,\n ) => Promise<Blob>;\n\n /**\n * List stored items (optional)\n *\n * @param prefix - Optional prefix to filter results\n * @param options - Optional listing options\n * @returns Array of storage items with metadata\n */\n list?: (\n prefix?: string,\n options?: StorageListOptions,\n ) => Promise<StorageListResult>;\n\n /**\n * Delete a stored item (optional)\n *\n * @param identifier - The storage identifier to delete\n * @returns Promise that resolves to true if deletion succeeded\n */\n delete?: (identifier: string) => Promise<boolean>;\n\n /**\n * Extract identifier from a URL or return as-is (optional)\n * Used for backward compatibility with URL-based systems\n *\n * @param url - The URL to extract from\n * @returns The extracted identifier\n */\n extractIdentifier?: (url: string) => string;\n}\n\n/**\n * Options for storage download operations\n *\n * @category Configuration\n */\nexport interface StorageDownloadOptions {\n /** Optional HTTP headers */\n headers?: Record<string, string>;\n /** Optional abort signal for cancellation */\n signal?: AbortSignal;\n /** Optional byte range for partial downloads */\n range?: { start?: number; end?: number };\n}\n\n/**\n * Result from storage list operations\n *\n * @category Configuration\n */\nexport interface StorageListResult {\n /** Array of storage items */\n items: Array<{\n /** Item identifier */\n identifier: string;\n /** Item size in bytes */\n size?: number;\n /** Last modified timestamp */\n lastModified?: Date;\n /** Item metadata */\n metadata?: Record<string, unknown>;\n }>;\n /** Continuation token for pagination */\n continuationToken?: string;\n /** Whether more results are available */\n hasMore?: boolean;\n}\n\n/**\n * Base configuration interface without storage requirements\n *\n * @category Configuration\n */\nexport interface BaseConfig {\n /**\n * Optional relayer configuration for handling gasless transactions.\n * Can be a URL string for convenience, or a callback for full control.\n *\n * @example\n * ```typescript\n * // Simple URL (SDK handles transport)\n * relayer: '/api/relay'\n *\n * // Full control with callback\n * relayer: async (request) => {\n * const response = await fetch('/api/relay', {\n * method: 'POST',\n * body: JSON.stringify(request)\n * });\n * return response.json();\n * }\n * ```\n */\n relayer?: RelayerConfig;\n\n /**\n * Optional download relayer for proxying CORS-restricted downloads.\n * Provides a proxy mechanism for files stored on servers with CORS restrictions.\n */\n downloadRelayer?: DownloadRelayerCallbacks;\n\n /**\n * Optional storage providers configuration for file upload/download.\n * Required for: upload(), grant() without pre-stored URLs, schema operations.\n * See StorageConfig for provider selection guidance.\n */\n storage?: StorageConfig;\n\n /**\n * Optional subgraph URL for querying user files and permissions.\n * If not provided, defaults to the built-in subgraph URL for the current chain.\n * Can be overridden per method call if needed.\n * Obtain chain-specific URLs from Vana documentation or deployment info.\n */\n subgraphUrl?: string;\n /**\n * Optional default IPFS gateways to use for fetching files.\n * These gateways will be used by default in fetchFromIPFS unless overridden per-call.\n * If not provided, the SDK will use public gateways.\n * Order matters: first successful gateway is used.\n *\n * @example ['https://gateway.pinata.cloud', 'https://ipfs.io']\n */\n ipfsGateways?: string[];\n /**\n * Default personal server base URL for server operations.\n * Required for ServerController methods like getIdentity(), createOperation(), etc.\n *\n * @example 'https://my-personal-server.example.com'\n */\n defaultPersonalServerUrl?: string;\n\n /**\n * Optional operation store for tracking async relayed transactions.\n * When provided with a relayer, enables resilient transaction management\n * with polling support for pending operations.\n *\n * @example\n * ```typescript\n * const vana = createVana({\n * walletClient,\n * relayer: '/api/relay',\n * operationStore: myOperationStore\n * });\n * ```\n */\n operationStore?: IOperationStore;\n}\n\n/**\n * Base configuration interface that requires storage for storage-dependent operations\n *\n * @category Configuration\n */\nexport interface BaseConfigWithStorage {\n /**\n * Optional relayer configuration for handling gasless transactions.\n * Can be a URL string for convenience, or a callback for full control.\n *\n * @example\n * ```typescript\n * // Simple URL (SDK handles transport)\n * relayer: '/api/relay'\n *\n * // Full control with callback\n * relayer: async (request) => {\n * const response = await fetch('/api/relay', {\n * method: 'POST',\n * body: JSON.stringify(request)\n * });\n * return response.json();\n * }\n * ```\n */\n relayer?: RelayerConfig;\n\n /**\n * Optional download relayer for proxying CORS-restricted downloads.\n * Provides a proxy mechanism for files stored on servers with CORS restrictions.\n */\n downloadRelayer?: DownloadRelayerCallbacks;\n\n /** Required storage providers configuration for file upload/download */\n storage: StorageConfig;\n /**\n * Optional subgraph URL for querying user files and permissions.\n * If not provided, defaults to the built-in subgraph URL for the current chain.\n * Can be overridden per method call if needed.\n */\n subgraphUrl?: string;\n /**\n * Optional default IPFS gateways to use for fetching files.\n * These gateways will be used by default in fetchFromIPFS unless overridden per-call.\n * If not provided, the SDK will use public gateways.\n *\n * @example ['https://gateway.pinata.cloud', 'https://ipfs.io']\n */\n ipfsGateways?: string[];\n /**\n * Default personal server base URL for server operations.\n * Required for ServerController methods like getIdentity(), createOperation(), etc.\n *\n * @example 'https://my-personal-server.example.com'\n */\n defaultPersonalServerUrl?: string;\n\n /**\n * Optional operation store for tracking async relayed transactions.\n * When provided with a relayer, enables resilient transaction management\n * with polling support for pending operations.\n */\n operationStore?: IOperationStore;\n}\n\n/**\n * Configuration with wallet client\n *\n * @category Configuration\n */\nexport interface WalletConfig extends BaseConfig {\n /** The viem WalletClient instance used for signing transactions */\n walletClient: WalletClient & {\n chain: VanaChain;\n };\n}\n\n/**\n * Configuration with wallet client that requires storage\n *\n * @category Configuration\n */\nexport interface WalletConfigWithStorage extends BaseConfigWithStorage {\n /** The viem WalletClient instance used for signing transactions */\n walletClient: WalletClient & {\n chain: VanaChain;\n };\n}\n\n/**\n * Configuration with chain and account details\n *\n * @category Configuration\n */\nexport interface ChainConfig extends BaseConfig {\n /**\n * The chain ID for Vana network.\n * Supported: 14800 (Vana Mainnet), 14801 (Moksha Testnet), 31337 (Local Development).\n * Use chain constants from '@vana/sdk' for type safety.\n */\n chainId: VanaChainId;\n /**\n * RPC URL for the chain (optional, will use default for the chain if not provided).\n * Default URLs: mainnet (https://rpc.vana.org), testnet (https://rpc.moksha.vana.org).\n * Override for custom nodes or local development.\n */\n rpcUrl?: string;\n /**\n * Optional account for signing transactions.\n * Can be: privateKeyToAccount(), mnemonicToAccount(), or custom Account implementation.\n * Required for write operations; read-only operations work without account.\n */\n account?: Account;\n}\n\n/**\n * Configuration with chain and account details that requires storage\n *\n * @category Configuration\n */\nexport interface ChainConfigWithStorage extends BaseConfigWithStorage {\n /** The chain ID for Vana network */\n chainId: VanaChainId;\n /** RPC URL for the chain (optional, will use default for the chain if not provided) */\n rpcUrl?: string;\n /** Optional account for signing transactions */\n account?: Account;\n}\n\n/**\n * Configuration with wallet client and optional public client\n *\n * @category Configuration\n */\nexport interface VanaConfigWithWallet extends BaseConfig {\n /** The viem WalletClient instance used for signing transactions */\n walletClient: WalletClient;\n /** Optional PublicClient for read operations (derived from wallet if not provided) */\n publicClient?: PublicClient;\n}\n\n/**\n * Configuration for read-only operations with public client and address\n *\n * @category Configuration\n */\nexport interface VanaConfigReadOnly extends BaseConfig {\n /** The viem PublicClient instance for read operations */\n publicClient: PublicClient;\n /** The user's address for read operations */\n address: Address;\n}\n\n/**\n * Configuration for minimal read-only operations with just an address\n *\n * @category Configuration\n */\nexport interface VanaConfigAddressOnly extends BaseConfig {\n /** The user's address for read operations */\n address: Address;\n /** Optional chain configuration (will use default if not provided) */\n chain?: Chain;\n}\n\n/**\n * Configuration with wallet client and optional public client that requires storage\n *\n * @category Configuration\n */\nexport interface VanaConfigWithWalletWithStorage extends BaseConfigWithStorage {\n /** The viem WalletClient instance used for signing transactions */\n walletClient: WalletClient;\n /** Optional PublicClient for read operations (derived from wallet if not provided) */\n publicClient?: PublicClient;\n}\n\n/**\n * Configuration for read-only operations with public client and address that requires storage\n *\n * @category Configuration\n */\nexport interface VanaConfigReadOnlyWithStorage extends BaseConfigWithStorage {\n /** The viem PublicClient instance for read operations */\n publicClient: PublicClient;\n /** The user's address for read operations */\n address: Address;\n}\n\n/**\n * Configuration for minimal read-only operations with just an address that requires storage\n *\n * @category Configuration\n */\nexport interface VanaConfigAddressOnlyWithStorage\n extends BaseConfigWithStorage {\n /** The user's address for read operations */\n address: Address;\n /** Optional chain configuration (will use default if not provided) */\n chain?: Chain;\n}\n\n/**\n * Main configuration interface for initializing the Vana SDK.\n *\n * The SDK supports three initialization modes:\n * 1. Full mode with wallet client for signing transactions\n * 2. Read-only mode with public client and address for read operations\n * 3. Minimal mode with just an address and optional chain\n *\n * @category Configuration\n * @example\n * ```typescript\n * // Mode 1: Full configuration with wallet client\n * const configWithWallet: VanaConfig = {\n * walletClient: createWalletClient({\n * account: privateKeyToAccount('0x...'),\n * chain: moksha,\n * transport: http()\n * }),\n * publicClient: createPublicClient({\n * chain: moksha,\n * transport: http()\n * })\n * };\n *\n * // Mode 2: Read-only with public client and address\n * const configReadOnly: VanaConfig = {\n * publicClient: createPublicClient({\n * chain: moksha,\n * transport: http()\n * }),\n * address: '0x1234...'\n * };\n *\n * // Mode 3: Minimal with just address\n * const configMinimal: VanaConfig = {\n * address: '0x1234...',\n * chain: moksha // optional\n * };\n * ```\n */\nexport type VanaConfig =\n | VanaConfigWithWallet\n | VanaConfigReadOnly\n | VanaConfigAddressOnly\n | WalletConfig\n | ChainConfig;\n\n/**\n * Configuration interface for Vana SDK that requires storage providers.\n *\n * Use this type when you need to ensure storage is configured for operations\n * like file uploads, permission grants without pre-stored URLs, or schema creation.\n * Supports all three initialization modes with required storage.\n *\n * @category Configuration\n * @example\n * ```typescript\n * // Full configuration with wallet client and storage\n * const configWithWallet: VanaConfigWithStorage = {\n * walletClient: createWalletClient({\n * account: privateKeyToAccount('0x...'),\n * chain: moksha,\n * transport: http()\n * }),\n * storage: {\n * providers: {\n * ipfs: new IPFSStorage({ gateway: 'https://gateway.pinata.cloud' })\n * },\n * defaultProvider: 'ipfs'\n * }\n * };\n *\n * // Read-only configuration with storage\n * const configReadOnly: VanaConfigWithStorage = {\n * publicClient: createPublicClient({\n * chain: moksha,\n * transport: http()\n * }),\n * address: '0x1234...',\n * storage: {\n * providers: {\n * ipfs: new IPFSStorage({ gateway: 'https://gateway.pinata.cloud' })\n * },\n * defaultProvider: 'ipfs'\n * }\n * };\n * ```\n */\nexport type VanaConfigWithStorage =\n | VanaConfigWithWalletWithStorage\n | VanaConfigReadOnlyWithStorage\n | VanaConfigAddressOnlyWithStorage\n | WalletConfigWithStorage\n | ChainConfigWithStorage;\n\n/**\n * Runtime configuration information\n *\n * @category Configuration\n */\nexport interface RuntimeConfig {\n /** Current chain ID */\n chainId: VanaChainId;\n /** Current chain name */\n chainName: string;\n /** Available storage providers */\n storageProviders: string[];\n /** Default storage provider */\n defaultStorageProvider?: string;\n /** Current relayer configuration */\n relayerConfig?: RelayerConfig;\n}\n\n/**\n * Validates whether a configuration object has a wallet client (any wallet-based config).\n *\n * @param config - The configuration object to check\n * @returns True if the config contains a walletClient\n * @example\n * ```typescript\n * if (isWalletConfig(config)) {\n * console.log('Using wallet client:', config.walletClient.account?.address);\n * } else {\n * console.log('Read-only or chain config');\n * }\n * ```\n */\nexport function isWalletConfig(\n config: VanaConfig,\n): config is VanaConfigWithWallet | WalletConfig {\n return \"walletClient\" in config;\n}\n\n/**\n * Validates whether a configuration object is a read-only config with public client.\n *\n * @param config - The configuration object to check\n * @returns True if the config has publicClient and address but no walletClient\n * @example\n * ```typescript\n * if (isReadOnlyConfig(config)) {\n * console.log('Read-only mode with address:', config.address);\n * }\n * ```\n */\nexport function isReadOnlyConfig(\n config: VanaConfig,\n): config is VanaConfigReadOnly {\n return (\n \"publicClient\" in config &&\n \"address\" in config &&\n !(\"walletClient\" in config)\n );\n}\n\n/**\n * Validates whether a configuration object is an address-only config.\n *\n * @param config - The configuration object to check\n * @returns True if the config has only address (and optionally chain) but no clients\n * @example\n * ```typescript\n * if (isAddressOnlyConfig(config)) {\n * console.log('Address-only mode:', config.address);\n * }\n * ```\n */\nexport function isAddressOnlyConfig(\n config: VanaConfig,\n): config is VanaConfigAddressOnly {\n return (\n \"address\" in config &&\n !(\"publicClient\" in config) &&\n !(\"walletClient\" in config) &&\n !(\"chainId\" in config)\n );\n}\n\n/**\n * Validates whether a configuration object is a ChainConfig.\n *\n * @param config - The configuration object to check\n * @returns True if the config is a ChainConfig (contains chainId but not walletClient)\n * @example\n * ```typescript\n * if (isChainConfig(config)) {\n * console.log('Chain ID:', config.chainId);\n * console.log('RPC URL:', config.rpcUrl);\n * } else {\n * console.log('Using pre-configured wallet client');\n * }\n * ```\n */\nexport function isChainConfig(config: VanaConfig): config is ChainConfig {\n return \"chainId\" in config && !(\"walletClient\" in config);\n}\n\n/**\n * Validates whether a configuration has required storage providers.\n *\n * @param config - The configuration object to check\n * @returns True if the config has storage providers configured\n * @example\n * ```typescript\n * if (hasStorageConfig(config)) {\n * // Safe to use storage-dependent operations\n * await vana.data.uploadFile(file);\n * } else {\n * console.log('Storage not configured - some operations may fail');\n * }\n * ```\n */\nexport function hasStorageConfig(\n config: VanaConfig,\n): config is VanaConfigWithStorage {\n return (\n config.storage?.providers !== undefined &&\n Object.keys(config.storage.providers).length > 0\n );\n}\n\n/**\n * Configuration validation options\n *\n * @category Configuration\n */\nexport interface ConfigValidationOptions {\n /** Whether to validate storage providers */\n validateStorage?: boolean;\n /** Whether to validate relayer URL */\n validateRelayer?: boolean;\n /** Whether to validate chain configuration */\n validateChain?: boolean;\n}\n\n/**\n * Configuration validation result\n *\n * @category Configuration\n */\nexport interface ConfigValidationResult {\n /** Whether the configuration is valid */\n valid: boolean;\n /** List of validation errors */\n errors: string[];\n /** List of validation warnings */\n warnings: string[];\n}\n\n/**\n * Marker interface to enforce the presence of operationStore at compile time.\n * This interface is used to ensure that certain operations requiring a relayer\n * can only be called when the SDK has been properly configured with an operation store.\n *\n * @category Configuration\n */\nexport interface RelayerRequiredMarker {\n readonly __relayerConfigured: true;\n}\n"],"mappings":"AAyqBO,SAAS,eACd,QAC+C;AAC/C,SAAO,kBAAkB;AAC3B;AAcO,SAAS,iBACd,QAC8B;AAC9B,SACE,kBAAkB,UAClB,aAAa,UACb,EAAE,kBAAkB;AAExB;AAcO,SAAS,oBACd,QACiC;AACjC,SACE,aAAa,UACb,EAAE,kBAAkB,WACpB,EAAE,kBAAkB,WACpB,EAAE,aAAa;AAEnB;AAiBO,SAAS,cAAc,QAA2C;AACvE,SAAO,aAAa,UAAU,EAAE,kBAAkB;AACpD;AAiBO,SAAS,iBACd,QACiC;AACjC,SACE,OAAO,SAAS,cAAc,UAC9B,OAAO,KAAK,OAAO,QAAQ,SAAS,EAAE,SAAS;AAEnD;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/types/config.ts"],"sourcesContent":["import type { WalletClient, PublicClient, Account, Address, Chain } from \"viem\";\nimport type { VanaChainId, VanaChain } from \"./chains\";\nimport type {\n StorageProvider,\n StorageUploadResult,\n StorageListOptions,\n} from \"./storage\";\n\nimport type { RelayerConfig } from \"./relayer\";\n\n/**\n * Marker interface to indicate that a Vana instance has storage configured.\n * Used for compile-time type safety to ensure storage-dependent methods\n * are only called on properly configured instances.\n *\n * @category Configuration\n */\nexport interface StorageRequiredMarker {\n readonly __storageRequired: true;\n}\n\n/**\n * Configures storage providers for SDK file operations.\n *\n * @remarks\n * Supports multiple backends with automatic fallback.\n * IPFS for decentralization, Pinata for reliability,\n * Google Drive for development, custom for flexibility.\n *\n * **Provider Selection:**\n * - IPFS: Decentralized, permanent storage ideal for production\n * - Pinata: Managed IPFS with guaranteed availability\n * - Google Drive: Centralized, suitable for development/testing\n * - Custom providers: Implement StorageProvider interface\n *\n * @category Configuration\n * @example\n * ```typescript\n * const storage: StorageConfig = {\n * providers: {\n * ipfs: new IPFSStorage({ gateway: 'https://gateway.pinata.cloud' }),\n * pinata: new PinataStorage({ apiKey: 'key', secretKey: 'secret' })\n * },\n * defaultProvider: 'ipfs'\n * };\n * ```\n */\nexport interface StorageConfig {\n /**\n * Map of provider name to storage provider instance.\n * Common provider names: \"ipfs\", \"pinata\", \"googledrive\", \"s3\".\n * Custom names allowed for custom provider implementations.\n */\n providers: Record<string, StorageProvider>;\n /**\n * Default provider name to use when none specified.\n * Must match a key in the providers map. Falls back to first provider if not specified.\n */\n defaultProvider?: string;\n}\n\n/**\n * Download relayer callbacks for proxying CORS-restricted downloads.\n *\n * Provides a callback to proxy download requests through your application server\n * when direct browser access fails due to CORS restrictions (e.g., Google Drive).\n *\n * IMPORTANT SECURITY REQUIREMENTS for your proxy endpoint:\n * 1. MUST block requests to private/internal IPs (SSRF protection)\n * 2. SHOULD NOT restrict domains (files can be hosted anywhere)\n *\n * @category Configuration\n * @example Client-side implementation:\n * ```typescript\n * const downloadRelayer: DownloadRelayerCallbacks = {\n * async proxyDownload(url) {\n * const response = await fetch('/api/proxy', {\n * method: 'POST',\n * headers: { 'Content-Type': 'application/json' },\n * body: JSON.stringify({ url })\n * });\n * return response.blob();\n * }\n * };\n * ```\n *\n * @example Server-side proxy endpoint (Next.js):\n * ```typescript\n * // /api/proxy/route.ts\n * import { promises as dns } from 'dns';\n * import { isIPv4 } from 'net';\n *\n * async function handleProxy(url: string) {\n * const { hostname } = new URL(url);\n *\n * // Resolve hostname to IP (handle localhost specially)\n * const ip = hostname === 'localhost' ? '127.0.0.1' :\n * isIPv4(hostname) ? hostname :\n * await dns.lookup(hostname).then(r => r.address);\n *\n * // SSRF Protection: Block private/internal IPs\n * if (isIPv4(ip)) {\n * const [a, b] = ip.split('.').map(Number);\n * if (a === 10 || a === 127 || a === 0 ||\n * (a === 172 && b >= 16 && b <= 31) ||\n * (a === 192 && b === 168) ||\n * (a === 169 && b === 254) ||\n * a >= 224) { // Also block multicast/reserved\n * return new Response('Private/internal addresses not allowed', { status: 403 });\n * }\n * }\n *\n * // Proxy the request\n * const response = await fetch(url, { redirect: 'manual' });\n *\n * // Handle redirects (with recursion limit)\n * if (response.status >= 301 && response.status <= 308) {\n * const location = response.headers.get('location');\n * if (location) return handleProxy(new URL(location, url).href);\n * }\n *\n * const data = await response.arrayBuffer();\n * return new Response(data, {\n * headers: {\n * 'Content-Type': response.headers.get('content-type') || 'application/octet-stream',\n * 'Access-Control-Allow-Origin': '*'\n * }\n * });\n * }\n * ```\n */\nexport interface DownloadRelayerCallbacks {\n /**\n * Proxy a download request through your application server\n *\n * @param url - The URL to download from\n * @returns Promise resolving to the downloaded content as a Blob\n */\n proxyDownload: (url: string) => Promise<Blob>;\n}\n\n/**\n * Storage callback functions for flexible storage operations.\n *\n * Instead of hardcoding storage behavior (HTTP endpoints, etc.), users can provide\n * custom callback functions to handle storage operations in any way they choose.\n * This pattern matches the relayer callbacks approach, providing maximum flexibility.\n *\n * @category Configuration\n * @example\n * ```typescript\n * const storageCallbacks: StorageCallbacks = {\n * async upload(blob, filename, metadata) {\n * // Custom implementation - could be HTTP, S3, local filesystem, etc.\n * const formData = new FormData();\n * formData.append('file', blob, filename);\n * const response = await fetch('/api/storage/upload', {\n * method: 'POST',\n * body: formData\n * });\n * const data = await response.json();\n * return {\n * url: data.url,\n * size: blob.size,\n * contentType: blob.type,\n * metadata: data.metadata\n * };\n * },\n *\n * async download(identifier) {\n * const response = await fetch(`/api/storage/download/${identifier}`);\n * return response.blob();\n * }\n * };\n * ```\n */\nexport interface StorageCallbacks {\n /**\n * Upload a blob to storage\n *\n * @param blob - The data to upload\n * @param filename - Optional filename hint\n * @param metadata - Optional metadata for the upload\n * @returns Upload result with identifier and metadata\n */\n upload: (\n blob: Blob,\n filename?: string,\n metadata?: Record<string, unknown>,\n ) => Promise<StorageUploadResult>;\n\n /**\n * Download data from storage\n *\n * @param identifier - The storage identifier (could be URL, hash, path, or any unique ID)\n * @param options - Optional download options\n * @returns The downloaded data as a Blob\n */\n download: (\n identifier: string,\n options?: StorageDownloadOptions,\n ) => Promise<Blob>;\n\n /**\n * List stored items (optional)\n *\n * @param prefix - Optional prefix to filter results\n * @param options - Optional listing options\n * @returns Array of storage items with metadata\n */\n list?: (\n prefix?: string,\n options?: StorageListOptions,\n ) => Promise<StorageListResult>;\n\n /**\n * Delete a stored item (optional)\n *\n * @param identifier - The storage identifier to delete\n * @returns Promise that resolves to true if deletion succeeded\n */\n delete?: (identifier: string) => Promise<boolean>;\n\n /**\n * Extract identifier from a URL or return as-is (optional)\n * Used for backward compatibility with URL-based systems\n *\n * @param url - The URL to extract from\n * @returns The extracted identifier\n */\n extractIdentifier?: (url: string) => string;\n}\n\n/**\n * Options for storage download operations\n *\n * @category Configuration\n */\nexport interface StorageDownloadOptions {\n /** Optional HTTP headers */\n headers?: Record<string, string>;\n /** Optional abort signal for cancellation */\n signal?: AbortSignal;\n /** Optional byte range for partial downloads */\n range?: { start?: number; end?: number };\n}\n\n/**\n * Result from storage list operations\n *\n * @category Configuration\n */\nexport interface StorageListResult {\n /** Array of storage items */\n items: Array<{\n /** Item identifier */\n identifier: string;\n /** Item size in bytes */\n size?: number;\n /** Last modified timestamp */\n lastModified?: Date;\n /** Item metadata */\n metadata?: Record<string, unknown>;\n }>;\n /** Continuation token for pagination */\n continuationToken?: string;\n /** Whether more results are available */\n hasMore?: boolean;\n}\n\n/**\n * Base configuration interface without storage requirements\n *\n * @category Configuration\n */\nexport interface BaseConfig {\n /**\n * Optional relayer configuration for handling gasless transactions.\n * Can be a URL string for convenience, or a callback for full control.\n *\n * @example\n * ```typescript\n * // Simple URL (SDK handles transport)\n * relayer: '/api/relay'\n *\n * // Full control with callback\n * relayer: async (request) => {\n * const response = await fetch('/api/relay', {\n * method: 'POST',\n * body: JSON.stringify(request)\n * });\n * return response.json();\n * }\n * ```\n */\n relayer?: RelayerConfig;\n\n /**\n * Optional download relayer for proxying CORS-restricted downloads.\n * Provides a proxy mechanism for files stored on servers with CORS restrictions.\n */\n downloadRelayer?: DownloadRelayerCallbacks;\n\n /**\n * Optional storage providers configuration for file upload/download.\n * Required for: upload(), grant() without pre-stored URLs, schema operations.\n * See StorageConfig for provider selection guidance.\n */\n storage?: StorageConfig;\n /**\n * Optional subgraph URL for querying user files and permissions.\n * If not provided, defaults to the built-in subgraph URL for the current chain.\n * Can be overridden per method call if needed.\n * Obtain chain-specific URLs from Vana documentation or deployment info.\n */\n subgraphUrl?: string;\n /**\n * Optional default IPFS gateways to use for fetching files.\n * These gateways will be used by default in fetchFromIPFS unless overridden per-call.\n * If not provided, the SDK will use public gateways.\n * Order matters: first successful gateway is used.\n *\n * @example ['https://gateway.pinata.cloud', 'https://ipfs.io']\n */\n ipfsGateways?: string[];\n /**\n * Default personal server base URL for server operations.\n * Required for ServerController methods like getIdentity(), createOperation(), etc.\n *\n * @example 'https://my-personal-server.example.com'\n */\n defaultPersonalServerUrl?: string;\n}\n\n/**\n * Base configuration interface that requires storage for storage-dependent operations\n *\n * @category Configuration\n */\nexport interface BaseConfigWithStorage {\n /**\n * Optional relayer configuration for handling gasless transactions.\n * Can be a URL string for convenience, or a callback for full control.\n *\n * @example\n * ```typescript\n * // Simple URL (SDK handles transport)\n * relayer: '/api/relay'\n *\n * // Full control with callback\n * relayer: async (request) => {\n * const response = await fetch('/api/relay', {\n * method: 'POST',\n * body: JSON.stringify(request)\n * });\n * return response.json();\n * }\n * ```\n */\n relayer?: RelayerConfig;\n\n /**\n * Optional download relayer for proxying CORS-restricted downloads.\n * Provides a proxy mechanism for files stored on servers with CORS restrictions.\n */\n downloadRelayer?: DownloadRelayerCallbacks;\n\n /** Required storage providers configuration for file upload/download */\n storage: StorageConfig;\n /**\n * Optional subgraph URL for querying user files and permissions.\n * If not provided, defaults to the built-in subgraph URL for the current chain.\n * Can be overridden per method call if needed.\n */\n subgraphUrl?: string;\n /**\n * Optional default IPFS gateways to use for fetching files.\n * These gateways will be used by default in fetchFromIPFS unless overridden per-call.\n * If not provided, the SDK will use public gateways.\n *\n * @example ['https://gateway.pinata.cloud', 'https://ipfs.io']\n */\n ipfsGateways?: string[];\n /**\n * Default personal server base URL for server operations.\n * Required for ServerController methods like getIdentity(), createOperation(), etc.\n *\n * @example 'https://my-personal-server.example.com'\n */\n defaultPersonalServerUrl?: string;\n}\n\n/**\n * Configuration with wallet client\n *\n * @category Configuration\n */\nexport interface WalletConfig extends BaseConfig {\n /** The viem WalletClient instance used for signing transactions */\n walletClient: WalletClient & {\n chain: VanaChain;\n };\n}\n\n/**\n * Configuration with wallet client that requires storage\n *\n * @category Configuration\n */\nexport interface WalletConfigWithStorage extends BaseConfigWithStorage {\n /** The viem WalletClient instance used for signing transactions */\n walletClient: WalletClient & {\n chain: VanaChain;\n };\n}\n\n/**\n * Configuration with chain and account details\n *\n * @category Configuration\n */\nexport interface ChainConfig extends BaseConfig {\n /**\n * The chain ID for Vana network.\n * Supported: 14800 (Vana Mainnet), 14801 (Moksha Testnet), 31337 (Local Development).\n * Use chain constants from '@vana/sdk' for type safety.\n */\n chainId: VanaChainId;\n /**\n * RPC URL for the chain (optional, will use default for the chain if not provided).\n * Default URLs: mainnet (https://rpc.vana.org), testnet (https://rpc.moksha.vana.org).\n * Override for custom nodes or local development.\n */\n rpcUrl?: string;\n /**\n * Optional account for signing transactions.\n * Can be: privateKeyToAccount(), mnemonicToAccount(), or custom Account implementation.\n * Required for write operations; read-only operations work without account.\n */\n account?: Account;\n}\n\n/**\n * Configuration with chain and account details that requires storage\n *\n * @category Configuration\n */\nexport interface ChainConfigWithStorage extends BaseConfigWithStorage {\n /** The chain ID for Vana network */\n chainId: VanaChainId;\n /** RPC URL for the chain (optional, will use default for the chain if not provided) */\n rpcUrl?: string;\n /** Optional account for signing transactions */\n account?: Account;\n}\n\n/**\n * Configuration with wallet client and optional public client\n *\n * @category Configuration\n */\nexport interface VanaConfigWithWallet extends BaseConfig {\n /** The viem WalletClient instance used for signing transactions */\n walletClient: WalletClient;\n /** Optional PublicClient for read operations (derived from wallet if not provided) */\n publicClient?: PublicClient;\n}\n\n/**\n * Configuration for read-only operations with public client and address\n *\n * @category Configuration\n */\nexport interface VanaConfigReadOnly extends BaseConfig {\n /** The viem PublicClient instance for read operations */\n publicClient: PublicClient;\n /** The user's address for read operations */\n address: Address;\n}\n\n/**\n * Configuration for minimal read-only operations with just an address\n *\n * @category Configuration\n */\nexport interface VanaConfigAddressOnly extends BaseConfig {\n /** The user's address for read operations */\n address: Address;\n /** Optional chain configuration (will use default if not provided) */\n chain?: Chain;\n}\n\n/**\n * Configuration with wallet client and optional public client that requires storage\n *\n * @category Configuration\n */\nexport interface VanaConfigWithWalletWithStorage extends BaseConfigWithStorage {\n /** The viem WalletClient instance used for signing transactions */\n walletClient: WalletClient;\n /** Optional PublicClient for read operations (derived from wallet if not provided) */\n publicClient?: PublicClient;\n}\n\n/**\n * Configuration for read-only operations with public client and address that requires storage\n *\n * @category Configuration\n */\nexport interface VanaConfigReadOnlyWithStorage extends BaseConfigWithStorage {\n /** The viem PublicClient instance for read operations */\n publicClient: PublicClient;\n /** The user's address for read operations */\n address: Address;\n}\n\n/**\n * Configuration for minimal read-only operations with just an address that requires storage\n *\n * @category Configuration\n */\nexport interface VanaConfigAddressOnlyWithStorage\n extends BaseConfigWithStorage {\n /** The user's address for read operations */\n address: Address;\n /** Optional chain configuration (will use default if not provided) */\n chain?: Chain;\n}\n\n/**\n * Main configuration interface for initializing the Vana SDK.\n *\n * The SDK supports three initialization modes:\n * 1. Full mode with wallet client for signing transactions\n * 2. Read-only mode with public client and address for read operations\n * 3. Minimal mode with just an address and optional chain\n *\n * @category Configuration\n * @example\n * ```typescript\n * // Mode 1: Full configuration with wallet client\n * const configWithWallet: VanaConfig = {\n * walletClient: createWalletClient({\n * account: privateKeyToAccount('0x...'),\n * chain: moksha,\n * transport: http()\n * }),\n * publicClient: createPublicClient({\n * chain: moksha,\n * transport: http()\n * })\n * };\n *\n * // Mode 2: Read-only with public client and address\n * const configReadOnly: VanaConfig = {\n * publicClient: createPublicClient({\n * chain: moksha,\n * transport: http()\n * }),\n * address: '0x1234...'\n * };\n *\n * // Mode 3: Minimal with just address\n * const configMinimal: VanaConfig = {\n * address: '0x1234...',\n * chain: moksha // optional\n * };\n * ```\n */\nexport type VanaConfig =\n | VanaConfigWithWallet\n | VanaConfigReadOnly\n | VanaConfigAddressOnly\n | WalletConfig\n | ChainConfig;\n\n/**\n * Configuration interface for Vana SDK that requires storage providers.\n *\n * Use this type when you need to ensure storage is configured for operations\n * like file uploads, permission grants without pre-stored URLs, or schema creation.\n * Supports all three initialization modes with required storage.\n *\n * @category Configuration\n * @example\n * ```typescript\n * // Full configuration with wallet client and storage\n * const configWithWallet: VanaConfigWithStorage = {\n * walletClient: createWalletClient({\n * account: privateKeyToAccount('0x...'),\n * chain: moksha,\n * transport: http()\n * }),\n * storage: {\n * providers: {\n * ipfs: new IPFSStorage({ gateway: 'https://gateway.pinata.cloud' })\n * },\n * defaultProvider: 'ipfs'\n * }\n * };\n *\n * // Read-only configuration with storage\n * const configReadOnly: VanaConfigWithStorage = {\n * publicClient: createPublicClient({\n * chain: moksha,\n * transport: http()\n * }),\n * address: '0x1234...',\n * storage: {\n * providers: {\n * ipfs: new IPFSStorage({ gateway: 'https://gateway.pinata.cloud' })\n * },\n * defaultProvider: 'ipfs'\n * }\n * };\n * ```\n */\nexport type VanaConfigWithStorage =\n | VanaConfigWithWalletWithStorage\n | VanaConfigReadOnlyWithStorage\n | VanaConfigAddressOnlyWithStorage\n | WalletConfigWithStorage\n | ChainConfigWithStorage;\n\n/**\n * Runtime configuration information\n *\n * @category Configuration\n */\nexport interface RuntimeConfig {\n /** Current chain ID */\n chainId: VanaChainId;\n /** Current chain name */\n chainName: string;\n /** Available storage providers */\n storageProviders: string[];\n /** Default storage provider */\n defaultStorageProvider?: string;\n /** Current relayer configuration */\n relayerConfig?: RelayerConfig;\n}\n\n/**\n * Validates whether a configuration object has a wallet client (any wallet-based config).\n *\n * @param config - The configuration object to check\n * @returns True if the config contains a walletClient\n * @example\n * ```typescript\n * if (isWalletConfig(config)) {\n * console.log('Using wallet client:', config.walletClient.account?.address);\n * } else {\n * console.log('Read-only or chain config');\n * }\n * ```\n */\nexport function isWalletConfig(\n config: VanaConfig,\n): config is VanaConfigWithWallet | WalletConfig {\n return \"walletClient\" in config;\n}\n\n/**\n * Validates whether a configuration object is a read-only config with public client.\n *\n * @param config - The configuration object to check\n * @returns True if the config has publicClient and address but no walletClient\n * @example\n * ```typescript\n * if (isReadOnlyConfig(config)) {\n * console.log('Read-only mode with address:', config.address);\n * }\n * ```\n */\nexport function isReadOnlyConfig(\n config: VanaConfig,\n): config is VanaConfigReadOnly {\n return (\n \"publicClient\" in config &&\n \"address\" in config &&\n !(\"walletClient\" in config)\n );\n}\n\n/**\n * Validates whether a configuration object is an address-only config.\n *\n * @param config - The configuration object to check\n * @returns True if the config has only address (and optionally chain) but no clients\n * @example\n * ```typescript\n * if (isAddressOnlyConfig(config)) {\n * console.log('Address-only mode:', config.address);\n * }\n * ```\n */\nexport function isAddressOnlyConfig(\n config: VanaConfig,\n): config is VanaConfigAddressOnly {\n return (\n \"address\" in config &&\n !(\"publicClient\" in config) &&\n !(\"walletClient\" in config) &&\n !(\"chainId\" in config)\n );\n}\n\n/**\n * Validates whether a configuration object is a ChainConfig.\n *\n * @param config - The configuration object to check\n * @returns True if the config is a ChainConfig (contains chainId but not walletClient)\n * @example\n * ```typescript\n * if (isChainConfig(config)) {\n * console.log('Chain ID:', config.chainId);\n * console.log('RPC URL:', config.rpcUrl);\n * } else {\n * console.log('Using pre-configured wallet client');\n * }\n * ```\n */\nexport function isChainConfig(config: VanaConfig): config is ChainConfig {\n return \"chainId\" in config && !(\"walletClient\" in config);\n}\n\n/**\n * Validates whether a configuration has required storage providers.\n *\n * @param config - The configuration object to check\n * @returns True if the config has storage providers configured\n * @example\n * ```typescript\n * if (hasStorageConfig(config)) {\n * // Safe to use storage-dependent operations\n * await vana.data.uploadFile(file);\n * } else {\n * console.log('Storage not configured - some operations may fail');\n * }\n * ```\n */\nexport function hasStorageConfig(\n config: VanaConfig,\n): config is VanaConfigWithStorage {\n return (\n config.storage?.providers !== undefined &&\n Object.keys(config.storage.providers).length > 0\n );\n}\n\n/**\n * Configuration validation options\n *\n * @category Configuration\n */\nexport interface ConfigValidationOptions {\n /** Whether to validate storage providers */\n validateStorage?: boolean;\n /** Whether to validate relayer URL */\n validateRelayer?: boolean;\n /** Whether to validate chain configuration */\n validateChain?: boolean;\n}\n\n/**\n * Configuration validation result\n *\n * @category Configuration\n */\nexport interface ConfigValidationResult {\n /** Whether the configuration is valid */\n valid: boolean;\n /** List of validation errors */\n errors: string[];\n /** List of validation warnings */\n warnings: string[];\n}\n"],"mappings":"AAgpBO,SAAS,eACd,QAC+C;AAC/C,SAAO,kBAAkB;AAC3B;AAcO,SAAS,iBACd,QAC8B;AAC9B,SACE,kBAAkB,UAClB,aAAa,UACb,EAAE,kBAAkB;AAExB;AAcO,SAAS,oBACd,QACiC;AACjC,SACE,aAAa,UACb,EAAE,kBAAkB,WACpB,EAAE,kBAAkB,WACpB,EAAE,aAAa;AAEnB;AAiBO,SAAS,cAAc,QAA2C;AACvE,SAAO,aAAa,UAAU,EAAE,kBAAkB;AACpD;AAiBO,SAAS,iBACd,QACiC;AACjC,SACE,OAAO,SAAS,cAAc,UAC9B,OAAO,KAAK,OAAO,QAAQ,SAAS,EAAE,SAAS;AAEnD;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/types/controller-context.ts"],"sourcesContent":["/**\n * Shared type definitions for controller contexts.\n *\n * @remarks\n * These types ensure consistency across all controllers and prevent drift.\n * Single source of truth following Rich Hickey's principles.\n */\n\nimport type { WalletClient, PublicClient, Address } from \"viem\";\nimport type { VanaPlatformAdapter } from \"../platform/interface\";\nimport type { StorageManager } from \"../storage\";\nimport type { DownloadRelayerCallbacks } from \"./config\";\nimport type { UnifiedRelayerRequest, UnifiedRelayerResponse } from \"./relayer\";\nimport type {\n TransactionResult,\n TransactionWaitOptions,\n Operation,\n PollingOptions,\n
|
|
1
|
+
{"version":3,"sources":["../../src/types/controller-context.ts"],"sourcesContent":["/**\n * Shared type definitions for controller contexts.\n *\n * @remarks\n * These types ensure consistency across all controllers and prevent drift.\n * Single source of truth following Rich Hickey's principles.\n */\n\nimport type { WalletClient, PublicClient, Address } from \"viem\";\nimport type { VanaPlatformAdapter } from \"../platform/interface\";\nimport type { StorageManager } from \"../storage\";\nimport type { DownloadRelayerCallbacks } from \"./config\";\nimport type { UnifiedRelayerRequest, UnifiedRelayerResponse } from \"./relayer\";\nimport type {\n TransactionResult,\n TransactionWaitOptions,\n Operation,\n PollingOptions,\n} from \"./operations\";\nimport type {\n Contract,\n Fn,\n TypedTransactionResult,\n} from \"../generated/event-types\";\n\n/**\n * Type definition for waitForTransactionEvents function.\n *\n * @remarks\n * This is THE single definition used everywhere to prevent drift.\n * If you need to change the signature, change it here.\n */\nexport type WaitForTransactionEventsFn = <C extends Contract, F extends Fn<C>>(\n transaction: TransactionResult<C, F>,\n options?: TransactionWaitOptions,\n) => Promise<TypedTransactionResult<C, F>>;\n\n/**\n * Type definition for waitForOperation function.\n */\nexport type WaitForOperationFn = <T = unknown>(\n opOrId: Operation<T> | string,\n options?: PollingOptions,\n) => Promise<Operation<T>>;\n\n/**\n * Shared controller context interface.\n *\n * @remarks\n * This is the contract that all controllers depend on.\n * Changing this interface is a breaking change.\n */\nexport interface ControllerContext {\n /** Signs transactions and messages using the user's private key. Optional to support read-only mode. */\n walletClient?: WalletClient;\n /** Queries blockchain state and smart contracts without signing. */\n publicClient: PublicClient;\n /** Address of the user for operations requiring user identification in read-only mode. */\n userAddress: Address;\n /** Signs application-specific operations when different from primary wallet. */\n applicationClient?: WalletClient;\n /** Handles gasless transaction submission through relayer services. */\n relayer?: (request: UnifiedRelayerRequest) => Promise<UnifiedRelayerResponse>;\n /** Proxies CORS-restricted downloads through application server. */\n downloadRelayer?: DownloadRelayerCallbacks;\n /** Manages file upload and download operations across storage providers. */\n storageManager?: StorageManager;\n /** Provides subgraph endpoint for querying indexed blockchain data. */\n subgraphUrl?: string;\n /** Adapts SDK functionality to the current runtime environment. */\n platform: VanaPlatformAdapter;\n /** Validates that storage is available for storage-dependent operations. */\n validateStorageRequired?: () => void;\n /** Checks whether storage is configured without throwing an error. */\n hasStorage?: () => boolean;\n /** Default IPFS gateways to use for fetching files. */\n ipfsGateways?: string[];\n /** Default personal server base URL for server operations. */\n defaultPersonalServerUrl?: string;\n /** Waits for transaction confirmation and parses typed events. */\n waitForTransactionEvents?: WaitForTransactionEventsFn;\n /** Waits for an operation to complete with polling. */\n waitForOperation?: WaitForOperationFn;\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|
|
@@ -10,7 +10,7 @@ import type { VanaPlatformAdapter } from "../platform/interface";
|
|
|
10
10
|
import type { StorageManager } from "../storage";
|
|
11
11
|
import type { DownloadRelayerCallbacks } from "./config";
|
|
12
12
|
import type { UnifiedRelayerRequest, UnifiedRelayerResponse } from "./relayer";
|
|
13
|
-
import type { TransactionResult, TransactionWaitOptions, Operation, PollingOptions
|
|
13
|
+
import type { TransactionResult, TransactionWaitOptions, Operation, PollingOptions } from "./operations";
|
|
14
14
|
import type { Contract, Fn, TypedTransactionResult } from "../generated/event-types";
|
|
15
15
|
/**
|
|
16
16
|
* Type definition for waitForTransactionEvents function.
|
|
@@ -62,6 +62,4 @@ export interface ControllerContext {
|
|
|
62
62
|
waitForTransactionEvents?: WaitForTransactionEventsFn;
|
|
63
63
|
/** Waits for an operation to complete with polling. */
|
|
64
64
|
waitForOperation?: WaitForOperationFn;
|
|
65
|
-
/** Tracks async relayed transactions for resilient management. */
|
|
66
|
-
operationStore?: IOperationStore;
|
|
67
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/types/generics.ts"],"sourcesContent":["/**\n * Defines generic types and interfaces for SDK infrastructure.\n *\n * @remarks\n * This module provides reusable type definitions and interfaces that form\n * the foundation of the SDK's architecture. It includes patterns for requests,\n * responses, caching, middleware, repositories, and other common software\n * engineering abstractions.\n *\n * @category Types\n * @module types/generics\n */\n\nimport type { Address, Hash } from \"viem\";\n\n/**\n * Represents a standardized request structure for SDK operations.\n *\n * @remarks\n * Provides consistent request handling across all SDK methods with\n * typed parameters and optional configuration.\n *\n * @typeParam TParams - Type of request parameters\n * @typeParam TOptions - Type of optional configuration\n *\n * @category Reference\n */\nexport interface GenericRequest<TParams = unknown, TOptions = unknown> {\n /** Request parameters */\n params: TParams;\n /** Additional request options */\n options?: TOptions;\n}\n\n/**\n * Represents a standardized response structure for SDK operations.\n *\n * @remarks\n * Provides consistent response handling with success/error states\n * and optional metadata for additional context.\n *\n * @typeParam TData - Type of response data\n * @typeParam TMeta - Type of response metadata\n *\n * @category Reference\n */\nexport interface GenericResponse<TData = unknown, TMeta = unknown> {\n /** Response data */\n data: TData;\n /** Response metadata */\n meta?: TMeta;\n /** Success status */\n success: boolean;\n /** Error information if not successful */\n error?: {\n code: string;\n message: string;\n details?: unknown;\n };\n}\n\n/**\n * Represents the result of an asynchronous blockchain operation.\n *\n * @remarks\n * Includes transaction details when the operation involves\n * blockchain state changes.\n *\n * @typeParam T - Type of the operation result\n *\n * @category Reference\n */\nexport interface AsyncResult<T> {\n /** Operation result */\n result: T;\n /** Transaction hash if applicable */\n transactionHash?: Hash;\n /** Block number if applicable */\n blockNumber?: bigint;\n /** Gas used if applicable */\n gasUsed?: bigint;\n}\n\n/**\n * Generic contract interaction parameters\n *\n * @category Reference\n */\nexport interface ContractCall<\n TArgs extends readonly unknown[] = readonly unknown[],\n> {\n /** Contract method name */\n method: string;\n /** Method arguments */\n args: TArgs;\n /** Call options */\n options?: {\n /** Gas limit */\n gas?: bigint;\n /** Gas price */\n gasPrice?: bigint;\n /** Value to send */\n value?: bigint;\n };\n}\n\n/**\n * Generic contract event filter\n *\n * @category Reference\n */\nexport interface EventFilter<TEventArgs = unknown> {\n /** Event name */\n event: string;\n /** Event arguments filter */\n args?: TEventArgs;\n /** From block */\n fromBlock?: bigint;\n /** To block */\n toBlock?: bigint;\n /** Address filter */\n address?: Address | Address[];\n}\n\n/**\n * Generic event log\n *\n * @category Reference\n */\nexport interface EventLog<TArgs = unknown> {\n /** Event name */\n event: string;\n /** Event arguments */\n args: TArgs;\n /** Block number */\n blockNumber: bigint;\n /** Transaction hash */\n transactionHash: Hash;\n /** Log index */\n logIndex: number;\n /** Transaction index */\n transactionIndex: number;\n /** Contract address */\n address: Address;\n}\n\n/**\n * Generic controller context for dependency injection\n *\n * @category Reference\n */\nexport interface ControllerContext<TClient = unknown, TConfig = unknown> {\n /** Client instance */\n client: TClient;\n /** Configuration */\n config?: TConfig;\n /** Additional context */\n [key: string]: unknown;\n}\n\n/**\n * Generic controller interface\n *\n * @category Reference\n */\nexport interface Controller<TContext = unknown> {\n /** Controller context */\n readonly context: TContext;\n}\n\n/**\n * Generic storage provider interface\n *\n * @category Reference\n */\nexport interface StorageProvider<TConfig = unknown, TOptions = unknown> {\n /** Provider name */\n readonly name: string;\n /** Provider configuration */\n readonly config: TConfig;\n\n /** Upload data */\n upload(\n data: Uint8Array,\n options?: TOptions,\n ): Promise<{\n url: string;\n size: number;\n checksum?: string;\n }>;\n\n /** Download data */\n download(\n url: string,\n options?: TOptions,\n ): Promise<{\n data: Uint8Array;\n size: number;\n checksum?: string;\n }>;\n\n /** Delete data */\n delete?(url: string, options?: TOptions): Promise<boolean>;\n\n /** Check if data exists */\n exists?(url: string, options?: TOptions): Promise<boolean>;\n}\n\n/**\n * Defines a generic caching interface with TTL support.\n *\n * @remarks\n * Provides standard cache operations for performance optimization\n * and reducing redundant computations or network requests.\n *\n * @typeParam TKey - Type of cache keys\n * @typeParam TValue - Type of cached values\n *\n * @category Reference\n */\nexport interface Cache<TKey = string, TValue = unknown> {\n /** Get value from cache */\n get(key: TKey): Promise<TValue | undefined>;\n\n /** Set value in cache */\n set(key: TKey, value: TValue, ttl?: number): Promise<void>;\n\n /** Delete value from cache */\n delete(key: TKey): Promise<boolean>;\n\n /** Clear all cache */\n clear(): Promise<void>;\n\n /** Check if key exists */\n has(key: TKey): Promise<boolean>;\n}\n\n/**\n * Configures retry behavior for resilient operations.\n *\n * @remarks\n * Supports exponential backoff, jitter, and custom retry conditions\n * for handling transient failures gracefully.\n *\n * @typeParam TError - Type of errors to handle\n *\n * @category Reference\n */\nexport interface RetryConfig<TError = Error> {\n /** Maximum retry attempts */\n maxAttempts: number;\n /** Base delay in milliseconds */\n baseDelay: number;\n /** Backoff multiplier */\n backoffMultiplier?: number;\n /** Maximum delay */\n maxDelay?: number;\n /** Jitter factor */\n jitter?: number;\n /** Retry condition */\n shouldRetry?: (error: TError, attempt: number) => boolean;\n}\n\n/**\n * Generic rate limiter configuration\n *\n * @category Reference\n */\nexport interface RateLimiterConfig {\n /** Requests per time window */\n requestsPerWindow: number;\n /** Time window in milliseconds */\n windowMs: number;\n /** Burst allowance */\n burstLimit?: number;\n}\n\n/**\n * Defines middleware for request/response processing pipelines.\n *\n * @remarks\n * Middleware can transform requests, responses, and handle errors\n * in a composable chain of responsibility pattern.\n *\n * @typeParam TRequest - Type of requests to process\n * @typeParam TResponse - Type of responses to process\n *\n * @category Reference\n */\nexport interface Middleware<TRequest = unknown, TResponse = unknown> {\n /** Middleware name */\n readonly name: string;\n\n /** Process request */\n request?(req: TRequest): Promise<TRequest>;\n\n /** Process response */\n response?(res: TResponse): Promise<TResponse>;\n\n /** Handle errors */\n error?(error: Error, req: TRequest): Promise<TResponse | void>;\n}\n\n/**\n * Generic plugin interface\n *\n * @category Reference\n */\nexport interface Plugin<TConfig = unknown> {\n /** Plugin name */\n readonly name: string;\n /** Plugin version */\n readonly version: string;\n /** Plugin configuration */\n readonly config: TConfig;\n\n /** Initialize plugin */\n init?(): Promise<void>;\n\n /** Cleanup plugin */\n cleanup?(): Promise<void>;\n}\n\n/**\n * Generic factory interface\n *\n * @category Reference\n */\nexport interface Factory<T, TParams = unknown> {\n /** Create instance */\n create(params: TParams): T;\n\n /** Create multiple instances */\n createMany?(params: TParams[]): T[];\n\n /** Validate parameters */\n validate?(params: TParams): boolean;\n}\n\n/**\n * Defines a repository pattern for data access abstraction.\n *\n * @remarks\n * Provides CRUD operations with filtering, sorting, and pagination\n * for consistent data access across different storage backends.\n *\n * @typeParam TEntity - Type of entities managed by the repository\n * @typeParam TKey - Type of entity identifiers\n *\n * @category Reference\n */\nexport interface Repository<TEntity, TKey = string | number> {\n /** Find by ID */\n findById(id: TKey): Promise<TEntity | undefined>;\n\n /** Find all entities */\n findAll(options?: {\n limit?: number;\n offset?: number;\n filter?: Partial<TEntity>;\n sort?: Array<{ field: keyof TEntity; direction: \"asc\" | \"desc\" }>;\n }): Promise<{\n entities: TEntity[];\n total: number;\n hasMore: boolean;\n }>;\n\n /** Create entity */\n create(entity: Omit<TEntity, \"id\">): Promise<TEntity>;\n\n /** Update entity */\n update(id: TKey, updates: Partial<TEntity>): Promise<TEntity>;\n\n /** Delete entity */\n delete(id: TKey): Promise<boolean>;\n\n /** Check if entity exists */\n exists(id: TKey): Promise<boolean>;\n}\n\n/**\n * Generic validator interface\n *\n * @category Reference\n */\nexport interface Validator<T> {\n /** Validate value */\n validate(value: unknown): value is T;\n\n /** Get validation errors */\n getErrors?(value: unknown): string[];\n\n /** Get validation schema */\n getSchema?(): unknown;\n}\n\n/**\n * Generic transformer interface\n *\n * @category Reference\n */\nexport interface Transformer<TInput, TOutput> {\n /** Transform input to output */\n transform(input: TInput): TOutput | Promise<TOutput>;\n\n /** Reverse transform output to input */\n reverse?(output: TOutput): TInput | Promise<TInput>;\n}\n\n/**\n * Generic service interface\n *\n * @category Reference\n */\nexport interface Service<TConfig = unknown> {\n /** Service name */\n readonly name: string;\n /** Service configuration */\n readonly config: TConfig;\n /** Service status */\n readonly status:\n | \"idle\"\n | \"starting\"\n | \"running\"\n | \"stopping\"\n | \"stopped\"\n | \"error\";\n\n /** Start service */\n start(): Promise<void>;\n\n /** Stop service */\n stop(): Promise<void>;\n\n /** Restart service */\n restart?(): Promise<void>;\n\n /** Get health status */\n getHealth?(): Promise<{\n healthy: boolean;\n details?: Record<string, unknown>;\n }>;\n}\n\n/**\n * Implements the observer in the observer pattern.\n *\n * @remarks\n * Receives notifications about events from observable subjects\n * for decoupled event handling.\n *\n * @typeParam TEvent - Type of events to observe\n *\n * @category Reference\n */\nexport interface Observer<TEvent = unknown> {\n /** Handle event */\n notify(event: TEvent): void | Promise<void>;\n}\n\n/**\n * Implements the subject in the observer pattern.\n *\n * @remarks\n * Manages observers and emits events to all subscribed observers\n * for event-driven architectures.\n *\n * @typeParam TEvent - Type of events to emit\n *\n * @category Reference\n */\nexport interface Observable<TEvent = unknown> {\n /** Subscribe to events */\n subscribe(observer: Observer<TEvent>): () => void;\n\n /** Unsubscribe from events */\n unsubscribe(observer: Observer<TEvent>): void;\n\n /** Emit event */\n emit(event: TEvent): void;\n}\n\n/**\n * Generic state machine interface\n *\n * @category Reference\n */\nexport interface StateMachine<TState, TEvent> {\n /** Current state */\n readonly currentState: TState;\n\n /** Transition to new state */\n transition(event: TEvent): TState;\n\n /** Check if transition is valid */\n canTransition(event: TEvent): boolean;\n\n /** Get available transitions */\n getAvailableTransitions(): TEvent[];\n}\n\n/**\n * Helper type to make properties optional conditionally\n *\n * @category Reference\n */\nexport type ConditionalOptional<\n T,\n K extends keyof T,\n Condition extends boolean,\n> = Condition extends true ? Omit<T, K> & Partial<Pick<T, K>> : T;\n\n/**\n * Helper type to extract promise result type\n *\n * @category Reference\n */\nexport type PromiseResult<T> = T extends Promise<infer U> ? U : T;\n\n/**\n * Helper type to create a union of all possible keys\n *\n * @category Reference\n */\nexport type AllKeys<T> = T extends unknown ? keyof T : never;\n\n/**\n * Helper type to create a deep partial type\n *\n * @category Reference\n */\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\n/**\n * Helper type to create a deep readonly type\n *\n * @category Reference\n */\nexport type DeepReadonly<T> = {\n readonly [P in keyof T]: T[P] extends object ? DeepReadonly<T[P]> : T[P];\n};\n\n/**\n * Helper type to create a required type with specific keys\n *\n * @category Reference\n */\nexport type RequireKeys<T, K extends keyof T> = Required<Pick<T, K>> &\n Omit<T, K>;\n\n/**\n * Helper type to create an optional type with specific keys\n *\n * @category Reference\n */\nexport type OptionalKeys<T, K extends keyof T> = Partial<Pick<T, K>> &\n Omit<T, K>;\n\n/**\n * Helper type to exclude null and undefined\n *\n * @category Reference\n */\nexport type NonNullable<T> = T extends null | undefined ? never : T;\n\n/**\n * Helper type to create a type with only specific keys\n *\n * @category Reference\n */\nexport type PickByType<T, U> = {\n [K in keyof T as T[K] extends U ? K : never]: T[K];\n};\n\n/**\n * Helper type to omit keys by type\n *\n * @category Reference\n */\nexport type OmitByType<T, U> = {\n [K in keyof T as T[K] extends U ? never : K]: T[K];\n};\n\n/**\n * Helper type for branded types\n *\n * @category Reference\n */\nexport type Brand<T, B> = T & { readonly __brand: B };\n\n/**\n * Helper type for nominal types\n *\n * @category Reference\n */\nexport type Nominal<T, N extends string> = T & { readonly __nominal: N };\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/types/generics.ts"],"sourcesContent":["/**\n * Defines generic types and interfaces for SDK infrastructure.\n *\n * @remarks\n * This module provides reusable type definitions and interfaces that form\n * the foundation of the SDK's architecture. It includes patterns for requests,\n * responses, caching, middleware, repositories, and other common software\n * engineering abstractions.\n *\n * @category Types\n * @module types/generics\n */\n\nimport type { Address, Hash } from \"viem\";\n\n/**\n * Represents a standardized request structure for SDK operations.\n *\n * @remarks\n * Provides consistent request handling across all SDK methods with\n * typed parameters and optional configuration.\n *\n * @typeParam TParams - Type of request parameters\n * @typeParam TOptions - Type of optional configuration\n *\n * @category Reference\n */\nexport interface GenericRequest<TParams = unknown, TOptions = unknown> {\n /** Request parameters */\n params: TParams;\n /** Additional request options */\n options?: TOptions;\n}\n\n/**\n * Represents a standardized response structure for SDK operations.\n *\n * @remarks\n * Provides consistent response handling with success/error states\n * and optional metadata for additional context.\n *\n * @typeParam TData - Type of response data\n * @typeParam TMeta - Type of response metadata\n *\n * @category Reference\n */\nexport interface GenericResponse<TData = unknown, TMeta = unknown> {\n /** Response data */\n data: TData;\n /** Response metadata */\n meta?: TMeta;\n /** Success status */\n success: boolean;\n /** Error information if not successful */\n error?: {\n code: string;\n message: string;\n details?: unknown;\n };\n}\n\n/**\n * Represents the result of an asynchronous blockchain operation.\n *\n * @remarks\n * Includes transaction details when the operation involves\n * blockchain state changes.\n *\n * @typeParam T - Type of the operation result\n *\n * @category Reference\n */\nexport interface AsyncResult<T> {\n /** Operation result */\n result: T;\n /** Transaction hash if applicable */\n transactionHash?: Hash;\n /** Block number if applicable */\n blockNumber?: bigint;\n /** Gas used if applicable */\n gasUsed?: bigint;\n}\n\n/**\n * Generic contract interaction parameters\n *\n * @category Reference\n */\nexport interface ContractCall<\n TArgs extends readonly unknown[] = readonly unknown[],\n> {\n /** Contract method name */\n method: string;\n /** Method arguments */\n args: TArgs;\n /** Call options */\n options?: {\n /** Gas limit */\n gasLimit?: bigint;\n /** Gas price */\n gasPrice?: bigint;\n /** Value to send */\n value?: bigint;\n };\n}\n\n/**\n * Generic contract event filter\n *\n * @category Reference\n */\nexport interface EventFilter<TEventArgs = unknown> {\n /** Event name */\n event: string;\n /** Event arguments filter */\n args?: TEventArgs;\n /** From block */\n fromBlock?: bigint;\n /** To block */\n toBlock?: bigint;\n /** Address filter */\n address?: Address | Address[];\n}\n\n/**\n * Generic event log\n *\n * @category Reference\n */\nexport interface EventLog<TArgs = unknown> {\n /** Event name */\n event: string;\n /** Event arguments */\n args: TArgs;\n /** Block number */\n blockNumber: bigint;\n /** Transaction hash */\n transactionHash: Hash;\n /** Log index */\n logIndex: number;\n /** Transaction index */\n transactionIndex: number;\n /** Contract address */\n address: Address;\n}\n\n/**\n * Generic controller context for dependency injection\n *\n * @category Reference\n */\nexport interface ControllerContext<TClient = unknown, TConfig = unknown> {\n /** Client instance */\n client: TClient;\n /** Configuration */\n config?: TConfig;\n /** Additional context */\n [key: string]: unknown;\n}\n\n/**\n * Generic controller interface\n *\n * @category Reference\n */\nexport interface Controller<TContext = unknown> {\n /** Controller context */\n readonly context: TContext;\n}\n\n/**\n * Generic storage provider interface\n *\n * @category Reference\n */\nexport interface StorageProvider<TConfig = unknown, TOptions = unknown> {\n /** Provider name */\n readonly name: string;\n /** Provider configuration */\n readonly config: TConfig;\n\n /** Upload data */\n upload(\n data: Uint8Array,\n options?: TOptions,\n ): Promise<{\n url: string;\n size: number;\n checksum?: string;\n }>;\n\n /** Download data */\n download(\n url: string,\n options?: TOptions,\n ): Promise<{\n data: Uint8Array;\n size: number;\n checksum?: string;\n }>;\n\n /** Delete data */\n delete?(url: string, options?: TOptions): Promise<boolean>;\n\n /** Check if data exists */\n exists?(url: string, options?: TOptions): Promise<boolean>;\n}\n\n/**\n * Defines a generic caching interface with TTL support.\n *\n * @remarks\n * Provides standard cache operations for performance optimization\n * and reducing redundant computations or network requests.\n *\n * @typeParam TKey - Type of cache keys\n * @typeParam TValue - Type of cached values\n *\n * @category Reference\n */\nexport interface Cache<TKey = string, TValue = unknown> {\n /** Get value from cache */\n get(key: TKey): Promise<TValue | undefined>;\n\n /** Set value in cache */\n set(key: TKey, value: TValue, ttl?: number): Promise<void>;\n\n /** Delete value from cache */\n delete(key: TKey): Promise<boolean>;\n\n /** Clear all cache */\n clear(): Promise<void>;\n\n /** Check if key exists */\n has(key: TKey): Promise<boolean>;\n}\n\n/**\n * Configures retry behavior for resilient operations.\n *\n * @remarks\n * Supports exponential backoff, jitter, and custom retry conditions\n * for handling transient failures gracefully.\n *\n * @typeParam TError - Type of errors to handle\n *\n * @category Reference\n */\nexport interface RetryConfig<TError = Error> {\n /** Maximum retry attempts */\n maxAttempts: number;\n /** Base delay in milliseconds */\n baseDelay: number;\n /** Backoff multiplier */\n backoffMultiplier?: number;\n /** Maximum delay */\n maxDelay?: number;\n /** Jitter factor */\n jitter?: number;\n /** Retry condition */\n shouldRetry?: (error: TError, attempt: number) => boolean;\n}\n\n/**\n * Generic rate limiter configuration\n *\n * @category Reference\n */\nexport interface RateLimiterConfig {\n /** Requests per time window */\n requestsPerWindow: number;\n /** Time window in milliseconds */\n windowMs: number;\n /** Burst allowance */\n burstLimit?: number;\n}\n\n/**\n * Defines middleware for request/response processing pipelines.\n *\n * @remarks\n * Middleware can transform requests, responses, and handle errors\n * in a composable chain of responsibility pattern.\n *\n * @typeParam TRequest - Type of requests to process\n * @typeParam TResponse - Type of responses to process\n *\n * @category Reference\n */\nexport interface Middleware<TRequest = unknown, TResponse = unknown> {\n /** Middleware name */\n readonly name: string;\n\n /** Process request */\n request?(req: TRequest): Promise<TRequest>;\n\n /** Process response */\n response?(res: TResponse): Promise<TResponse>;\n\n /** Handle errors */\n error?(error: Error, req: TRequest): Promise<TResponse | void>;\n}\n\n/**\n * Generic plugin interface\n *\n * @category Reference\n */\nexport interface Plugin<TConfig = unknown> {\n /** Plugin name */\n readonly name: string;\n /** Plugin version */\n readonly version: string;\n /** Plugin configuration */\n readonly config: TConfig;\n\n /** Initialize plugin */\n init?(): Promise<void>;\n\n /** Cleanup plugin */\n cleanup?(): Promise<void>;\n}\n\n/**\n * Generic factory interface\n *\n * @category Reference\n */\nexport interface Factory<T, TParams = unknown> {\n /** Create instance */\n create(params: TParams): T;\n\n /** Create multiple instances */\n createMany?(params: TParams[]): T[];\n\n /** Validate parameters */\n validate?(params: TParams): boolean;\n}\n\n/**\n * Defines a repository pattern for data access abstraction.\n *\n * @remarks\n * Provides CRUD operations with filtering, sorting, and pagination\n * for consistent data access across different storage backends.\n *\n * @typeParam TEntity - Type of entities managed by the repository\n * @typeParam TKey - Type of entity identifiers\n *\n * @category Reference\n */\nexport interface Repository<TEntity, TKey = string | number> {\n /** Find by ID */\n findById(id: TKey): Promise<TEntity | undefined>;\n\n /** Find all entities */\n findAll(options?: {\n limit?: number;\n offset?: number;\n filter?: Partial<TEntity>;\n sort?: Array<{ field: keyof TEntity; direction: \"asc\" | \"desc\" }>;\n }): Promise<{\n entities: TEntity[];\n total: number;\n hasMore: boolean;\n }>;\n\n /** Create entity */\n create(entity: Omit<TEntity, \"id\">): Promise<TEntity>;\n\n /** Update entity */\n update(id: TKey, updates: Partial<TEntity>): Promise<TEntity>;\n\n /** Delete entity */\n delete(id: TKey): Promise<boolean>;\n\n /** Check if entity exists */\n exists(id: TKey): Promise<boolean>;\n}\n\n/**\n * Generic validator interface\n *\n * @category Reference\n */\nexport interface Validator<T> {\n /** Validate value */\n validate(value: unknown): value is T;\n\n /** Get validation errors */\n getErrors?(value: unknown): string[];\n\n /** Get validation schema */\n getSchema?(): unknown;\n}\n\n/**\n * Generic transformer interface\n *\n * @category Reference\n */\nexport interface Transformer<TInput, TOutput> {\n /** Transform input to output */\n transform(input: TInput): TOutput | Promise<TOutput>;\n\n /** Reverse transform output to input */\n reverse?(output: TOutput): TInput | Promise<TInput>;\n}\n\n/**\n * Generic service interface\n *\n * @category Reference\n */\nexport interface Service<TConfig = unknown> {\n /** Service name */\n readonly name: string;\n /** Service configuration */\n readonly config: TConfig;\n /** Service status */\n readonly status:\n | \"idle\"\n | \"starting\"\n | \"running\"\n | \"stopping\"\n | \"stopped\"\n | \"error\";\n\n /** Start service */\n start(): Promise<void>;\n\n /** Stop service */\n stop(): Promise<void>;\n\n /** Restart service */\n restart?(): Promise<void>;\n\n /** Get health status */\n getHealth?(): Promise<{\n healthy: boolean;\n details?: Record<string, unknown>;\n }>;\n}\n\n/**\n * Implements the observer in the observer pattern.\n *\n * @remarks\n * Receives notifications about events from observable subjects\n * for decoupled event handling.\n *\n * @typeParam TEvent - Type of events to observe\n *\n * @category Reference\n */\nexport interface Observer<TEvent = unknown> {\n /** Handle event */\n notify(event: TEvent): void | Promise<void>;\n}\n\n/**\n * Implements the subject in the observer pattern.\n *\n * @remarks\n * Manages observers and emits events to all subscribed observers\n * for event-driven architectures.\n *\n * @typeParam TEvent - Type of events to emit\n *\n * @category Reference\n */\nexport interface Observable<TEvent = unknown> {\n /** Subscribe to events */\n subscribe(observer: Observer<TEvent>): () => void;\n\n /** Unsubscribe from events */\n unsubscribe(observer: Observer<TEvent>): void;\n\n /** Emit event */\n emit(event: TEvent): void;\n}\n\n/**\n * Generic state machine interface\n *\n * @category Reference\n */\nexport interface StateMachine<TState, TEvent> {\n /** Current state */\n readonly currentState: TState;\n\n /** Transition to new state */\n transition(event: TEvent): TState;\n\n /** Check if transition is valid */\n canTransition(event: TEvent): boolean;\n\n /** Get available transitions */\n getAvailableTransitions(): TEvent[];\n}\n\n/**\n * Helper type to make properties optional conditionally\n *\n * @category Reference\n */\nexport type ConditionalOptional<\n T,\n K extends keyof T,\n Condition extends boolean,\n> = Condition extends true ? Omit<T, K> & Partial<Pick<T, K>> : T;\n\n/**\n * Helper type to extract promise result type\n *\n * @category Reference\n */\nexport type PromiseResult<T> = T extends Promise<infer U> ? U : T;\n\n/**\n * Helper type to create a union of all possible keys\n *\n * @category Reference\n */\nexport type AllKeys<T> = T extends unknown ? keyof T : never;\n\n/**\n * Helper type to create a deep partial type\n *\n * @category Reference\n */\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\n/**\n * Helper type to create a deep readonly type\n *\n * @category Reference\n */\nexport type DeepReadonly<T> = {\n readonly [P in keyof T]: T[P] extends object ? DeepReadonly<T[P]> : T[P];\n};\n\n/**\n * Helper type to create a required type with specific keys\n *\n * @category Reference\n */\nexport type RequireKeys<T, K extends keyof T> = Required<Pick<T, K>> &\n Omit<T, K>;\n\n/**\n * Helper type to create an optional type with specific keys\n *\n * @category Reference\n */\nexport type OptionalKeys<T, K extends keyof T> = Partial<Pick<T, K>> &\n Omit<T, K>;\n\n/**\n * Helper type to exclude null and undefined\n *\n * @category Reference\n */\nexport type NonNullable<T> = T extends null | undefined ? never : T;\n\n/**\n * Helper type to create a type with only specific keys\n *\n * @category Reference\n */\nexport type PickByType<T, U> = {\n [K in keyof T as T[K] extends U ? K : never]: T[K];\n};\n\n/**\n * Helper type to omit keys by type\n *\n * @category Reference\n */\nexport type OmitByType<T, U> = {\n [K in keyof T as T[K] extends U ? never : K]: T[K];\n};\n\n/**\n * Helper type for branded types\n *\n * @category Reference\n */\nexport type Brand<T, B> = T & { readonly __brand: B };\n\n/**\n * Helper type for nominal types\n *\n * @category Reference\n */\nexport type Nominal<T, N extends string> = T & { readonly __nominal: N };\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|
package/dist/types/generics.d.ts
CHANGED
package/dist/types/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/types/index.ts"],"sourcesContent":["/**\n * Centralized type exports for the Vana SDK.\n *\n * @remarks\n * This module re-exports all public types from their respective modules,\n * providing a single import point for SDK consumers. Types are organized\n * by category for easy discovery and usage.\n *\n * **Import Strategy:**\n * - Import types from this module for application code\n * - Import from specific modules only for advanced use cases\n * - Avoid importing from internal paths\n *\n * @example\n * ```typescript\n * // Recommended: Import from types module\n * import type { VanaConfig, UserFile, GrantPermissionParams } from '@opendatalabs/vana-sdk';\n *\n * // Alternative: Import from specific category\n * import type { StorageProvider } from '@opendatalabs/vana-sdk';\n * ```\n *\n * @category Types\n * @module types\n */\n\n// Configuration types\nexport type {\n BaseConfig,\n BaseConfigWithStorage,\n WalletConfig,\n WalletConfigWithStorage,\n ChainConfig,\n ChainConfigWithStorage,\n VanaConfig,\n VanaConfigWithStorage,\n VanaConfigWithWallet,\n VanaConfigReadOnly,\n VanaConfigAddressOnly,\n VanaConfigWithWalletWithStorage,\n VanaConfigReadOnlyWithStorage,\n VanaConfigAddressOnlyWithStorage,\n RuntimeConfig,\n StorageConfig,\n ConfigValidationOptions,\n ConfigValidationResult,\n DownloadRelayerCallbacks,\n StorageRequiredMarker,\n
|
|
1
|
+
{"version":3,"sources":["../../src/types/index.ts"],"sourcesContent":["/**\n * Centralized type exports for the Vana SDK.\n *\n * @remarks\n * This module re-exports all public types from their respective modules,\n * providing a single import point for SDK consumers. Types are organized\n * by category for easy discovery and usage.\n *\n * **Import Strategy:**\n * - Import types from this module for application code\n * - Import from specific modules only for advanced use cases\n * - Avoid importing from internal paths\n *\n * @example\n * ```typescript\n * // Recommended: Import from types module\n * import type { VanaConfig, UserFile, GrantPermissionParams } from '@opendatalabs/vana-sdk';\n *\n * // Alternative: Import from specific category\n * import type { StorageProvider } from '@opendatalabs/vana-sdk';\n * ```\n *\n * @category Types\n * @module types\n */\n\n// Configuration types\nexport type {\n BaseConfig,\n BaseConfigWithStorage,\n WalletConfig,\n WalletConfigWithStorage,\n ChainConfig,\n ChainConfigWithStorage,\n VanaConfig,\n VanaConfigWithStorage,\n VanaConfigWithWallet,\n VanaConfigReadOnly,\n VanaConfigAddressOnly,\n VanaConfigWithWalletWithStorage,\n VanaConfigReadOnlyWithStorage,\n VanaConfigAddressOnlyWithStorage,\n RuntimeConfig,\n StorageConfig,\n ConfigValidationOptions,\n ConfigValidationResult,\n DownloadRelayerCallbacks,\n StorageRequiredMarker,\n} from \"./config\";\n\nexport {\n isWalletConfig,\n isChainConfig,\n isReadOnlyConfig,\n isAddressOnlyConfig,\n hasStorageConfig,\n} from \"./config\";\n\n// Chain types\nexport type { VanaChainId, VanaChain } from \"./chains\";\n\nexport { isVanaChainId, isVanaChain } from \"./chains\";\n\n// Contract types\nexport type {\n VanaContractName,\n ContractInfo,\n ContractDeployment,\n VanaContractInstance,\n ContractAddresses,\n ContractMethodParams,\n ContractMethodReturnType,\n} from \"./contracts\";\n\n// Note: VanaContract and ContractAbis are exported directly from src/index.ts\n// to avoid circular dependencies. Do not re-export them here.\n\n// Storage types\nexport type {\n StorageProvider,\n StorageUploadResult,\n StorageFile,\n StorageListOptions,\n StorageProviderConfig,\n} from \"./storage\";\n\nexport { StorageError } from \"./storage\";\n\n// Data types\nexport type {\n UserFile,\n FileMetadata,\n UploadParams,\n FilePermissionParams,\n LegacyPermissionParams,\n EncryptedUploadParams,\n UnencryptedUploadParams,\n UploadResult,\n UploadFileParams,\n UploadFileResult,\n UploadEncryptedFileResult,\n EncryptionInfo,\n GetUserFilesParams,\n GetFileParams,\n EncryptFileOptions,\n EncryptFileResult,\n DecryptFileOptions,\n UploadFileWithPermissionsParams,\n AddFilePermissionParams,\n DecryptFileWithPermissionOptions,\n DownloadFileParams,\n DownloadFileResult,\n DeleteFileParams,\n DeleteFileResult,\n FileAccessPermissions,\n FileSharingConfig,\n BatchUploadParams,\n BatchUploadResult,\n SchemaMetadata,\n CompleteSchema,\n Schema,\n Refiner,\n AddSchemaParams,\n AddSchemaResult,\n AddRefinerParams,\n AddRefinerResult,\n UpdateSchemaIdParams,\n UpdateSchemaIdResult,\n TrustedServer,\n GetUserTrustedServersParams,\n} from \"./data\";\n\n// Schema types\nexport type {\n CreateSchemaParams,\n CreateSchemaResult,\n} from \"../controllers/schemas\";\n\n// Schema validation types\nexport type { DataSchema } from \"../utils/schemaValidation\";\nexport {\n SchemaValidationError,\n SchemaValidator,\n validateDataSchemaAgainstMetaSchema,\n validateDataAgainstSchema,\n fetchAndValidateSchema,\n} from \"../utils/schemaValidation\";\n\n// Permission types\nexport type {\n OnChainPermissionGrant,\n GetUserPermissionsOptions,\n GrantPermissionParams,\n RevokePermissionParams,\n CheckPermissionParams,\n PermissionCheckResult,\n PermissionGrantDomain,\n PermissionGrantMessage,\n PermissionInputMessage,\n SimplifiedPermissionMessage,\n GrantFile,\n PermissionGrantTypedData,\n RevokePermissionTypedData,\n GenericTypedData,\n TypedDataPrimaryType,\n SpecificTypedData,\n PermissionOperation,\n PermissionStatus,\n QueryPermissionsParams,\n PermissionQueryResult,\n PermissionAnalytics,\n PermissionEvent,\n GrantedPermission,\n Server,\n AddAndTrustServerParams,\n TrustServerParams,\n UntrustServerParams,\n AddAndTrustServerInput,\n TrustServerInput,\n UntrustServerInput,\n AddAndTrustServerTypedData,\n TrustServerTypedData,\n UntrustServerTypedData,\n PermissionInfo,\n RevokePermissionInput,\n TrustedServerInfo,\n PaginatedTrustedServers,\n TrustedServerQueryOptions,\n BatchServerInfoResult,\n ServerTrustStatus,\n ServerInfo,\n Grantee,\n GranteeInfo,\n RegisterGranteeParams,\n RegisterGranteeInput,\n RegisterGranteeTypedData,\n GranteeQueryOptions,\n PaginatedGrantees,\n ServerFilesAndPermissionParams,\n ServerFilesAndPermissionTypedData,\n Permission,\n} from \"./permissions\";\n\n// Personal server types\nexport type {\n PostRequestParams,\n CreateOperationParams,\n InitPersonalServerParams,\n PersonalServerIdentity,\n} from \"./personal\";\n\n// Server API types (auto-generated via fetch-server-types.ts)\nexport type * from \"../generated/server/server-exports\";\n\n// External API types\nexport type {\n ReplicateAPIResponse,\n ReplicateStatus,\n PinataUploadResponse,\n PinataPin,\n PinataListResponse,\n APIResponse,\n} from \"./external-apis\";\n\nexport {\n isReplicateAPIResponse,\n isAPIResponse,\n safeParseJSON,\n parseReplicateOutput,\n} from \"./external-apis\";\n\n// Relayer types\nexport type {\n RelayerStorageResponse,\n RelayerTransactionResponse,\n RelayerStoreParams,\n RelayerSubmitParams,\n RelayerStatus,\n RelayerConfig,\n UnifiedRelayerRequest,\n UnifiedRelayerResponse,\n SignedRelayerRequest,\n DirectRelayerRequest,\n RelayerRequestOptions,\n RelayerErrorResponse,\n RelayerQueueInfo,\n RelayerTransactionStatus,\n RelayerMetrics,\n RelayerWebhookConfig,\n RelayerWebhookPayload,\n} from \"./relayer\";\n\n// Utility types\nexport type {\n PartialExcept,\n RequiredExcept,\n Awaited,\n MaybePromise,\n MaybeArray,\n PaginationParams,\n PaginationResult,\n BlockRange,\n TransactionOptions,\n TransactionReceipt,\n ApiResponse,\n CacheConfig,\n ValidationResult,\n StatusInfo,\n RateLimitInfo,\n UploadProgress,\n NetworkInfo,\n GasEstimate,\n TimeRange,\n} from \"./utils\";\n\n// Generic types for extensibility\nexport type {\n GenericRequest,\n GenericResponse,\n AsyncResult,\n ContractCall,\n EventFilter,\n EventLog,\n ControllerContext,\n Controller,\n Cache,\n RetryConfig,\n RateLimiterConfig,\n Middleware,\n Plugin,\n Factory,\n Repository,\n Validator,\n Transformer,\n Service,\n Observer,\n Observable,\n StateMachine,\n ConditionalOptional,\n PromiseResult,\n AllKeys,\n DeepPartial,\n DeepReadonly,\n RequireKeys,\n OptionalKeys,\n NonNullable,\n PickByType,\n OmitByType,\n Brand,\n Nominal,\n} from \"./generics\";\n\n// Re-export viem types that are commonly used\nexport type {\n Address,\n Hash,\n Abi,\n Chain,\n WalletClient,\n PublicClient,\n Account,\n GetContractReturnType,\n} from \"viem\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkDA,oBAMO;AAKP,oBAA2C;AAyB3C,qBAA6B;AAsD7B,8BAMO;AA8EP,2BAKO;","names":[]}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* @category Types
|
|
24
24
|
* @module types
|
|
25
25
|
*/
|
|
26
|
-
export type { BaseConfig, BaseConfigWithStorage, WalletConfig, WalletConfigWithStorage, ChainConfig, ChainConfigWithStorage, VanaConfig, VanaConfigWithStorage, VanaConfigWithWallet, VanaConfigReadOnly, VanaConfigAddressOnly, VanaConfigWithWalletWithStorage, VanaConfigReadOnlyWithStorage, VanaConfigAddressOnlyWithStorage, RuntimeConfig, StorageConfig, ConfigValidationOptions, ConfigValidationResult, DownloadRelayerCallbacks, StorageRequiredMarker,
|
|
26
|
+
export type { BaseConfig, BaseConfigWithStorage, WalletConfig, WalletConfigWithStorage, ChainConfig, ChainConfigWithStorage, VanaConfig, VanaConfigWithStorage, VanaConfigWithWallet, VanaConfigReadOnly, VanaConfigAddressOnly, VanaConfigWithWalletWithStorage, VanaConfigReadOnlyWithStorage, VanaConfigAddressOnlyWithStorage, RuntimeConfig, StorageConfig, ConfigValidationOptions, ConfigValidationResult, DownloadRelayerCallbacks, StorageRequiredMarker, } from "./config";
|
|
27
27
|
export { isWalletConfig, isChainConfig, isReadOnlyConfig, isAddressOnlyConfig, hasStorageConfig, } from "./config";
|
|
28
28
|
export type { VanaChainId, VanaChain } from "./chains";
|
|
29
29
|
export { isVanaChainId, isVanaChain } from "./chains";
|
|
@@ -40,7 +40,6 @@ export type * from "../generated/server/server-exports";
|
|
|
40
40
|
export type { ReplicateAPIResponse, ReplicateStatus, PinataUploadResponse, PinataPin, PinataListResponse, APIResponse, } from "./external-apis";
|
|
41
41
|
export { isReplicateAPIResponse, isAPIResponse, safeParseJSON, parseReplicateOutput, } from "./external-apis";
|
|
42
42
|
export type { RelayerStorageResponse, RelayerTransactionResponse, RelayerStoreParams, RelayerSubmitParams, RelayerStatus, RelayerConfig, UnifiedRelayerRequest, UnifiedRelayerResponse, SignedRelayerRequest, DirectRelayerRequest, RelayerRequestOptions, RelayerErrorResponse, RelayerQueueInfo, RelayerTransactionStatus, RelayerMetrics, RelayerWebhookConfig, RelayerWebhookPayload, } from "./relayer";
|
|
43
|
-
export type { PartialExcept, RequiredExcept, Awaited, MaybePromise, MaybeArray, PaginationParams, PaginationResult, BlockRange, ApiResponse, CacheConfig, ValidationResult, StatusInfo, RateLimitInfo, UploadProgress, NetworkInfo, GasEstimate, TimeRange, } from "./utils";
|
|
44
|
-
export type { TransactionOptions, TransactionReceipt, TransactionResult, IOperationStore, OperationState, } from "./operations";
|
|
43
|
+
export type { PartialExcept, RequiredExcept, Awaited, MaybePromise, MaybeArray, PaginationParams, PaginationResult, BlockRange, TransactionOptions, TransactionReceipt, ApiResponse, CacheConfig, ValidationResult, StatusInfo, RateLimitInfo, UploadProgress, NetworkInfo, GasEstimate, TimeRange, } from "./utils";
|
|
45
44
|
export type { GenericRequest, GenericResponse, AsyncResult, ContractCall, EventFilter, EventLog, ControllerContext, Controller, Cache, RetryConfig, RateLimiterConfig, Middleware, Plugin, Factory, Repository, Validator, Transformer, Service, Observer, Observable, StateMachine, ConditionalOptional, PromiseResult, AllKeys, DeepPartial, DeepReadonly, RequireKeys, OptionalKeys, NonNullable, PickByType, OmitByType, Brand, Nominal, } from "./generics";
|
|
46
45
|
export type { Address, Hash, Abi, Chain, WalletClient, PublicClient, Account, GetContractReturnType, } from "viem";
|
package/dist/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/types/index.ts"],"sourcesContent":["/**\n * Centralized type exports for the Vana SDK.\n *\n * @remarks\n * This module re-exports all public types from their respective modules,\n * providing a single import point for SDK consumers. Types are organized\n * by category for easy discovery and usage.\n *\n * **Import Strategy:**\n * - Import types from this module for application code\n * - Import from specific modules only for advanced use cases\n * - Avoid importing from internal paths\n *\n * @example\n * ```typescript\n * // Recommended: Import from types module\n * import type { VanaConfig, UserFile, GrantPermissionParams } from '@opendatalabs/vana-sdk';\n *\n * // Alternative: Import from specific category\n * import type { StorageProvider } from '@opendatalabs/vana-sdk';\n * ```\n *\n * @category Types\n * @module types\n */\n\n// Configuration types\nexport type {\n BaseConfig,\n BaseConfigWithStorage,\n WalletConfig,\n WalletConfigWithStorage,\n ChainConfig,\n ChainConfigWithStorage,\n VanaConfig,\n VanaConfigWithStorage,\n VanaConfigWithWallet,\n VanaConfigReadOnly,\n VanaConfigAddressOnly,\n VanaConfigWithWalletWithStorage,\n VanaConfigReadOnlyWithStorage,\n VanaConfigAddressOnlyWithStorage,\n RuntimeConfig,\n StorageConfig,\n ConfigValidationOptions,\n ConfigValidationResult,\n DownloadRelayerCallbacks,\n StorageRequiredMarker,\n
|
|
1
|
+
{"version":3,"sources":["../../src/types/index.ts"],"sourcesContent":["/**\n * Centralized type exports for the Vana SDK.\n *\n * @remarks\n * This module re-exports all public types from their respective modules,\n * providing a single import point for SDK consumers. Types are organized\n * by category for easy discovery and usage.\n *\n * **Import Strategy:**\n * - Import types from this module for application code\n * - Import from specific modules only for advanced use cases\n * - Avoid importing from internal paths\n *\n * @example\n * ```typescript\n * // Recommended: Import from types module\n * import type { VanaConfig, UserFile, GrantPermissionParams } from '@opendatalabs/vana-sdk';\n *\n * // Alternative: Import from specific category\n * import type { StorageProvider } from '@opendatalabs/vana-sdk';\n * ```\n *\n * @category Types\n * @module types\n */\n\n// Configuration types\nexport type {\n BaseConfig,\n BaseConfigWithStorage,\n WalletConfig,\n WalletConfigWithStorage,\n ChainConfig,\n ChainConfigWithStorage,\n VanaConfig,\n VanaConfigWithStorage,\n VanaConfigWithWallet,\n VanaConfigReadOnly,\n VanaConfigAddressOnly,\n VanaConfigWithWalletWithStorage,\n VanaConfigReadOnlyWithStorage,\n VanaConfigAddressOnlyWithStorage,\n RuntimeConfig,\n StorageConfig,\n ConfigValidationOptions,\n ConfigValidationResult,\n DownloadRelayerCallbacks,\n StorageRequiredMarker,\n} from \"./config\";\n\nexport {\n isWalletConfig,\n isChainConfig,\n isReadOnlyConfig,\n isAddressOnlyConfig,\n hasStorageConfig,\n} from \"./config\";\n\n// Chain types\nexport type { VanaChainId, VanaChain } from \"./chains\";\n\nexport { isVanaChainId, isVanaChain } from \"./chains\";\n\n// Contract types\nexport type {\n VanaContractName,\n ContractInfo,\n ContractDeployment,\n VanaContractInstance,\n ContractAddresses,\n ContractMethodParams,\n ContractMethodReturnType,\n} from \"./contracts\";\n\n// Note: VanaContract and ContractAbis are exported directly from src/index.ts\n// to avoid circular dependencies. Do not re-export them here.\n\n// Storage types\nexport type {\n StorageProvider,\n StorageUploadResult,\n StorageFile,\n StorageListOptions,\n StorageProviderConfig,\n} from \"./storage\";\n\nexport { StorageError } from \"./storage\";\n\n// Data types\nexport type {\n UserFile,\n FileMetadata,\n UploadParams,\n FilePermissionParams,\n LegacyPermissionParams,\n EncryptedUploadParams,\n UnencryptedUploadParams,\n UploadResult,\n UploadFileParams,\n UploadFileResult,\n UploadEncryptedFileResult,\n EncryptionInfo,\n GetUserFilesParams,\n GetFileParams,\n EncryptFileOptions,\n EncryptFileResult,\n DecryptFileOptions,\n UploadFileWithPermissionsParams,\n AddFilePermissionParams,\n DecryptFileWithPermissionOptions,\n DownloadFileParams,\n DownloadFileResult,\n DeleteFileParams,\n DeleteFileResult,\n FileAccessPermissions,\n FileSharingConfig,\n BatchUploadParams,\n BatchUploadResult,\n SchemaMetadata,\n CompleteSchema,\n Schema,\n Refiner,\n AddSchemaParams,\n AddSchemaResult,\n AddRefinerParams,\n AddRefinerResult,\n UpdateSchemaIdParams,\n UpdateSchemaIdResult,\n TrustedServer,\n GetUserTrustedServersParams,\n} from \"./data\";\n\n// Schema types\nexport type {\n CreateSchemaParams,\n CreateSchemaResult,\n} from \"../controllers/schemas\";\n\n// Schema validation types\nexport type { DataSchema } from \"../utils/schemaValidation\";\nexport {\n SchemaValidationError,\n SchemaValidator,\n validateDataSchemaAgainstMetaSchema,\n validateDataAgainstSchema,\n fetchAndValidateSchema,\n} from \"../utils/schemaValidation\";\n\n// Permission types\nexport type {\n OnChainPermissionGrant,\n GetUserPermissionsOptions,\n GrantPermissionParams,\n RevokePermissionParams,\n CheckPermissionParams,\n PermissionCheckResult,\n PermissionGrantDomain,\n PermissionGrantMessage,\n PermissionInputMessage,\n SimplifiedPermissionMessage,\n GrantFile,\n PermissionGrantTypedData,\n RevokePermissionTypedData,\n GenericTypedData,\n TypedDataPrimaryType,\n SpecificTypedData,\n PermissionOperation,\n PermissionStatus,\n QueryPermissionsParams,\n PermissionQueryResult,\n PermissionAnalytics,\n PermissionEvent,\n GrantedPermission,\n Server,\n AddAndTrustServerParams,\n TrustServerParams,\n UntrustServerParams,\n AddAndTrustServerInput,\n TrustServerInput,\n UntrustServerInput,\n AddAndTrustServerTypedData,\n TrustServerTypedData,\n UntrustServerTypedData,\n PermissionInfo,\n RevokePermissionInput,\n TrustedServerInfo,\n PaginatedTrustedServers,\n TrustedServerQueryOptions,\n BatchServerInfoResult,\n ServerTrustStatus,\n ServerInfo,\n Grantee,\n GranteeInfo,\n RegisterGranteeParams,\n RegisterGranteeInput,\n RegisterGranteeTypedData,\n GranteeQueryOptions,\n PaginatedGrantees,\n ServerFilesAndPermissionParams,\n ServerFilesAndPermissionTypedData,\n Permission,\n} from \"./permissions\";\n\n// Personal server types\nexport type {\n PostRequestParams,\n CreateOperationParams,\n InitPersonalServerParams,\n PersonalServerIdentity,\n} from \"./personal\";\n\n// Server API types (auto-generated via fetch-server-types.ts)\nexport type * from \"../generated/server/server-exports\";\n\n// External API types\nexport type {\n ReplicateAPIResponse,\n ReplicateStatus,\n PinataUploadResponse,\n PinataPin,\n PinataListResponse,\n APIResponse,\n} from \"./external-apis\";\n\nexport {\n isReplicateAPIResponse,\n isAPIResponse,\n safeParseJSON,\n parseReplicateOutput,\n} from \"./external-apis\";\n\n// Relayer types\nexport type {\n RelayerStorageResponse,\n RelayerTransactionResponse,\n RelayerStoreParams,\n RelayerSubmitParams,\n RelayerStatus,\n RelayerConfig,\n UnifiedRelayerRequest,\n UnifiedRelayerResponse,\n SignedRelayerRequest,\n DirectRelayerRequest,\n RelayerRequestOptions,\n RelayerErrorResponse,\n RelayerQueueInfo,\n RelayerTransactionStatus,\n RelayerMetrics,\n RelayerWebhookConfig,\n RelayerWebhookPayload,\n} from \"./relayer\";\n\n// Utility types\nexport type {\n PartialExcept,\n RequiredExcept,\n Awaited,\n MaybePromise,\n MaybeArray,\n PaginationParams,\n PaginationResult,\n BlockRange,\n TransactionOptions,\n TransactionReceipt,\n ApiResponse,\n CacheConfig,\n ValidationResult,\n StatusInfo,\n RateLimitInfo,\n UploadProgress,\n NetworkInfo,\n GasEstimate,\n TimeRange,\n} from \"./utils\";\n\n// Generic types for extensibility\nexport type {\n GenericRequest,\n GenericResponse,\n AsyncResult,\n ContractCall,\n EventFilter,\n EventLog,\n ControllerContext,\n Controller,\n Cache,\n RetryConfig,\n RateLimiterConfig,\n Middleware,\n Plugin,\n Factory,\n Repository,\n Validator,\n Transformer,\n Service,\n Observer,\n Observable,\n StateMachine,\n ConditionalOptional,\n PromiseResult,\n AllKeys,\n DeepPartial,\n DeepReadonly,\n RequireKeys,\n OptionalKeys,\n NonNullable,\n PickByType,\n OmitByType,\n Brand,\n Nominal,\n} from \"./generics\";\n\n// Re-export viem types that are commonly used\nexport type {\n Address,\n Hash,\n Abi,\n Chain,\n WalletClient,\n PublicClient,\n Account,\n GetContractReturnType,\n} from \"viem\";\n"],"mappings":"AAkDA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAKP,SAAS,eAAe,mBAAmB;AAyB3C,SAAS,oBAAoB;AAsD7B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AA8EP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/types/operations.ts"],"sourcesContent":["import type { Hash, TransactionReceipt as ViemReceipt, Address } from \"viem\";\nimport type { GetOperationResponse } from \"../generated/server/server-exports\";\nimport type { Contract, Fn } from \"../generated/event-types\";\nimport type { UnifiedRelayerRequest } from \"./relayer\";\n\n/**\n * Represents a server-side operation status and result.\n *\n * @remarks\n * Operations track asynchronous server processes like data refinement or ML inference.\n * Poll operation status using `vana.server.waitForOperation()` until completion.\n * Fully serializable for API responses and cross-process communication.\n *\n * @category Operations\n * @see {@link https://docs.vana.org/docs/operations | Operations Guide}\n */\nexport interface Operation<T = unknown> {\n /** Unique operation identifier */\n id: string;\n /** Current operation status */\n status: \"starting\" | \"running\" | \"succeeded\" | \"failed\" | \"canceled\";\n /** Unix timestamp when operation was created */\n createdAt: number;\n /** Unix timestamp when operation was last updated */\n updatedAt?: number;\n /** Operation result when status is 'succeeded' */\n result?: T;\n /** Error message when status is 'failed' */\n error?: string;\n /** Additional operation metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Represents a submitted blockchain transaction as a self-describing POJO.\n *\n * @remarks\n * Transaction results MUST include contract and function for proper event parsing.\n * This strongly-typed design enables automatic event extraction without heuristics.\n * Use `vana.waitForTransactionEvents()` to retrieve typed events from the receipt.\n *\n * **Architecture:**\n * POJOs (Plain Old JavaScript Objects) ensure serialization safety and framework\n * independence. Contract and function fields enable deterministic event parsing.\n *\n * @category Operations\n * @example\n * ```typescript\n * const result: TransactionResult = {\n * hash: '0x123...',\n * from: '0x456...',\n * contract: 'DataRegistry',\n * fn: 'addFile',\n * chainId: 14800\n * };\n *\n * // Wait for events\n * const events = await vana.waitForTransactionEvents(result);\n * ```\n */\nexport interface TransactionResult<\n C extends Contract = Contract,\n F extends Fn<C> = Fn<C>,\n> {\n /** Transaction hash for tracking and confirmation */\n hash: Hash;\n /** Sender's wallet address */\n from: Address;\n /** Contract that was called (required for event parsing) */\n contract: C;\n /** Function that was called (required for event parsing) */\n fn: F;\n /** Network chain ID where transaction was submitted */\n chainId?: number;\n /** Transaction value in wei (for payable functions) */\n value?: bigint;\n /** Transaction sequence number for the sender */\n nonce?: number;\n /** Contract address (if different from standard deployment) */\n to?: Address;\n}\n\n/**\n * Extends viem's TransactionReceipt with Vana-specific event data.\n *\n * @remarks\n * Includes parsed event data when available after transaction confirmation.\n * Use this for detailed transaction analysis and event processing.\n *\n * @category Operations\n */\nexport interface TransactionReceipt extends ViemReceipt {\n /** Parsed event data if available */\n events?: unknown;\n}\n\n/**\n * Configures polling behavior for asynchronous operations.\n *\n * @remarks\n * Controls how frequently and how long to poll for operation completion.\n * Lower intervals provide faster updates but increase server load.\n *\n * @category Operations\n */\nexport interface PollingOptions {\n /** Polling interval in milliseconds (default: 500) */\n pollingInterval?: number;\n /** Maximum time to wait in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/**\n * Configures transaction confirmation waiting behavior.\n *\n * @remarks\n * Controls confirmation depth and timeout for transaction finality.\n * Higher confirmations provide more security against chain reorganizations.\n *\n * @category Operations\n */\nexport interface TransactionWaitOptions {\n /** Number of confirmations to wait for (default: 1) */\n confirmations?: number;\n /** Polling interval in milliseconds (default: 1000) */\n pollingInterval?: number;\n /** Maximum time to wait in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/**\n * Validates whether an object conforms to the Operation interface.\n *\n * @remarks\n * Type guard for runtime validation of operation objects from external sources.\n * Use when deserializing operations from API responses or storage.\n *\n * @param obj - The object to validate as an Operation\n * @returns `true` if the object has required Operation properties, `false` otherwise\n *\n * @example\n * ```typescript\n * const response = await fetch('/api/operation/123');\n * const data = await response.json();\n *\n * if (isOperation(data)) {\n * console.log(`Operation ${data.id}: ${data.status}`);\n * }\n * ```\n *\n * @category Operations\n */\nexport function isOperation(obj: unknown): obj is Operation {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"id\" in obj &&\n \"status\" in obj &&\n typeof (obj as Record<string, unknown>).id === \"string\" &&\n typeof (obj as Record<string, unknown>).status === \"string\"\n );\n}\n\n/**\n * Validates whether an object conforms to the TransactionResult interface.\n *\n * @remarks\n * Type guard for runtime validation of transaction results.\n * Checks for required hash field with proper `0x` prefix.\n *\n * @param obj - The object to validate as a TransactionResult\n * @returns `true` if the object has a valid transaction hash, `false` otherwise\n *\n * @example\n * ```typescript\n * if (isTransactionResult(result)) {\n * await vana.waitForTransactionEvents(result);\n * }\n * ```\n *\n * @category Operations\n */\nexport function isTransactionResult(obj: unknown): obj is TransactionResult {\n if (typeof obj !== \"object\" || obj === null || !(\"hash\" in obj)) {\n return false;\n }\n const { hash } = obj as Record<string, unknown>;\n return typeof hash === \"string\" && hash.startsWith(\"0x\");\n}\n\n/**\n * Converts a server response to an Operation POJO.\n *\n * @remarks\n * Normalizes server responses into consistent Operation format.\n * Separates success results from error messages based on status.\n *\n * @param response - The raw server response containing operation status data\n * @returns An Operation object with normalized fields for client consumption\n *\n * @example\n * ```typescript\n * const serverResponse = await api.getOperation('op-123');\n * const operation = toOperation<MLResult>(serverResponse);\n *\n * if (operation.status === 'succeeded') {\n * console.log('Result:', operation.result);\n * }\n * ```\n *\n * @category Operations\n */\nexport function toOperation<T>(response: GetOperationResponse): Operation<T> {\n return {\n id: response.id,\n status: response.status as Operation[\"status\"],\n createdAt: Date.now(), // Server doesn't provide this, so we use current time\n result:\n response.status === \"succeeded\" ? (response.result as T) : undefined,\n error:\n response.status === \"failed\" ? (response.result ?? undefined) : undefined,\n };\n}\n\n/**\n * Extracts the operation ID from flexible input types.\n *\n * @remarks\n * Utility for handling both Operation objects and raw ID strings.\n * Enables flexible API design accepting either format.\n *\n * @param opOrId - An Operation object containing an `id` field or a raw operation ID string\n * @returns The operation ID string for use in API calls\n *\n * @example\n * ```typescript\n * // Works with both formats\n * await vana.server.getOperation(operation); // Operation object\n * await vana.server.getOperation('op-123'); // ID string\n * ```\n *\n * @category Operations\n */\nexport function getOperationId(opOrId: Operation | string): string {\n return typeof opOrId === \"string\" ? opOrId : opOrId.id;\n}\n\n/**\n * Extracts the transaction hash from flexible input types.\n *\n * @remarks\n * Utility for handling TransactionResult objects, hash objects, or raw hash strings.\n * Enables consistent hash extraction across different transaction representations.\n *\n * @param txOrHash - A TransactionResult object, any object with a `hash` field, or a raw hash string\n * @returns The transaction hash as a `0x`-prefixed string\n *\n * @example\n * ```typescript\n * // All these work\n * const hash1 = getTransactionHash(transactionResult);\n * const hash2 = getTransactionHash({ hash: '0x123...' });\n * const hash3 = getTransactionHash('0x123...');\n * ```\n *\n * @category Operations\n */\nexport function getTransactionHash(\n txOrHash: TransactionResult | { hash: Hash } | Hash,\n): Hash {\n if (typeof txOrHash === \"string\") {\n return txOrHash;\n }\n return txOrHash.hash;\n}\n\n/**\n * Options for customizing a blockchain transaction.\n * Matches viem's transaction parameters exactly.\n *\n * @category Operations\n */\nexport interface TransactionOptions {\n nonce?: number;\n gas?: bigint;\n maxFeePerGas?: bigint;\n maxPriorityFeePerGas?: bigint;\n gasPrice?: bigint;\n value?: bigint;\n}\n\n/**\n * The state of an asynchronous, relayed operation. This is the data\n * the application backend is responsible for persisting. It serves as a\n * complete recovery log for a given operation.\n *\n * @category Operations\n */\nexport interface OperationState {\n status: \"pending\" | \"confirmed\" | \"failed\";\n transactionHash: Hash;\n originalRequest: UnifiedRelayerRequest;\n nonce?: number;\n retryCount: number;\n lastAttemptedGas: { maxFeePerGas?: string; maxPriorityFeePerGas?: string };\n submittedAt: number; // Unix timestamp (ms)\n finalReceipt?: TransactionReceipt;\n error?: string;\n}\n\n/**\n * The storage interface that the application developer must implement\n * for their backend to support the Vana relayer system.\n *\n * @category Operations\n */\nexport interface IOperationStore {\n get(operationId: string): Promise<OperationState | null>;\n set(operationId: string, state: OperationState): Promise<void>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwJO,SAAS,YAAY,KAAgC;AAC1D,SACE,OAAO,QAAQ,YACf,QAAQ,QACR,QAAQ,OACR,YAAY,OACZ,OAAQ,IAAgC,OAAO,YAC/C,OAAQ,IAAgC,WAAW;AAEvD;AAqBO,SAAS,oBAAoB,KAAwC;AAC1E,MAAI,OAAO,QAAQ,YAAY,QAAQ,QAAQ,EAAE,UAAU,MAAM;AAC/D,WAAO;AAAA,EACT;AACA,QAAM,EAAE,KAAK,IAAI;AACjB,SAAO,OAAO,SAAS,YAAY,KAAK,WAAW,IAAI;AACzD;AAwBO,SAAS,YAAe,UAA8C;AAC3E,SAAO;AAAA,IACL,IAAI,SAAS;AAAA,IACb,QAAQ,SAAS;AAAA,IACjB,WAAW,KAAK,IAAI;AAAA;AAAA,IACpB,QACE,SAAS,WAAW,cAAe,SAAS,SAAe;AAAA,IAC7D,OACE,SAAS,WAAW,WAAY,SAAS,UAAU,SAAa;AAAA,EACpE;AACF;AAqBO,SAAS,eAAe,QAAoC;AACjE,SAAO,OAAO,WAAW,WAAW,SAAS,OAAO;AACtD;AAsBO,SAAS,mBACd,UACM;AACN,MAAI,OAAO,aAAa,UAAU;AAChC,WAAO;AAAA,EACT;AACA,SAAO,SAAS;AAClB;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/types/operations.ts"],"sourcesContent":["import type { Hash, TransactionReceipt as ViemReceipt, Address } from \"viem\";\nimport type { GetOperationResponse } from \"../generated/server/server-exports\";\nimport type { Contract, Fn } from \"../generated/event-types\";\n\n/**\n * Represents a server-side operation status and result.\n *\n * @remarks\n * Operations track asynchronous server processes like data refinement or ML inference.\n * Poll operation status using `vana.server.waitForOperation()` until completion.\n * Fully serializable for API responses and cross-process communication.\n *\n * @category Operations\n * @see {@link https://docs.vana.org/docs/operations | Operations Guide}\n */\nexport interface Operation<T = unknown> {\n /** Unique operation identifier */\n id: string;\n /** Current operation status */\n status: \"starting\" | \"running\" | \"succeeded\" | \"failed\" | \"canceled\";\n /** Unix timestamp when operation was created */\n createdAt: number;\n /** Unix timestamp when operation was last updated */\n updatedAt?: number;\n /** Operation result when status is 'succeeded' */\n result?: T;\n /** Error message when status is 'failed' */\n error?: string;\n /** Additional operation metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Represents a submitted blockchain transaction as a self-describing POJO.\n *\n * @remarks\n * Transaction results MUST include contract and function for proper event parsing.\n * This strongly-typed design enables automatic event extraction without heuristics.\n * Use `vana.waitForTransactionEvents()` to retrieve typed events from the receipt.\n *\n * **Architecture:**\n * POJOs (Plain Old JavaScript Objects) ensure serialization safety and framework\n * independence. Contract and function fields enable deterministic event parsing.\n *\n * @category Operations\n * @example\n * ```typescript\n * const result: TransactionResult = {\n * hash: '0x123...',\n * from: '0x456...',\n * contract: 'DataRegistry',\n * fn: 'addFile',\n * chainId: 14800\n * };\n *\n * // Wait for events\n * const events = await vana.waitForTransactionEvents(result);\n * ```\n */\nexport interface TransactionResult<\n C extends Contract = Contract,\n F extends Fn<C> = Fn<C>,\n> {\n /** Transaction hash for tracking and confirmation */\n hash: Hash;\n /** Sender's wallet address */\n from: Address;\n /** Contract that was called (required for event parsing) */\n contract: C;\n /** Function that was called (required for event parsing) */\n fn: F;\n /** Network chain ID where transaction was submitted */\n chainId?: number;\n /** Transaction value in wei (for payable functions) */\n value?: bigint;\n /** Transaction sequence number for the sender */\n nonce?: number;\n /** Contract address (if different from standard deployment) */\n to?: Address;\n}\n\n/**\n * Extends viem's TransactionReceipt with Vana-specific event data.\n *\n * @remarks\n * Includes parsed event data when available after transaction confirmation.\n * Use this for detailed transaction analysis and event processing.\n *\n * @category Operations\n */\nexport interface TransactionReceipt extends ViemReceipt {\n /** Parsed event data if available */\n events?: unknown;\n}\n\n/**\n * Configures polling behavior for asynchronous operations.\n *\n * @remarks\n * Controls how frequently and how long to poll for operation completion.\n * Lower intervals provide faster updates but increase server load.\n *\n * @category Operations\n */\nexport interface PollingOptions {\n /** Polling interval in milliseconds (default: 500) */\n pollingInterval?: number;\n /** Maximum time to wait in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/**\n * Configures transaction confirmation waiting behavior.\n *\n * @remarks\n * Controls confirmation depth and timeout for transaction finality.\n * Higher confirmations provide more security against chain reorganizations.\n *\n * @category Operations\n */\nexport interface TransactionWaitOptions {\n /** Number of confirmations to wait for (default: 1) */\n confirmations?: number;\n /** Polling interval in milliseconds (default: 1000) */\n pollingInterval?: number;\n /** Maximum time to wait in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/**\n * Validates whether an object conforms to the Operation interface.\n *\n * @remarks\n * Type guard for runtime validation of operation objects from external sources.\n * Use when deserializing operations from API responses or storage.\n *\n * @param obj - The object to validate as an Operation\n * @returns `true` if the object has required Operation properties, `false` otherwise\n *\n * @example\n * ```typescript\n * const response = await fetch('/api/operation/123');\n * const data = await response.json();\n *\n * if (isOperation(data)) {\n * console.log(`Operation ${data.id}: ${data.status}`);\n * }\n * ```\n *\n * @category Operations\n */\nexport function isOperation(obj: unknown): obj is Operation {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"id\" in obj &&\n \"status\" in obj &&\n typeof (obj as Record<string, unknown>).id === \"string\" &&\n typeof (obj as Record<string, unknown>).status === \"string\"\n );\n}\n\n/**\n * Validates whether an object conforms to the TransactionResult interface.\n *\n * @remarks\n * Type guard for runtime validation of transaction results.\n * Checks for required hash field with proper `0x` prefix.\n *\n * @param obj - The object to validate as a TransactionResult\n * @returns `true` if the object has a valid transaction hash, `false` otherwise\n *\n * @example\n * ```typescript\n * if (isTransactionResult(result)) {\n * await vana.waitForTransactionEvents(result);\n * }\n * ```\n *\n * @category Operations\n */\nexport function isTransactionResult(obj: unknown): obj is TransactionResult {\n if (typeof obj !== \"object\" || obj === null || !(\"hash\" in obj)) {\n return false;\n }\n const { hash } = obj as Record<string, unknown>;\n return typeof hash === \"string\" && hash.startsWith(\"0x\");\n}\n\n/**\n * Converts a server response to an Operation POJO.\n *\n * @remarks\n * Normalizes server responses into consistent Operation format.\n * Separates success results from error messages based on status.\n *\n * @param response - The raw server response containing operation status data\n * @returns An Operation object with normalized fields for client consumption\n *\n * @example\n * ```typescript\n * const serverResponse = await api.getOperation('op-123');\n * const operation = toOperation<MLResult>(serverResponse);\n *\n * if (operation.status === 'succeeded') {\n * console.log('Result:', operation.result);\n * }\n * ```\n *\n * @category Operations\n */\nexport function toOperation<T>(response: GetOperationResponse): Operation<T> {\n return {\n id: response.id,\n status: response.status as Operation[\"status\"],\n createdAt: Date.now(), // Server doesn't provide this, so we use current time\n result:\n response.status === \"succeeded\" ? (response.result as T) : undefined,\n error:\n response.status === \"failed\" ? (response.result ?? undefined) : undefined,\n };\n}\n\n/**\n * Extracts the operation ID from flexible input types.\n *\n * @remarks\n * Utility for handling both Operation objects and raw ID strings.\n * Enables flexible API design accepting either format.\n *\n * @param opOrId - An Operation object containing an `id` field or a raw operation ID string\n * @returns The operation ID string for use in API calls\n *\n * @example\n * ```typescript\n * // Works with both formats\n * await vana.server.getOperation(operation); // Operation object\n * await vana.server.getOperation('op-123'); // ID string\n * ```\n *\n * @category Operations\n */\nexport function getOperationId(opOrId: Operation | string): string {\n return typeof opOrId === \"string\" ? opOrId : opOrId.id;\n}\n\n/**\n * Extracts the transaction hash from flexible input types.\n *\n * @remarks\n * Utility for handling TransactionResult objects, hash objects, or raw hash strings.\n * Enables consistent hash extraction across different transaction representations.\n *\n * @param txOrHash - A TransactionResult object, any object with a `hash` field, or a raw hash string\n * @returns The transaction hash as a `0x`-prefixed string\n *\n * @example\n * ```typescript\n * // All these work\n * const hash1 = getTransactionHash(transactionResult);\n * const hash2 = getTransactionHash({ hash: '0x123...' });\n * const hash3 = getTransactionHash('0x123...');\n * ```\n *\n * @category Operations\n */\nexport function getTransactionHash(\n txOrHash: TransactionResult | { hash: Hash } | Hash,\n): Hash {\n if (typeof txOrHash === \"string\") {\n return txOrHash;\n }\n return txOrHash.hash;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuJO,SAAS,YAAY,KAAgC;AAC1D,SACE,OAAO,QAAQ,YACf,QAAQ,QACR,QAAQ,OACR,YAAY,OACZ,OAAQ,IAAgC,OAAO,YAC/C,OAAQ,IAAgC,WAAW;AAEvD;AAqBO,SAAS,oBAAoB,KAAwC;AAC1E,MAAI,OAAO,QAAQ,YAAY,QAAQ,QAAQ,EAAE,UAAU,MAAM;AAC/D,WAAO;AAAA,EACT;AACA,QAAM,EAAE,KAAK,IAAI;AACjB,SAAO,OAAO,SAAS,YAAY,KAAK,WAAW,IAAI;AACzD;AAwBO,SAAS,YAAe,UAA8C;AAC3E,SAAO;AAAA,IACL,IAAI,SAAS;AAAA,IACb,QAAQ,SAAS;AAAA,IACjB,WAAW,KAAK,IAAI;AAAA;AAAA,IACpB,QACE,SAAS,WAAW,cAAe,SAAS,SAAe;AAAA,IAC7D,OACE,SAAS,WAAW,WAAY,SAAS,UAAU,SAAa;AAAA,EACpE;AACF;AAqBO,SAAS,eAAe,QAAoC;AACjE,SAAO,OAAO,WAAW,WAAW,SAAS,OAAO;AACtD;AAsBO,SAAS,mBACd,UACM;AACN,MAAI,OAAO,aAAa,UAAU;AAChC,WAAO;AAAA,EACT;AACA,SAAO,SAAS;AAClB;","names":[]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type { Hash, TransactionReceipt as ViemReceipt, Address } from "viem";
|
|
2
2
|
import type { GetOperationResponse } from "../generated/server/server-exports";
|
|
3
3
|
import type { Contract, Fn } from "../generated/event-types";
|
|
4
|
-
import type { UnifiedRelayerRequest } from "./relayer";
|
|
5
4
|
/**
|
|
6
5
|
* Represents a server-side operation status and result.
|
|
7
6
|
*
|
|
@@ -228,48 +227,3 @@ export declare function getOperationId(opOrId: Operation | string): string;
|
|
|
228
227
|
export declare function getTransactionHash(txOrHash: TransactionResult | {
|
|
229
228
|
hash: Hash;
|
|
230
229
|
} | Hash): Hash;
|
|
231
|
-
/**
|
|
232
|
-
* Options for customizing a blockchain transaction.
|
|
233
|
-
* Matches viem's transaction parameters exactly.
|
|
234
|
-
*
|
|
235
|
-
* @category Operations
|
|
236
|
-
*/
|
|
237
|
-
export interface TransactionOptions {
|
|
238
|
-
nonce?: number;
|
|
239
|
-
gas?: bigint;
|
|
240
|
-
maxFeePerGas?: bigint;
|
|
241
|
-
maxPriorityFeePerGas?: bigint;
|
|
242
|
-
gasPrice?: bigint;
|
|
243
|
-
value?: bigint;
|
|
244
|
-
}
|
|
245
|
-
/**
|
|
246
|
-
* The state of an asynchronous, relayed operation. This is the data
|
|
247
|
-
* the application backend is responsible for persisting. It serves as a
|
|
248
|
-
* complete recovery log for a given operation.
|
|
249
|
-
*
|
|
250
|
-
* @category Operations
|
|
251
|
-
*/
|
|
252
|
-
export interface OperationState {
|
|
253
|
-
status: "pending" | "confirmed" | "failed";
|
|
254
|
-
transactionHash: Hash;
|
|
255
|
-
originalRequest: UnifiedRelayerRequest;
|
|
256
|
-
nonce?: number;
|
|
257
|
-
retryCount: number;
|
|
258
|
-
lastAttemptedGas: {
|
|
259
|
-
maxFeePerGas?: string;
|
|
260
|
-
maxPriorityFeePerGas?: string;
|
|
261
|
-
};
|
|
262
|
-
submittedAt: number;
|
|
263
|
-
finalReceipt?: TransactionReceipt;
|
|
264
|
-
error?: string;
|
|
265
|
-
}
|
|
266
|
-
/**
|
|
267
|
-
* The storage interface that the application developer must implement
|
|
268
|
-
* for their backend to support the Vana relayer system.
|
|
269
|
-
*
|
|
270
|
-
* @category Operations
|
|
271
|
-
*/
|
|
272
|
-
export interface IOperationStore {
|
|
273
|
-
get(operationId: string): Promise<OperationState | null>;
|
|
274
|
-
set(operationId: string, state: OperationState): Promise<void>;
|
|
275
|
-
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/types/operations.ts"],"sourcesContent":["import type { Hash, TransactionReceipt as ViemReceipt, Address } from \"viem\";\nimport type { GetOperationResponse } from \"../generated/server/server-exports\";\nimport type { Contract, Fn } from \"../generated/event-types\";\nimport type { UnifiedRelayerRequest } from \"./relayer\";\n\n/**\n * Represents a server-side operation status and result.\n *\n * @remarks\n * Operations track asynchronous server processes like data refinement or ML inference.\n * Poll operation status using `vana.server.waitForOperation()` until completion.\n * Fully serializable for API responses and cross-process communication.\n *\n * @category Operations\n * @see {@link https://docs.vana.org/docs/operations | Operations Guide}\n */\nexport interface Operation<T = unknown> {\n /** Unique operation identifier */\n id: string;\n /** Current operation status */\n status: \"starting\" | \"running\" | \"succeeded\" | \"failed\" | \"canceled\";\n /** Unix timestamp when operation was created */\n createdAt: number;\n /** Unix timestamp when operation was last updated */\n updatedAt?: number;\n /** Operation result when status is 'succeeded' */\n result?: T;\n /** Error message when status is 'failed' */\n error?: string;\n /** Additional operation metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Represents a submitted blockchain transaction as a self-describing POJO.\n *\n * @remarks\n * Transaction results MUST include contract and function for proper event parsing.\n * This strongly-typed design enables automatic event extraction without heuristics.\n * Use `vana.waitForTransactionEvents()` to retrieve typed events from the receipt.\n *\n * **Architecture:**\n * POJOs (Plain Old JavaScript Objects) ensure serialization safety and framework\n * independence. Contract and function fields enable deterministic event parsing.\n *\n * @category Operations\n * @example\n * ```typescript\n * const result: TransactionResult = {\n * hash: '0x123...',\n * from: '0x456...',\n * contract: 'DataRegistry',\n * fn: 'addFile',\n * chainId: 14800\n * };\n *\n * // Wait for events\n * const events = await vana.waitForTransactionEvents(result);\n * ```\n */\nexport interface TransactionResult<\n C extends Contract = Contract,\n F extends Fn<C> = Fn<C>,\n> {\n /** Transaction hash for tracking and confirmation */\n hash: Hash;\n /** Sender's wallet address */\n from: Address;\n /** Contract that was called (required for event parsing) */\n contract: C;\n /** Function that was called (required for event parsing) */\n fn: F;\n /** Network chain ID where transaction was submitted */\n chainId?: number;\n /** Transaction value in wei (for payable functions) */\n value?: bigint;\n /** Transaction sequence number for the sender */\n nonce?: number;\n /** Contract address (if different from standard deployment) */\n to?: Address;\n}\n\n/**\n * Extends viem's TransactionReceipt with Vana-specific event data.\n *\n * @remarks\n * Includes parsed event data when available after transaction confirmation.\n * Use this for detailed transaction analysis and event processing.\n *\n * @category Operations\n */\nexport interface TransactionReceipt extends ViemReceipt {\n /** Parsed event data if available */\n events?: unknown;\n}\n\n/**\n * Configures polling behavior for asynchronous operations.\n *\n * @remarks\n * Controls how frequently and how long to poll for operation completion.\n * Lower intervals provide faster updates but increase server load.\n *\n * @category Operations\n */\nexport interface PollingOptions {\n /** Polling interval in milliseconds (default: 500) */\n pollingInterval?: number;\n /** Maximum time to wait in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/**\n * Configures transaction confirmation waiting behavior.\n *\n * @remarks\n * Controls confirmation depth and timeout for transaction finality.\n * Higher confirmations provide more security against chain reorganizations.\n *\n * @category Operations\n */\nexport interface TransactionWaitOptions {\n /** Number of confirmations to wait for (default: 1) */\n confirmations?: number;\n /** Polling interval in milliseconds (default: 1000) */\n pollingInterval?: number;\n /** Maximum time to wait in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/**\n * Validates whether an object conforms to the Operation interface.\n *\n * @remarks\n * Type guard for runtime validation of operation objects from external sources.\n * Use when deserializing operations from API responses or storage.\n *\n * @param obj - The object to validate as an Operation\n * @returns `true` if the object has required Operation properties, `false` otherwise\n *\n * @example\n * ```typescript\n * const response = await fetch('/api/operation/123');\n * const data = await response.json();\n *\n * if (isOperation(data)) {\n * console.log(`Operation ${data.id}: ${data.status}`);\n * }\n * ```\n *\n * @category Operations\n */\nexport function isOperation(obj: unknown): obj is Operation {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"id\" in obj &&\n \"status\" in obj &&\n typeof (obj as Record<string, unknown>).id === \"string\" &&\n typeof (obj as Record<string, unknown>).status === \"string\"\n );\n}\n\n/**\n * Validates whether an object conforms to the TransactionResult interface.\n *\n * @remarks\n * Type guard for runtime validation of transaction results.\n * Checks for required hash field with proper `0x` prefix.\n *\n * @param obj - The object to validate as a TransactionResult\n * @returns `true` if the object has a valid transaction hash, `false` otherwise\n *\n * @example\n * ```typescript\n * if (isTransactionResult(result)) {\n * await vana.waitForTransactionEvents(result);\n * }\n * ```\n *\n * @category Operations\n */\nexport function isTransactionResult(obj: unknown): obj is TransactionResult {\n if (typeof obj !== \"object\" || obj === null || !(\"hash\" in obj)) {\n return false;\n }\n const { hash } = obj as Record<string, unknown>;\n return typeof hash === \"string\" && hash.startsWith(\"0x\");\n}\n\n/**\n * Converts a server response to an Operation POJO.\n *\n * @remarks\n * Normalizes server responses into consistent Operation format.\n * Separates success results from error messages based on status.\n *\n * @param response - The raw server response containing operation status data\n * @returns An Operation object with normalized fields for client consumption\n *\n * @example\n * ```typescript\n * const serverResponse = await api.getOperation('op-123');\n * const operation = toOperation<MLResult>(serverResponse);\n *\n * if (operation.status === 'succeeded') {\n * console.log('Result:', operation.result);\n * }\n * ```\n *\n * @category Operations\n */\nexport function toOperation<T>(response: GetOperationResponse): Operation<T> {\n return {\n id: response.id,\n status: response.status as Operation[\"status\"],\n createdAt: Date.now(), // Server doesn't provide this, so we use current time\n result:\n response.status === \"succeeded\" ? (response.result as T) : undefined,\n error:\n response.status === \"failed\" ? (response.result ?? undefined) : undefined,\n };\n}\n\n/**\n * Extracts the operation ID from flexible input types.\n *\n * @remarks\n * Utility for handling both Operation objects and raw ID strings.\n * Enables flexible API design accepting either format.\n *\n * @param opOrId - An Operation object containing an `id` field or a raw operation ID string\n * @returns The operation ID string for use in API calls\n *\n * @example\n * ```typescript\n * // Works with both formats\n * await vana.server.getOperation(operation); // Operation object\n * await vana.server.getOperation('op-123'); // ID string\n * ```\n *\n * @category Operations\n */\nexport function getOperationId(opOrId: Operation | string): string {\n return typeof opOrId === \"string\" ? opOrId : opOrId.id;\n}\n\n/**\n * Extracts the transaction hash from flexible input types.\n *\n * @remarks\n * Utility for handling TransactionResult objects, hash objects, or raw hash strings.\n * Enables consistent hash extraction across different transaction representations.\n *\n * @param txOrHash - A TransactionResult object, any object with a `hash` field, or a raw hash string\n * @returns The transaction hash as a `0x`-prefixed string\n *\n * @example\n * ```typescript\n * // All these work\n * const hash1 = getTransactionHash(transactionResult);\n * const hash2 = getTransactionHash({ hash: '0x123...' });\n * const hash3 = getTransactionHash('0x123...');\n * ```\n *\n * @category Operations\n */\nexport function getTransactionHash(\n txOrHash: TransactionResult | { hash: Hash } | Hash,\n): Hash {\n if (typeof txOrHash === \"string\") {\n return txOrHash;\n }\n return txOrHash.hash;\n}\n\n/**\n * Options for customizing a blockchain transaction.\n * Matches viem's transaction parameters exactly.\n *\n * @category Operations\n */\nexport interface TransactionOptions {\n nonce?: number;\n gas?: bigint;\n maxFeePerGas?: bigint;\n maxPriorityFeePerGas?: bigint;\n gasPrice?: bigint;\n value?: bigint;\n}\n\n/**\n * The state of an asynchronous, relayed operation. This is the data\n * the application backend is responsible for persisting. It serves as a\n * complete recovery log for a given operation.\n *\n * @category Operations\n */\nexport interface OperationState {\n status: \"pending\" | \"confirmed\" | \"failed\";\n transactionHash: Hash;\n originalRequest: UnifiedRelayerRequest;\n nonce?: number;\n retryCount: number;\n lastAttemptedGas: { maxFeePerGas?: string; maxPriorityFeePerGas?: string };\n submittedAt: number; // Unix timestamp (ms)\n finalReceipt?: TransactionReceipt;\n error?: string;\n}\n\n/**\n * The storage interface that the application developer must implement\n * for their backend to support the Vana relayer system.\n *\n * @category Operations\n */\nexport interface IOperationStore {\n get(operationId: string): Promise<OperationState | null>;\n set(operationId: string, state: OperationState): Promise<void>;\n}\n"],"mappings":"AAwJO,SAAS,YAAY,KAAgC;AAC1D,SACE,OAAO,QAAQ,YACf,QAAQ,QACR,QAAQ,OACR,YAAY,OACZ,OAAQ,IAAgC,OAAO,YAC/C,OAAQ,IAAgC,WAAW;AAEvD;AAqBO,SAAS,oBAAoB,KAAwC;AAC1E,MAAI,OAAO,QAAQ,YAAY,QAAQ,QAAQ,EAAE,UAAU,MAAM;AAC/D,WAAO;AAAA,EACT;AACA,QAAM,EAAE,KAAK,IAAI;AACjB,SAAO,OAAO,SAAS,YAAY,KAAK,WAAW,IAAI;AACzD;AAwBO,SAAS,YAAe,UAA8C;AAC3E,SAAO;AAAA,IACL,IAAI,SAAS;AAAA,IACb,QAAQ,SAAS;AAAA,IACjB,WAAW,KAAK,IAAI;AAAA;AAAA,IACpB,QACE,SAAS,WAAW,cAAe,SAAS,SAAe;AAAA,IAC7D,OACE,SAAS,WAAW,WAAY,SAAS,UAAU,SAAa;AAAA,EACpE;AACF;AAqBO,SAAS,eAAe,QAAoC;AACjE,SAAO,OAAO,WAAW,WAAW,SAAS,OAAO;AACtD;AAsBO,SAAS,mBACd,UACM;AACN,MAAI,OAAO,aAAa,UAAU;AAChC,WAAO;AAAA,EACT;AACA,SAAO,SAAS;AAClB;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/types/operations.ts"],"sourcesContent":["import type { Hash, TransactionReceipt as ViemReceipt, Address } from \"viem\";\nimport type { GetOperationResponse } from \"../generated/server/server-exports\";\nimport type { Contract, Fn } from \"../generated/event-types\";\n\n/**\n * Represents a server-side operation status and result.\n *\n * @remarks\n * Operations track asynchronous server processes like data refinement or ML inference.\n * Poll operation status using `vana.server.waitForOperation()` until completion.\n * Fully serializable for API responses and cross-process communication.\n *\n * @category Operations\n * @see {@link https://docs.vana.org/docs/operations | Operations Guide}\n */\nexport interface Operation<T = unknown> {\n /** Unique operation identifier */\n id: string;\n /** Current operation status */\n status: \"starting\" | \"running\" | \"succeeded\" | \"failed\" | \"canceled\";\n /** Unix timestamp when operation was created */\n createdAt: number;\n /** Unix timestamp when operation was last updated */\n updatedAt?: number;\n /** Operation result when status is 'succeeded' */\n result?: T;\n /** Error message when status is 'failed' */\n error?: string;\n /** Additional operation metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Represents a submitted blockchain transaction as a self-describing POJO.\n *\n * @remarks\n * Transaction results MUST include contract and function for proper event parsing.\n * This strongly-typed design enables automatic event extraction without heuristics.\n * Use `vana.waitForTransactionEvents()` to retrieve typed events from the receipt.\n *\n * **Architecture:**\n * POJOs (Plain Old JavaScript Objects) ensure serialization safety and framework\n * independence. Contract and function fields enable deterministic event parsing.\n *\n * @category Operations\n * @example\n * ```typescript\n * const result: TransactionResult = {\n * hash: '0x123...',\n * from: '0x456...',\n * contract: 'DataRegistry',\n * fn: 'addFile',\n * chainId: 14800\n * };\n *\n * // Wait for events\n * const events = await vana.waitForTransactionEvents(result);\n * ```\n */\nexport interface TransactionResult<\n C extends Contract = Contract,\n F extends Fn<C> = Fn<C>,\n> {\n /** Transaction hash for tracking and confirmation */\n hash: Hash;\n /** Sender's wallet address */\n from: Address;\n /** Contract that was called (required for event parsing) */\n contract: C;\n /** Function that was called (required for event parsing) */\n fn: F;\n /** Network chain ID where transaction was submitted */\n chainId?: number;\n /** Transaction value in wei (for payable functions) */\n value?: bigint;\n /** Transaction sequence number for the sender */\n nonce?: number;\n /** Contract address (if different from standard deployment) */\n to?: Address;\n}\n\n/**\n * Extends viem's TransactionReceipt with Vana-specific event data.\n *\n * @remarks\n * Includes parsed event data when available after transaction confirmation.\n * Use this for detailed transaction analysis and event processing.\n *\n * @category Operations\n */\nexport interface TransactionReceipt extends ViemReceipt {\n /** Parsed event data if available */\n events?: unknown;\n}\n\n/**\n * Configures polling behavior for asynchronous operations.\n *\n * @remarks\n * Controls how frequently and how long to poll for operation completion.\n * Lower intervals provide faster updates but increase server load.\n *\n * @category Operations\n */\nexport interface PollingOptions {\n /** Polling interval in milliseconds (default: 500) */\n pollingInterval?: number;\n /** Maximum time to wait in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/**\n * Configures transaction confirmation waiting behavior.\n *\n * @remarks\n * Controls confirmation depth and timeout for transaction finality.\n * Higher confirmations provide more security against chain reorganizations.\n *\n * @category Operations\n */\nexport interface TransactionWaitOptions {\n /** Number of confirmations to wait for (default: 1) */\n confirmations?: number;\n /** Polling interval in milliseconds (default: 1000) */\n pollingInterval?: number;\n /** Maximum time to wait in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/**\n * Validates whether an object conforms to the Operation interface.\n *\n * @remarks\n * Type guard for runtime validation of operation objects from external sources.\n * Use when deserializing operations from API responses or storage.\n *\n * @param obj - The object to validate as an Operation\n * @returns `true` if the object has required Operation properties, `false` otherwise\n *\n * @example\n * ```typescript\n * const response = await fetch('/api/operation/123');\n * const data = await response.json();\n *\n * if (isOperation(data)) {\n * console.log(`Operation ${data.id}: ${data.status}`);\n * }\n * ```\n *\n * @category Operations\n */\nexport function isOperation(obj: unknown): obj is Operation {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"id\" in obj &&\n \"status\" in obj &&\n typeof (obj as Record<string, unknown>).id === \"string\" &&\n typeof (obj as Record<string, unknown>).status === \"string\"\n );\n}\n\n/**\n * Validates whether an object conforms to the TransactionResult interface.\n *\n * @remarks\n * Type guard for runtime validation of transaction results.\n * Checks for required hash field with proper `0x` prefix.\n *\n * @param obj - The object to validate as a TransactionResult\n * @returns `true` if the object has a valid transaction hash, `false` otherwise\n *\n * @example\n * ```typescript\n * if (isTransactionResult(result)) {\n * await vana.waitForTransactionEvents(result);\n * }\n * ```\n *\n * @category Operations\n */\nexport function isTransactionResult(obj: unknown): obj is TransactionResult {\n if (typeof obj !== \"object\" || obj === null || !(\"hash\" in obj)) {\n return false;\n }\n const { hash } = obj as Record<string, unknown>;\n return typeof hash === \"string\" && hash.startsWith(\"0x\");\n}\n\n/**\n * Converts a server response to an Operation POJO.\n *\n * @remarks\n * Normalizes server responses into consistent Operation format.\n * Separates success results from error messages based on status.\n *\n * @param response - The raw server response containing operation status data\n * @returns An Operation object with normalized fields for client consumption\n *\n * @example\n * ```typescript\n * const serverResponse = await api.getOperation('op-123');\n * const operation = toOperation<MLResult>(serverResponse);\n *\n * if (operation.status === 'succeeded') {\n * console.log('Result:', operation.result);\n * }\n * ```\n *\n * @category Operations\n */\nexport function toOperation<T>(response: GetOperationResponse): Operation<T> {\n return {\n id: response.id,\n status: response.status as Operation[\"status\"],\n createdAt: Date.now(), // Server doesn't provide this, so we use current time\n result:\n response.status === \"succeeded\" ? (response.result as T) : undefined,\n error:\n response.status === \"failed\" ? (response.result ?? undefined) : undefined,\n };\n}\n\n/**\n * Extracts the operation ID from flexible input types.\n *\n * @remarks\n * Utility for handling both Operation objects and raw ID strings.\n * Enables flexible API design accepting either format.\n *\n * @param opOrId - An Operation object containing an `id` field or a raw operation ID string\n * @returns The operation ID string for use in API calls\n *\n * @example\n * ```typescript\n * // Works with both formats\n * await vana.server.getOperation(operation); // Operation object\n * await vana.server.getOperation('op-123'); // ID string\n * ```\n *\n * @category Operations\n */\nexport function getOperationId(opOrId: Operation | string): string {\n return typeof opOrId === \"string\" ? opOrId : opOrId.id;\n}\n\n/**\n * Extracts the transaction hash from flexible input types.\n *\n * @remarks\n * Utility for handling TransactionResult objects, hash objects, or raw hash strings.\n * Enables consistent hash extraction across different transaction representations.\n *\n * @param txOrHash - A TransactionResult object, any object with a `hash` field, or a raw hash string\n * @returns The transaction hash as a `0x`-prefixed string\n *\n * @example\n * ```typescript\n * // All these work\n * const hash1 = getTransactionHash(transactionResult);\n * const hash2 = getTransactionHash({ hash: '0x123...' });\n * const hash3 = getTransactionHash('0x123...');\n * ```\n *\n * @category Operations\n */\nexport function getTransactionHash(\n txOrHash: TransactionResult | { hash: Hash } | Hash,\n): Hash {\n if (typeof txOrHash === \"string\") {\n return txOrHash;\n }\n return txOrHash.hash;\n}\n"],"mappings":"AAuJO,SAAS,YAAY,KAAgC;AAC1D,SACE,OAAO,QAAQ,YACf,QAAQ,QACR,QAAQ,OACR,YAAY,OACZ,OAAQ,IAAgC,OAAO,YAC/C,OAAQ,IAAgC,WAAW;AAEvD;AAqBO,SAAS,oBAAoB,KAAwC;AAC1E,MAAI,OAAO,QAAQ,YAAY,QAAQ,QAAQ,EAAE,UAAU,MAAM;AAC/D,WAAO;AAAA,EACT;AACA,QAAM,EAAE,KAAK,IAAI;AACjB,SAAO,OAAO,SAAS,YAAY,KAAK,WAAW,IAAI;AACzD;AAwBO,SAAS,YAAe,UAA8C;AAC3E,SAAO;AAAA,IACL,IAAI,SAAS;AAAA,IACb,QAAQ,SAAS;AAAA,IACjB,WAAW,KAAK,IAAI;AAAA;AAAA,IACpB,QACE,SAAS,WAAW,cAAe,SAAS,SAAe;AAAA,IAC7D,OACE,SAAS,WAAW,WAAY,SAAS,UAAU,SAAa;AAAA,EACpE;AACF;AAqBO,SAAS,eAAe,QAAoC;AACjE,SAAO,OAAO,WAAW,WAAW,SAAS,OAAO;AACtD;AAsBO,SAAS,mBACd,UACM;AACN,MAAI,OAAO,aAAa,UAAU;AAChC,WAAO;AAAA,EACT;AACA,SAAO,SAAS;AAClB;","names":[]}
|