@moneymq/sdk 0.3.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/catalog.ts","../src/payment.ts","../src/client.ts","../src/config.ts"],"sourcesContent":["export { MoneyMQ } from './client';\nexport type { MoneyMQConfig } from './client';\n\n// Config utilities\nexport { fetchConfig, getRpcUrl } from './config';\nexport type { ServerConfig } from './config';\n\n// Catalog types\nexport type {\n Product,\n ProductCreateParams,\n ProductListParams,\n Price,\n PriceCreateParams,\n} from './catalog';\n\n// Payment types\nexport type {\n CheckoutSession,\n CheckoutCreateParams,\n PaymentLink,\n PaymentLinkCreateParams,\n Payment,\n PaymentListParams,\n Customer,\n CustomerCreateParams,\n CustomerUpdateParams,\n Payout,\n PayoutCreateParams,\n PayoutListParams,\n PayoutSettings,\n PayoutSettingsUpdateParams,\n} from './payment';\n","import type { MoneyMQConfig } from './client';\n\n// Types\nexport interface Product {\n id: string;\n object: 'product';\n name: string;\n description?: string;\n active: boolean;\n metadata?: Record<string, string>;\n created: number;\n updated: number;\n}\n\nexport interface ProductCreateParams {\n name: string;\n description?: string;\n active?: boolean;\n metadata?: Record<string, string>;\n}\n\nexport interface ProductListParams {\n active?: boolean;\n limit?: number;\n startingAfter?: string;\n}\n\nexport interface Price {\n id: string;\n object: 'price';\n product: string;\n currency: string;\n amount: number;\n type: 'one_time' | 'recurring';\n recurring?: {\n interval: 'day' | 'week' | 'month' | 'year';\n intervalCount: number;\n };\n active: boolean;\n metadata?: Record<string, string>;\n created: number;\n}\n\nexport interface PriceCreateParams {\n product: string;\n currency: string;\n amount: number;\n type: 'one_time' | 'recurring';\n recurring?: {\n interval: 'day' | 'week' | 'month' | 'year';\n intervalCount?: number;\n };\n metadata?: Record<string, string>;\n}\n\n// API Classes\nclass ProductsAPI {\n constructor(private config: MoneyMQConfig) {}\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.config.endpoint}${path}`;\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (this.config.secret) headers['Authorization'] = `Bearer ${this.config.secret}`;\n\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as { message?: string };\n throw new Error(errorData.message || `Request failed: ${response.status}`);\n }\n\n return response.json() as Promise<T>;\n }\n\n /**\n * Create a new product\n */\n async create(params: ProductCreateParams): Promise<Product> {\n return this.request('POST', '/catalog/v1/products', params);\n }\n\n /**\n * Retrieve a product by ID\n */\n async retrieve(id: string): Promise<Product> {\n return this.request('GET', `/catalog/v1/products/${id}`);\n }\n\n /**\n * List all products\n */\n async list(params?: ProductListParams): Promise<{ data: Product[]; hasMore: boolean }> {\n const query = new URLSearchParams();\n if (params?.active !== undefined) query.set('active', String(params.active));\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.startingAfter) query.set('starting_after', params.startingAfter);\n\n const queryString = query.toString();\n return this.request('GET', `/catalog/v1/products${queryString ? `?${queryString}` : ''}`);\n }\n\n /**\n * Update a product\n */\n async update(id: string, params: Partial<ProductCreateParams>): Promise<Product> {\n return this.request('PUT', `/catalog/v1/products/${id}`, params);\n }\n\n /**\n * Delete a product\n */\n async delete(id: string): Promise<{ deleted: boolean }> {\n return this.request('DELETE', `/catalog/v1/products/${id}`);\n }\n}\n\nclass PricesAPI {\n constructor(private config: MoneyMQConfig) {}\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.config.endpoint}${path}`;\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (this.config.secret) headers['Authorization'] = `Bearer ${this.config.secret}`;\n\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as { message?: string };\n throw new Error(errorData.message || `Request failed: ${response.status}`);\n }\n\n return response.json() as Promise<T>;\n }\n\n /**\n * Create a new price\n */\n async create(params: PriceCreateParams): Promise<Price> {\n return this.request('POST', '/catalog/v1/prices', params);\n }\n\n /**\n * Retrieve a price by ID\n */\n async retrieve(id: string): Promise<Price> {\n return this.request('GET', `/catalog/v1/prices/${id}`);\n }\n\n /**\n * List all prices\n */\n async list(params?: {\n product?: string;\n active?: boolean;\n limit?: number;\n }): Promise<{ data: Price[]; hasMore: boolean }> {\n const query = new URLSearchParams();\n if (params?.product) query.set('product', params.product);\n if (params?.active !== undefined) query.set('active', String(params.active));\n if (params?.limit) query.set('limit', String(params.limit));\n\n const queryString = query.toString();\n return this.request('GET', `/catalog/v1/prices${queryString ? `?${queryString}` : ''}`);\n }\n}\n\n/**\n * Catalog API for managing products and prices\n */\nexport class CatalogAPI {\n /** Products API */\n public readonly products: ProductsAPI;\n\n /** Prices API */\n public readonly prices: PricesAPI;\n\n constructor(config: MoneyMQConfig) {\n this.products = new ProductsAPI(config);\n this.prices = new PricesAPI(config);\n }\n}\n","import type { MoneyMQConfig } from './client';\n\n// Types\nexport interface LineItem {\n price: string;\n quantity: number;\n}\n\nexport interface CheckoutSession {\n id: string;\n object: 'checkout.session';\n url: string;\n status: 'open' | 'complete' | 'expired';\n paymentStatus: 'unpaid' | 'paid';\n customer?: string;\n lineItems: LineItem[];\n successUrl: string;\n cancelUrl: string;\n expiresAt: number;\n created: number;\n}\n\nexport interface CheckoutCreateParams {\n lineItems: LineItem[];\n successUrl: string;\n cancelUrl: string;\n customerEmail?: string;\n customer?: string;\n metadata?: Record<string, string>;\n}\n\nexport interface PaymentLink {\n id: string;\n object: 'payment_link';\n url: string;\n active: boolean;\n lineItems: LineItem[];\n expiresAt?: number;\n created: number;\n}\n\nexport interface PaymentLinkCreateParams {\n lineItems: LineItem[];\n expiresAt?: Date | number;\n metadata?: Record<string, string>;\n}\n\nexport interface Payment {\n id: string;\n object: 'payment';\n amount: number;\n currency: string;\n status: 'completed' | 'pending' | 'failed';\n customer?: string;\n checkout?: string;\n signature?: string;\n metadata?: Record<string, string>;\n created: number;\n}\n\nexport interface PaymentListParams {\n customerId?: string;\n status?: 'completed' | 'pending' | 'failed';\n limit?: number;\n startingAfter?: string;\n}\n\nexport interface Customer {\n id: string;\n object: 'customer';\n email: string;\n name?: string;\n metadata?: Record<string, string>;\n subscriptions?: unknown[];\n payments?: Payment[];\n created: number;\n}\n\nexport interface CustomerCreateParams {\n email: string;\n name?: string;\n metadata?: Record<string, string>;\n}\n\nexport interface CustomerUpdateParams {\n email?: string;\n name?: string;\n metadata?: Record<string, string>;\n}\n\nexport interface Payout {\n id: string;\n object: 'payout';\n amount: number;\n currency: string;\n status: 'pending' | 'completed' | 'failed';\n destination: string;\n created: number;\n}\n\nexport interface PayoutCreateParams {\n amount: number;\n currency: string;\n destination: string;\n}\n\nexport interface PayoutListParams {\n status?: 'pending' | 'completed' | 'failed';\n limit?: number;\n startingAfter?: string;\n}\n\nexport interface PayoutSettings {\n destination: {\n type: 'wallet';\n address: string;\n currency: string;\n };\n schedule: 'instant' | 'daily' | 'weekly' | 'monthly';\n minimumAmount?: number;\n}\n\nexport interface PayoutSettingsUpdateParams {\n destination?: PayoutSettings['destination'];\n schedule?: PayoutSettings['schedule'];\n minimumAmount?: number;\n}\n\n// Helper for making requests\nfunction createRequester(config: MoneyMQConfig) {\n return async function request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${config.endpoint}${path}`;\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (config.secret) headers['Authorization'] = `Bearer ${config.secret}`;\n\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as { message?: string };\n throw new Error(errorData.message || `Request failed: ${response.status}`);\n }\n\n return response.json() as Promise<T>;\n };\n}\n\n// API Classes\nclass CheckoutAPI {\n private request: ReturnType<typeof createRequester>;\n\n constructor(config: MoneyMQConfig) {\n this.request = createRequester(config);\n }\n\n /**\n * Create a checkout session\n */\n async create(params: CheckoutCreateParams): Promise<CheckoutSession> {\n return this.request('POST', '/payment/v1/checkout', params);\n }\n\n /**\n * Retrieve a checkout session\n */\n async retrieve(id: string): Promise<CheckoutSession> {\n return this.request('GET', `/payment/v1/checkout/${id}`);\n }\n}\n\nclass LinksAPI {\n private request: ReturnType<typeof createRequester>;\n\n constructor(config: MoneyMQConfig) {\n this.request = createRequester(config);\n }\n\n /**\n * Create a payment link\n */\n async create(params: PaymentLinkCreateParams): Promise<PaymentLink> {\n return this.request('POST', '/payment/v1/links', {\n ...params,\n expiresAt: params.expiresAt instanceof Date ? params.expiresAt.getTime() : params.expiresAt,\n });\n }\n\n /**\n * Retrieve a payment link\n */\n async retrieve(id: string): Promise<PaymentLink> {\n return this.request('GET', `/payment/v1/links/${id}`);\n }\n\n /**\n * Deactivate a payment link\n */\n async deactivate(id: string): Promise<PaymentLink> {\n return this.request('PUT', `/payment/v1/links/${id}`, { active: false });\n }\n}\n\nclass CustomersAPI {\n private request: ReturnType<typeof createRequester>;\n\n constructor(config: MoneyMQConfig) {\n this.request = createRequester(config);\n }\n\n /**\n * Create a customer\n */\n async create(params: CustomerCreateParams): Promise<Customer> {\n return this.request('POST', '/payment/v1/customers', params);\n }\n\n /**\n * Retrieve a customer\n */\n async retrieve(id: string, options?: { expand?: string[] }): Promise<Customer> {\n const query = options?.expand ? `?expand=${options.expand.join(',')}` : '';\n return this.request('GET', `/payment/v1/customers/${id}${query}`);\n }\n\n /**\n * Update a customer\n */\n async update(id: string, params: CustomerUpdateParams): Promise<Customer> {\n return this.request('PUT', `/payment/v1/customers/${id}`, params);\n }\n\n /**\n * List customers\n */\n async list(params?: {\n email?: string;\n limit?: number;\n }): Promise<{ data: Customer[]; hasMore: boolean }> {\n const query = new URLSearchParams();\n if (params?.email) query.set('email', params.email);\n if (params?.limit) query.set('limit', String(params.limit));\n\n const queryString = query.toString();\n return this.request('GET', `/payment/v1/customers${queryString ? `?${queryString}` : ''}`);\n }\n}\n\nclass PayoutsAPI {\n private request: ReturnType<typeof createRequester>;\n\n /** Payout settings */\n public readonly settings: PayoutSettingsAPI;\n\n constructor(config: MoneyMQConfig) {\n this.request = createRequester(config);\n this.settings = new PayoutSettingsAPI(config);\n }\n\n /**\n * Create a manual payout\n */\n async create(params: PayoutCreateParams): Promise<Payout> {\n return this.request('POST', '/payment/v1/payouts', params);\n }\n\n /**\n * Retrieve a payout\n */\n async retrieve(id: string): Promise<Payout> {\n return this.request('GET', `/payment/v1/payouts/${id}`);\n }\n\n /**\n * List payouts\n */\n async list(params?: PayoutListParams): Promise<{ data: Payout[]; hasMore: boolean }> {\n const query = new URLSearchParams();\n if (params?.status) query.set('status', params.status);\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.startingAfter) query.set('starting_after', params.startingAfter);\n\n const queryString = query.toString();\n return this.request('GET', `/payment/v1/payouts${queryString ? `?${queryString}` : ''}`);\n }\n}\n\nclass PayoutSettingsAPI {\n private request: ReturnType<typeof createRequester>;\n\n constructor(config: MoneyMQConfig) {\n this.request = createRequester(config);\n }\n\n /**\n * Get payout settings\n */\n async retrieve(): Promise<PayoutSettings> {\n return this.request('GET', '/payment/v1/payouts/settings');\n }\n\n /**\n * Update payout settings\n */\n async update(params: PayoutSettingsUpdateParams): Promise<PayoutSettings> {\n return this.request('PUT', '/payment/v1/payouts/settings', params);\n }\n}\n\nclass WebhooksAPI {\n private request: ReturnType<typeof createRequester>;\n\n constructor(config: MoneyMQConfig) {\n this.request = createRequester(config);\n }\n\n /**\n * Trigger a test webhook event (for testing)\n */\n async trigger(event: string, data: Record<string, unknown>): Promise<{ success: boolean }> {\n return this.request('POST', '/payment/v1/webhooks/test', { event, data });\n }\n}\n\n/**\n * Payment API for checkout, links, customers, and payouts\n */\nexport class PaymentAPI {\n private request: ReturnType<typeof createRequester>;\n\n /** Checkout sessions API */\n public readonly checkout: CheckoutAPI;\n\n /** Payment links API */\n public readonly links: LinksAPI;\n\n /** Customers API */\n public readonly customers: CustomersAPI;\n\n /** Payouts API */\n public readonly payouts: PayoutsAPI;\n\n /** Webhooks API */\n public readonly webhooks: WebhooksAPI;\n\n constructor(config: MoneyMQConfig) {\n this.request = createRequester(config);\n this.checkout = new CheckoutAPI(config);\n this.links = new LinksAPI(config);\n this.customers = new CustomersAPI(config);\n this.payouts = new PayoutsAPI(config);\n this.webhooks = new WebhooksAPI(config);\n }\n\n /**\n * Retrieve a payment by ID\n */\n async retrieve(id: string): Promise<Payment> {\n return this.request('GET', `/payment/v1/${id}`);\n }\n\n /**\n * List payments\n */\n async list(params?: PaymentListParams): Promise<{ data: Payment[]; hasMore: boolean }> {\n const query = new URLSearchParams();\n if (params?.customerId) query.set('customer', params.customerId);\n if (params?.status) query.set('status', params.status);\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.startingAfter) query.set('starting_after', params.startingAfter);\n\n const queryString = query.toString();\n return this.request('GET', `/payment/v1${queryString ? `?${queryString}` : ''}`);\n }\n}\n","import { CatalogAPI } from './catalog';\nimport { PaymentAPI } from './payment';\n\n/**\n * Configuration options for the MoneyMQ client\n *\n * @example\n * ```typescript\n * const config: MoneyMQConfig = {\n * endpoint: 'https://api.moneymq.com',\n * secret: 'your-api-secret', // Optional\n * timeout: 30000,\n * };\n * ```\n */\nexport interface MoneyMQConfig {\n /**\n * MoneyMQ API endpoint\n * @example 'http://localhost:8488' or 'https://api.moneymq.com'\n */\n endpoint: string;\n /**\n * Optional secret key for authenticated requests\n * Used for server-side operations that require authentication\n */\n secret?: string;\n /**\n * Request timeout in milliseconds\n * @default 30000\n */\n timeout?: number;\n}\n\n/**\n * MoneyMQ SDK client for accepting stablecoin payments\n *\n * @example\n * ```typescript\n * import { MoneyMQ } from '@moneymq/sdk';\n *\n * const moneymq = new MoneyMQ({\n * endpoint: process.env.MONEYMQ_ENDPOINT ?? 'http://localhost:8488',\n * });\n *\n * // Create a product\n * const product = await moneymq.catalog.products.create({\n * name: 'Pro Plan',\n * description: 'Full access to all features',\n * });\n *\n * // Create a checkout session\n * const session = await moneymq.payment.checkout.create({\n * lineItems: [{ price: 'price_xxx', quantity: 1 }],\n * successUrl: 'https://example.com/success',\n * cancelUrl: 'https://example.com/cancel',\n * });\n * ```\n */\nexport class MoneyMQ {\n public readonly config: MoneyMQConfig;\n\n /** Catalog API for products and prices */\n public readonly catalog: CatalogAPI;\n\n /** Payment API for checkout, links, customers, and payouts */\n public readonly payment: PaymentAPI;\n\n constructor(config: MoneyMQConfig) {\n this.config = {\n timeout: 30000,\n ...config,\n };\n\n this.catalog = new CatalogAPI(this.config);\n this.payment = new PaymentAPI(this.config);\n }\n\n /**\n * Make an authenticated request to the MoneyMQ API\n */\n async request<T>(\n method: 'GET' | 'POST' | 'PUT' | 'DELETE',\n path: string,\n body?: unknown,\n ): Promise<T> {\n const url = `${this.config.endpoint}${path}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.config.secret) {\n headers['Authorization'] = `Bearer ${this.config.secret}`;\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(this.config.timeout!),\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as { message?: string };\n throw new MoneyMQError(\n errorData.message || `Request failed with status ${response.status}`,\n response.status,\n errorData,\n );\n }\n\n return response.json() as Promise<T>;\n }\n}\n\n/**\n * MoneyMQ API error\n */\nexport class MoneyMQError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly raw?: unknown,\n ) {\n super(message);\n this.name = 'MoneyMQError';\n }\n}\n","/**\n * MoneyMQ server configuration returned from /config endpoint\n */\nexport interface ServerConfig {\n account: {\n name: string;\n description: string;\n };\n x402: {\n payoutAccount: {\n currency: string;\n decimals: number;\n address: string;\n tokenAddress: string;\n };\n facilitator: {\n operatorAccount: {\n out: string;\n in: {\n currency: string;\n decimals: number;\n address: string;\n tokenAddress: string;\n };\n };\n url: string;\n };\n validator: {\n network: string;\n rpcUrl: string;\n bindHost: string;\n rpcPort: number;\n wsPort: number;\n };\n };\n}\n\n/**\n * Fetch server configuration from MoneyMQ API\n *\n * @param apiUrl - The MoneyMQ API URL\n * @returns Server configuration including RPC URL\n *\n * @example\n * ```typescript\n * const config = await fetchConfig('http://localhost:8488');\n * console.log(config.x402.validator.rpcUrl);\n * ```\n */\nexport async function fetchConfig(apiUrl: string): Promise<ServerConfig> {\n const response = await fetch(`${apiUrl}/config`);\n if (!response.ok) {\n throw new Error(`Failed to fetch config: ${response.status}`);\n }\n return response.json() as Promise<ServerConfig>;\n}\n\n/**\n * Get the Solana RPC URL from server config\n *\n * @param apiUrl - The MoneyMQ API URL\n * @param fallback - Fallback RPC URL if fetch fails\n * @returns RPC URL string\n */\nexport async function getRpcUrl(\n apiUrl: string,\n fallback = 'https://api.devnet.solana.com'\n): Promise<string> {\n try {\n const config = await fetchConfig(apiUrl);\n return config.x402.validator.rpcUrl || fallback;\n } catch {\n return fallback;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACwDA,IAAM,cAAN,MAAkB;AAAA,EAChB,YAAoB,QAAuB;AAAvB;AAAA,EAAwB;AAAA,EAE5C,MAAc,QAAW,QAAgB,MAAc,MAA4B;AACjF,UAAM,MAAM,GAAG,KAAK,OAAO,QAAQ,GAAG,IAAI;AAC1C,UAAM,UAAkC,EAAE,gBAAgB,mBAAmB;AAC7E,QAAI,KAAK,OAAO,OAAQ,SAAQ,eAAe,IAAI,UAAU,KAAK,OAAO,MAAM;AAE/E,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC;AAAA,MACA;AAAA,MACA,MAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,IACtC,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,YAAa,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACzD,YAAM,IAAI,MAAM,UAAU,WAAW,mBAAmB,SAAS,MAAM,EAAE;AAAA,IAC3E;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,QAA+C;AAC1D,WAAO,KAAK,QAAQ,QAAQ,wBAAwB,MAAM;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,IAA8B;AAC3C,WAAO,KAAK,QAAQ,OAAO,wBAAwB,EAAE,EAAE;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,QAA4E;AACrF,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,WAAW,OAAW,OAAM,IAAI,UAAU,OAAO,OAAO,MAAM,CAAC;AAC3E,QAAI,QAAQ,MAAO,OAAM,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AAC1D,QAAI,QAAQ,cAAe,OAAM,IAAI,kBAAkB,OAAO,aAAa;AAE3E,UAAM,cAAc,MAAM,SAAS;AACnC,WAAO,KAAK,QAAQ,OAAO,uBAAuB,cAAc,IAAI,WAAW,KAAK,EAAE,EAAE;AAAA,EAC1F;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,IAAY,QAAwD;AAC/E,WAAO,KAAK,QAAQ,OAAO,wBAAwB,EAAE,IAAI,MAAM;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,IAA2C;AACtD,WAAO,KAAK,QAAQ,UAAU,wBAAwB,EAAE,EAAE;AAAA,EAC5D;AACF;AAEA,IAAM,YAAN,MAAgB;AAAA,EACd,YAAoB,QAAuB;AAAvB;AAAA,EAAwB;AAAA,EAE5C,MAAc,QAAW,QAAgB,MAAc,MAA4B;AACjF,UAAM,MAAM,GAAG,KAAK,OAAO,QAAQ,GAAG,IAAI;AAC1C,UAAM,UAAkC,EAAE,gBAAgB,mBAAmB;AAC7E,QAAI,KAAK,OAAO,OAAQ,SAAQ,eAAe,IAAI,UAAU,KAAK,OAAO,MAAM;AAE/E,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC;AAAA,MACA;AAAA,MACA,MAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,IACtC,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,YAAa,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACzD,YAAM,IAAI,MAAM,UAAU,WAAW,mBAAmB,SAAS,MAAM,EAAE;AAAA,IAC3E;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,QAA2C;AACtD,WAAO,KAAK,QAAQ,QAAQ,sBAAsB,MAAM;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,IAA4B;AACzC,WAAO,KAAK,QAAQ,OAAO,sBAAsB,EAAE,EAAE;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,QAIsC;AAC/C,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,QAAS,OAAM,IAAI,WAAW,OAAO,OAAO;AACxD,QAAI,QAAQ,WAAW,OAAW,OAAM,IAAI,UAAU,OAAO,OAAO,MAAM,CAAC;AAC3E,QAAI,QAAQ,MAAO,OAAM,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AAE1D,UAAM,cAAc,MAAM,SAAS;AACnC,WAAO,KAAK,QAAQ,OAAO,qBAAqB,cAAc,IAAI,WAAW,KAAK,EAAE,EAAE;AAAA,EACxF;AACF;AAKO,IAAM,aAAN,MAAiB;AAAA,EAOtB,YAAY,QAAuB;AACjC,SAAK,WAAW,IAAI,YAAY,MAAM;AACtC,SAAK,SAAS,IAAI,UAAU,MAAM;AAAA,EACpC;AACF;;;AC3DA,SAAS,gBAAgB,QAAuB;AAC9C,SAAO,eAAe,QAAW,QAAgB,MAAc,MAA4B;AACzF,UAAM,MAAM,GAAG,OAAO,QAAQ,GAAG,IAAI;AACrC,UAAM,UAAkC,EAAE,gBAAgB,mBAAmB;AAC7E,QAAI,OAAO,OAAQ,SAAQ,eAAe,IAAI,UAAU,OAAO,MAAM;AAErE,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC;AAAA,MACA;AAAA,MACA,MAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,IACtC,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,YAAa,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACzD,YAAM,IAAI,MAAM,UAAU,WAAW,mBAAmB,SAAS,MAAM,EAAE;AAAA,IAC3E;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AACF;AAGA,IAAM,cAAN,MAAkB;AAAA,EAGhB,YAAY,QAAuB;AACjC,SAAK,UAAU,gBAAgB,MAAM;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,QAAwD;AACnE,WAAO,KAAK,QAAQ,QAAQ,wBAAwB,MAAM;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,IAAsC;AACnD,WAAO,KAAK,QAAQ,OAAO,wBAAwB,EAAE,EAAE;AAAA,EACzD;AACF;AAEA,IAAM,WAAN,MAAe;AAAA,EAGb,YAAY,QAAuB;AACjC,SAAK,UAAU,gBAAgB,MAAM;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,QAAuD;AAClE,WAAO,KAAK,QAAQ,QAAQ,qBAAqB;AAAA,MAC/C,GAAG;AAAA,MACH,WAAW,OAAO,qBAAqB,OAAO,OAAO,UAAU,QAAQ,IAAI,OAAO;AAAA,IACpF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,IAAkC;AAC/C,WAAO,KAAK,QAAQ,OAAO,qBAAqB,EAAE,EAAE;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,IAAkC;AACjD,WAAO,KAAK,QAAQ,OAAO,qBAAqB,EAAE,IAAI,EAAE,QAAQ,MAAM,CAAC;AAAA,EACzE;AACF;AAEA,IAAM,eAAN,MAAmB;AAAA,EAGjB,YAAY,QAAuB;AACjC,SAAK,UAAU,gBAAgB,MAAM;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,QAAiD;AAC5D,WAAO,KAAK,QAAQ,QAAQ,yBAAyB,MAAM;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,IAAY,SAAoD;AAC7E,UAAM,QAAQ,SAAS,SAAS,WAAW,QAAQ,OAAO,KAAK,GAAG,CAAC,KAAK;AACxE,WAAO,KAAK,QAAQ,OAAO,yBAAyB,EAAE,GAAG,KAAK,EAAE;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,IAAY,QAAiD;AACxE,WAAO,KAAK,QAAQ,OAAO,yBAAyB,EAAE,IAAI,MAAM;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,QAGyC;AAClD,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,MAAO,OAAM,IAAI,SAAS,OAAO,KAAK;AAClD,QAAI,QAAQ,MAAO,OAAM,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AAE1D,UAAM,cAAc,MAAM,SAAS;AACnC,WAAO,KAAK,QAAQ,OAAO,wBAAwB,cAAc,IAAI,WAAW,KAAK,EAAE,EAAE;AAAA,EAC3F;AACF;AAEA,IAAM,aAAN,MAAiB;AAAA,EAMf,YAAY,QAAuB;AACjC,SAAK,UAAU,gBAAgB,MAAM;AACrC,SAAK,WAAW,IAAI,kBAAkB,MAAM;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,QAA6C;AACxD,WAAO,KAAK,QAAQ,QAAQ,uBAAuB,MAAM;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,IAA6B;AAC1C,WAAO,KAAK,QAAQ,OAAO,uBAAuB,EAAE,EAAE;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,QAA0E;AACnF,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,OAAQ,OAAM,IAAI,UAAU,OAAO,MAAM;AACrD,QAAI,QAAQ,MAAO,OAAM,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AAC1D,QAAI,QAAQ,cAAe,OAAM,IAAI,kBAAkB,OAAO,aAAa;AAE3E,UAAM,cAAc,MAAM,SAAS;AACnC,WAAO,KAAK,QAAQ,OAAO,sBAAsB,cAAc,IAAI,WAAW,KAAK,EAAE,EAAE;AAAA,EACzF;AACF;AAEA,IAAM,oBAAN,MAAwB;AAAA,EAGtB,YAAY,QAAuB;AACjC,SAAK,UAAU,gBAAgB,MAAM;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAoC;AACxC,WAAO,KAAK,QAAQ,OAAO,8BAA8B;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,QAA6D;AACxE,WAAO,KAAK,QAAQ,OAAO,gCAAgC,MAAM;AAAA,EACnE;AACF;AAEA,IAAM,cAAN,MAAkB;AAAA,EAGhB,YAAY,QAAuB;AACjC,SAAK,UAAU,gBAAgB,MAAM;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,OAAe,MAA8D;AACzF,WAAO,KAAK,QAAQ,QAAQ,6BAA6B,EAAE,OAAO,KAAK,CAAC;AAAA,EAC1E;AACF;AAKO,IAAM,aAAN,MAAiB;AAAA,EAkBtB,YAAY,QAAuB;AACjC,SAAK,UAAU,gBAAgB,MAAM;AACrC,SAAK,WAAW,IAAI,YAAY,MAAM;AACtC,SAAK,QAAQ,IAAI,SAAS,MAAM;AAChC,SAAK,YAAY,IAAI,aAAa,MAAM;AACxC,SAAK,UAAU,IAAI,WAAW,MAAM;AACpC,SAAK,WAAW,IAAI,YAAY,MAAM;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,IAA8B;AAC3C,WAAO,KAAK,QAAQ,OAAO,eAAe,EAAE,EAAE;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,QAA4E;AACrF,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,WAAY,OAAM,IAAI,YAAY,OAAO,UAAU;AAC/D,QAAI,QAAQ,OAAQ,OAAM,IAAI,UAAU,OAAO,MAAM;AACrD,QAAI,QAAQ,MAAO,OAAM,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AAC1D,QAAI,QAAQ,cAAe,OAAM,IAAI,kBAAkB,OAAO,aAAa;AAE3E,UAAM,cAAc,MAAM,SAAS;AACnC,WAAO,KAAK,QAAQ,OAAO,cAAc,cAAc,IAAI,WAAW,KAAK,EAAE,EAAE;AAAA,EACjF;AACF;;;AC9TO,IAAM,UAAN,MAAc;AAAA,EASnB,YAAY,QAAuB;AACjC,SAAK,SAAS;AAAA,MACZ,SAAS;AAAA,MACT,GAAG;AAAA,IACL;AAEA,SAAK,UAAU,IAAI,WAAW,KAAK,MAAM;AACzC,SAAK,UAAU,IAAI,WAAW,KAAK,MAAM;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QACJ,QACA,MACA,MACY;AACZ,UAAM,MAAM,GAAG,KAAK,OAAO,QAAQ,GAAG,IAAI;AAE1C,UAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,IAClB;AAEA,QAAI,KAAK,OAAO,QAAQ;AACtB,cAAQ,eAAe,IAAI,UAAU,KAAK,OAAO,MAAM;AAAA,IACzD;AAEA,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC;AAAA,MACA;AAAA,MACA,MAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,MACpC,QAAQ,YAAY,QAAQ,KAAK,OAAO,OAAQ;AAAA,IAClD,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,YAAa,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACzD,YAAM,IAAI;AAAA,QACR,UAAU,WAAW,8BAA8B,SAAS,MAAM;AAAA,QAClE,SAAS;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AACF;AAKO,IAAM,eAAN,cAA2B,MAAM;AAAA,EACtC,YACE,SACgB,YACA,KAChB;AACA,UAAM,OAAO;AAHG;AACA;AAGhB,SAAK,OAAO;AAAA,EACd;AACF;;;AC9EA,eAAsB,YAAY,QAAuC;AACvE,QAAM,WAAW,MAAM,MAAM,GAAG,MAAM,SAAS;AAC/C,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,2BAA2B,SAAS,MAAM,EAAE;AAAA,EAC9D;AACA,SAAO,SAAS,KAAK;AACvB;AASA,eAAsB,UACpB,QACA,WAAW,iCACM;AACjB,MAAI;AACF,UAAM,SAAS,MAAM,YAAY,MAAM;AACvC,WAAO,OAAO,KAAK,UAAU,UAAU;AAAA,EACzC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/catalog.ts","../src/payment.ts","../src/config.ts","../src/x402.ts","../src/events.ts","../src/client.ts"],"sourcesContent":["export { MoneyMQ } from './client';\nexport type { MoneyMQConfig } from './client';\n\n// Config utilities\nexport { fetchConfig, getRpcUrl } from './config';\nexport type { ServerConfig } from './config';\n\n// Catalog types\nexport type {\n Product,\n ProductCreateParams,\n ProductListParams,\n Price,\n PriceCreateParams,\n PaymentRequirements,\n ProductAccessResponse,\n ProductAccessParams,\n} from './catalog';\n\n// Catalog errors\nexport { PaymentRequiredError } from './catalog';\n\n// Payment types\nexport type {\n CheckoutSession,\n CheckoutCreateParams,\n PaymentLink,\n PaymentLinkCreateParams,\n Payment,\n PaymentListParams,\n Customer,\n CustomerCreateParams,\n CustomerUpdateParams,\n Payout,\n PayoutCreateParams,\n PayoutListParams,\n PayoutSettings,\n PayoutSettingsUpdateParams,\n // Simple payment types\n PayParams,\n PayResult,\n // Payment intent types\n PaymentIntent,\n PaymentIntentCreateParams,\n} from './payment';\n\n// X402 types\nexport type {\n GetSignerParams,\n Signer,\n X402ClientConfig,\n} from './x402';\n\n// Events (SSE)\nexport {\n EventStream,\n createEventStream,\n isPaymentVerificationSucceeded,\n isPaymentVerificationFailed,\n isPaymentSettlementSucceeded,\n isPaymentSettlementFailed,\n parseCloudEvent,\n buildEventStreamUrl,\n} from './events';\n\nexport type {\n CloudEventEnvelope,\n PaymentFlow,\n PaymentVerificationSucceededData,\n PaymentVerificationFailedData,\n PaymentSettlementSucceededData,\n PaymentSettlementFailedData,\n MoneyMQEventType,\n MoneyMQEventMap,\n PaymentVerificationEvent,\n PaymentSettlementEvent,\n PaymentEvent,\n EventStreamOptions,\n EventStreamState,\n EventHandler,\n ErrorHandler,\n StateHandler,\n} from './events';\n","import type { MoneyMQConfig } from './client';\n\n// Types\n\n/** Payment requirements returned when payment is required (402) */\nexport interface PaymentRequirements {\n scheme: string;\n network: string;\n max_amount_required: string;\n resource: string;\n description: string;\n mime_type: string;\n pay_to: string;\n max_timeout_seconds: number;\n asset: string;\n extra?: {\n feePayer?: string;\n product?: string;\n };\n}\n\n/** Error thrown when payment is required to access a resource */\nexport class PaymentRequiredError extends Error {\n constructor(\n message: string,\n public readonly paymentRequirements: PaymentRequirements[],\n public readonly raw: unknown,\n ) {\n super(message);\n this.name = 'PaymentRequiredError';\n }\n}\n\n/** Response from product access endpoint */\nexport interface ProductAccessResponse {\n object: 'product_access';\n product_id: string;\n access_granted: boolean;\n message: string;\n}\n\n/** Parameters for accessing a product with x402 payment */\nexport interface ProductAccessParams {\n /** Base64-encoded X-Payment header value */\n paymentHeader?: string;\n}\n\nexport interface Product {\n id: string;\n object: 'product';\n name: string;\n description?: string;\n active: boolean;\n metadata?: Record<string, string>;\n created: number;\n updated: number;\n /** URL path for accessing this product (x402 gated) */\n accessUrl: string;\n}\n\nexport interface ProductCreateParams {\n name: string;\n description?: string;\n active?: boolean;\n metadata?: Record<string, string>;\n}\n\nexport interface ProductListParams {\n active?: boolean;\n limit?: number;\n startingAfter?: string;\n}\n\nexport interface Price {\n id: string;\n object: 'price';\n product: string;\n currency: string;\n amount: number;\n type: 'one_time' | 'recurring';\n recurring?: {\n interval: 'day' | 'week' | 'month' | 'year';\n intervalCount: number;\n };\n active: boolean;\n metadata?: Record<string, string>;\n created: number;\n}\n\nexport interface PriceCreateParams {\n product: string;\n currency: string;\n amount: number;\n type: 'one_time' | 'recurring';\n recurring?: {\n interval: 'day' | 'week' | 'month' | 'year';\n intervalCount?: number;\n };\n metadata?: Record<string, string>;\n}\n\n// API Classes\nclass ProductsAPI {\n constructor(private config: MoneyMQConfig) {}\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.config.endpoint}${path}`;\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (this.config.secret) headers['Authorization'] = `Bearer ${this.config.secret}`;\n\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as { message?: string };\n throw new Error(errorData.message || `Request failed: ${response.status}`);\n }\n\n return response.json() as Promise<T>;\n }\n\n /**\n * Create a new product\n */\n async create(params: ProductCreateParams): Promise<Product> {\n return this.request('POST', '/catalog/v1/products', params);\n }\n\n /**\n * Retrieve a product by ID\n */\n async retrieve(id: string): Promise<Product> {\n return this.request('GET', `/catalog/v1/products/${id}`);\n }\n\n /**\n * List all products\n */\n async list(params?: ProductListParams): Promise<{ data: Product[]; hasMore: boolean }> {\n const query = new URLSearchParams();\n if (params?.active !== undefined) query.set('active', String(params.active));\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.startingAfter) query.set('starting_after', params.startingAfter);\n\n const queryString = query.toString();\n const result = await this.request<{ data: Product[]; hasMore: boolean }>(\n 'GET',\n `/catalog/v1/products${queryString ? `?${queryString}` : ''}`,\n );\n\n // Add accessUrl to each product (full URL)\n result.data = result.data.map((product) => ({\n ...product,\n accessUrl: `${this.config.endpoint}/catalog/v1/products/${product.id}/access`,\n }));\n\n return result;\n }\n\n /**\n * Update a product\n */\n async update(id: string, params: Partial<ProductCreateParams>): Promise<Product> {\n return this.request('PUT', `/catalog/v1/products/${id}`, params);\n }\n\n /**\n * Delete a product\n */\n async delete(id: string): Promise<{ deleted: boolean }> {\n return this.request('DELETE', `/catalog/v1/products/${id}`);\n }\n\n /**\n * Access a product - gated by x402 payment\n *\n * This endpoint requires payment. If no payment header is provided (or payment is invalid),\n * throws a PaymentRequiredError with the payment requirements.\n *\n * @example\n * ```ts\n * try {\n * // First attempt without payment - will throw PaymentRequiredError\n * const access = await moneymq.catalog.products.access('surfnet-max');\n * } catch (error) {\n * if (error instanceof PaymentRequiredError) {\n * // Get payment requirements and create payment\n * const requirements = error.paymentRequirements[0];\n * const paymentHeader = await createPayment(requirements);\n *\n * // Retry with payment\n * const access = await moneymq.catalog.products.access('surfnet-max', {\n * paymentHeader,\n * });\n * }\n * }\n * ```\n */\n async access(id: string, params?: ProductAccessParams): Promise<ProductAccessResponse> {\n const url = `${this.config.endpoint}/catalog/v1/products/${id}/access`;\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n\n if (this.config.secret) {\n headers['Authorization'] = `Bearer ${this.config.secret}`;\n }\n\n if (params?.paymentHeader) {\n headers['X-Payment'] = params.paymentHeader;\n }\n\n const response = await fetch(url, {\n method: 'GET',\n headers,\n });\n\n if (response.status === 402) {\n // Payment required - extract payment requirements from x402 response\n const x402Response = (await response.json().catch(() => ({}))) as {\n x402Version?: number;\n accepts?: PaymentRequirements[];\n };\n\n const paymentRequirements = x402Response.accepts || [];\n throw new PaymentRequiredError(\n 'Payment required',\n paymentRequirements,\n x402Response,\n );\n }\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as { message?: string };\n throw new Error(errorData.message || `Request failed: ${response.status}`);\n }\n\n return response.json() as Promise<ProductAccessResponse>;\n }\n}\n\nclass PricesAPI {\n constructor(private config: MoneyMQConfig) {}\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.config.endpoint}${path}`;\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (this.config.secret) headers['Authorization'] = `Bearer ${this.config.secret}`;\n\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as { message?: string };\n throw new Error(errorData.message || `Request failed: ${response.status}`);\n }\n\n return response.json() as Promise<T>;\n }\n\n /**\n * Create a new price\n */\n async create(params: PriceCreateParams): Promise<Price> {\n return this.request('POST', '/catalog/v1/prices', params);\n }\n\n /**\n * Retrieve a price by ID\n */\n async retrieve(id: string): Promise<Price> {\n return this.request('GET', `/catalog/v1/prices/${id}`);\n }\n\n /**\n * List all prices\n */\n async list(params?: {\n product?: string;\n active?: boolean;\n limit?: number;\n }): Promise<{ data: Price[]; hasMore: boolean }> {\n const query = new URLSearchParams();\n if (params?.product) query.set('product', params.product);\n if (params?.active !== undefined) query.set('active', String(params.active));\n if (params?.limit) query.set('limit', String(params.limit));\n\n const queryString = query.toString();\n return this.request('GET', `/catalog/v1/prices${queryString ? `?${queryString}` : ''}`);\n }\n}\n\n/**\n * Catalog API for managing products and prices\n */\nexport class CatalogAPI {\n /** Products API */\n public readonly products: ProductsAPI;\n\n /** Prices API */\n public readonly prices: PricesAPI;\n\n constructor(config: MoneyMQConfig) {\n this.products = new ProductsAPI(config);\n this.prices = new PricesAPI(config);\n }\n}\n","import type { MoneyMQConfig } from './client';\n\n// Types\nexport interface LineItem {\n price: string;\n quantity: number;\n}\n\nexport interface CheckoutSession {\n id: string;\n object: 'checkout.session';\n url: string;\n status: 'open' | 'complete' | 'expired';\n paymentStatus: 'unpaid' | 'paid';\n customer?: string;\n lineItems: LineItem[];\n successUrl: string;\n cancelUrl: string;\n expiresAt: number;\n created: number;\n}\n\nexport interface CheckoutCreateParams {\n lineItems: LineItem[];\n successUrl: string;\n cancelUrl: string;\n customerEmail?: string;\n customer?: string;\n metadata?: Record<string, string>;\n}\n\nexport interface PaymentLink {\n id: string;\n object: 'payment_link';\n url: string;\n active: boolean;\n lineItems: LineItem[];\n expiresAt?: number;\n created: number;\n}\n\nexport interface PaymentLinkCreateParams {\n lineItems: LineItem[];\n expiresAt?: Date | number;\n metadata?: Record<string, string>;\n}\n\nexport interface Payment {\n id: string;\n object: 'payment';\n amount: number;\n currency: string;\n status: 'completed' | 'pending' | 'failed';\n customer?: string;\n checkout?: string;\n signature?: string;\n metadata?: Record<string, string>;\n created: number;\n}\n\nexport interface PaymentListParams {\n customerId?: string;\n status?: 'completed' | 'pending' | 'failed';\n limit?: number;\n startingAfter?: string;\n}\n\n// Simple pay params - for one-liner payments\nexport interface PayParams {\n /** Amount in smallest currency unit (e.g., cents for USD) */\n amount: number;\n /** Currency code (e.g., 'usd', 'usdc') */\n currency: string;\n /** Product name for display */\n productName: string;\n /** Product ID for tracking */\n productId?: string;\n /** Optional product description */\n description?: string;\n /** Customer wallet address */\n customer?: string;\n /** Additional metadata */\n metadata?: Record<string, string>;\n}\n\nexport interface PayResult {\n /** Checkout session ID */\n sessionId: string;\n /** Payment intent ID */\n paymentIntentId: string;\n /** Client secret for confirming payment */\n clientSecret: string;\n /** Total amount in smallest currency unit */\n amount: number;\n /** Currency */\n currency: string;\n /** Status */\n status: 'requires_confirmation' | 'succeeded' | 'failed';\n}\n\n// Payment Intent types (simpler than checkout sessions)\nexport interface PaymentIntent {\n id: string;\n object: 'payment_intent';\n amount: number;\n currency: string;\n status: 'requires_payment_method' | 'requires_confirmation' | 'processing' | 'succeeded' | 'canceled';\n customer?: string;\n description?: string;\n metadata: Record<string, string>;\n clientSecret?: string;\n created: number;\n}\n\nexport interface PaymentIntentCreateParams {\n /** Amount in smallest currency unit */\n amount: number;\n /** Currency code */\n currency: string;\n /** Customer wallet address */\n customer?: string;\n /** Description */\n description?: string;\n /** Metadata including product info */\n metadata?: Record<string, string>;\n}\n\nexport interface Customer {\n id: string;\n object: 'customer';\n email: string;\n name?: string;\n metadata?: Record<string, string>;\n subscriptions?: unknown[];\n payments?: Payment[];\n created: number;\n}\n\nexport interface CustomerCreateParams {\n email: string;\n name?: string;\n metadata?: Record<string, string>;\n}\n\nexport interface CustomerUpdateParams {\n email?: string;\n name?: string;\n metadata?: Record<string, string>;\n}\n\nexport interface Payout {\n id: string;\n object: 'payout';\n amount: number;\n currency: string;\n status: 'pending' | 'completed' | 'failed';\n destination: string;\n created: number;\n}\n\nexport interface PayoutCreateParams {\n amount: number;\n currency: string;\n destination: string;\n}\n\nexport interface PayoutListParams {\n status?: 'pending' | 'completed' | 'failed';\n limit?: number;\n startingAfter?: string;\n}\n\nexport interface PayoutSettings {\n destination: {\n type: 'wallet';\n address: string;\n currency: string;\n };\n schedule: 'instant' | 'daily' | 'weekly' | 'monthly';\n minimumAmount?: number;\n}\n\nexport interface PayoutSettingsUpdateParams {\n destination?: PayoutSettings['destination'];\n schedule?: PayoutSettings['schedule'];\n minimumAmount?: number;\n}\n\n// Helper for making requests\nfunction createRequester(config: MoneyMQConfig) {\n return async function request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${config.endpoint}${path}`;\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (config.secret) headers['Authorization'] = `Bearer ${config.secret}`;\n\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as { message?: string };\n throw new Error(errorData.message || `Request failed: ${response.status}`);\n }\n\n return response.json() as Promise<T>;\n };\n}\n\n// API Classes\nclass CheckoutAPI {\n private request: ReturnType<typeof createRequester>;\n\n constructor(config: MoneyMQConfig) {\n this.request = createRequester(config);\n }\n\n /**\n * Create a checkout session\n */\n async create(params: CheckoutCreateParams): Promise<CheckoutSession> {\n return this.request('POST', '/payment/v1/checkout', params);\n }\n\n /**\n * Retrieve a checkout session\n */\n async retrieve(id: string): Promise<CheckoutSession> {\n return this.request('GET', `/payment/v1/checkout/${id}`);\n }\n}\n\nclass LinksAPI {\n private request: ReturnType<typeof createRequester>;\n\n constructor(config: MoneyMQConfig) {\n this.request = createRequester(config);\n }\n\n /**\n * Create a payment link\n */\n async create(params: PaymentLinkCreateParams): Promise<PaymentLink> {\n return this.request('POST', '/payment/v1/links', {\n ...params,\n expiresAt: params.expiresAt instanceof Date ? params.expiresAt.getTime() : params.expiresAt,\n });\n }\n\n /**\n * Retrieve a payment link\n */\n async retrieve(id: string): Promise<PaymentLink> {\n return this.request('GET', `/payment/v1/links/${id}`);\n }\n\n /**\n * Deactivate a payment link\n */\n async deactivate(id: string): Promise<PaymentLink> {\n return this.request('PUT', `/payment/v1/links/${id}`, { active: false });\n }\n}\n\nclass CustomersAPI {\n private request: ReturnType<typeof createRequester>;\n\n constructor(config: MoneyMQConfig) {\n this.request = createRequester(config);\n }\n\n /**\n * Create a customer\n */\n async create(params: CustomerCreateParams): Promise<Customer> {\n return this.request('POST', '/payment/v1/customers', params);\n }\n\n /**\n * Retrieve a customer\n */\n async retrieve(id: string, options?: { expand?: string[] }): Promise<Customer> {\n const query = options?.expand ? `?expand=${options.expand.join(',')}` : '';\n return this.request('GET', `/payment/v1/customers/${id}${query}`);\n }\n\n /**\n * Update a customer\n */\n async update(id: string, params: CustomerUpdateParams): Promise<Customer> {\n return this.request('PUT', `/payment/v1/customers/${id}`, params);\n }\n\n /**\n * List customers\n */\n async list(params?: {\n email?: string;\n limit?: number;\n }): Promise<{ data: Customer[]; hasMore: boolean }> {\n const query = new URLSearchParams();\n if (params?.email) query.set('email', params.email);\n if (params?.limit) query.set('limit', String(params.limit));\n\n const queryString = query.toString();\n return this.request('GET', `/payment/v1/customers${queryString ? `?${queryString}` : ''}`);\n }\n}\n\nclass PayoutsAPI {\n private request: ReturnType<typeof createRequester>;\n\n /** Payout settings */\n public readonly settings: PayoutSettingsAPI;\n\n constructor(config: MoneyMQConfig) {\n this.request = createRequester(config);\n this.settings = new PayoutSettingsAPI(config);\n }\n\n /**\n * Create a manual payout\n */\n async create(params: PayoutCreateParams): Promise<Payout> {\n return this.request('POST', '/payment/v1/payouts', params);\n }\n\n /**\n * Retrieve a payout\n */\n async retrieve(id: string): Promise<Payout> {\n return this.request('GET', `/payment/v1/payouts/${id}`);\n }\n\n /**\n * List payouts\n */\n async list(params?: PayoutListParams): Promise<{ data: Payout[]; hasMore: boolean }> {\n const query = new URLSearchParams();\n if (params?.status) query.set('status', params.status);\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.startingAfter) query.set('starting_after', params.startingAfter);\n\n const queryString = query.toString();\n return this.request('GET', `/payment/v1/payouts${queryString ? `?${queryString}` : ''}`);\n }\n}\n\nclass PayoutSettingsAPI {\n private request: ReturnType<typeof createRequester>;\n\n constructor(config: MoneyMQConfig) {\n this.request = createRequester(config);\n }\n\n /**\n * Get payout settings\n */\n async retrieve(): Promise<PayoutSettings> {\n return this.request('GET', '/payment/v1/payouts/settings');\n }\n\n /**\n * Update payout settings\n */\n async update(params: PayoutSettingsUpdateParams): Promise<PayoutSettings> {\n return this.request('PUT', '/payment/v1/payouts/settings', params);\n }\n}\n\nclass WebhooksAPI {\n private request: ReturnType<typeof createRequester>;\n\n constructor(config: MoneyMQConfig) {\n this.request = createRequester(config);\n }\n\n /**\n * Trigger a test webhook event (for testing)\n */\n async trigger(event: string, data: Record<string, unknown>): Promise<{ success: boolean }> {\n return this.request('POST', '/payment/v1/webhooks/test', { event, data });\n }\n}\n\n/**\n * Payment Intents API - for direct payments without full checkout flow\n * Similar to Stripe's Payment Intents API\n */\nclass PaymentIntentsAPI {\n private request: ReturnType<typeof createRequester>;\n\n constructor(config: MoneyMQConfig) {\n this.request = createRequester(config);\n }\n\n /**\n * Create a payment intent\n * Use this for simple payments without the full checkout session flow\n */\n async create(params: PaymentIntentCreateParams): Promise<PaymentIntent> {\n return this.request('POST', '/catalog/v1/payment_intents', params);\n }\n\n /**\n * Retrieve a payment intent\n */\n async retrieve(id: string): Promise<PaymentIntent> {\n return this.request('GET', `/catalog/v1/payment_intents/${id}`);\n }\n\n /**\n * Confirm a payment intent\n * This triggers the actual payment (and x402 flow if required)\n */\n async confirm(id: string): Promise<PaymentIntent> {\n return this.request('POST', `/catalog/v1/payment_intents/${id}/confirm`, {});\n }\n\n /**\n * Cancel a payment intent\n */\n async cancel(id: string): Promise<PaymentIntent> {\n return this.request('POST', `/catalog/v1/payment_intents/${id}/cancel`, {});\n }\n}\n\n/**\n * Payment API for checkout, links, customers, and payouts\n */\nexport class PaymentAPI {\n private request: ReturnType<typeof createRequester>;\n\n /** Checkout sessions API - for full e-commerce flows with line items */\n public readonly checkout: CheckoutAPI;\n\n /** Payment intents API - for simpler direct payments */\n public readonly intents: PaymentIntentsAPI;\n\n /** Payment links API */\n public readonly links: LinksAPI;\n\n /** Customers API */\n public readonly customers: CustomersAPI;\n\n /** Payouts API */\n public readonly payouts: PayoutsAPI;\n\n /** Webhooks API */\n public readonly webhooks: WebhooksAPI;\n\n constructor(config: MoneyMQConfig) {\n this.request = createRequester(config);\n this.checkout = new CheckoutAPI(config);\n this.intents = new PaymentIntentsAPI(config);\n this.links = new LinksAPI(config);\n this.customers = new CustomersAPI(config);\n this.payouts = new PayoutsAPI(config);\n this.webhooks = new WebhooksAPI(config);\n }\n\n /**\n * Simple one-liner payment - creates a checkout session with inline product data\n *\n * @example\n * ```ts\n * const result = await moneymq.payment.pay({\n * amount: 999,\n * currency: 'usd',\n * productName: 'Pro Plan',\n * productId: 'pro-plan',\n * customer: 'wallet_address',\n * });\n * ```\n */\n async pay(params: PayParams): Promise<PayResult> {\n // Create a checkout session with inline price_data\n const session = await this.request<{\n id: string;\n payment_intent: string;\n client_secret: string;\n amount_total: number;\n currency: string;\n status: string;\n }>('POST', '/catalog/v1/checkout/sessions', {\n line_items: [\n {\n price_data: {\n currency: params.currency,\n unit_amount: params.amount,\n product_data: {\n name: params.productName,\n description: params.description,\n metadata: {\n product_id: params.productId || params.productName.toLowerCase().replace(/\\s+/g, '-'),\n },\n },\n },\n quantity: 1,\n },\n ],\n customer: params.customer,\n metadata: params.metadata,\n mode: 'payment',\n });\n\n return {\n sessionId: session.id,\n paymentIntentId: session.payment_intent,\n clientSecret: session.client_secret,\n amount: session.amount_total,\n currency: session.currency,\n status: 'requires_confirmation',\n };\n }\n\n /**\n * Retrieve a payment by ID\n */\n async retrieve(id: string): Promise<Payment> {\n return this.request('GET', `/payment/v1/${id}`);\n }\n\n /**\n * List payments\n */\n async list(params?: PaymentListParams): Promise<{ data: Payment[]; hasMore: boolean }> {\n const query = new URLSearchParams();\n if (params?.customerId) query.set('customer', params.customerId);\n if (params?.status) query.set('status', params.status);\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.startingAfter) query.set('starting_after', params.startingAfter);\n\n const queryString = query.toString();\n return this.request('GET', `/payment/v1${queryString ? `?${queryString}` : ''}`);\n }\n}\n","/**\n * MoneyMQ server configuration returned from /config endpoint\n */\nexport interface ServerConfig {\n account: {\n name: string;\n description: string;\n };\n x402: {\n payoutAccount: {\n currency: string;\n decimals: number;\n address: string;\n tokenAddress: string;\n };\n facilitator: {\n operatorAccount: {\n out: string;\n in: {\n currency: string;\n decimals: number;\n address: string;\n tokenAddress: string;\n };\n };\n url: string;\n };\n validator: {\n network: string;\n rpcUrl: string;\n bindHost: string;\n rpcPort: number;\n wsPort: number;\n };\n };\n}\n\n/**\n * Fetch server configuration from MoneyMQ API\n *\n * @param apiUrl - The MoneyMQ API URL\n * @returns Server configuration including RPC URL\n *\n * @example\n * ```typescript\n * const config = await fetchConfig('http://localhost:8488');\n * console.log(config.x402.validator.rpcUrl);\n * ```\n */\nexport async function fetchConfig(apiUrl: string): Promise<ServerConfig> {\n const response = await fetch(`${apiUrl}/config`);\n if (!response.ok) {\n throw new Error(`Failed to fetch config: ${response.status}`);\n }\n return response.json() as Promise<ServerConfig>;\n}\n\n/**\n * Get the Solana RPC URL from server config\n *\n * @param apiUrl - The MoneyMQ API URL\n * @param fallback - Fallback RPC URL if fetch fails\n * @returns RPC URL string\n */\nexport async function getRpcUrl(\n apiUrl: string,\n fallback = 'https://api.devnet.solana.com'\n): Promise<string> {\n try {\n const config = await fetchConfig(apiUrl);\n return config.x402.validator.rpcUrl || fallback;\n } catch {\n return fallback;\n }\n}\n","import type { MoneyMQConfig } from './client';\nimport { fetchConfig, type ServerConfig } from './config';\nimport { createSigner, type Signer } from 'x402-fetch';\n\n/**\n * Parameters for getting a signer by tag\n */\nexport interface GetSignerParams {\n /**\n * Tag/label identifying the sandbox wallet account\n * @example 'alice', 'bob', 'agent-1'\n */\n tag: string;\n}\n\n/**\n * Re-export Signer type from x402-fetch\n */\nexport type { Signer } from 'x402-fetch';\n\n/**\n * X402 configuration compatible with x402-fetch wrapFetchWithPayment\n */\nexport interface X402ClientConfig {\n svmConfig?: {\n rpcUrl: string;\n };\n}\n\n/**\n * Response structure from /sandbox/accounts endpoint\n */\ninterface SandboxAccountsResponse {\n [network: string]: {\n network: string;\n payTo: string;\n userAccounts: Array<{\n address: string;\n secretKeyHex?: string;\n label?: string;\n stablecoins?: {\n usdc?: string;\n };\n }>;\n };\n}\n\n/**\n * X402 API for agentic payments\n *\n * @example\n * ```typescript\n * import { wrapFetchWithPayment } from 'x402-fetch';\n *\n * const moneymq = new MoneyMQ({\n * endpoint: 'http://localhost:8488',\n * });\n *\n * // Get signer for sandbox account by label\n * const payer = await moneymq.x402.getSigner({ tag: 'alice' });\n *\n * // Get x402 config for the fetch wrapper\n * const config = await moneymq.x402.getConfig();\n *\n * // Create the payment-enabled fetch\n * const fetchWithPayment = wrapFetchWithPayment(\n * fetch,\n * payer,\n * undefined,\n * undefined,\n * config,\n * );\n *\n * // Make requests that automatically handle 402 payments\n * const response = await fetchWithPayment(url, { method: 'GET' });\n * ```\n */\nexport class X402API {\n private serverConfig: ServerConfig | null = null;\n private sandboxAccounts: SandboxAccountsResponse | null = null;\n\n constructor(private config: MoneyMQConfig) {}\n\n /**\n * Fetch sandbox accounts from the server\n */\n private async fetchSandboxAccounts(): Promise<SandboxAccountsResponse> {\n if (this.sandboxAccounts) {\n return this.sandboxAccounts;\n }\n\n const response = await fetch(`${this.config.endpoint}/sandbox/accounts`);\n if (!response.ok) {\n throw new Error(`Failed to fetch sandbox accounts: ${response.status}`);\n }\n\n this.sandboxAccounts = await response.json() as SandboxAccountsResponse;\n return this.sandboxAccounts;\n }\n\n /**\n * Get a signer for a sandbox account by tag/label\n *\n * @param params - Parameters containing the wallet tag/label\n * @returns A Signer that can be used directly with wrapFetchWithPayment\n *\n * @example\n * ```typescript\n * const payer = await moneymq.x402.getSigner({ tag: 'alice' });\n * ```\n */\n async getSigner(params: GetSignerParams): Promise<Signer> {\n const accounts = await this.fetchSandboxAccounts();\n\n // Search through all networks for an account with matching label\n for (const networkData of Object.values(accounts)) {\n for (const account of networkData.userAccounts) {\n if (account.label === params.tag) {\n if (!account.secretKeyHex) {\n throw new Error(`Account '${params.tag}' does not have a secret key (not locally managed)`);\n }\n // Create and return the signer directly\n return createSigner('solana', account.secretKeyHex);\n }\n }\n }\n\n throw new Error(`No sandbox account found with label '${params.tag}'`);\n }\n\n /**\n * Get x402 configuration for use with wrapFetchWithPayment\n *\n * @returns Configuration object compatible with x402-fetch\n *\n * @example\n * ```typescript\n * const config = await moneymq.x402.getConfig();\n * const fetchWithPayment = wrapFetchWithPayment(fetch, payer, undefined, undefined, config);\n * ```\n */\n async getConfig(): Promise<X402ClientConfig> {\n // Cache the server config\n if (!this.serverConfig) {\n this.serverConfig = await fetchConfig(this.config.endpoint);\n }\n\n return {\n svmConfig: {\n rpcUrl: this.serverConfig.x402.validator.rpcUrl,\n },\n };\n }\n\n /**\n * Get the full server configuration\n *\n * @returns The complete server configuration including x402 settings\n */\n async getServerConfig(): Promise<ServerConfig> {\n if (!this.serverConfig) {\n this.serverConfig = await fetchConfig(this.config.endpoint);\n }\n return this.serverConfig;\n }\n}\n","/**\n * Server-Sent Events (SSE) helpers for MoneyMQ real-time events\n *\n * Supports two modes:\n * - **Stateless**: Client tracks cursor, replay from memory on reconnect\n * - **Stateful**: Server tracks cursor in DB, guaranteed delivery on reconnect\n *\n * @example Stateless stream (client-side cursor)\n * ```typescript\n * import { MoneyMQ } from '@moneymq/sdk';\n *\n * const moneymq = new MoneyMQ({ endpoint: 'http://localhost:8488' });\n *\n * // Create a stateless event stream with replay\n * const stream = moneymq.events.stream({ last: 10 });\n *\n * stream.on('payment', (event) => {\n * console.log('Payment event:', event.type, event.data);\n * // Store cursor for reconnection\n * localStorage.setItem('cursor', event.id);\n * });\n *\n * stream.connect();\n * ```\n *\n * @example Stateful stream (server-side cursor persistence)\n * ```typescript\n * import { MoneyMQ } from '@moneymq/sdk';\n *\n * const moneymq = new MoneyMQ({ endpoint: 'http://localhost:8488' });\n *\n * // Create a stateful stream - server tracks your position\n * // Use a unique, deterministic ID for your consumer\n * const stream = moneymq.events.stream({\n * streamId: 'checkout-widget-user-123',\n * });\n *\n * stream.on('payment', (event) => {\n * // Server automatically tracks cursor - no need to store locally\n * console.log('Payment event:', event.type, event.data);\n * });\n *\n * stream.connect();\n *\n * // On reconnect, server replays missed events automatically\n * ```\n */\n\n// Type declarations for EventSource (browser API)\n// These allow the SDK to work in both browser and Node.js (with polyfills)\ndeclare class EventSource {\n static readonly CONNECTING: 0;\n static readonly OPEN: 1;\n static readonly CLOSED: 2;\n readonly readyState: number;\n readonly url: string;\n onopen: ((this: EventSource, ev: Event) => unknown) | null;\n onmessage: ((this: EventSource, ev: MessageEvent) => unknown) | null;\n onerror: ((this: EventSource, ev: Event) => unknown) | null;\n constructor(url: string | URL, eventSourceInitDict?: EventSourceInit);\n close(): void;\n addEventListener(\n type: string,\n listener: (event: MessageEvent) => void,\n options?: boolean | AddEventListenerOptions,\n ): void;\n removeEventListener(\n type: string,\n listener: (event: MessageEvent) => void,\n options?: boolean | EventListenerOptions,\n ): void;\n}\n\ninterface EventSourceInit {\n withCredentials?: boolean;\n}\n\ninterface Event {\n readonly type: string;\n}\n\ninterface MessageEvent {\n readonly data: unknown;\n readonly lastEventId: string;\n readonly origin: string;\n}\n\ninterface AddEventListenerOptions {\n capture?: boolean;\n once?: boolean;\n passive?: boolean;\n signal?: AbortSignal;\n}\n\ninterface EventListenerOptions {\n capture?: boolean;\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * CloudEvent v1.0 specification envelope\n */\nexport interface CloudEventEnvelope<T = unknown> {\n /** CloudEvents specification version */\n specversion: string;\n /** Unique event identifier (UUID) */\n id: string;\n /** Event type (e.g., 'mq.money.payment.verification.succeeded') */\n type: string;\n /** Event source URI */\n source: string;\n /** Timestamp in ISO 8601 format */\n time: string;\n /** Content type of the data field */\n datacontenttype: string;\n /** Event payload */\n data: T;\n}\n\n/**\n * Payment flow type - indicates how the payment was initiated\n */\nexport type PaymentFlow =\n | { type: 'x402' }\n | { type: 'checkout'; intent_id: string };\n\n/**\n * Payment verification succeeded event data\n */\nexport interface PaymentVerificationSucceededData {\n /** Wallet address of the payer */\n payer: string;\n /** Amount in smallest unit (e.g., lamports for SOL, micro-units for USDC) */\n amount: string;\n /** Network the payment was verified on */\n network: string;\n /** Product ID if available */\n product_id: string | null;\n /** Payment flow type (x402 or checkout) */\n payment_flow: PaymentFlow;\n}\n\n/**\n * Payment verification failed event data\n */\nexport interface PaymentVerificationFailedData {\n /** Wallet address of the payer if known */\n payer: string | null;\n /** Amount that was attempted */\n amount: string;\n /** Network the verification was attempted on */\n network: string;\n /** Reason for the failure */\n reason: string;\n /** Product ID if available */\n product_id: string | null;\n /** Payment flow type (x402 or checkout) */\n payment_flow: PaymentFlow;\n}\n\n/**\n * Payment settlement succeeded event data\n */\nexport interface PaymentSettlementSucceededData {\n /** Wallet address of the payer */\n payer: string;\n /** Amount in smallest unit (e.g., lamports for SOL, micro-units for USDC) */\n amount: string;\n /** Network the transaction occurred on */\n network: string;\n /** Transaction signature/hash if available */\n transaction_signature: string | null;\n /** Product ID if available */\n product_id: string | null;\n /** Payment flow type (x402 or checkout) */\n payment_flow: PaymentFlow;\n}\n\n/**\n * Payment settlement failed event data\n */\nexport interface PaymentSettlementFailedData {\n /** Wallet address of the payer if known */\n payer: string | null;\n /** Amount that was attempted */\n amount: string;\n /** Network the settlement was attempted on */\n network: string;\n /** Reason for the failure */\n reason: string;\n /** Product ID if available */\n product_id: string | null;\n /** Payment flow type (x402 or checkout) */\n payment_flow: PaymentFlow;\n}\n\n/**\n * All MoneyMQ event types\n */\nexport type MoneyMQEventType =\n | 'mq.money.payment.verification.succeeded'\n | 'mq.money.payment.verification.failed'\n | 'mq.money.payment.settlement.succeeded'\n | 'mq.money.payment.settlement.failed';\n\n/**\n * Event type to data type mapping\n */\nexport interface MoneyMQEventMap {\n 'mq.money.payment.verification.succeeded': PaymentVerificationSucceededData;\n 'mq.money.payment.verification.failed': PaymentVerificationFailedData;\n 'mq.money.payment.settlement.succeeded': PaymentSettlementSucceededData;\n 'mq.money.payment.settlement.failed': PaymentSettlementFailedData;\n}\n\n/**\n * Payment verification event (succeeded or failed)\n */\nexport type PaymentVerificationEvent =\n | CloudEventEnvelope<PaymentVerificationSucceededData>\n | CloudEventEnvelope<PaymentVerificationFailedData>;\n\n/**\n * Payment settlement event (succeeded or failed)\n */\nexport type PaymentSettlementEvent =\n | CloudEventEnvelope<PaymentSettlementSucceededData>\n | CloudEventEnvelope<PaymentSettlementFailedData>;\n\n/**\n * Any payment event\n */\nexport type PaymentEvent = PaymentVerificationEvent | PaymentSettlementEvent;\n\n// ============================================================================\n// Event Stream Options\n// ============================================================================\n\n/**\n * Options for creating an event stream connection\n */\nexport interface EventStreamOptions {\n /**\n * Replay the last N events before switching to live\n * @example { last: 10 } - Replay last 10 events\n */\n last?: number;\n\n /**\n * Resume from a specific event ID (exclusive)\n * Events after this ID will be replayed, then live events\n * @example { cursor: 'abc-123-def' }\n */\n cursor?: string;\n\n /**\n * Stateful stream ID for server-side cursor persistence\n *\n * When provided, the server tracks the last consumed event for this stream.\n * On reconnection, missed events are automatically replayed from where you left off.\n *\n * Use a deterministic ID unique to your consumer (e.g., 'checkout-widget-123').\n *\n * @example { streamId: 'my-checkout-widget' }\n */\n streamId?: string;\n\n /**\n * Automatically reconnect on connection loss\n * @default true\n */\n autoReconnect?: boolean;\n\n /**\n * Delay between reconnection attempts in milliseconds\n * @default 1000\n */\n reconnectDelay?: number;\n\n /**\n * Maximum number of reconnection attempts (0 = infinite)\n * @default 0\n */\n maxReconnectAttempts?: number;\n}\n\n/**\n * Event stream connection state\n */\nexport type EventStreamState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting';\n\n/**\n * Event handler callback type\n */\nexport type EventHandler<T = PaymentEvent> = (event: T) => void;\n\n/**\n * Error handler callback type\n */\nexport type ErrorHandler = (error: Error) => void;\n\n/**\n * State change handler callback type\n */\nexport type StateHandler = (state: EventStreamState) => void;\n\n// ============================================================================\n// Event Stream Class\n// ============================================================================\n\n/**\n * MoneyMQ Event Stream client for receiving real-time purchase events\n *\n * @example\n * ```typescript\n * const stream = new EventStream('http://localhost:8488', { last: 5 });\n *\n * stream.on('payment', (event) => {\n * console.log('Payment event:', event.type);\n * // Store cursor for reconnection\n * localStorage.setItem('cursor', event.id);\n * });\n *\n * stream.on('error', (error) => {\n * console.error('Stream error:', error);\n * });\n *\n * stream.on('stateChange', (state) => {\n * console.log('Connection state:', state);\n * });\n *\n * stream.connect();\n *\n * // Later: disconnect\n * stream.disconnect();\n * ```\n */\nexport class EventStream {\n private endpoint: string;\n private options: Required<EventStreamOptions>;\n private eventSource: EventSource | null = null;\n private state: EventStreamState = 'disconnected';\n private reconnectAttempts = 0;\n private lastEventId: string | null = null;\n\n private paymentHandlers: Set<EventHandler> = new Set();\n private errorHandlers: Set<ErrorHandler> = new Set();\n private stateHandlers: Set<StateHandler> = new Set();\n\n constructor(endpoint: string, options: EventStreamOptions = {}) {\n this.endpoint = endpoint;\n console.log('[MoneyMQ SDK] EventStream constructor called with options:', JSON.stringify(options));\n this.options = {\n last: options.last ?? 0,\n cursor: options.cursor ?? '',\n streamId: options.streamId ?? '',\n autoReconnect: options.autoReconnect ?? true,\n reconnectDelay: options.reconnectDelay ?? 1000,\n maxReconnectAttempts: options.maxReconnectAttempts ?? 0,\n };\n console.log('[MoneyMQ SDK] Resolved options:', JSON.stringify(this.options));\n\n // Initialize cursor from options (only for stateless streams)\n // For stateful streams, the server tracks the cursor\n if (this.options.cursor && !this.options.streamId) {\n this.lastEventId = this.options.cursor;\n }\n }\n\n /**\n * Whether this is a stateful stream (server tracks cursor)\n */\n get isStateful(): boolean {\n return this.options.streamId !== '';\n }\n\n /**\n * The stream ID for stateful streams\n */\n get streamId(): string | null {\n return this.options.streamId || null;\n }\n\n /**\n * Current connection state\n */\n get connectionState(): EventStreamState {\n return this.state;\n }\n\n /**\n * Current cursor (last received event ID)\n */\n get cursor(): string | null {\n return this.lastEventId;\n }\n\n /**\n * Whether the stream is currently connected\n */\n get isConnected(): boolean {\n return this.state === 'connected';\n }\n\n /**\n * Register an event handler\n *\n * @param event - Event type: 'payment', 'error', or 'stateChange'\n * @param handler - Callback function\n * @returns Unsubscribe function\n */\n on(event: 'payment', handler: EventHandler): () => void;\n on(event: 'error', handler: ErrorHandler): () => void;\n on(event: 'stateChange', handler: StateHandler): () => void;\n on(\n event: 'payment' | 'error' | 'stateChange',\n handler: EventHandler | ErrorHandler | StateHandler,\n ): () => void {\n switch (event) {\n case 'payment':\n this.paymentHandlers.add(handler as EventHandler);\n return () => this.paymentHandlers.delete(handler as EventHandler);\n case 'error':\n this.errorHandlers.add(handler as ErrorHandler);\n return () => this.errorHandlers.delete(handler as ErrorHandler);\n case 'stateChange':\n this.stateHandlers.add(handler as StateHandler);\n return () => this.stateHandlers.delete(handler as StateHandler);\n }\n }\n\n /**\n * Remove an event handler\n */\n off(event: 'payment', handler: EventHandler): void;\n off(event: 'error', handler: ErrorHandler): void;\n off(event: 'stateChange', handler: StateHandler): void;\n off(\n event: 'payment' | 'error' | 'stateChange',\n handler: EventHandler | ErrorHandler | StateHandler,\n ): void {\n switch (event) {\n case 'payment':\n this.paymentHandlers.delete(handler as EventHandler);\n break;\n case 'error':\n this.errorHandlers.delete(handler as ErrorHandler);\n break;\n case 'stateChange':\n this.stateHandlers.delete(handler as StateHandler);\n break;\n }\n }\n\n /**\n * Connect to the event stream\n */\n connect(): void {\n if (this.eventSource) {\n this.eventSource.close();\n }\n\n this.setState('connecting');\n\n const url = this.buildUrl();\n console.log('[MoneyMQ SDK] Connecting to SSE:', url, '| streamId:', this.options.streamId || '(none)');\n this.eventSource = new EventSource(url);\n\n this.eventSource.onopen = () => {\n this.setState('connected');\n this.reconnectAttempts = 0;\n };\n\n this.eventSource.addEventListener('payment', (event: MessageEvent) => {\n try {\n const cloudEvent = JSON.parse(event.data as string) as PaymentEvent;\n this.lastEventId = cloudEvent.id;\n this.emitPayment(cloudEvent);\n } catch (e) {\n this.emitError(new Error(`Failed to parse event: ${e}`));\n }\n });\n\n this.eventSource.onerror = () => {\n this.eventSource?.close();\n this.eventSource = null;\n\n if (this.options.autoReconnect && this.shouldReconnect()) {\n this.scheduleReconnect();\n } else {\n this.setState('disconnected');\n this.emitError(new Error('Connection lost'));\n }\n };\n }\n\n /**\n * Disconnect from the event stream\n */\n disconnect(): void {\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = null;\n }\n this.setState('disconnected');\n this.reconnectAttempts = 0;\n }\n\n /**\n * Reconnect with a new cursor\n * Useful for resuming from a stored position\n */\n reconnectFrom(cursor: string): void {\n this.lastEventId = cursor;\n this.disconnect();\n this.connect();\n }\n\n private buildUrl(): string {\n const params = new URLSearchParams();\n\n // For stateful streams, always include stream_id\n // The server tracks the cursor, so we don't need to send it on reconnection\n if (this.options.streamId) {\n params.set('stream_id', this.options.streamId);\n // On first connection, we can request last N events\n if (this.options.last > 0) {\n params.set('last', this.options.last.toString());\n }\n } else {\n // Stateless mode: use lastEventId for cursor if we have one (for reconnection)\n if (this.lastEventId) {\n params.set('cursor', this.lastEventId);\n } else if (this.options.last > 0) {\n params.set('last', this.options.last.toString());\n }\n }\n\n const queryString = params.toString();\n return queryString ? `${this.endpoint}/events?${queryString}` : `${this.endpoint}/events`;\n }\n\n private setState(state: EventStreamState): void {\n if (this.state !== state) {\n this.state = state;\n this.stateHandlers.forEach((handler) => handler(state));\n }\n }\n\n private shouldReconnect(): boolean {\n if (this.options.maxReconnectAttempts === 0) return true;\n return this.reconnectAttempts < this.options.maxReconnectAttempts;\n }\n\n private scheduleReconnect(): void {\n this.setState('reconnecting');\n this.reconnectAttempts++;\n\n setTimeout(() => {\n if (this.state === 'reconnecting') {\n this.connect();\n }\n }, this.options.reconnectDelay);\n }\n\n private emitPayment(event: PaymentEvent): void {\n this.paymentHandlers.forEach((handler) => handler(event));\n }\n\n private emitError(error: Error): void {\n this.errorHandlers.forEach((handler) => handler(error));\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create an event stream connection\n *\n * @param endpoint - MoneyMQ API endpoint\n * @param options - Stream options (cursor, replay count, etc.)\n * @returns EventStream instance\n *\n * @example\n * ```typescript\n * // Live events only\n * const stream = createEventStream('http://localhost:8488');\n *\n * // Replay last 10 events\n * const stream = createEventStream('http://localhost:8488', { last: 10 });\n *\n * // Resume from cursor\n * const cursor = localStorage.getItem('lastEventId');\n * const stream = createEventStream('http://localhost:8488', { cursor });\n * ```\n */\nexport function createEventStream(endpoint: string, options?: EventStreamOptions): EventStream {\n return new EventStream(endpoint, options);\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Check if an event is a payment verification succeeded event\n */\nexport function isPaymentVerificationSucceeded(\n event: PaymentEvent,\n): event is CloudEventEnvelope<PaymentVerificationSucceededData> {\n return event.type === 'mq.money.payment.verification.succeeded';\n}\n\n/**\n * Check if an event is a payment verification failed event\n */\nexport function isPaymentVerificationFailed(\n event: PaymentEvent,\n): event is CloudEventEnvelope<PaymentVerificationFailedData> {\n return event.type === 'mq.money.payment.verification.failed';\n}\n\n/**\n * Check if an event is a payment settlement succeeded event\n */\nexport function isPaymentSettlementSucceeded(\n event: PaymentEvent,\n): event is CloudEventEnvelope<PaymentSettlementSucceededData> {\n return event.type === 'mq.money.payment.settlement.succeeded';\n}\n\n/**\n * Check if an event is a payment settlement failed event\n */\nexport function isPaymentSettlementFailed(\n event: PaymentEvent,\n): event is CloudEventEnvelope<PaymentSettlementFailedData> {\n return event.type === 'mq.money.payment.settlement.failed';\n}\n\n/**\n * Parse a raw SSE data string into a CloudEvent\n *\n * @param data - Raw event data string from SSE\n * @returns Parsed CloudEvent or null if parsing fails\n */\nexport function parseCloudEvent(data: string): PaymentEvent | null {\n try {\n return JSON.parse(data) as PaymentEvent;\n } catch {\n return null;\n }\n}\n\n/**\n * Build an event stream URL with query parameters\n *\n * @param endpoint - MoneyMQ API endpoint\n * @param options - Stream options\n * @returns Full URL string\n *\n * @example\n * ```typescript\n * const url = buildEventStreamUrl('http://localhost:8488', { last: 10 });\n * // Returns: 'http://localhost:8488/events?last=10'\n *\n * const url = buildEventStreamUrl('http://localhost:8488', { cursor: 'abc' });\n * // Returns: 'http://localhost:8488/events?cursor=abc'\n *\n * // Stateful stream (server tracks cursor):\n * const url = buildEventStreamUrl('http://localhost:8488', { streamId: 'my-stream' });\n * // Returns: 'http://localhost:8488/events?stream_id=my-stream'\n * ```\n */\nexport function buildEventStreamUrl(\n endpoint: string,\n options?: Pick<EventStreamOptions, 'last' | 'cursor' | 'streamId'>,\n): string {\n const params = new URLSearchParams();\n\n // For stateful streams, include stream_id\n if (options?.streamId) {\n params.set('stream_id', options.streamId);\n if (options.last && options.last > 0) {\n params.set('last', options.last.toString());\n }\n } else {\n // Stateless mode\n if (options?.cursor) {\n params.set('cursor', options.cursor);\n } else if (options?.last && options.last > 0) {\n params.set('last', options.last.toString());\n }\n }\n\n const queryString = params.toString();\n return queryString ? `${endpoint}/events?${queryString}` : `${endpoint}/events`;\n}\n","import { CatalogAPI } from './catalog';\nimport { PaymentAPI } from './payment';\nimport { X402API } from './x402';\nimport { EventStream, EventStreamOptions } from './events';\n\n/**\n * Configuration options for the MoneyMQ client\n *\n * @example\n * ```typescript\n * const config: MoneyMQConfig = {\n * endpoint: 'https://api.moneymq.com',\n * secret: 'your-api-secret', // Optional\n * timeout: 30000,\n * };\n * ```\n */\nexport interface MoneyMQConfig {\n /**\n * MoneyMQ API endpoint\n * @example 'http://localhost:8488' or 'https://api.moneymq.com'\n */\n endpoint: string;\n /**\n * Optional secret key for authenticated requests\n * Used for server-side operations that require authentication\n */\n secret?: string;\n /**\n * Request timeout in milliseconds\n * @default 30000\n */\n timeout?: number;\n}\n\n/**\n * MoneyMQ SDK client for accepting stablecoin payments\n *\n * @example\n * ```typescript\n * import { MoneyMQ } from '@moneymq/sdk';\n *\n * const moneymq = new MoneyMQ({\n * endpoint: process.env.MONEYMQ_ENDPOINT ?? 'http://localhost:8488',\n * });\n *\n * // Create a product\n * const product = await moneymq.catalog.products.create({\n * name: 'Pro Plan',\n * description: 'Full access to all features',\n * });\n *\n * // Create a checkout session\n * const session = await moneymq.payment.checkout.create({\n * lineItems: [{ price: 'price_xxx', quantity: 1 }],\n * successUrl: 'https://example.com/success',\n * cancelUrl: 'https://example.com/cancel',\n * });\n * ```\n */\nexport class MoneyMQ {\n public readonly config: MoneyMQConfig;\n\n /** Catalog API for products and prices */\n public readonly catalog: CatalogAPI;\n\n /** Payment API for checkout, links, customers, and payouts */\n public readonly payment: PaymentAPI;\n\n /** X402 API for agentic payments */\n public readonly x402: X402API;\n\n /** Events API for real-time SSE streams */\n public readonly events: {\n /**\n * Create a new event stream connection\n *\n * @example\n * ```typescript\n * const stream = moneymq.events.stream({ last: 10 });\n *\n * stream.on('payment', (event) => {\n * console.log('Payment event:', event.type);\n * });\n *\n * stream.connect();\n * ```\n */\n stream: (options?: EventStreamOptions) => EventStream;\n };\n\n /** MoneyMQ API endpoint */\n get endpoint(): string {\n return this.config.endpoint;\n }\n\n constructor(config: MoneyMQConfig) {\n this.config = {\n timeout: 30000,\n ...config,\n };\n\n this.catalog = new CatalogAPI(this.config);\n this.payment = new PaymentAPI(this.config);\n this.x402 = new X402API(this.config);\n this.events = {\n stream: (options?: EventStreamOptions) => new EventStream(this.config.endpoint, options),\n };\n }\n\n /**\n * Make an authenticated request to the MoneyMQ API\n */\n async request<T>(\n method: 'GET' | 'POST' | 'PUT' | 'DELETE',\n path: string,\n body?: unknown,\n ): Promise<T> {\n const url = `${this.config.endpoint}${path}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.config.secret) {\n headers['Authorization'] = `Bearer ${this.config.secret}`;\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(this.config.timeout!),\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as { message?: string };\n throw new MoneyMQError(\n errorData.message || `Request failed with status ${response.status}`,\n response.status,\n errorData,\n );\n }\n\n return response.json() as Promise<T>;\n }\n}\n\n/**\n * MoneyMQ API error\n */\nexport class MoneyMQError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly raw?: unknown,\n ) {\n super(message);\n this.name = 'MoneyMQError';\n }\n}\n"],"mappings":"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","names":[]}