wailey-whatsapp-lib
Version:
A robust WhatsApp library for Node.js with support for QR code and pairing code authentication
222 lines (199 loc) • 6.07 kB
JavaScript
/**
* Wailey-library Event Handler Implementation
* (Implementare reală a gestiunii evenimentelor pentru WhatsApp Web)
*/
const { EventEmitter } = require('events');
/**
* Creates an event handler for the WhatsApp socket
* Manages events like 'connection', 'message', etc.
*/
function createEventHandler() {
// Event categories
const events = new Map();
// Core event types
const eventTypes = {
CONNECTION_UPDATE: 'connection.update',
CREDS_UPDATE: 'creds.update',
MESSAGES_UPSERT: 'messages.upsert',
MESSAGES_UPDATE: 'messages.update',
PRESENCE_UPDATE: 'presence.update',
CHATS_UPDATE: 'chats.update',
CONTACTS_UPDATE: 'contacts.update',
GROUPS_UPSERT: 'groups.upsert',
GROUPS_UPDATE: 'groups.update',
GROUP_PARTICIPANTS_UPDATE: 'group-participants.update',
QR_GENERATE: 'qr',
AUTH_CODE: 'auth.code',
CALL: 'call',
LINK_PREVIEW: 'link-preview',
BLOCKLIST_UPDATE: 'blocklist.update',
RECEIVED_PONG: 'received-pong'
};
// Create a new EventEmitter for each event type
for (const type of Object.values(eventTypes)) {
events.set(type, new EventEmitter());
}
// Create a wrapper object with event management methods
const ev = {
/**
* Register a listener for an event
*/
on(event, listener) {
const emitter = events.get(event);
if (!emitter) {
events.set(event, new EventEmitter());
}
events.get(event).on('event', listener);
return () => {
this.off(event, listener);
};
},
/**
* Remove a listener for an event
*/
off(event, listener) {
const emitter = events.get(event);
if (emitter) {
emitter.off('event', listener);
}
return this;
},
/**
* Register a one-time listener for an event
*/
once(event, listener) {
const emitter = events.get(event);
if (!emitter) {
events.set(event, new EventEmitter());
}
events.get(event).once('event', listener);
return this;
},
/**
* Emit an event (internal use)
*/
emit(event, ...args) {
const emitter = events.get(event);
if (emitter) {
return emitter.emit('event', ...args);
}
return false;
},
/**
* Remove all listeners for an event
*/
removeAllListeners(event) {
const emitter = events.get(event);
if (emitter) {
emitter.removeAllListeners('event');
}
return this;
},
/**
* Update connection state and emit event
*/
updateConnectionState(state, error) {
this.emit(eventTypes.CONNECTION_UPDATE, {
connection: state,
lastDisconnect: error ? {
error,
date: new Date()
} : undefined
});
},
/**
* Process and emit a new message event
*/
processIncomingMessage(message) {
this.emit(eventTypes.MESSAGES_UPSERT, {
messages: [message],
type: 'notify'
});
},
/**
* Process and emit a message update event
*/
processMessageUpdate(update) {
this.emit(eventTypes.MESSAGES_UPDATE, [update]);
},
/**
* Process and emit a chat update event
*/
processChatUpdate(chat, type = 'update') {
this.emit(eventTypes.CHATS_UPDATE, [{
id: chat.id,
...chat
}]);
},
/**
* Process and emit a contact update event
*/
processContactUpdate(contact, type = 'update') {
this.emit(eventTypes.CONTACTS_UPDATE, [{
id: contact.id,
...contact
}]);
},
/**
* Process and emit a group update event
*/
processGroupUpdate(group, type = 'update') {
if (type === 'create') {
this.emit(eventTypes.GROUPS_UPSERT, [group]);
} else {
this.emit(eventTypes.GROUPS_UPDATE, [{
id: group.id,
...group
}]);
}
},
/**
* Process and emit a presence update event
*/
processPresenceUpdate(presence) {
this.emit(eventTypes.PRESENCE_UPDATE, presence);
},
/**
* Process and emit a QR code for authentication
*/
processQR(qr) {
this.emit(eventTypes.CONNECTION_UPDATE, {
qr
});
},
/**
* Process and emit a pairing code event
*/
processPairingCode(code, phoneNumber) {
this.emit(eventTypes.AUTH_CODE, {
code,
phoneNumber
});
},
/**
* Process and emit a call event
*/
processCall(call) {
this.emit(eventTypes.CALL, call);
},
/**
* Process and emit a credential update event
*/
processCredentialUpdate(update) {
this.emit(eventTypes.CREDS_UPDATE, update);
},
/**
* Clean up all event listeners
*/
removeAllEvents() {
for (const emitter of events.values()) {
emitter.removeAllListeners();
}
events.clear();
}
};
return ev;
}
module.exports = {
createEventHandler
};