Source: utils/handlers.js

import pagedMediaHandlers from "../modules/paged-media/index.js";
import generatedContentHandlers from "../modules/generated-content/index.js";
import filters from "../modules/filters/index.js";
import EventEmitter from "event-emitter";
import pipe from "event-emitter/pipe.js";

/**
 * Array of all registered handler classes, composed from different modules.
 * @type {Array<Function>}
 */
export let registeredHandlers = [
	...pagedMediaHandlers,
	...generatedContentHandlers,
	...filters,
];

/**
 * Class responsible for instantiating and managing handler instances.
 * Emits events from all handlers through itself.
 */
export class Handlers {
	/**
	 * Creates a new Handlers manager.
	 * @param {Object} chunker - The chunker object used by handlers.
	 * @param {Object} polisher - The polisher object used by handlers.
	 * @param {Object} caller - The caller object used by handlers.
	 */
	constructor(chunker, polisher, caller) {
		/** @private @type {Array<Object>} */
		this.handlers = [];

		registeredHandlers.forEach((Handler) => {
			const handler = new Handler(chunker, polisher, caller);
			this.handlers.push(handler);
			pipe(handler, this);
		});
	}
}

// Mix event-emitter methods into Handlers prototype
EventEmitter(Handlers.prototype);

/**
 * Adds new handler classes to the list of registered handlers.
 * @param {...Function} handlers - One or more handler classes to register.
 */
export function registerHandlers(...handlers) {
	registeredHandlers.push(...handlers);
}

/**
 * Creates and initializes a new Handlers instance.
 * @param {Object} chunker - The chunker object to pass to handlers.
 * @param {Object} polisher - The polisher object to pass to handlers.
 * @param {Object} caller - The caller object to pass to handlers.
 * @returns {Handlers} The initialized Handlers instance.
 */
export function initializeHandlers(chunker, polisher, caller) {
	return new Handlers(chunker, polisher, caller);
}