@digicms/cms
Version:
An open source headless CMS solution to create and manage your own API. It provides a powerful dashboard and features to make your life easier. Databases supported: MySQL, MariaDB, PostgreSQL, SQLite
79 lines (65 loc) • 1.88 kB
JavaScript
;
/**
* The event hub is Strapi's event control center.
*/
module.exports = function createEventHub() {
const listeners = new Map();
// Default subscriber to easily add listeners with the on() method
const defaultSubscriber = async (eventName, ...args) => {
if (listeners.has(eventName)) {
for (const listener of listeners.get(eventName)) {
await listener(...args);
}
}
};
// Store of subscribers that will be called when an event is emitted
const subscribers = [defaultSubscriber];
const eventHub = {
async emit(eventName, ...args) {
for (const subscriber of subscribers) {
await subscriber(eventName, ...args);
}
},
subscribe(subscriber) {
subscribers.push(subscriber);
// Return a function to remove the subscriber
return () => {
eventHub.unsubscribe(subscriber);
};
},
unsubscribe(subscriber) {
subscribers.splice(subscribers.indexOf(subscriber), 1);
},
on(eventName, listener) {
if (!listeners.has(eventName)) {
listeners.set(eventName, [listener]);
} else {
listeners.get(eventName).push(listener);
}
// Return a function to remove the listener
return () => {
eventHub.off(eventName, listener);
};
},
off(eventName, listener) {
listeners.get(eventName).splice(listeners.get(eventName).indexOf(listener), 1);
},
once(eventName, listener) {
return eventHub.on(eventName, async (...args) => {
eventHub.off(eventName, listener);
return listener(...args);
});
},
destroy() {
listeners.clear();
subscribers.length = 0;
return this;
},
};
return {
...eventHub,
removeListener: eventHub.off,
removeAllListeners: eventHub.destroy,
addListener: eventHub.on,
};
};