n8n-nodes-whatsapp
Version:
Nodes to trigger workflows from whatsapp events or send messages (using whatsapp web).
113 lines • 4.44 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;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const debug = require('debug')('n8n-nodes-whatsapp');
const events_1 = __importDefault(require("./events"));
const client_store_1 = __importDefault(require("./client-store"));
const uuid = __importStar(require("uuid"));
const util_1 = require("./util");
class TriggerRegistrationQueue {
constructor() {
this.queue = [];
this.current = null;
}
add(item) {
const isQueueEmpty = this.queue.length === 0 && this.current === null;
this.queue = [...this.queue, item];
debug(`Added item '${item}' to queue!`);
if (isQueueEmpty) {
this.startNext();
}
}
startNext() {
if (this.queue.length === 0) {
this.current = null;
return;
}
const next = this.queue[0];
this.queue = this.queue.slice(1);
debug('start next', next);
this.current = next;
}
async waitFor(item) {
return new Promise((resolve) => {
let interval;
interval = setInterval(() => {
if (this.current === item) {
clearInterval(interval);
resolve();
}
}, 250);
});
}
}
class TriggerStore {
constructor() {
this._queue = new TriggerRegistrationQueue();
this._triggers = [];
this._clientStore = client_store_1.default;
}
async createClient(credential) {
const client = await this._clientStore.create(credential, false);
for (const event of events_1.default) {
client.on(event, (data) => {
debug('received whatsapp event', { event, data });
const triggerWithSameEventForThisPhoneNumber = this._triggers
.filter(x => x.credential.phoneNumber === credential.phoneNumber && x.events.includes(event))
.map(x => x.trigger);
debug(`Found ${triggerWithSameEventForThisPhoneNumber.length} triggers!`);
for (const trigger of triggerWithSameEventForThisPhoneNumber) {
trigger.emit([trigger.helpers.returnJsonArray({ data: (0, util_1.prepareOutputData)(data) })]);
}
});
}
await client.initialize();
return client;
}
async register(trigger, isManualTrigger = false) {
const registrationId = uuid.v4();
this._queue.add(registrationId);
await this._queue.waitFor(registrationId);
const credential = (await trigger.getCredentials('whatsApp'));
if (!credential) {
throw new Error("Credential is missing!");
}
if (isManualTrigger || !(await this._clientStore.has(credential))) {
await this.createClient(credential);
}
const events = trigger.getNodeParameter('events', '').split(',');
this._triggers.push({ credential, events, trigger });
this._queue.startNext();
}
async unregister(trigger) {
debug('unregister trigger', trigger);
this._triggers = this._triggers.filter(x => x.trigger === trigger);
}
}
exports.default = new TriggerStore();
//# sourceMappingURL=trigger-store.js.map