iframe-connect
Version:
A lightweight, type-safe cross-frame communication library with plugin system and multi-window isolation
1 lines • 21.9 kB
Source Map (JSON)
{"version":3,"sources":["../src/plugins/logger.ts","../src/plugins/retry.ts","../src/plugins/queue-manager.ts"],"names":[],"mappings":"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","file":"chunk-JI2PIO5G.mjs","sourcesContent":["/**\n * 为 iframe-connect 提供详细的日志记录功能\n * 日志插件\n */\n\nimport type { IframeBridge } from \"../base-bridge\";\nimport type { MessageType } from \"../types\";\n\nexport interface LoggerOptions {\n prefix?: string;\n timestamp?: boolean;\n colors?: boolean;\n level?: \"debug\" | \"info\" | \"warn\" | \"error\";\n}\n\nexport class Logger {\n private options: Required<LoggerOptions>;\n private bridge: IframeBridge;\n\n constructor(bridge: IframeBridge, options: LoggerOptions = {}) {\n this.bridge = bridge;\n this.options = {\n prefix: \"[CrossFrame]\",\n timestamp: true,\n colors: true,\n level: \"debug\",\n ...options,\n };\n\n this.setupLogging();\n }\n\n private setupLogging() {\n // 重写 bridge 的 send 方法\n const originalSend = this.bridge.send.bind(this.bridge);\n this.bridge.send = <T>(type: MessageType, payload: T) => {\n this.log(\"info\", \"发送消息:\", { type, payload });\n return originalSend(type, payload);\n };\n\n // 重写 bridge 的 request 方法\n const originalRequest = this.bridge.request.bind(this.bridge);\n this.bridge.request = async <T, R>(\n type: MessageType,\n payload: T\n ): Promise<R> => {\n this.log(\"info\", \"发送请求:\", { type, payload });\n try {\n const result = await originalRequest(type, payload);\n this.log(\"info\", \"请求成功:\", { type, result });\n return result;\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this.log(\"error\", \"请求失败:\", { type, error: errorMessage });\n throw error;\n }\n };\n }\n\n private log(level: string, message: string, data?: any) {\n if (!this.shouldLog(level)) return;\n\n const timestamp = this.options.timestamp\n ? `[${new Date().toISOString()}]`\n : \"\";\n const prefix = this.options.prefix;\n const coloredMessage = this.options.colors\n ? this.colorize(level, message)\n : message;\n\n console.log(`${timestamp} ${prefix} ${coloredMessage}`, data || \"\");\n }\n\n private shouldLog(level: string): boolean {\n const levels = [\"debug\", \"info\", \"warn\", \"error\"];\n const currentLevelIndex = levels.indexOf(this.options.level);\n const messageLevelIndex = levels.indexOf(level);\n return messageLevelIndex >= currentLevelIndex;\n }\n\n private colorize(level: string, message: string): string {\n if (!this.options.colors) return message;\n\n const colors = {\n debug: \"\\x1b[36m\", // cyan\n info: \"\\x1b[32m\", // green\n warn: \"\\x1b[33m\", // yellow\n error: \"\\x1b[31m\", // red\n reset: \"\\x1b[0m\",\n };\n\n return `${colors[level as keyof typeof colors] || \"\"}${message}${\n colors.reset\n }`;\n }\n}\n\n// 工厂函数\nexport function createLogger(\n bridge: IframeBridge,\n options?: LoggerOptions\n): Logger {\n return new Logger(bridge, options);\n}\n","/**\n * 重试插件\n * 为 iframe-connect 提供自动重试功能\n */\n\nimport type { IframeBridge } from \"../base-bridge\";\nimport type { MessageType } from \"../types\";\n\nexport interface RetryOptions {\n maxRetries?: number;\n baseDelay?: number;\n maxDelay?: number;\n backoff?: \"linear\" | \"exponential\";\n retryCondition?: (error: Error) => boolean;\n}\n\nexport class RetryManager {\n private options: Required<RetryOptions>;\n private bridge: IframeBridge;\n\n constructor(bridge: IframeBridge, options: RetryOptions = {}) {\n this.bridge = bridge;\n this.options = {\n maxRetries: 3,\n baseDelay: 1000,\n maxDelay: 10000,\n backoff: \"exponential\",\n retryCondition: (error) => error.message.includes(\"timeout\"),\n ...options,\n };\n\n this.setupRetry();\n }\n\n private setupRetry() {\n // 重写 request 方法以支持重试\n const originalRequest = this.bridge.request.bind(this.bridge);\n this.bridge.request = async <T, R>(\n type: MessageType,\n payload: T\n ): Promise<R> => {\n return this.requestWithRetry(originalRequest, type, payload);\n };\n }\n\n private async requestWithRetry<T, R>(\n originalRequest: (type: MessageType, payload: T) => Promise<R>,\n type: MessageType,\n payload: T\n ): Promise<R> {\n let lastError: Error;\n\n for (let attempt = 0; attempt <= this.options.maxRetries; attempt++) {\n try {\n return await originalRequest(type, payload);\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // 如果不满足重试条件,直接抛出错误\n if (!this.options.retryCondition(lastError)) {\n throw lastError;\n }\n\n // 如果是最后一次尝试,抛出错误\n if (attempt === this.options.maxRetries) {\n throw lastError;\n }\n\n // 计算延迟时间\n const delay = this.calculateDelay(attempt);\n console.warn(\n `[CrossFrame] 请求失败,${delay}ms 后重试 (${attempt + 1}/${\n this.options.maxRetries\n })`\n );\n\n await this.sleep(delay);\n }\n }\n\n throw lastError!;\n }\n\n private calculateDelay(attempt: number): number {\n let delay: number;\n\n if (this.options.backoff === \"linear\") {\n delay = this.options.baseDelay * (attempt + 1);\n } else {\n delay = this.options.baseDelay * Math.pow(2, attempt);\n }\n\n return Math.min(delay, this.options.maxDelay);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n // 手动重试方法\n async retryRequest<T, R>(\n type: MessageType,\n payload: T,\n customOptions?: Partial<RetryOptions>\n ): Promise<R> {\n const options = { ...this.options, ...customOptions };\n\n for (let attempt = 0; attempt <= options.maxRetries; attempt++) {\n try {\n return await this.bridge.request<T, R>(type, payload);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n if (!options.retryCondition!(err) || attempt === options.maxRetries) {\n throw err;\n }\n\n const delay = this.calculateDelayWithOptions(attempt, options);\n await this.sleep(delay);\n }\n }\n\n throw new Error(\"Retry failed\");\n }\n\n private calculateDelayWithOptions(\n attempt: number,\n options: Required<RetryOptions>\n ): number {\n let delay: number;\n\n if (options.backoff === \"linear\") {\n delay = options.baseDelay * (attempt + 1);\n } else {\n delay = options.baseDelay * Math.pow(2, attempt);\n }\n\n return Math.min(delay, options.maxDelay);\n }\n}\n\n// 工厂函数\nexport function createRetryManager(\n bridge: IframeBridge,\n options?: RetryOptions\n): RetryManager {\n return new RetryManager(bridge, options);\n}\n","/**\n * 消息队列管理器\n * 提供批量消息处理和流量控制功能\n */\n\nimport type { IframeBridge } from \"../base-bridge\";\nimport type { MessageType } from \"../types\";\n\nexport interface QueueOptions {\n maxSize?: number;\n flushInterval?: number;\n batchSize?: number;\n priority?: boolean;\n}\n\ninterface QueuedMessage {\n type: MessageType;\n payload: any;\n priority?: number;\n timestamp: number;\n resolve?: (value: any) => void;\n reject?: (error: Error) => void;\n requestTimeout?: number;\n}\n\nexport class QueueManager {\n private options: Required<QueueOptions>;\n private bridge: IframeBridge;\n private messageQueue: QueuedMessage[] = [];\n private processing = false;\n private flushTimer?: number;\n\n constructor(bridge: IframeBridge, options: QueueOptions = {}) {\n this.bridge = bridge;\n this.options = {\n maxSize: 100,\n flushInterval: 1000,\n batchSize: 10,\n priority: false,\n ...options,\n };\n\n this.setupQueue();\n this.startFlushTimer();\n }\n\n private setupQueue() {\n // 重写 send 方法\n const originalSend = this.bridge.send.bind(this.bridge); // eslint-disable-line @typescript-eslint/no-unused-vars\n this.bridge.send = <T>(type: MessageType, payload: T) => {\n this.enqueue({\n type,\n payload,\n timestamp: Date.now(),\n });\n };\n\n // 重写 request 方法,保留超时参数\n const originalRequest = this.bridge.request.bind(this.bridge); // eslint-disable-line @typescript-eslint/no-unused-vars\n this.bridge.request = <T, R>(\n type: MessageType,\n payload: T,\n requestTimeout?: number\n ): Promise<R> => {\n return new Promise((resolve, reject) => {\n this.enqueue({\n type,\n payload,\n timestamp: Date.now(),\n resolve,\n reject,\n requestTimeout,\n });\n });\n };\n }\n\n private enqueue(message: QueuedMessage) {\n // 检查队列大小\n if (this.messageQueue.length >= this.options.maxSize) {\n const error = new Error(\"消息队列已满\");\n if (message.reject) {\n message.reject(error);\n } else {\n console.warn(\"[CrossFrame] 消息队列已满,丢弃消息:\", message);\n }\n return;\n }\n\n // 添加到队列\n this.messageQueue.push(message);\n\n // 如果启用了优先级,对队列进行排序\n if (this.options.priority) {\n this.messageQueue.sort((a, b) => (b.priority || 0) - (a.priority || 0));\n }\n\n // 立即处理或等待批量处理\n if (this.messageQueue.length >= this.options.batchSize) {\n this.flush();\n }\n }\n\n private startFlushTimer() {\n this.flushTimer = setInterval(() => {\n if (this.messageQueue.length > 0) {\n this.flush();\n }\n }, this.options.flushInterval) as unknown as number;\n }\n\n private async flush() {\n if (this.processing || this.messageQueue.length === 0) {\n return;\n }\n\n this.processing = true;\n\n // 取出要处理的消息\n const batch = this.messageQueue.splice(0, this.options.batchSize);\n\n try {\n // 批量处理消息\n for (const message of batch) {\n try {\n if (message.resolve) {\n // 这是一个 request,传递超时参数\n const result = await this.bridge.request(\n message.type,\n message.payload,\n message.requestTimeout\n );\n message.resolve(result);\n } else {\n // 这是一个 send\n this.bridge.send(message.type, message.payload);\n }\n } catch (error) {\n if (message.reject) {\n message.reject(\n error instanceof Error ? error : new Error(String(error))\n );\n } else {\n console.error(\"[CrossFrame] 消息处理失败:\", error);\n }\n }\n }\n } finally {\n this.processing = false;\n }\n }\n\n // 手动刷新队列\n async flushNow(): Promise<void> {\n return this.flush();\n }\n\n // 设置消息优先级\n setPriority(type: MessageType, payload: any, priority: number) {\n this.enqueue({\n type,\n payload,\n priority,\n timestamp: Date.now(),\n });\n }\n\n // 获取队列状态\n getQueueStatus() {\n return {\n size: this.messageQueue.length,\n maxSize: this.options.maxSize,\n processing: this.processing,\n usage: (this.messageQueue.length / this.options.maxSize) * 100,\n };\n }\n\n // 清空队列\n clear() {\n const rejectedCount = this.messageQueue.filter((msg) => msg.reject).length;\n this.messageQueue.forEach((msg) => {\n if (msg.reject) {\n msg.reject(new Error(\"队列已清空\"));\n }\n });\n this.messageQueue = [];\n console.log(`[CrossFrame] 队列已清空,${rejectedCount} 个请求被拒绝`);\n }\n\n // 销毁队列管理器\n destroy() {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n }\n this.clear();\n }\n}\n\n// 工厂函数\nexport function createQueueManager(\n bridge: IframeBridge,\n options?: QueueOptions\n): QueueManager {\n return new QueueManager(bridge, options);\n}\n"]}