vue3-stripe-kit
Version:
Complete Vue 3 Stripe integration with Payment Elements, Checkout, Subscriptions. TypeScript support, composables, components, modular architecture for payments, billing, and e-commerce
1 lines • 26.7 kB
Source Map (JSON)
{"version":3,"file":"useWebhooks-CEsHK4en.mjs","sources":["../src/composables/useWebhooks.ts"],"sourcesContent":["import { ref, onUnmounted } from 'vue'\nimport type { \n UseWebhooksReturn,\n WebhookConfig,\n WebhookEvent,\n WebhookEndpoint,\n WebhookEventHandler,\n WebhookEventType,\n WebhookStats,\n StripeError \n} from '../types/index'\nimport { getGlobalConfig, buildRequestHeaders } from '../utils/config'\n\nexport function useWebhooks(config: Partial<WebhookConfig> = {}): UseWebhooksReturn {\n const loading = ref(false)\n const error = ref<StripeError | null>(null)\n const events = ref<WebhookEvent[]>([])\n const stats = ref<WebhookStats>({\n totalEvents: 0,\n successfulEvents: 0,\n failedEvents: 0,\n eventsByType: {} as Record<WebhookEventType, number>\n })\n const isMonitoring = ref(false)\n\n // Get global configuration and merge with local config\n const globalConfig = getGlobalConfig()\n const mergedConfig = { ...globalConfig, ...config }\n\n // Event handlers registry\n const eventHandlers = new Map<WebhookEventType, WebhookEventHandler>()\n let monitoringInterval: number | null = null\n\n // Default endpoints (configurable)\n const getEndpoint = (key: keyof WebhookConfig, defaultPath: string, webhookConfig?: Partial<WebhookConfig>) => {\n const finalConfig = { ...mergedConfig, ...webhookConfig }\n const endpoint = finalConfig[key]\n \n if (typeof endpoint === 'string') {\n return endpoint\n }\n \n // Build URL from base URL + path\n if (finalConfig.apiBaseUrl) {\n return `${finalConfig.apiBaseUrl}${defaultPath}`\n }\n \n // Fallback to just the path\n return defaultPath\n }\n\n // Generic API request handler\n const makeRequest = async <T>(\n endpoint: string,\n options: RequestInit,\n retries = 3\n ): Promise<T> => {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), mergedConfig.requestTimeout || 30000)\n\n try {\n const response = await fetch(endpoint, {\n ...options,\n signal: controller.signal,\n headers: buildRequestHeaders(mergedConfig, options.headers as Record<string, string>)\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ message: 'Request failed' }))\n throw {\n type: 'api_error',\n code: response.status.toString(),\n message: errorData.message || `HTTP ${response.status}`,\n } as StripeError\n }\n\n return await response.json()\n } catch (err: any) {\n clearTimeout(timeoutId)\n \n if (err.name === 'AbortError') {\n throw {\n type: 'timeout_error',\n message: 'Request timeout',\n } as StripeError\n }\n\n if (retries > 0 && !err.type) {\n await new Promise(resolve => setTimeout(resolve, 1000 * (4 - retries)))\n return makeRequest(endpoint, options, retries - 1)\n }\n\n throw err\n }\n }\n\n // ===== WEBHOOK ENDPOINT MANAGEMENT =====\n\n const createWebhookEndpoint = async (\n url: string,\n enabledEvents: WebhookEventType[],\n webhookConfig?: Partial<WebhookConfig>\n ): Promise<WebhookEndpoint> => {\n loading.value = true\n error.value = null\n\n try {\n const endpoint = getEndpoint('createWebhookEndpoint', '/api/stripe/webhook_endpoints', webhookConfig)\n \n const payload = {\n url,\n enabled_events: enabledEvents,\n description: `Webhook endpoint for ${url}`,\n metadata: {}\n }\n\n const result = await makeRequest<WebhookEndpoint>(endpoint, {\n method: 'POST',\n body: JSON.stringify(payload)\n })\n\n return result\n } catch (err: any) {\n error.value = err\n throw err\n } finally {\n loading.value = false\n }\n }\n\n const updateWebhookEndpoint = async (\n endpointId: string,\n updates: Partial<WebhookEndpoint>,\n webhookConfig?: Partial<WebhookConfig>\n ): Promise<WebhookEndpoint> => {\n loading.value = true\n error.value = null\n\n try {\n const endpoint = getEndpoint('updateWebhookEndpoint', `/api/stripe/webhook_endpoints/${endpointId}`, webhookConfig)\n \n const result = await makeRequest<WebhookEndpoint>(endpoint, {\n method: 'PATCH',\n body: JSON.stringify(updates)\n })\n\n return result\n } catch (err: any) {\n error.value = err\n throw err\n } finally {\n loading.value = false\n }\n }\n\n const deleteWebhookEndpoint = async (\n endpointId: string,\n webhookConfig?: Partial<WebhookConfig>\n ): Promise<void> => {\n loading.value = true\n error.value = null\n\n try {\n const endpoint = getEndpoint('deleteWebhookEndpoint', `/api/stripe/webhook_endpoints/${endpointId}`, webhookConfig)\n \n await makeRequest<void>(endpoint, {\n method: 'DELETE'\n })\n } catch (err: any) {\n error.value = err\n throw err\n } finally {\n loading.value = false\n }\n }\n\n const listWebhookEndpoints = async (\n webhookConfig?: Partial<WebhookConfig>\n ): Promise<WebhookEndpoint[]> => {\n loading.value = true\n error.value = null\n\n try {\n const endpoint = getEndpoint('listWebhookEndpoint', '/api/stripe/webhook_endpoints', webhookConfig)\n \n const result = await makeRequest<{ data: WebhookEndpoint[] }>(endpoint, {\n method: 'GET'\n })\n\n return result.data\n } catch (err: any) {\n error.value = err\n throw err\n } finally {\n loading.value = false\n }\n }\n\n // ===== EVENT MONITORING =====\n\n const fetchEvents = async (\n limit = 100,\n webhookConfig?: Partial<WebhookConfig>\n ): Promise<WebhookEvent[]> => {\n loading.value = true\n error.value = null\n\n try {\n const endpoint = getEndpoint('listEventsEndpoint', '/api/stripe/events', webhookConfig)\n const queryParams = new URLSearchParams({ limit: limit.toString() })\n\n const result = await makeRequest<{ data: WebhookEvent[] }>(`${endpoint}?${queryParams}`, {\n method: 'GET'\n })\n\n // Update events and stats\n events.value = result.data\n updateStats(result.data)\n\n return result.data\n } catch (err: any) {\n error.value = err\n throw err\n } finally {\n loading.value = false\n }\n }\n\n const fetchEvent = async (\n eventId: string,\n webhookConfig?: Partial<WebhookConfig>\n ): Promise<WebhookEvent> => {\n loading.value = true\n error.value = null\n\n try {\n const endpoint = getEndpoint('retrieveEventEndpoint', `/api/stripe/events/${eventId}`, webhookConfig)\n \n const result = await makeRequest<WebhookEvent>(endpoint, {\n method: 'GET'\n })\n\n return result\n } catch (err: any) {\n error.value = err\n throw err\n } finally {\n loading.value = false\n }\n }\n\n const resendEvent = async (\n eventId: string,\n endpointId: string,\n webhookConfig?: Partial<WebhookConfig>\n ): Promise<void> => {\n loading.value = true\n error.value = null\n\n try {\n const endpoint = getEndpoint('resendEventEndpoint', `/api/stripe/events/${eventId}/resend`, webhookConfig)\n \n await makeRequest<void>(endpoint, {\n method: 'POST',\n body: JSON.stringify({ endpoint_id: endpointId })\n })\n } catch (err: any) {\n error.value = err\n throw err\n } finally {\n loading.value = false\n }\n }\n\n // ===== REAL-TIME MONITORING =====\n\n const startMonitoring = (webhookConfig?: Partial<WebhookConfig>) => {\n if (isMonitoring.value) return\n\n const finalConfig = { ...mergedConfig, ...webhookConfig }\n const interval = finalConfig.pollingInterval || 5000 // Default 5 seconds\n\n isMonitoring.value = true\n \n monitoringInterval = window.setInterval(async () => {\n try {\n const newEvents = await fetchEvents(finalConfig.maxEvents || 50, webhookConfig)\n \n // Process new events with registered handlers\n newEvents.forEach(event => {\n const handler = eventHandlers.get(event.type)\n if (handler) {\n try {\n handler.handler(event)\n } catch (error) {\n console.error(`Error in webhook handler for ${event.type}:`, error)\n }\n }\n })\n } catch (error) {\n console.error('Error fetching webhook events:', error)\n }\n }, interval)\n\n console.log('✅ Webhook monitoring started with interval:', interval)\n }\n\n const stopMonitoring = () => {\n if (monitoringInterval) {\n clearInterval(monitoringInterval)\n monitoringInterval = null\n }\n isMonitoring.value = false\n console.log('⏹️ Webhook monitoring stopped')\n }\n\n // ===== EVENT HANDLERS =====\n\n const registerEventHandler = (handler: WebhookEventHandler) => {\n eventHandlers.set(handler.eventType, handler)\n console.log(`✅ Registered webhook handler for ${handler.eventType}`)\n }\n\n const unregisterEventHandler = (eventType: WebhookEventType) => {\n eventHandlers.delete(eventType)\n console.log(`❌ Unregistered webhook handler for ${eventType}`)\n }\n\n const clearEventHandlers = () => {\n eventHandlers.clear()\n console.log('🗑️ Cleared all webhook handlers')\n }\n\n // ===== TESTING & DEBUGGING =====\n\n const simulateEvent = async (\n eventType: WebhookEventType,\n testData?: any\n ): Promise<WebhookEvent> => {\n const simulatedEvent: WebhookEvent = {\n id: `evt_test_${Date.now()}`,\n object: 'event',\n type: eventType,\n created: Math.floor(Date.now() / 1000),\n data: {\n object: testData || generateTestData(eventType)\n },\n livemode: false,\n pending_webhooks: 0\n }\n\n // Add to events list\n events.value.unshift(simulatedEvent)\n updateStats([...events.value])\n\n // Trigger handler if registered\n const handler = eventHandlers.get(eventType)\n if (handler) {\n await handler.handler(simulatedEvent)\n }\n\n console.log('🧪 Simulated webhook event:', eventType)\n return simulatedEvent\n }\n\n const testWebhookEndpoint = async (\n endpointId: string,\n eventType: WebhookEventType\n ): Promise<boolean> => {\n try {\n loading.value = true\n const testEvent = await simulateEvent(eventType)\n await resendEvent(testEvent.id, endpointId)\n return true\n } catch (error) {\n console.error('Webhook endpoint test failed:', error)\n return false\n } finally {\n loading.value = false\n }\n }\n\n const validateWebhookSignature = (\n payload: string,\n signature: string,\n secret: string\n ): boolean => {\n try {\n // Basic HMAC validation (in real implementation would use crypto)\n const expectedSignature = `sha256=${btoa(payload + secret)}`\n return signature === expectedSignature\n } catch (error) {\n console.error('Signature validation error:', error)\n return false\n }\n }\n\n // ===== UTILITY FUNCTIONS =====\n\n const updateStats = (eventList: WebhookEvent[]) => {\n const newStats: WebhookStats = {\n totalEvents: eventList.length,\n successfulEvents: eventList.filter(e => !e.type.includes('failed')).length,\n failedEvents: eventList.filter(e => e.type.includes('failed')).length,\n lastEventTime: eventList.length > 0 ? eventList[0].created : undefined,\n eventsByType: {} as Record<WebhookEventType, number>\n }\n\n // Count events by type\n eventList.forEach(event => {\n newStats.eventsByType[event.type] = (newStats.eventsByType[event.type] || 0) + 1\n })\n\n stats.value = newStats\n }\n\n const clearEvents = () => {\n events.value = []\n stats.value = {\n totalEvents: 0,\n successfulEvents: 0,\n failedEvents: 0,\n eventsByType: {} as Record<WebhookEventType, number>\n }\n }\n\n const exportEvents = (format: 'json' | 'csv'): string => {\n if (format === 'json') {\n return JSON.stringify(events.value, null, 2)\n }\n \n // CSV format\n const headers = ['ID', 'Type', 'Created', 'Live Mode', 'Pending Webhooks']\n const rows = events.value.map(event => [\n event.id,\n event.type,\n new Date(event.created * 1000).toISOString(),\n event.livemode,\n event.pending_webhooks\n ])\n \n return [headers, ...rows].map(row => row.join(',')).join('\\n')\n }\n\n const filterEvents = (filter: { \n type?: WebhookEventType\n dateFrom?: Date\n dateTo?: Date \n }): WebhookEvent[] => {\n return events.value.filter(event => {\n if (filter.type && event.type !== filter.type) return false\n if (filter.dateFrom && event.created < filter.dateFrom.getTime() / 1000) return false\n if (filter.dateTo && event.created > filter.dateTo.getTime() / 1000) return false\n return true\n })\n }\n\n // Generate test data for different event types\n const generateTestData = (eventType: WebhookEventType): any => {\n const baseData = {\n id: `test_${Date.now()}`,\n object: eventType.split('.')[0],\n created: Math.floor(Date.now() / 1000),\n livemode: false\n }\n\n switch (eventType) {\n case 'customer.subscription.created':\n return {\n ...baseData,\n object: 'subscription',\n status: 'active',\n customer: 'cus_test123'\n }\n case 'invoice.payment_succeeded':\n return {\n ...baseData,\n object: 'invoice',\n status: 'paid',\n amount_paid: 1000,\n currency: 'usd'\n }\n default:\n return baseData\n }\n }\n\n // Cleanup on unmount\n onUnmounted(() => {\n stopMonitoring()\n })\n\n return {\n // State\n loading,\n error,\n events,\n stats,\n isMonitoring,\n\n // Webhook endpoint management\n createWebhookEndpoint,\n updateWebhookEndpoint,\n deleteWebhookEndpoint,\n listWebhookEndpoints,\n\n // Event monitoring\n startMonitoring,\n stopMonitoring,\n fetchEvents,\n fetchEvent,\n resendEvent,\n\n // Event handlers\n registerEventHandler,\n unregisterEventHandler,\n clearEventHandlers,\n\n // Testing & debugging\n simulateEvent,\n testWebhookEndpoint,\n validateWebhookSignature,\n\n // Utility functions\n clearEvents,\n exportEvents,\n filterEvents\n }\n}"],"names":["error"],"mappings":"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"}