eventAdapter.js

Code Hygiene Score: 100

Keine Issues gefunden.

Funktionen 1

Code

/**
 * Event Adapter
 * Contract: js-browser-architecture-contract_v2.yaml
 *
 * Wraps event listener registration with withBoundary error handling.
 * All event handlers must be wrapped to catch and log errors.
 */

/**
 * Wraps an event handler with error boundary.
 * @param {Function} handler - The event handler function
 * @param {Object} meta - Metadata for error logging
 * @param {string} meta.code - Error code identifier
 * @param {string} meta.featureKey - Feature key for disabling on error
 * @param {Object} meta.ui - Injected UI dependency
 * @param {Object} meta.logger - Injected logger dependency
 * @param {string} meta.runId - Run ID for tracing
 * @returns {Function} Wrapped handler
 */
export function withBoundary(handler, meta) {
  return function wrappedHandler(event) {
    try {
      return handler(event);
    } catch (error) {
      const logEntry = {
        level: "error",
        code: meta.code,
        message: error.message,
        runId: meta.runId,
        context: {
          featureKey: meta.featureKey,
          eventType: event.type,
          target: event.target?.tagName
        },
        error: error.stack
      };

      if (meta.logger !== undefined && meta.logger !== null) {
        meta.logger.error(logEntry);
      }

      if (meta.ui !== undefined && meta.ui !== null && typeof meta.ui.showMessage === "function") {
        meta.ui.showMessage({
          type: "error",
          text: "Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut."
        });
      }
    }
  };
}

/**
 * Event Adapter - wraps addEventListener with withBoundary
 */
export const eventAdapter = {
  /**
   * Adds an event listener with error boundary.
   * @param {Element} element - Target element
   * @param {string} eventType - Event type (click, input, etc.)
   * @param {Function} handler - Event handler
   * @param {Object} deps - Injected dependencies
   * @param {string} code - Error code for logging
   * @param {string} featureKey - Feature key for the component
   * @returns {Function} Cleanup function to remove listener
   */
  on: (element, eventType, handler, deps, code, featureKey) => {
    const wrappedHandler = withBoundary(handler, {
      code: code,
      featureKey: featureKey,
      ui: deps.ui,
      logger: deps.logger,
      runId: deps.runId
    });

    element.addEventListener(eventType, wrappedHandler);

    return () => element.removeEventListener(eventType, wrappedHandler);
  }
};
← Übersicht