vibetunnel/web/src/shared/suppress-xterm-errors.ts

108 lines
3.3 KiB
TypeScript

/**
* Shared module to suppress xterm.js parsing errors in both client and server environments
*
* This module provides a unified way to suppress noisy xterm.js parsing errors that occur
* when the terminal encounters unsupported or proprietary escape sequences. These errors
* are harmless but create significant console noise.
*
* Usage: Import and call suppressXtermErrors() at the very beginning of your entry point
*/
// Type declaration for our global flag
// Type declarations for the suppression flag
// We use 'any' type for globalObj to avoid TypeScript errors in different environments
declare global {
namespace NodeJS {
interface Global {
__xtermErrorsSuppressed?: boolean;
}
}
}
// Browser Window interface is extended conditionally at runtime
/**
* Suppresses xterm.js parsing errors by overriding console methods
* Works in both Node.js and browser environments
*/
export function suppressXtermErrors(): void {
// Detect environment
const isNode = typeof process !== 'undefined' && process.versions?.node;
const globalObj = (isNode ? global : typeof globalThis !== 'undefined' ? globalThis : global) as {
__xtermErrorsSuppressed?: boolean;
};
// Check if already suppressed to avoid multiple overrides
if (globalObj.__xtermErrorsSuppressed) {
return;
}
// Mark as suppressed
globalObj.__xtermErrorsSuppressed = true;
// Store original console methods
const originalError = console.error;
const originalWarn = console.warn;
// Override console.error
console.error = (...args: unknown[]) => {
if (shouldSuppressError(args)) {
return; // Suppress xterm.js parsing errors
}
originalError.apply(console, args);
};
// Override console.warn
console.warn = (...args: unknown[]) => {
if (shouldSuppressError(args)) {
return; // Suppress xterm.js parsing warnings
}
originalWarn.apply(console, args);
};
// Log suppression activation in debug mode
if (isNode && process.env.VIBETUNNEL_DEBUG === '1') {
originalWarn.call(console, '[suppress-xterm-errors] xterm.js error suppression activated');
}
}
/**
* Checks if the given console arguments represent an xterm.js parsing error
*/
function shouldSuppressError(args: unknown[]): boolean {
if (!args[0] || typeof args[0] !== 'string') {
return false;
}
const message = args[0];
// Check for xterm.js parsing errors
if (message.includes('xterm.js: Parsing error:')) {
return true;
}
// Also suppress related parsing errors that might come from xterm
if (message.includes('Unable to process character') && message.includes('xterm')) {
return true;
}
return false;
}
/**
* Restore original console methods (useful for testing)
*/
export function restoreConsole(): void {
// This would need to store the originals somewhere accessible
// For now, this is a placeholder for potential future use
const isNode = typeof process !== 'undefined' && process.versions?.node;
const globalObj = (isNode ? global : typeof globalThis !== 'undefined' ? globalThis : global) as {
__xtermErrorsSuppressed?: boolean;
};
if (globalObj.__xtermErrorsSuppressed) {
delete globalObj.__xtermErrorsSuppressed;
// Note: We can't actually restore without storing the originals globally
// This function is mainly here for API completeness
}
}