UNPKG

n8n-nodes-zuckzapgo

Version:

n8n community nodes for ZuckZapGo - WhatsApp Multi-Device REST API

920 lines 44.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ZuckZapGoSession = void 0; const GenericFunctions_1 = require("../GenericFunctions"); class ZuckZapGoSession { constructor() { this.description = { displayName: 'ZuckZapGo Session', name: 'zuckzapgoSession', icon: 'file:zuckzapgo.svg', group: ['transform'], version: 1, subtitle: '={{$parameter["operation"]}}', description: 'Manage WhatsApp session connections and configurations', defaults: { name: 'ZuckZapGo Session', }, inputs: ["main" /* NodeConnectionType.Main */], outputs: ["main" /* NodeConnectionType.Main */], credentials: [ { name: 'zuckzapgoApi', required: true, }, ], properties: [ { displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true, options: [ // Connection Operations { name: 'Connect', value: 'connect', description: 'Connect to WhatsApp servers', action: 'Connect to whats app', }, { name: 'Disconnect', value: 'disconnect', description: 'Disconnect from WhatsApp websocket (does not log out device)', action: 'Disconnect from whats app', }, { name: 'Logout', value: 'logout', description: 'Logout device completely', action: 'Logout from whats app', }, { name: 'Get Status', value: 'getStatus', description: 'Get current session status', action: 'Get session status', }, { name: 'Get QR Code', value: 'getQR', description: 'Get QR code for pairing', action: 'Get QR code', }, { name: 'Pair Phone', value: 'pairPhone', description: 'Pair device using phone number', action: 'Pair device by phone', }, // Proxy Configuration { name: 'Set Proxy', value: 'setProxy', description: 'Configure proxy settings', action: 'Set proxy configuration', }, // S3 Operations { name: 'Configure S3', value: 'configureS3', description: 'Configure S3 storage settings', action: 'Configure S3 storage', }, { name: 'Get S3 Configuration', value: 'getS3Config', description: 'Get current S3 configuration', action: 'Get S3 configuration', }, { name: 'Test S3 Connection', value: 'testS3Connection', action: 'Test S3 connection', }, { name: 'Delete S3 Configuration', value: 'deleteS3Config', description: 'Remove S3 configuration', action: 'Delete S3 configuration', }, // RabbitMQ Operations { name: 'Configure RabbitMQ', value: 'configureRabbitMQ', description: 'Configure RabbitMQ settings', action: 'Configure rabbit mq', }, { name: 'Get RabbitMQ Configuration', value: 'getRabbitMQConfig', description: 'Get current RabbitMQ configuration', action: 'Get rabbit mq configuration', }, { name: 'Test RabbitMQ Connection', value: 'testRabbitMQConnection', action: 'Test rabbit mq connection', }, { name: 'Delete RabbitMQ Configuration', value: 'deleteRabbitMQConfig', description: 'Remove RabbitMQ configuration', action: 'Delete rabbit mq configuration', }, // Skip Configurations { name: 'Configure Skip Media', value: 'configureSkipMedia', description: 'Configure skip media download settings', action: 'Configure skip media', }, { name: 'Get Skip Media Configuration', value: 'getSkipMediaConfig', description: 'Get skip media download configuration', action: 'Get skip media configuration', }, { name: 'Configure Skip Groups', value: 'configureSkipGroups', description: 'Configure skip groups settings', action: 'Configure skip groups', }, { name: 'Get Skip Groups Configuration', value: 'getSkipGroupsConfig', action: 'Get skip groups configuration', }, { name: 'Configure Skip Newsletters', value: 'configureSkipNewsletters', description: 'Configure skip newsletters settings', action: 'Configure skip newsletters', }, { name: 'Get Skip Newsletters Configuration', value: 'getSkipNewslettersConfig', action: 'Get skip newsletters configuration', }, { name: 'Configure Skip Broadcasts', value: 'configureSkipBroadcasts', description: 'Configure skip broadcasts settings', action: 'Configure skip broadcasts', }, { name: 'Get Skip Broadcasts Configuration', value: 'getSkipBroadcastsConfig', action: 'Get skip broadcasts configuration', }, { name: 'Configure Skip Own Messages', value: 'configureSkipOwnMessages', description: 'Configure skip own messages settings', action: 'Configure skip own messages', }, { name: 'Get Skip Own Messages Configuration', value: 'getSkipOwnMessagesConfig', action: 'Get skip own messages configuration', }, { name: 'Configure Skip Calls', value: 'configureSkipCalls', description: 'Configure skip calls settings', action: 'Configure skip calls', }, { name: 'Get Skip Calls Configuration', value: 'getSkipCallsConfig', action: 'Get skip calls configuration', }, ], default: 'getStatus', }, // Connect Parameters { displayName: 'Events to Subscribe', name: 'events', type: 'multiOptions', options: [ { name: 'All Events', value: 'All', }, { name: 'Call', value: 'Call', }, { name: 'Chat Presence', value: 'ChatPresence', }, { name: 'Connected', value: 'Connected', }, { name: 'Disconnected', value: 'Disconnected', }, { name: 'Group Info', value: 'GroupInfo', }, { name: 'History Sync', value: 'HistorySync', }, { name: 'Message', value: 'Message', }, { name: 'Presence', value: 'Presence', }, { name: 'Push Name', value: 'PushName', }, { name: 'QR Code', value: 'QR', }, { name: 'Read Receipt', value: 'ReadReceipt', }, ], default: ['All'], displayOptions: { show: { operation: ['connect'], }, }, description: 'Events to subscribe to when connecting', }, { displayName: 'Immediate Connection', name: 'immediate', type: 'boolean', default: true, displayOptions: { show: { operation: ['connect'], }, }, description: 'Whether to return immediately or wait for connection to establish', }, // Pair Phone Parameters { displayName: 'Phone Number', name: 'phone', type: 'string', default: '', placeholder: 'e.g. 5521987654321', required: true, displayOptions: { show: { operation: ['pairPhone'], }, }, description: 'Phone number to pair (without country code prefixes like +)', }, // Proxy Parameters { displayName: 'Proxy Configuration', name: 'proxyConfig', type: 'fixedCollection', typeOptions: { multipleValues: false, }, placeholder: 'Add Proxy Configuration', default: {}, displayOptions: { show: { operation: ['setProxy'], }, }, options: [ { name: 'proxy', displayName: 'Proxy Settings', values: [ { displayName: 'Enable Proxy', name: 'enable', type: 'boolean', default: false, description: 'Whether to enable or disable proxy', }, { displayName: 'Proxy URL', name: 'proxy_url', type: 'string', default: '', placeholder: 'e.g. socks5://user:pass@host:port or http://host:port', displayOptions: { show: { enable: [true], }, }, description: 'Proxy URL in format: protocol://[user:pass@]host:port', }, ], }, ], }, // S3 Configuration Parameters { displayName: 'S3 Configuration', name: 's3Config', type: 'fixedCollection', typeOptions: { multipleValues: false, }, placeholder: 'Add S3 Configuration', default: {}, displayOptions: { show: { operation: ['configureS3'], }, }, options: [ { name: 's3', displayName: 'S3 Settings', values: [ { displayName: 'Access Key', name: 'access_key', type: 'string', default: '', placeholder: 'AKIAIOSFODNN7EXAMPLE', required: true, description: 'S3 access key', }, { displayName: 'Bucket', name: 'bucket', type: 'string', default: '', placeholder: 'my-whatsapp-media', required: true, description: 'S3 bucket name', }, { displayName: 'Enable S3', name: 'enabled', type: 'boolean', default: false, description: 'Whether to enable S3 storage', }, { displayName: 'Endpoint', name: 'endpoint', type: 'string', default: 'https://s3.amazonaws.com', placeholder: 'https://s3.amazonaws.com', description: 'S3 endpoint URL', }, { displayName: 'Media Delivery', name: 'media_delivery', type: 'options', options: [ { name: 'Base64 Only', value: 'base64', }, { name: 'S3 Only', value: 's3', }, { name: 'Both Base64 and S3', value: 'both', }, ], default: 'base64', description: 'How to deliver media in webhook events', }, { displayName: 'Path Style', name: 'path_style', type: 'boolean', default: false, description: 'Whether to use path-style URLs', }, { displayName: 'Public URL', name: 'public_url', type: 'string', default: '', placeholder: 'https://cdn.example.com', description: 'Public URL prefix for accessing files', }, { displayName: 'Region', name: 'region', type: 'string', default: 'us-east-1', placeholder: 'us-east-1', description: 'S3 region', }, { displayName: 'Retention Days', name: 'retention_days', type: 'number', default: 30, description: 'Number of days to retain files before deletion', }, { displayName: 'Secret Key', name: 'secret_key', type: 'string', typeOptions: { password: true }, default: '', placeholder: 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY', required: true, description: 'S3 secret key', }, ], }, ], }, // RabbitMQ Configuration Parameters { displayName: 'RabbitMQ Configuration', name: 'rabbitmqConfig', type: 'fixedCollection', typeOptions: { multipleValues: false, }, placeholder: 'Add RabbitMQ Configuration', default: {}, displayOptions: { show: { operation: ['configureRabbitMQ'], }, }, options: [ { name: 'rabbitmq', displayName: 'RabbitMQ Settings', values: [ { displayName: 'Auto Delete', name: 'auto_delete', type: 'boolean', default: false, description: 'Whether to auto-delete when unused', }, { displayName: 'Delivery Mode', name: 'delivery_mode', type: 'options', options: [ { name: 'Non-Persistent (1)', value: 1 }, { name: 'Persistent (2)', value: 2 }, ], default: 2, description: 'Message delivery mode', }, { displayName: 'Durable', name: 'durable', type: 'boolean', default: true, description: 'Whether exchange/queue should survive server restarts', }, { displayName: 'Enable RabbitMQ', name: 'enabled', type: 'boolean', default: false, description: 'Whether to enable RabbitMQ publishing', }, { displayName: 'Events', name: 'events', type: 'string', default: 'All', placeholder: 'All or Message,ReadReceipt', description: 'Events to publish (comma-separated or \'All\')', }, { displayName: 'Exchange', name: 'exchange', type: 'string', default: '', placeholder: 'whatsapp.events', description: 'Exchange name (auto-generated if empty)', }, { displayName: 'Exchange Type', name: 'exchange_type', type: 'options', options: [ { name: 'Topic', value: 'topic', }, { name: 'Direct', value: 'direct', }, { name: 'Fanout', value: 'fanout', }, { name: 'Headers', value: 'headers', }, ], default: 'topic', required: true, description: 'Type of exchange to create', }, { displayName: 'Exclusive', name: 'exclusive', type: 'boolean', default: false, description: 'Whether queue is exclusive to this connection', }, { displayName: 'No Wait', name: 'no_wait', type: 'boolean', default: false, description: 'Whether to wait for server confirmation', }, { displayName: 'Queue', name: 'queue', type: 'string', default: '', placeholder: 'whatsapp.user.events', description: 'Queue name (auto-generated if empty)', }, { displayName: 'Queue Type', name: 'queue_type', type: 'options', options: [ { name: 'Classic', value: 'classic', }, { name: 'Quorum', value: 'quorum', }, { name: 'Stream', value: 'stream', }, ], default: 'classic', required: true, description: 'Type of queue to create', }, { displayName: 'Routing Key', name: 'routing_key', type: 'string', default: 'events.#', placeholder: 'events.#', description: 'Routing key pattern', }, { displayName: 'URL', name: 'url', type: 'string', default: 'amqp://localhost:5672', placeholder: 'amqp://user:pass@host:port/vhost', required: true, description: 'RabbitMQ connection URL', }, ], }, ], }, // Skip Media Parameters { displayName: 'Enable Skip Media', name: 'skipMediaEnabled', type: 'boolean', default: false, displayOptions: { show: { operation: ['configureSkipMedia'], }, }, description: 'Whether to skip downloading media files', }, // Skip Groups Parameters { displayName: 'Enable Skip Groups', name: 'skipGroupsEnabled', type: 'boolean', default: false, displayOptions: { show: { operation: ['configureSkipGroups'], }, }, description: 'Whether to skip processing group messages', }, // Skip Newsletters Parameters { displayName: 'Enable Skip Newsletters', name: 'skipNewslettersEnabled', type: 'boolean', default: false, displayOptions: { show: { operation: ['configureSkipNewsletters'], }, }, description: 'Whether to skip processing newsletter messages', }, // Skip Broadcasts Parameters { displayName: 'Enable Skip Broadcasts', name: 'skipBroadcastsEnabled', type: 'boolean', default: false, displayOptions: { show: { operation: ['configureSkipBroadcasts'], }, }, description: 'Whether to skip processing broadcast messages', }, // Skip Own Messages Parameters { displayName: 'Enable Skip Own Messages', name: 'skipOwnMessagesEnabled', type: 'boolean', default: false, displayOptions: { show: { operation: ['configureSkipOwnMessages'], }, }, description: 'Whether to skip processing your own sent messages', }, // Skip Calls Parameters { displayName: 'Skip Calls Configuration', name: 'skipCallsConfig', type: 'fixedCollection', typeOptions: { multipleValues: false, }, placeholder: 'Add Skip Calls Configuration', default: {}, displayOptions: { show: { operation: ['configureSkipCalls'], }, }, options: [ { name: 'skipCalls', displayName: 'Skip Calls Settings', values: [ { displayName: 'Enable Skip Calls', name: 'enabled', type: 'boolean', default: false, description: 'Whether to skip/reject incoming calls', }, { displayName: 'Reject Message', name: 'reject_message', type: 'string', default: 'Sorry, I cannot take calls at the moment.', placeholder: 'Sorry, I cannot take calls at the moment. Please send a message.', displayOptions: { show: { enabled: [true], }, }, description: 'Message to send when rejecting calls', }, { displayName: 'Reject Type', name: 'reject_type', type: 'options', options: [ { name: 'Busy', value: 'busy', }, { name: 'Declined', value: 'declined', }, { name: 'Unavailable', value: 'unavailable', }, ], default: 'busy', displayOptions: { show: { enabled: [true], }, }, description: 'Type of call rejection', }, ], }, ], }, ], }; } async execute() { const items = this.getInputData(); const returnData = []; // Define endpoint mappings const endpointMap = { // Connection operations connect: { method: 'POST', endpoint: '/session/connect' }, disconnect: { method: 'POST', endpoint: '/session/disconnect' }, logout: { method: 'POST', endpoint: '/session/logout' }, getStatus: { method: 'GET', endpoint: '/session/status' }, getQR: { method: 'GET', endpoint: '/session/qr' }, pairPhone: { method: 'POST', endpoint: '/session/pairphone' }, // Proxy setProxy: { method: 'POST', endpoint: '/session/proxy' }, // S3 operations configureS3: { method: 'POST', endpoint: '/session/s3/config' }, getS3Config: { method: 'GET', endpoint: '/session/s3/config' }, testS3Connection: { method: 'POST', endpoint: '/session/s3/test' }, deleteS3Config: { method: 'DELETE', endpoint: '/session/s3/config' }, // RabbitMQ operations configureRabbitMQ: { method: 'POST', endpoint: '/session/rabbitmq/config' }, getRabbitMQConfig: { method: 'GET', endpoint: '/session/rabbitmq/config' }, testRabbitMQConnection: { method: 'POST', endpoint: '/session/rabbitmq/test' }, deleteRabbitMQConfig: { method: 'DELETE', endpoint: '/session/rabbitmq/config' }, // Skip configurations configureSkipMedia: { method: 'POST', endpoint: '/session/skipmedia/config' }, getSkipMediaConfig: { method: 'GET', endpoint: '/session/skipmedia/config' }, configureSkipGroups: { method: 'POST', endpoint: '/session/skipgroups/config' }, getSkipGroupsConfig: { method: 'GET', endpoint: '/session/skipgroups/config' }, configureSkipNewsletters: { method: 'POST', endpoint: '/session/skipnewsletters/config' }, getSkipNewslettersConfig: { method: 'GET', endpoint: '/session/skipnewsletters/config' }, configureSkipBroadcasts: { method: 'POST', endpoint: '/session/skipbroadcasts/config' }, getSkipBroadcastsConfig: { method: 'GET', endpoint: '/session/skipbroadcasts/config' }, configureSkipOwnMessages: { method: 'POST', endpoint: '/session/skipownmessages/config' }, getSkipOwnMessagesConfig: { method: 'GET', endpoint: '/session/skipownmessages/config' }, configureSkipCalls: { method: 'POST', endpoint: '/session/skipcalls/config' }, getSkipCallsConfig: { method: 'GET', endpoint: '/session/skipcalls/config' }, }; for (let i = 0; i < items.length; i++) { try { const operation = this.getNodeParameter('operation', i); const { method, endpoint } = endpointMap[operation]; let body = {}; let responseData; // Build request body based on operation switch (operation) { case 'connect': body = { Subscribe: this.getNodeParameter('events', i), Immediate: this.getNodeParameter('immediate', i), }; break; case 'pairPhone': body = { Phone: this.getNodeParameter('phone', i), }; break; case 'setProxy': const proxyConfig = this.getNodeParameter('proxyConfig', i); if (proxyConfig.proxy && proxyConfig.proxy.length > 0) { const config = proxyConfig.proxy[0]; body = { enable: config.enable, proxy_url: config.proxy_url || '', }; } break; case 'configureS3': const s3Config = this.getNodeParameter('s3Config', i); if (s3Config.s3 && s3Config.s3.length > 0) { const config = s3Config.s3[0]; body = { enabled: config.enabled, endpoint: config.endpoint, region: config.region, bucket: config.bucket, access_key: config.access_key, secret_key: config.secret_key, path_style: config.path_style, public_url: config.public_url, media_delivery: config.media_delivery, retention_days: config.retention_days, }; } break; case 'configureRabbitMQ': const rabbitmqConfig = this.getNodeParameter('rabbitmqConfig', i); if (rabbitmqConfig.rabbitmq && rabbitmqConfig.rabbitmq.length > 0) { const config = rabbitmqConfig.rabbitmq[0]; body = { enabled: config.enabled, url: config.url, exchange: config.exchange, exchange_type: config.exchange_type, queue: config.queue, queue_type: config.queue_type, routing_key: config.routing_key, events: config.events, durable: config.durable, auto_delete: config.auto_delete, exclusive: config.exclusive, no_wait: config.no_wait, delivery_mode: config.delivery_mode, }; } break; case 'configureSkipMedia': body = { enabled: this.getNodeParameter('skipMediaEnabled', i), }; break; case 'configureSkipGroups': body = { enabled: this.getNodeParameter('skipGroupsEnabled', i), }; break; case 'configureSkipNewsletters': body = { enabled: this.getNodeParameter('skipNewslettersEnabled', i), }; break; case 'configureSkipBroadcasts': body = { enabled: this.getNodeParameter('skipBroadcastsEnabled', i), }; break; case 'configureSkipOwnMessages': body = { enabled: this.getNodeParameter('skipOwnMessagesEnabled', i), }; break; case 'configureSkipCalls': const skipCallsConfig = this.getNodeParameter('skipCallsConfig', i); console.log('Skip Calls Config:', JSON.stringify(skipCallsConfig, null, 2)); if (skipCallsConfig && skipCallsConfig.skipCalls && skipCallsConfig.skipCalls.length > 0) { const config = skipCallsConfig.skipCalls[0]; body = { enabled: config.enabled || false, reject_message: config.reject_message || 'Sorry, I cannot take calls at the moment.', reject_type: config.reject_type || 'declined', }; } else { // Fallback to ensure we always have a valid body body = { enabled: false, reject_message: 'Sorry, I cannot take calls at the moment.', reject_type: 'declined', }; } console.log('Skip Calls Body:', JSON.stringify(body, null, 2)); break; // GET operations don't need body default: break; } // Make the API request responseData = await GenericFunctions_1.zuckzapgoApiRequest.call(this, method, endpoint, body); const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } }); returnData.push(...executionData); } catch (error) { (0, GenericFunctions_1.handleErrorResponse)(error, this.getNode()); } } return [returnData]; } } exports.ZuckZapGoSession = ZuckZapGoSession; //# sourceMappingURL=ZuckZapGoSession.node.js.map