n8n-nodes-zuckzapgo
Version:
n8n community nodes for ZuckZapGo - WhatsApp Multi-Device REST API
920 lines • 44.6 kB
JavaScript
"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