n8n-nodes-whatsapp
Version:
Nodes to trigger workflows from whatsapp events or send messages (using whatsapp web).
145 lines • 6.79 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ClientStore = void 0;
const debug = require('debug')('n8n-nodes-whatsapp');
const qrcode = require('qrcode-terminal');
const WhatsAppWeb = __importStar(require("whatsapp-web.js"));
const util_1 = require("./util");
const { MongoStore } = require('wwebjs-mongo');
const mongoose = require('mongoose');
class ClientStore {
constructor() {
this._queue = [];
this._clients = new Map();
}
async createAuthStrategy(credential) {
debug(`create auth strategy '${credential.authStrategy} for '${credential.phoneNumber}'`);
const clientId = (0, util_1.preparePhoneNumber)(credential.phoneNumber);
switch (credential.authStrategy) {
case 'local':
return Promise.resolve(new WhatsAppWeb.LocalAuth({ clientId: clientId }));
case 'mongodb':
await mongoose.connect(credential.mongoConnectionString);
debug(credential.mongoConnectionString);
const mongoStore = new MongoStore({ mongoose: mongoose });
return Promise.resolve(new WhatsAppWeb.RemoteAuth({
clientId,
store: mongoStore,
backupSyncIntervalMs: 1000 * 60 * 5
}));
default:
throw new Error(`AuthStrategy '${credential.authStrategy}' is not supported!'`);
}
}
async create(credential, initialize = false) {
const preparedPhoneNumber = (0, util_1.preparePhoneNumber)(credential.phoneNumber);
if (this._queue.includes(preparedPhoneNumber)) {
debug(`Creating client for phone number '${preparedPhoneNumber}' is already queued!`);
return new Promise((resolve) => {
let interval;
interval = setInterval(async () => {
if (await this.has(credential)) {
debug(`Use already created client for phone number '${preparedPhoneNumber}'`);
clearInterval(interval);
const client = await this.get(credential);
debug('Wait until client has been authenticated before using client');
client.once('authenticated', () => {
debug('client has been authenticated!');
resolve(client);
});
return;
}
debug(`Client still not created for phone number '${preparedPhoneNumber}'...`);
}, 500);
});
}
this._queue.push(preparedPhoneNumber);
debug(`Create client for phone number '${preparedPhoneNumber}'`);
const client = new WhatsAppWeb.Client({
takeoverOnConflict: true,
puppeteer: {
headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox']
},
authStrategy: await this.createAuthStrategy(credential)
});
client.on('qr', (qr) => qrcode.generate(qr, { small: true }));
client.on('auth_failure', (message) => debug('client authentication failed!', { message }));
client.on('authenticated', (session) => debug(`client authenticated!`, { session }));
client.on('remote_session_saved', () => debug('remote session saved!'));
this._clients.set((0, util_1.preparePhoneNumber)(credential.phoneNumber), client);
if (initialize) {
client.initialize();
return new Promise((resolve) => {
let isClientReady = false;
let isSessionSaved = false;
let hasQrEventBeenTriggered = false;
debug({ isClientReady, isSessionSaved });
const resolveIfInitialized = () => {
let canBeResolved = isClientReady;
if (isClientReady && hasQrEventBeenTriggered && credential.authStrategy != 'local') {
canBeResolved = canBeResolved && isSessionSaved;
if (!isSessionSaved) {
debug('wait until session is saved because the client was authenticated for the first time!');
}
}
if (!canBeResolved) {
debug('Not all requirements met to resolve client!');
return;
}
debug('Client is ready and saved the session!');
this._queue = this._queue.filter(x => x === preparedPhoneNumber);
resolve(client);
};
client.once('ready', () => {
isClientReady = true;
resolveIfInitialized();
});
client.once('qr', () => {
hasQrEventBeenTriggered = true;
resolveIfInitialized();
});
client.once('remote_session_saved', () => {
isSessionSaved = true;
resolveIfInitialized();
});
});
}
this._queue = this._queue.filter(x => x === preparedPhoneNumber);
return client;
}
async has(credential) {
debug(this._clients.keys());
return Promise.resolve(this._clients.has((0, util_1.preparePhoneNumber)(credential.phoneNumber)));
}
;
async get(credential) {
return Promise.resolve(this._clients.get((0, util_1.preparePhoneNumber)(credential.phoneNumber)));
}
}
exports.ClientStore = ClientStore;
exports.default = new ClientStore();
//# sourceMappingURL=client-store.js.map