js/domreplay/registry.js

import EventBaseClass from './eventbaseclass';
import { ProgrammingError } from './error'

/**
 * Use this singleton to register events you want to record/replay.
 * the objects registered should extend EventBaseClass.
 * @access public
 */
class RegistrySingleton {
	static instance;

	constructor () {
		if (!this.instance) {
			this.instance = this;
			this._events = new Map()
		}
	}

	/**
	 * Register an event.
	 * Object passed should be an instance of EventBaseClass.
	 * @param {EventBaseClass} event
	 */
	registerEvent(event) {
		if (!(event instanceof EventBaseClass)) {
			throw new ProgrammingError('RegistrySingleton should only contain classes with EventBaseClass as superclass');
		}
		this._events.set(event.eventType, event);
	}

	/**
	 * Gets an event from registry by event type.
	 * @param {String} eventType
	 * @returns {String | undefined}
	 */
	getEvent(eventType) {
		return this._events.get(eventType);
	}

	/**
	 * Gets a list of events by tagname
	 * @param {String} tagname
	 * @returns {Array[]}
	 */
	getEventsByTagname(tagname) {
		let events = []
		for (let event of this._events.values()) {
			if (event.tagnames.includes(tagname)) {
				events.push(event);
			}
		}
		return events;
	}

	/**
	 * Delete an event from registry by event type.
	 * @param {String} eventType
	 */
	deleteEvent(eventType) {
		this._events.delete(eventType);
	}

	/**
	 * Clears all events from registry.
	 */
	clearAllEvents() {
		this._events.clear();
	}

	/**
	 * Gets event types in registry.
	 * @returns {IterableIterator<String>}
	 */
	getEventTypes() {
		return this._events.keys();
	}

	/**
	 * Gets tag names in registry.
	 * @returns {Array}
	 */
	getTagnames() {
		let tagnames = []
		for (let event of this._events.values()) {
			tagnames.push(...event.tagnames);
		}
		return tagnames;
	}

	/**
	 * Gets registry size
	 * @returns {number}
	 */
	get size() {
		return this._events.size;
	}

	/**
	 * Sets trail function for all events in registry.
	 * @param {function} trailFunc
	 */
	setTrailFuncForAllEventsInRegistry(trailFunc) {
		for (let event of this._events.values()) {
			event.trailFunc = trailFunc;
		}
	}

	/**
	 * Sets tracker function for all events in registry.
 	 * @param {function} trackerFunc
	 */
	setTrackerFuncForAllEventsInRegistry(trackerFunc) {
		for (let event of this._events.values()) {
			event.trackerFunc = trackerFunc
		}
	}

	/**
	 * @brief Set timing for all events in registry
	 * Usually called when slowing down or speeding up replays.
	 * @param {Number} timing - timing in ms
	 */
	setTimingForAllEventsInRegistry(timing) {
		for (let event of this._events.values()) {
			event.timing = timing;
		}
	}

	/**
	 * Sets replay speed for all events in registry
	 * 2.0 is twice as fast.
	 * @param divider 	- higher is faster, lower is slower.
	 */
	setReplaySpeedForAllEventsInRegistry(divider) {
		for (let event of this._events.values()) {
			event.replaySpeed = divider;
		}
	}
}


export default new RegistrySingleton();