@unchainedshop/events
Version:
Event emitter abstraction layer for the Unchained Engine
47 lines (46 loc) • 1.63 kB
JavaScript
import { createLogger } from '@unchainedshop/logger';
const logger = createLogger('unchained:events');
const RegisteredEventsSet = new Set();
const RegisteredCallbacksSet = new Set();
let Adapter;
let HistoryAdapter;
export const EventDirector = {
registerEvents: (events) => {
if (events.length) {
events.forEach((e) => RegisteredEventsSet.add(e));
}
},
getRegisteredEvents: () => {
return Array.from(RegisteredEventsSet);
},
setEmitAdapter: (adapter) => {
Adapter = adapter;
},
getEmitAdapter: () => Adapter,
setEmitHistoryAdapter: (adapter) => {
HistoryAdapter = adapter;
},
getEmitHistoryAdapter: () => HistoryAdapter,
emit: async (eventName, data) => {
if (!RegisteredEventsSet.has(eventName))
throw new Error(`Event with ${eventName} is not registered`);
const payload = data || {};
Adapter?.publish(eventName, {
payload,
});
HistoryAdapter?.publish(eventName, {
payload,
});
logger.debug(`EventDirector -> Emitted ${eventName}`);
},
subscribe: (eventName, callback) => {
const currentSubscription = `${eventName}${callback?.toString()}`;
if (!RegisteredEventsSet.has(eventName))
throw new Error(`Event with ${eventName} is not registered`);
if (!RegisteredCallbacksSet.has(currentSubscription)) {
Adapter?.subscribe(eventName, callback);
HistoryAdapter?.subscribe(eventName, callback);
RegisteredCallbacksSet.add(currentSubscription);
}
},
};