n8n-nodes-walichat
Version:
n8n plugin for WaliChat
312 lines (311 loc) • 10.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.executeSessionOperations = exports.sessionProperties = void 0;
const request_1 = require("../request");
exports.sessionProperties = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['session'],
},
},
options: [
{
name: 'Sync session',
value: 'syncSession',
description: 'Force WhatsApp session status synchronization',
},
{
name: 'Start session',
value: 'startDevice',
description: 'Force to start number session during non-operative hours',
},
{
name: 'Scan QR',
value: 'scanQR',
description: 'Get the QR image to scan for linking the WhatsApp session',
},
{
name: 'Reset session',
value: 'resetDevice',
description: 'Recreate device session, optionally deleting queued messages and stored data',
},
{
name: 'Reboot session',
value: 'rebootDevice',
description: 'Reboot the WhatsApp session without deleting data',
},
{
name: 'Get session health',
value: 'deviceHealth',
description: 'Get device session health status and information',
},
{
name: 'Request Authentication Code',
value: 'requestNumberAuthCode',
description: 'Request authentication code for WhatsApp number pairing',
},
],
default: 'deviceHealth',
},
{
displayName: 'WhatsApp Number',
name: 'device',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getDevices',
},
required: true,
default: '',
displayOptions: {
show: {
resource: ['session'],
},
},
description: 'The ID of the WhatsApp number',
},
// START DEVICE OPTIONS
{
displayName: 'Wait For Session',
name: 'wait',
type: 'boolean',
required: false,
default: false,
displayOptions: {
show: {
resource: ['session'],
operation: ['startDevice'],
},
},
description: 'Whether to wait for the device session to be available (may delay response up to 90 seconds)',
},
// SCAN QR OPTIONS
{
displayName: 'Force New QR',
name: 'force',
type: 'boolean',
required: false,
default: false,
displayOptions: {
show: {
resource: ['session'],
operation: ['scanQR'],
},
},
description: 'Whether to force destroy existing session and request a new QR code',
},
{
displayName: 'QR Encoding',
name: 'encoding',
type: 'options',
required: false,
default: 'svg',
displayOptions: {
show: {
resource: ['session'],
operation: ['scanQR'],
},
},
options: [
{ name: 'SVG (Default)', value: 'svg' },
{ name: 'JSON', value: 'json' },
{ name: 'Base64', value: 'base64' },
{ name: 'Base64 URI', value: 'base64_uri' },
{ name: 'URI', value: 'uri' },
{ name: 'Image', value: 'image' },
],
description: 'Format to return the QR image',
},
// RESET DEVICE OPTIONS
{
displayName: 'Options',
name: 'resetOptions',
type: 'collection',
placeholder: 'Add Option',
default: {},
displayOptions: {
show: {
resource: ['session'],
operation: ['resetDevice'],
},
},
options: [
{
displayName: 'Delete All Data',
name: 'data',
type: 'boolean',
default: false,
description: 'Whether to delete all stored chats/messages/contacts data',
},
{
displayName: 'Wait For Session',
name: 'wait',
type: 'boolean',
default: false,
description: 'Whether to wait for the device to be available (may delay response up to 2 minutes)',
},
{
displayName: 'Empty Queue',
name: 'emptyQueue',
type: 'boolean',
default: false,
description: 'Whether to delete all queued messages in the current device',
},
],
},
// REBOOT DEVICE OPTIONS
{
displayName: 'Options',
name: 'rebootOptions',
type: 'collection',
placeholder: 'Add Option',
default: {},
displayOptions: {
show: {
resource: ['session'],
operation: ['rebootDevice'],
},
},
options: [
{
displayName: 'Force Reboot',
name: 'force',
type: 'boolean',
default: false,
description: 'Whether to force device reboot even if already stopped',
},
{
displayName: 'Wait For Session',
name: 'wait',
type: 'boolean',
default: false,
description: 'Whether to wait for the device session to be available (may delay response up to 90 seconds)',
},
{
displayName: 'Force Sync',
name: 'sync',
type: 'boolean',
default: false,
description: 'Whether to force device sync after reboot',
},
],
},
// REQUEST NUMBER AUTH CODE OPTIONS
{
displayName: 'Force New Authentication',
name: 'force',
type: 'boolean',
required: false,
default: false,
displayOptions: {
show: {
resource: ['session'],
operation: ['requestNumberAuthCode'],
},
},
description: 'Whether to force destroy existing session and request a new auth code',
},
{
displayName: 'Phone Number',
name: 'phone',
type: 'string',
required: false,
default: '',
displayOptions: {
show: {
resource: ['session'],
operation: ['requestNumberAuthCode'],
},
},
description: 'Phone number to send the authorization code to (in E.164 format, e.g. +16001234560). Required if device was never connected.',
},
];
async function executeSessionOperations(index) {
const operation = this.getNodeParameter('operation', index);
const device = this.getNodeParameter('device', index);
// SYNC SESSION
if (operation === 'syncSession') {
return (0, request_1.request)(this, 'GET', `/devices/${device}/sync`);
}
// START DEVICE
if (operation === 'startDevice') {
const wait = this.getNodeParameter('wait', index, false);
const queryParameters = {};
if (wait) {
queryParameters.wait = 'true';
}
return (0, request_1.request)(this, 'POST', `/devices/${device}/start`, undefined, queryParameters);
}
// SCAN QR
if (operation === 'scanQR') {
const force = this.getNodeParameter('force', index, false);
const encoding = this.getNodeParameter('encoding', index, 'svg');
const queryParameters = {};
if (force) {
queryParameters.force = 'true';
}
if (encoding !== 'svg') {
queryParameters.encoding = encoding;
}
// For SVG responses, we need to set the Accept header to indicate we want SVG
const customHeaders = {};
if (encoding === 'svg') {
customHeaders['Accept'] = 'image/svg+xml';
}
return (0, request_1.request)(this, 'GET', `/devices/${device}/scan`, undefined, queryParameters, customHeaders);
}
// RESET DEVICE
if (operation === 'resetDevice') {
const resetOptions = this.getNodeParameter('resetOptions', index, {});
const queryParameters = {};
if (resetOptions.data) {
queryParameters.data = 'true';
}
if (resetOptions.wait) {
queryParameters.wait = 'true';
}
if (resetOptions.emptyQueue) {
queryParameters.emptyQueue = 'true';
}
return (0, request_1.request)(this, 'POST', `/devices/${device}/reset`, undefined, queryParameters);
}
// REBOOT DEVICE
if (operation === 'rebootDevice') {
const rebootOptions = this.getNodeParameter('rebootOptions', index, {});
const queryParameters = {};
if (rebootOptions.force) {
queryParameters.force = 'true';
}
if (rebootOptions.wait) {
queryParameters.wait = 'true';
}
if (rebootOptions.sync) {
queryParameters.sync = 'true';
}
return (0, request_1.request)(this, 'POST', `/devices/${device}/reboot`, undefined, queryParameters);
}
// DEVICE HEALTH
if (operation === 'deviceHealth') {
return (0, request_1.request)(this, 'GET', `/devices/${device}/health`);
}
// REQUEST NUMBER AUTH CODE
if (operation === 'requestNumberAuthCode') {
const force = this.getNodeParameter('force', index, false);
const phone = this.getNodeParameter('phone', index, '');
const queryParameters = {};
if (force) {
queryParameters.force = 'true';
}
const body = {};
if (phone) {
body.phone = phone;
}
return (0, request_1.request)(this, 'POST', `/devices/${device}/authcode`, Object.keys(body).length ? body : undefined, queryParameters);
}
throw new Error(`The operation "${operation}" is not supported for session!`);
}
exports.executeSessionOperations = executeSessionOperations;