Files
rpg-companion-sillytavern/src/core/events.js
T
Lucas 'Paperboy' Rose-Winters 0764bc63a1 feat(integration): extract SillyTavern event handlers to dedicated module
- Create src/systems/integration/sillytavern.js with all event handlers
- Move commitTrackerData() (deferred from Epic 1)
- Move sendPlotProgression() to plotProgression.js
- Move updateGenerationModeUI() to layout.js
- Add registerAllEvents() and unregisterAllEvents() to events.js
- Centralize event registration in index.js initialization

This completes Epic 6: Integration Layer Extraction
~340 lines extracted from index.js
index.js reduced from ~783 lines to 423 lines
2025-10-17 14:20:58 +11:00

89 lines
2.4 KiB
JavaScript

/**
* Core Events Module
* Wrapper for SillyTavern event system
*/
import { eventSource, event_types } from '../../../../../../script.js';
/**
* Register an event handler
* @param {string} eventType - Event type from event_types
* @param {Function} handler - Event handler function
*/
export function on(eventType, handler) {
eventSource.on(eventType, handler);
}
/**
* Register a one-time event handler
* @param {string} eventType - Event type from event_types
* @param {Function} handler - Event handler function
*/
export function once(eventType, handler) {
eventSource.once(eventType, handler);
}
/**
* Remove an event handler
* @param {string} eventType - Event type from event_types
* @param {Function} handler - Event handler function to remove
*/
export function off(eventType, handler) {
eventSource.off(eventType, handler);
}
/**
* Emit an event
* @param {string} eventType - Event type to emit
* @param {...*} args - Arguments to pass to handlers
*/
export function emit(eventType, ...args) {
eventSource.emit(eventType, ...args);
}
/**
* Re-export event types for convenience
*/
export { event_types };
// Store registered handlers for cleanup
const registeredHandlers = new Map();
/**
* Registers all extension event handlers
* @param {Object} handlers - Map of event types to handler functions or arrays of handler functions
* @example
* registerAllEvents({
* [event_types.MESSAGE_SENT]: onMessageSent,
* [event_types.CHAT_CHANGED]: [onCharacterChanged, updatePersonaAvatar]
* });
*/
export function registerAllEvents(handlers) {
for (const [eventType, handler] of Object.entries(handlers)) {
// Handler can be a single function or an array of functions
const handlerArray = Array.isArray(handler) ? handler : [handler];
for (const handlerFn of handlerArray) {
eventSource.on(eventType, handlerFn);
// Store for later cleanup
if (!registeredHandlers.has(eventType)) {
registeredHandlers.set(eventType, []);
}
registeredHandlers.get(eventType).push(handlerFn);
}
}
}
/**
* Unregisters all extension event handlers (for cleanup/reload)
*/
export function unregisterAllEvents() {
for (const [eventType, handlers] of registeredHandlers.entries()) {
for (const handler of handlers) {
eventSource.off(eventType, handler);
}
}
registeredHandlers.clear();
}