UNPKG

plug-n-play-ws

Version:

A plug-and-play WebSocket layer on top of Socket.IO with full TypeScript support, zero manual wiring, and production-ready features

1 lines 62.2 kB
{"version":3,"sources":["../../src/types.ts","../../src/utils/text-processing.ts","../../src/adapters/base-search.ts","../../src/adapters/memory.ts","../../src/server/index.ts"],"names":["SocketIOServer"],"mappings":"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","file":"index.mjs","sourcesContent":["// Core types and interfaces for the plug-n-play-ws package\r\n\r\nimport { z } from 'zod';\r\n\r\n/**\r\n * Base event schema for type-safe messaging\r\n */\r\nexport interface BaseEvent {\r\n type: string;\r\n payload?: unknown;\r\n timestamp?: number;\r\n sessionId?: string;\r\n}\r\n\r\n/**\r\n * Connection status enum\r\n */\r\nexport enum ConnectionStatus {\r\n CONNECTING = 'connecting',\r\n CONNECTED = 'connected',\r\n DISCONNECTED = 'disconnected',\r\n RECONNECTING = 'reconnecting',\r\n ERROR = 'error',\r\n}\r\n\r\n/**\r\n * Session metadata interface\r\n */\r\nexport interface SessionMetadata {\r\n id: string;\r\n userId?: string;\r\n tabId?: string;\r\n userAgent?: string;\r\n ip?: string;\r\n connectedAt: Date;\r\n lastSeenAt: Date;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Search query interface\r\n */\r\nexport interface SearchQuery {\r\n query: string;\r\n limit?: number;\r\n offset?: number;\r\n filters?: Record<string, unknown>;\r\n streaming?: boolean;\r\n}\r\n\r\n/**\r\n * Search result interface\r\n */\r\nexport interface SearchResult<T = unknown> {\r\n id: string;\r\n score: number;\r\n data: T;\r\n highlights?: string[];\r\n}\r\n\r\n/**\r\n * Search response interface\r\n */\r\nexport interface SearchResponse<T = unknown> {\r\n query: string;\r\n results: SearchResult<T>[];\r\n total: number;\r\n took: number;\r\n hasMore?: boolean;\r\n}\r\n\r\n/**\r\n * Logger interface for structured logging\r\n */\r\nexport interface Logger {\r\n debug(message: string, meta?: Record<string, unknown>): void;\r\n info(message: string, meta?: Record<string, unknown>): void;\r\n warn(message: string, meta?: Record<string, unknown>): void;\r\n error(message: string, meta?: Record<string, unknown>): void;\r\n}\r\n\r\n/**\r\n * Default console logger implementation\r\n */\r\nexport class ConsoleLogger implements Logger {\r\n debug(message: string, meta?: Record<string, unknown>): void {\r\n console.debug(`[DEBUG] ${message}`, meta || '');\r\n }\r\n\r\n info(message: string, meta?: Record<string, unknown>): void {\r\n console.info(`[INFO] ${message}`, meta || '');\r\n }\r\n\r\n warn(message: string, meta?: Record<string, unknown>): void {\r\n console.warn(`[WARN] ${message}`, meta || '');\r\n }\r\n\r\n error(message: string, meta?: Record<string, unknown>): void {\r\n console.error(`[ERROR] ${message}`, meta || '');\r\n }\r\n}\r\n\r\n/**\r\n * Configuration options for the WebSocket server\r\n */\r\nexport interface ServerConfig {\r\n port?: number;\r\n cors?: {\r\n origin?: string | string[] | boolean;\r\n methods?: string[];\r\n credentials?: boolean;\r\n };\r\n heartbeatInterval?: number;\r\n heartbeatTimeout?: number;\r\n logger?: Logger;\r\n adapter?: IAdapter;\r\n gracefulShutdownTimeout?: number;\r\n maxConnections?: number;\r\n}\r\n\r\n/**\r\n * Configuration options for the WebSocket client\r\n */\r\nexport interface ClientConfig {\r\n url: string;\r\n autoConnect?: boolean;\r\n reconnection?: boolean;\r\n reconnectionAttempts?: number;\r\n reconnectionDelay?: number;\r\n reconnectionDelayMax?: number;\r\n timeout?: number;\r\n forceNew?: boolean;\r\n searchTimeout?: number; // Default: 30000ms (timeout for search operations)\r\n logger?: Logger;\r\n auth?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Generic storage adapter interface\r\n */\r\nexport interface IAdapter {\r\n // Session management\r\n setSession(sessionId: string, metadata: SessionMetadata): Promise<void>;\r\n getSession(sessionId: string): Promise<SessionMetadata | null>;\r\n deleteSession(sessionId: string): Promise<void>;\r\n getAllSessions(): Promise<SessionMetadata[]>;\r\n updateLastSeen(sessionId: string): Promise<void>;\r\n\r\n // Search indexing\r\n indexDocument(id: string, content: string, metadata?: Record<string, unknown>): Promise<void>;\r\n removeDocument(id: string): Promise<void>;\r\n search(query: SearchQuery): Promise<SearchResponse>;\r\n\r\n // Cleanup and maintenance\r\n cleanup(): Promise<void>;\r\n disconnect(): Promise<void>;\r\n}\r\n\r\n/**\r\n * Event type mapping for type-safe messaging\r\n */\r\nexport interface EventMap extends Record<string, unknown> {\r\n // Connection events\r\n connect: { sessionId: string; metadata: SessionMetadata };\r\n disconnect: { sessionId: string; reason: string };\r\n error: { sessionId: string; error: Error };\r\n \r\n // Heartbeat events\r\n ping: { timestamp: number };\r\n pong: { timestamp: number };\r\n \r\n // Search events\r\n search: SearchQuery;\r\n 'search-result': SearchResponse;\r\n 'search-stream': { chunk: SearchResult; isLast: boolean };\r\n \r\n // Custom events (can be extended)\r\n message: { content: string; from?: string };\r\n notification: { title: string; body: string; type?: string };\r\n}\r\n\r\n/**\r\n * Type-safe event emitter interface\r\n */\r\nexport interface TypedEventEmitter<T extends Record<string, unknown> = EventMap> {\r\n on<K extends keyof T>(event: K, listener: (data: T[K]) => void): this;\r\n off<K extends keyof T>(event: K, listener: (data: T[K]) => void): this;\r\n emit<K extends keyof T>(event: K, data: T[K]): boolean;\r\n once<K extends keyof T>(event: K, listener: (data: T[K]) => void): this;\r\n removeAllListeners<K extends keyof T>(event?: K): this;\r\n}\r\n\r\n/**\r\n * Zod schemas for runtime validation\r\n */\r\nexport const SessionMetadataSchema = z.object({\r\n id: z.string(),\r\n userId: z.string().optional(),\r\n tabId: z.string().optional(),\r\n userAgent: z.string().optional(),\r\n ip: z.string().optional(),\r\n connectedAt: z.date(),\r\n lastSeenAt: z.date(),\r\n metadata: z.record(z.unknown()).optional(),\r\n});\r\n\r\nexport const SearchQuerySchema = z.object({\r\n query: z.string().min(1),\r\n limit: z.number().int().positive().max(1000).default(10),\r\n offset: z.number().int().min(0).default(0),\r\n filters: z.record(z.unknown()).optional(),\r\n streaming: z.boolean().default(false),\r\n});\r\n\r\nexport const SearchResultSchema = z.object({\r\n id: z.string(),\r\n score: z.number(),\r\n data: z.unknown(),\r\n highlights: z.array(z.string()).optional(),\r\n});\r\n\r\nexport const SearchResponseSchema = z.object({\r\n query: z.string(),\r\n results: z.array(SearchResultSchema),\r\n total: z.number().int().min(0),\r\n took: z.number().min(0),\r\n hasMore: z.boolean().optional(),\r\n});\r\n\r\n/**\r\n * Utility type for extracting event data from typed event map\r\n */\r\nexport type EventData<T extends Record<string, unknown>, K extends keyof T> = T[K];\r\n\r\n/**\r\n * Utility type for creating custom event maps that extend the base EventMap\r\n */\r\nexport type ExtendEventMap<T extends Record<string, unknown>> = EventMap & T;\r\n","/**\r\n * Text processing utilities for search functionality\r\n * Following DRY principle - shared across all adapters\r\n */\r\n\r\n/**\r\n * Build n-grams from text for fuzzy search\r\n * @param text - Input text to process\r\n * @param n - N-gram size (e.g., 3 for trigrams)\r\n * @returns Array of unique n-grams\r\n */\r\nexport function buildNGrams(text: string, n: number): string[] {\r\n const normalized = text.toLowerCase().replace(/[^\\w\\s]/g, ' ').replace(/\\s+/g, ' ').trim();\r\n const words = normalized.split(' ');\r\n const ngrams: string[] = [];\r\n\r\n for (const word of words) {\r\n if (word.length >= n) {\r\n for (let i = 0; i <= word.length - n; i++) {\r\n ngrams.push(word.substring(i, i + n));\r\n }\r\n }\r\n }\r\n\r\n return [...new Set(ngrams)];\r\n}\r\n\r\n/**\r\n * Build edge-grams from text for prefix/partial matching\r\n * @param text - Input text to process\r\n * @param minGram - Minimum gram length\r\n * @param maxGram - Maximum gram length\r\n * @returns Array of unique edge-grams\r\n */\r\nexport function buildEdgeGrams(text: string, minGram: number, maxGram: number): string[] {\r\n if (minGram > maxGram) {\r\n return [];\r\n }\r\n\r\n const normalized = text.toLowerCase().replace(/[^\\w\\s]/g, ' ').replace(/\\s+/g, ' ').trim();\r\n const words = normalized.split(' ');\r\n const edgegrams: string[] = [];\r\n\r\n for (const word of words) {\r\n for (let len = minGram; len <= Math.min(maxGram, word.length); len++) {\r\n edgegrams.push(word.substring(0, len));\r\n }\r\n }\r\n\r\n return [...new Set(edgegrams)];\r\n}\r\n\r\n/**\r\n * Generate text highlights for search results\r\n * @param content - Content to highlight\r\n * @param searchTerms - Terms to highlight\r\n * @param maxHighlights - Maximum number of highlights (default: 3)\r\n * @param contextLength - Characters around match (default: 30)\r\n * @returns Array of highlighted snippets\r\n */\r\nexport function generateHighlights(\r\n content: string, \r\n searchTerms: string[], \r\n maxHighlights: number = 3,\r\n contextLength: number = 30\r\n): string[] {\r\n const highlights: string[] = [];\r\n const contentLower = content.toLowerCase();\r\n\r\n for (const term of searchTerms) {\r\n const termLower = term.toLowerCase();\r\n let index = contentLower.indexOf(termLower);\r\n \r\n while (index !== -1 && highlights.length < maxHighlights) {\r\n const start = Math.max(0, index - contextLength);\r\n const end = Math.min(content.length, index + term.length + contextLength);\r\n const snippet = content.substring(start, end);\r\n \r\n const highlightedSnippet = snippet.replace(\r\n new RegExp(term, 'gi'),\r\n `<mark>$&</mark>`\r\n );\r\n \r\n highlights.push(\r\n (start > 0 ? '...' : '') + \r\n highlightedSnippet + \r\n (end < content.length ? '...' : '')\r\n );\r\n \r\n index = contentLower.indexOf(termLower, index + 1);\r\n }\r\n }\r\n\r\n return highlights;\r\n}\r\n","// Base search functionality shared across all adapters\r\n\r\nimport {\r\n SearchQuery,\r\n SearchResponse,\r\n SearchResult,\r\n} from '../types';\r\nimport { buildNGrams, buildEdgeGrams, generateHighlights } from '../utils/text-processing';\r\n\r\nexport interface SearchConfig {\r\n ngramSize: number;\r\n minEdgegram: number;\r\n maxEdgegram: number;\r\n exactMatchBoost: number;\r\n ngramWeight: number;\r\n edgegramWeight: number;\r\n minScore: number;\r\n}\r\n\r\nexport const DEFAULT_SEARCH_CONFIG: SearchConfig = {\r\n ngramSize: 3,\r\n minEdgegram: 2,\r\n maxEdgegram: 10,\r\n exactMatchBoost: 100,\r\n ngramWeight: 0.5,\r\n edgegramWeight: 1.0,\r\n minScore: 0.1,\r\n};\r\n\r\nexport interface DocumentData {\r\n content: string;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Base class providing common search functionality\r\n * This eliminates duplication across different adapter implementations\r\n */\r\nexport abstract class BaseSearchAdapter {\r\n protected searchConfig: SearchConfig;\r\n\r\n constructor(searchConfig: Partial<SearchConfig> = {}) {\r\n this.searchConfig = { ...DEFAULT_SEARCH_CONFIG, ...searchConfig };\r\n }\r\n\r\n /**\r\n * Generate search terms for indexing a document\r\n */\r\n protected generateSearchTerms(content: string): {\r\n ngrams: string[];\r\n edgegrams: string[];\r\n } {\r\n const ngrams = buildNGrams(content, this.searchConfig.ngramSize);\r\n const edgegrams = buildEdgeGrams(\r\n content,\r\n this.searchConfig.minEdgegram,\r\n this.searchConfig.maxEdgegram\r\n );\r\n\r\n return { ngrams, edgegrams };\r\n }\r\n\r\n /**\r\n * Calculate relevance score for a document based on search terms\r\n */\r\n protected calculateRelevanceScore(\r\n documentContent: string,\r\n searchTerms: string[],\r\n ngramMatches: number,\r\n edgegramMatches: number\r\n ): number {\r\n let score = 0;\r\n\r\n // Exact word matches get the highest boost\r\n const contentLower = documentContent.toLowerCase();\r\n const words = contentLower.split(/\\s+/);\r\n\r\n for (const term of searchTerms) {\r\n if (words.includes(term.toLowerCase())) {\r\n score += this.searchConfig.exactMatchBoost;\r\n }\r\n }\r\n\r\n // Add n-gram and edge-gram scores\r\n score += ngramMatches * this.searchConfig.ngramWeight;\r\n score += edgegramMatches * this.searchConfig.edgegramWeight;\r\n\r\n return score;\r\n }\r\n\r\n /**\r\n * Process search results: score, sort, and paginate\r\n */\r\n protected processSearchResults(\r\n query: SearchQuery,\r\n searchTerms: string[],\r\n documentScores: Map<string, { score: number; data: DocumentData }>,\r\n startTime: number\r\n ): SearchResponse {\r\n // Filter out documents with very low scores\r\n const filteredResults: SearchResult[] = [];\r\n\r\n for (const [docId, { score, data }] of documentScores.entries()) {\r\n if (score < this.searchConfig.minScore) continue;\r\n\r\n // Generate highlights\r\n const highlights = generateHighlights(data.content, searchTerms);\r\n\r\n filteredResults.push({\r\n id: docId,\r\n score,\r\n data: { content: data.content, ...data.metadata },\r\n highlights,\r\n });\r\n }\r\n\r\n // Sort by score (descending)\r\n filteredResults.sort((a, b) => b.score - a.score);\r\n\r\n // Apply pagination\r\n const offset = query.offset || 0;\r\n const limit = query.limit || 10;\r\n const paginatedResults = filteredResults.slice(offset, offset + limit);\r\n\r\n return {\r\n query: query.query,\r\n results: paginatedResults,\r\n total: filteredResults.length,\r\n took: Date.now() - startTime,\r\n hasMore: offset + limit < filteredResults.length,\r\n };\r\n }\r\n\r\n /**\r\n * Validate and normalize search query\r\n */\r\n protected normalizeSearchQuery(query: SearchQuery): {\r\n searchTerms: string[];\r\n isValid: boolean;\r\n } {\r\n const searchTerms = query.query\r\n .toLowerCase()\r\n .split(/\\s+/)\r\n .filter(term => term.length > 0);\r\n\r\n return {\r\n searchTerms,\r\n isValid: searchTerms.length > 0,\r\n };\r\n }\r\n\r\n /**\r\n * Create empty search response for invalid queries\r\n */\r\n protected createEmptyResponse(query: SearchQuery, startTime: number): SearchResponse {\r\n return {\r\n query: query.query,\r\n results: [],\r\n total: 0,\r\n took: Date.now() - startTime,\r\n hasMore: false,\r\n };\r\n }\r\n}\r\n","// Memory adapter for development and testing\r\n\r\nimport {\r\n IAdapter,\r\n SessionMetadata,\r\n SearchQuery,\r\n SearchResponse,\r\n} from '../types';\r\nimport { BaseSearchAdapter, SearchConfig, DocumentData } from './base-search';\r\n\r\nexport interface MemoryAdapterConfig {\r\n searchConfig?: Partial<SearchConfig>;\r\n maxDocuments?: number;\r\n sessionCleanupInterval?: number; // hours\r\n}\r\n\r\n/**\r\n * In-memory adapter for development and testing\r\n * Not suitable for production use with multiple server instances\r\n */\r\nexport class MemoryAdapter extends BaseSearchAdapter implements IAdapter {\r\n private sessions = new Map<string, SessionMetadata>();\r\n private documents = new Map<string, DocumentData>();\r\n private documentAccessOrder = new Map<string, number>(); // Track access order for LRU\r\n private ngramIndex = new Map<string, Set<string>>(); // ngram -> document IDs\r\n private edgegramIndex = new Map<string, Set<string>>(); // edgegram -> document IDs\r\n private maxDocuments: number;\r\n private sessionCleanupHours: number;\r\n private accessCounter = 0; // Monotonic counter for access order\r\n\r\n constructor(config: MemoryAdapterConfig = {}) {\r\n super(config.searchConfig);\r\n this.maxDocuments = config.maxDocuments || 10000;\r\n this.sessionCleanupHours = config.sessionCleanupInterval || 24; // hours\r\n }\r\n\r\n async setSession(sessionId: string, metadata: SessionMetadata): Promise<void> {\r\n this.sessions.set(sessionId, { ...metadata });\r\n }\r\n\r\n async getSession(sessionId: string): Promise<SessionMetadata | null> {\r\n const session = this.sessions.get(sessionId);\r\n return session ? { ...session } : null;\r\n }\r\n\r\n async deleteSession(sessionId: string): Promise<void> {\r\n this.sessions.delete(sessionId);\r\n }\r\n\r\n async getAllSessions(): Promise<SessionMetadata[]> {\r\n return Array.from(this.sessions.values()).map(session => ({ ...session }));\r\n }\r\n\r\n async updateLastSeen(sessionId: string): Promise<void> {\r\n const session = this.sessions.get(sessionId);\r\n if (session) {\r\n session.lastSeenAt = new Date();\r\n }\r\n }\r\n\r\n async indexDocument(\r\n id: string,\r\n content: string,\r\n metadata?: Record<string, unknown>\r\n ): Promise<void> {\r\n // Remove old index entries for this document\r\n await this.removeFromIndex(id);\r\n\r\n // Check document limit and remove LRU documents if necessary\r\n while (this.documents.size >= this.maxDocuments) {\r\n const lruDocumentId = this.findLRUDocument();\r\n if (lruDocumentId) {\r\n await this.removeDocument(lruDocumentId);\r\n } else {\r\n break; // Shouldn't happen, but prevent infinite loop\r\n }\r\n }\r\n\r\n // Store document and update access order\r\n this.documents.set(id, { content, ...(metadata && { metadata }) });\r\n this.documentAccessOrder.set(id, ++this.accessCounter);\r\n\r\n // Generate search terms using base class\r\n const { ngrams, edgegrams } = this.generateSearchTerms(content);\r\n\r\n // Index n-grams\r\n for (const ngram of ngrams) {\r\n if (!this.ngramIndex.has(ngram)) {\r\n this.ngramIndex.set(ngram, new Set());\r\n }\r\n this.ngramIndex.get(ngram)!.add(id);\r\n }\r\n\r\n // Index edge-grams\r\n for (const edgegram of edgegrams) {\r\n if (!this.edgegramIndex.has(edgegram)) {\r\n this.edgegramIndex.set(edgegram, new Set());\r\n }\r\n this.edgegramIndex.get(edgegram)!.add(id);\r\n }\r\n }\r\n\r\n /**\r\n * Find the least recently used document for eviction\r\n */\r\n private findLRUDocument(): string | undefined {\r\n let lruId: string | undefined;\r\n let lruAccessTime = Infinity;\r\n\r\n for (const [docId, accessTime] of this.documentAccessOrder.entries()) {\r\n if (accessTime < lruAccessTime) {\r\n lruAccessTime = accessTime;\r\n lruId = docId;\r\n }\r\n }\r\n\r\n return lruId;\r\n }\r\n\r\n /**\r\n * Update access time for a document (for LRU tracking)\r\n */\r\n private updateDocumentAccess(id: string): void {\r\n if (this.documents.has(id)) {\r\n this.documentAccessOrder.set(id, ++this.accessCounter);\r\n }\r\n }\r\n\r\n async removeDocument(id: string): Promise<void> {\r\n // Remove from document store\r\n this.documents.delete(id);\r\n this.documentAccessOrder.delete(id);\r\n\r\n // Remove from indexes\r\n await this.removeFromIndex(id);\r\n }\r\n\r\n private async removeFromIndex(id: string): Promise<void> {\r\n // Remove from all index entries\r\n for (const [ngram, docIds] of this.ngramIndex.entries()) {\r\n docIds.delete(id);\r\n if (docIds.size === 0) {\r\n this.ngramIndex.delete(ngram);\r\n }\r\n }\r\n\r\n for (const [edgegram, docIds] of this.edgegramIndex.entries()) {\r\n docIds.delete(id);\r\n if (docIds.size === 0) {\r\n this.edgegramIndex.delete(edgegram);\r\n }\r\n }\r\n }\r\n\r\n async search(query: SearchQuery): Promise<SearchResponse> {\r\n const startTime = Date.now();\r\n const { searchTerms, isValid } = this.normalizeSearchQuery(query);\r\n \r\n if (!isValid) {\r\n return this.createEmptyResponse(query, startTime);\r\n }\r\n\r\n // Find matching documents using both n-grams and edge-grams\r\n const documentScores = new Map<string, { score: number; data: DocumentData }>();\r\n\r\n for (const term of searchTerms) {\r\n // Generate search terms for this query term\r\n const { ngrams, edgegrams } = this.generateSearchTerms(term);\r\n\r\n // Score based on n-gram matches\r\n for (const ngram of ngrams) {\r\n const matchingDocs = this.ngramIndex.get(ngram);\r\n if (matchingDocs) {\r\n for (const docId of matchingDocs) {\r\n if (!documentScores.has(docId)) {\r\n const doc = this.documents.get(docId);\r\n if (doc) {\r\n documentScores.set(docId, { score: 0, data: doc });\r\n }\r\n }\r\n // Increment score for each n-gram match\r\n const current = documentScores.get(docId);\r\n if (current) {\r\n current.score += this.searchConfig.ngramWeight;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Score based on edge-gram matches\r\n for (const edgegram of edgegrams) {\r\n const matchingDocs = this.edgegramIndex.get(edgegram);\r\n if (matchingDocs) {\r\n for (const docId of matchingDocs) {\r\n if (!documentScores.has(docId)) {\r\n const doc = this.documents.get(docId);\r\n if (doc) {\r\n documentScores.set(docId, { score: 0, data: doc });\r\n }\r\n }\r\n // Increment score for each edge-gram match\r\n const current = documentScores.get(docId);\r\n if (current) {\r\n current.score += this.searchConfig.edgegramWeight;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Calculate final relevance scores using base class method\r\n for (const [docId, scoreData] of documentScores.entries()) {\r\n // Update access time for LRU tracking\r\n this.updateDocumentAccess(docId);\r\n \r\n const finalScore = this.calculateRelevanceScore(\r\n scoreData.data.content,\r\n searchTerms,\r\n scoreData.score, // Use actual calculated match score\r\n 0 // No additional boost for memory adapter\r\n );\r\n \r\n documentScores.set(docId, { ...scoreData, score: finalScore });\r\n }\r\n\r\n return this.processSearchResults(query, searchTerms, documentScores, startTime);\r\n }\r\n\r\n async cleanup(): Promise<void> {\r\n // Remove sessions older than configured interval\r\n const cutoffTime = new Date(Date.now() - this.sessionCleanupHours * 60 * 60 * 1000);\r\n \r\n for (const [sessionId, session] of this.sessions.entries()) {\r\n if (session.lastSeenAt < cutoffTime) {\r\n this.sessions.delete(sessionId);\r\n }\r\n }\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n // Clear all data\r\n this.sessions.clear();\r\n this.documents.clear();\r\n this.documentAccessOrder.clear();\r\n this.ngramIndex.clear();\r\n this.edgegramIndex.clear();\r\n this.accessCounter = 0;\r\n }\r\n}\r\n","// WebSocket server implementation with Socket.IO\r\n\r\nimport { createServer } from 'http';\r\nimport { Server as SocketIOServer, Socket } from 'socket.io';\r\nimport { EventEmitter } from 'eventemitter3';\r\nimport {\r\n ServerConfig,\r\n SessionMetadata,\r\n EventMap,\r\n SearchQuery,\r\n SearchResponse,\r\n Logger,\r\n ConsoleLogger,\r\n IAdapter,\r\n SearchQuerySchema,\r\n} from '../types';\r\nimport { MemoryAdapter } from '../adapters/memory';\r\n\r\n// Extended socket interface with sessionId\r\ninterface ExtendedSocket extends Socket {\r\n sessionId?: string;\r\n}\r\n\r\n// Simple UUID v4 implementation to avoid external dependency\r\nfunction generateUUID(): string {\r\n return 'xxxx-xxxx-4xxx-yxxx-xxxx'.replace(/[xy]/g, (c) => {\r\n const r = Math.random() * 16 | 0;\r\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\r\n return v.toString(16);\r\n });\r\n}\r\n\r\n/**\r\n * Plug-and-play WebSocket server with full type safety and production features\r\n */\r\nexport class PlugNPlayServer<T extends Record<string, unknown> = EventMap> {\r\n \r\n private httpServer: ReturnType<typeof createServer>;\r\n private io: SocketIOServer;\r\n private adapter: IAdapter;\r\n private logger: Logger;\r\n private emitter: EventEmitter;\r\n private heartbeatInterval?: ReturnType<typeof setInterval>;\r\n private cleanupInterval?: ReturnType<typeof setInterval>;\r\n private isShuttingDown = false;\r\n private activeSockets = new Set<Socket>();\r\n private startTime = Date.now();\r\n private maxConnections: number | undefined;\r\n\r\n constructor(private config: ServerConfig = {}) {\r\n this.emitter = new EventEmitter();\r\n this.logger = config.logger || new ConsoleLogger();\r\n this.adapter = config.adapter || new MemoryAdapter();\r\n this.maxConnections = config.maxConnections;\r\n \r\n // Create HTTP server\r\n this.httpServer = createServer();\r\n \r\n // Create Socket.IO server\r\n this.io = new SocketIOServer(this.httpServer, {\r\n cors: {\r\n origin: config.cors?.origin || true,\r\n methods: config.cors?.methods || ['GET', 'POST'],\r\n credentials: config.cors?.credentials || false,\r\n },\r\n pingTimeout: config.heartbeatTimeout || 60000,\r\n pingInterval: config.heartbeatInterval || 25000,\r\n });\r\n\r\n this.setupSocketHandlers();\r\n this.startHeartbeat();\r\n this.startCleanupTask();\r\n }\r\n\r\n // Event emitter methods\r\n on<K extends keyof T>(event: K, listener: (data: T[K]) => void): this {\r\n this.emitter.on(event as string, listener);\r\n return this;\r\n }\r\n\r\n off<K extends keyof T>(event: K, listener: (data: T[K]) => void): this {\r\n this.emitter.off(event as string, listener);\r\n return this;\r\n }\r\n\r\n emit<K extends keyof T>(event: K, data: T[K]): boolean {\r\n return this.emitter.emit(event as string, data);\r\