llm-stream-parser
Version:
A TypeScript library for parsing and processing structured data from LLM streaming responses with custom tag definitions and event-driven architecture
104 lines (91 loc) • 3.45 kB
text/typescript
/**
* Configuration types for LLM Stream Parser
*/
import { ParserError } from './errors';
/**
* Configuration options for the parser
*/
export interface ParserConfig {
/** Whether tag names are case sensitive (default: false) */
caseSensitive?: boolean;
/** Whether to trim whitespace from content (default: true) */
trimWhitespace?: boolean;
/** Maximum buffer size in bytes (default: 1MB) */
maxBufferSize?: number;
/** Whether to preserve attributes order (default: false) */
preserveAttributeOrder?: boolean;
/** Custom error handler for parsing errors */
errorHandler?: ((error: ParserError) => void) | undefined;
// Enhanced options for nested parsing
/** Maximum nesting depth (default: 50) */
maxDepth?: number;
/** Whether to preserve whitespace in nested content (default: false) */
preserveWhitespace?: boolean;
/** Whether to auto-close unclosed tags at EOF (default: true) */
autoCloseUnclosed?: boolean;
/** Enable nested parsing mode (default: false for backward compatibility) */
enableNested?: boolean;
}
/**
* Required configuration with all defaults applied
*/
export interface RequiredParserConfig {
caseSensitive: boolean;
trimWhitespace: boolean;
maxBufferSize: number;
preserveAttributeOrder: boolean;
errorHandler: ((error: ParserError) => void) | undefined;
maxDepth: number;
preserveWhitespace: boolean;
autoCloseUnclosed: boolean;
enableNested: boolean;
}
/**
* Default configuration values
*/
export const DEFAULT_CONFIG: RequiredParserConfig = {
caseSensitive: false,
trimWhitespace: true,
maxBufferSize: 1024 * 1024, // 1MB
preserveAttributeOrder: false,
errorHandler: undefined,
maxDepth: 50,
preserveWhitespace: false,
autoCloseUnclosed: true,
enableNested: false,
};
/**
* Merge user config with defaults
*/
export function mergeConfig(config: ParserConfig = {}): RequiredParserConfig {
return {
caseSensitive: config.caseSensitive ?? DEFAULT_CONFIG.caseSensitive,
trimWhitespace: config.trimWhitespace ?? DEFAULT_CONFIG.trimWhitespace,
maxBufferSize: config.maxBufferSize ?? DEFAULT_CONFIG.maxBufferSize,
preserveAttributeOrder: config.preserveAttributeOrder ?? DEFAULT_CONFIG.preserveAttributeOrder,
errorHandler: config.errorHandler ?? DEFAULT_CONFIG.errorHandler,
maxDepth: config.maxDepth ?? DEFAULT_CONFIG.maxDepth,
preserveWhitespace: config.preserveWhitespace ?? DEFAULT_CONFIG.preserveWhitespace,
autoCloseUnclosed: config.autoCloseUnclosed ?? DEFAULT_CONFIG.autoCloseUnclosed,
enableNested: config.enableNested ?? DEFAULT_CONFIG.enableNested,
};
}
/**
* Validate configuration
*/
export function validateConfig(config: ParserConfig): string[] {
const errors: string[] = [];
if (config.maxBufferSize !== undefined && config.maxBufferSize <= 0) {
errors.push('maxBufferSize must be greater than 0');
}
if (config.maxDepth !== undefined && config.maxDepth <= 0) {
errors.push('maxDepth must be greater than 0');
}
if (config.maxBufferSize !== undefined && config.maxBufferSize > 100 * 1024 * 1024) {
errors.push('maxBufferSize should not exceed 100MB for performance reasons');
}
if (config.maxDepth !== undefined && config.maxDepth > 1000) {
errors.push('maxDepth should not exceed 1000 for performance reasons');
}
return errors;
}