UNPKG

n8n-nodes-whatsapp

Version:

Nodes to trigger workflows from whatsapp events or send messages (using whatsapp web).

145 lines 6.79 kB
"use strict"; 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