@bud-fe/h5-native-bridge 1.0.4 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -40
- package/dist/native-bridge.es.js +684 -271
- package/dist/native-bridge.es.js.map +1 -1
- package/dist/native-bridge.umd.js +1 -1
- package/dist/native-bridge.umd.js.map +1 -1
- package/dist/src/core/index.d.ts +9 -8
- package/dist/src/plugins/media.d.ts +29 -0
- package/dist/src/plugins/navigate.d.ts +20 -0
- package/package.json +13 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-bridge.umd.js","sources":["../src/core/errors.ts","../src/core/index.ts","../src/plugins/location.ts","../src/plugins/device.ts","../src/plugins/media.ts","../src/plugins/navigate.ts","../src/plugins/toast.ts","../src/plugins/userInfo.ts","../src/plugins/bluetooth.ts","../src/plugins/storage.ts","../src/plugins/authentication.ts","../src/plugins/request.ts","../src/plugins/wifi.ts","../src/index.ts"],"sourcesContent":["\n// errors.ts\nexport enum BridgeErrorCode {\n SUCCESS = 0,\n JSON_ERROR = 1,\n SYSTEM_ERROR = 2,\n TIMEOUT = 3,\n PLUGIN_NOT_INITIALIZED = 4,\n INVALID_ACTION = 5,\n}\n\nexport interface BridgeError extends Error {\n code: BridgeErrorCode;\n message: string;\n details?: any;\n}\n\nexport const createBridgeError = (\n code: BridgeErrorCode,\n message: string,\n details?: any\n): BridgeError => {\n const error = new Error(message) as BridgeError;\n error.code = code;\n error.details = details;\n return error;\n};","/**\n * NativeBridge核心模块\n *\n * 提供基础的桥接能力和插件系统\n */\nimport { BridgeErrorCode, createBridgeError } from \"./errors\";\n\n// 类型定义\nexport interface PluginContext {\n bridge: NativeBridgeCore;\n}\n\nexport interface BridgePlugin {\n name: string;\n version: string;\n install: (context: PluginContext) => void;\n}\n\nexport interface BridgeOptions {\n debug?: boolean;\n timeout?: number;\n plugins?: BridgePlugin[];\n errorHandler?: (error: Error, source: string) => void;\n}\n\nexport interface NativeResponse<T = any> {\n code: number;\n message: string;\n data?: T;\n}\n\nexport interface CallbacksBase<T = any> {\n success?: (data: T) => void;\n fail?: (error: Error) => void;\n complete?: () => void;\n}\n\nexport interface CallNativeOptions {\n action: string;\n params?: Record<string, any>;\n timeout?: number;\n retryCount?: number;\n retryDelay?: number;\n}\n\nexport interface PluginMethods {\n }\n\ntype NativeEventHandler = (event: { type: string; data: any }) => void;\n\n\n/**\n * NativeBridge核心类\n * 提供基础的通信能力和插件系统\n */\nexport class NativeBridgeCore {\n private static instance: NativeBridgeCore;\n private callbackMap: Map<string, CallbacksBase>;\n private callbackId: number;\n private isReady: boolean;\n private readyCallbacks: Array<() => void>;\n private debugMode: boolean;\n private defaultTimeout: number;\n private plugins: Map<string, BridgePlugin>;\n private pendingCalls: Map<string, NodeJS.Timeout>;\n private errorHandler?: (error: Error, source: string) => void;\n private eventListeners: Map<string, EventListener> = new Map();\n private nativeEventHandlers: Map<string, Set<NativeEventHandler>> = new Map();\n\n // 版本号管理\n public readonly VERSION = \"1.0.0\";\n public readonly API_VERSION = \"1\";\n\n /**\n * 私有构造函数(单例模式)\n */\n private constructor(options: BridgeOptions = {}) {\n this.callbackMap = new Map();\n this.callbackId = 1;\n this.isReady = false;\n this.readyCallbacks = [];\n this.debugMode = options.debug || true;\n this.defaultTimeout = options.timeout || 10000000;\n this.plugins = new Map();\n this.pendingCalls = new Map();\n this.errorHandler = options.errorHandler;\n\n // 初始化\n\n this.setupBridge();\n\n // 安装插件\n if (options.plugins && options.plugins.length > 0) {\n options.plugins.forEach((plugin) => this.use(plugin));\n }\n }\n\n /**\n * 获取NativeBridge单例\n */\n public static getInstance(options: BridgeOptions = {}): NativeBridgeCore {\n if (!NativeBridgeCore.instance) {\n NativeBridgeCore.instance = new NativeBridgeCore(options);\n } else if (options.plugins && options.plugins.length > 0) {\n // 如果实例已存在但有新插件,则安装新插件\n options.plugins.forEach((plugin) => {\n NativeBridgeCore.instance.use(plugin);\n });\n }\n\n return NativeBridgeCore.instance;\n }\n\n /**\n * 注册原生事件监听\n */\n public onNativeEvent(eventType: string, handler: NativeEventHandler) {\n if (!this.nativeEventHandlers.has(eventType)) {\n this.nativeEventHandlers.set(eventType, new Set());\n }\n this.nativeEventHandlers.get(eventType)!.add(handler);\n }\n\n /**\n * 取消原生事件监听\n */\n public offNativeEvent(eventType: string, handler: NativeEventHandler) {\n this.nativeEventHandlers.get(eventType)?.delete(handler);\n }\n\n /**\n * 供原生调用,分发事件\n */\n public dispatchNativeEvent(eventType: string, data: any) {\n if (this.debugMode) {\n this.log(`分发原生事件: ${eventType}`, data);\n }\n this.nativeEventHandlers.get(eventType)?.forEach((handler) => {\n try {\n handler({ type: eventType, data });\n } catch (e) {\n this.error(`分发原生事件 ${eventType} 失败`, e as Error);\n }\n });\n }\n\n // 新增方法注册机制\n private methodRegistry: Map<string, Function> = new Map();\n\n public registerMethod<T extends keyof PluginMethods>(\n name: T,\n method: PluginMethods[T]\n ): void {\n if (this.methodRegistry.has(name as string)) {\n this.warn(`方法 ${name} 已注册,将被覆盖`);\n }\n this.methodRegistry.set(name as string, method);\n (this as any)[name] = method; // 保持动态挂载,但通过注册表管理\n }\n\n /**\n * 安装插件\n */\n public use(plugin: BridgePlugin): NativeBridgeCore {\n if (\n !plugin ||\n !plugin.name ||\n !plugin.install ||\n typeof plugin.install !== \"function\"\n ) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n `无效的插件: ${plugin?.name || \"未命名\"}`\n );\n }\n\n if (this.plugins.has(plugin.name)) {\n this.warn(`插件 ${plugin.name} 已经安装`);\n return this;\n }\n\n try {\n const context: PluginContext = { bridge: this };\n plugin.install(context);\n this.plugins.set(plugin.name, plugin);\n this.log(`插件 ${plugin.name}@${plugin.version} 安装成功`);\n } catch (error) {\n throw createBridgeError(\n BridgeErrorCode.SYSTEM_ERROR,\n `安装插件 ${plugin.name} 失败`,\n error\n );\n }\n\n return this;\n }\n\n /**\n * 检查插件是否已安装\n */\n public hasPlugin(name: string): boolean {\n return this.plugins.has(name);\n }\n\n /**\n * 获取已安装的插件\n */\n public getPlugin(name: string): BridgePlugin | undefined {\n return this.plugins.get(name);\n }\n\n /**\n * 设置桥接环境\n */\n private setupBridge(): void {\n try {\n // 检测是否在App环境中\n const isInApp = this.checkIsInApp();\n\n if (isInApp) {\n // 注册全局回调处理函数供原生调用\n (window as any).nativeBridgeCallback =\n this.handleNativeCallback.bind(this);\n\n // 供原生调用的全局方法\n (window as any).nativeBridgeDispatchEvent = (\n eventType: string,\n data: any\n ) => {\n this.dispatchNativeEvent(eventType, data);\n };\n\n // 通知原生App JS已准备好\n this.callNative(\n {\n action: \"ready\",\n params: { version: this.VERSION, apiVersion: this.API_VERSION },\n },\n {\n success: () => {\n this.log(\"App已准备就绪=====>\");\n this.isReady = true;\n this.readyCallbacks.forEach((callback) => callback());\n this.readyCallbacks = [];\n },\n fail: (error) => {\n this.error(\"App准备就绪失败\", error);\n },\n }\n );\n const readyHandler = () => {\n this.isReady = true;\n this.readyCallbacks.forEach((callback) => callback());\n this.readyCallbacks = [];\n };\n // 监听原生准备就绪事件\n document.addEventListener(\"NativeBridgeReady\", readyHandler);\n this.eventListeners.set(\"NativeBridgeReady\", readyHandler);\n } else {\n // 非App环境下模拟准备就绪\n setTimeout(() => {\n this.isReady = true;\n this.readyCallbacks.forEach((callback) => callback());\n this.readyCallbacks = [];\n }, 0);\n }\n } catch (error) {\n this.error(\"设置桥接环境失败\", error as Error);\n }\n }\n\n public destroy(): void {\n this.eventListeners.forEach((listener, event) => {\n document.removeEventListener(event, listener);\n });\n this.eventListeners.clear();\n this.callbackMap.clear();\n this.pendingCalls.forEach((timeout) => clearTimeout(timeout));\n this.pendingCalls.clear();\n (window as any).nativeBridgeCallback = undefined;\n }\n\n /**\n * 检测是否在App环境中\n */\n private checkIsInApp(): boolean {\n try {\n // 检测UA或特定全局变量判断是否在App中\n const userAgent = navigator.userAgent.toLowerCase();\n console.log(`[NativeBridge]--userAgent ${userAgent}`);\n console.log(\n `[NativeBridge]--messageHandlers ${JSON.stringify(\n (window as any).webkit?.messageHandlers\n )}`\n );\n return true;\n // return (\n // (window as any).AndroidBridge ||\n // (window as any).webkit?.messageHandlers?.nativeBridge\n // );\n } catch (error) {\n this.error(\"检测App环境失败\", error as Error);\n return false;\n }\n }\n\n /**\n * 等待桥接准备就绪\n */\n public ready(callback: () => void): void {\n if (this.isReady) {\n callback();\n } else {\n this.readyCallbacks.push(callback);\n }\n }\n\n /**\n * 调用原生方法\n */\n // 调用原生方法\n public callNative<T = any>(\n options: CallNativeOptions,\n callbacks?: CallbacksBase<T>\n ): string {\n const callbackId = `cb_${this.callbackId++}_${Date.now()}`;\n const {\n action,\n params = {},\n timeout = this.defaultTimeout,\n retryCount = 0,\n retryDelay = 1000,\n } = options;\n if (callbacks) {\n this.callbackMap.set(callbackId, callbacks);\n\n if (timeout > 0) {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n if (controller.signal.aborted) return;\n\n if (this.callbackMap.has(callbackId)) {\n this.callbackMap.delete(callbackId);\n this.pendingCalls.delete(callbackId);\n\n if (retryCount > 0) {\n this.log(\n `调用 ${action} 超时,${retryDelay}ms后重试 (剩余重试次数: ${retryCount})`\n );\n setTimeout(() => {\n if (controller.signal.aborted) return;\n this.callNative(\n {\n action,\n params,\n timeout,\n retryCount: retryCount - 1,\n retryDelay,\n },\n callbacks\n );\n }, retryDelay);\n } else {\n const timeoutError = createBridgeError(\n BridgeErrorCode.TIMEOUT,\n `调用 ${action} 超时 (${timeout}ms)`\n );\n callbacks.fail?.(timeoutError);\n callbacks.complete?.();\n this.error(`调用超时: ${action}`, timeoutError);\n }\n }\n }, timeout);\n\n this.pendingCalls.set(callbackId, timeoutId);\n // 绑定清理逻辑\n controller.signal.addEventListener(\"abort\", () => {\n clearTimeout(timeoutId);\n this.pendingCalls.delete(callbackId);\n });\n }\n }\n\n const message = { action, params, timeout, callbackId };\n if (this.debugMode) {\n this.log(`调用原生方法: ${action}`, params);\n }\n\n try {\n if (this.checkIsInApp()) {\n this.sendToNative(message);\n } else {\n this.mockNativeCall(message);\n }\n } catch (error) {\n this.error(`调用原生方法 ${action} 失败`, error as Error);\n callbacks?.fail?.(error as Error);\n this.releaseCallback(callbackId);\n }\n\n return callbackId;\n }\n\n /**\n * 同步调用原生方法\n * \n * 该方法通过不同的桥接方式(iOS WKWebView、Android WebView或iframe)与原生应用通信,\n * 发送指定的操作指令和参数,并返回处理结果\n * \n * @param action - 要执行的原生操作名称\n * @param params - 传递给原生方法的参数对象\n * @returns 处理后的原生返回数据\n * @throws 当发送消息到原生App失败时抛出错误\n */\n public callNativeSync(action: string, params: any, callbacks: CallbacksBase) {\n let data = undefined\n try {\n const messageString = JSON.stringify({ action, params });\n // 缓存 window 对象以避免重复类型检查\n const win = typeof window !== \"undefined\" ? (window as any) : undefined;\n\n // iOS WKWebView 环境下的同步消息发送\n if (win?.webkit?.messageHandlers?.nativeBridge?.postSyncMessage) {\n this.log(`发送消息到 iOS WKWebView: ${messageString}`);\n data = win.webkit.messageHandlers.nativeBridge.postSyncMessage(messageString);\n // Android 环境下的同步消息发送\n } else if (win?.AndroidBridge?.postSyncMessage) {\n this.log(`发送消息到安卓原生App: ${messageString}`);\n data = win.AndroidBridge.postSyncMessage(messageString);\n // 其他环境使用 iframe 方式通信\n } else if (win) {\n try {\n const iframe = document.createElement(\"iframe\");\n iframe.style.display = \"none\";\n iframe.src = `yourapp://bridge?message=${encodeURIComponent(\n messageString\n )}`;\n document.body.appendChild(iframe);\n setTimeout(() => {\n document.body.removeChild(iframe);\n }, 0);\n return undefined; // 保持返回值类型一致\n } catch (iframeError: any) {\n callbacks?.fail?.(iframeError);\n throw createBridgeError(\n BridgeErrorCode.SYSTEM_ERROR,\n `创建 iframe 失败: ${(iframeError as Error).message}`\n );\n }\n }\n } catch (error: any) {\n callbacks?.fail?.(error);\n throw createBridgeError(\n BridgeErrorCode.SYSTEM_ERROR,\n `发送消息到原生App失败: ${(error as Error).message}`\n );\n }\n\n // 记录调试信息\n if (this.debugMode) {\n this.log(`收到原生回调: success`, data);\n }\n\n callbacks?.success?.(processJsonValue(data));\n return processJsonValue(data)\n }\n\n /**\n * 发送消息到原生\n */\n private sendToNative(message: any): void {\n try {\n const messageString = JSON.stringify(message);\n // iOS WKWebView 优先\n if (\n typeof window !== \"undefined\" &&\n (window as any).webkit &&\n (window as any).webkit.messageHandlers &&\n (window as any).webkit.messageHandlers.nativeBridge\n ) {\n this.log(`发送消息到 iOS WKWebView: ${messageString}`);\n (window as any).webkit.messageHandlers.nativeBridge.postMessage(\n messageString\n );\n }\n // Android 调用\n else if (\n (window as any).AndroidBridge &&\n (window as any).AndroidBridge.postMessage\n ) {\n this.log(`发送消息到安卓原生App: ${messageString}`);\n (window as any).AndroidBridge.postMessage(messageString);\n }\n // 回退到 iframe(旧版 iOS)\n else {\n const iframe = document.createElement(\"iframe\");\n iframe.style.display = \"none\";\n iframe.src = `yourapp://bridge?message=${encodeURIComponent(\n messageString\n )}`;\n document.body.appendChild(iframe);\n setTimeout(() => {\n document.body.removeChild(iframe);\n }, 0);\n }\n } catch (error) {\n throw createBridgeError(\n BridgeErrorCode.SYSTEM_ERROR,\n `发送消息到原生App失败: ${(error as Error).message}`\n );\n }\n }\n\n /**\n * 处理原生回调\n */\n public handleNativeCallback(\n callbackId: string,\n type: \"success\" | \"fail\",\n data: any\n ): void {\n const callbacks = this.callbackMap.get(callbackId);\n \n if (!callbacks) {\n this.warn(`未找到回调ID: ${callbackId}`);\n return;\n }\n\n // 清除超时计时器\n if (this.pendingCalls.has(callbackId)) {\n clearTimeout(this.pendingCalls.get(callbackId));\n this.pendingCalls.delete(callbackId);\n }\n\n // 记录调试信息\n if (this.debugMode) {\n this.log(`收到原生回调: ${type}`, data);\n }\n\n try {\n if (type === \"success\" && callbacks.success) {\n callbacks.success(processJsonValue(data));\n } else if (type === \"fail\" && callbacks.fail) {\n let error: Error;\n\n if (data instanceof Error) {\n error = data;\n } else if (typeof data === \"string\") {\n error = new Error(data);\n } else if (data && data.message) {\n error = new Error(data.message);\n if (data.code) {\n (error as any).code = data.code;\n }\n } else {\n error = new Error(\"未知错误\");\n }\n\n callbacks.fail(error);\n }\n\n if (callbacks.complete) {\n callbacks.complete();\n }\n } catch (error) {\n this.error(\"执行回调函数时出错\", error as Error);\n }\n\n // 执行完后移除回调\n this.callbackMap.delete(callbackId);\n }\n\n /**\n * 模拟原生调用(仅用于开发测试)\n */\n private mockNativeCall(message: any): void {\n if (this.debugMode) {\n this.log(\"模拟原生调用:\", message);\n }\n\n // 根据action模拟不同的原生功能\n switch (message.action) {\n case \"ready\":\n // 模拟原生准备就绪\n setTimeout(() => {\n const event = new Event(\"NativeBridgeReady\");\n document.dispatchEvent(event);\n }, 100);\n break;\n default:\n // 查找已安装的插件,委托处理mock\n for (const [plugin] of this.plugins.entries()) {\n if (\n (plugin as any).mockAction &&\n typeof (plugin as any).mockAction === \"function\"\n ) {\n if ((plugin as any).mockAction(message)) {\n return; // 如果插件处理了,则返回\n }\n }\n }\n\n this.warn(`未实现的模拟功能: ${message.action}`);\n }\n }\n\n /**\n * 释放回调\n */\n public releaseCallback(callbackId: string): void {\n if (this.callbackMap.has(callbackId)) {\n this.callbackMap.delete(callbackId);\n }\n\n if (this.pendingCalls.has(callbackId)) {\n clearTimeout(this.pendingCalls.get(callbackId));\n this.pendingCalls.delete(callbackId);\n }\n }\n\n /**\n * 设置调试模式\n */\n public setDebug(debug: boolean): void {\n this.debugMode = debug;\n\n if (debug) {\n console.log(\"[NativeBridge] 调试模式已开启 ✅\");\n } else {\n console.log(\"[NativeBridge] 调试模式已关闭 ❌\");\n }\n }\n\n /**\n * 设置全局错误处理器\n */\n public setErrorHandler(\n handler: (error: Error, source: string) => void\n ): void {\n this.errorHandler = handler;\n }\n\n /**\n * 获取已安装插件列表\n */\n public getInstalledPlugins(): string[] {\n return Array.from(this.plugins.keys());\n }\n\n /**\n * 获取当前调试模式状态\n * @returns 是否开启调试模式\n */\n public isDebugMode(): boolean {\n return this.debugMode;\n }\n\n /**\n * 日志记录 - 信息\n */\n public log(message: string, ...args: any[]): void {\n // 强制输出一个标记消息,确保调试状态可以直观验证\n if (message.includes(\"调试模式已\")) {\n console.log(`[NativeBridge] 📢 ${message}`, ...args);\n return;\n }\n\n if (this.debugMode) {\n console.log(`[NativeBridge] ${message}`, ...args);\n }\n }\n\n /**\n * 日志记录 - 警告\n */\n public warn(message: string, ...args: any[]): void {\n if (this.debugMode) {\n console.warn(`[NativeBridge] ⚠️ ${message}`, ...args);\n }\n }\n\n /**\n * 日志记录 - 错误\n */\n public error(source: string, error: Error): void {\n console.error(`[NativeBridge] 🛑 ${source}:`, error);\n\n if (this.errorHandler) {\n try {\n this.errorHandler(error, source);\n } catch (handlerError) {\n console.error(\"[NativeBridge] 错误处理器执行失败:\", handlerError);\n }\n }\n }\n\n /**\n * 获取回调映射表\n */\n public getCallBackMap() {\n return this.callbackMap;\n }\n}\n\n/**\n * 判断是否为JSON字符串,如果是则进行转义,否则直接返回原值\n * \n * @param value - 需要检查和处理的值\n * @returns 如果是JSON字符串则返回转义后的字符串,否则返回原值\n * \n * @example\n * ```typescript\n * const jsonStr = '{\"name\":\"test\",\"value\":\"hello\\\"world\"}';\n * const result = processJsonValue(jsonStr);\n * // 返回转义后的字符串: \"{\\\"name\\\":\\\"test\\\",\\\"value\\\":\\\"hello\\\\\\\"world\\\"}\"\n * \n * const normalStr = 'hello world';\n * const result2 = processJsonValue(normalStr);\n * // 返回原值: \"hello world\"\n * ```\n */\nfunction processJsonValue(value: any): any {\n\n // 如果值为 undefined 或 null,直接返回\n if (value === undefined || value === null) {\n return value;\n }\n\n // 如果不是字符串类型,直接返回原值\n if (typeof value !== 'string') {\n return value;\n }\n\n // 如果是空字符串,直接返回\n if (value === '') {\n return value;\n }\n\n // 尝试解析字符串为JSON\n try {\n // 检查是否为有效的JSON字符串(以{[开头,以}]结尾)\n const trimmedValue = value.trim();\n if ((trimmedValue.startsWith('{') && trimmedValue.endsWith('}')) || \n (trimmedValue.startsWith('[') && trimmedValue.endsWith(']'))) {\n // 尝试解析\n JSON.parse(value);\n // 如果解析成功,说明是合法的JSON字符串,进行转义\n return JSON.parse(value);\n }\n // 不是JSON格式的字符串,直接返回原值\n return value;\n } catch (e) {\n // 解析失败,说明不是合法的JSON字符串,直接返回原值\n return value;\n }\n}\n\n// 导出工厂函数\nexport const createNativeBridge = (\n options?: BridgeOptions\n): NativeBridgeCore => {\n return NativeBridgeCore.getInstance(options);\n};\n\n// 导出默认单例\nexport default NativeBridgeCore.getInstance();\n","/**\n * 位置信息插件\n */\nimport { BridgePlugin, PluginContext, CallbacksBase } from \"../core\";\nimport { BridgeErrorCode, createBridgeError } from \"../core/errors\";\n\nexport interface LocationInfo {\n /** 经度 */\n longitude: number;\n /** 纬度 */\n latitude: number;\n /** 实际的定位精度半径(单位米) */\n accuracy: number;\n /** 格式化地址,如:北京市朝阳区南磨房镇北京国家广告产业园区 */\n address: string;\n /** 省份,如:北京市 */\n province: string;\n /** 城市,直辖市会返回空 */\n city: string;\n /** 行政区,如:朝阳区 */\n district: string;\n /** 街道,如:西大望路甲12-2号楼 */\n road: string;\n /** 当前设备网络类型,如:wifi、3g等 */\n netType: string;\n /** 当前设备使用移动运营商,如:CMCC等 */\n operatorType: string;\n /** 对错误码的描述 */\n errorMessage?: string;\n /** 错误码 */\n errorCode?: number;\n /** 仅Android支持,wifi设置是否开启,不保证已连接上 */\n isWifiEnabled?: boolean;\n /** 仅Android支持,gps设置是否开启,不保证已经连接上 */\n isGpsEnabled?: boolean;\n /** 仅Android支持,定位返回的经纬度是否是模拟的结果 */\n isFromMock?: boolean;\n /** 仅Android支持,我们使用的是混合定位,具体定位提供者有wifi/lbs/gps\" 这三种 */\n provider?: \"wifi\" | \"lbs\" | \"gps\";\n /** 仅Android支持,移动网络是设置是否开启,不保证已经连接上 */\n isMobileEnabled: boolean;\n}\n\nexport interface GetLocationOptions extends CallbacksBase {\n success?: (location: string) => void;\n /**\n * 期望定位精度半径(单位米),定位结果尽量满足该参数要求,但是不一定能保证小于该误差,\n * 开发者需要读取返回结果的 accuracy 字段校验坐标精度;\n * 建议按照业务需求设置定位精度,推荐采用200m,\n * 可获得较好的精度和较短的响应时长\n */\n targetAccuracy: number;\n /** 1:获取高德坐标, 0:获取标准坐标;推荐使用高德坐标;标准坐标没有address字段 */\n coordinate: number;\n /** 是否需要带有逆地理编码信息;该功能需要网络请求,请更具自己的业务场景使用 */\n withReGeocode: boolean;\n /** 是否缓存地理位置信息。默认是true。如果true,客户端会对定位的地理位置信息缓存,在缓存期内(2分钟)再次定位会返回旧的定位 */\n useCache: boolean;\n}\n\ndeclare module \"../core\" {\n interface PluginMethods {\n /**\n * 同步获取位置信息\n * @param options 定位选项\n */\n getLocationSync: (options?: GetLocationOptions) => void;\n /**\n * 异步获取位置信息\n * @param options 定位选项\n */\n getLocation: (\n options?: Omit<GetLocationOptions, \"success\" | \"fail\">\n ) => Promise<LocationInfo>;\n }\n interface NativeBridgeCore extends PluginMethods {}\n}\n\nclass LocationPlugin implements BridgePlugin {\n public readonly name = \"location\";\n public readonly version = \"1.0.0\";\n private context?: PluginContext;\n\n public install(context: PluginContext): void {\n this.context = context;\n context.bridge.registerMethod(\n \"getLocationSync\",\n this.getLocationSync.bind(this)\n );\n context.bridge.registerMethod(\"getLocation\", this.getLocation.bind(this));\n context.bridge.log(`位置服务插件 v${this.version} 已安装`);\n }\n\n /**\n * 获取当前位置信息\n * @param options - 位置选项,可选参数包括:\n * - targetAccuracy: 目标精度,单位米,默认200\n * - coordinate: 坐标类型,默认1(可能表示WGS84)\n * - withReGeocode: 是否需要逆地理编码,默认true\n * - useCache: 是否使用缓存,默认true\n * @returns 返回一个Promise,解析为LocationInfo对象\n */\n public getLocation(\n options: Omit<GetLocationOptions, \"success\" | \"fail\"> = {\n targetAccuracy: 200,\n coordinate: 1,\n withReGeocode: true,\n useCache: true,\n }\n ): Promise<LocationInfo> {\n // 设置默认值\n options.useCache = options.useCache ?? true; // 默认使用缓存\n return new Promise((resolve, reject) => {\n this.getLocationSync({\n ...options,\n success: (location: any) => {\n resolve(location);\n },\n fail: (error: any) => reject(error),\n });\n });\n }\n\n public getLocationSync(\n options: GetLocationOptions = {\n targetAccuracy: 200,\n coordinate: 1,\n withReGeocode: true,\n useCache: true,\n }\n ): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查必需参数\n if (typeof options.targetAccuracy !== \"number\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"targetAccuracy参数格式错误\"\n );\n }\n if (typeof options.coordinate !== \"number\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"coordinate参数格式错误\"\n );\n }\n if (typeof options.withReGeocode !== \"boolean\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"withReGeocode参数格式错误\"\n );\n }\n if (typeof options.useCache !== \"boolean\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"useCache参数格式错误\"\n );\n }\n\n // 设置默认值\n options.useCache = options.useCache ?? true; // 默认使用缓存\n const callbacks: CallbacksBase = {\n success: options.success,\n fail: options.fail,\n complete: options.complete,\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"getLocation\",\n params: options,\n },\n callbacks\n );\n });\n }\n}\n\nexport const locationPlugin = new LocationPlugin();\nexport default locationPlugin;\n","/**\n * 设备信息插件\n * 提供设备相关信息和功能\n */\n\nimport {\n BridgePlugin,\n PluginContext,\n CallbacksBase,\n\n} from \"../core\";\nimport { BridgeErrorCode, createBridgeError } from \"../core/errors\";\n\n// 类型定义\nexport interface DeviceInfo {\n model: string; // 设备型号\n pixelRatio: number; // 设备像素比\n windowWidth: number; // 窗口宽度\n windowHeight: number; // 窗口高度\n version: string; // 版本号\n storage: string; // 存储空间\n currentBattery: string; // 当前电量百分比\n system: string; // 系统版本\n platform: string; // 系统名:Android,iOS。\n screenWidth: number; // 屏幕宽度\n screenHeight: number; // 屏幕高度\n brand: string; // 设备品牌\n fontSizeSetting: number; // 字体大小设置\n}\n\nexport interface DeviceInfoOptions extends CallbacksBase {\n success?: (deviceInfo: DeviceInfo) => void; // 覆盖基础类型,指定具体返回类型\n}\n\nexport interface GetWifiOptions extends CallbacksBase {\n /** 超时时间 int 必选 */\n timeout?: number;\n /** 缓存时间 int 必选 */\n cacheTime?: number;\n}\nexport interface KeepScreenOnOptions extends CallbacksBase {\n /** 是否保持屏幕常亮 */\n isKeep: boolean;\n}\n\n\n/**\n * 获取WIFI 返回结果定义\n * @apiName device.base.getScanWifiListAsync\n */\nexport interface WifiListAsyncResult {\n /** 错误码 int枚举值 必选 取值{ 0:成功 1:json错误 2:系统错误 3:超时 } */\n resultCode: number;\n /** WiFi列表 */\n wifiList?: any[];\n /** 成功或错误信息 */\n resultMessage?: string;\n}\n\n// 获取设备UUID,重新安装后UUID改变\nexport interface GetDeviceUUIDOptions extends CallbacksBase {\n uuid?: string; // 覆盖基础类型,指定具体返回类型\n}\n\n// 定义插件方法类型\ndeclare module \"../core\" {\n interface PluginMethods {\n getSystemInfo: (options?: DeviceInfoOptions) => Promise<DeviceInfo>;\n getSystemInfoSync: (options?: DeviceInfoOptions) => void;\n getUUID: () => Promise<GetDeviceUUIDOptions>;\n getWifiList: (options?: GetWifiOptions) => Promise<WifiListAsyncResult>;\n setKeepScreenOn: (options: KeepScreenOnOptions) => void;\n }\n interface NativeBridgeCore extends PluginMethods { }\n}\n/**\n * 设备信息插件类\n */\nclass DevicePlugin implements BridgePlugin {\n public readonly name = \"device\";\n public readonly version = \"1.0.0\";\n private context?: PluginContext;\n\n /**\n * 安装插件\n */\n public install(context: PluginContext): void {\n this.context = context;\n // 在桥接对象上挂载方法\n context.bridge.registerMethod(\"getSystemInfo\", this.getSystemInfo.bind(this));\n context.bridge.registerMethod(\"getSystemInfoSync\", this.getSystemInfoSync.bind(this));\n context.bridge.registerMethod(\"getWifiList\", this.getWifiList.bind(this));\n context.bridge.registerMethod(\"getUUID\", this.getUUID.bind(this));\n context.bridge.registerMethod(\n \"setKeepScreenOn\",\n this.setKeepScreenOn.bind(this)\n );\n context.bridge.log(`设备信息插件 v${this.version} 已安装`);\n }\n\n /**\n * 设置屏幕常亮状态\n * @param options 配置选项\n * @param options.isKeep 是否保持屏幕常亮,默认为true\n * @param options.success 成功回调\n * @param options.fail 失败回调\n * @param options.complete 完成回调\n * @returns void\n */\n public setKeepScreenOn(\n options: KeepScreenOnOptions\n ): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 校验必填值\n if (options.isKeep === undefined || options.isKeep === null) {\n throw createBridgeError(\n BridgeErrorCode.JSON_ERROR,\n \"缺少必需参数:isKeep\"\n );\n }\n\n // 判断参数\n if (options.isKeep !== undefined && typeof options.isKeep !== \"boolean\") {\n throw createBridgeError(\n BridgeErrorCode.JSON_ERROR,\n \"isKeep参数格式不正确\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: options.success,\n fail: options.fail,\n complete: options.complete,\n };\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"setKeepScreenOn\",\n params: { isKeep: options.isKeep },\n },\n callbacks\n );\n });\n }\n\n /**\n * 同步获取设备系统信息\n * \n * @param options - 获取设备信息的配置选项\n * @returns any - 返回设备信息结果\n */\n public getSystemInfoSync(options: DeviceInfoOptions = {}): any {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 创建回调对象,用于处理成功、失败和完成事件\n const callbacks: CallbacksBase = {\n success: (res: any) => {\n options.success?.(res);\n },\n fail: options.fail,\n complete: options.complete,\n };\n\n return this.context?.bridge.callNativeSync('getSystemInfoSync', {}, callbacks)\n }\n\n /**\n * 获取设备信息(Promise 风格)\n * \n * @description\n * 1. 检查插件是否初始化,未初始化则抛出错误\n * 2. 创建并返回一个Promise,用于异步获取设备信息\n * 3. 通过Native Bridge调用原生能力获取设备信息\n * \n * @throws {BridgeError} 当插件未初始化时抛出错误\n * @returns {Promise<DeviceInfo>} 返回包含设备信息的Promise对象\n */\n public getSystemInfo(): Promise<DeviceInfo> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: (res) => {\n resolve(res);\n },\n fail: (err) => {\n reject(err);\n },\n complete: () => {\n // 可选:做一些清理或统一处理\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"getSystemInfo\",\n params: {},\n },\n callbacks\n );\n });\n });\n };\n\n /**\n * 获取WiFi列表\n * \n * 该方法通过原生桥接获取当前可用的WiFi列表,返回一个Promise对象\n * \n * @param {GetWifiOptions} [options={}] - 获取WiFi列表的可选参数对象\n * @returns {Promise<WifiListAsyncResult>} 返回一个Promise,解析后包含WiFi列表或错误信息\n * - resultCode: 0表示成功,1表示失败\n * - resultMessage: 结果描述信息\n * - wifiList: WiFi列表数组\n */\n public getWifiList(\n options: GetWifiOptions = {}\n ): Promise<WifiListAsyncResult> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查可选参数\n if (options.timeout !== undefined && (typeof options.timeout !== \"number\" || options.timeout <= 0 || !Number.isInteger(options.timeout))) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"timeout参数格式错误\"\n );\n }\n\n if (options.cacheTime !== undefined && (typeof options.cacheTime !== \"number\" || options.cacheTime <= 0 || !Number.isInteger(options.cacheTime))) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"cacheTime参数格式错误\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: (res: any) => {\n resolve(res);\n },\n fail: (err: Error) => {\n const resp: WifiListAsyncResult = {\n resultCode: 1,\n resultMessage: err.message,\n wifiList: [],\n };\n console.error(\"保存失败:\", resp);\n reject(resp);\n },\n complete: () => {\n // 可选:做一些清理或统一处理\n },\n };\n\n // 确保桥接环境就绪后调用原生方法。\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"getWifiList\",\n params: { ...options },\n },\n callbacks\n );\n });\n });\n }\n\n /**\n * 获取设备的唯一标识符\n * @returns 返回一个Promise,解析后得到设备的UUID信息\n * @throws 如果插件未正确初始化会抛出错误\n */\n public getUUID(): Promise<GetDeviceUUIDOptions> {\n return new Promise((resolve, reject) => {\n const callbacks: CallbacksBase = {\n success: (res) => {\n resolve(res);\n },\n fail: (err) => {\n reject(err);\n },\n }\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"getUUID\",\n params: {},\n },\n callbacks\n );\n });\n });\n }\n\n}\n\n// 导出插件实例\nexport const devicePlugin = new DevicePlugin();\nexport default devicePlugin;\n","/**\n * 设备信息插件\n * 提供设备相关信息和功能\n */\n\nimport {\n BridgePlugin,\n PluginContext,\n CallbacksBase,\n NativeResponse,\n} from \"../core\";\nimport { BridgeErrorCode, createBridgeError } from \"../core/errors\";\n\n// 类型定义\nexport interface MediaInfo {\n platform: \"android\" | \"ios\" | \"unknown\"; // 平台\n url: string;\n}\n\nexport interface MediaInfoOptions extends CallbacksBase {\n url: string; // 要保存的图片地址\n}\n\nexport interface ScanOptions extends CallbacksBase {\n /**\n * 扫码样式。\n * 可选值:\n * - 'qr':二维码扫码框\n * - 'bar':条形码扫码框\n * 默认为 'qr'。\n * 兼容性说明:此字段从必填变为可选,未传递时将使用默认值 'qr',如之前为必填请注意兼容性。\n */\n key?: \"qr\" | \"bar\";\n /**\n * 是否支持从相册选择:\n * 默认值为 true,\n */\n isSupportAlbum?: boolean;\n}\n\nexport interface ScanRes {\n /** 扫码所得数据 */\n code?: string;\n /**\n * 扫描二维码时返回二维码数据。\n */\n qrCode?: string;\n /**\n * 扫描条形码时返回条形码数据。\n */\n barCode?: string;\n /**\n * 扫描结果的最后一帧图片的本地定位符\n */\n filePath?: string;\n /**\n * 扫描结果的最后一帧图片的本地真实图片路径。\n */\n fileRealPath?: string;\n}\n\nexport interface ChooseImageOptions extends CallbacksBase {\n count?: number; // 最大可选照片数 默认值:1。\n sourceType?: string[]; // 相册选取或者拍照。默认值:['camera','album']\n}\nexport interface ChooseImageResponse {\n filePaths: string[]; // 图片文件描述。\n fileRealPaths: string[]; // 图片文件真实路径。\n}\n\nexport interface previewImageOptions extends CallbacksBase {\n urls: string[]; // 要预览的图片链接列表\n current?: number; // 当前显示图片索引。 默认值:0。\n}\n\nexport interface compressImageOptions extends CallbacksBase {\n filePaths: string[]; // 压缩后的路径数组。\n compressLevel?: number; // 压缩级别,支持 0 ~ 4 的整数 默认 4\n}\n\nexport interface compressImageResponse {\n filePaths: string; // 压缩后的图片路径\n}\n\nexport interface ChooseVideoOptions extends CallbacksBase {\n sourceType?: string[]; // 可以指定来源是相册还是相机,默认值:['album','camera']\n maxDuration?: number; // 视频最长拍摄时间,单位秒,默认60秒 \n}\n\nexport interface ChooseVideoResponse {\n filePath: string; // 选定视频的临时文件路径\n duration: number; // 视频时长,单位秒\n size: number; // 视频文件大小,单位字节\n height: number; // 视频高度\n width: number; // 视频宽度\n}\n\n// 视频最大时长(秒),如需调整请修改此常量\nconst MAX_VIDEO_DURATION = 60;\n\ndeclare module \"../core\" {\n interface PluginMethods {\n saveImage: (options: MediaInfoOptions) => Promise<NativeResponse>;\n scan: (options: ScanOptions) => Promise<ScanRes>;\n chooseImage: (options?: ChooseImageOptions) => Promise<ChooseImageResponse>;\n previewImage: (options: previewImageOptions) => Promise<void>;\n compressImage: (options: compressImageOptions) => Promise<compressImageResponse>;\n chooseVideo: (options?: ChooseVideoOptions) => Promise<ChooseVideoResponse>;\n }\n interface NativeBridgeCore extends PluginMethods { }\n}\n\n/**\n * 设备信息插件类\n */\nclass MediaPlugin implements BridgePlugin {\n public readonly name = \"media\";\n public readonly version = \"1.0.0\";\n private context?: PluginContext;\n\n /**\n * 安装插件\n */\n public install(context: PluginContext): void {\n this.context = context;\n // 在桥接对象上挂载方法\n context.bridge.registerMethod(\"saveImage\", this.saveImage.bind(this));\n context.bridge.registerMethod(\"scan\", this.scan.bind(this));\n context.bridge.registerMethod(\"chooseImage\", this.chooseImage.bind(this));\n context.bridge.registerMethod(\"previewImage\", this.previewImage.bind(this));\n context.bridge.registerMethod(\"compressImage\", this.compressImage.bind(this));\n context.bridge.registerMethod(\"chooseVideo\", this.chooseVideo.bind(this));\n context.bridge.log(`设备信息插件 v${this.version} 已安装`);\n }\n\n\n /**\n * 执行扫码功能\n * \n * @description 调用原生扫码功能,返回扫码结果。该方法会等待桥接准备就绪后调用原生扫码API。\n * \n * @param options - 扫码配置选项,排除了success和fail回调\n * @param options.complete - 可选的完成回调函数,无论成功或失败都会执行\n * \n * @returns Promise<ScanRes> 返回包含扫码结果的Promise对象\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出PLUGIN_NOT_INITIALIZED错误\n * @throws {BridgeError} 当扫码失败时抛出SYSTEM_ERROR错误\n * \n * @example\n */\n public scan(\n options: Omit<ScanOptions, \"success\" | \"fail\">\n ): Promise<ScanRes> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查参数\n if ((options.key !== undefined && typeof options.key !== \"string\") || (options.key !== undefined && ![\"qr\", \"bar\"].includes(options.key))) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"key参数格式不正确\"\n );\n }\n\n if (options.isSupportAlbum !== undefined && typeof options.isSupportAlbum !== \"boolean\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"isSupportAlbum参数格式不正确\"\n );\n }\n\n // 设置默认值\n options.key = options.key || \"qr\"; // 默认使用二维码扫码\n options.isSupportAlbum = options.isSupportAlbum ?? true; // 默认支持相册选择\n const callbacks: CallbacksBase = {\n success: (res: any) => {\n resolve(res);\n },\n fail: (err: any) => {\n reject(\n createBridgeError(BridgeErrorCode.SYSTEM_ERROR, \"扫码失败\", err)\n );\n },\n complete: () => {\n options.complete?.();\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"scan\",\n params: { ...options },\n },\n callbacks\n );\n });\n });\n }\n\n /**\n * 保存图片到相册(Promise 风格)\n */\n public saveImage(options: MediaInfoOptions): Promise<NativeResponse> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查必需参数\n if (!options.url) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"缺少必需参数:url\"\n );\n }\n\n // 检查 URL 格式\n if (typeof options.url !== \"string\" || !options.url.trim()) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"url参数格式不正确\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: (res: any) => {\n console.log(\"保存成功:\", res);\n const resp: NativeResponse = {\n code: 1,\n message: \"保存成功\",\n data: res,\n };\n resolve(resp);\n },\n fail: (err: any) => {\n const resp: NativeResponse = {\n code: 2,\n message: \"保存失败\",\n data: err,\n };\n console.error(\"保存失败:\", resp);\n reject(resp);\n },\n complete: () => {\n options.complete?.();\n // 可选:做一些清理或统一处理\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"saveImage\",\n params: { url: options.url },\n },\n callbacks\n );\n });\n });\n }\n\n /**\n * 选择图片功能\n * @param options 选择图片的配置选项\n * @returns 返回一个Promise,解析为选择的图片响应数据\n */\n public chooseImage(options: ChooseImageOptions = {}): Promise<ChooseImageResponse> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查 count\n if (options.count !== undefined && (typeof options.count !== \"number\" || options.count <= 0 || !Number.isInteger(options.count))) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"count参数格式不正确\"\n );\n }\n\n const validSourceType = ['camera', 'album'];\n if ((options.sourceType && !Array.isArray(options.sourceType)) || (options.sourceType && options.sourceType.length === 0)) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"sourceType参数格式不正确\"\n );\n }\n\n if (options.sourceType && options.sourceType.some(type => !validSourceType.includes(type))) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"sourceType参数格式不正确\"\n );\n }\n\n // 设置默认值\n options.count = options.count || 1; // 默认选择1张图片\n options.sourceType = options.sourceType || [\"camera\", \"album\"]; // 默认支持相机和相册\n const callbacks: CallbacksBase = {\n success: (res) => {\n resolve(res || { filePaths: [], fileRealPaths: [] });\n },\n fail: (err: any) => {\n console.error(\"选择图片失败:\", err);\n reject(err);\n },\n complete: () => {\n // 可选:做一些清理或统一处理\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"chooseImage\",\n params: options,\n },\n callbacks\n );\n });\n });\n }\n\n /** \n * 预览图片功能\n * @param options 预览图片的配置参数对象,包含以下属性:\n * - current: 可选,number类型,默认0,表示从第几张图片开始预览\n * - urls: string[]类型,图片URL数组\n * - 其他可能的自定义参数\n * @returns Promise<void> \n * 成功时:解析为原生返回的结果对象(已JSON.parse处理)\n * 失败时:拒绝返回错误信息\n */\n public previewImage(options: previewImageOptions): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查参数\n if (!options.urls || !Array.isArray(options.urls) || options.urls.length === 0) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"urls参数格式不正确\"\n );\n }\n\n // 设置默认值\n options.current = options.current || 0; // 默认显示第一张图片\n const callbacks: CallbacksBase = {\n success: (res) => {\n resolve(res);\n },\n fail: (err) => {\n reject(err);\n },\n complete: () => {\n // 可选:做一些清理或统一处理\n },\n };\n this.context?.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"previewImage\",\n params: options,\n },\n callbacks\n );\n });\n });\n }\n\n /**\n * 压缩图片\n * @param options 压缩图片的配置选项\n * @returns 返回一个Promise,解析为压缩后的图片响应数据\n */\n public compressImage(options: compressImageOptions): Promise<compressImageResponse> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n if (!options.filePaths || !Array.isArray(options.filePaths) || options.filePaths.length === 0) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"filePaths参数格式不正确\"\n );\n }\n\n // 检查 compressLevel 0-4的整数\n if (options.compressLevel !== undefined && (typeof options.compressLevel !== \"number\" || options.compressLevel < 0 || options.compressLevel > 4 || !Number.isInteger(options.compressLevel))) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"compressLevel参数格式不正确\"\n );\n }\n\n // 设置默认值\n options.compressLevel = options.compressLevel ?? 4; // 默认压缩级别为4\n const callbacks: CallbacksBase = {\n success: (res) => {\n resolve(res || { filePaths: \"\" });\n },\n fail: (err: any) => {\n console.error(\"压缩图片失败:\", err);\n reject(err);\n },\n complete: () => {\n // 可选:做一些清理或统一处理\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"compressImage\",\n params: options,\n },\n callbacks\n );\n });\n });\n }\n\n /**\n * 选择视频文件\n * @param options 选择视频的配置选项,包含以下属性:\n * @param options.sourceType 视频来源类型,默认同时支持相册和相机['album','camera']\n * @param options.maxDuration 视频最大时长(秒),默认60秒\n * @returns Promise<ChooseVideoResponse> 返回包含视频信息的Promise对象\n * @returns ChooseVideoResponse.filePath 视频临时文件路径\n * @returns ChooseVideoResponse.duration 视频时长(秒)\n * @returns ChooseVideoResponse.size 视频文件大小(字节)\n * @returns ChooseVideoResponse.height 视频高度\n * @returns ChooseVideoResponse.width 视频宽度\n */\n public chooseVideo(options: ChooseVideoOptions = {}): Promise<ChooseVideoResponse> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查 sourceType\n const validSourceType = ['camera', 'album'];\n if ((options.sourceType && !Array.isArray(options.sourceType)) || (options.sourceType && options.sourceType.length === 0)) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"sourceType参数格式不正确\"\n );\n }\n\n if (options.sourceType && options.sourceType.some(type => !validSourceType.includes(type))) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"sourceType参数格式不正确\"\n );\n }\n\n // 检查 maxDuration\n // 判断是否IOS\n const isIOS = /(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent);\n let MIN_VIDEO_DURATION = 5;\n if (isIOS) {\n MIN_VIDEO_DURATION = 15\n }\n if (options.maxDuration !== undefined && (typeof options.maxDuration !== \"number\" || options.maxDuration < MIN_VIDEO_DURATION || options.maxDuration > MAX_VIDEO_DURATION || !Number.isInteger(options.maxDuration))) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"maxDuration参数格式不正确\"\n );\n }\n\n // 设置默认值\n options.sourceType = options.sourceType || [\"album\", \"camera\"]; // 默认支持相册和相机\n options.maxDuration = options.maxDuration ?? MAX_VIDEO_DURATION;\n const callbacks: CallbacksBase = {\n success: (res) => {\n resolve(res || { filePath: \"\", duration: 0, size: 0, height: 0, width: 0 });\n },\n fail: (err: any) => {\n console.error(\"选择视频失败:\", err);\n reject(err);\n },\n complete: () => {\n // 可选:做一些清理或统一处理\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"chooseVideo\",\n params: options,\n },\n callbacks\n );\n });\n });\n }\n}\n\n// 导出插件实例\nexport const mediaPlugin = new MediaPlugin();\nexport default mediaPlugin;\n","/**\n * 导航插件\n */\nimport {\n BridgePlugin,\n PluginContext,\n CallbacksBase,\n NativeResponse,\n} from \"../core\";\nimport {\n BridgeErrorCode,\n createBridgeError,\n BridgeError,\n} from \"../core/errors\";\n\nexport interface NavigateInfo extends CallbacksBase {\n url: string;\n}\n\nexport interface NavigationBarOptions extends CallbacksBase {\n /** 是否显示导航栏\n * 默认显示\n * 否:隐藏导航栏\n */\n isShowBar?: boolean;\n /** 导航栏标题 */\n title?: string;\n /** 导航栏标题颜色\n * 导航栏背景色,支持十六进制颜色值。\n */\n backgroundColor?: string;\n /** 是否重置导航栏背景色默认配色。\n */\n reset?: boolean;\n}\n\nexport interface navigateBackInfo extends CallbacksBase {\n delta?: number; // 默认1\n}\n\n// openLink\nexport interface OpenLinkOptions extends CallbacksBase {\n url: string;\n enableShare?: boolean; // 默认false\n}\n\ndeclare module \"../core\" {\n interface PluginMethods {\n /**\n * 导航到指定页面\n * @param options 导航选项\n */\n navigateTo: (options: NavigateInfo) => void;\n /**\n * 重定向到指定页面\n * @param options 导航选项\n */\n redirectTo: (options: NavigateInfo) => void;\n /**\n * 重新加载当前页面\n * @param options 导航选项\n */\n reLaunch: (options: NavigateInfo) => void;\n /**\n * 返回到上一个页面\n * @param options 导航选项\n */\n navigateBack: (options: navigateBackInfo) => void;\n /**\n * 设置导航栏\n * @param options 样式选项\n */\n setNavigationBar: (options: NavigationBarOptions) => Promise<void>;\n /**\n * 打开外部链接\n * @param options 链接选项\n */\n openLink: (options: OpenLinkOptions) => Promise<void>;\n }\n interface NativeBridgeCore extends PluginMethods { }\n}\n\nclass NavigatePlugin implements BridgePlugin {\n public readonly name = \"navigate\";\n public readonly version = \"1.0.0\";\n private context?: PluginContext;\n\n public install(context: PluginContext): void {\n this.context = context;\n context.bridge.registerMethod(\"navigateTo\", this.navigateTo.bind(this));\n context.bridge.registerMethod(\"redirectTo\", this.redirectTo.bind(this));\n context.bridge.registerMethod(\"reLaunch\", this.reLaunch.bind(this));\n context.bridge.registerMethod(\"navigateBack\", this.navigateBack.bind(this));\n context.bridge.registerMethod(\n \"setNavigationBar\",\n this.setNavigationBar.bind(this)\n );\n context.bridge.registerMethod(\"openLink\", this.openLink.bind(this));\n context.bridge.log(`导航插件 v${this.version} 已安装`);\n }\n\n public setNavigationBar(options: NavigationBarOptions): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查必需参数\n if (options.isShowBar !== undefined && typeof options.isShowBar !== \"boolean\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"缺少必需的参数: isShowBar\"\n );\n }\n\n // 检查可选参数\n if (options.title !== undefined && typeof options.title !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"title参数格式不正确\"\n );\n }\n\n if (\n options.backgroundColor !== undefined &&\n (typeof options.backgroundColor !== \"string\" ||\n !/^#[0-9A-Fa-f]{6}$/.test(options.backgroundColor))\n ) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"backgroundColor参数格式不正确\"\n );\n }\n\n if (options.reset !== undefined && typeof options.reset !== \"boolean\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"reset参数格式不正确\"\n );\n }\n\n // 默认值\n options.isShowBar = options.isShowBar ?? true;\n const callbacks: CallbacksBase = {\n success: () => {\n resolve();\n },\n fail: (err: any) => {\n reject(\n createBridgeError(\n BridgeErrorCode.SYSTEM_ERROR,\n \"设置导航栏失败\",\n err\n )\n );\n },\n complete: () => { },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"setNavigationBar\",\n params: { ...options },\n },\n callbacks\n );\n });\n });\n }\n\n private navigate(options: NavigateInfo, type?: string) {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查必需参数\n if (!options || !options.url) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"缺少必需的参数: url\"\n );\n }\n\n if (typeof options.url !== \"string\" || !options.url.trim()) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"url参数格式错误\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: (res: any) => {\n const resp: NativeResponse = {\n code: BridgeErrorCode.SUCCESS,\n message: \"跳转成功\",\n data: res,\n };\n options.success?.(resp);\n },\n\n fail: (err: any) => {\n const resp: BridgeError = {\n code: BridgeErrorCode.SYSTEM_ERROR,\n message: \"跳转失败\",\n details: err,\n name: \"\",\n };\n options.fail?.(resp);\n },\n\n complete: () => {\n options.complete?.();\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: type || \"navigateTo\",\n params: { ...options },\n },\n callbacks\n );\n });\n }\n\n public navigateTo(options: NavigateInfo) {\n this.navigate(options, \"navigateTo\");\n }\n // 根据传入的options参数,执行redirectTo操作\n public redirectTo(options: NavigateInfo) {\n // 调用navigate方法,传入options参数和\"redirectTo\"字符串\n this.navigate(options, \"redirectTo\");\n }\n\n public reLaunch(options: NavigateInfo) {\n // 调用navigate方法,传入options参数和\"reLaunch\"字符串\n this.navigate(options, \"reLaunch\");\n }\n\n public navigateBack(options: navigateBackInfo) {\n // 调用navigate方法,传入options参数和\"navigateBack\"字符串\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查可选参数\n if (options.delta !== undefined && (typeof options.delta !== \"number\" || options.delta <= 0 || !Number.isInteger(options.delta))) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"delta参数格式不正确\"\n );\n }\n\n // 默认值\n options.delta = options.delta ?? 1;\n const callbacks: CallbacksBase = {\n success: (res: any) => {\n const resp: NativeResponse = {\n code: BridgeErrorCode.SUCCESS,\n message: \"跳转成功\",\n data: res,\n };\n options.success?.(resp);\n },\n\n fail: (err: any) => {\n const resp: BridgeError = {\n code: BridgeErrorCode.SYSTEM_ERROR,\n message: \"跳转失败\",\n details: err,\n name: \"\",\n };\n options.fail?.(resp);\n },\n\n complete: () => {\n options.complete?.();\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"navigateBack\",\n params: options,\n },\n callbacks\n );\n });\n }\n\n /**\n * 打开外部链接\n * @param options 链接选项\n * @returns Promise对象,解析为打开链接的响应\n */\n public async openLink(options: OpenLinkOptions): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查必需参数\n if (!options.url) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"缺少必需的参数: url\"\n );\n }\n\n if (typeof options.url !== \"string\" || !options.url.trim()) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"url参数格式错误\"\n );\n }\n\n // 检查可选参数\n if (options.enableShare !== undefined && typeof options.enableShare !== \"boolean\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"enableShare参数格式不正确\"\n );\n }\n\n // 默认值\n options.enableShare = options.enableShare || false;\n const callbacks: CallbacksBase = {\n success: () => {\n resolve();\n },\n fail: (err: any) => {\n reject(\n createBridgeError(\n BridgeErrorCode.SYSTEM_ERROR,\n \"打开链接失败\",\n err\n )\n );\n },\n complete: () => { },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"openLink\",\n params: { ...options },\n },\n callbacks\n );\n });\n });\n }\n}\n\nexport const navigatePlugin = new NavigatePlugin();\nexport default navigatePlugin;\n","/**\n * 导航插件\n */\nimport {\n BridgePlugin,\n PluginContext,\n CallbacksBase,\n} from \"../core\";\nimport {\n BridgeErrorCode,\n createBridgeError,\n BridgeError,\n} from \"../core/errors\";\n\nexport interface ToastParams {\n /** toast的类型 none, success, fail, exception*/\n type?: \"none\" | \"success\" | \"fail\" | \"exception\";\n /** 提示信息 */\n content: string;\n /** 显示持续时间,单位毫秒,默认2000ms,按系统规范[android只有两种(<=2s >2s)] */\n duration?: number;\n}\n\nexport interface LoadingParams {\n /** 提示信息 */\n content?: string;\n}\n\ndeclare module \"../core\" {\n interface PluginMethods {\n showToast: (options: ToastParams) => Promise<void>;\n hideToast: () => Promise<void>;\n showLoading: (options: LoadingParams) => Promise<void>;\n hideLoading: () => Promise<void>;\n }\n interface NativeBridgeCore extends PluginMethods { }\n}\n\nclass ToastPlugin implements BridgePlugin {\n public readonly name = \"toast\";\n public readonly version = \"1.0.0\";\n private context?: PluginContext;\n\n public install(context: PluginContext): void {\n this.context = context;\n context.bridge.registerMethod(\"showToast\", this.showToast.bind(this));\n context.bridge.registerMethod(\"hideToast\", this.hideToast.bind(this));\n context.bridge.registerMethod(\"showLoading\", this.showLoading.bind(this));\n context.bridge.registerMethod(\"hideLoading\", this.hideLoading.bind(this));\n\n context.bridge.log(`导航插件 v${this.version} 已安装`);\n }\n\n public hideLoading(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: (obj: any) => {\n resolve(obj);\n },\n fail: (err: any) => {\n const resp: BridgeError = {\n code: BridgeErrorCode.SYSTEM_ERROR,\n message: \"显示失败\",\n details: err,\n name: \"\",\n };\n reject(resp);\n },\n complete: () => {\n // 完成回调\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"hideLoading\",\n params: {},\n },\n callbacks\n );\n });\n });\n }\n public showLoading(options: LoadingParams): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查content格式\n if (options.content !== undefined && typeof options.content !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"content参数格式不正确\"\n );\n }\n\n\n const callbacks: CallbacksBase = {\n success: (obj: any) => {\n resolve(obj);\n },\n fail: (err: any) => {\n const resp: BridgeError = {\n code: BridgeErrorCode.SYSTEM_ERROR,\n message: \"显示失败\",\n details: err,\n name: \"\",\n };\n reject(resp);\n },\n complete: () => {\n // 完成回调\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"showLoading\",\n params: options,\n },\n callbacks\n );\n });\n });\n }\n /**\n * 显示Toast提示\n *\n * @param options Toast参数\n * @returns Promise<void>\n */\n public showToast(options: ToastParams): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n if ((options.type !== undefined && typeof options.type !== 'string') || (options.type !== undefined && ![\"none\", \"success\", \"fail\", \"exception\"].includes(options.type))) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"type参数格式不正确\"\n );\n }\n\n if (!options.content) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"缺少必需的参数: content\"\n );\n }\n\n if (typeof options.content !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"content参数格式不正确\"\n );\n }\n\n if (options.duration !== undefined && (typeof options.duration !== \"number\" || options.duration <= 0 || !Number.isInteger(options.duration))) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"duration参数格式不正确\"\n );\n }\n\n const { type, content, duration } = options;\n const callbacks: CallbacksBase = {\n success: (obj) => {\n resolve(obj);\n },\n fail: (err: any) => {\n const resp: BridgeError = {\n code: BridgeErrorCode.SYSTEM_ERROR,\n message: \"显示失败\",\n details: err,\n name: \"\",\n };\n reject(resp);\n },\n complete: () => {\n // 完成回调\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"showToast\",\n params: {\n type: type || 'none',\n content,\n duration: duration || 2000,\n },\n },\n callbacks\n );\n });\n });\n }\n\n /**\n * 隐藏Toast提示\n *\n * @returns Promise<void>\n */\n public hideToast(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: (obj: any) => {\n resolve(obj);\n },\n fail: (err: any) => {\n const resp: BridgeError = {\n code: BridgeErrorCode.SYSTEM_ERROR,\n message: \"显示失败\",\n details: err,\n name: \"\",\n };\n reject(resp);\n },\n complete: () => {\n // 完成回调\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"hideToast\",\n params: {},\n },\n callbacks\n );\n });\n });\n }\n}\n\nexport const toastPlugin = new ToastPlugin();\nexport default toastPlugin;\n","/**\n * 导航插件\n */\nimport {\n\tBridgePlugin,\n\tPluginContext,\n\tCallbacksBase,\n} from \"../core\";\nimport {\n\tBridgeErrorCode,\n\tcreateBridgeError,\n\tBridgeError,\n} from \"../core/errors\";\n\nexport interface ToastParams {\n\t/** toast的类型 none, success, fail, exception*/\n\ttype: \"none\" | \"success\" | \"fail\" | \"exception\";\n\t/** 提示信息 */\n\tcontent: string;\n\t/** 显示持续2000ms时间,单位秒,默认按系统规范[android只有两种(<=2s >2s)] */\n\tduration?: number;\n}\n\nexport interface LoadingParams {\n\t/** 提示信息 */\n\tcontent?: string;\n}\n\ndeclare module \"../core\" {\n\tinterface PluginMethods {\n getUserInfo: () => Promise<any>;\n }\n\tinterface NativeBridgeCore extends PluginMethods {}\n}\n\nclass UserInfoPlugin implements BridgePlugin {\n public readonly name = \"UserInfo\";\n public readonly version = \"1.0.0\";\n private context?: PluginContext;\n\n public install(context: PluginContext): void {\n this.context = context;\n context.bridge.registerMethod(\"getUserInfo\", this.getUserInfo.bind(this));\n\n context.bridge.log(`导航插件 v${this.version} 已安装`);\n }\n\n public getUserInfo(): Promise<any> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: (data: any) => {\n resolve(data);\n },\n fail: (err: any) => {\n const resp: BridgeError = {\n code: BridgeErrorCode.SYSTEM_ERROR,\n message: \"显示失败\",\n details: err,\n name: \"\",\n };\n reject(resp);\n },\n complete: () => {\n // 完成回调\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"getUserInfo\",\n params: {},\n },\n callbacks\n );\n });\n });\n }\n}\n\nexport const userinfoPlugin = new UserInfoPlugin();\nexport default userinfoPlugin;\n","/**\n * @fileoverview 蓝牙插件\n * @description\n * 提供蓝牙相关功能的插件,支持设备扫描、连接、数据传输等功能\n * @module plugins/bluetooth\n * @version 1.0.0\n * 提供设备相关信息和功能\n */\n\nimport { BridgePlugin, PluginContext, CallbacksBase } from \"../core\";\nimport { BridgeErrorCode, createBridgeError } from \"../core/errors\";\n\nexport interface OpenBluetoothOptions extends CallbacksBase {\n /**不传的话默认是true,表示是否在离开当前页面时自动断开蓝牙(仅对android有效)。 */\n autoClose?: boolean;\n}\n\nexport interface CloseBluetoothOptions extends CallbacksBase {}\nexport interface OpenBluetoothResponse {\n /** 是否支持BLE蓝牙 */\n isSupportBLE?: number;\n}\nexport interface StartBluetoothDevicesDiscoveryOptions extends CallbacksBase {\n allowDuplicatesKey?: boolean; // 是否允许重复上报同一设备\n interval?: number; // 上报设备的间隔,默认为0,意思是找到新设备立即上报,否则根据传入的间隔上报\n services?: string[]; //蓝牙设备主 service 的 uuid 列表。\n}\n\nexport interface BLEDeviceOptions extends CallbacksBase {\n deviceId: string; // 设备ID\n}\nexport interface GetBLEDeviceOptions extends CallbacksBase {\n success?: (data: BLEDeviceResponse) => void; // 覆盖基础类型,指定具体返回类型\n /**\n\t * Android 上为设备 MAC 地址。\n\t\tiOS 上为设备 UUID。 \n\t\t*/\n deviceId: string;\n serviceId: string; // 蓝牙特征值对应 service 的 UUID。\n}\n\nexport interface BLEDeviceResponse {\n /** 设备特征值列表 */\n characteristics: Characteristic[]; // 设备特征值列表\n}\n\nexport interface Characteristic {\n // 特征ID\n characteristicId: string;\n // 服务ID\n serviceId: string;\n // 值\n value: string;\n // 属性\n properties: Properties;\n}\n\nexport interface Properties {\n read: boolean;\n write: boolean;\n notify: boolean;\n indicate: boolean;\n}\nexport interface BLEDeviceServicesOptions extends CallbacksBase {\n success?: (data: BLEDeviceServicesResponse) => void;\n deviceId: string; // 设备ID\n}\n\nexport interface BLEDeviceServicesResponse {\n services: Services[];\n}\n\nexport interface Services {\n // String\t蓝牙设备服务的 uuid。\n serviceId: string;\n // 该服务是否为主服务。\n isPrimary: string;\n}\n\n\nexport interface WriteBLECharacteristicValueOptions extends CallbacksBase {\n deviceId: string; // 设备ID\n serviceId: string; // 蓝牙特征值对应 service 的 UUID。\n characteristicId: string; // 蓝牙特征值的 ID。\n value: string; // 要写入的值,必须是 16进制字符串。\n}\n\nexport interface ReadBLECharacteristicValueOptions extends CallbacksBase {\n\tsuccess?: (data: ReadBLECharacteristicValueResponse) => void; // 覆盖基础类型,指定具体返回类型\n\tdeviceId: string; // 设备ID\n\tserviceId: string; // 蓝牙特征值对应 service 的 UUID。\n\tcharacteristicId: string; // 蓝牙特征值的 ID。\n}\n\nexport interface ReadBLECharacteristicValueResponse {\n /** 设备特征值列表 */\n characteristicId?: string;\n serviceId?: string;\n value?: string;\n}\n\ndeclare module \"../core\" {\n interface PluginMethods {\n //经典蓝牙:---------------------------------------------------------------\n openBluetoothAdapter: (options?: OpenBluetoothOptions) => void; // 打开蓝牙适配器\n closeBluetoothAdapter: (options?: CloseBluetoothOptions) => void; // 关闭蓝牙适配器\n startBluetoothDevicesDiscovery: (\n options?: StartBluetoothDevicesDiscoveryOptions\n ) => void; // 开始搜索附近的蓝牙设备\n stopBluetoothDevicesDiscovery: (options?: CallbacksBase) => void; // 停止搜索附近的蓝牙设备\n onBluetoothDeviceFound: (callback: (devices: any[]) => void) => void; // 监听寻找到新设备的事件\n offBluetoothDeviceFound: () => void; // 取消监听寻找到新设备的事件\n //BLE蓝牙:---------------------------------------------------------------\n connectBLEDevice: (options: BLEDeviceOptions) => void; // 连接低功耗蓝牙设备\n disconnectBLEDevice: (options: BLEDeviceOptions) => void; // 断开与低功耗蓝牙设备的连接\n getBLEDeviceCharacteristics: (options: GetBLEDeviceOptions) => void; // 获取低功耗蓝牙设备的特征值\n getBLEDeviceServices: (options: BLEDeviceServicesOptions) => void; // 获取低功耗蓝牙设备的服务\n writeBLECharacteristicValue: (\n options: WriteBLECharacteristicValueOptions\n ) => void; // 向低功耗蓝牙设备写入特征值\n readBLECharacteristicValue: (\n options: ReadBLECharacteristicValueOptions\n ) => void; // 读取低功耗蓝牙设备的特征值\n onBLECharacteristicValueChange: (\n callback: (data: {\n serviceId: string;\n characteristicId: string;\n deviceId: string;\n\t\t\t\tvalue: string;\n }) => void\n ) => void; // 监听低功耗蓝牙设备的特征值变化事件\n offBLECharacteristicValueChange: () => void; // 取消监听低功耗蓝牙设备的特征值变化事件\n onBLEConnectionStateChanged: (\n callback: (data: { deviceId: string; connected: boolean }) => void\n ) => void; // 监听低功耗蓝牙设备的连接状态变化事件\n offBLEConnectionStateChanged: () => void; // 取消监听低功耗蓝牙设备的连接状态变化事件\n }\n interface NativeBridgeCore extends PluginMethods {}\n}\n\nclass BluetoothPlugin implements BridgePlugin {\n public readonly name = \"bluetooth\";\n public readonly version = \"1.0.0\";\n private context?: PluginContext;\n\n public install(context: PluginContext): void {\n this.context = context;\n //经典蓝牙:---------------------------------------------------------------\n context.bridge.registerMethod(\n \"openBluetoothAdapter\",\n this.openBluetoothAdapter.bind(this)\n );\n context.bridge.registerMethod(\n \"closeBluetoothAdapter\",\n this.closeBluetoothAdapter.bind(this)\n );\n context.bridge.registerMethod(\n \"startBluetoothDevicesDiscovery\",\n this.startBluetoothDevicesDiscovery.bind(this)\n );\n context.bridge.registerMethod(\n \"stopBluetoothDevicesDiscovery\",\n this.stopBluetoothDevicesDiscovery.bind(this)\n );\n context.bridge.registerMethod(\n \"onBluetoothDeviceFound\",\n this.onBluetoothDeviceFound.bind(this)\n );\n\t\tcontext.bridge.registerMethod(\n\t\t\t\"offBluetoothDeviceFound\",\n\t\t\tthis.offBluetoothDeviceFound.bind(this)\n\t\t);\n //BLE蓝牙:---------------------------------------------------------------\n\n context.bridge.registerMethod(\n \"writeBLECharacteristicValue\",\n this.writeBLECharacteristicValue.bind(this)\n );\n context.bridge.registerMethod(\n \"readBLECharacteristicValue\",\n this.readBLECharacteristicValue.bind(this)\n );\n\n context.bridge.registerMethod(\n \"connectBLEDevice\",\n this.connectBLEDevice.bind(this)\n );\n context.bridge.registerMethod(\n \"disconnectBLEDevice\",\n this.disconnectBLEDevice.bind(this)\n );\n context.bridge.registerMethod(\n \"getBLEDeviceCharacteristics\",\n this.getBLEDeviceCharacteristics.bind(this)\n );\n context.bridge.registerMethod(\n \"getBLEDeviceServices\",\n this.getBLEDeviceServices.bind(this)\n );\n\n context.bridge.registerMethod(\n \"onBLECharacteristicValueChange\",\n this.onBLECharacteristicValueChange.bind(this)\n );\n\n context.bridge.registerMethod(\n \"offBLECharacteristicValueChange\",\n this.offBLECharacteristicValueChange.bind(this)\n );\n context.bridge.registerMethod(\n \"onBLEConnectionStateChanged\",\n this.onBLEConnectionStateChanged.bind(this)\n );\n context.bridge.registerMethod(\n \"offBLEConnectionStateChanged\",\n this.offBLEConnectionStateChanged.bind(this)\n );\n context.bridge.log(`蓝牙插件 v${this.version} 已安装`);\n }\n //BLE蓝牙:---------------------------------------------------------------\n\n /**\n * 取消监听蓝牙低功耗连接状态变化事件\n * \n * @description 该方法用于移除之前注册的蓝牙低功耗连接状态变化监听器。\n * 当不再需要监听连接状态变化时,应调用此方法以避免内存泄漏。\n * \n * @param callback - 可选的回调函数,当成功取消监听后会被调用\n * @returns void\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出错误\n * \n * @example\n */\n public offBLEConnectionStateChanged(callback?: () => void): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n this.context.bridge.ready(() => {\n this.context?.bridge.offNativeEvent(\n \"offBLEConnectionStateChanged\",\n () => {\n callback && callback();\n }\n );\n });\n }\n\n /**\n * 监听BLE设备连接状态变化\n * \n * @description 注册一个回调函数来监听蓝牙低功耗(BLE)设备的连接状态变化事件。\n * 当设备连接或断开时,会触发相应的回调函数。\n * \n * @param callback - 连接状态变化时的回调函数\n * @param callback.data - 回调函数的参数对象\n * @param callback.data.deviceId - 设备ID,用于标识具体的BLE设备\n * @param callback.data.connected - 连接状态,true表示已连接,false表示已断开\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出错误\n * \n * @example\n * \n * @since 1.0.0\n */\n public onBLEConnectionStateChanged(\n callback: (data: {\n\t\t\tdeviceId: string;\n\t\t\tconnected: boolean;\n }) => void\n ): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n this.context.bridge.ready(() => {\n this.context?.bridge.onNativeEvent(\n \"onBLEConnectionStateChanged\",\n (event: { type: string; data: any }) => {\n callback(event.data);\n }\n );\n });\n }\n\n /**\n * 取消监听低功耗蓝牙设备的特征值变化事件\n * \n * @description 此方法用于移除之前通过onBLECharacteristicValueChange注册的事件监听器。\n * 当不再需要监听BLE特征值变化时,应调用此方法以避免内存泄漏和不必要的回调执行。\n * \n * @param {Function} [callback] - 可选的回调函数,在成功取消监听后执行\n * @returns {void} 无返回值\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出错误\n * \n * @example\n */\n public offBLECharacteristicValueChange(callback?: () => void): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n this.context.bridge.ready(() => {\n this.context?.bridge.offNativeEvent(\n \"onBLECharacteristicValueChange\",\n () => {\n callback && callback();\n }\n );\n });\n }\n\n /**\n * 监听 BLE 特征值变化事件\n * \n * 当蓝牙低功耗设备的特征值发生变化时,会触发此回调函数。\n * 在调用此方法前,需要确保插件已正确初始化。\n * \n * @param callback - 特征值变化时的回调函数\n * @param callback.data - 特征值变化的数据对象\n * @param callback.data.serviceId - 服务 ID,标识 BLE 服务\n * @param callback.data.characteristicId - 特征 ID,标识 BLE 特征\n * @param callback.data.deviceId - 设备 ID,标识 BLE 设备\n * @param callback.data.value - 特征值,变化后的特征值内容\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出错误\n * \n * @example\n */\n public onBLECharacteristicValueChange(\n callback: (data: {\n serviceId: string;\n characteristicId: string;\n deviceId: string;\n value: string;\n }) => void\n ): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n this.context.bridge.ready(() => {\n this.context?.bridge.onNativeEvent(\n \"onBLECharacteristicValueChange\",\n (event: { type: string; data: any }) => {\n callback(event.data);\n }\n );\n });\n }\n\n /**\n * 读取低功耗蓝牙设备特征值\n * \n * @description 从指定的蓝牙设备特征值中读取数据。该方法需要在插件正确初始化后才能使用。\n * \n * @param {ReadBLECharacteristicValueOptions} options - 读取BLE特征值的配置选项\n * @param {string} options.deviceId - 蓝牙设备ID\n * @param {string} options.serviceId - 蓝牙服务ID\n * @param {string} options.characteristicId - 蓝牙特征值ID\n * @param {function} [options.success] - 成功回调函数,参数为读取到的特征值数据\n * @param {function} [options.fail] - 失败回调函数\n * @param {function} [options.complete] - 完成回调函数(无论成功或失败都会执行)\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出错误\n * \n * @returns {void} 无返回值\n * \n * @example\n */\n public readBLECharacteristicValue(\n options: ReadBLECharacteristicValueOptions\n ): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n // 必填值判断\n if (!options.deviceId || !options.serviceId || !options.characteristicId) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"缺少必需的参数\"\n );\n }\n const callbacks: CallbacksBase = {\n success: (data: any) => {\n options.success?.(data);\n },\n fail: options.fail,\n complete: options.complete,\n };\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"readBLECharacteristicValue\",\n params: options,\n },\n callbacks\n );\n });\n }\n\n /**\n * 向低功耗蓝牙设备特征值中写入数据\n * \n * @param options - 写入BLE特征值的配置选项\n * @param options.deviceId - 蓝牙设备 id\n * @param options.serviceId - 蓝牙特征值对应服务的 uuid\n * @param options.characteristicId - 蓝牙特征值的 uuid\n * @param options.value - 蓝牙设备特征值对应的二进制值\n * @param options.success - 接口调用成功的回调函数\n * @param options.fail - 接口调用失败的回调函数\n * @param options.complete - 接口调用结束的回调函数(调用成功、失败都会执行)\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出错误\n * \n * @example\n */\n public writeBLECharacteristicValue(\n options: WriteBLECharacteristicValueOptions\n ): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n if (!options.deviceId || !options.serviceId || !options.characteristicId || !options.value) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"缺少必需的参数\"\n );\n }\n\n if (typeof options.deviceId !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.JSON_ERROR,\n \"deviceId参数格式错误\"\n );\n }\n\n if (typeof options.serviceId !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.JSON_ERROR,\n \"serviceId参数格式错误\"\n );\n }\n\n if (typeof options.characteristicId !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.JSON_ERROR,\n \"characteristicId参数格式错误\"\n );\n }\n\n if (\n typeof options.value !== \"string\" ||\n !/^[0-9A-Fa-f]+$/.test(options.value) ||\n options.value?.length > 20\n ) {\n throw createBridgeError(\n BridgeErrorCode.JSON_ERROR,\n \"value参数格式错误\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: options.success,\n fail: options.fail,\n complete: options.complete,\n };\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"writeBLECharacteristicValue\",\n params: options,\n },\n callbacks\n );\n });\n }\n\n /**\n * 获取蓝牙低功耗设备的所有服务\n * \n * @description 该方法用于获取已连接的BLE设备的所有可用服务列表。\n * 调用前需要确保设备已经成功连接,否则可能获取失败。\n * \n * @param {BLEDeviceServicesOptions} options - 获取BLE设备服务的配置选项\n * @param {string} options.deviceId - 蓝牙设备标识符,用于指定要获取服务的设备\n * @param {function} [options.success] - 成功回调函数,参数为BLEDeviceServicesResponse类型\n * @param {function} [options.fail] - 失败回调函数,参数为错误信息\n * @param {function} [options.complete] - 完成回调函数,无论成功失败都会调用\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出PLUGIN_NOT_INITIALIZED错误\n * \n * @returns {void} 无返回值,结果通过回调函数返回\n * \n * @example\n */\n public getBLEDeviceServices(options: BLEDeviceServicesOptions): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 必填值判断\n if (!options.deviceId) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"缺少必需的参数: deviceId\"\n );\n }\n\n // 校验参数\n if (typeof options.deviceId !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.JSON_ERROR,\n \"deviceId参数格式错误\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: (data: any) => {\n options.success?.(data);\n },\n fail: options.fail,\n complete: options.complete,\n };\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"getBLEDeviceServices\",\n params: options,\n },\n callbacks\n );\n });\n }\n\n /**\n * 连接蓝牙低功耗设备\n * \n * @description 此方法用于连接指定的蓝牙低功耗(BLE)设备。在调用前需要确保插件已正确初始化,\n * 否则会抛出插件未初始化的错误。连接过程是异步的,通过回调函数返回结果。\n * \n * @param {BLEDeviceOptions} options - 连接BLE设备的配置选项\n * @param {Function} [options.success] - 连接成功时的回调函数\n * @param {Function} [options.fail] - 连接失败时的回调函数 \n * @param {Function} [options.complete] - 连接完成时的回调函数(无论成功或失败都会执行)\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出 PLUGIN_NOT_INITIALIZED 错误\n * \n * @returns {void} 无返回值\n * \n * @example\n */\n public connectBLEDevice(options: BLEDeviceOptions): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 必填值判断\n if (!options.deviceId) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"缺少必需的参数: deviceId\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: options.success,\n fail: options.fail,\n complete: options.complete,\n };\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"connectBLEDevice\",\n params: options,\n },\n callbacks\n );\n });\n }\n\n /**\n * 断开蓝牙低功耗设备连接\n * \n * @description 断开与指定蓝牙低功耗设备的连接。此方法会调用原生平台的蓝牙断连功能。\n * \n * @param {BLEDeviceOptions} options - 断开连接的配置选项\n * @param {Function} [options.success] - 成功回调函数\n * @param {Function} [options.fail] - 失败回调函数 \n * @param {Function} [options.complete] - 完成回调函数(无论成功或失败都会执行)\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出错误\n * \n * @returns {void}\n * \n * @example\n */\n public disconnectBLEDevice(options: BLEDeviceOptions): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 必填值判断\n if (!options.deviceId) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"缺少必需的参数: deviceId\"\n );\n }\n\n if (typeof options.deviceId !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.JSON_ERROR,\n \"deviceId参数格式错误\"\n );\n\n }\n\n const callbacks: CallbacksBase = {\n success: options.success,\n fail: options.fail,\n complete: options.complete,\n };\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"disconnectBLEDevice\",\n params: options,\n },\n callbacks\n );\n });\n }\n /**\n * 获取蓝牙低功耗设备的特征值列表\n * \n * @description 用于获取指定蓝牙低功耗设备的所有特征值信息,包括特征值的UUID、属性等。\n * 该方法需要在蓝牙设备连接成功后调用。\n * \n * @param {GetBLEDeviceOptions} options - 获取设备特征值的配置选项\n * @param {string} options.deviceId - 蓝牙设备ID\n * @param {string} options.serviceId - 蓝牙服务UUID\n * @param {function} [options.success] - 成功回调函数,返回特征值列表数据\n * @param {function} [options.fail] - 失败回调函数\n * @param {function} [options.complete] - 完成回调函数(无论成功或失败都会执行)\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出错误\n * \n * @example\n * \n * @since 1.0.0\n */\n public getBLEDeviceCharacteristics(options: GetBLEDeviceOptions): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 必填值判断\n if (!options.deviceId || !options.serviceId) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"缺少必需的参数: deviceId 或 serviceId\"\n );\n }\n\n if (typeof options.deviceId !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.JSON_ERROR,\n \"deviceId参数格式错误\"\n );\n }\n\n if (typeof options.serviceId !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.JSON_ERROR,\n \"serviceId参数格式错误\"\n );\n\n }\n\n const callbacks: CallbacksBase = {\n success: (data: any) => {\n options.success?.(data);\n },\n fail: (err)=>{\n\t\t\t\toptions.fail?.(err);\n\t\t\t},\n complete: options.complete,\n };\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"getBLEDeviceCharacteristics\",\n params: options,\n },\n callbacks\n );\n });\n }\n\n //经典蓝牙:---------------------------------------------------------------\n\n /**\n * 取消监听蓝牙设备发现事件\n * \n * @description 移除对蓝牙设备发现事件的监听,当不再需要接收蓝牙设备发现通知时调用此方法\n * \n * @param callback - 可选的回调函数,在成功取消监听后执行\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出错误\n * \n * @example\n * \n * @returns {void} 无返回值\n */\n public offBluetoothDeviceFound(callback?: () => void): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n this.context.bridge.ready(() => {\n this.context?.bridge.offNativeEvent(\"offBluetoothDeviceFound\", () => {\n callback && callback();\n });\n });\n }\n\n /**\n * 监听蓝牙设备发现事件\n * \n * 当发现新的蓝牙设备时,会触发回调函数并传入设备列表。\n * 该方法需要在插件正确初始化后调用,否则会抛出异常。\n * \n * @param callback - 设备发现回调函数\n * @param callback.devices - 发现的蓝牙设备列表\n * @throws {BridgeError} 当插件未正确初始化时抛出 PLUGIN_NOT_INITIALIZED 错误\n * \n * @example\n */\n public onBluetoothDeviceFound(callback: (devices: any[]) => void): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n this.context.bridge.ready(() => {\n this.context?.bridge.onNativeEvent(\n \"onBluetoothDeviceFound\",\n (event: { type: string; data: any }) => {\n callback(event.data ? JSON.parse(event.data) : []);\n }\n );\n });\n }\n\n /**\n * 停止搜索蓝牙设备\n * \n * @description 停止搜索附近的蓝牙外围设备。若已经找到需要连接的蓝牙设备并不需要继续搜索时,建议调用该接口停止蓝牙搜索。\n * \n * @param options - 可选的回调函数配置对象\n * @param options.success - 接口调用成功的回调函数\n * @param options.fail - 接口调用失败的回调函数 \n * @param options.complete - 接口调用结束的回调函数(调用成功、失败都会执行)\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出异常\n * \n * @example\n */\n public stopBluetoothDevicesDiscovery(options?: CallbacksBase): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: options?.success,\n fail: options?.fail,\n complete: options?.complete,\n };\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"stopBluetoothDevicesDiscovery\",\n params: options,\n },\n callbacks\n );\n });\n }\n\n /**\n * 开启蓝牙适配器\n *\n * @description 开启本机蓝牙适配器模块,允许设备进行蓝牙操作。调用该方法前需要确保插件已正确初始化。\n *\n * @param {OpenBluetoothOptions} [options={}] - 开启蓝牙适配器的配置选项\n * @param {Function} [options.success] - 接口调用成功的回调函数\n * @param {Function} [options.fail] - 接口调用失败的回调函数\n * @param {Function} [options.complete] - 接口调用结束的回调函数(调用成功、失败都会执行)\n *\n * @throws {BridgeError} 当插件未正确初始化时抛出错误\n *\n * @returns {void}\n *\n * @example\n */\n public startBluetoothDevicesDiscovery(\n options: StartBluetoothDevicesDiscoveryOptions = {}\n ): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 校验参数\n if (\n options.services !== undefined &&\n !Array.isArray(options.services) &&\n typeof options.services !== \"string\"\n ) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"services参数格式不正确\"\n );\n }\n\n if (options.allowDuplicatesKey !== undefined && typeof options.allowDuplicatesKey !== \"boolean\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"allowDuplicatesKey参数格式不正确\"\n );\n }\n\n if (options.interval !== undefined && (typeof options.interval !== \"number\" || !Number.isInteger(options.interval))) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"interval参数格式不正确\"\n );\n }\n\n // 设置默认值\n options.interval = options?.interval || 0;\n const callbacks: CallbacksBase = {\n success: options?.success,\n fail: options?.fail,\n complete: options?.complete,\n };\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"startBluetoothDevicesDiscovery\",\n params: options,\n },\n callbacks\n );\n });\n }\n /**\n * 关闭蓝牙适配器\n *\n * @description 关闭本机蓝牙适配器模块,断开所有已建立的连接。调用该方法将会断开所有蓝牙连接,\n * 释放系统资源。建议在不需要使用蓝牙功能时及时调用此方法。\n *\n * @param {CloseBluetoothOptions} [options={}] - 关闭蓝牙适配器的配置选项\n * @param {Function} [options.success] - 接口调用成功的回调函数\n * @param {Function} [options.fail] - 接口调用失败的回调函数\n * @param {Function} [options.complete] - 接口调用结束的回调函数(调用成功、失败都会执行)\n *\n * @throws {BridgeError} 当插件未正确初始化时抛出错误\n *\n * @returns {void}\n *\n * @example\n */\n public closeBluetoothAdapter(options: CloseBluetoothOptions = {}): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: options.success,\n fail: options.fail,\n complete: options.complete,\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"closeBluetoothAdapter\",\n params: options,\n },\n callbacks\n );\n });\n }\n /**\n * 开启蓝牙功能\n *\n * 此方法用于启用设备的蓝牙功能。调用前需要确保插件已正确初始化,\n * 否则会抛出相应的错误。方法会通过桥接器调用原生蓝牙开启功能。\n *\n * @param options - 开启蓝牙的配置选项\n * @param options.success - 成功回调函数,当蓝牙成功开启时调用\n * @param options.fail - 失败回调函数,当蓝牙开启失败时调用\n * @param options.complete - 完成回调函数,无论成功或失败都会调用\n *\n * @throws {BridgeError} 当插件未正确初始化时抛出 PLUGIN_NOT_INITIALIZED 错误\n *\n * @returns {void} 无返回值\n *\n * @example\n */\n public openBluetoothAdapter(options: OpenBluetoothOptions = {}): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 校验参数\n if (options.autoClose !== undefined && typeof options.autoClose !== \"boolean\") {\n throw createBridgeError(\n BridgeErrorCode.JSON_ERROR,\n \"autoClose参数格式不正确\"\n );\n }\n\n // 设置默认值\n options.autoClose = options.autoClose ?? true;\n const callbacks: CallbacksBase = {\n success: options.success,\n fail: options.fail,\n complete: options.complete,\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"openBluetoothAdapter\",\n params: options,\n },\n callbacks\n );\n });\n }\n\n /**\n * 搜索到新蓝牙时触发\n * 当发现新的蓝牙设备时,会触发回调函数并传入设备列表。\n * 该方法需要在插件正确初始化后调用,否则会抛出异常。\n * @param callback - 新蓝牙搜索到时触发的回调函数\n * @param callback.devices - 发现的蓝牙设备列表\n * @throws {BridgeError} 当插件未正确初始化时抛出 PLUGIN_NOT_INITIALIZED 错误\n */\n public getBluetoothDevices(callback: (devices: any[]) => void): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n this.context.bridge.ready(() => {\n this.context?.bridge.onNativeEvent(\n \"getBluetoothDevices\",\n (event: { type: string; data: any }) => {\n callback(event.data);\n }\n );\n });\n }\n}\nexport const bluetooth = new BluetoothPlugin();\nexport default bluetooth;\n","/**\n * 本地存储 jsBridge 插件\n * @module plugins/storage\n * @version 1.0.0\n * @description 提供本地存储功能的插件,支持设置、获取和删除存储数据\n */\nimport {\n BridgePlugin,\n PluginContext,\n CallbacksBase,\n} from \"../core\";\nimport { BridgeErrorCode, createBridgeError } from \"../core/errors\";\n\nexport interface SetStorageOptions extends CallbacksBase {\n key: string; // 存储数据的 key\n data: Record<string, any> | string; // 存储的数据\n}\nexport interface GetStorageOptions extends CallbacksBase {\n key: string; // 要获取的存储数据的 key\n}\nexport interface RemoveStorageOptions extends CallbacksBase {\n key: string; // 要删除的存储数据的 key\n}\n\nexport interface StorageResponse {\n data?: Record<string, any> | string; // 获取到的数据\n}\n\ndeclare module \"../core\" {\n interface PluginMethods {\n setStorage: (options: SetStorageOptions) => Promise<string>;\n setStorageSync: (options: SetStorageOptions) => any;\n getStorage: (options: GetStorageOptions) => Promise<string>;\n getStorageSync: (options: GetStorageOptions) => any;\n removeStorage: (options: RemoveStorageOptions) => Promise<string>;\n }\n interface NativeBridgeCore extends PluginMethods { }\n}\n\nclass StoragePlugin implements BridgePlugin {\n private context?: PluginContext;\n public readonly name = \"storage\";\n public readonly version = \"1.0.0\";\n public install(context: PluginContext): void {\n this.context = context;\n context.bridge.registerMethod(\"setStorage\", this.setStorage.bind(this));\n context.bridge.registerMethod(\"setStorageSync\", this.setStorageSync.bind(this));\n context.bridge.registerMethod(\"getStorage\", this.getStorage.bind(this));\n context.bridge.registerMethod(\"getStorageSync\", this.getStorageSync.bind(this));\n context.bridge.registerMethod(\"removeStorage\", this.removeStorage.bind(this));\n context.bridge.log(`本地存储插件 v${this.version} 已安装`);\n }\n\n private _createCallbacks(options: CallbacksBase): CallbacksBase {\n return {\n success: options.success,\n fail: options.fail,\n complete: options.complete,\n };\n }\n\n private async _callNativeMethod(\n action: string,\n params: any,\n callbacks: CallbacksBase\n ): Promise<string> {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n return new Promise((resolve, reject) => {\n this.context?.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action,\n params\n },\n {\n ...callbacks,\n success: (response: string) => {\n if (callbacks.success) {\n // 如果有 success 回调,调用它\n callbacks.success(response);\n }\n resolve(response);\n },\n fail: (error: any) => {\n if (callbacks.fail) {\n callbacks.fail(error);\n }\n reject(error);\n }\n }\n );\n });\n });\n }\n\n /**\n * 同步设置存储数据\n * @param options 存储选项,包含键值和数据\n * @returns 存储响应\n * @throws 如果未提供key,则抛出错误\n */\n public setStorageSync(\n options: SetStorageOptions\n ): void {\n\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查必需参数\n const key = options.key;\n if (!key) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, '缺少必需的参数: key');\n }\n\n if (!options.data) {\n throw createBridgeError(BridgeErrorCode.INVALID_ACTION, \"缺少必需的参数: data\");\n }\n\n // 检查数据类型\n if (typeof key !== \"string\") {\n throw createBridgeError(BridgeErrorCode.INVALID_ACTION, \"key参数格式不正确\");\n }\n\n if (typeof options.data !== \"object\" && typeof options.data !== \"string\") {\n throw createBridgeError(BridgeErrorCode.INVALID_ACTION, \"data参数格式不正确\");\n }\n\n if (typeof options.data === 'object' && Object.keys(options.data).length === 0) {\n throw createBridgeError(BridgeErrorCode.INVALID_ACTION, \"data参数格式不正确\");\n }\n\n\n\n const callbacks = this._createCallbacks(options);\n this.context?.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: 'setStorageSync',\n params: options\n },\n callbacks,\n );\n });\n }\n\n public async setStorage(\n options: SetStorageOptions\n ): Promise<string> {\n\n // 检查必需参数\n const key = options.key;\n if (!key) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, '缺少必需的参数: key');\n }\n\n if (!options.data) {\n throw createBridgeError(BridgeErrorCode.INVALID_ACTION, '缺少必需的参数: data');\n }\n\n // 检查数据类型\n if (typeof key !== \"string\") {\n throw createBridgeError(BridgeErrorCode.INVALID_ACTION, \"key参数格式不正确\");\n }\n\n if (typeof options.data !== \"object\" && typeof options.data !== \"string\") {\n throw createBridgeError(BridgeErrorCode.INVALID_ACTION, \"data参数格式不正确\");\n }\n\n if (typeof options.data === 'object' && Object.keys(options.data).length === 0) {\n throw createBridgeError(BridgeErrorCode.INVALID_ACTION, \"data参数格式不正确\");\n }\n\n const callbacks = this._createCallbacks(options);\n return this._callNativeMethod(\"setStorage\", { key: options.key, data: options.data }, callbacks);\n }\n\n public getStorageSync(\n options: GetStorageOptions\n ): any {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n const key = options.key;\n\n if (!key) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, '缺少必需的参数: key');\n }\n\n if (typeof key !== \"string\") {\n throw createBridgeError(BridgeErrorCode.INVALID_ACTION, \"key参数格式不正确\");\n }\n\n const callbacks = this._createCallbacks(options);\n return this.context?.bridge.callNativeSync('getStorageSync', options, callbacks)\n }\n\n public async getStorage(\n options: GetStorageOptions\n ): Promise<string> {\n const key = options.key;\n if (!key) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, '缺少必需的参数: key');\n }\n if (typeof key !== \"string\") {\n throw createBridgeError(BridgeErrorCode.INVALID_ACTION, \"key参数格式不正确\");\n }\n const callbacks = this._createCallbacks(options);\n return this._callNativeMethod(\"getStorage\", { key: options.key }, callbacks);\n }\n\n /**\n * 移除指定的存储数据(异步)\n * @param options 存储选项,包含键值\n * @returns 存储响应\n */\n public async removeStorage(options: RemoveStorageOptions): Promise<string> {\n const key = options.key;\n if (!key) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, '缺少必需的参数: key');\n }\n if (typeof key !== \"string\") {\n throw createBridgeError(BridgeErrorCode.INVALID_ACTION, \"key参数格式不正确\");\n }\n const callbacks = this._createCallbacks(options);\n return this._callNativeMethod(\"removeStorage\", { key }, callbacks);\n }\n}\n\nexport default new StoragePlugin();\n","/**\n * 实人认证 + 人脸解锁 jsBridge\n * @module plugins/authentication\n * @version 1.0.0\n * @description 提供实人认证和人脸解锁功能的插件,支持调用原生认证API\n */\n\nimport {\n BridgePlugin,\n PluginContext,\n CallbacksBase,\n} from \"../core\";\nimport { BridgeErrorCode, createBridgeError } from \"../core/errors\";\n\n// 定义认证结果类型\nexport interface AuthenticationResult {\n photoStatus: number; // 1成功, 0 失败\n}\n\ndeclare module \"../core\" {\n interface PluginMethods {\n exclusiveLiveCheck: (options?: CallbacksBase) => Promise<AuthenticationResult>;\n }\n interface NativeBridgeCore extends PluginMethods {}\n}\n\nclass AuthenticationPlugin implements BridgePlugin {\n private context?: PluginContext;\n public readonly name = \"authentication\";\n public readonly version = \"1.0.0\";\n\n public install(context: PluginContext): void {\n this.context = context;\n context.bridge.log(`实人认证插件 v${this.version} 已安装`);\n // 在桥接对象上挂载方法\n context.bridge.registerMethod(\n \"exclusiveLiveCheck\",\n this.exclusiveLiveCheck.bind(this)\n );\n }\n\n /**\n * 执行实人认证\n * @param options - 认证选项,包含成功、失败和完成的回调函数\n * @property options.success - 认证成功时的回调函数,接收认证结果\n * @property options.fail - 认证失败时的回调函数,接收错误信息\n * @property options.complete - 认证完成时的回调函数(无论成功或失败)\n * @returns Promise<AuthenticationResult> - 返回认证结果的Promise对象\n * @throws {BridgeError} - 如果插件未正确初始化,抛出BridgeError异常\n */\n public exclusiveLiveCheck(\n options: CallbacksBase = {}\n ): Promise<AuthenticationResult> {\n return new Promise((resolve, reject) => {\n // 检查插件是否已初始化\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 封装回调函数,处理认证结果\n const callbacks: CallbacksBase = {\n success: (res) => {\n resolve(res);\n },\n fail: (err: any) => {\n reject(err);\n },\n complete: options.complete,\n };\n\n // 调用原生桥接方法执行实人认证\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"exclusiveLiveCheck\",\n params: {},\n },\n callbacks\n );\n });\n });\n }\n}\n\nexport default new AuthenticationPlugin();\n","/**\n * 网络请求 jsBridge 插件\n * @module plugins/request\n * @version 1.0.0\n * @description 提供网络请求功能的插件,支持 GET 和 POST 请求\n */\n\n\nimport {\n BridgePlugin,\n PluginContext,\n CallbacksBase,\n} from \"../core\";\n\nimport { BridgeErrorCode, createBridgeError } from \"../core/errors\";\n\n// 定义请求选项接口\nexport interface RequestOptions extends CallbacksBase {\n url: string; // 目标服务器url\n method?: \"GET\" | \"POST\"; // 请求方法,默认为 GET\n headers?: Record<string, string>; // 设置请求的 HTTP 头,默认 {'Content-Type': 'application/x-www-form-urlencoded'}\n data?: Record<string, any>; // 请求参数\n timeout?: number; // 请求超时时间,单位为毫秒,默认 30000\n cacheModel: \"noStore\" | \"noCache\" | \"smartCache\" | \"firstCache\";\n dataType?: \"json\" | \"text\" | 'base64'; // 返期望返回的数据格式,默认json,支持json、text、base64\n}\n\n// 定义请求响应接口\nexport interface RequestResponse {\n status: number; // HTTP 状态码\n data: any; // 响应数据,格式取决于请求时的 dataType 参数。\n headers: Record<string, string>; // 响应头\n}\n\n// 定义上传文件接口\nexport interface UploadFileOptions extends CallbacksBase {\n url: string; // 目标服务器url\n filePath: string; // 要上传文件资源的本地定位符\n fileName: string; // 文件名,即对应的 key, 开发者在服务器端通过这个 key 可以获取到文件二进制内容\n fileType: 'image' | 'video' | 'audio'; // 文件类型:image、video、audio\n formData?: Record<string, any>; // HTTP 请求中其他额外的 form 数据\n header?: Record<string, string>; // 设置请求的 HTTP 头\n}\n\n// 定义上传文件响应接口\nexport interface UploadFileResponse {\n statusCode: number; // HTTP 状态码\n data: string; // 响应数据,通常是服务器返回的文件 URL 或\n headers: Record<string, string>; // 服务器返回的 header。\n}\n\n// 定义下载文件接口\nexport interface DownloadFileOptions extends CallbacksBase {\n url: string; // 目标服务器url\n header?: Record<string, string>; // HTTP 请求 Header\n}\n\n// 定义下载文件响应接口\nexport interface DownloadFileResponse {\n filePath: string; // 文件临时存放的位置\n}\n\ndeclare module \"../core\" {\n interface PluginMethods {\n httpRequest: (options: RequestOptions) => Promise<RequestResponse>;\n httpRequestSync: (options: RequestOptions) => void;\n uploadFile: (options: UploadFileOptions) => Promise<UploadFileResponse>;\n downloadFile: (options: DownloadFileOptions) => Promise<DownloadFileResponse>;\n }\n interface NativeBridgeCore extends PluginMethods { }\n}\n\n/**\n * 网络请求插件类\n */\nclass RequestPlugin implements BridgePlugin {\n public readonly name = \"request\";\n public readonly version = \"1.0.0\";\n private context?: PluginContext;\n\n /**\n * 安装插件\n */\n public install(context: PluginContext): void {\n this.context = context;\n // 在桥接对象上挂载方法\n context.bridge.registerMethod(\"httpRequest\", this.httpRequest.bind(this));\n context.bridge.registerMethod(\"httpRequestSync\", this.httpRequestSync.bind(this));\n context.bridge.registerMethod(\"uploadFile\", this.uploadFile.bind(this));\n context.bridge.registerMethod(\"downloadFile\", this.downloadFile.bind(this));\n context.bridge.log(`网络请求插件 v${this.version} 已安装`);\n }\n\n /**\n * 执行HTTP请求\n * @param options 请求配置选项\n * @property {string} url 请求URL(必需)\n * @property {string} [method] HTTP方法,默认为'GET'\n * @property {Object} [headers] 请求头,默认为{'Content-Type': 'application/x-www-form-urlencoded'}\n * @property {Object} [data] 请求数据,默认为{}\n * @property {string} [dataType] 响应数据类型,默认为'json'\n * @property {number} [timeout] 超时时间(毫秒),默认为30000\n * @property {string} [cacheModel] 缓存模式,默认为'noStore'\n * @returns {Promise<RequestResponse>} 返回一个Promise,解析为请求响应结果\n */\n public httpRequest(options: RequestOptions): Promise<RequestResponse> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查必需参数\n if (!options.url) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"缺少必需的参数: url\"\n );\n }\n\n // 检查url格式\n if (typeof options.url !== 'string' || !options.url.trim()) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"url参数格式不正确\"\n );\n }\n\n // 检查请求方法\n const validMethods = ['GET', 'POST'];\n if (options.method !== undefined && !validMethods.includes(options.method.toUpperCase())) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, `method参数格式不正确`);\n }\n\n // 检查请求头\n if (options.headers !== undefined && typeof options.headers !== 'object') {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"headers参数格式不正确\");\n }\n\n // 检查数据格式\n if (options.data !== undefined && typeof options.data !== 'object') {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"data参数格式不正确\");\n }\n\n // 检查数据类型\n const validDataTypes = ['json', 'text', 'base64'];\n if (options.dataType !== undefined && !validDataTypes.includes(options.dataType.toLowerCase())) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, `dataType参数格式不正确`);\n }\n\n // 检查超时时间\n if (options.timeout !== undefined && (typeof options.timeout !== 'number' || options.timeout <= 0)) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"timeout参数格式不正确\");\n }\n\n // 检查缓存模式\n const validCacheModels = ['noStore', 'noCache', 'smartCache', 'firstCache'];\n if ((options.cacheModel !== undefined && typeof options.cacheModel !== 'string') || (options.cacheModel !== undefined && !validCacheModels.includes(options.cacheModel))) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, `cacheModel参数格式不正确`);\n }\n\n // 设置默认值\n options.method = options.method || \"GET\"; // 默认 GET 请求\n options.headers = (options.headers && Object.keys(options.headers).length > 0) ? options.headers : { \"Content-Type\": \"application/x-www-form-urlencoded\" };\n options.data = options.data || {};\n options.dataType = options.dataType || \"json\"; // 默认返回 json\n options.timeout = options.timeout || 30000;\n options.cacheModel = options.cacheModel || \"noStore\"; // 默认不缓存\n\n const callbacks: CallbacksBase = {\n success: (res) => {\n options?.success?.(res);\n resolve(res);\n },\n fail: (err: any) => {\n options.fail?.(err);\n reject(err);\n },\n complete: () => {\n options.complete?.();\n // 可选:做一些清理或统一处理\n },\n };\n\n // 调用原生网络请求方法\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"httpRequest\",\n params: options,\n timeout: options.timeout,\n },\n callbacks\n );\n });\n });\n }\n\n /**\n * \n */\n public httpRequestSync(options: RequestOptions): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查必需参数\n if (!options.url) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"缺少必需的参数: url\"\n );\n }\n\n // 检查url格式\n if (typeof options.url !== 'string' || !options.url.trim()) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"url参数格式不正确\"\n );\n }\n\n // 检查请求方法\n const validMethods = ['GET', 'POST'];\n if (options.method !== undefined && !validMethods.includes(options.method.toUpperCase())) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, `method参数格式不正确`);\n }\n\n // 检查请求头\n if (options.headers !== undefined && typeof options.headers !== 'object') {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"headers参数格式不正确\");\n }\n\n // 检查数据格式\n if (options.data !== undefined && typeof options.data !== 'object') {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"data参数格式不正确\");\n }\n\n // 检查数据类型\n const validDataTypes = ['json', 'text', 'base64'];\n if (options.dataType !== undefined && !validDataTypes.includes(options.dataType.toLowerCase())) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, `dataType参数格式不正确`);\n }\n\n // 检查超时时间\n if (options.timeout !== undefined && (typeof options.timeout !== 'number' || options.timeout <= 0)) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"timeout参数格式不正确\");\n }\n\n // 检查缓存模式\n const validCacheModels = ['noStore', 'noCache', 'smartCache', 'firstCache'];\n if ((options.cacheModel !== undefined && typeof options.cacheModel !== 'string') || (options.cacheModel !== undefined && !validCacheModels.includes(options.cacheModel))) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, `cacheModel参数格式不正确`);\n }\n\n // 设置默认值\n options.method = options.method || \"GET\"; // 默认 GET 请求\n options.headers = (options.headers && Object.keys(options.headers).length > 0) ? options.headers : { \"Content-Type\": \"application/x-www-form-urlencoded\" };\n options.data = options.data || {};\n options.dataType = options.dataType || \"json\"; // 默认返回 json\n options.timeout = options.timeout || 30000;\n options.cacheModel = options.cacheModel || \"noStore\"; // 默认不缓存\n\n const callbacks: CallbacksBase = {\n success: (res) => {\n options?.success?.(res);\n },\n fail: (err: any) => {\n options.fail?.(err);\n },\n complete: () => {\n options.complete?.();\n // 可选:做一些清理或统一处理\n },\n };\n\n // 调用原生网络请求方法\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"httpRequest\",\n params: options,\n timeout: options.timeout,\n },\n callbacks\n );\n })\n }\n\n /**\n * 执行文件上传\n * @param options 上传文件选项\n * @returns Promise<UploadFileResponse> 返回上传结果\n */\n public uploadFile(options: UploadFileOptions): Promise<UploadFileResponse> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查必需参数\n if (!options.url || !options.filePath || !options.fileName || !options.fileType) {\n return reject(createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"缺少必需的参数: url, filePath, fileName, fileType\"));\n }\n\n // 检查url格式\n if (typeof options.url !== 'string' || !options.url.trim()) {\n return reject(createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"url参数格式不正确\"));\n }\n\n // 检查文件路径\n if (typeof options.filePath !== 'string' || !options.filePath.trim()) {\n return reject(createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"filePath参数格式不正确\"));\n }\n\n // 检查文件名\n if (typeof options.fileName !== 'string' || !options.fileName.trim()) {\n return reject(createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"fileName参数格式不正确\"));\n }\n\n // 检查文件类型\n const validFileTypes = ['image', 'video', 'audio'];\n if (!validFileTypes.includes(options.fileType)) {\n return reject(createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, `不支持的文件类型: ${options.fileType}`));\n }\n\n // 检查请求头\n if (options.header !== undefined && typeof options.header !== 'object') {\n return reject(createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"header参数格式不正确\"));\n }\n\n // 检查formData\n if (options.formData !== undefined && typeof options.formData !== 'object') {\n return reject(createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"formData参数格式不正确\"));\n }\n\n const callbacks: CallbacksBase = {\n success: (res) => {\n resolve(res);\n },\n fail: (err) => {\n reject(err);\n },\n complete: () => {\n // 可选:做一些清理或统一处理\n },\n };\n\n // 调用原生上传文件方法\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"uploadFile\",\n params: options,\n },\n callbacks\n );\n });\n });\n }\n\n /**\n * 执行文件下载\n * @param options 下载文件选项\n * @returns Promise<DownloadFileResponse> 返回下载结果\n */\n public downloadFile(options: DownloadFileOptions): Promise<DownloadFileResponse> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查必需参数\n if (!options.url) {\n return reject(createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"缺少必需的参数: url\"));\n }\n\n // 检查url格式\n if (typeof options.url !== 'string' || !options.url.trim()) {\n return reject(createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"url参数格式不正确\"));\n }\n\n // 检查请求头\n if (options.header !== undefined && typeof options.header !== 'object') {\n return reject(createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"header参数格式不正确\"));\n }\n\n const callbacks: CallbacksBase = {\n success: (res) => {\n resolve(res);\n },\n fail: (err) => {\n reject(err);\n },\n complete: () => {\n // 可选:做一些清理或统一处理\n },\n };\n\n // 调用原生下载文件方法\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"downloadFile\",\n params: options,\n },\n callbacks\n );\n });\n });\n }\n}\n\n// 导出插件\nexport default new RequestPlugin();\n","/**\n * 设备wifi相关插件\n */\n\nimport {\n BridgePlugin,\n PluginContext,\n CallbacksBase,\n} from \"../core\";\n\nimport { BridgeErrorCode, createBridgeError } from \"../core/errors\";\n\nexport interface WifiInfo {\n ssid: string; // Wi-Fi 名称\n bssid: string; // Wi-Fi BSSID\n maclp: string; // Wi-Fi MAC 地址\n isOpen: boolean; // 是否安全 \n timestamp: number; // 时间戳\n rssi: number; // 信号强度\n signalStrength: number; // 信号强度\n}\n\n// 连接 Wi-Fi 的选项\nexport interface ConnectWifiOptions extends CallbacksBase {\n SSID: string; // Wi-Fi SSID\n BSSID?: string; // Wi-Fi BSSID\n password?: string; // Wi-Fi 密码\n isWEP?: boolean; // Wi-Fi 是否为 WEP 默认是 false\n}\n\n// 获取 Wi-Fi 列表 的选项\nexport interface GetWifiListOptions extends CallbacksBase {\n timeout: number; // 超时时间,单位毫秒\n cacheTime: Number; // 缓存时间\n}\n\nexport interface GetWifiListResponse {\n wifiList: WifiInfo[]; // Wi-Fi 列表\n resultMessage?: string; // 成功或错误信息\n resultCode?: number; // 错误码 int枚举值 必选 取值{ 0:成功 1:json错误 2:系统错误 3:超时 }\n}\n\ndeclare module \"../core\" {\n interface PluginMethods {\n startWifi: () => Promise<void>;\n stopWifi: () => Promise<void>;\n connectWifi: (options: ConnectWifiOptions) => Promise<void>;\n getScanWifiListAsync: (options: GetWifiListOptions) => Promise<GetWifiListResponse>;\n }\n}\n\nclass WifiPlugin implements BridgePlugin {\n private context?: PluginContext;\n public readonly name = \"wifi\";\n public readonly version = \"1.0.0\";\n\n public install(context: PluginContext): void {\n this.context = context;\n context.bridge.registerMethod(\"startWifi\", this.startWifi.bind(this));\n context.bridge.registerMethod(\"stopWifi\", this.stopWifi.bind(this));\n context.bridge.registerMethod(\"connectWifi\", this.connectWifi.bind(this));\n context.bridge.registerMethod(\"getScanWifiListAsync\", this.getScanWifiListAsync.bind(this));\n context.bridge.log(`Wi-Fi 插件 v${this.version} 已安装`);\n }\n\n\n /**\n * 初始化 Wi-Fi 模块\n * @returns\n */\n public startWifi(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n const callbacks: CallbacksBase = {\n success: (obj: any) => {\n resolve(obj);\n },\n fail: (err) => {\n reject(err);\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"startWifi\",\n params: {},\n },\n callbacks\n );\n });\n });\n }\n\n /**\n * 关闭 Wi-Fi 模块\n * @returns\n */\n public stopWifi(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n const callbacks: CallbacksBase = {\n success: (obj: any) => {\n resolve(obj);\n },\n fail: (err) => {\n reject(err);\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"stopWifi\",\n params: {},\n },\n callbacks\n );\n });\n });\n }\n\n /**\n * 连接 Wi-Fi\n * @param ssid Wi-Fi 名称\n * @param password Wi-Fi 密码\n * @returns\n */\n public connectWifi(options: ConnectWifiOptions): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查必需参数\n if (!options.SSID) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"缺少必需的参数: SSID\"\n );\n }\n\n if (typeof options.SSID !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"SSID参数格式错误\"\n );\n }\n\n // 检查可选参数\n if (options.BSSID !== undefined && typeof options.BSSID !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"BSSID参数格式错误\"\n );\n }\n\n if (options.password !== undefined && typeof options.password !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"password参数格式错误\"\n );\n }\n\n if (options.isWEP !== undefined && typeof options.isWEP !== \"boolean\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"isWEP参数格式错误\"\n );\n }\n\n // 设置默认值\n options.isWEP = options.isWEP ?? false;\n const callbacks: CallbacksBase = {\n success: (res) => {\n resolve(res);\n },\n fail: (err) => {\n reject(err);\n },\n complete: options.complete,\n }\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"connectWifi\",\n params: options,\n },\n callbacks\n );\n });\n });\n }\n\n /**\n * 获取 Wi-Fi 列表\n * @param options 获取 Wi-Fi 列表的选项\n * @returns 返回一个 Promise,解析为 Wi-Fi 列表响应数据\n */\n public async getScanWifiListAsync(options: GetWifiListOptions): Promise<GetWifiListResponse> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查必需参数\n if (typeof options.timeout !== \"number\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"timeout参数格式错误\"\n );\n }\n\n if (typeof options.cacheTime !== \"number\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"cacheTime参数格式错误\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: (res) => {\n resolve(res);\n },\n fail: (err) => {\n reject(err);\n },\n complete: options.complete,\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"getScanWifiListAsync\",\n params: options,\n timeout: options.timeout,\n },\n callbacks\n );\n });\n });\n }\n\n}\n\nexport default new WifiPlugin();\n","/**\n * H5 Native Bridge\n * H5与原生App通信工具库\n *\n * 主入口文件\n */\nimport { createNativeBridge } from \"./core\";\nimport locationPlugin from \"./plugins/location\";\nimport devicePlugin from \"./plugins/device\";\nimport mediaPlugin from \"./plugins/media\";\nimport navigatePlugin from \"./plugins/navigate\";\nimport toastPlugin from \"./plugins/toast\";\nimport { userinfoPlugin } from './plugins/userInfo';\nimport bluetoothPlugin from \"./plugins/bluetooth\";\nimport storagePlugin from \"./plugins/storage\";\nimport authenticationPlugin from \"./plugins/authentication\";\nimport requestPlugin from \"./plugins/request\";\nimport wifiPlugin from \"./plugins/wifi\";\n// 导出核心模块\nexport { NativeBridgeCore, createNativeBridge } from \"./core\";\n\n// 导出所有插件\nexport { default as locationPlugin } from \"./plugins/location\";\nexport { default as devicePlugin } from \"./plugins/device\";\nexport { default as mediaPlugin } from \"./plugins/media\";\nexport { default as navigatePlugin } from \"./plugins/navigate\";\nexport { default as userinfoPlugin } from \"./plugins/userInfo\";\nexport { default as toastPlugin } from \"./plugins/toast\";\nexport { default as bluetoothPlugin } from \"./plugins/bluetooth\";\nexport { default as storagePlugin } from \"./plugins/storage\";\nexport { default as authenticationPlugin } from \"./plugins/authentication\";\nexport { default as requestPlugin } from \"./plugins/request\";\nexport { default as wifiPlugin } from \"./plugins/wifi\";\n\n// 导出所有类型定义\nexport type {\n BridgePlugin,\n BridgeOptions,\n PluginContext,\n CallbacksBase,\n NativeResponse,\n CallNativeOptions,\n PluginMethods,\n} from \"./core\";\n\nexport type {\n LocationInfo,\n GetLocationOptions,\n} from \"./plugins/location\";\n\nexport type {\n DeviceInfo,\n DeviceInfoOptions,\n GetWifiOptions,\n WifiListAsyncResult,\n} from \"./plugins/device\";\n\nexport type {\n MediaInfo,\n MediaInfoOptions,\n} from \"./plugins/media\";\nexport type { NavigateInfo } from \"./plugins/navigate\";\n\n// 创建并配置默认实例\nconst nativeBridge = createNativeBridge({\n plugins: [\n locationPlugin,\n devicePlugin,\n mediaPlugin,\n navigatePlugin,\n toastPlugin,\n userinfoPlugin,\n bluetoothPlugin,\n storagePlugin,\n authenticationPlugin,\n requestPlugin,\n wifiPlugin,\n ],\n debug: true,\n errorHandler: (error, source) => {\n console.error(`[NativeBridge Error] ${source}:`, error);\n },\n});\n\nexport default nativeBridge;\n"],"names":["BridgeErrorCode","createBridgeError","code","message","details","error","Error","_NativeBridgeCore","constructor","options","__publicField","this","Map","callbackMap","callbackId","isReady","readyCallbacks","debugMode","debug","defaultTimeout","timeout","plugins","pendingCalls","errorHandler","setupBridge","length","forEach","plugin","use","getInstance","instance","onNativeEvent","eventType","handler","nativeEventHandlers","has","set","Set","get","add","offNativeEvent","_a","delete","dispatchNativeEvent","data","log","type","e","registerMethod","name","method","methodRegistry","warn","install","PLUGIN_NOT_INITIALIZED","context","bridge","version","SYSTEM_ERROR","hasPlugin","getPlugin","checkIsInApp","window","nativeBridgeCallback","handleNativeCallback","bind","nativeBridgeDispatchEvent","callNative","action","params","VERSION","apiVersion","API_VERSION","success","callback","fail","readyHandler","document","addEventListener","eventListeners","setTimeout","destroy","listener","event","removeEventListener","clear","clearTimeout","userAgent","navigator","toLowerCase","console","JSON","stringify","webkit","messageHandlers","ready","push","callbacks","Date","now","retryCount","retryDelay","controller","AbortController","timeoutId","signal","aborted","timeoutError","TIMEOUT","call","_b","complete","sendToNative","mockNativeCall","releaseCallback","callNativeSync","messageString","win","_c","nativeBridge","postSyncMessage","_d","AndroidBridge","iframe","createElement","style","display","src","encodeURIComponent","body","appendChild","removeChild","iframeError","_e","_f","_g","processJsonValue","postMessage","Event","dispatchEvent","entries","mockAction","setDebug","setErrorHandler","getInstalledPlugins","Array","from","keys","isDebugMode","args","includes","source","handlerError","getCallBackMap","NativeBridgeCore","value","trimmedValue","trim","startsWith","endsWith","parse","createNativeBridge","locationPlugin","getLocationSync","getLocation","targetAccuracy","coordinate","withReGeocode","useCache","Promise","resolve","reject","location","INVALID_ACTION","devicePlugin","getSystemInfo","getSystemInfoSync","getWifiList","getUUID","setKeepScreenOn","isKeep","JSON_ERROR","res","err","Number","isInteger","cacheTime","resp","resultCode","resultMessage","wifiList","mediaPlugin","saveImage","scan","chooseImage","previewImage","compressImage","chooseVideo","key","isSupportAlbum","url","count","validSourceType","sourceType","isArray","some","filePaths","fileRealPaths","urls","current","compressLevel","MIN_VIDEO_DURATION","test","maxDuration","filePath","duration","size","height","width","navigatePlugin","navigateTo","redirectTo","reLaunch","navigateBack","setNavigationBar","openLink","isShowBar","title","backgroundColor","reset","navigate","SUCCESS","delta","enableShare","toastPlugin","showToast","hideToast","showLoading","hideLoading","obj","content","userinfoPlugin","getUserInfo","bluetooth","openBluetoothAdapter","closeBluetoothAdapter","startBluetoothDevicesDiscovery","stopBluetoothDevicesDiscovery","onBluetoothDeviceFound","offBluetoothDeviceFound","writeBLECharacteristicValue","readBLECharacteristicValue","connectBLEDevice","disconnectBLEDevice","getBLEDeviceCharacteristics","getBLEDeviceServices","onBLECharacteristicValueChange","offBLECharacteristicValueChange","onBLEConnectionStateChanged","offBLEConnectionStateChanged","deviceId","serviceId","characteristicId","services","allowDuplicatesKey","interval","autoClose","getBluetoothDevices","storagePlugin","setStorage","setStorageSync","getStorage","getStorageSync","removeStorage","_createCallbacks","_callNativeMethod","response","Object","authenticationPlugin","exclusiveLiveCheck","requestPlugin","httpRequest","httpRequestSync","uploadFile","downloadFile","toUpperCase","headers","dataType","cacheModel","fileName","fileType","header","formData","wifiPlugin","startWifi","stopWifi","connectWifi","getScanWifiListAsync","SSID","BSSID","password","isWEP","bluetoothPlugin"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"native-bridge.umd.js","sources":["../src/core/errors.ts","../src/core/index.ts","../src/plugins/location.ts","../src/plugins/device.ts","../src/plugins/media.ts","../src/plugins/navigate.ts","../src/plugins/toast.ts","../src/plugins/userInfo.ts","../src/plugins/bluetooth.ts","../src/plugins/storage.ts","../src/plugins/authentication.ts","../src/plugins/request.ts","../src/plugins/wifi.ts","../src/index.ts"],"sourcesContent":["\n// errors.ts\nexport enum BridgeErrorCode {\n SUCCESS = 0,\n JSON_ERROR = 1,\n SYSTEM_ERROR = 2,\n TIMEOUT = 3,\n PLUGIN_NOT_INITIALIZED = 4,\n INVALID_ACTION = 5,\n}\n\nexport interface BridgeError extends Error {\n code: BridgeErrorCode;\n message: string;\n details?: any;\n}\n\nexport const createBridgeError = (\n code: BridgeErrorCode,\n message: string,\n details?: any\n): BridgeError => {\n const error = new Error(message) as BridgeError;\n error.code = code;\n error.details = details;\n return error;\n};","/**\n * NativeBridge核心模块\n *\n * 提供基础的桥接能力和插件系统\n */\nimport { BridgeErrorCode, createBridgeError } from \"./errors\";\n\n// 为低版本浏览器提供 AbortController 的 polyfill\ninterface AbortControllerPolyfill {\n signal: any;\n abort: () => void;\n}\n\nlet AbortControllerPolyfill: any;\n\n// Polyfill for AbortController if not available\nif (typeof AbortController === 'undefined') {\n AbortControllerPolyfill = class {\n signal: any;\n \n constructor() {\n // 创建一个简单的事件目标作为 signal\n this.signal = {\n aborted: false,\n _listeners: [],\n addEventListener: function(event: string, callback: Function) {\n this._listeners.push(callback);\n },\n removeEventListener: function(event: string, callback: Function) {\n const index = this._listeners.indexOf(callback);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n },\n dispatchEvent: function(event: any) {\n this._listeners.forEach((listener: Function) => listener(event));\n }\n };\n }\n \n abort() {\n this.signal.aborted = true;\n this.signal.dispatchEvent({ type: 'abort' });\n }\n };\n} else {\n AbortControllerPolyfill = AbortController;\n}\n\n// 类型定义\nexport interface PluginContext {\n bridge: NativeBridgeCore;\n}\n\nexport interface BridgePlugin {\n name: string;\n version: string;\n install: (context: PluginContext) => void;\n}\n\nexport interface BridgeOptions {\n debug?: boolean;\n timeout?: number;\n plugins?: BridgePlugin[];\n errorHandler?: (error: Error, source: string) => void;\n}\n\nexport interface NativeResponse<T = any> {\n code: number;\n message: string;\n data?: T;\n}\n\nexport interface CallbacksBase<T = any> {\n success?: (data: T) => void;\n fail?: (error: Error) => void;\n complete?: () => void;\n}\n\nexport interface CallNativeOptions {\n action: string;\n params?: Record<string, any>;\n timeout?: number;\n retryCount?: number;\n retryDelay?: number;\n}\n\nexport interface PluginMethods {\n }\n\ntype NativeEventHandler = (event: { type: string; data: any }) => void;\n\n\n/**\n * NativeBridge核心类\n * 提供基础的通信能力和插件系统\n */\nexport class NativeBridgeCore {\n private static instance: NativeBridgeCore;\n private callbackMap: Map<string, CallbacksBase>;\n private callbackId: number;\n private isReady: boolean;\n private readyCallbacks: Array<() => void>;\n private debugMode: boolean;\n private defaultTimeout: number;\n private plugins: Map<string, BridgePlugin>;\n private pendingCalls: Map<string, NodeJS.Timeout | number>;\n private errorHandler?: (error: Error, source: string) => void;\n private eventListeners: Map<string, EventListener> = new Map();\n private nativeEventHandlers: Map<string, Set<NativeEventHandler>> = new Map();\n\n // 版本号管理\n public readonly VERSION = \"1.0.0\";\n public readonly API_VERSION = \"1\";\n\n /**\n * 私有构造函数(单例模式)\n */\n private constructor(options: BridgeOptions = {}) {\n this.callbackMap = new Map();\n this.callbackId = 1;\n this.isReady = false;\n this.readyCallbacks = [];\n this.debugMode = options.debug || true;\n this.defaultTimeout = options.timeout || 10000000;\n this.plugins = new Map();\n this.pendingCalls = new Map();\n this.errorHandler = options.errorHandler;\n\n // 初始化\n\n this.setupBridge();\n\n // 安装插件\n if (options.plugins && options.plugins.length > 0) {\n options.plugins.forEach((plugin) => this.use(plugin));\n }\n }\n\n /**\n * 获取NativeBridge单例\n */\n public static getInstance(options: BridgeOptions = {}): NativeBridgeCore {\n if (!NativeBridgeCore.instance) {\n NativeBridgeCore.instance = new NativeBridgeCore(options);\n } else if (options.plugins && options.plugins.length > 0) {\n // 如果实例已存在但有新插件,则安装新插件\n options.plugins.forEach((plugin) => {\n NativeBridgeCore.instance.use(plugin);\n });\n }\n\n return NativeBridgeCore.instance;\n }\n\n /**\n * 注册原生事件监听\n */\n public onNativeEvent(eventType: string, handler: NativeEventHandler) {\n if (!this.nativeEventHandlers.has(eventType)) {\n this.nativeEventHandlers.set(eventType, new Set());\n }\n this.nativeEventHandlers.get(eventType)!.add(handler);\n }\n\n /**\n * 取消原生事件监听\n */\n public offNativeEvent(eventType: string, handler: NativeEventHandler) {\n this.nativeEventHandlers.get(eventType)?.delete(handler);\n }\n\n /**\n * 供原生调用,分发事件\n */\n public dispatchNativeEvent(eventType: string, data: any) {\n if (this.debugMode) {\n this.log(`分发原生事件: ${eventType}`, data);\n }\n this.nativeEventHandlers.get(eventType)?.forEach((handler) => {\n try {\n handler({ type: eventType, data });\n } catch (e) {\n this.error(`分发原生事件 ${eventType} 失败`, e as Error);\n }\n });\n }\n\n // 新增方法注册机制\n private methodRegistry: Map<string, Function> = new Map();\n\n public registerMethod<T extends keyof PluginMethods>(\n name: T,\n method: PluginMethods[T]\n ): void {\n if (this.methodRegistry.has(name as string)) {\n this.warn(`方法 ${name} 已注册,将被覆盖`);\n }\n this.methodRegistry.set(name as string, method);\n (this as any)[name] = method; // 保持动态挂载,但通过注册表管理\n }\n\n /**\n * 安装插件\n */\n public use(plugin: BridgePlugin): NativeBridgeCore {\n if (\n !plugin ||\n !plugin.name ||\n !plugin.install ||\n typeof plugin.install !== \"function\"\n ) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n `无效的插件: ${plugin?.name || \"未命名\"}`\n );\n }\n\n if (this.plugins.has(plugin.name)) {\n this.warn(`插件 ${plugin.name} 已经安装`);\n return this;\n }\n\n try {\n const context: PluginContext = { bridge: this };\n plugin.install(context);\n this.plugins.set(plugin.name, plugin);\n this.log(`插件 ${plugin.name}@${plugin.version} 安装成功`);\n } catch (error) {\n throw createBridgeError(\n BridgeErrorCode.SYSTEM_ERROR,\n `安装插件 ${plugin.name} 失败`,\n error\n );\n }\n\n return this;\n }\n\n /**\n * 检查插件是否已安装\n */\n public hasPlugin(name: string): boolean {\n return this.plugins.has(name);\n }\n\n /**\n * 获取已安装的插件\n */\n public getPlugin(name: string): BridgePlugin | undefined {\n return this.plugins.get(name);\n }\n\n /**\n * 设置桥接环境\n */\n private setupBridge(): void {\n try {\n // 检测是否在App环境中\n const isInApp = this.checkIsInApp();\n\n if (isInApp) {\n // 注册全局回调处理函数供原生调用\n (window as any).nativeBridgeCallback =\n this.handleNativeCallback.bind(this);\n\n // 供原生调用的全局方法\n (window as any).nativeBridgeDispatchEvent = (\n eventType: string,\n data: any\n ) => {\n this.dispatchNativeEvent(eventType, data);\n };\n\n // 通知原生App JS已准备好\n this.callNative(\n {\n action: \"ready\",\n params: { version: this.VERSION, apiVersion: this.API_VERSION },\n },\n {\n success: () => {\n this.log(\"App已准备就绪=====>\");\n this.isReady = true;\n this.readyCallbacks.forEach((callback) => callback());\n this.readyCallbacks = [];\n },\n fail: (error) => {\n this.error(\"App准备就绪失败\", error);\n },\n }\n );\n const readyHandler = () => {\n this.isReady = true;\n this.readyCallbacks.forEach((callback) => callback());\n this.readyCallbacks = [];\n };\n // 监听原生准备就绪事件\n document.addEventListener(\"NativeBridgeReady\", readyHandler);\n this.eventListeners.set(\"NativeBridgeReady\", readyHandler);\n } else {\n // 非App环境下模拟准备就绪\n setTimeout(() => {\n this.isReady = true;\n this.readyCallbacks.forEach((callback) => callback());\n this.readyCallbacks = [];\n }, 0);\n }\n } catch (error) {\n this.error(\"设置桥接环境失败\", error as Error);\n }\n }\n\n public destroy(): void {\n this.eventListeners.forEach((listener, event) => {\n document.removeEventListener(event, listener);\n });\n this.eventListeners.clear();\n this.callbackMap.clear();\n this.pendingCalls.forEach((timeout) => clearTimeout(timeout));\n this.pendingCalls.clear();\n (window as any).nativeBridgeCallback = undefined;\n }\n\n /**\n * 检测是否在App环境中\n */\n private checkIsInApp(): boolean {\n try {\n // 检测UA或特定全局变量判断是否在App中\n const userAgent = navigator.userAgent.toLowerCase();\n console.log(`[NativeBridge]--userAgent ${userAgent}`);\n console.log(\n `[NativeBridge]--messageHandlers ${JSON.stringify(\n (window as any).webkit?.messageHandlers\n )}`\n );\n return true;\n // return (\n // (window as any).AndroidBridge ||\n // (window as any).webkit?.messageHandlers?.nativeBridge\n // );\n } catch (error) {\n this.error(\"检测App环境失败\", error as Error);\n return false;\n }\n }\n\n /**\n * 等待桥接准备就绪\n */\n public ready(callback: () => void): void {\n if (this.isReady) {\n callback();\n } else {\n this.readyCallbacks.push(callback);\n }\n }\n\n\n /**\n * 调用原生方法\n */\n // 调用原生方法\n public callNative<T = any>(\n options: CallNativeOptions,\n callbacks?: CallbacksBase<T>\n ): string {\n const callbackId = `cb_${this.callbackId++}_${Date.now()}`;\n const {\n action,\n params = {},\n timeout = this.defaultTimeout,\n retryCount = 0,\n retryDelay = 1000,\n } = options;\n if (callbacks) {\n this.callbackMap.set(callbackId, callbacks);\n\n if (timeout > 0) {\n const controller = new AbortControllerPolyfill();\n const timeoutId = setTimeout(() => {\n if (controller.signal.aborted) return;\n\n if (this.callbackMap.has(callbackId)) {\n this.callbackMap.delete(callbackId);\n this.pendingCalls.delete(callbackId);\n\n if (retryCount > 0) {\n this.log(\n `调用 ${action} 超时,${retryDelay}ms后重试 (剩余重试次数: ${retryCount})`\n );\n setTimeout(() => {\n if (controller.signal.aborted) return;\n this.callNative(\n {\n action,\n params,\n timeout,\n retryCount: retryCount - 1,\n retryDelay,\n },\n callbacks\n );\n }, retryDelay);\n } else {\n const timeoutError = createBridgeError(\n BridgeErrorCode.TIMEOUT,\n `调用 ${action} 超时 (${timeout}ms)`\n );\n callbacks.fail?.(timeoutError);\n callbacks.complete?.();\n this.error(`调用超时: ${action}`, timeoutError);\n }\n }\n }, timeout);\n\n this.pendingCalls.set(callbackId, timeoutId);\n // 绑定清理逻辑\n controller.signal.addEventListener(\"abort\", () => {\n clearTimeout(timeoutId);\n this.pendingCalls.delete(callbackId);\n });\n }\n }\n\n const message = { action, params, timeout, callbackId };\n if (this.debugMode) {\n this.log(`调用原生方法: ${action}`, params);\n }\n\n try {\n if (this.checkIsInApp()) {\n this.sendToNative(message);\n } else {\n this.mockNativeCall(message);\n }\n } catch (error) {\n this.error(`调用原生方法 ${action} 失败`, error as Error);\n callbacks?.fail?.(error as Error);\n this.releaseCallback(callbackId);\n }\n\n return callbackId;\n }\n\n public isIOS() {\n return /iPhone|iPad|iPod/i.test(navigator.userAgent);\n }\n\n /**\n * 同步调用原生方法\n * \n * 该方法通过不同的桥接方式(iOS WKWebView、Android WebView或iframe)与原生应用通信,\n * 发送指定的操作指令和参数,并返回处理结果\n * \n * @param action - 要执行的原生操作名称\n * @param params - 传递给原生方法的参数对象\n * @returns 处理后的原生返回数据\n * @throws 当发送消息到原生App失败时抛出错误\n */\n public callNativeSync(action: string, params: any, callbacks: CallbacksBase) {\n let data = undefined\n try {\n const messageString = JSON.stringify({ action, params });\n // 缓存 window 对象以避免重复类型检查\n const win = typeof window !== \"undefined\" ? (window as any) : undefined;\n\n // iOS WKWebView 环境下的同步消息发送\n if (this.isIOS()) {\n this.log(`发送消息到 iOS WKWebView: ${messageString}`);\n data = prompt(messageString);\n // Android 环境下的同步消息发送\n } else if (win?.AndroidBridge?.postSyncMessage) {\n this.log(`发送消息到安卓原生App: ${messageString}`);\n data = win.AndroidBridge.postSyncMessage(messageString);\n // 其他环境使用 iframe 方式通信\n } else if (win) {\n try {\n const iframe = document.createElement(\"iframe\");\n iframe.style.display = \"none\";\n iframe.src = `yourapp://bridge?message=${encodeURIComponent(\n messageString\n )}`;\n document.body.appendChild(iframe);\n setTimeout(() => {\n document.body.removeChild(iframe);\n }, 0);\n return undefined; // 保持返回值类型一致\n } catch (iframeError: any) {\n callbacks?.fail?.(iframeError);\n throw createBridgeError(\n BridgeErrorCode.SYSTEM_ERROR,\n `创建 iframe 失败: ${(iframeError as Error).message}`\n );\n }\n }\n } catch (error: any) {\n callbacks?.fail?.(error);\n throw createBridgeError(\n BridgeErrorCode.SYSTEM_ERROR,\n `发送消息到原生App失败: ${(error as Error).message}`\n );\n }\n\n // 记录调试信息\n if (this.debugMode) {\n this.log(`收到原生回调: success`, data);\n }\n\n callbacks?.success?.(processJsonValue(data));\n return processJsonValue(data)\n }\n\n /**\n * 发送消息到原生\n */\n private sendToNative(message: any): void {\n try {\n const messageString = JSON.stringify(message);\n // iOS WKWebView 优先\n if (\n typeof window !== \"undefined\" &&\n (window as any).webkit &&\n (window as any).webkit.messageHandlers &&\n (window as any).webkit.messageHandlers.nativeBridge\n ) {\n this.log(`发送消息到 iOS WKWebView: ${messageString}`);\n (window as any).webkit.messageHandlers.nativeBridge.postMessage(\n messageString\n );\n }\n // Android 调用\n else if (\n (window as any).AndroidBridge &&\n (window as any).AndroidBridge.postMessage\n ) {\n this.log(`发送消息到安卓原生App: ${messageString}`);\n (window as any).AndroidBridge.postMessage(messageString);\n }\n // 回退到 iframe(旧版 iOS)\n else {\n const iframe = document.createElement(\"iframe\");\n iframe.style.display = \"none\";\n iframe.src = `yourapp://bridge?message=${encodeURIComponent(\n messageString\n )}`;\n document.body.appendChild(iframe);\n setTimeout(() => {\n document.body.removeChild(iframe);\n }, 0);\n }\n } catch (error) {\n throw createBridgeError(\n BridgeErrorCode.SYSTEM_ERROR,\n `发送消息到原生App失败: ${(error as Error).message}`\n );\n }\n }\n\n /**\n * 处理原生回调\n */\n public handleNativeCallback(\n callbackId: string,\n type: \"success\" | \"fail\",\n data: any\n ): void {\n const callbacks = this.callbackMap.get(callbackId);\n \n if (!callbacks) {\n this.warn(`未找到回调ID: ${callbackId}`);\n return;\n }\n\n // 清除超时计时器\n if (this.pendingCalls.has(callbackId)) {\n clearTimeout(this.pendingCalls.get(callbackId));\n this.pendingCalls.delete(callbackId);\n }\n\n // 记录调试信息\n if (this.debugMode) {\n this.log(`收到原生回调: ${type}`, data);\n }\n\n try {\n if (type === \"success\" && callbacks.success) {\n callbacks.success(processJsonValue(data));\n } else if (type === \"fail\" && callbacks.fail) {\n let error: Error;\n\n if (data instanceof Error) {\n error = data;\n } else if (typeof data === \"string\") {\n error = new Error(data);\n } else if (data && data.message) {\n error = new Error(data.message);\n if (data.code) {\n (error as any).code = data.code;\n }\n } else {\n error = new Error(\"未知错误\");\n }\n\n callbacks.fail(error);\n }\n\n if (callbacks.complete) {\n callbacks.complete();\n }\n } catch (error) {\n this.error(\"执行回调函数时出错\", error as Error);\n }\n\n // 执行完后移除回调\n this.callbackMap.delete(callbackId);\n }\n\n /**\n * 模拟原生调用(仅用于开发测试)\n */\n private mockNativeCall(message: any): void {\n if (this.debugMode) {\n this.log(\"模拟原生调用:\", message);\n }\n\n // 根据action模拟不同的原生功能\n switch (message.action) {\n case \"ready\":\n // 模拟原生准备就绪\n setTimeout(() => {\n const event = new Event(\"NativeBridgeReady\");\n document.dispatchEvent(event);\n }, 100);\n break;\n default:\n // 查找已安装的插件,委托处理mock\n const entries = Array.from(this.plugins.entries());\n for (let i = 0; i < entries.length; i++) {\n const [plugin] = entries[i];\n if (\n (plugin as any).mockAction &&\n typeof (plugin as any).mockAction === \"function\"\n ) {\n if ((plugin as any).mockAction(message)) {\n return;\n }\n }\n }\n\n // 默认模拟成功回调\n setTimeout(() => {\n this.handleNativeCallback(\n message.callbackId,\n \"success\",\n { message: \"Mock成功\", data: null }\n );\n }, 100);\n }\n }\n\n /**\n * 释放回调资源\n */\n private releaseCallback(callbackId: string): void {\n if (this.callbackMap.has(callbackId)) {\n const callbacks = this.callbackMap.get(callbackId);\n callbacks?.fail?.(\n createBridgeError(BridgeErrorCode.SYSTEM_ERROR, \"调用原生方法失败\")\n );\n callbacks?.complete?.();\n this.callbackMap.delete(callbackId);\n }\n\n if (this.pendingCalls.has(callbackId)) {\n clearTimeout(this.pendingCalls.get(callbackId));\n this.pendingCalls.delete(callbackId);\n }\n }\n\n /**\n * 设置调试模式\n */\n public setDebug(debug: boolean): void {\n this.debugMode = debug;\n\n if (debug) {\n console.log(\"[NativeBridge] 调试模式已开启 ✅\");\n } else {\n console.log(\"[NativeBridge] 调试模式已关闭 ❌\");\n }\n }\n\n /**\n * 设置全局错误处理器\n */\n public setErrorHandler(\n handler: (error: Error, source: string) => void\n ): void {\n this.errorHandler = handler;\n }\n\n /**\n * 获取已安装插件列表\n */\n public getInstalledPlugins(): string[] {\n return Array.from(this.plugins.keys());\n }\n\n /**\n * 获取当前调试模式状态\n * @returns 是否开启调试模式\n */\n public isDebugMode(): boolean {\n return this.debugMode;\n }\n\n /**\n * 日志输出\n */\n private log(message: string, ...optionalParams: any[]): void {\n if (this.debugMode) {\n console.log(`[NativeBridge] ${message}`, ...optionalParams);\n }\n }\n\n /**\n * 错误日志输出\n */\n private error(message: string, error?: Error): void {\n console.error(`[NativeBridge Error] ${message}`, error);\n if (this.errorHandler && error) {\n this.errorHandler(error, message);\n }\n }\n\n /**\n * 警告日志输出\n */\n private warn(message: string): void {\n console.warn(`[NativeBridge Warn] ${message}`);\n }\n\n /**\n * 获取回调映射表\n */\n public getCallBackMap() {\n return this.callbackMap;\n }\n}\n\n/**\n * 判断是否为JSON字符串,如果是则进行转义,否则直接返回原值\n * \n * @param value - 需要检查和处理的值\n * @returns 如果是JSON字符串则返回转义后的字符串,否则返回原值\n * \n * @example\n * ```typescript\n * const jsonStr = '{\"name\":\"test\",\"value\":\"hello\\\"world\"}';\n * const result = processJsonValue(jsonStr);\n * // 返回转义后的字符串: \"{\\\"name\\\":\\\"test\\\",\\\"value\\\":\\\"hello\\\\\\\"world\\\"}\"\n * \n * const normalStr = 'hello world';\n * const result2 = processJsonValue(normalStr);\n * // 返回原值: \"hello world\"\n * ```\n */\nfunction processJsonValue(value: any): any {\n\n // 如果值为 undefined 或 null,直接返回\n if (value === undefined || value === null) {\n return value;\n }\n\n // 如果不是字符串类型,直接返回原值\n if (typeof value !== 'string') {\n return value;\n }\n\n // 如果是空字符串,直接返回\n if (value === '') {\n return value;\n }\n\n // 尝试解析字符串为JSON\n try {\n // 检查是否为有效的JSON字符串(以{[开头,以}]结尾)\n const trimmedValue = value.trim();\n if ((trimmedValue.startsWith('{') && trimmedValue.endsWith('}')) || \n (trimmedValue.startsWith('[') && trimmedValue.endsWith(']'))) {\n // 尝试解析\n JSON.parse(value);\n // 如果解析成功,说明是合法的JSON字符串,进行转义\n return JSON.parse(value);\n }\n // 不是JSON格式的字符串,直接返回原值\n return value;\n } catch (e) {\n // 解析失败,说明不是合法的JSON字符串,直接返回原值\n return value;\n }\n}\n\n// 导出工厂函数\nexport const createNativeBridge = (\n options?: BridgeOptions\n): NativeBridgeCore => {\n return NativeBridgeCore.getInstance(options);\n};\n\n// 导出默认单例\nexport default NativeBridgeCore.getInstance();\n","/**\n * 位置信息插件\n */\nimport { BridgePlugin, PluginContext, CallbacksBase } from \"../core\";\nimport { BridgeErrorCode, createBridgeError } from \"../core/errors\";\n\nexport interface LocationInfo {\n /** 经度 */\n longitude: number;\n /** 纬度 */\n latitude: number;\n /** 实际的定位精度半径(单位米) */\n accuracy: number;\n /** 格式化地址,如:北京市朝阳区南磨房镇北京国家广告产业园区 */\n address: string;\n /** 省份,如:北京市 */\n province: string;\n /** 城市,直辖市会返回空 */\n city: string;\n /** 行政区,如:朝阳区 */\n district: string;\n /** 街道,如:西大望路甲12-2号楼 */\n road: string;\n /** 当前设备网络类型,如:wifi、3g等 */\n netType: string;\n /** 当前设备使用移动运营商,如:CMCC等 */\n operatorType: string;\n /** 对错误码的描述 */\n errorMessage?: string;\n /** 错误码 */\n errorCode?: number;\n /** 仅Android支持,wifi设置是否开启,不保证已连接上 */\n isWifiEnabled?: boolean;\n /** 仅Android支持,gps设置是否开启,不保证已经连接上 */\n isGpsEnabled?: boolean;\n /** 仅Android支持,定位返回的经纬度是否是模拟的结果 */\n isFromMock?: boolean;\n /** 仅Android支持,我们使用的是混合定位,具体定位提供者有wifi/lbs/gps\" 这三种 */\n provider?: \"wifi\" | \"lbs\" | \"gps\";\n /** 仅Android支持,移动网络是设置是否开启,不保证已经连接上 */\n isMobileEnabled: boolean;\n}\n\nexport interface GetLocationOptions extends CallbacksBase {\n success?: (location: string) => void;\n /**\n * 期望定位精度半径(单位米),定位结果尽量满足该参数要求,但是不一定能保证小于该误差,\n * 开发者需要读取返回结果的 accuracy 字段校验坐标精度;\n * 建议按照业务需求设置定位精度,推荐采用200m,\n * 可获得较好的精度和较短的响应时长\n */\n targetAccuracy: number;\n /** 1:获取高德坐标, 0:获取标准坐标;推荐使用高德坐标;标准坐标没有address字段 */\n coordinate: number;\n /** 是否需要带有逆地理编码信息;该功能需要网络请求,请更具自己的业务场景使用 */\n withReGeocode: boolean;\n /** 是否缓存地理位置信息。默认是true。如果true,客户端会对定位的地理位置信息缓存,在缓存期内(2分钟)再次定位会返回旧的定位 */\n useCache: boolean;\n}\n\ndeclare module \"../core\" {\n interface PluginMethods {\n /**\n * 同步获取位置信息\n * @param options 定位选项\n */\n getLocationSync: (options?: GetLocationOptions) => void;\n /**\n * 异步获取位置信息\n * @param options 定位选项\n */\n getLocation: (\n options?: Omit<GetLocationOptions, \"success\" | \"fail\">\n ) => Promise<LocationInfo>;\n }\n interface NativeBridgeCore extends PluginMethods {}\n}\n\nclass LocationPlugin implements BridgePlugin {\n public readonly name = \"location\";\n public readonly version = \"1.0.0\";\n private context?: PluginContext;\n\n public install(context: PluginContext): void {\n this.context = context;\n context.bridge.registerMethod(\n \"getLocationSync\",\n this.getLocationSync.bind(this)\n );\n context.bridge.registerMethod(\"getLocation\", this.getLocation.bind(this));\n }\n\n /**\n * 获取当前位置信息\n * @param options - 位置选项,可选参数包括:\n * - targetAccuracy: 目标精度,单位米,默认200\n * - coordinate: 坐标类型,默认1(可能表示WGS84)\n * - withReGeocode: 是否需要逆地理编码,默认true\n * - useCache: 是否使用缓存,默认true\n * @returns 返回一个Promise,解析为LocationInfo对象\n */\n public getLocation(\n options: Omit<GetLocationOptions, \"success\" | \"fail\"> = {\n targetAccuracy: 200,\n coordinate: 1,\n withReGeocode: true,\n useCache: true,\n }\n ): Promise<LocationInfo> {\n // 设置默认值\n options.useCache = options.useCache ?? true; // 默认使用缓存\n return new Promise((resolve, reject) => {\n this.getLocationSync({\n ...options,\n success: (location: any) => {\n resolve(location);\n },\n fail: (error: any) => reject(error),\n });\n });\n }\n\n public getLocationSync(\n options: GetLocationOptions = {\n targetAccuracy: 200,\n coordinate: 1,\n withReGeocode: true,\n useCache: true,\n }\n ): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查必需参数\n if (typeof options.targetAccuracy !== \"number\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"targetAccuracy参数格式错误\"\n );\n }\n if (typeof options.coordinate !== \"number\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"coordinate参数格式错误\"\n );\n }\n if (typeof options.withReGeocode !== \"boolean\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"withReGeocode参数格式错误\"\n );\n }\n if (typeof options.useCache !== \"boolean\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"useCache参数格式错误\"\n );\n }\n\n // 设置默认值\n options.useCache = options.useCache ?? true; // 默认使用缓存\n const callbacks: CallbacksBase = {\n success: options.success,\n fail: options.fail,\n complete: options.complete,\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"getLocation\",\n params: options,\n },\n callbacks\n );\n });\n }\n}\n\nexport const locationPlugin = new LocationPlugin();\nexport default locationPlugin;\n","/**\n * 设备信息插件\n * 提供设备相关信息和功能\n */\n\nimport {\n BridgePlugin,\n PluginContext,\n CallbacksBase,\n\n} from \"../core\";\nimport { BridgeErrorCode, createBridgeError } from \"../core/errors\";\n\n// 类型定义\nexport interface DeviceInfo {\n model: string; // 设备型号\n pixelRatio: number; // 设备像素比\n windowWidth: number; // 窗口宽度\n windowHeight: number; // 窗口高度\n version: string; // 版本号\n storage: string; // 存储空间\n currentBattery: string; // 当前电量百分比\n system: string; // 系统版本\n platform: string; // 系统名:Android,iOS。\n screenWidth: number; // 屏幕宽度\n screenHeight: number; // 屏幕高度\n brand: string; // 设备品牌\n fontSizeSetting: number; // 字体大小设置\n}\n\nexport interface DeviceInfoOptions extends CallbacksBase {\n success?: (deviceInfo: DeviceInfo) => void; // 覆盖基础类型,指定具体返回类型\n}\n\nexport interface GetWifiOptions extends CallbacksBase {\n /** 超时时间 int 必选 */\n timeout?: number;\n /** 缓存时间 int 必选 */\n cacheTime?: number;\n}\nexport interface KeepScreenOnOptions extends CallbacksBase {\n /** 是否保持屏幕常亮 */\n isKeep: boolean;\n}\n\n\n/**\n * 获取WIFI 返回结果定义\n * @apiName device.base.getScanWifiListAsync\n */\nexport interface WifiListAsyncResult {\n /** 错误码 int枚举值 必选 取值{ 0:成功 1:json错误 2:系统错误 3:超时 } */\n resultCode: number;\n /** WiFi列表 */\n wifiList?: any[];\n /** 成功或错误信息 */\n resultMessage?: string;\n}\n\n// 获取设备UUID,重新安装后UUID改变\nexport interface GetDeviceUUIDOptions extends CallbacksBase {\n uuid?: string; // 覆盖基础类型,指定具体返回类型\n}\n\n// 定义插件方法类型\ndeclare module \"../core\" {\n interface PluginMethods {\n getSystemInfo: (options?: DeviceInfoOptions) => Promise<DeviceInfo>;\n getSystemInfoSync: (options?: DeviceInfoOptions) => void;\n getUUID: () => Promise<GetDeviceUUIDOptions>;\n getWifiList: (options?: GetWifiOptions) => Promise<WifiListAsyncResult>;\n setKeepScreenOn: (options: KeepScreenOnOptions) => void;\n }\n interface NativeBridgeCore extends PluginMethods { }\n}\n/**\n * 设备信息插件类\n */\nclass DevicePlugin implements BridgePlugin {\n public readonly name = \"device\";\n public readonly version = \"1.0.0\";\n private context?: PluginContext;\n\n /**\n * 安装插件\n */\n public install(context: PluginContext): void {\n this.context = context;\n // 在桥接对象上挂载方法\n context.bridge.registerMethod(\"getSystemInfo\", this.getSystemInfo.bind(this));\n context.bridge.registerMethod(\"getSystemInfoSync\", this.getSystemInfoSync.bind(this));\n context.bridge.registerMethod(\"getWifiList\", this.getWifiList.bind(this));\n context.bridge.registerMethod(\"getUUID\", this.getUUID.bind(this));\n context.bridge.registerMethod(\n \"setKeepScreenOn\",\n this.setKeepScreenOn.bind(this)\n );\n }\n\n /**\n * 设置屏幕常亮状态\n * @param options 配置选项\n * @param options.isKeep 是否保持屏幕常亮,默认为true\n * @param options.success 成功回调\n * @param options.fail 失败回调\n * @param options.complete 完成回调\n * @returns void\n */\n public setKeepScreenOn(\n options: KeepScreenOnOptions\n ): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 校验必填值\n if (options.isKeep === undefined || options.isKeep === null) {\n throw createBridgeError(\n BridgeErrorCode.JSON_ERROR,\n \"缺少必需参数:isKeep\"\n );\n }\n\n // 判断参数\n if (options.isKeep !== undefined && typeof options.isKeep !== \"boolean\") {\n throw createBridgeError(\n BridgeErrorCode.JSON_ERROR,\n \"isKeep参数格式不正确\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: options.success,\n fail: options.fail,\n complete: options.complete,\n };\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"setKeepScreenOn\",\n params: { isKeep: options.isKeep },\n },\n callbacks\n );\n });\n }\n\n /**\n * 同步获取设备系统信息\n * \n * @param options - 获取设备信息的配置选项\n * @returns any - 返回设备信息结果\n */\n public getSystemInfoSync(options: DeviceInfoOptions = {}): any {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 创建回调对象,用于处理成功、失败和完成事件\n const callbacks: CallbacksBase = {\n success: (res: any) => {\n options.success?.(res);\n },\n fail: options.fail,\n complete: options.complete,\n };\n\n return this.context?.bridge.callNativeSync('getSystemInfoSync', {}, callbacks)\n }\n\n /**\n * 获取设备信息(Promise 风格)\n * \n * @description\n * 1. 检查插件是否初始化,未初始化则抛出错误\n * 2. 创建并返回一个Promise,用于异步获取设备信息\n * 3. 通过Native Bridge调用原生能力获取设备信息\n * \n * @throws {BridgeError} 当插件未初始化时抛出错误\n * @returns {Promise<DeviceInfo>} 返回包含设备信息的Promise对象\n */\n public getSystemInfo(): Promise<DeviceInfo> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: (res) => {\n resolve(res);\n },\n fail: (err) => {\n reject(err);\n },\n complete: () => {\n // 可选:做一些清理或统一处理\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"getSystemInfo\",\n params: {},\n },\n callbacks\n );\n });\n });\n };\n\n /**\n * 获取WiFi列表\n * \n * 该方法通过原生桥接获取当前可用的WiFi列表,返回一个Promise对象\n * \n * @param {GetWifiOptions} [options={}] - 获取WiFi列表的可选参数对象\n * @returns {Promise<WifiListAsyncResult>} 返回一个Promise,解析后包含WiFi列表或错误信息\n * - resultCode: 0表示成功,1表示失败\n * - resultMessage: 结果描述信息\n * - wifiList: WiFi列表数组\n */\n public getWifiList(\n options: GetWifiOptions = {}\n ): Promise<WifiListAsyncResult> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查可选参数\n if (options.timeout !== undefined && (typeof options.timeout !== \"number\" || options.timeout <= 0 || !Number.isInteger(options.timeout))) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"timeout参数格式错误\"\n );\n }\n\n if (options.cacheTime !== undefined && (typeof options.cacheTime !== \"number\" || options.cacheTime <= 0 || !Number.isInteger(options.cacheTime))) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"cacheTime参数格式错误\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: (res: any) => {\n resolve(res);\n },\n fail: (err: Error) => {\n const resp: WifiListAsyncResult = {\n resultCode: 1,\n resultMessage: err.message,\n wifiList: [],\n };\n console.error(\"保存失败:\", resp);\n reject(resp);\n },\n complete: () => {\n // 可选:做一些清理或统一处理\n },\n };\n\n // 确保桥接环境就绪后调用原生方法。\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"getWifiList\",\n params: { ...options },\n },\n callbacks\n );\n });\n });\n }\n\n /**\n * 获取设备的唯一标识符\n * @returns 返回一个Promise,解析后得到设备的UUID信息\n * @throws 如果插件未正确初始化会抛出错误\n */\n public getUUID(): Promise<GetDeviceUUIDOptions> {\n return new Promise((resolve, reject) => {\n const callbacks: CallbacksBase = {\n success: (res) => {\n resolve(res);\n },\n fail: (err) => {\n reject(err);\n },\n }\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"getUUID\",\n params: {},\n },\n callbacks\n );\n });\n });\n }\n\n}\n\n// 导出插件实例\nexport const devicePlugin = new DevicePlugin();\nexport default devicePlugin;\n","/**\n * 设备信息插件\n * 提供设备相关信息和功能\n */\n\nimport {\n BridgePlugin,\n PluginContext,\n CallbacksBase,\n NativeResponse,\n} from \"../core\";\nimport { BridgeErrorCode, createBridgeError } from \"../core/errors\";\n\n// 类型定义\nexport interface MediaInfo {\n platform: \"android\" | \"ios\" | \"unknown\"; // 平台\n url: string;\n}\n\nexport interface MediaInfoOptions extends CallbacksBase {\n url: string; // 要保存的图片地址\n}\n\nexport interface ScanOptions extends CallbacksBase {\n /**\n * 扫码样式。\n * 可选值:\n * - 'qr':二维码扫码框\n * - 'bar':条形码扫码框\n * 默认为 'qr'。\n * 兼容性说明:此字段从必填变为可选,未传递时将使用默认值 'qr',如之前为必填请注意兼容性。\n */\n key?: \"qr\" | \"bar\";\n /**\n * 是否支持从相册选择:\n * 默认值为 true,\n */\n isSupportAlbum?: boolean;\n}\n\nexport interface ScanRes {\n /** 扫码所得数据 */\n code?: string;\n /**\n * 扫描二维码时返回二维码数据。\n */\n qrCode?: string;\n /**\n * 扫描条形码时返回条形码数据。\n */\n barCode?: string;\n /**\n * 扫描结果的最后一帧图片的本地定位符\n */\n filePath?: string;\n /**\n * 扫描结果的最后一帧图片的本地真实图片路径。\n */\n fileRealPath?: string;\n}\n\nexport interface ChooseImageOptions extends CallbacksBase {\n count?: number; // 最大可选照片数 默认值:1。\n sourceType?: string[]; // 相册选取或者拍照。默认值:['camera','album']\n}\nexport interface ChooseImageResponse {\n filePaths: string[]; // 图片文件描述。\n fileRealPaths: string[]; // 图片文件真实路径。\n}\n\nexport interface previewImageOptions extends CallbacksBase {\n urls: string[]; // 要预览的图片链接列表\n current?: number; // 当前显示图片索引。 默认值:0。\n}\n\nexport interface compressImageOptions extends CallbacksBase {\n filePaths: string[]; // 压缩后的路径数组。\n compressLevel?: number; // 压缩级别,支持 0 ~ 4 的整数 默认 4\n}\n\nexport interface compressImageResponse {\n filePaths: string; // 压缩后的图片路径\n}\n\nexport interface compressVideoOptions extends CallbacksBase {\n filePath: string; // 要压缩的视频路径\n compressLevel?: number; // 压缩级别,支持 0 ~ 3 的整数 默认 3\n}\n\nexport interface compressVideoResponse {\n filePath: string; // 压缩后的视频路径\n}\n\nexport interface ChooseVideoOptions extends CallbacksBase {\n sourceType?: string[]; // 可以指定来源是相册还是相机,默认值:['album','camera']\n maxDuration?: number; // 视频最长拍摄时间,单位秒,默认60秒 \n compressLevel?: number; //压缩级别,支持 0 ~ 3 的整数,默认 3, (0:低质量, 1:中等质量,2:高质量,3:不压缩)\n}\n\nexport interface ChooseVideoResponse {\n filePath: string; // 选定视频的临时文件路径\n duration: number; // 视频时长,单位秒\n size: number; // 视频文件大小,单位字节\n height: number; // 视频高度\n width: number; // 视频宽度\n}\n\nexport interface UploadProgressOptions {\n progress: number; // 上传进度,0-1\n status: number; // 上传状态,0: 正在上传、1: 上传成功、2: 失败\n}\n\n// 视频最大时长(秒),如需调整请修改此常量\nconst MAX_VIDEO_DURATION = 60;\n\ndeclare module \"../core\" {\n interface PluginMethods {\n saveImage: (options: MediaInfoOptions) => Promise<NativeResponse>;\n scan: (options: ScanOptions) => Promise<ScanRes>;\n chooseImage: (options?: ChooseImageOptions) => Promise<ChooseImageResponse>;\n previewImage: (options: previewImageOptions) => Promise<void>;\n compressImage: (options: compressImageOptions) => Promise<compressImageResponse>;\n compressVideo: (options: compressVideoOptions) => Promise<compressVideoResponse>;\n chooseVideo: (options?: ChooseVideoOptions) => Promise<ChooseVideoResponse>;\n onUploadProgress: (callback: (progress: UploadProgressOptions) => void) => void;\n }\n interface NativeBridgeCore extends PluginMethods { }\n}\n\n/**\n * 设备信息插件类\n */\nclass MediaPlugin implements BridgePlugin {\n public readonly name = \"media\";\n public readonly version = \"1.0.0\";\n private context?: PluginContext;\n\n /**\n * 安装插件\n */\n public install(context: PluginContext): void {\n this.context = context;\n // 在桥接对象上挂载方法\n context.bridge.registerMethod(\"saveImage\", this.saveImage.bind(this));\n context.bridge.registerMethod(\"scan\", this.scan.bind(this));\n context.bridge.registerMethod(\"chooseImage\", this.chooseImage.bind(this));\n context.bridge.registerMethod(\"previewImage\", this.previewImage.bind(this));\n context.bridge.registerMethod(\"compressImage\", this.compressImage.bind(this));\n context.bridge.registerMethod(\"compressVideo\", this.compressVideo.bind(this));\n context.bridge.registerMethod(\"chooseVideo\", this.chooseVideo.bind(this));\n context.bridge.registerMethod(\"onUploadProgress\", this.onUploadProgress.bind(this));\n }\n\n\n /**\n * 执行扫码功能\n * \n * @description 调用原生扫码功能,返回扫码结果。该方法会等待桥接准备就绪后调用原生扫码API。\n * \n * @param options - 扫码配置选项,排除了success和fail回调\n * @param options.complete - 可选的完成回调函数,无论成功或失败都会执行\n * \n * @returns Promise<ScanRes> 返回包含扫码结果的Promise对象\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出PLUGIN_NOT_INITIALIZED错误\n * @throws {BridgeError} 当扫码失败时抛出SYSTEM_ERROR错误\n * \n * @example\n */\n public scan(\n options: Omit<ScanOptions, \"success\" | \"fail\">\n ): Promise<ScanRes> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查参数\n if ((options.key !== undefined && typeof options.key !== \"string\") || (options.key !== undefined && ![\"qr\", \"bar\"].includes(options.key))) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"key参数格式不正确\"\n );\n }\n\n if (options.isSupportAlbum !== undefined && typeof options.isSupportAlbum !== \"boolean\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"isSupportAlbum参数格式不正确\"\n );\n }\n\n // 设置默认值\n options.key = options.key || \"qr\"; // 默认使用二维码扫码\n options.isSupportAlbum = options.isSupportAlbum ?? true; // 默认支持相册选择\n const callbacks: CallbacksBase = {\n success: (res: any) => {\n resolve(res);\n },\n fail: (err: any) => {\n reject(\n createBridgeError(BridgeErrorCode.SYSTEM_ERROR, \"扫码失败\", err)\n );\n },\n complete: () => {\n options.complete?.();\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"scan\",\n params: { ...options },\n },\n callbacks\n );\n });\n });\n }\n\n /**\n * 保存图片到相册(Promise 风格)\n */\n public saveImage(options: MediaInfoOptions): Promise<NativeResponse> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查必需参数\n if (!options.url) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"缺少必需参数:url\"\n );\n }\n\n // 检查 URL 格式\n if (typeof options.url !== \"string\" || !options.url.trim()) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"url参数格式不正确\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: (res: any) => {\n console.log(\"保存成功:\", res);\n const resp: NativeResponse = {\n code: 1,\n message: \"保存成功\",\n data: res,\n };\n resolve(resp);\n },\n fail: (err: any) => {\n const resp: NativeResponse = {\n code: 2,\n message: \"保存失败\",\n data: err,\n };\n console.error(\"保存失败:\", resp);\n reject(resp);\n },\n complete: () => {\n options.complete?.();\n // 可选:做一些清理或统一处理\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"saveImage\",\n params: { url: options.url },\n },\n callbacks\n );\n });\n });\n }\n\n /**\n * 选择图片功能\n * @param options 选择图片的配置选项\n * @returns 返回一个Promise,解析为选择的图片响应数据\n */\n public chooseImage(options: ChooseImageOptions = {}): Promise<ChooseImageResponse> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查 count\n if (options.count !== undefined && (typeof options.count !== \"number\" || options.count <= 0 || !Number.isInteger(options.count))) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"count参数格式不正确\"\n );\n }\n\n const validSourceType = ['camera', 'album'];\n if ((options.sourceType && !Array.isArray(options.sourceType)) || (options.sourceType && options.sourceType.length === 0)) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"sourceType参数格式不正确\"\n );\n }\n\n if (options.sourceType && options.sourceType.some(type => !validSourceType.includes(type))) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"sourceType参数格式不正确\"\n );\n }\n\n // 设置默认值\n options.count = options.count || 1; // 默认选择1张图片\n options.sourceType = options.sourceType || [\"camera\", \"album\"]; // 默认支持相机和相册\n const callbacks: CallbacksBase = {\n success: (res) => {\n resolve(res || { filePaths: [], fileRealPaths: [] });\n },\n fail: (err: any) => {\n console.error(\"选择图片失败:\", err);\n reject(err);\n },\n complete: () => {\n // 可选:做一些清理或统一处理\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"chooseImage\",\n params: options,\n },\n callbacks\n );\n });\n });\n }\n\n /** \n * 预览图片功能\n * @param options 预览图片的配置参数对象,包含以下属性:\n * - current: 可选,number类型,默认0,表示从第几张图片开始预览\n * - urls: string[]类型,图片URL数组\n * - 其他可能的自定义参数\n * @returns Promise<void> \n * 成功时:解析为原生返回的结果对象(已JSON.parse处理)\n * 失败时:拒绝返回错误信息\n */\n public previewImage(options: previewImageOptions): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查参数\n if (!options.urls || !Array.isArray(options.urls) || options.urls.length === 0) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"urls参数格式不正确\"\n );\n }\n\n // 设置默认值\n options.current = options.current || 0; // 默认显示第一张图片\n const callbacks: CallbacksBase = {\n success: (res) => {\n resolve(res);\n },\n fail: (err) => {\n reject(err);\n },\n complete: () => {\n // 可选:做一些清理或统一处理\n },\n };\n this.context?.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"previewImage\",\n params: options,\n },\n callbacks\n );\n });\n });\n }\n\n /**\n * 压缩图片\n * @param options 压缩图片的配置选项\n * @returns 返回一个Promise,解析为压缩后的图片响应数据\n */\n public compressImage(options: compressImageOptions): Promise<compressImageResponse> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n if (!options.filePaths || !Array.isArray(options.filePaths) || options.filePaths.length === 0) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"filePaths参数格式不正确\"\n );\n }\n\n // 检查 compressLevel 0-4的整数\n if (options.compressLevel !== undefined && (typeof options.compressLevel !== \"number\" || options.compressLevel < 0 || options.compressLevel > 4 || !Number.isInteger(options.compressLevel))) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"compressLevel参数格式不正确\"\n );\n }\n\n // 设置默认值\n options.compressLevel = options.compressLevel ?? 4; // 默认压缩级别为4\n const callbacks: CallbacksBase = {\n success: (res) => {\n resolve(res || { filePaths: \"\" });\n },\n fail: (err: any) => {\n console.error(\"压缩图片失败:\", err);\n reject(err);\n },\n complete: () => {\n // 可选:做一些清理或统一处理\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"compressImage\",\n params: options,\n },\n callbacks\n );\n });\n });\n }\n\n /**\n * 压缩视频\n * @param options 压缩视频的配置选项\n * @returns 返回一个Promise,解析为压缩后的视频响应数据\n */\n public compressVideo(options: compressVideoOptions): Promise<compressVideoResponse> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n if (!options.filePath || typeof options.filePath !== \"string\" || !options.filePath.trim()) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"filePath参数格式不正确\"\n );\n }\n\n // 检查 compressLevel 0-3的整数\n if (options.compressLevel !== undefined && (typeof options.compressLevel !== \"number\" || options.compressLevel < 0 || options.compressLevel > 3 || !Number.isInteger(options.compressLevel))) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"compressLevel参数格式不正确\"\n );\n }\n\n // 设置默认值\n options.compressLevel = options.compressLevel ?? 3; // 默认压缩级别为3\n const callbacks: CallbacksBase = {\n success: (res) => {\n resolve(res || { filePath: \"\" });\n },\n fail: (err: any) => {\n console.error(\"压缩视频失败:\", err);\n reject(err);\n },\n complete: () => {\n // 可选:做一些清理或统一处理\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"compressVideo\",\n params: options,\n },\n callbacks\n );\n });\n });\n }\n\n /**\n * 选择视频文件\n * @param options 选择视频的配置选项,包含以下属性:\n * @param options.sourceType 视频来源类型,默认同时支持相册和相机['album','camera']\n * @param options.maxDuration 视频最大时长(秒),默认60秒\n * @param options.compressLevel?: number; //压缩级别,支持 0 ~ 3 的整数,默认 3, (0:低质量, 1:中等质量,2:高质量,3:不压缩)\n * @returns Promise<ChooseVideoResponse> 返回包含视频信息的Promise对象\n * @returns ChooseVideoResponse.filePath 视频临时文件路径\n * @returns ChooseVideoResponse.duration 视频时长(秒)\n * @returns ChooseVideoResponse.size 视频文件大小(字节)\n * @returns ChooseVideoResponse.height 视频高度\n * @returns ChooseVideoResponse.width 视频宽度\n */\n public chooseVideo(options: ChooseVideoOptions = {}): Promise<ChooseVideoResponse> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查 sourceType\n const validSourceType = ['camera', 'album'];\n if ((options.sourceType && !Array.isArray(options.sourceType)) || (options.sourceType && options.sourceType.length === 0)) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"sourceType参数格式不正确\"\n );\n }\n\n if (options.sourceType && options.sourceType.some(type => !validSourceType.includes(type))) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"sourceType参数格式不正确\"\n );\n }\n\n // 检查 maxDuration\n // 判断是否IOS\n const isIOS = /(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent);\n let MIN_VIDEO_DURATION = 5;\n if (isIOS) {\n MIN_VIDEO_DURATION = 15\n }\n if (options.maxDuration !== undefined && (typeof options.maxDuration !== \"number\" || options.maxDuration < MIN_VIDEO_DURATION || options.maxDuration > MAX_VIDEO_DURATION || !Number.isInteger(options.maxDuration))) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"maxDuration参数格式不正确\"\n );\n }\n\n // 检查compressLevel 0-3的整数\n if (options.compressLevel !== undefined && (typeof options.compressLevel !== \"number\" || options.compressLevel < 0 || options.compressLevel > 3 || !Number.isInteger(options.compressLevel))) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"compressLevel参数格式不正确\"\n );\n }\n\n // 设置默认值\n options.sourceType = options.sourceType || [\"album\", \"camera\"]; // 默认支持相册和相机\n options.maxDuration = options.maxDuration ?? MAX_VIDEO_DURATION;\n options.compressLevel=options.compressLevel ?? 3;\n const callbacks: CallbacksBase = {\n success: (res) => {\n resolve(res || { filePath: \"\", duration: 0, size: 0, height: 0, width: 0 });\n },\n fail: (err: any) => {\n console.error(\"选择视频失败:\", err);\n reject(err);\n },\n complete: () => {\n // 可选:做一些清理或统一处理\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"chooseVideo\",\n params: options,\n },\n callbacks\n );\n });\n });\n }\n\n /**\n * 上传文件进度回调\n * @param options 上传进度信息\n * @param options.progress 上传进度,0-100\n * @param options.status 上传状态,0: 正在上传、1: 上传成功、2: 失败\n * @returns void\n */\n public onUploadProgress(callback: (options: UploadProgressOptions) => void): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n\n this.context.bridge.ready(() => {\n this.context?.bridge.onNativeEvent(\n \"onUploadProgress\",\n (event: { type: string; data: any }) => {\n callback(event.data ? JSON.parse(event.data) : {});\n }\n );\n });\n }\n}\n\n// 导出插件实例\nexport const mediaPlugin = new MediaPlugin();\nexport default mediaPlugin;\n","/**\n * 导航插件\n */\nimport {\n BridgePlugin,\n PluginContext,\n CallbacksBase,\n NativeResponse,\n} from \"../core\";\nimport {\n BridgeErrorCode,\n createBridgeError,\n BridgeError,\n} from \"../core/errors\";\n\nexport interface NavigateInfo extends CallbacksBase {\n url: string;\n}\n\nexport interface NavigationBarOptions extends CallbacksBase {\n /** 是否显示导航栏\n * 默认显示\n * 否:隐藏导航栏\n */\n isShowBar?: boolean;\n /** 导航栏标题 */\n title?: string;\n /** 导航栏标题颜色\n * 导航栏背景色,支持十六进制颜色值。\n */\n backgroundColor?: string;\n /** 是否重置导航栏背景色默认配色。\n */\n reset?: boolean;\n}\n\nexport interface navigateBackInfo extends CallbacksBase {\n delta?: number; // 默认1\n}\n\n// openLink\nexport interface OpenLinkOptions extends CallbacksBase {\n url: string;\n enableShare?: boolean; // 默认false\n}\n\ndeclare module \"../core\" {\n interface PluginMethods {\n /**\n * 导航到指定页面\n * @param options 导航选项\n */\n navigateTo: (options: NavigateInfo) => void;\n /**\n * 重定向到指定页面\n * @param options 导航选项\n */\n redirectTo: (options: NavigateInfo) => void;\n /**\n * 重新加载当前页面\n * @param options 导航选项\n */\n reLaunch: (options: NavigateInfo) => void;\n /**\n * 返回到上一个页面\n * @param options 导航选项\n */\n navigateBack: (options: navigateBackInfo) => void;\n /**\n * 设置导航栏\n * @param options 样式选项\n */\n setNavigationBar: (options: NavigationBarOptions) => Promise<void>;\n /**\n * 打开外部链接\n * @param options 链接选项\n */\n openLink: (options: OpenLinkOptions) => Promise<void>;\n /**\n * 跳转原生设置页面\n * @param url 要跳转的原生页面URL\n */\n navigateToNativePage: (url: string) => Promise<void>;\n /**\n * 关闭当前WebView页面\n */\n closeCurrentPage: () => Promise<void>;\n }\n interface NativeBridgeCore extends PluginMethods { }\n}\n\nclass NavigatePlugin implements BridgePlugin {\n public readonly name = \"navigate\";\n public readonly version = \"1.0.0\";\n private context?: PluginContext;\n\n public install(context: PluginContext): void {\n this.context = context;\n context.bridge.registerMethod(\"navigateTo\", this.navigateTo.bind(this));\n context.bridge.registerMethod(\"redirectTo\", this.redirectTo.bind(this));\n context.bridge.registerMethod(\"reLaunch\", this.reLaunch.bind(this));\n context.bridge.registerMethod(\"navigateBack\", this.navigateBack.bind(this));\n context.bridge.registerMethod(\n \"setNavigationBar\",\n this.setNavigationBar.bind(this)\n );\n context.bridge.registerMethod(\"openLink\", this.openLink.bind(this));\n context.bridge.registerMethod(\"navigateToNativePage\", this.navigateToNativePage.bind(this));\n context.bridge.registerMethod(\"closeCurrentPage\", this.closeCurrentPage.bind(this));\n }\n\n public setNavigationBar(options: NavigationBarOptions): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查必需参数\n if (options.isShowBar !== undefined && typeof options.isShowBar !== \"boolean\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"缺少必需的参数: isShowBar\"\n );\n }\n\n // 检查可选参数\n if (options.title !== undefined && typeof options.title !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"title参数格式不正确\"\n );\n }\n\n if (\n options.backgroundColor !== undefined &&\n (typeof options.backgroundColor !== \"string\" ||\n !/^#[0-9A-Fa-f]{6}$/.test(options.backgroundColor))\n ) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"backgroundColor参数格式不正确\"\n );\n }\n\n if (options.reset !== undefined && typeof options.reset !== \"boolean\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"reset参数格式不正确\"\n );\n }\n\n // 默认值\n options.isShowBar = options.isShowBar ?? true;\n const callbacks: CallbacksBase = {\n success: () => {\n resolve();\n },\n fail: (err: any) => {\n reject(\n createBridgeError(\n BridgeErrorCode.SYSTEM_ERROR,\n \"设置导航栏失败\",\n err\n )\n );\n },\n complete: () => { },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"setNavigationBar\",\n params: { ...options },\n },\n callbacks\n );\n });\n });\n }\n\n private navigate(options: NavigateInfo, type?: string) {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查必需参数\n if (!options || !options.url) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"缺少必需的参数: url\"\n );\n }\n\n if (typeof options.url !== \"string\" || !options.url.trim()) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"url参数格式错误\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: (res: any) => {\n const resp: NativeResponse = {\n code: BridgeErrorCode.SUCCESS,\n message: \"跳转成功\",\n data: res,\n };\n options.success?.(resp);\n },\n\n fail: (err: any) => {\n const resp: BridgeError = {\n code: BridgeErrorCode.SYSTEM_ERROR,\n message: \"跳转失败\",\n details: err,\n name: \"\",\n };\n options.fail?.(resp);\n },\n\n complete: () => {\n options.complete?.();\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: type || \"navigateTo\",\n params: { ...options },\n },\n callbacks\n );\n });\n }\n\n public navigateTo(options: NavigateInfo) {\n this.navigate(options, \"navigateTo\");\n }\n // 根据传入的options参数,执行redirectTo操作\n public redirectTo(options: NavigateInfo) {\n // 调用navigate方法,传入options参数和\"redirectTo\"字符串\n this.navigate(options, \"redirectTo\");\n }\n\n public reLaunch(options: NavigateInfo) {\n // 调用navigate方法,传入options参数和\"reLaunch\"字符串\n this.navigate(options, \"reLaunch\");\n }\n\n public navigateBack(options: navigateBackInfo) {\n // 调用navigate方法,传入options参数和\"navigateBack\"字符串\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查可选参数\n if (options.delta !== undefined && (typeof options.delta !== \"number\" || options.delta <= 0 || !Number.isInteger(options.delta))) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"delta参数格式不正确\"\n );\n }\n\n // 默认值\n options.delta = options.delta ?? 1;\n const callbacks: CallbacksBase = {\n success: (res: any) => {\n const resp: NativeResponse = {\n code: BridgeErrorCode.SUCCESS,\n message: \"跳转成功\",\n data: res,\n };\n options.success?.(resp);\n },\n\n fail: (err: any) => {\n const resp: BridgeError = {\n code: BridgeErrorCode.SYSTEM_ERROR,\n message: \"跳转失败\",\n details: err,\n name: \"\",\n };\n options.fail?.(resp);\n },\n\n complete: () => {\n options.complete?.();\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"navigateBack\",\n params: options,\n },\n callbacks\n );\n });\n }\n\n /**\n * 打开外部链接\n * @param options 链接选项\n * @returns Promise对象,解析为打开链接的响应\n */\n public async openLink(options: OpenLinkOptions): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查必需参数\n if (!options.url) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"缺少必需的参数: url\"\n );\n }\n\n if (typeof options.url !== \"string\" || !options.url.trim()) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"url参数格式错误\"\n );\n }\n\n // 检查可选参数\n if (options.enableShare !== undefined && typeof options.enableShare !== \"boolean\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"enableShare参数格式不正确\"\n );\n }\n\n // 默认值\n options.enableShare = options.enableShare || false;\n const callbacks: CallbacksBase = {\n success: () => {\n resolve();\n },\n fail: (err: any) => {\n reject(\n createBridgeError(\n BridgeErrorCode.SYSTEM_ERROR,\n \"打开链接失败\",\n err\n )\n );\n },\n complete: () => { },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"openLink\",\n params: { ...options },\n },\n callbacks\n );\n });\n });\n }\n\n /**\n * 跳转原生设置页面\n * @param url 要跳转的原生页面URL\n * @returns Promise<void>\n */\n public navigateToNativePage(url: string): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查参数\n if (!url || typeof url !== \"string\" || !url.trim()) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"url参数格式不正确\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: () => {\n resolve();\n },\n fail: (err: any) => {\n reject(\n createBridgeError(\n BridgeErrorCode.SYSTEM_ERROR,\n \"跳转原生页面失败\",\n err\n )\n );\n },\n complete: () => { },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"navigateToNativePage\",\n params: { url },\n },\n callbacks\n );\n });\n });\n }\n\n /**\n * 关闭当前WebView页面\n * @returns Promise<void>\n */\n public closeCurrentPage(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: () => {\n resolve();\n },\n fail: (err: any) => {\n reject(\n createBridgeError(\n BridgeErrorCode.SYSTEM_ERROR,\n \"关闭页面失败\",\n err\n )\n );\n },\n complete: () => { },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"closeCurrentPage\",\n params: {},\n },\n callbacks\n );\n });\n });\n }\n}\n\nexport const navigatePlugin = new NavigatePlugin();\nexport default navigatePlugin;\n","/**\n * 导航插件\n */\nimport {\n BridgePlugin,\n PluginContext,\n CallbacksBase,\n} from \"../core\";\nimport {\n BridgeErrorCode,\n createBridgeError,\n BridgeError,\n} from \"../core/errors\";\n\nexport interface ToastParams {\n /** toast的类型 none, success, fail, exception*/\n type?: \"none\" | \"success\" | \"fail\" | \"exception\";\n /** 提示信息 */\n content: string;\n /** 显示持续时间,单位毫秒,默认2000ms,按系统规范[android只有两种(<=2s >2s)] */\n duration?: number;\n}\n\nexport interface LoadingParams {\n /** 提示信息 */\n content?: string;\n}\n\ndeclare module \"../core\" {\n interface PluginMethods {\n showToast: (options: ToastParams) => Promise<void>;\n hideToast: () => Promise<void>;\n showLoading: (options: LoadingParams) => Promise<void>;\n hideLoading: () => Promise<void>;\n }\n interface NativeBridgeCore extends PluginMethods { }\n}\n\nclass ToastPlugin implements BridgePlugin {\n public readonly name = \"toast\";\n public readonly version = \"1.0.0\";\n private context?: PluginContext;\n\n public install(context: PluginContext): void {\n this.context = context;\n context.bridge.registerMethod(\"showToast\", this.showToast.bind(this));\n context.bridge.registerMethod(\"hideToast\", this.hideToast.bind(this));\n context.bridge.registerMethod(\"showLoading\", this.showLoading.bind(this));\n context.bridge.registerMethod(\"hideLoading\", this.hideLoading.bind(this));\n\n }\n\n public hideLoading(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: (obj: any) => {\n resolve(obj);\n },\n fail: (err: any) => {\n const resp: BridgeError = {\n code: BridgeErrorCode.SYSTEM_ERROR,\n message: \"显示失败\",\n details: err,\n name: \"\",\n };\n reject(resp);\n },\n complete: () => {\n // 完成回调\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"hideLoading\",\n params: {},\n },\n callbacks\n );\n });\n });\n }\n public showLoading(options: LoadingParams): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查content格式\n if (options.content !== undefined && typeof options.content !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"content参数格式不正确\"\n );\n }\n\n\n const callbacks: CallbacksBase = {\n success: (obj: any) => {\n resolve(obj);\n },\n fail: (err: any) => {\n const resp: BridgeError = {\n code: BridgeErrorCode.SYSTEM_ERROR,\n message: \"显示失败\",\n details: err,\n name: \"\",\n };\n reject(resp);\n },\n complete: () => {\n // 完成回调\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"showLoading\",\n params: options,\n },\n callbacks\n );\n });\n });\n }\n /**\n * 显示Toast提示\n *\n * @param options Toast参数\n * @returns Promise<void>\n */\n public showToast(options: ToastParams): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n if ((options.type !== undefined && typeof options.type !== 'string') || (options.type !== undefined && ![\"none\", \"success\", \"fail\", \"exception\"].includes(options.type))) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"type参数格式不正确\"\n );\n }\n\n if (!options.content) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"缺少必需的参数: content\"\n );\n }\n\n if (typeof options.content !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"content参数格式不正确\"\n );\n }\n\n if (options.duration !== undefined && (typeof options.duration !== \"number\" || options.duration <= 0 || !Number.isInteger(options.duration))) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"duration参数格式不正确\"\n );\n }\n\n const { type, content, duration } = options;\n const callbacks: CallbacksBase = {\n success: (obj) => {\n resolve(obj);\n },\n fail: (err: any) => {\n const resp: BridgeError = {\n code: BridgeErrorCode.SYSTEM_ERROR,\n message: \"显示失败\",\n details: err,\n name: \"\",\n };\n reject(resp);\n },\n complete: () => {\n // 完成回调\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"showToast\",\n params: {\n type: type || 'none',\n content,\n duration: duration || 2000,\n },\n },\n callbacks\n );\n });\n });\n }\n\n /**\n * 隐藏Toast提示\n *\n * @returns Promise<void>\n */\n public hideToast(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: (obj: any) => {\n resolve(obj);\n },\n fail: (err: any) => {\n const resp: BridgeError = {\n code: BridgeErrorCode.SYSTEM_ERROR,\n message: \"显示失败\",\n details: err,\n name: \"\",\n };\n reject(resp);\n },\n complete: () => {\n // 完成回调\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"hideToast\",\n params: {},\n },\n callbacks\n );\n });\n });\n }\n}\n\nexport const toastPlugin = new ToastPlugin();\nexport default toastPlugin;\n","/**\n * 导航插件\n */\nimport {\n\tBridgePlugin,\n\tPluginContext,\n\tCallbacksBase,\n} from \"../core\";\nimport {\n\tBridgeErrorCode,\n\tcreateBridgeError,\n\tBridgeError,\n} from \"../core/errors\";\n\nexport interface ToastParams {\n\t/** toast的类型 none, success, fail, exception*/\n\ttype: \"none\" | \"success\" | \"fail\" | \"exception\";\n\t/** 提示信息 */\n\tcontent: string;\n\t/** 显示持续2000ms时间,单位秒,默认按系统规范[android只有两种(<=2s >2s)] */\n\tduration?: number;\n}\n\nexport interface LoadingParams {\n\t/** 提示信息 */\n\tcontent?: string;\n}\n\ndeclare module \"../core\" {\n\tinterface PluginMethods {\n getUserInfo: () => Promise<any>;\n }\n\tinterface NativeBridgeCore extends PluginMethods {}\n}\n\nclass UserInfoPlugin implements BridgePlugin {\n public readonly name = \"UserInfo\";\n public readonly version = \"1.0.0\";\n private context?: PluginContext;\n\n public install(context: PluginContext): void {\n this.context = context;\n context.bridge.registerMethod(\"getUserInfo\", this.getUserInfo.bind(this));\n\n }\n\n public getUserInfo(): Promise<any> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: (data: any) => {\n resolve(data);\n },\n fail: (err: any) => {\n const resp: BridgeError = {\n code: BridgeErrorCode.SYSTEM_ERROR,\n message: \"显示失败\",\n details: err,\n name: \"\",\n };\n reject(resp);\n },\n complete: () => {\n // 完成回调\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"getUserInfo\",\n params: {},\n },\n callbacks\n );\n });\n });\n }\n}\n\nexport const userinfoPlugin = new UserInfoPlugin();\nexport default userinfoPlugin;\n","/**\n * @fileoverview 蓝牙插件\n * @description\n * 提供蓝牙相关功能的插件,支持设备扫描、连接、数据传输等功能\n * @module plugins/bluetooth\n * @version 1.0.0\n * 提供设备相关信息和功能\n */\n\nimport { BridgePlugin, PluginContext, CallbacksBase } from \"../core\";\nimport { BridgeErrorCode, createBridgeError } from \"../core/errors\";\n\nexport interface OpenBluetoothOptions extends CallbacksBase {\n /**不传的话默认是true,表示是否在离开当前页面时自动断开蓝牙(仅对android有效)。 */\n autoClose?: boolean;\n}\n\nexport interface CloseBluetoothOptions extends CallbacksBase {}\nexport interface OpenBluetoothResponse {\n /** 是否支持BLE蓝牙 */\n isSupportBLE?: number;\n}\nexport interface StartBluetoothDevicesDiscoveryOptions extends CallbacksBase {\n allowDuplicatesKey?: boolean; // 是否允许重复上报同一设备\n interval?: number; // 上报设备的间隔,默认为0,意思是找到新设备立即上报,否则根据传入的间隔上报\n services?: string[]; //蓝牙设备主 service 的 uuid 列表。\n}\n\nexport interface BLEDeviceOptions extends CallbacksBase {\n deviceId: string; // 设备ID\n}\nexport interface GetBLEDeviceOptions extends CallbacksBase {\n success?: (data: BLEDeviceResponse) => void; // 覆盖基础类型,指定具体返回类型\n /**\n\t * Android 上为设备 MAC 地址。\n\t\tiOS 上为设备 UUID。 \n\t\t*/\n deviceId: string;\n serviceId: string; // 蓝牙特征值对应 service 的 UUID。\n}\n\nexport interface BLEDeviceResponse {\n /** 设备特征值列表 */\n characteristics: Characteristic[]; // 设备特征值列表\n}\n\nexport interface Characteristic {\n // 特征ID\n characteristicId: string;\n // 服务ID\n serviceId: string;\n // 值\n value: string;\n // 属性\n properties: Properties;\n}\n\nexport interface Properties {\n read: boolean;\n write: boolean;\n notify: boolean;\n indicate: boolean;\n}\nexport interface BLEDeviceServicesOptions extends CallbacksBase {\n success?: (data: BLEDeviceServicesResponse) => void;\n deviceId: string; // 设备ID\n}\n\nexport interface BLEDeviceServicesResponse {\n services: Services[];\n}\n\nexport interface Services {\n // String\t蓝牙设备服务的 uuid。\n serviceId: string;\n // 该服务是否为主服务。\n isPrimary: string;\n}\n\n\nexport interface WriteBLECharacteristicValueOptions extends CallbacksBase {\n deviceId: string; // 设备ID\n serviceId: string; // 蓝牙特征值对应 service 的 UUID。\n characteristicId: string; // 蓝牙特征值的 ID。\n value: string; // 要写入的值,必须是 16进制字符串。\n}\n\nexport interface ReadBLECharacteristicValueOptions extends CallbacksBase {\n\tsuccess?: (data: ReadBLECharacteristicValueResponse) => void; // 覆盖基础类型,指定具体返回类型\n\tdeviceId: string; // 设备ID\n\tserviceId: string; // 蓝牙特征值对应 service 的 UUID。\n\tcharacteristicId: string; // 蓝牙特征值的 ID。\n}\n\nexport interface ReadBLECharacteristicValueResponse {\n /** 设备特征值列表 */\n characteristicId?: string;\n serviceId?: string;\n value?: string;\n}\n\ndeclare module \"../core\" {\n interface PluginMethods {\n //经典蓝牙:---------------------------------------------------------------\n openBluetoothAdapter: (options?: OpenBluetoothOptions) => void; // 打开蓝牙适配器\n closeBluetoothAdapter: (options?: CloseBluetoothOptions) => void; // 关闭蓝牙适配器\n startBluetoothDevicesDiscovery: (\n options?: StartBluetoothDevicesDiscoveryOptions\n ) => void; // 开始搜索附近的蓝牙设备\n stopBluetoothDevicesDiscovery: (options?: CallbacksBase) => void; // 停止搜索附近的蓝牙设备\n onBluetoothDeviceFound: (callback: (devices: any[]) => void) => void; // 监听寻找到新设备的事件\n offBluetoothDeviceFound: () => void; // 取消监听寻找到新设备的事件\n //BLE蓝牙:---------------------------------------------------------------\n connectBLEDevice: (options: BLEDeviceOptions) => void; // 连接低功耗蓝牙设备\n disconnectBLEDevice: (options: BLEDeviceOptions) => void; // 断开与低功耗蓝牙设备的连接\n getBLEDeviceCharacteristics: (options: GetBLEDeviceOptions) => void; // 获取低功耗蓝牙设备的特征值\n getBLEDeviceServices: (options: BLEDeviceServicesOptions) => void; // 获取低功耗蓝牙设备的服务\n writeBLECharacteristicValue: (\n options: WriteBLECharacteristicValueOptions\n ) => void; // 向低功耗蓝牙设备写入特征值\n readBLECharacteristicValue: (\n options: ReadBLECharacteristicValueOptions\n ) => void; // 读取低功耗蓝牙设备的特征值\n onBLECharacteristicValueChange: (\n callback: (data: {\n serviceId: string;\n characteristicId: string;\n deviceId: string;\n\t\t\t\tvalue: string;\n }) => void\n ) => void; // 监听低功耗蓝牙设备的特征值变化事件\n offBLECharacteristicValueChange: () => void; // 取消监听低功耗蓝牙设备的特征值变化事件\n onBLEConnectionStateChanged: (\n callback: (data: { deviceId: string; connected: boolean }) => void\n ) => void; // 监听低功耗蓝牙设备的连接状态变化事件\n offBLEConnectionStateChanged: () => void; // 取消监听低功耗蓝牙设备的连接状态变化事件\n }\n interface NativeBridgeCore extends PluginMethods {}\n}\n\nclass BluetoothPlugin implements BridgePlugin {\n public readonly name = \"bluetooth\";\n public readonly version = \"1.0.0\";\n private context?: PluginContext;\n\n public install(context: PluginContext): void {\n this.context = context;\n //经典蓝牙:---------------------------------------------------------------\n context.bridge.registerMethod(\n \"openBluetoothAdapter\",\n this.openBluetoothAdapter.bind(this)\n );\n context.bridge.registerMethod(\n \"closeBluetoothAdapter\",\n this.closeBluetoothAdapter.bind(this)\n );\n context.bridge.registerMethod(\n \"startBluetoothDevicesDiscovery\",\n this.startBluetoothDevicesDiscovery.bind(this)\n );\n context.bridge.registerMethod(\n \"stopBluetoothDevicesDiscovery\",\n this.stopBluetoothDevicesDiscovery.bind(this)\n );\n context.bridge.registerMethod(\n \"onBluetoothDeviceFound\",\n this.onBluetoothDeviceFound.bind(this)\n );\n\t\tcontext.bridge.registerMethod(\n\t\t\t\"offBluetoothDeviceFound\",\n\t\t\tthis.offBluetoothDeviceFound.bind(this)\n\t\t);\n //BLE蓝牙:---------------------------------------------------------------\n\n context.bridge.registerMethod(\n \"writeBLECharacteristicValue\",\n this.writeBLECharacteristicValue.bind(this)\n );\n context.bridge.registerMethod(\n \"readBLECharacteristicValue\",\n this.readBLECharacteristicValue.bind(this)\n );\n\n context.bridge.registerMethod(\n \"connectBLEDevice\",\n this.connectBLEDevice.bind(this)\n );\n context.bridge.registerMethod(\n \"disconnectBLEDevice\",\n this.disconnectBLEDevice.bind(this)\n );\n context.bridge.registerMethod(\n \"getBLEDeviceCharacteristics\",\n this.getBLEDeviceCharacteristics.bind(this)\n );\n context.bridge.registerMethod(\n \"getBLEDeviceServices\",\n this.getBLEDeviceServices.bind(this)\n );\n\n context.bridge.registerMethod(\n \"onBLECharacteristicValueChange\",\n this.onBLECharacteristicValueChange.bind(this)\n );\n\n context.bridge.registerMethod(\n \"offBLECharacteristicValueChange\",\n this.offBLECharacteristicValueChange.bind(this)\n );\n context.bridge.registerMethod(\n \"onBLEConnectionStateChanged\",\n this.onBLEConnectionStateChanged.bind(this)\n );\n context.bridge.registerMethod(\n \"offBLEConnectionStateChanged\",\n this.offBLEConnectionStateChanged.bind(this)\n );\n }\n //BLE蓝牙:---------------------------------------------------------------\n\n /**\n * 取消监听蓝牙低功耗连接状态变化事件\n * \n * @description 该方法用于移除之前注册的蓝牙低功耗连接状态变化监听器。\n * 当不再需要监听连接状态变化时,应调用此方法以避免内存泄漏。\n * \n * @param callback - 可选的回调函数,当成功取消监听后会被调用\n * @returns void\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出错误\n * \n * @example\n */\n public offBLEConnectionStateChanged(callback?: () => void): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n this.context.bridge.ready(() => {\n this.context?.bridge.offNativeEvent(\n \"offBLEConnectionStateChanged\",\n () => {\n callback && callback();\n }\n );\n });\n }\n\n /**\n * 监听BLE设备连接状态变化\n * \n * @description 注册一个回调函数来监听蓝牙低功耗(BLE)设备的连接状态变化事件。\n * 当设备连接或断开时,会触发相应的回调函数。\n * \n * @param callback - 连接状态变化时的回调函数\n * @param callback.data - 回调函数的参数对象\n * @param callback.data.deviceId - 设备ID,用于标识具体的BLE设备\n * @param callback.data.connected - 连接状态,true表示已连接,false表示已断开\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出错误\n * \n * @example\n * \n * @since 1.0.0\n */\n public onBLEConnectionStateChanged(\n callback: (data: {\n\t\t\tdeviceId: string;\n\t\t\tconnected: boolean;\n }) => void\n ): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n this.context.bridge.ready(() => {\n this.context?.bridge.onNativeEvent(\n \"onBLEConnectionStateChanged\",\n (event: { type: string; data: any }) => {\n callback(event.data);\n }\n );\n });\n }\n\n /**\n * 取消监听低功耗蓝牙设备的特征值变化事件\n * \n * @description 此方法用于移除之前通过onBLECharacteristicValueChange注册的事件监听器。\n * 当不再需要监听BLE特征值变化时,应调用此方法以避免内存泄漏和不必要的回调执行。\n * \n * @param {Function} [callback] - 可选的回调函数,在成功取消监听后执行\n * @returns {void} 无返回值\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出错误\n * \n * @example\n */\n public offBLECharacteristicValueChange(callback?: () => void): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n this.context.bridge.ready(() => {\n this.context?.bridge.offNativeEvent(\n \"onBLECharacteristicValueChange\",\n () => {\n callback && callback();\n }\n );\n });\n }\n\n /**\n * 监听 BLE 特征值变化事件\n * \n * 当蓝牙低功耗设备的特征值发生变化时,会触发此回调函数。\n * 在调用此方法前,需要确保插件已正确初始化。\n * \n * @param callback - 特征值变化时的回调函数\n * @param callback.data - 特征值变化的数据对象\n * @param callback.data.serviceId - 服务 ID,标识 BLE 服务\n * @param callback.data.characteristicId - 特征 ID,标识 BLE 特征\n * @param callback.data.deviceId - 设备 ID,标识 BLE 设备\n * @param callback.data.value - 特征值,变化后的特征值内容\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出错误\n * \n * @example\n */\n public onBLECharacteristicValueChange(\n callback: (data: {\n serviceId: string;\n characteristicId: string;\n deviceId: string;\n value: string;\n }) => void\n ): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n this.context.bridge.ready(() => {\n this.context?.bridge.onNativeEvent(\n \"onBLECharacteristicValueChange\",\n (event: { type: string; data: any }) => {\n callback(event.data);\n }\n );\n });\n }\n\n /**\n * 读取低功耗蓝牙设备特征值\n * \n * @description 从指定的蓝牙设备特征值中读取数据。该方法需要在插件正确初始化后才能使用。\n * \n * @param {ReadBLECharacteristicValueOptions} options - 读取BLE特征值的配置选项\n * @param {string} options.deviceId - 蓝牙设备ID\n * @param {string} options.serviceId - 蓝牙服务ID\n * @param {string} options.characteristicId - 蓝牙特征值ID\n * @param {function} [options.success] - 成功回调函数,参数为读取到的特征值数据\n * @param {function} [options.fail] - 失败回调函数\n * @param {function} [options.complete] - 完成回调函数(无论成功或失败都会执行)\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出错误\n * \n * @returns {void} 无返回值\n * \n * @example\n */\n public readBLECharacteristicValue(\n options: ReadBLECharacteristicValueOptions\n ): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n // 必填值判断\n if (!options.deviceId || !options.serviceId || !options.characteristicId) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"缺少必需的参数\"\n );\n }\n const callbacks: CallbacksBase = {\n success: (data: any) => {\n options.success?.(data);\n },\n fail: options.fail,\n complete: options.complete,\n };\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"readBLECharacteristicValue\",\n params: options,\n },\n callbacks\n );\n });\n }\n\n /**\n * 向低功耗蓝牙设备特征值中写入数据\n * \n * @param options - 写入BLE特征值的配置选项\n * @param options.deviceId - 蓝牙设备 id\n * @param options.serviceId - 蓝牙特征值对应服务的 uuid\n * @param options.characteristicId - 蓝牙特征值的 uuid\n * @param options.value - 蓝牙设备特征值对应的二进制值\n * @param options.success - 接口调用成功的回调函数\n * @param options.fail - 接口调用失败的回调函数\n * @param options.complete - 接口调用结束的回调函数(调用成功、失败都会执行)\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出错误\n * \n * @example\n */\n public writeBLECharacteristicValue(\n options: WriteBLECharacteristicValueOptions\n ): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n if (!options.deviceId || !options.serviceId || !options.characteristicId || !options.value) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"缺少必需的参数\"\n );\n }\n\n if (typeof options.deviceId !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.JSON_ERROR,\n \"deviceId参数格式错误\"\n );\n }\n\n if (typeof options.serviceId !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.JSON_ERROR,\n \"serviceId参数格式错误\"\n );\n }\n\n if (typeof options.characteristicId !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.JSON_ERROR,\n \"characteristicId参数格式错误\"\n );\n }\n\n if (\n typeof options.value !== \"string\" ||\n !/^[0-9A-Fa-f]+$/.test(options.value) ||\n options.value?.length > 200\n ) {\n throw createBridgeError(\n BridgeErrorCode.JSON_ERROR,\n \"value参数格式错误\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: options.success,\n fail: options.fail,\n complete: options.complete,\n };\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"writeBLECharacteristicValue\",\n params: options,\n },\n callbacks\n );\n });\n }\n\n /**\n * 获取蓝牙低功耗设备的所有服务\n * \n * @description 该方法用于获取已连接的BLE设备的所有可用服务列表。\n * 调用前需要确保设备已经成功连接,否则可能获取失败。\n * \n * @param {BLEDeviceServicesOptions} options - 获取BLE设备服务的配置选项\n * @param {string} options.deviceId - 蓝牙设备标识符,用于指定要获取服务的设备\n * @param {function} [options.success] - 成功回调函数,参数为BLEDeviceServicesResponse类型\n * @param {function} [options.fail] - 失败回调函数,参数为错误信息\n * @param {function} [options.complete] - 完成回调函数,无论成功失败都会调用\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出PLUGIN_NOT_INITIALIZED错误\n * \n * @returns {void} 无返回值,结果通过回调函数返回\n * \n * @example\n */\n public getBLEDeviceServices(options: BLEDeviceServicesOptions): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 必填值判断\n if (!options.deviceId) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"缺少必需的参数: deviceId\"\n );\n }\n\n // 校验参数\n if (typeof options.deviceId !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.JSON_ERROR,\n \"deviceId参数格式错误\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: (data: any) => {\n options.success?.(data);\n },\n fail: options.fail,\n complete: options.complete,\n };\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"getBLEDeviceServices\",\n params: options,\n },\n callbacks\n );\n });\n }\n\n /**\n * 连接蓝牙低功耗设备\n * \n * @description 此方法用于连接指定的蓝牙低功耗(BLE)设备。在调用前需要确保插件已正确初始化,\n * 否则会抛出插件未初始化的错误。连接过程是异步的,通过回调函数返回结果。\n * \n * @param {BLEDeviceOptions} options - 连接BLE设备的配置选项\n * @param {Function} [options.success] - 连接成功时的回调函数\n * @param {Function} [options.fail] - 连接失败时的回调函数 \n * @param {Function} [options.complete] - 连接完成时的回调函数(无论成功或失败都会执行)\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出 PLUGIN_NOT_INITIALIZED 错误\n * \n * @returns {void} 无返回值\n * \n * @example\n */\n public connectBLEDevice(options: BLEDeviceOptions): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 必填值判断\n if (!options.deviceId) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"缺少必需的参数: deviceId\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: options.success,\n fail: options.fail,\n complete: options.complete,\n };\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"connectBLEDevice\",\n params: options,\n },\n callbacks\n );\n });\n }\n\n /**\n * 断开蓝牙低功耗设备连接\n * \n * @description 断开与指定蓝牙低功耗设备的连接。此方法会调用原生平台的蓝牙断连功能。\n * \n * @param {BLEDeviceOptions} options - 断开连接的配置选项\n * @param {Function} [options.success] - 成功回调函数\n * @param {Function} [options.fail] - 失败回调函数 \n * @param {Function} [options.complete] - 完成回调函数(无论成功或失败都会执行)\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出错误\n * \n * @returns {void}\n * \n * @example\n */\n public disconnectBLEDevice(options: BLEDeviceOptions): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 必填值判断\n if (!options.deviceId) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"缺少必需的参数: deviceId\"\n );\n }\n\n if (typeof options.deviceId !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.JSON_ERROR,\n \"deviceId参数格式错误\"\n );\n\n }\n\n const callbacks: CallbacksBase = {\n success: options.success,\n fail: options.fail,\n complete: options.complete,\n };\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"disconnectBLEDevice\",\n params: options,\n },\n callbacks\n );\n });\n }\n /**\n * 获取蓝牙低功耗设备的特征值列表\n * \n * @description 用于获取指定蓝牙低功耗设备的所有特征值信息,包括特征值的UUID、属性等。\n * 该方法需要在蓝牙设备连接成功后调用。\n * \n * @param {GetBLEDeviceOptions} options - 获取设备特征值的配置选项\n * @param {string} options.deviceId - 蓝牙设备ID\n * @param {string} options.serviceId - 蓝牙服务UUID\n * @param {function} [options.success] - 成功回调函数,返回特征值列表数据\n * @param {function} [options.fail] - 失败回调函数\n * @param {function} [options.complete] - 完成回调函数(无论成功或失败都会执行)\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出错误\n * \n * @example\n * \n * @since 1.0.0\n */\n public getBLEDeviceCharacteristics(options: GetBLEDeviceOptions): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 必填值判断\n if (!options.deviceId || !options.serviceId) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"缺少必需的参数: deviceId 或 serviceId\"\n );\n }\n\n if (typeof options.deviceId !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.JSON_ERROR,\n \"deviceId参数格式错误\"\n );\n }\n\n if (typeof options.serviceId !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.JSON_ERROR,\n \"serviceId参数格式错误\"\n );\n\n }\n\n const callbacks: CallbacksBase = {\n success: (data: any) => {\n options.success?.(data);\n },\n fail: (err)=>{\n\t\t\t\toptions.fail?.(err);\n\t\t\t},\n complete: options.complete,\n };\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"getBLEDeviceCharacteristics\",\n params: options,\n },\n callbacks\n );\n });\n }\n\n //经典蓝牙:---------------------------------------------------------------\n\n /**\n * 取消监听蓝牙设备发现事件\n * \n * @description 移除对蓝牙设备发现事件的监听,当不再需要接收蓝牙设备发现通知时调用此方法\n * \n * @param callback - 可选的回调函数,在成功取消监听后执行\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出错误\n * \n * @example\n * \n * @returns {void} 无返回值\n */\n public offBluetoothDeviceFound(callback?: () => void): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n this.context.bridge.ready(() => {\n this.context?.bridge.offNativeEvent(\"offBluetoothDeviceFound\", () => {\n callback && callback();\n });\n });\n }\n\n /**\n * 监听蓝牙设备发现事件\n * \n * 当发现新的蓝牙设备时,会触发回调函数并传入设备列表。\n * 该方法需要在插件正确初始化后调用,否则会抛出异常。\n * \n * @param callback - 设备发现回调函数\n * @param callback.devices - 发现的蓝牙设备列表\n * @throws {BridgeError} 当插件未正确初始化时抛出 PLUGIN_NOT_INITIALIZED 错误\n * \n * @example\n */\n public onBluetoothDeviceFound(callback: (devices: any[]) => void): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n this.context.bridge.ready(() => {\n this.context?.bridge.onNativeEvent(\n \"onBluetoothDeviceFound\",\n (event: { type: string; data: any }) => {\n callback(event.data ? JSON.parse(event.data) : []);\n }\n );\n });\n }\n\n /**\n * 停止搜索蓝牙设备\n * \n * @description 停止搜索附近的蓝牙外围设备。若已经找到需要连接的蓝牙设备并不需要继续搜索时,建议调用该接口停止蓝牙搜索。\n * \n * @param options - 可选的回调函数配置对象\n * @param options.success - 接口调用成功的回调函数\n * @param options.fail - 接口调用失败的回调函数 \n * @param options.complete - 接口调用结束的回调函数(调用成功、失败都会执行)\n * \n * @throws {BridgeError} 当插件未正确初始化时抛出异常\n * \n * @example\n */\n public stopBluetoothDevicesDiscovery(options?: CallbacksBase): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: options?.success,\n fail: options?.fail,\n complete: options?.complete,\n };\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"stopBluetoothDevicesDiscovery\",\n params: options,\n },\n callbacks\n );\n });\n }\n\n /**\n * 开启蓝牙适配器\n *\n * @description 开启本机蓝牙适配器模块,允许设备进行蓝牙操作。调用该方法前需要确保插件已正确初始化。\n *\n * @param {OpenBluetoothOptions} [options={}] - 开启蓝牙适配器的配置选项\n * @param {Function} [options.success] - 接口调用成功的回调函数\n * @param {Function} [options.fail] - 接口调用失败的回调函数\n * @param {Function} [options.complete] - 接口调用结束的回调函数(调用成功、失败都会执行)\n *\n * @throws {BridgeError} 当插件未正确初始化时抛出错误\n *\n * @returns {void}\n *\n * @example\n */\n public startBluetoothDevicesDiscovery(\n options: StartBluetoothDevicesDiscoveryOptions = {}\n ): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 校验参数\n if (\n options.services !== undefined &&\n !Array.isArray(options.services) &&\n typeof options.services !== \"string\"\n ) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"services参数格式不正确\"\n );\n }\n\n if (options.allowDuplicatesKey !== undefined && typeof options.allowDuplicatesKey !== \"boolean\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"allowDuplicatesKey参数格式不正确\"\n );\n }\n\n if (options.interval !== undefined && (typeof options.interval !== \"number\" || !Number.isInteger(options.interval))) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"interval参数格式不正确\"\n );\n }\n\n // 设置默认值\n options.interval = options?.interval || 0;\n const callbacks: CallbacksBase = {\n success: options?.success,\n fail: options?.fail,\n complete: options?.complete,\n };\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"startBluetoothDevicesDiscovery\",\n params: options,\n },\n callbacks\n );\n });\n }\n /**\n * 关闭蓝牙适配器\n *\n * @description 关闭本机蓝牙适配器模块,断开所有已建立的连接。调用该方法将会断开所有蓝牙连接,\n * 释放系统资源。建议在不需要使用蓝牙功能时及时调用此方法。\n *\n * @param {CloseBluetoothOptions} [options={}] - 关闭蓝牙适配器的配置选项\n * @param {Function} [options.success] - 接口调用成功的回调函数\n * @param {Function} [options.fail] - 接口调用失败的回调函数\n * @param {Function} [options.complete] - 接口调用结束的回调函数(调用成功、失败都会执行)\n *\n * @throws {BridgeError} 当插件未正确初始化时抛出错误\n *\n * @returns {void}\n *\n * @example\n */\n public closeBluetoothAdapter(options: CloseBluetoothOptions = {}): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: options.success,\n fail: options.fail,\n complete: options.complete,\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"closeBluetoothAdapter\",\n params: options,\n },\n callbacks\n );\n });\n }\n /**\n * 开启蓝牙功能\n *\n * 此方法用于启用设备的蓝牙功能。调用前需要确保插件已正确初始化,\n * 否则会抛出相应的错误。方法会通过桥接器调用原生蓝牙开启功能。\n *\n * @param options - 开启蓝牙的配置选项\n * @param options.success - 成功回调函数,当蓝牙成功开启时调用\n * @param options.fail - 失败回调函数,当蓝牙开启失败时调用\n * @param options.complete - 完成回调函数,无论成功或失败都会调用\n *\n * @throws {BridgeError} 当插件未正确初始化时抛出 PLUGIN_NOT_INITIALIZED 错误\n *\n * @returns {void} 无返回值\n *\n * @example\n */\n public openBluetoothAdapter(options: OpenBluetoothOptions = {}): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 校验参数\n if (options.autoClose !== undefined && typeof options.autoClose !== \"boolean\") {\n throw createBridgeError(\n BridgeErrorCode.JSON_ERROR,\n \"autoClose参数格式不正确\"\n );\n }\n\n // 设置默认值\n options.autoClose = options.autoClose ?? true;\n const callbacks: CallbacksBase = {\n success: options.success,\n fail: options.fail,\n complete: options.complete,\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"openBluetoothAdapter\",\n params: options,\n },\n callbacks\n );\n });\n }\n\n /**\n * 搜索到新蓝牙时触发\n * 当发现新的蓝牙设备时,会触发回调函数并传入设备列表。\n * 该方法需要在插件正确初始化后调用,否则会抛出异常。\n * @param callback - 新蓝牙搜索到时触发的回调函数\n * @param callback.devices - 发现的蓝牙设备列表\n * @throws {BridgeError} 当插件未正确初始化时抛出 PLUGIN_NOT_INITIALIZED 错误\n */\n public getBluetoothDevices(callback: (devices: any[]) => void): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n this.context.bridge.ready(() => {\n this.context?.bridge.onNativeEvent(\n \"getBluetoothDevices\",\n (event: { type: string; data: any }) => {\n callback(event.data);\n }\n );\n });\n }\n}\nexport const bluetooth = new BluetoothPlugin();\nexport default bluetooth;\n","/**\n * 本地存储 jsBridge 插件\n * @module plugins/storage\n * @version 1.0.0\n * @description 提供本地存储功能的插件,支持设置、获取和删除存储数据\n */\nimport {\n BridgePlugin,\n PluginContext,\n CallbacksBase,\n} from \"../core\";\nimport { BridgeErrorCode, createBridgeError } from \"../core/errors\";\n\nexport interface SetStorageOptions extends CallbacksBase {\n key: string; // 存储数据的 key\n data: Record<string, any> | string; // 存储的数据\n}\nexport interface GetStorageOptions extends CallbacksBase {\n key: string; // 要获取的存储数据的 key\n}\nexport interface RemoveStorageOptions extends CallbacksBase {\n key: string; // 要删除的存储数据的 key\n}\n\nexport interface StorageResponse {\n data?: Record<string, any> | string; // 获取到的数据\n}\n\ndeclare module \"../core\" {\n interface PluginMethods {\n setStorage: (options: SetStorageOptions) => Promise<string>;\n setStorageSync: (options: SetStorageOptions) => any;\n getStorage: (options: GetStorageOptions) => Promise<string>;\n getStorageSync: (options: GetStorageOptions) => any;\n removeStorage: (options: RemoveStorageOptions) => Promise<string>;\n }\n interface NativeBridgeCore extends PluginMethods { }\n}\n\nclass StoragePlugin implements BridgePlugin {\n private context?: PluginContext;\n public readonly name = \"storage\";\n public readonly version = \"1.0.0\";\n public install(context: PluginContext): void {\n this.context = context;\n context.bridge.registerMethod(\"setStorage\", this.setStorage.bind(this));\n context.bridge.registerMethod(\"setStorageSync\", this.setStorageSync.bind(this));\n context.bridge.registerMethod(\"getStorage\", this.getStorage.bind(this));\n context.bridge.registerMethod(\"getStorageSync\", this.getStorageSync.bind(this));\n context.bridge.registerMethod(\"removeStorage\", this.removeStorage.bind(this));\n }\n\n private _createCallbacks(options: CallbacksBase): CallbacksBase {\n return {\n success: options.success,\n fail: options.fail,\n complete: options.complete,\n };\n }\n\n private async _callNativeMethod(\n action: string,\n params: any,\n callbacks: CallbacksBase\n ): Promise<string> {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n return new Promise((resolve, reject) => {\n this.context?.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action,\n params\n },\n {\n ...callbacks,\n success: (response: string) => {\n if (callbacks.success) {\n // 如果有 success 回调,调用它\n callbacks.success(response);\n }\n resolve(response);\n },\n fail: (error: any) => {\n if (callbacks.fail) {\n callbacks.fail(error);\n }\n reject(error);\n }\n }\n );\n });\n });\n }\n\n /**\n * 同步设置存储数据\n * @param options 存储选项,包含键值和数据\n * @returns 存储响应\n * @throws 如果未提供key,则抛出错误\n */\n public setStorageSync(\n options: SetStorageOptions\n ): void {\n\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查必需参数\n const key = options.key;\n if (!key) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, '缺少必需的参数: key');\n }\n\n if (!options.data) {\n throw createBridgeError(BridgeErrorCode.INVALID_ACTION, \"缺少必需的参数: data\");\n }\n\n // 检查数据类型\n if (typeof key !== \"string\") {\n throw createBridgeError(BridgeErrorCode.INVALID_ACTION, \"key参数格式不正确\");\n }\n\n if (typeof options.data !== \"object\" && typeof options.data !== \"string\") {\n throw createBridgeError(BridgeErrorCode.INVALID_ACTION, \"data参数格式不正确\");\n }\n\n if (typeof options.data === 'object' && Object.keys(options.data).length === 0) {\n throw createBridgeError(BridgeErrorCode.INVALID_ACTION, \"data参数格式不正确\");\n }\n\n\n\n const callbacks = this._createCallbacks(options);\n this.context?.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: 'setStorageSync',\n params: options\n },\n callbacks,\n );\n });\n }\n\n public async setStorage(\n options: SetStorageOptions\n ): Promise<string> {\n\n // 检查必需参数\n const key = options.key;\n if (!key) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, '缺少必需的参数: key');\n }\n\n if (!options.data) {\n throw createBridgeError(BridgeErrorCode.INVALID_ACTION, '缺少必需的参数: data');\n }\n\n // 检查数据类型\n if (typeof key !== \"string\") {\n throw createBridgeError(BridgeErrorCode.INVALID_ACTION, \"key参数格式不正确\");\n }\n\n if (typeof options.data !== \"object\" && typeof options.data !== \"string\") {\n throw createBridgeError(BridgeErrorCode.INVALID_ACTION, \"data参数格式不正确\");\n }\n\n if (typeof options.data === 'object' && Object.keys(options.data).length === 0) {\n throw createBridgeError(BridgeErrorCode.INVALID_ACTION, \"data参数格式不正确\");\n }\n\n const callbacks = this._createCallbacks(options);\n return this._callNativeMethod(\"setStorage\", { key: options.key, data: options.data }, callbacks);\n }\n\n public getStorageSync(\n options: GetStorageOptions\n ): any {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n const key = options.key;\n\n if (!key) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, '缺少必需的参数: key');\n }\n\n if (typeof key !== \"string\") {\n throw createBridgeError(BridgeErrorCode.INVALID_ACTION, \"key参数格式不正确\");\n }\n\n const callbacks = this._createCallbacks(options);\n return this.context?.bridge.callNativeSync('getStorageSync', options, callbacks)\n }\n\n public async getStorage(\n options: GetStorageOptions\n ): Promise<string> {\n const key = options.key;\n if (!key) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, '缺少必需的参数: key');\n }\n if (typeof key !== \"string\") {\n throw createBridgeError(BridgeErrorCode.INVALID_ACTION, \"key参数格式不正确\");\n }\n const callbacks = this._createCallbacks(options);\n return this._callNativeMethod(\"getStorage\", { key: options.key }, callbacks);\n }\n\n /**\n * 移除指定的存储数据(异步)\n * @param options 存储选项,包含键值\n * @returns 存储响应\n */\n public async removeStorage(options: RemoveStorageOptions): Promise<string> {\n const key = options.key;\n if (!key) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, '缺少必需的参数: key');\n }\n if (typeof key !== \"string\") {\n throw createBridgeError(BridgeErrorCode.INVALID_ACTION, \"key参数格式不正确\");\n }\n const callbacks = this._createCallbacks(options);\n return this._callNativeMethod(\"removeStorage\", { key }, callbacks);\n }\n}\n\nexport default new StoragePlugin();\n","/**\n * 实人认证 + 人脸解锁 jsBridge\n * @module plugins/authentication\n * @version 1.0.0\n * @description 提供实人认证和人脸解锁功能的插件,支持调用原生认证API\n */\n\nimport {\n BridgePlugin,\n PluginContext,\n CallbacksBase,\n} from \"../core\";\nimport { BridgeErrorCode, createBridgeError } from \"../core/errors\";\n\n// 定义认证结果类型\nexport interface AuthenticationResult {\n photoStatus: number; // 1成功, 0 失败\n}\n\ndeclare module \"../core\" {\n interface PluginMethods {\n exclusiveLiveCheck: (options?: CallbacksBase) => Promise<AuthenticationResult>;\n }\n interface NativeBridgeCore extends PluginMethods {}\n}\n\nclass AuthenticationPlugin implements BridgePlugin {\n private context?: PluginContext;\n public readonly name = \"authentication\";\n public readonly version = \"1.0.0\";\n\n public install(context: PluginContext): void {\n this.context = context;\n // 在桥接对象上挂载方法\n context.bridge.registerMethod(\n \"exclusiveLiveCheck\",\n this.exclusiveLiveCheck.bind(this)\n );\n }\n\n /**\n * 执行实人认证\n * @param options - 认证选项,包含成功、失败和完成的回调函数\n * @property options.success - 认证成功时的回调函数,接收认证结果\n * @property options.fail - 认证失败时的回调函数,接收错误信息\n * @property options.complete - 认证完成时的回调函数(无论成功或失败)\n * @returns Promise<AuthenticationResult> - 返回认证结果的Promise对象\n * @throws {BridgeError} - 如果插件未正确初始化,抛出BridgeError异常\n */\n public exclusiveLiveCheck(\n options: CallbacksBase = {}\n ): Promise<AuthenticationResult> {\n return new Promise((resolve, reject) => {\n // 检查插件是否已初始化\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 封装回调函数,处理认证结果\n const callbacks: CallbacksBase = {\n success: (res) => {\n resolve(res);\n },\n fail: (err: any) => {\n reject(err);\n },\n complete: options.complete,\n };\n\n // 调用原生桥接方法执行实人认证\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"exclusiveLiveCheck\",\n params: {},\n },\n callbacks\n );\n });\n });\n }\n}\n\nexport default new AuthenticationPlugin();\n","/**\n * 网络请求 jsBridge 插件\n * @module plugins/request\n * @version 1.0.0\n * @description 提供网络请求功能的插件,支持 GET 和 POST 请求\n */\n\n\nimport {\n BridgePlugin,\n PluginContext,\n CallbacksBase,\n} from \"../core\";\n\nimport { BridgeErrorCode, createBridgeError } from \"../core/errors\";\n\n// 定义请求选项接口\nexport interface RequestOptions extends CallbacksBase {\n url: string; // 目标服务器url\n method?: \"GET\" | \"POST\"; // 请求方法,默认为 GET\n headers?: Record<string, string>; // 设置请求的 HTTP 头,默认 {'Content-Type': 'application/x-www-form-urlencoded'}\n data?: Record<string, any>; // 请求参数\n timeout?: number; // 请求超时时间,单位为毫秒,默认 30000\n cacheModel: \"noStore\" | \"noCache\" | \"smartCache\" | \"firstCache\";\n dataType?: \"json\" | \"text\" | 'base64'; // 返期望返回的数据格式,默认json,支持json、text、base64\n}\n\n// 定义请求响应接口\nexport interface RequestResponse {\n status: number; // HTTP 状态码\n data: any; // 响应数据,格式取决于请求时的 dataType 参数。\n headers: Record<string, string>; // 响应头\n}\n\n// 定义上传文件接口\nexport interface UploadFileOptions extends CallbacksBase {\n url: string; // 目标服务器url\n filePath: string; // 要上传文件资源的本地定位符\n fileName: string; // 文件名,即对应的 key, 开发者在服务器端通过这个 key 可以获取到文件二进制内容\n fileType: 'image' | 'video' | 'audio'; // 文件类型:image、video、audio\n formData?: Record<string, any>; // HTTP 请求中其他额外的 form 数据\n header?: Record<string, string>; // 设置请求的 HTTP 头\n}\n\n// 定义上传文件响应接口\nexport interface UploadFileResponse {\n statusCode: number; // HTTP 状态码\n data: string; // 响应数据,通常是服务器返回的文件 URL 或\n headers: Record<string, string>; // 服务器返回的 header。\n}\n\n// 定义下载文件接口\nexport interface DownloadFileOptions extends CallbacksBase {\n url: string; // 目标服务器url\n header?: Record<string, string>; // HTTP 请求 Header\n}\n\n// 定义下载文件响应接口\nexport interface DownloadFileResponse {\n filePath: string; // 文件临时存放的位置\n}\n\ndeclare module \"../core\" {\n interface PluginMethods {\n httpRequest: (options: RequestOptions) => Promise<RequestResponse>;\n httpRequestSync: (options: RequestOptions) => void;\n uploadFile: (options: UploadFileOptions) => Promise<UploadFileResponse>;\n downloadFile: (options: DownloadFileOptions) => Promise<DownloadFileResponse>;\n }\n interface NativeBridgeCore extends PluginMethods { }\n}\n\n/**\n * 网络请求插件类\n */\nclass RequestPlugin implements BridgePlugin {\n public readonly name = \"request\";\n public readonly version = \"1.0.0\";\n private context?: PluginContext;\n\n /**\n * 安装插件\n */\n public install(context: PluginContext): void {\n this.context = context;\n // 在桥接对象上挂载方法\n context.bridge.registerMethod(\"httpRequest\", this.httpRequest.bind(this));\n context.bridge.registerMethod(\"httpRequestSync\", this.httpRequestSync.bind(this));\n context.bridge.registerMethod(\"uploadFile\", this.uploadFile.bind(this));\n context.bridge.registerMethod(\"downloadFile\", this.downloadFile.bind(this));\n }\n\n /**\n * 执行HTTP请求\n * @param options 请求配置选项\n * @property {string} url 请求URL(必需)\n * @property {string} [method] HTTP方法,默认为'GET'\n * @property {Object} [headers] 请求头,默认为{'Content-Type': 'application/x-www-form-urlencoded'}\n * @property {Object} [data] 请求数据,默认为{}\n * @property {string} [dataType] 响应数据类型,默认为'json'\n * @property {number} [timeout] 超时时间(毫秒),默认为30000\n * @property {string} [cacheModel] 缓存模式,默认为'noStore'\n * @returns {Promise<RequestResponse>} 返回一个Promise,解析为请求响应结果\n */\n public httpRequest(options: RequestOptions): Promise<RequestResponse> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查必需参数\n if (!options.url) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"缺少必需的参数: url\"\n );\n }\n\n // 检查url格式\n if (typeof options.url !== 'string' || !options.url.trim()) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"url参数格式不正确\"\n );\n }\n\n // 检查请求方法\n const validMethods = ['GET', 'POST'];\n if (options.method !== undefined && !validMethods.includes(options.method.toUpperCase())) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, `method参数格式不正确`);\n }\n\n // 检查请求头\n if (options.headers !== undefined && typeof options.headers !== 'object') {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"headers参数格式不正确\");\n }\n\n // 检查数据格式\n if (options.data !== undefined && typeof options.data !== 'object') {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"data参数格式不正确\");\n }\n\n // 检查数据类型\n const validDataTypes = ['json', 'text', 'base64'];\n if (options.dataType !== undefined && !validDataTypes.includes(options.dataType.toLowerCase())) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, `dataType参数格式不正确`);\n }\n\n // 检查超时时间\n if (options.timeout !== undefined && (typeof options.timeout !== 'number' || options.timeout <= 0)) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"timeout参数格式不正确\");\n }\n\n // 检查缓存模式\n const validCacheModels = ['noStore', 'noCache', 'smartCache', 'firstCache'];\n if ((options.cacheModel !== undefined && typeof options.cacheModel !== 'string') || (options.cacheModel !== undefined && !validCacheModels.includes(options.cacheModel))) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, `cacheModel参数格式不正确`);\n }\n\n // 设置默认值\n options.method = options.method || \"GET\"; // 默认 GET 请求\n options.headers = (options.headers && Object.keys(options.headers).length > 0) ? options.headers : { \"Content-Type\": \"application/x-www-form-urlencoded\" };\n options.data = options.data || {};\n options.dataType = options.dataType || \"json\"; // 默认返回 json\n options.timeout = options.timeout || 30000;\n options.cacheModel = options.cacheModel || \"noStore\"; // 默认不缓存\n\n const callbacks: CallbacksBase = {\n success: (res) => {\n // options?.success?.(res);\n resolve(res);\n },\n fail: (err: any) => {\n // options.fail?.(err);\n reject(err);\n },\n complete: () => {\n // options.complete?.();\n // 可选:做一些清理或统一处理\n },\n };\n\n // 调用原生网络请求方法\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"httpRequest\",\n params: options,\n timeout: options.timeout,\n },\n callbacks\n );\n });\n });\n }\n\n /**\n *\n */\n public httpRequestSync(options: RequestOptions): void {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查必需参数\n if (!options.url) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"缺少必需的参数: url\"\n );\n }\n\n // 检查url格式\n if (typeof options.url !== 'string' || !options.url.trim()) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"url参数格式不正确\"\n );\n }\n\n // 检查请求方法\n const validMethods = ['GET', 'POST'];\n if (options.method !== undefined && !validMethods.includes(options.method.toUpperCase())) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, `method参数格式不正确`);\n }\n\n // 检查请求头\n if (options.headers !== undefined && typeof options.headers !== 'object') {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"headers参数格式不正确\");\n }\n\n // 检查数据格式\n if (options.data !== undefined && typeof options.data !== 'object') {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"data参数格式不正确\");\n }\n\n // 检查数据类型\n const validDataTypes = ['json', 'text', 'base64'];\n if (options.dataType !== undefined && !validDataTypes.includes(options.dataType.toLowerCase())) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, `dataType参数格式不正确`);\n }\n\n // 检查超时时间\n if (options.timeout !== undefined && (typeof options.timeout !== 'number' || options.timeout <= 0)) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"timeout参数格式不正确\");\n }\n\n // 检查缓存模式\n const validCacheModels = ['noStore', 'noCache', 'smartCache', 'firstCache'];\n if ((options.cacheModel !== undefined && typeof options.cacheModel !== 'string') || (options.cacheModel !== undefined && !validCacheModels.includes(options.cacheModel))) {\n throw createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, `cacheModel参数格式不正确`);\n }\n\n // 设置默认值\n options.method = options.method || \"GET\"; // 默认 GET 请求\n options.headers = (options.headers && Object.keys(options.headers).length > 0) ? options.headers : { \"Content-Type\": \"application/x-www-form-urlencoded\" };\n options.data = options.data || {};\n options.dataType = options.dataType || \"json\"; // 默认返回 json\n options.timeout = options.timeout || 30000;\n options.cacheModel = options.cacheModel || \"noStore\"; // 默认不缓存\n\n const callbacks: CallbacksBase = {\n success: (res) => {\n options?.success?.(res);\n },\n fail: (err: any) => {\n options.fail?.(err);\n },\n complete: () => {\n options.complete?.();\n // 可选:做一些清理或统一处理\n },\n };\n\n // 调用原生网络请求方法\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"httpRequest\",\n params: options,\n timeout: options.timeout,\n },\n callbacks\n );\n })\n }\n\n /**\n * 执行文件上传\n * @param options 上传文件选项\n * @returns Promise<UploadFileResponse> 返回上传结果\n */\n public uploadFile(options: UploadFileOptions): Promise<UploadFileResponse> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查必需参数\n if (!options.url || !options.filePath || !options.fileName || !options.fileType) {\n return reject(createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"缺少必需的参数: url, filePath, fileName, fileType\"));\n }\n\n // 检查url格式\n if (typeof options.url !== 'string' || !options.url.trim()) {\n return reject(createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"url参数格式不正确\"));\n }\n\n // 检查文件路径\n if (typeof options.filePath !== 'string' || !options.filePath.trim()) {\n return reject(createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"filePath参数格式不正确\"));\n }\n\n // 检查文件名\n if (typeof options.fileName !== 'string' || !options.fileName.trim()) {\n return reject(createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"fileName参数格式不正确\"));\n }\n\n // 检查文件类型\n const validFileTypes = ['image', 'video', 'audio'];\n if (!validFileTypes.includes(options.fileType)) {\n return reject(createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, `不支持的文件类型: ${options.fileType}`));\n }\n\n // 检查请求头\n if (options.header !== undefined && typeof options.header !== 'object') {\n return reject(createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"header参数格式不正确\"));\n }\n\n // 检查formData\n if (options.formData !== undefined && typeof options.formData !== 'object') {\n return reject(createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"formData参数格式不正确\"));\n }\n\n const callbacks: CallbacksBase = {\n success: (res) => {\n resolve(res);\n },\n fail: (err) => {\n reject(err);\n },\n complete: () => {\n // 可选:做一些清理或统一处理\n },\n };\n\n // 调用原生上传文件方法\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"uploadFile\",\n params: options,\n },\n callbacks\n );\n });\n });\n }\n\n /**\n * 执行文件下载\n * @param options 下载文件选项\n * @returns Promise<DownloadFileResponse> 返回下载结果\n */\n public downloadFile(options: DownloadFileOptions): Promise<DownloadFileResponse> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查必需参数\n if (!options.url) {\n return reject(createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"缺少必需的参数: url\"));\n }\n\n // 检查url格式\n if (typeof options.url !== 'string' || !options.url.trim()) {\n return reject(createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"url参数格式不正确\"));\n }\n\n // 检查请求头\n if (options.header !== undefined && typeof options.header !== 'object') {\n return reject(createBridgeError(BridgeErrorCode.PLUGIN_NOT_INITIALIZED, \"header参数格式不正确\"));\n }\n\n const callbacks: CallbacksBase = {\n success: (res) => {\n resolve(res);\n },\n fail: (err) => {\n reject(err);\n },\n complete: () => {\n // 可选:做一些清理或统一处理\n },\n };\n\n // 调用原生下载文件方法\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"downloadFile\",\n params: options,\n },\n callbacks\n );\n });\n });\n }\n}\n\n// 导出插件\nexport default new RequestPlugin();\n","/**\n * 设备wifi相关插件\n */\n\nimport {\n BridgePlugin,\n PluginContext,\n CallbacksBase,\n} from \"../core\";\n\nimport { BridgeErrorCode, createBridgeError } from \"../core/errors\";\n\nexport interface WifiInfo {\n ssid: string; // Wi-Fi 名称\n bssid: string; // Wi-Fi BSSID\n maclp: string; // Wi-Fi MAC 地址\n isOpen: boolean; // 是否安全 \n timestamp: number; // 时间戳\n rssi: number; // 信号强度\n signalStrength: number; // 信号强度\n}\n\n// 连接 Wi-Fi 的选项\nexport interface ConnectWifiOptions extends CallbacksBase {\n SSID: string; // Wi-Fi SSID\n BSSID?: string; // Wi-Fi BSSID\n password?: string; // Wi-Fi 密码\n isWEP?: boolean; // Wi-Fi 是否为 WEP 默认是 false\n}\n\n// 获取 Wi-Fi 列表 的选项\nexport interface GetWifiListOptions extends CallbacksBase {\n timeout: number; // 超时时间,单位毫秒\n cacheTime: Number; // 缓存时间\n}\n\nexport interface GetWifiListResponse {\n wifiList: WifiInfo[]; // Wi-Fi 列表\n resultMessage?: string; // 成功或错误信息\n resultCode?: number; // 错误码 int枚举值 必选 取值{ 0:成功 1:json错误 2:系统错误 3:超时 }\n}\n\ndeclare module \"../core\" {\n interface PluginMethods {\n startWifi: () => Promise<void>;\n stopWifi: () => Promise<void>;\n connectWifi: (options: ConnectWifiOptions) => Promise<void>;\n getScanWifiListAsync: (options: GetWifiListOptions) => Promise<GetWifiListResponse>;\n }\n}\n\nclass WifiPlugin implements BridgePlugin {\n private context?: PluginContext;\n public readonly name = \"wifi\";\n public readonly version = \"1.0.0\";\n\n public install(context: PluginContext): void {\n this.context = context;\n context.bridge.registerMethod(\"startWifi\", this.startWifi.bind(this));\n context.bridge.registerMethod(\"stopWifi\", this.stopWifi.bind(this));\n context.bridge.registerMethod(\"connectWifi\", this.connectWifi.bind(this));\n context.bridge.registerMethod(\"getScanWifiListAsync\", this.getScanWifiListAsync.bind(this));\n }\n\n\n /**\n * 初始化 Wi-Fi 模块\n * @returns\n */\n public startWifi(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n const callbacks: CallbacksBase = {\n success: (obj: any) => {\n resolve(obj);\n },\n fail: (err) => {\n reject(err);\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"startWifi\",\n params: {},\n },\n callbacks\n );\n });\n });\n }\n\n /**\n * 关闭 Wi-Fi 模块\n * @returns\n */\n public stopWifi(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n const callbacks: CallbacksBase = {\n success: (obj: any) => {\n resolve(obj);\n },\n fail: (err) => {\n reject(err);\n },\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"stopWifi\",\n params: {},\n },\n callbacks\n );\n });\n });\n }\n\n /**\n * 连接 Wi-Fi\n * @param ssid Wi-Fi 名称\n * @param password Wi-Fi 密码\n * @returns\n */\n public connectWifi(options: ConnectWifiOptions): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查必需参数\n if (!options.SSID) {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"缺少必需的参数: SSID\"\n );\n }\n\n if (typeof options.SSID !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"SSID参数格式错误\"\n );\n }\n\n // 检查可选参数\n if (options.BSSID !== undefined && typeof options.BSSID !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"BSSID参数格式错误\"\n );\n }\n\n if (options.password !== undefined && typeof options.password !== \"string\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"password参数格式错误\"\n );\n }\n\n if (options.isWEP !== undefined && typeof options.isWEP !== \"boolean\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"isWEP参数格式错误\"\n );\n }\n\n // 设置默认值\n options.isWEP = options.isWEP ?? false;\n const callbacks: CallbacksBase = {\n success: (res) => {\n resolve(res);\n },\n fail: (err) => {\n reject(err);\n },\n complete: options.complete,\n }\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"connectWifi\",\n params: options,\n },\n callbacks\n );\n });\n });\n }\n\n /**\n * 获取 Wi-Fi 列表\n * @param options 获取 Wi-Fi 列表的选项\n * @returns 返回一个 Promise,解析为 Wi-Fi 列表响应数据\n */\n public async getScanWifiListAsync(options: GetWifiListOptions): Promise<GetWifiListResponse> {\n return new Promise((resolve, reject) => {\n if (!this.context) {\n throw createBridgeError(\n BridgeErrorCode.PLUGIN_NOT_INITIALIZED,\n \"插件未正确初始化\"\n );\n }\n\n // 检查必需参数\n if (typeof options.timeout !== \"number\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"timeout参数格式错误\"\n );\n }\n\n if (typeof options.cacheTime !== \"number\") {\n throw createBridgeError(\n BridgeErrorCode.INVALID_ACTION,\n \"cacheTime参数格式错误\"\n );\n }\n\n const callbacks: CallbacksBase = {\n success: (res) => {\n resolve(res);\n },\n fail: (err) => {\n reject(err);\n },\n complete: options.complete,\n };\n\n this.context.bridge.ready(() => {\n this.context?.bridge.callNative(\n {\n action: \"getScanWifiListAsync\",\n params: options,\n timeout: options.timeout,\n },\n callbacks\n );\n });\n });\n }\n\n}\n\nexport default new WifiPlugin();\n","/**\n * H5 Native Bridge\n * H5与原生App通信工具库\n *\n * 主入口文件\n */\nimport { createNativeBridge } from \"./core\";\nimport locationPlugin from \"./plugins/location\";\nimport devicePlugin from \"./plugins/device\";\nimport mediaPlugin from \"./plugins/media\";\nimport navigatePlugin from \"./plugins/navigate\";\nimport toastPlugin from \"./plugins/toast\";\nimport { userinfoPlugin } from './plugins/userInfo';\nimport bluetoothPlugin from \"./plugins/bluetooth\";\nimport storagePlugin from \"./plugins/storage\";\nimport authenticationPlugin from \"./plugins/authentication\";\nimport requestPlugin from \"./plugins/request\";\nimport wifiPlugin from \"./plugins/wifi\";\n// 导出核心模块\nexport { NativeBridgeCore, createNativeBridge } from \"./core\";\n\n// 导出所有插件\nexport { default as locationPlugin } from \"./plugins/location\";\nexport { default as devicePlugin } from \"./plugins/device\";\nexport { default as mediaPlugin } from \"./plugins/media\";\nexport { default as navigatePlugin } from \"./plugins/navigate\";\nexport { default as userinfoPlugin } from \"./plugins/userInfo\";\nexport { default as toastPlugin } from \"./plugins/toast\";\nexport { default as bluetoothPlugin } from \"./plugins/bluetooth\";\nexport { default as storagePlugin } from \"./plugins/storage\";\nexport { default as authenticationPlugin } from \"./plugins/authentication\";\nexport { default as requestPlugin } from \"./plugins/request\";\nexport { default as wifiPlugin } from \"./plugins/wifi\";\n\n// 导出所有类型定义\nexport type {\n BridgePlugin,\n BridgeOptions,\n PluginContext,\n CallbacksBase,\n NativeResponse,\n CallNativeOptions,\n PluginMethods,\n} from \"./core\";\n\nexport type {\n LocationInfo,\n GetLocationOptions,\n} from \"./plugins/location\";\n\nexport type {\n DeviceInfo,\n DeviceInfoOptions,\n GetWifiOptions,\n WifiListAsyncResult,\n} from \"./plugins/device\";\n\nexport type {\n MediaInfo,\n MediaInfoOptions,\n} from \"./plugins/media\";\nexport type { NavigateInfo } from \"./plugins/navigate\";\n\n// 创建并配置默认实例\nconst nativeBridge = createNativeBridge({\n plugins: [\n locationPlugin,\n devicePlugin,\n mediaPlugin,\n navigatePlugin,\n toastPlugin,\n userinfoPlugin,\n bluetoothPlugin,\n storagePlugin,\n authenticationPlugin,\n requestPlugin,\n wifiPlugin,\n ],\n debug: true,\n errorHandler: (error, source) => {\n console.error(`[NativeBridge Error] ${source}:`, error);\n },\n});\n\nexport default nativeBridge;\n"],"names":["BridgeErrorCode","createBridgeError","code","message","details","error","Error","AbortControllerPolyfill","AbortController","constructor","__publicField","this","signal","aborted","_listeners","addEventListener","event","callback","push","removeEventListener","index","indexOf","splice","dispatchEvent","forEach","listener","abort","type","_NativeBridgeCore","options","Map","__publicField$b","callbackMap","callbackId","isReady","readyCallbacks","debugMode","debug","defaultTimeout","timeout","plugins","pendingCalls","errorHandler","setupBridge","length","plugin","use","getInstance","instance","onNativeEvent","eventType","handler","nativeEventHandlers","has","set","Set","get","add","offNativeEvent","_a","delete","dispatchNativeEvent","data","log","e","registerMethod","name","method","methodRegistry","warn","install","PLUGIN_NOT_INITIALIZED","context","bridge","version","SYSTEM_ERROR","hasPlugin","getPlugin","checkIsInApp","window","nativeBridgeCallback","handleNativeCallback","bind","nativeBridgeDispatchEvent","callNative","action","params","VERSION","apiVersion","API_VERSION","success","fail","readyHandler","document","eventListeners","setTimeout","destroy","clear","clearTimeout","userAgent","navigator","toLowerCase","console","JSON","stringify","webkit","messageHandlers","ready","callbacks","Date","now","retryCount","retryDelay","controller","timeoutId","_b","timeoutError","TIMEOUT","call","complete","sendToNative","mockNativeCall","releaseCallback","isIOS","test","callNativeSync","_c","_d","messageString","win","prompt","AndroidBridge","postSyncMessage","iframe","createElement","style","display","src","encodeURIComponent","body","appendChild","removeChild","iframeError","processJsonValue","nativeBridge","postMessage","Event","entries","Array","from","i","mockAction","setDebug","setErrorHandler","getInstalledPlugins","keys","isDebugMode","optionalParams","getCallBackMap","NativeBridgeCore","value","trimmedValue","trim","startsWith","endsWith","parse","createNativeBridge","locationPlugin","__publicField$a","getLocationSync","getLocation","targetAccuracy","coordinate","withReGeocode","useCache","Promise","resolve","reject","location","INVALID_ACTION","devicePlugin","__publicField$9","getSystemInfo","getSystemInfoSync","getWifiList","getUUID","setKeepScreenOn","isKeep","JSON_ERROR","res","err","Number","isInteger","cacheTime","resp","resultCode","resultMessage","wifiList","__spreadValues","mediaPlugin","__publicField$8","saveImage","scan","chooseImage","previewImage","compressImage","compressVideo","chooseVideo","onUploadProgress","key","includes","isSupportAlbum","url","count","validSourceType","sourceType","isArray","some","filePaths","fileRealPaths","urls","current","compressLevel","filePath","MIN_VIDEO_DURATION","maxDuration","duration","size","height","width","navigatePlugin","__publicField$7","navigateTo","redirectTo","reLaunch","navigateBack","setNavigationBar","openLink","navigateToNativePage","closeCurrentPage","isShowBar","title","backgroundColor","reset","navigate","SUCCESS","delta","__async","enableShare","toastPlugin","__publicField$6","showToast","hideToast","showLoading","hideLoading","obj","content","userinfoPlugin","__publicField$5","getUserInfo","bluetooth","__publicField$4","openBluetoothAdapter","closeBluetoothAdapter","startBluetoothDevicesDiscovery","stopBluetoothDevicesDiscovery","onBluetoothDeviceFound","offBluetoothDeviceFound","writeBLECharacteristicValue","readBLECharacteristicValue","connectBLEDevice","disconnectBLEDevice","getBLEDeviceCharacteristics","getBLEDeviceServices","onBLECharacteristicValueChange","offBLECharacteristicValueChange","onBLEConnectionStateChanged","offBLEConnectionStateChanged","deviceId","serviceId","characteristicId","services","allowDuplicatesKey","interval","autoClose","getBluetoothDevices","storagePlugin","__publicField$3","setStorage","setStorageSync","getStorage","getStorageSync","removeStorage","_createCallbacks","_callNativeMethod","response","Object","authenticationPlugin","__publicField$2","exclusiveLiveCheck","requestPlugin","__publicField$1","httpRequest","httpRequestSync","uploadFile","downloadFile","toUpperCase","headers","dataType","cacheModel","fileName","fileType","header","formData","wifiPlugin","startWifi","stopWifi","connectWifi","getScanWifiListAsync","SSID","BSSID","password","isWEP","bluetoothPlugin","source"],"mappings":"mPAEY,IAAAA,GAAAA,IACVA,EAAAA,UAAU,GAAV,UACAA,EAAAA,aAAa,GAAb,aACAA,EAAAA,eAAe,GAAf,eACAA,EAAAA,UAAU,GAAV,UACAA,EAAAA,yBAAyB,GAAzB,yBACAA,EAAAA,iBAAiB,GAAjB,iBANUA,IAAAA,GAAA,CAAA,GAeL,MAAMC,EAAoB,CAC/BC,EACAC,EACAC,KAEM,MAAAC,EAAQ,IAAIC,MAAMH,GAGjB,OAFPE,EAAMH,KAAOA,EACbG,EAAMD,QAAUA,EACTC,mKCZL,IAAAE,EAIFA,EAD6B,oBAApBC,gBACiB,MAGxB,WAAAC,GAFAC,EAAAC,KAAA,UAIEA,KAAKC,OAAS,CACZC,SAAS,EACTC,WAAY,GACZC,iBAAkB,SAASC,EAAeC,GACnCN,KAAAG,WAAWI,KAAKD,EACvB,EACAE,oBAAqB,SAASH,EAAeC,GAC3C,MAAMG,EAAQT,KAAKG,WAAWO,QAAQJ,IACpB,IAAdG,GACGT,KAAAG,WAAWQ,OAAOF,EAAO,EAElC,EACAG,cAAe,SAASP,GACtBL,KAAKG,WAAWU,QAASC,GAAuBA,EAAST,GAC3D,EAEJ,CAEA,KAAAU,GACEf,KAAKC,OAAOC,SAAU,EACtBF,KAAKC,OAAOW,cAAc,CAAEI,KAAM,SACpC,GAGwBnB,gBAmDf,MAAAoB,EAAN,MAAMA,EAqBH,WAAAnB,CAAYoB,EAAyB,IAnBrCnB,EAAAC,KAAA,eACAD,EAAAC,KAAA,cACAD,EAAAC,KAAA,WACAD,EAAAC,KAAA,kBACAD,EAAAC,KAAA,aACAD,EAAAC,KAAA,kBACAD,EAAAC,KAAA,WACAD,EAAAC,KAAA,gBACAD,EAAAC,KAAA,gBACAD,EAAAC,KAAA,iBAAiD,IAAAmB,KACjDpB,EAAAC,KAAA,sBAAgE,IAAAmB,KAGxEC,EAAApB,KAAgB,UAAU,SAC1BoB,EAAApB,KAAgB,cAAc,KA4EtBD,EAAAC,KAAA,iBAA4C,IAAAmB,KAtE7CnB,KAAAqB,gBAAkBF,IACvBnB,KAAKsB,WAAa,EAClBtB,KAAKuB,SAAU,EACfvB,KAAKwB,eAAiB,GACjBxB,KAAAyB,UAAYP,EAAQQ,QAAS,EAC7B1B,KAAA2B,eAAiBT,EAAQU,SAAW,IACpC5B,KAAA6B,YAAcV,IACdnB,KAAA8B,iBAAmBX,IACxBnB,KAAK+B,aAAeb,EAAQa,aAI5B/B,KAAKgC,cAGDd,EAAQW,SAAWX,EAAQW,QAAQI,OAAS,GAC9Cf,EAAQW,QAAQhB,QAASqB,GAAWlC,KAAKmC,IAAID,GAEjD,CAKA,kBAAcE,CAAYlB,EAAyB,IAUjD,OATKD,EAAiBoB,SAEXnB,EAAQW,SAAWX,EAAQW,QAAQI,OAAS,GAE7Cf,EAAAW,QAAQhB,QAASqB,IACNjB,EAAAoB,SAASF,IAAID,KAJfjB,EAAAoB,SAAW,IAAIpB,EAAiBC,GAQ5CD,EAAiBoB,QAC1B,CAKO,aAAAC,CAAcC,EAAmBC,GACjCxC,KAAKyC,oBAAoBC,IAAIH,IAChCvC,KAAKyC,oBAAoBE,IAAIJ,EAAW,IAAIK,KAE9C5C,KAAKyC,oBAAoBI,IAAIN,GAAYO,IAAIN,EAC/C,CAKO,cAAAO,CAAeR,EAAmBC,GAxK3C,IAAAQ,EAyKI,OAAAA,EAAAhD,KAAKyC,oBAAoBI,IAAIN,OAAYU,OAAOT,EAClD,CAKO,mBAAAU,CAAoBX,EAAmBY,GA/KhD,IAAAH,EAgLQhD,KAAKyB,WACPzB,KAAKoD,IAAI,WAAWb,IAAaY,GAEnC,OAAAH,EAAAhD,KAAKyC,oBAAoBI,IAAIN,KAAYS,EAAAnC,QAAS2B,IAC5C,IACFA,EAAQ,CAAExB,KAAMuB,EAAWY,eACpBE,GACPrD,KAAKN,MAAM,UAAU6C,OAAgBc,EACvC,GAEJ,CAKO,cAAAC,CACLC,EACAC,GAEIxD,KAAKyD,eAAef,IAAIa,IACrBvD,KAAA0D,KAAK,MAAMH,cAEbvD,KAAAyD,eAAed,IAAIY,EAAgBC,GACvCxD,KAAauD,GAAQC,CACxB,CAKO,GAAArB,CAAID,GAEP,IAACA,IACAA,EAAOqB,OACPrB,EAAOyB,SACkB,mBAAnBzB,EAAOyB,QAER,MAAArE,EACJD,EAAgBuE,uBAChB,WAAkB,MAAR1B,OAAQ,EAAAA,EAAAqB,OAAQ,SAI9B,GAAIvD,KAAK6B,QAAQa,IAAIR,EAAOqB,MAEnB,OADPvD,KAAK0D,KAAK,MAAMxB,EAAOqB,aAChBvD,KAGL,IACI,MAAA6D,EAAyB,CAAEC,OAAQ9D,MACzCkC,EAAOyB,QAAQE,GACf7D,KAAK6B,QAAQc,IAAIT,EAAOqB,KAAMrB,GAC9BlC,KAAKoD,IAAI,MAAMlB,EAAOqB,QAAQrB,EAAO6B,sBAC9BrE,GACD,MAAAJ,EACJD,EAAgB2E,aAChB,QAAQ9B,EAAOqB,UACf7D,EAEJ,CAEO,OAAAM,IACT,CAKO,SAAAiE,CAAUV,GACR,OAAAvD,KAAK6B,QAAQa,IAAIa,EAC1B,CAKO,SAAAW,CAAUX,GACR,OAAAvD,KAAK6B,QAAQgB,IAAIU,EAC1B,CAKQ,WAAAvB,GACF,IAIF,GAFgBhC,KAAKmE,eAER,CAEVC,OAAeC,qBACdrE,KAAKsE,qBAAqBC,KAAKvE,MAGjBoE,OAAAI,0BAA4B,CAC1CjC,EACAY,KAEKnD,KAAAkD,oBAAoBX,EAAWY,IAIjCnD,KAAAyE,WACH,CACEC,OAAQ,QACRC,OAAQ,CAAEZ,QAAS/D,KAAK4E,QAASC,WAAY7E,KAAK8E,cAEpD,CACEC,QAAS,KACP/E,KAAKoD,IAAI,kBACTpD,KAAKuB,SAAU,EACfvB,KAAKwB,eAAeX,QAASP,GAAaA,KAC1CN,KAAKwB,eAAiB,IAExBwD,KAAOtF,IACAM,KAAAN,MAAM,YAAaA,MAI9B,MAAMuF,EAAe,KACnBjF,KAAKuB,SAAU,EACfvB,KAAKwB,eAAeX,QAASP,GAAaA,KAC1CN,KAAKwB,eAAiB,IAGf0D,SAAA9E,iBAAiB,oBAAqB6E,GAC1CjF,KAAAmF,eAAexC,IAAI,oBAAqBsC,EAAY,MAGzDG,WAAW,KACTpF,KAAKuB,SAAU,EACfvB,KAAKwB,eAAeX,QAASP,GAAaA,KAC1CN,KAAKwB,eAAiB,IACrB,SAEE9B,GACFM,KAAAN,MAAM,WAAYA,EACzB,CACF,CAEO,OAAA2F,GACLrF,KAAKmF,eAAetE,QAAQ,CAACC,EAAUT,KAC5B6E,SAAA1E,oBAAoBH,EAAOS,KAEtCd,KAAKmF,eAAeG,QACpBtF,KAAKqB,YAAYiE,QACjBtF,KAAK8B,aAAajB,QAASe,GAAY2D,aAAa3D,IACpD5B,KAAK8B,aAAawD,QACjBlB,OAAeC,0BAAuB,CACzC,CAKQ,YAAAF,GAvUV,IAAAnB,EAwUQ,IAEI,MAAAwC,EAAYC,UAAUD,UAAUE,cAO/B,OANCC,QAAAvC,IAAI,6BAA6BoC,KACjCG,QAAAvC,IACN,mCAAmCwC,KAAKC,UACrC,OAAA7C,EAAAoB,OAAe0B,aAAQ,EAAA9C,EAAA+C,qBAGrB,QAKArG,GAEA,OADFM,KAAAN,MAAM,YAAaA,IACjB,CACT,CACF,CAKO,KAAAsG,CAAM1F,GACPN,KAAKuB,YAGFvB,KAAAwB,eAAejB,KAAKD,EAE7B,CAOO,UAAAmE,CACLvD,EACA+E,GA9WJ,IAAAjD,EAgXI,MAAM1B,EAAa,MAAMtB,KAAKsB,gBAAgB4E,KAAKC,SAC7CzB,OACJA,EAAAC,OACAA,EAAS,CAAC,EAAA/C,QACVA,EAAU5B,KAAK2B,eAAAyE,WACfA,EAAa,EAAAC,WACbA,EAAa,KACXnF,EACJ,GAAI+E,IACGjG,KAAAqB,YAAYsB,IAAIrB,EAAY2E,GAE7BrE,EAAU,GAAG,CACT,MAAA0E,EAAa,IAAI1G,EACjB2G,EAAYnB,WAAW,KA7XrC,IAAApC,EAAAwD,EA8XU,IAAIF,EAAWrG,OAAOC,SAElBF,KAAKqB,YAAYqB,IAAIpB,GAIvB,GAHKtB,KAAAqB,YAAY4B,OAAO3B,GACnBtB,KAAA8B,aAAamB,OAAO3B,GAErB8E,EAAa,EACVpG,KAAAoD,IACH,MAAMsB,QAAa2B,mBAA4BD,MAEjDhB,WAAW,KACLkB,EAAWrG,OAAOC,SACjBF,KAAAyE,WACH,CACEC,SACAC,SACA/C,UACAwE,WAAYA,EAAa,EACzBC,cAEFJ,IAEDI,OACE,CACL,MAAMI,EAAenH,EACnBD,EAAgBqH,QAChB,MAAMhC,SAAc9C,QAEtB,OAAAoB,EAAAiD,EAAUjB,OAAVhC,EAAA2D,KAAiBV,EAAAQ,GACjB,OAAAD,EAAAP,EAAUW,WAAVJ,EAAAG,KAAAV,GACAjG,KAAKN,MAAM,SAASgF,IAAU+B,EAChC,GAED7E,GAEE5B,KAAA8B,aAAaa,IAAIrB,EAAYiF,GAEvBD,EAAArG,OAAOG,iBAAiB,QAAS,KAC1CmF,aAAagB,GACRvG,KAAA8B,aAAamB,OAAO3B,IAE7B,CAGF,MAAM9B,EAAU,CAAEkF,SAAQC,SAAQ/C,UAASN,cACvCtB,KAAKyB,WACPzB,KAAKoD,IAAI,WAAWsB,IAAUC,GAG5B,IACE3E,KAAKmE,eACPnE,KAAK6G,aAAarH,GAElBQ,KAAK8G,eAAetH,SAEfE,GACPM,KAAKN,MAAM,UAAUgF,OAAahF,GAClC,OAAAsD,EAAA,MAAAiD,OAAA,EAAAA,EAAWjB,OAAOhC,EAAA2D,KAAAV,EAAAvG,GAClBM,KAAK+G,gBAAgBzF,EACvB,CAEO,OAAAA,CACT,CAEO,KAAA0F,GACE,MAAA,oBAAoBC,KAAKxB,UAAUD,UAC5C,CAaO,cAAA0B,CAAexC,EAAgBC,EAAasB,GA7crD,IAAAjD,EAAAwD,EAAAW,EAAAC,EA8cI,IAAIjE,EACA,IACF,MAAMkE,EAAgBzB,KAAKC,UAAU,CAAEnB,SAAQC,WAEzC2C,EAAwB,oBAAXlD,OAA0BA,YAAiB,EAG1D,GAAApE,KAAKgH,QACFhH,KAAAoD,IAAI,wBAAwBiE,KACjClE,EAAOoE,OAAOF,QAEL,GAAA,OAAArE,EAAA,MAAAsE,OAAA,EAAAA,EAAKE,oBAAL,EAAAxE,EAAoByE,gBACxBzH,KAAAoD,IAAI,iBAAiBiE,KACnBlE,EAAAmE,EAAIE,cAAcC,gBAAgBJ,WAEhCC,EACL,IACI,MAAAI,EAASxC,SAASyC,cAAc,UAS/B,OARPD,EAAOE,MAAMC,QAAU,OACvBH,EAAOI,IAAM,4BAA4BC,mBACvCV,KAEOnC,SAAA8C,KAAKC,YAAYP,QAC1BtC,WAAW,KACAF,SAAA8C,KAAKE,YAAYR,IACzB,SAEIS,GAED,MADN,OAAA3B,EAAA,MAAAP,OAAA,EAAAA,EAAWjB,OAAOwB,EAAAG,KAAAV,EAAAkC,GACZ7I,EACJD,EAAgB2E,aAChB,iBAAkBmE,EAAsB3I,UAE5C,QAEKE,GAED,MADN,OAAAyH,EAAA,MAAAlB,OAAA,EAAAA,EAAWjB,OAAOmC,EAAAR,KAAAV,EAAAvG,GACZJ,EACJD,EAAgB2E,aAChB,iBAAkBtE,EAAgBF,UAEtC,CAQA,OALIQ,KAAKyB,WACFzB,KAAAoD,IAAI,kBAAmBD,GAG9B,OAAWiE,EAAA,MAAAnB,OAAA,EAAAA,EAAAlB,UAAUqC,EAAAT,KAAAV,EAAAmC,EAAiBjF,IAC/BiF,EAAiBjF,EAC1B,CAKQ,YAAA0D,CAAarH,GACf,IACI,MAAA6H,EAAgBzB,KAAKC,UAAUrG,GAGnC,GAAkB,oBAAX4E,QACNA,OAAe0B,QACf1B,OAAe0B,OAAOC,iBACtB3B,OAAe0B,OAAOC,gBAAgBsC,aAElCrI,KAAAoD,IAAI,wBAAwBiE,KACjBjD,OAAA0B,OAAOC,gBAAgBsC,aAAaC,YAClDjB,QAKD,GAAAjD,OAAeoD,eACfpD,OAAeoD,cAAcc,YAEzBtI,KAAAoD,IAAI,iBAAiBiE,KACVjD,OAAAoD,cAAcc,YAAYjB,OAGvC,CACG,MAAAK,EAASxC,SAASyC,cAAc,UACtCD,EAAOE,MAAMC,QAAU,OACvBH,EAAOI,IAAM,4BAA4BC,mBACvCV,KAEOnC,SAAA8C,KAAKC,YAAYP,GAC1BtC,WAAW,KACAF,SAAA8C,KAAKE,YAAYR,IACzB,EACL,QACOhI,GACD,MAAAJ,EACJD,EAAgB2E,aAChB,iBAAkBtE,EAAgBF,UAEtC,CACF,CAKO,oBAAA8E,CACLhD,EACAN,EACAmC,GAEA,MAAM8C,EAAYjG,KAAKqB,YAAYwB,IAAIvB,GAEvC,GAAK2E,EAAL,CAMIjG,KAAK8B,aAAaY,IAAIpB,KACxBiE,aAAavF,KAAK8B,aAAae,IAAIvB,IAC9BtB,KAAA8B,aAAamB,OAAO3B,IAIvBtB,KAAKyB,WACPzB,KAAKoD,IAAI,WAAWpC,IAAQmC,GAG1B,IACE,GAAS,YAATnC,GAAsBiF,EAAUlB,QACxBkB,EAAAlB,QAAQqD,EAAiBjF,SAC1B,GAAS,SAATnC,GAAmBiF,EAAUjB,KAAM,CACxC,IAAAtF,EAEAyD,aAAgBxD,MACVD,EAAAyD,EACiB,iBAATA,EACRzD,EAAA,IAAIC,MAAMwD,GACTA,GAAQA,EAAK3D,SACdE,EAAA,IAAIC,MAAMwD,EAAK3D,SACnB2D,EAAK5D,OACNG,EAAcH,KAAO4D,EAAK5D,OAGrBG,EAAA,IAAIC,MAAM,QAGpBsG,EAAUjB,KAAKtF,EACjB,CAEIuG,EAAUW,UACZX,EAAUW,iBAELlH,GACFM,KAAAN,MAAM,YAAaA,EAC1B,CAGKM,KAAAqB,YAAY4B,OAAO3B,EA3CxB,MAFOtB,KAAA0D,KAAK,YAAYpC,IA8C1B,CAKQ,cAAAwF,CAAetH,GAMrB,GALIQ,KAAKyB,WACFzB,KAAAoD,IAAI,UAAW5D,GAKf,UADCA,EAAQkF,OAGZU,WAAW,KACH,MAAA/E,EAAQ,IAAIkI,MAAM,qBACxBrD,SAAStE,cAAcP,IACtB,SAEL,CAEE,MAAMmI,EAAUC,MAAMC,KAAK1I,KAAK6B,QAAQ2G,WACxC,IAAA,IAASG,EAAI,EAAGA,EAAIH,EAAQvG,OAAQ0G,IAAK,CACvC,MAAOzG,GAAUsG,EAAQG,GACzB,GACGzG,EAAe0G,YACsB,mBAA9B1G,EAAe0G,YAElB1G,EAAe0G,WAAWpJ,GAC7B,MAGN,CAGA4F,WAAW,KACJpF,KAAAsE,qBACH9E,EAAQ8B,WACR,UACA,CAAE9B,QAAS,SAAU2D,KAAM,QAE5B,IAAG,CAEZ,CAKQ,eAAA4D,CAAgBzF,GAzpB1B,IAAA0B,EAAAwD,EA0pBI,GAAIxG,KAAKqB,YAAYqB,IAAIpB,GAAa,CACpC,MAAM2E,EAAYjG,KAAKqB,YAAYwB,IAAIvB,GACvC,OAAA0B,EAAA,MAAAiD,OAAA,EAAAA,EAAWjB,OAAXhC,EAAA2D,KAAAV,EACE3G,EAAkBD,EAAgB2E,aAAc,aAElD,OAAAwC,EAAA,MAAAP,OAAA,EAAAA,EAAWW,WAAXJ,EAAAG,KAAAV,GACKjG,KAAAqB,YAAY4B,OAAO3B,EAC1B,CAEItB,KAAK8B,aAAaY,IAAIpB,KACxBiE,aAAavF,KAAK8B,aAAae,IAAIvB,IAC9BtB,KAAA8B,aAAamB,OAAO3B,GAE7B,CAKO,QAAAuH,CAASnH,GACd1B,KAAKyB,UAAYC,EAEbA,EACFiE,QAAQvC,IAAI,4BAEZuC,QAAQvC,IAAI,2BAEhB,CAKO,eAAA0F,CACLtG,GAEAxC,KAAK+B,aAAeS,CACtB,CAKO,mBAAAuG,GACL,OAAON,MAAMC,KAAK1I,KAAK6B,QAAQmH,OACjC,CAMO,WAAAC,GACL,OAAOjJ,KAAKyB,SACd,CAKQ,GAAA2B,CAAI5D,KAAoB0J,GAC1BlJ,KAAKyB,WACPkE,QAAQvC,IAAI,kBAAkB5D,OAAc0J,EAEhD,CAKQ,KAAAxJ,CAAMF,EAAiBE,GAC7BiG,QAAQjG,MAAM,wBAAwBF,IAAWE,GAC7CM,KAAK+B,cAAgBrC,GAClBM,KAAA+B,aAAarC,EAAOF,EAE7B,CAKQ,IAAAkE,CAAKlE,GACHmG,QAAAjC,KAAK,uBAAuBlE,IACtC,CAKO,cAAA2J,GACL,OAAOnJ,KAAKqB,WACd,GA3oBAtB,EADWkB,EACI,YADJ,IAAAmI,EAANnI,EAgqBP,SAASmH,EAAiBiB,GAGpB,GAAAA,QACK,OAAAA,EAIL,GAAiB,iBAAVA,EACF,OAAAA,EAIT,GAAc,KAAVA,EACK,OAAAA,EAIL,IAEI,MAAAC,EAAeD,EAAME,OAC3B,OAAKD,EAAaE,WAAW,MAAQF,EAAaG,SAAS,MACtDH,EAAaE,WAAW,MAAQF,EAAaG,SAAS,MAEzD7D,KAAK8D,MAAML,GAEJzD,KAAK8D,MAAML,IAGbA,QACAhG,GAEA,OAAAgG,CACT,CACF,CAGa,MAAAM,EACXzI,GAEOkI,EAAiBhH,YAAYlB,GAIvBkI,EAAiBhH,oVCtnBnB,MAAAwH,EAAiB,IAzG9B,MAAA,WAAA9J,GACE+J,EAAA7J,KAAgB,OAAO,YACvB6J,EAAA7J,KAAgB,UAAU,SAClBD,EAAAC,KAAA,UAAA,CAED,OAAA2D,CAAQE,GACb7D,KAAK6D,QAAUA,EACfA,EAAQC,OAAOR,eACb,kBACAtD,KAAK8J,gBAAgBvF,KAAKvE,OAE5B6D,EAAQC,OAAOR,eAAe,cAAetD,KAAK+J,YAAYxF,KAAKvE,MACrE,CAWO,WAAA+J,CACL7I,EAAwD,CACtD8I,eAAgB,IAChBC,WAAY,EACZC,eAAe,EACfC,UAAU,IA1GhB,IAAAnH,EA+GI,OADQ9B,EAAAiJ,SAAW,OAAAnH,EAAQ9B,EAAAiJ,WAAYnH,EAChC,IAAIoH,QAAQ,CAACC,EAASC,WACtBtK,KAAA8J,0IACA5I,SADgB,CAEnB6D,QAAUwF,IACRF,EAAQE,IAEVvF,KAAOtF,GAAe4K,EAAO5K,SAGnC,CAEO,eAAAoK,CACL5I,EAA8B,CAC5B8I,eAAgB,IAChBC,WAAY,EACZC,eAAe,EACfC,UAAU,IA/HhB,IAAAnH,EAkIQ,IAAChD,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKA,GAAkC,iBAA3B1C,EAAQ8I,eACX,MAAA1K,EACJD,EAAgBmL,eAChB,wBAGA,GAA8B,iBAAvBtJ,EAAQ+I,WACX,MAAA3K,EACJD,EAAgBmL,eAChB,oBAGA,GAAiC,kBAA1BtJ,EAAQgJ,cACX,MAAA5K,EACJD,EAAgBmL,eAChB,uBAGA,GAA4B,kBAArBtJ,EAAQiJ,SACX,MAAA7K,EACJD,EAAgBmL,eAChB,kBAKItJ,EAAAiJ,SAAW,OAAAnH,EAAQ9B,EAAAiJ,WAAYnH,EACvC,MAAMiD,EAA2B,CAC/BlB,QAAS7D,EAAQ6D,QACjBC,KAAM9D,EAAQ8D,KACd4B,SAAU1F,EAAQ0F,UAGf5G,KAAA6D,QAAQC,OAAOkC,MAAM,KA3K9BhD,IAAAA,EA4KM,OAAAA,EAAAhD,KAAK6D,UAALb,EAAcc,OAAOW,WACnB,CACEC,OAAQ,cACRC,OAAQzD,GAEV+E,IAGN,gYCgJW,MAAAwE,EAAe,IAtP5B,MAAA,WAAA3K,GACE4K,EAAA1K,KAAgB,OAAO,UACvB0K,EAAA1K,KAAgB,UAAU,SAClBD,EAAAC,KAAA,UAAA,CAKD,OAAA2D,CAAQE,GACb7D,KAAK6D,QAAUA,EAEfA,EAAQC,OAAOR,eAAe,gBAAiBtD,KAAK2K,cAAcpG,KAAKvE,OACvE6D,EAAQC,OAAOR,eAAe,oBAAqBtD,KAAK4K,kBAAkBrG,KAAKvE,OAC/E6D,EAAQC,OAAOR,eAAe,cAAetD,KAAK6K,YAAYtG,KAAKvE,OACnE6D,EAAQC,OAAOR,eAAe,UAAWtD,KAAK8K,QAAQvG,KAAKvE,OAC3D6D,EAAQC,OAAOR,eACb,kBACAtD,KAAK+K,gBAAgBxG,KAAKvE,MAE9B,CAWO,eAAA+K,CACL7J,GAEI,IAAClB,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKJ,QAAuB,IAAnB1C,EAAQ8J,QAA2C,OAAnB9J,EAAQ8J,OACpC,MAAA1L,EACJD,EAAgB4L,WAChB,iBAKJ,QAAuB,IAAnB/J,EAAQ8J,QAAkD,kBAAnB9J,EAAQ8J,OAC3C,MAAA1L,EACJD,EAAgB4L,WAChB,iBAIJ,MAAMhF,EAA2B,CAC/BlB,QAAS7D,EAAQ6D,QACjBC,KAAM9D,EAAQ8D,KACd4B,SAAU1F,EAAQ0F,UAEf5G,KAAA6D,QAAQC,OAAOkC,MAAM,KA3I9B,IAAAhD,EA4IM,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,kBACRC,OAAQ,CAAEqG,OAAQ9J,EAAQ8J,SAE5B/E,IAGN,CAQO,iBAAA2E,CAAkB1J,EAA6B,IA5JxD,IAAA8B,EA6JQ,IAAChD,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKJ,MAAMqC,EAA2B,CAC/BlB,QAAUmG,IAtKhBlI,IAAAA,EAuKQ,OAAAA,EAAA9B,EAAQ6D,UAAR/B,EAAA2D,KAAkBzF,EAAAgK,IAEpBlG,KAAM9D,EAAQ8D,KACd4B,SAAU1F,EAAQ0F,UAGb,OAAA,OAAA5D,OAAKa,cAAL,EAAAb,EAAcc,OAAOoD,eAAe,oBAAqB,CAAI,EAAAjB,EACtE,CAaO,aAAA0E,GACL,OAAO,IAAIP,QAAQ,CAACC,EAASC,KACvB,IAACtK,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAIJ,MAAMqC,EAA2B,CAC/BlB,QAAUmG,IACRb,EAAQa,IAEVlG,KAAOmG,IACLb,EAAOa,IAETvE,SAAU,QAKP5G,KAAA6D,QAAQC,OAAOkC,MAAM,KAhNhC,IAAAhD,EAiNQ,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,gBACRC,OAAQ,CAAC,GAEXsB,MAIR,CAaO,WAAA4E,CACL3J,EAA0B,IAE1B,OAAO,IAAIkJ,QAAQ,CAACC,EAASC,KACvB,IAACtK,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKJ,QAAwB,IAApB1C,EAAQU,UAAqD,iBAApBV,EAAQU,SAAwBV,EAAQU,SAAW,IAAMwJ,OAAOC,UAAUnK,EAAQU,UACvH,MAAAtC,EACJD,EAAgBmL,eAChB,iBAIJ,QAA0B,IAAtBtJ,EAAQoK,YAAyD,iBAAtBpK,EAAQoK,WAA0BpK,EAAQoK,WAAa,IAAMF,OAAOC,UAAUnK,EAAQoK,YAC7H,MAAAhM,EACJD,EAAgBmL,eAChB,mBAIJ,MAAMvE,EAA2B,CAC/BlB,QAAUmG,IACRb,EAAQa,IAEVlG,KAAOmG,IACL,MAAMI,EAA4B,CAChCC,WAAY,EACZC,cAAeN,EAAI3L,QACnBkM,SAAU,IAEJ/F,QAAAjG,MAAM,QAAS6L,GACvBjB,EAAOiB,IAET3E,SAAU,QAMP5G,KAAA6D,QAAQC,OAAOkC,MAAM,KApRhC,IAAAhD,EAqRQ,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,cACRC,OAAQgH,EAAK,CAAA,EAAAzK,IAEf+E,MAIR,CAOO,OAAA6E,GACL,OAAO,IAAIV,QAAQ,CAACC,EAASC,KAC3B,MAAMrE,EAA2B,CAC/BlB,QAAUmG,IACRb,EAAQa,IAEVlG,KAAOmG,IACLb,EAAOa,KAGP,IAACnL,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAGC5D,KAAA6D,QAAQC,OAAOkC,MAAM,KArThC,IAAAhD,EAsTQ,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,UACRC,OAAQ,CAAC,GAEXsB,MAIR,gYC4TW,MAAA2F,EAAc,IAvf3B,MAAA,WAAA9L,GACE+L,EAAA7L,KAAgB,OAAO,SACvB6L,EAAA7L,KAAgB,UAAU,SAClBD,EAAAC,KAAA,UAAA,CAKD,OAAA2D,CAAQE,GACb7D,KAAK6D,QAAUA,EAEfA,EAAQC,OAAOR,eAAe,YAAatD,KAAK8L,UAAUvH,KAAKvE,OAC/D6D,EAAQC,OAAOR,eAAe,OAAQtD,KAAK+L,KAAKxH,KAAKvE,OACrD6D,EAAQC,OAAOR,eAAe,cAAetD,KAAKgM,YAAYzH,KAAKvE,OACnE6D,EAAQC,OAAOR,eAAe,eAAgBtD,KAAKiM,aAAa1H,KAAKvE,OACrE6D,EAAQC,OAAOR,eAAe,gBAAiBtD,KAAKkM,cAAc3H,KAAKvE,OACvE6D,EAAQC,OAAOR,eAAe,gBAAiBtD,KAAKmM,cAAc5H,KAAKvE,OACvE6D,EAAQC,OAAOR,eAAe,cAAetD,KAAKoM,YAAY7H,KAAKvE,OACnE6D,EAAQC,OAAOR,eAAe,mBAAoBtD,KAAKqM,iBAAiB9H,KAAKvE,MAC/E,CAkBO,IAAA+L,CACL7K,GAEA,OAAO,IAAIkJ,QAAQ,CAACC,EAASC,KA5KjC,IAAAtH,EA6KU,IAAChD,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKJ,QAAqB,IAAhB1C,EAAQoL,KAA4C,iBAAhBpL,EAAQoL,UAAsC,IAAhBpL,EAAQoL,MAAsB,CAAC,KAAM,OAAOC,SAASrL,EAAQoL,KAC5H,MAAAhN,EACJD,EAAgBmL,eAChB,cAIJ,QAA+B,IAA3BtJ,EAAQsL,gBAAkE,kBAA3BtL,EAAQsL,eACnD,MAAAlN,EACJD,EAAgBmL,eAChB,yBAKItJ,EAAAoL,IAAMpL,EAAQoL,KAAO,KACrBpL,EAAAsL,eAAiB,OAAAxJ,EAAQ9B,EAAAsL,iBAAkBxJ,EACnD,MAAMiD,EAA2B,CAC/BlB,QAAUmG,IACRb,EAAQa,IAEVlG,KAAOmG,IACLb,EACEhL,EAAkBD,EAAgB2E,aAAc,OAAQmH,KAG5DvE,SAAU,KA/MlB5D,IAAAA,EAgNU,OAAAA,EAAA9B,EAAQ0F,WAAR5D,EAAA2D,KAAAzF,KAIClB,KAAA6D,QAAQC,OAAOkC,MAAM,KApNhChD,IAAAA,EAqNQ,OAAAA,EAAAhD,KAAK6D,UAALb,EAAcc,OAAOW,WACnB,CACEC,OAAQ,OACRC,OAAQgH,EAAK,CAAA,EAAAzK,IAEf+E,MAIR,CAKO,SAAA6F,CAAU5K,GACf,OAAO,IAAIkJ,QAAQ,CAACC,EAASC,KACvB,IAACtK,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKA,IAAC1C,EAAQuL,IACL,MAAAnN,EACJD,EAAgBuE,uBAChB,cAKA,GAAuB,iBAAhB1C,EAAQuL,MAAqBvL,EAAQuL,IAAIlD,OAC5C,MAAAjK,EACJD,EAAgBuE,uBAChB,cAIJ,MAAMqC,EAA2B,CAC/BlB,QAAUmG,IACAvF,QAAAvC,IAAI,QAAS8H,GAMrBb,EAL6B,CAC3B9K,KAAM,EACNC,QAAS,OACT2D,KAAM+H,KAIVlG,KAAOmG,IACL,MAAMI,EAAuB,CAC3BhM,KAAM,EACNC,QAAS,OACT2D,KAAMgI,GAEAxF,QAAAjG,MAAM,QAAS6L,GACvBjB,EAAOiB,IAET3E,SAAU,KA/QlB,IAAA5D,EAgRU,OAAAA,EAAA9B,EAAQ0F,WAAR5D,EAAA2D,KAAAzF,KAKClB,KAAA6D,QAAQC,OAAOkC,MAAM,KArRhC,IAAAhD,EAsRQ,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,YACRC,OAAQ,CAAE8H,IAAKvL,EAAQuL,MAEzBxG,MAIR,CAOO,WAAA+F,CAAY9K,EAA8B,IAC/C,OAAO,IAAIkJ,QAAQ,CAACC,EAASC,KACvB,IAACtK,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKJ,QAAsB,IAAlB1C,EAAQwL,QAAiD,iBAAlBxL,EAAQwL,OAAsBxL,EAAQwL,OAAS,IAAMtB,OAAOC,UAAUnK,EAAQwL,QACjH,MAAApN,EACJD,EAAgBuE,uBAChB,gBAIE,MAAA+I,EAAkB,CAAC,SAAU,SACnC,GAAKzL,EAAQ0L,aAAenE,MAAMoE,QAAQ3L,EAAQ0L,aAAiB1L,EAAQ0L,YAA4C,IAA9B1L,EAAQ0L,WAAW3K,OACpG,MAAA3C,EACJD,EAAgBuE,uBAChB,qBAIA,GAAA1C,EAAQ0L,YAAc1L,EAAQ0L,WAAWE,KAAa9L,IAAC2L,EAAgBJ,SAASvL,IAC5E,MAAA1B,EACJD,EAAgBuE,uBAChB,qBAKI1C,EAAAwL,MAAQxL,EAAQwL,OAAS,EACjCxL,EAAQ0L,WAAa1L,EAAQ0L,YAAc,CAAC,SAAU,SACtD,MAAM3G,EAA2B,CAC/BlB,QAAUmG,IACAb,EAAAa,GAAO,CAAE6B,UAAW,GAAIC,cAAe,MAEjDhI,KAAOmG,IACGxF,QAAAjG,MAAM,UAAWyL,GACzBb,EAAOa,IAETvE,SAAU,QAKP5G,KAAA6D,QAAQC,OAAOkC,MAAM,KAtVhC,IAAAhD,EAuVQ,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,cACRC,OAAQzD,GAEV+E,MAIR,CAYO,YAAAgG,CAAa/K,GAClB,OAAO,IAAIkJ,QAAQ,CAACC,EAASC,KA7WjC,IAAAtH,EA8WU,IAAChD,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKJ,IAAK1C,EAAQ+L,OAASxE,MAAMoE,QAAQ3L,EAAQ+L,OAAiC,IAAxB/L,EAAQ+L,KAAKhL,OAC1D,MAAA3C,EACJD,EAAgBuE,uBAChB,eAKI1C,EAAAgM,QAAUhM,EAAQgM,SAAW,EACrC,MAAMjH,EAA2B,CAC/BlB,QAAUmG,IACRb,EAAQa,IAEVlG,KAAOmG,IACLb,EAAOa,IAETvE,SAAU,QAIZ,OAAA5D,EAAAhD,KAAK6D,UAALb,EAAcc,OAAOkC,MAAM,KA1YjChD,IAAAA,EA2YQ,OAAAA,EAAAhD,KAAK6D,UAALb,EAAcc,OAAOW,WACnB,CACEC,OAAQ,eACRC,OAAQzD,GAEV+E,MAIR,CAOO,aAAAiG,CAAchL,GACnB,OAAO,IAAIkJ,QAAQ,CAACC,EAASC,KA5ZjC,IAAAtH,EA6ZU,IAAChD,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAIJ,IAAK1C,EAAQ6L,YAActE,MAAMoE,QAAQ3L,EAAQ6L,YAA2C,IAA7B7L,EAAQ6L,UAAU9K,OACzE,MAAA3C,EACJD,EAAgBuE,uBAChB,oBAKJ,QAA8B,IAA1B1C,EAAQiM,gBAAiE,iBAA1BjM,EAAQiM,eAA8BjM,EAAQiM,cAAgB,GAAKjM,EAAQiM,cAAgB,IAAM/B,OAAOC,UAAUnK,EAAQiM,gBACrK,MAAA7N,EACJD,EAAgBuE,uBAChB,wBAKI1C,EAAAiM,cAAgB,OAAAnK,EAAQ9B,EAAAiM,eAAiBnK,EAAA,EACjD,MAAMiD,EAA2B,CAC/BlB,QAAUmG,IACRb,EAAQa,GAAO,CAAE6B,UAAW,MAE9B/H,KAAOmG,IACGxF,QAAAjG,MAAM,UAAWyL,GACzBb,EAAOa,IAETvE,SAAU,QAKP5G,KAAA6D,QAAQC,OAAOkC,MAAM,KAlchChD,IAAAA,EAmcQ,OAAAA,EAAAhD,KAAK6D,UAALb,EAAcc,OAAOW,WACnB,CACEC,OAAQ,gBACRC,OAAQzD,GAEV+E,MAIR,CAOO,aAAAkG,CAAcjL,GACnB,OAAO,IAAIkJ,QAAQ,CAACC,EAASC,KApdjC,IAAAtH,EAqdU,IAAChD,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAIA,IAAC1C,EAAQkM,UAAwC,iBAArBlM,EAAQkM,WAA0BlM,EAAQkM,SAAS7D,OAC3E,MAAAjK,EACJD,EAAgBuE,uBAChB,mBAKJ,QAA8B,IAA1B1C,EAAQiM,gBAAiE,iBAA1BjM,EAAQiM,eAA8BjM,EAAQiM,cAAgB,GAAKjM,EAAQiM,cAAgB,IAAM/B,OAAOC,UAAUnK,EAAQiM,gBACrK,MAAA7N,EACJD,EAAgBuE,uBAChB,wBAKI1C,EAAAiM,cAAgB,OAAAnK,EAAQ9B,EAAAiM,eAAiBnK,EAAA,EACjD,MAAMiD,EAA2B,CAC/BlB,QAAUmG,IACRb,EAAQa,GAAO,CAAEkC,SAAU,MAE7BpI,KAAOmG,IACGxF,QAAAjG,MAAM,UAAWyL,GACzBb,EAAOa,IAETvE,SAAU,QAKP5G,KAAA6D,QAAQC,OAAOkC,MAAM,KA1fhChD,IAAAA,EA2fQ,OAAAA,EAAAhD,KAAK6D,UAALb,EAAcc,OAAOW,WACnB,CACEC,OAAQ,gBACRC,OAAQzD,GAEV+E,MAIR,CAeO,WAAAmG,CAAYlL,EAA8B,IAC/C,OAAO,IAAIkJ,QAAQ,CAACC,EAASC,KAphBjC,IAAAtH,EAAAwD,EAqhBU,IAACxG,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKE,MAAA+I,EAAkB,CAAC,SAAU,SACnC,GAAKzL,EAAQ0L,aAAenE,MAAMoE,QAAQ3L,EAAQ0L,aAAiB1L,EAAQ0L,YAA4C,IAA9B1L,EAAQ0L,WAAW3K,OACpG,MAAA3C,EACJD,EAAgBuE,uBAChB,qBAIA,GAAA1C,EAAQ0L,YAAc1L,EAAQ0L,WAAWE,KAAa9L,IAAC2L,EAAgBJ,SAASvL,IAC5E,MAAA1B,EACJD,EAAgBuE,uBAChB,qBAOJ,IAAIyJ,EAAqB,EAIzB,GALc,0BAA0BpG,KAAKxB,UAAUD,aAGhC6H,EAAA,SAEK,IAAxBnM,EAAQoM,cAA6D,iBAAxBpM,EAAQoM,aAA4BpM,EAAQoM,YAAcD,GAAsBnM,EAAQoM,YAlcpH,KAkcyJlC,OAAOC,UAAUnK,EAAQoM,cAC/L,MAAAhO,EACJD,EAAgBuE,uBAChB,sBAKJ,QAA8B,IAA1B1C,EAAQiM,gBAAiE,iBAA1BjM,EAAQiM,eAA8BjM,EAAQiM,cAAgB,GAAKjM,EAAQiM,cAAgB,IAAM/B,OAAOC,UAAUnK,EAAQiM,gBACrK,MAAA7N,EACJD,EAAgBuE,uBAChB,wBAKJ1C,EAAQ0L,WAAa1L,EAAQ0L,YAAc,CAAC,QAAS,UAC7C1L,EAAAoM,YAAc,OAAAtK,EAAQ9B,EAAAoM,aAAetK,EAndxB,GAodb9B,EAAAiM,cAAc,OAAA3G,EAAQtF,EAAAiM,eAAiB3G,EAAA,EAC/C,MAAMP,EAA2B,CAC/BlB,QAAUmG,IACRb,EAAQa,GAAO,CAAEkC,SAAU,GAAIG,SAAU,EAAGC,KAAM,EAAGC,OAAQ,EAAGC,MAAO,KAEzE1I,KAAOmG,IACGxF,QAAAjG,MAAM,UAAWyL,GACzBb,EAAOa,IAETvE,SAAU,QAKP5G,KAAA6D,QAAQC,OAAOkC,MAAM,KAnlBhChD,IAAAA,EAolBQ,OAAAA,EAAAhD,KAAK6D,UAALb,EAAcc,OAAOW,WACnB,CACEC,OAAQ,cACRC,OAAQzD,GAEV+E,MAIR,CASO,gBAAAoG,CAAiB/L,GAClB,IAACN,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKC5D,KAAA6D,QAAQC,OAAOkC,MAAM,KA/mB9B,IAAAhD,EAgnBM,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOxB,cACnB,mBACCjC,IACUC,EAAAD,EAAM8C,KAAOyC,KAAK8D,MAAMrJ,EAAM8C,MAAQ,CAAA,MAIvD,gYChKW,MAAAwK,EAAiB,IA5X9B,MAAA,WAAA7N,GACE8N,EAAA5N,KAAgB,OAAO,YACvB4N,EAAA5N,KAAgB,UAAU,SAClBD,EAAAC,KAAA,UAAA,CAED,OAAA2D,CAAQE,GACb7D,KAAK6D,QAAUA,EACfA,EAAQC,OAAOR,eAAe,aAActD,KAAK6N,WAAWtJ,KAAKvE,OACjE6D,EAAQC,OAAOR,eAAe,aAActD,KAAK8N,WAAWvJ,KAAKvE,OACjE6D,EAAQC,OAAOR,eAAe,WAAYtD,KAAK+N,SAASxJ,KAAKvE,OAC7D6D,EAAQC,OAAOR,eAAe,eAAgBtD,KAAKgO,aAAazJ,KAAKvE,OACrE6D,EAAQC,OAAOR,eACb,mBACAtD,KAAKiO,iBAAiB1J,KAAKvE,OAE7B6D,EAAQC,OAAOR,eAAe,WAAYtD,KAAKkO,SAAS3J,KAAKvE,OAC7D6D,EAAQC,OAAOR,eAAe,uBAAwBtD,KAAKmO,qBAAqB5J,KAAKvE,OACrF6D,EAAQC,OAAOR,eAAe,mBAAoBtD,KAAKoO,iBAAiB7J,KAAKvE,MAC/E,CAEO,gBAAAiO,CAAiB/M,GACtB,OAAO,IAAIkJ,QAAQ,CAACC,EAASC,KAhHjC,IAAAtH,EAiHU,IAAChD,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKJ,QAA0B,IAAtB1C,EAAQmN,WAAwD,kBAAtBnN,EAAQmN,UAC9C,MAAA/O,EACJD,EAAgBmL,eAChB,sBAKJ,QAAsB,IAAlBtJ,EAAQoN,OAAgD,iBAAlBpN,EAAQoN,MAC1C,MAAAhP,EACJD,EAAgBmL,eAChB,gBAIJ,QAC8B,IAA5BtJ,EAAQqN,kBAC4B,iBAA5BrN,EAAQqN,kBACb,oBAAoBtH,KAAK/F,EAAQqN,kBAE9B,MAAAjP,EACJD,EAAgBmL,eAChB,0BAIJ,QAAsB,IAAlBtJ,EAAQsN,OAAgD,kBAAlBtN,EAAQsN,MAC1C,MAAAlP,EACJD,EAAgBmL,eAChB,gBAKItJ,EAAAmN,UAAY,OAAArL,EAAQ9B,EAAAmN,YAAarL,EACzC,MAAMiD,EAA2B,CAC/BlB,QAAS,UAGTC,KAAOmG,IACLb,EACEhL,EACED,EAAgB2E,aAChB,UACAmH,KAINvE,SAAU,QAGP5G,KAAA6D,QAAQC,OAAOkC,MAAM,KA5KhChD,IAAAA,EA6KQ,OAAAA,EAAAhD,KAAK6D,UAALb,EAAcc,OAAOW,WACnB,CACEC,OAAQ,mBACRC,OAAQgH,EAAK,CAAA,EAAAzK,IAEf+E,MAIR,CAEQ,QAAAwI,CAASvN,EAAuBF,GAClC,IAAChB,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKJ,IAAK1C,IAAYA,EAAQuL,IACjB,MAAAnN,EACJD,EAAgBmL,eAChB,gBAIA,GAAuB,iBAAhBtJ,EAAQuL,MAAqBvL,EAAQuL,IAAIlD,OAC5C,MAAAjK,EACJD,EAAgBmL,eAChB,aAIJ,MAAMvE,EAA2B,CAC/BlB,QAAUmG,IAhNhB,IAAAlI,EAiNQ,MAAMuI,EAAuB,CAC3BhM,KAAMF,EAAgBqP,QACtBlP,QAAS,OACT2D,KAAM+H,GAER,OAAAlI,EAAA9B,EAAQ6D,UAAU/B,EAAA2D,KAAAzF,EAAAqK,IAGpBvG,KAAOmG,IAzNb,IAAAnI,EA0NQ,MAAMuI,EAAoB,CACxBhM,KAAMF,EAAgB2E,aACtBxE,QAAS,OACTC,QAAS0L,EACT5H,KAAM,IAER,OAAAP,EAAA9B,EAAQ8D,OAAOhC,EAAA2D,KAAAzF,EAAAqK,IAGjB3E,SAAU,KAnOhB,IAAA5D,EAoOQ,OAAAA,EAAA9B,EAAQ0F,WAAR5D,EAAA2D,KAAAzF,KAIClB,KAAA6D,QAAQC,OAAOkC,MAAM,KAxO9B,IAAAhD,EAyOM,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ1D,GAAQ,aAChB2D,OAAQgH,EAAK,CAAA,EAAAzK,IAEf+E,IAGN,CAEO,UAAA4H,CAAW3M,GACXlB,KAAAyO,SAASvN,EAAS,aACzB,CAEO,UAAA4M,CAAW5M,GAEXlB,KAAAyO,SAASvN,EAAS,aACzB,CAEO,QAAA6M,CAAS7M,GAETlB,KAAAyO,SAASvN,EAAS,WACzB,CAEO,YAAA8M,CAAa9M,GAjQtB,IAAA8B,EAmQQ,IAAChD,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKJ,QAAsB,IAAlB1C,EAAQyN,QAAiD,iBAAlBzN,EAAQyN,OAAsBzN,EAAQyN,OAAS,IAAMvD,OAAOC,UAAUnK,EAAQyN,QACjH,MAAArP,EACJD,EAAgBmL,eAChB,gBAKItJ,EAAAyN,MAAQ,OAAA3L,EAAQ9B,EAAAyN,OAAS3L,EAAA,EACjC,MAAMiD,EAA2B,CAC/BlB,QAAUmG,IArRhBlI,IAAAA,EAsRQ,MAAMuI,EAAuB,CAC3BhM,KAAMF,EAAgBqP,QACtBlP,QAAS,OACT2D,KAAM+H,GAER,OAAAlI,EAAA9B,EAAQ6D,UAAR/B,EAAA2D,KAAkBzF,EAAAqK,IAGpBvG,KAAOmG,IA9RbnI,IAAAA,EA+RQ,MAAMuI,EAAoB,CACxBhM,KAAMF,EAAgB2E,aACtBxE,QAAS,OACTC,QAAS0L,EACT5H,KAAM,IAER,OAAAP,EAAA9B,EAAQ8D,OAARhC,EAAA2D,KAAezF,EAAAqK,IAGjB3E,SAAU,KAxShB5D,IAAAA,EAySQ,OAAAA,EAAA9B,EAAQ0F,WAAR5D,EAAA2D,KAAAzF,KAIClB,KAAA6D,QAAQC,OAAOkC,MAAM,KA7S9BhD,IAAAA,EA8SM,OAAAA,EAAAhD,KAAK6D,UAALb,EAAcc,OAAOW,WACnB,CACEC,OAAQ,eACRC,OAAQzD,GAEV+E,IAGN,CAOa,QAAAiI,CAAShN,GAAyC0N,SAAA5O,OAAA,OAAA,YAC7D,OAAO,IAAIoK,QAAQ,CAACC,EAASC,KACvB,IAACtK,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKA,IAAC1C,EAAQuL,IACL,MAAAnN,EACJD,EAAgBmL,eAChB,gBAIA,GAAuB,iBAAhBtJ,EAAQuL,MAAqBvL,EAAQuL,IAAIlD,OAC5C,MAAAjK,EACJD,EAAgBmL,eAChB,aAKJ,QAA4B,IAAxBtJ,EAAQ2N,aAA4D,kBAAxB3N,EAAQ2N,YAChD,MAAAvP,EACJD,EAAgBmL,eAChB,sBAKItJ,EAAA2N,YAAc3N,EAAQ2N,cAAe,EAC7C,MAAM5I,EAA2B,CAC/BlB,QAAS,UAGTC,KAAOmG,IACLb,EACEhL,EACED,EAAgB2E,aAChB,SACAmH,KAINvE,SAAU,QAGP5G,KAAA6D,QAAQC,OAAOkC,MAAM,KA/WhC,IAAAhD,EAgXQ,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,WACRC,OAAQgH,EAAK,CAAA,EAAAzK,IAEf+E,MAGL,yMACH,CAOO,oBAAAkI,CAAqB1B,GAC1B,OAAO,IAAIrC,QAAQ,CAACC,EAASC,KACvB,IAACtK,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKA,IAAC6I,GAAsB,iBAARA,IAAqBA,EAAIlD,OACpC,MAAAjK,EACJD,EAAgBmL,eAChB,cAIJ,MAAMvE,EAA2B,CAC/BlB,QAAS,UAGTC,KAAOmG,IACLb,EACEhL,EACED,EAAgB2E,aAChB,WACAmH,KAINvE,SAAU,QAGP5G,KAAA6D,QAAQC,OAAOkC,MAAM,KAjahC,IAAAhD,EAkaQ,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,uBACRC,OAAQ,CAAE8H,QAEZxG,MAIR,CAMO,gBAAAmI,GACL,OAAO,IAAIhE,QAAQ,CAACC,EAASC,KACvB,IAACtK,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAIJ,MAAMqC,EAA2B,CAC/BlB,QAAS,UAGTC,KAAOmG,IACLb,EACEhL,EACED,EAAgB2E,aAChB,SACAmH,KAINvE,SAAU,QAGP5G,KAAA6D,QAAQC,OAAOkC,MAAM,KA1chC,IAAAhD,EA2cQ,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,mBACRC,OAAQ,CAAC,GAEXsB,MAIR,mKChNW,MAAA6I,EAAc,IA9N3B,MAAA,WAAAhP,GACEiP,EAAA/O,KAAgB,OAAO,SACvB+O,EAAA/O,KAAgB,UAAU,SAClBD,EAAAC,KAAA,UAAA,CAED,OAAA2D,CAAQE,GACb7D,KAAK6D,QAAUA,EACfA,EAAQC,OAAOR,eAAe,YAAatD,KAAKgP,UAAUzK,KAAKvE,OAC/D6D,EAAQC,OAAOR,eAAe,YAAatD,KAAKiP,UAAU1K,KAAKvE,OAC/D6D,EAAQC,OAAOR,eAAe,cAAetD,KAAKkP,YAAY3K,KAAKvE,OACnE6D,EAAQC,OAAOR,eAAe,cAAetD,KAAKmP,YAAY5K,KAAKvE,MAErE,CAEO,WAAAmP,GACL,OAAO,IAAI/E,QAAQ,CAACC,EAASC,KACvB,IAACtK,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAIJ,MAAMqC,EAA2B,CAC/BlB,QAAUqK,IACR/E,EAAQ+E,IAEVpK,KAAOmG,IACL,MAAMI,EAAoB,CACxBhM,KAAMF,EAAgB2E,aACtBxE,QAAS,OACTC,QAAS0L,EACT5H,KAAM,IAER+G,EAAOiB,IAET3E,SAAU,QAKP5G,KAAA6D,QAAQC,OAAOkC,MAAM,KA/EhC,IAAAhD,EAgFQ,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,cACRC,OAAQ,CAAC,GAEXsB,MAIR,CACO,WAAAiJ,CAAYhO,GACjB,OAAO,IAAIkJ,QAAQ,CAACC,EAASC,KACvB,IAACtK,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKJ,QAAwB,IAApB1C,EAAQmO,SAAoD,iBAApBnO,EAAQmO,QAC5C,MAAA/P,EACJD,EAAgBmL,eAChB,kBAKJ,MAAMvE,EAA2B,CAC/BlB,QAAUqK,IACR/E,EAAQ+E,IAEVpK,KAAOmG,IACL,MAAMI,EAAoB,CACxBhM,KAAMF,EAAgB2E,aACtBxE,QAAS,OACTC,QAAS0L,EACT5H,KAAM,IAER+G,EAAOiB,IAET3E,SAAU,QAKP5G,KAAA6D,QAAQC,OAAOkC,MAAM,KA9HhC,IAAAhD,EA+HQ,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,cACRC,OAAQzD,GAEV+E,MAIR,CAOO,SAAA+I,CAAU9N,GACf,OAAO,IAAIkJ,QAAQ,CAACC,EAASC,KACvB,IAACtK,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAIC,QAAiB,IAAjB1C,EAAQF,MAA8C,iBAAjBE,EAAQF,WAAwC,IAAjBE,EAAQF,OAAuB,CAAC,OAAQ,UAAW,OAAQ,aAAauL,SAASrL,EAAQF,MAC1J,MAAA1B,EACJD,EAAgBmL,eAChB,eAIA,IAACtJ,EAAQmO,QACL,MAAA/P,EACJD,EAAgBmL,eAChB,oBAIA,GAA2B,iBAApBtJ,EAAQmO,QACX,MAAA/P,EACJD,EAAgBmL,eAChB,kBAIJ,QAAyB,IAArBtJ,EAAQqM,WAAuD,iBAArBrM,EAAQqM,UAAyBrM,EAAQqM,UAAY,IAAMnC,OAAOC,UAAUnK,EAAQqM,WAC1H,MAAAjO,EACJD,EAAgBmL,eAChB,mBAIJ,MAAMxJ,KAAEA,EAAAqO,QAAMA,EAAS9B,SAAAA,GAAarM,EAC9B+E,EAA2B,CAC/BlB,QAAUqK,IACR/E,EAAQ+E,IAEVpK,KAAOmG,IACL,MAAMI,EAAoB,CACxBhM,KAAMF,EAAgB2E,aACtBxE,QAAS,OACTC,QAAS0L,EACT5H,KAAM,IAER+G,EAAOiB,IAET3E,SAAU,QAKP5G,KAAA6D,QAAQC,OAAOkC,MAAM,KAvMhC,IAAAhD,EAwMQ,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,YACRC,OAAQ,CACN3D,KAAMA,GAAQ,OACdqO,UACA9B,SAAUA,GAAY,MAG1BtH,MAIR,CAOO,SAAAgJ,GACL,OAAO,IAAI7E,QAAQ,CAACC,EAASC,KACvB,IAACtK,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAIJ,MAAMqC,EAA2B,CAC/BlB,QAAUqK,IACR/E,EAAQ+E,IAEVpK,KAAOmG,IACL,MAAMI,EAAoB,CACxBhM,KAAMF,EAAgB2E,aACtBxE,QAAS,OACTC,QAAS0L,EACT5H,KAAM,IAER+G,EAAOiB,IAET3E,SAAU,QAKP5G,KAAA6D,QAAQC,OAAOkC,MAAM,KAvPhC,IAAAhD,EAwPQ,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,YACRC,OAAQ,CAAC,GAEXsB,MAIR,mKC3KW,MAAAqJ,EAAiB,IAnD9B,MAAA,WAAAxP,GACEyP,EAAAvP,KAAgB,OAAO,YACvBuP,EAAAvP,KAAgB,UAAU,SAClBD,EAAAC,KAAA,UAAA,CAED,OAAA2D,CAAQE,GACb7D,KAAK6D,QAAUA,EACfA,EAAQC,OAAOR,eAAe,cAAetD,KAAKwP,YAAYjL,KAAKvE,MAErE,CAEO,WAAAwP,GACL,OAAO,IAAIpF,QAAQ,CAACC,EAASC,KACvB,IAACtK,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAIJ,MAAMqC,EAA2B,CAC/BlB,QAAU5B,IACRkH,EAAQlH,IAEV6B,KAAOmG,IACL,MAAMI,EAAoB,CACxBhM,KAAMF,EAAgB2E,aACtBxE,QAAS,OACTC,QAAS0L,EACT5H,KAAM,IAER+G,EAAOiB,IAET3E,SAAU,QAKP5G,KAAA6D,QAAQC,OAAOkC,MAAM,KAzEhC,IAAAhD,EA0EQ,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,cACRC,OAAQ,CAAC,GAEXsB,MAIR,mKCg6BW,MAAAwJ,EAAY,IAv2BzB,MAAA,WAAA3P,GACE4P,EAAA1P,KAAgB,OAAO,aACvB0P,EAAA1P,KAAgB,UAAU,SAClBD,EAAAC,KAAA,UAAA,CAED,OAAA2D,CAAQE,GACb7D,KAAK6D,QAAUA,EAEfA,EAAQC,OAAOR,eACb,uBACAtD,KAAK2P,qBAAqBpL,KAAKvE,OAEjC6D,EAAQC,OAAOR,eACb,wBACAtD,KAAK4P,sBAAsBrL,KAAKvE,OAElC6D,EAAQC,OAAOR,eACb,iCACAtD,KAAK6P,+BAA+BtL,KAAKvE,OAE3C6D,EAAQC,OAAOR,eACb,gCACAtD,KAAK8P,8BAA8BvL,KAAKvE,OAE1C6D,EAAQC,OAAOR,eACb,yBACAtD,KAAK+P,uBAAuBxL,KAAKvE,OAErC6D,EAAQC,OAAOR,eACd,0BACAtD,KAAKgQ,wBAAwBzL,KAAKvE,OAIjC6D,EAAQC,OAAOR,eACb,8BACAtD,KAAKiQ,4BAA4B1L,KAAKvE,OAExC6D,EAAQC,OAAOR,eACb,6BACAtD,KAAKkQ,2BAA2B3L,KAAKvE,OAGvC6D,EAAQC,OAAOR,eACb,mBACAtD,KAAKmQ,iBAAiB5L,KAAKvE,OAE7B6D,EAAQC,OAAOR,eACb,sBACAtD,KAAKoQ,oBAAoB7L,KAAKvE,OAEhC6D,EAAQC,OAAOR,eACb,8BACAtD,KAAKqQ,4BAA4B9L,KAAKvE,OAExC6D,EAAQC,OAAOR,eACb,uBACAtD,KAAKsQ,qBAAqB/L,KAAKvE,OAGjC6D,EAAQC,OAAOR,eACb,iCACAtD,KAAKuQ,+BAA+BhM,KAAKvE,OAG3C6D,EAAQC,OAAOR,eACb,kCACAtD,KAAKwQ,gCAAgCjM,KAAKvE,OAE5C6D,EAAQC,OAAOR,eACb,8BACAtD,KAAKyQ,4BAA4BlM,KAAKvE,OAExC6D,EAAQC,OAAOR,eACb,+BACAtD,KAAK0Q,6BAA6BnM,KAAKvE,MAE3C,CAgBO,4BAAA0Q,CAA6BpQ,GAC9B,IAACN,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAGC5D,KAAA6D,QAAQC,OAAOkC,MAAM,KAhP9B,IAAAhD,EAiPM,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOf,eACnB,+BACA,KACEzC,GAAYA,OAIpB,CAmBO,2BAAAmQ,CACLnQ,GAKI,IAACN,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAGC5D,KAAA6D,QAAQC,OAAOkC,MAAM,KAvR9B,IAAAhD,EAwRM,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOxB,cACnB,8BACCjC,IACCC,EAASD,EAAM8C,SAIvB,CAeO,+BAAAqN,CAAgClQ,GACjC,IAACN,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAGC5D,KAAA6D,QAAQC,OAAOkC,MAAM,KArT9B,IAAAhD,EAsTM,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOf,eACnB,iCACA,KACEzC,GAAYA,OAIpB,CAmBO,8BAAAiQ,CACLjQ,GAOI,IAACN,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAGC5D,KAAA6D,QAAQC,OAAOkC,MAAM,KA9V9B,IAAAhD,EA+VM,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOxB,cACnB,iCACCjC,IACCC,EAASD,EAAM8C,SAIvB,CAqBO,0BAAA+M,CACLhP,GAEI,IAAClB,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAIA,IAAC1C,EAAQyP,WAAazP,EAAQ0P,YAAc1P,EAAQ2P,iBAChD,MAAAvR,EACJD,EAAgBmL,eAChB,WAGJ,MAAMvE,EAA2B,CAC/BlB,QAAU5B,IA5YhB,IAAAH,EA6YQ,OAAAA,EAAA9B,EAAQ6D,UAAU/B,EAAA2D,KAAAzF,EAAAiC,IAEpB6B,KAAM9D,EAAQ8D,KACd4B,SAAU1F,EAAQ0F,UAEf5G,KAAA6D,QAAQC,OAAOkC,MAAM,KAlZ9B,IAAAhD,EAmZM,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,6BACRC,OAAQzD,GAEV+E,IAGN,CAkBO,2BAAAgK,CACL/O,GA9aJ,IAAA8B,EAgbQ,IAAChD,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAIA,KAAC1C,EAAQyP,UAAazP,EAAQ0P,WAAc1P,EAAQ2P,kBAAqB3P,EAAQmI,OAC7E,MAAA/J,EACJD,EAAgBmL,eAChB,WAIA,GAA4B,iBAArBtJ,EAAQyP,SACX,MAAArR,EACJD,EAAgB4L,WAChB,kBAIA,GAA6B,iBAAtB/J,EAAQ0P,UACX,MAAAtR,EACJD,EAAgB4L,WAChB,mBAIA,GAAoC,iBAA7B/J,EAAQ2P,iBACX,MAAAvR,EACJD,EAAgB4L,WAChB,0BAIJ,GAC2B,iBAAlB/J,EAAQmI,QACd,iBAAiBpC,KAAK/F,EAAQmI,SAC/B,OAAArG,EAAA9B,EAAQmI,YAAR,EAAArG,EAAef,QAAS,IAElB,MAAA3C,EACJD,EAAgB4L,WAChB,eAIJ,MAAMhF,EAA2B,CAC/BlB,QAAS7D,EAAQ6D,QACjBC,KAAM9D,EAAQ8D,KACd4B,SAAU1F,EAAQ0F,UAEf5G,KAAA6D,QAAQC,OAAOkC,MAAM,KAne9BhD,IAAAA,EAoeM,OAAAA,EAAAhD,KAAK6D,UAALb,EAAcc,OAAOW,WACnB,CACEC,OAAQ,8BACRC,OAAQzD,GAEV+E,IAGN,CAoBO,oBAAAqK,CAAqBpP,GACtB,IAAClB,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKA,IAAC1C,EAAQyP,SACL,MAAArR,EACJD,EAAgBmL,eAChB,qBAKA,GAA4B,iBAArBtJ,EAAQyP,SACX,MAAArR,EACJD,EAAgB4L,WAChB,kBAIJ,MAAMhF,EAA2B,CAC/BlB,QAAU5B,IAzhBhB,IAAAH,EA0hBQ,OAAAA,EAAA9B,EAAQ6D,UAAU/B,EAAA2D,KAAAzF,EAAAiC,IAEpB6B,KAAM9D,EAAQ8D,KACd4B,SAAU1F,EAAQ0F,UAEf5G,KAAA6D,QAAQC,OAAOkC,MAAM,KA/hB9B,IAAAhD,EAgiBM,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,uBACRC,OAAQzD,GAEV+E,IAGN,CAmBO,gBAAAkK,CAAiBjP,GAClB,IAAClB,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKA,IAAC1C,EAAQyP,SACL,MAAArR,EACJD,EAAgBmL,eAChB,qBAIJ,MAAMvE,EAA2B,CAC/BlB,QAAS7D,EAAQ6D,QACjBC,KAAM9D,EAAQ8D,KACd4B,SAAU1F,EAAQ0F,UAEf5G,KAAA6D,QAAQC,OAAOkC,MAAM,KAhlB9B,IAAAhD,EAilBM,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,mBACRC,OAAQzD,GAEV+E,IAGN,CAkBO,mBAAAmK,CAAoBlP,GACrB,IAAClB,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKA,IAAC1C,EAAQyP,SACL,MAAArR,EACJD,EAAgBmL,eAChB,qBAIA,GAA4B,iBAArBtJ,EAAQyP,SACX,MAAArR,EACJD,EAAgB4L,WAChB,kBAKJ,MAAMhF,EAA2B,CAC/BlB,QAAS7D,EAAQ6D,QACjBC,KAAM9D,EAAQ8D,KACd4B,SAAU1F,EAAQ0F,UAEf5G,KAAA6D,QAAQC,OAAOkC,MAAM,KAxoB9B,IAAAhD,EAyoBM,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,sBACRC,OAAQzD,GAEV+E,IAGN,CAoBO,2BAAAoK,CAA4BnP,GAC7B,IAAClB,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKJ,IAAK1C,EAAQyP,WAAazP,EAAQ0P,UAC1B,MAAAtR,EACJD,EAAgBmL,eAChB,iCAIA,GAA4B,iBAArBtJ,EAAQyP,SACX,MAAArR,EACJD,EAAgB4L,WAChB,kBAIA,GAA6B,iBAAtB/J,EAAQ0P,UACX,MAAAtR,EACJD,EAAgB4L,WAChB,mBAKJ,MAAMhF,EAA2B,CAC/BlB,QAAU5B,IArsBhB,IAAAH,EAssBQ,OAAAA,EAAA9B,EAAQ6D,UAAU/B,EAAA2D,KAAAzF,EAAAiC,IAEpB6B,KAAOmG,IAxsBb,IAAAnI,EAysBI,OAAAA,EAAA9B,EAAQ8D,OAAOhC,EAAA2D,KAAAzF,EAAAiK,IAEbvE,SAAU1F,EAAQ0F,UAEf5G,KAAA6D,QAAQC,OAAOkC,MAAM,KA7sB9B,IAAAhD,EA8sBM,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,8BACRC,OAAQzD,GAEV+E,IAGN,CAiBO,uBAAA+J,CAAwB1P,GACzB,IAACN,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAGC5D,KAAA6D,QAAQC,OAAOkC,MAAM,KA9uB9B,IAAAhD,EA+uBM,OAAAA,EAAAhD,KAAK6D,UAALb,EAAcc,OAAOf,eAAe,0BAA2B,KAC7DzC,GAAYA,OAGlB,CAcO,sBAAAyP,CAAuBzP,GACxB,IAACN,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAGC5D,KAAA6D,QAAQC,OAAOkC,MAAM,KAxwB9B,IAAAhD,EAywBM,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOxB,cACnB,yBACCjC,IACUC,EAAAD,EAAM8C,KAAOyC,KAAK8D,MAAMrJ,EAAM8C,MAAQ,OAIvD,CAgBO,6BAAA2M,CAA8B5O,GAC/B,IAAClB,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAIJ,MAAMqC,EAA2B,CAC/BlB,QAAkB,MAAT7D,OAAS,EAAAA,EAAA6D,QAClBC,KAAe,MAAT9D,OAAS,EAAAA,EAAA8D,KACf4B,SAAmB,MAAT1F,OAAS,EAAAA,EAAA0F,UAEhB5G,KAAA6D,QAAQC,OAAOkC,MAAM,KA7yB9B,IAAAhD,EA8yBM,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,gCACRC,OAAQzD,GAEV+E,IAGN,CAkBO,8BAAA4J,CACL3O,EAAiD,IAE7C,IAAClB,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKJ,QACuB,IAArB1C,EAAQ4P,WACPrI,MAAMoE,QAAQ3L,EAAQ4P,WACK,iBAArB5P,EAAQ4P,SAET,MAAAxR,EACJD,EAAgBmL,eAChB,mBAIJ,QAAmC,IAA/BtJ,EAAQ6P,oBAA0E,kBAA/B7P,EAAQ6P,mBACvD,MAAAzR,EACJD,EAAgBmL,eAChB,6BAIJ,QAAyB,IAArBtJ,EAAQ8P,WAAuD,iBAArB9P,EAAQ8P,WAA0B5F,OAAOC,UAAUnK,EAAQ8P,WACjG,MAAA1R,EACJD,EAAgBmL,eAChB,mBAKItJ,EAAA8P,gBAAW9P,WAAS8P,WAAY,EACxC,MAAM/K,EAA2B,CAC/BlB,QAAkB,MAAT7D,OAAS,EAAAA,EAAA6D,QAClBC,KAAe,MAAT9D,OAAS,EAAAA,EAAA8D,KACf4B,SAAmB,MAAT1F,OAAS,EAAAA,EAAA0F,UAEhB5G,KAAA6D,QAAQC,OAAOkC,MAAM,KAn3B9B,IAAAhD,EAo3BM,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,iCACRC,OAAQzD,GAEV+E,IAGN,CAkBO,qBAAA2J,CAAsB1O,EAAiC,IACxD,IAAClB,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAIJ,MAAMqC,EAA2B,CAC/BlB,QAAS7D,EAAQ6D,QACjBC,KAAM9D,EAAQ8D,KACd4B,SAAU1F,EAAQ0F,UAGf5G,KAAA6D,QAAQC,OAAOkC,MAAM,KA55B9B,IAAAhD,EA65BM,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,wBACRC,OAAQzD,GAEV+E,IAGN,CAkBO,oBAAA0J,CAAqBzO,EAAgC,IAv7B9D,IAAA8B,EAw7BQ,IAAChD,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKJ,QAA0B,IAAtB1C,EAAQ+P,WAAwD,kBAAtB/P,EAAQ+P,UAC9C,MAAA3R,EACJD,EAAgB4L,WAChB,oBAKI/J,EAAA+P,UAAY,OAAAjO,EAAQ9B,EAAA+P,YAAajO,EACzC,MAAMiD,EAA2B,CAC/BlB,QAAS7D,EAAQ6D,QACjBC,KAAM9D,EAAQ8D,KACd4B,SAAU1F,EAAQ0F,UAGf5G,KAAA6D,QAAQC,OAAOkC,MAAM,KA/8B9BhD,IAAAA,EAg9BM,OAAAA,EAAAhD,KAAK6D,UAALb,EAAcc,OAAOW,WACnB,CACEC,OAAQ,uBACRC,OAAQzD,GAEV+E,IAGN,CAUO,mBAAAiL,CAAoB5Q,GACrB,IAACN,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAGC5D,KAAA6D,QAAQC,OAAOkC,MAAM,KAz+B9B,IAAAhD,EA0+BM,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOxB,cACnB,sBACCjC,IACCC,EAASD,EAAM8C,SAIvB,0hBCjwBa,MAAAgO,GAAA,IAzMf,MAAA,WAAArR,GACUC,GAAAC,KAAA,WACRoR,GAAApR,KAAgB,OAAO,WACvBoR,GAAApR,KAAgB,UAAU,QAAA,CACnB,OAAA2D,CAAQE,GACb7D,KAAK6D,QAAUA,EACfA,EAAQC,OAAOR,eAAe,aAActD,KAAKqR,WAAW9M,KAAKvE,OACjE6D,EAAQC,OAAOR,eAAe,iBAAkBtD,KAAKsR,eAAe/M,KAAKvE,OACzE6D,EAAQC,OAAOR,eAAe,aAActD,KAAKuR,WAAWhN,KAAKvE,OACjE6D,EAAQC,OAAOR,eAAe,iBAAkBtD,KAAKwR,eAAejN,KAAKvE,OACzE6D,EAAQC,OAAOR,eAAe,gBAAiBtD,KAAKyR,cAAclN,KAAKvE,MACzE,CAEQ,gBAAA0R,CAAiBxQ,GAChB,MAAA,CACL6D,QAAS7D,EAAQ6D,QACjBC,KAAM9D,EAAQ8D,KACd4B,SAAU1F,EAAQ0F,SAEtB,CAEc,iBAAA+K,CACZjN,EACAC,EACAsB,GACiB2I,OAAAA,GAAA5O,KAAA,KAAA,YACb,IAACA,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAIJ,OAAO,IAAIwG,QAAQ,CAACC,EAASC,KAxEjC,IAAAtH,EAyEM,OAAAA,EAAAhD,KAAK6D,UAALb,EAAcc,OAAOkC,MAAM,KAzEjChD,IAAAA,IA0EQ,OAAAA,EAAAhD,KAAK6D,UAALb,EAAcc,OAAOW,WACnB,CACEC,SACAC,0IAGGsB,UADL,CAEElB,QAAU6M,IACJ3L,EAAUlB,SAEZkB,EAAUlB,QAAQ6M,GAEpBvH,EAAQuH,IAEV5M,KAAOtF,IACDuG,EAAUjB,MACZiB,EAAUjB,KAAKtF,GAEjB4K,EAAO5K,YAKhB,EACH,CAQO,cAAA4R,CACLpQ,GA3GJ,IAAA8B,EA8GQ,IAAChD,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKJ,MAAM0I,EAAMpL,EAAQoL,IACpB,IAAKA,EACG,MAAAhN,EAAkBD,EAAgBuE,uBAAwB,gBAG9D,IAAC1C,EAAQiC,KACL,MAAA7D,EAAkBD,EAAgBmL,eAAgB,iBAItD,GAAe,iBAAR8B,EACH,MAAAhN,EAAkBD,EAAgBmL,eAAgB,cAG1D,GAA4B,iBAAjBtJ,EAAQiC,MAA6C,iBAAjBjC,EAAQiC,KAC/C,MAAA7D,EAAkBD,EAAgBmL,eAAgB,eAGtD,GAAwB,iBAAjBtJ,EAAQiC,MAA0D,IAArC0O,OAAO7I,KAAK9H,EAAQiC,MAAMlB,OAC1D,MAAA3C,EAAkBD,EAAgBmL,eAAgB,eAKpD,MAAAvE,EAAYjG,KAAK0R,iBAAiBxQ,GACxC,OAAA8B,EAAAhD,KAAK6D,UAALb,EAAcc,OAAOkC,MAAM,KA/I/BhD,IAAAA,EAgJM,OAAAA,EAAAhD,KAAK6D,UAALb,EAAcc,OAAOW,WACnB,CACEC,OAAQ,iBACRC,OAAQzD,GAEV+E,IAGN,CAEa,UAAAoL,CACXnQ,GACiB0N,OAAAA,GAAA5O,KAAA,KAAA,YAGjB,MAAMsM,EAAMpL,EAAQoL,IACpB,IAAKA,EACG,MAAAhN,EAAkBD,EAAgBuE,uBAAwB,gBAG9D,IAAC1C,EAAQiC,KACL,MAAA7D,EAAkBD,EAAgBmL,eAAgB,iBAItD,GAAe,iBAAR8B,EACH,MAAAhN,EAAkBD,EAAgBmL,eAAgB,cAG1D,GAA4B,iBAAjBtJ,EAAQiC,MAA6C,iBAAjBjC,EAAQiC,KAC/C,MAAA7D,EAAkBD,EAAgBmL,eAAgB,eAGtD,GAAwB,iBAAjBtJ,EAAQiC,MAA0D,IAArC0O,OAAO7I,KAAK9H,EAAQiC,MAAMlB,OAC1D,MAAA3C,EAAkBD,EAAgBmL,eAAgB,eAGpD,MAAAvE,EAAYjG,KAAK0R,iBAAiBxQ,GACjC,OAAAlB,KAAK2R,kBAAkB,aAAc,CAAErF,IAAKpL,EAAQoL,IAAKnJ,KAAMjC,EAAQiC,MAAQ8C,EAAS,EACjG,CAEO,cAAAuL,CACLtQ,GA1LJ,IAAA8B,EA4LQ,IAAChD,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAGJ,MAAM0I,EAAMpL,EAAQoL,IAEpB,IAAKA,EACG,MAAAhN,EAAkBD,EAAgBuE,uBAAwB,gBAG9D,GAAe,iBAAR0I,EACH,MAAAhN,EAAkBD,EAAgBmL,eAAgB,cAGpD,MAAAvE,EAAYjG,KAAK0R,iBAAiBxQ,GACjC,OAAA,OAAA8B,OAAKa,cAAL,EAAAb,EAAcc,OAAOoD,eAAe,iBAAkBhG,EAAS+E,EACxE,CAEa,UAAAsL,CACXrQ,GACiB0N,OAAAA,GAAA5O,KAAA,KAAA,YACjB,MAAMsM,EAAMpL,EAAQoL,IACpB,IAAKA,EACG,MAAAhN,EAAkBD,EAAgBuE,uBAAwB,gBAE9D,GAAe,iBAAR0I,EACH,MAAAhN,EAAkBD,EAAgBmL,eAAgB,cAEpD,MAAAvE,EAAYjG,KAAK0R,iBAAiBxQ,GACjC,OAAAlB,KAAK2R,kBAAkB,aAAc,CAAErF,IAAKpL,EAAQoL,KAAOrG,EAAS,EAC7E,CAOa,aAAAwL,CAAcvQ,GAAgD0N,OAAAA,GAAA5O,KAAA,KAAA,YACzE,MAAMsM,EAAMpL,EAAQoL,IACpB,IAAKA,EACG,MAAAhN,EAAkBD,EAAgBuE,uBAAwB,gBAE9D,GAAe,iBAAR0I,EACH,MAAAhN,EAAkBD,EAAgBmL,eAAgB,cAEpD,MAAAvE,EAAYjG,KAAK0R,iBAAiBxQ,GACxC,OAAOlB,KAAK2R,kBAAkB,gBAAiB,CAAErF,OAAOrG,EAAS,EACnE,sKCvJa,MAAA6L,GAAA,IA5Df,MAAA,WAAAhS,GACUC,GAAAC,KAAA,WACR+R,GAAA/R,KAAgB,OAAO,kBACvB+R,GAAA/R,KAAgB,UAAU,QAAA,CAEnB,OAAA2D,CAAQE,GACb7D,KAAK6D,QAAUA,EAEfA,EAAQC,OAAOR,eACb,qBACAtD,KAAKgS,mBAAmBzN,KAAKvE,MAEjC,CAWO,kBAAAgS,CACL9Q,EAAyB,IAEzB,OAAO,IAAIkJ,QAAQ,CAACC,EAASC,KAEvB,IAACtK,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKJ,MAAMqC,EAA2B,CAC/BlB,QAAUmG,IACRb,EAAQa,IAEVlG,KAAOmG,IACLb,EAAOa,IAETvE,SAAU1F,EAAQ0F,UAIf5G,KAAA6D,QAAQC,OAAOkC,MAAM,KAzEhC,IAAAhD,EA0EQ,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,qBACRC,OAAQ,CAAC,GAEXsB,MAIR,sKCqVa,MAAAgM,GAAA,IA7Vf,MAAA,WAAAnS,GACEoS,GAAAlS,KAAgB,OAAO,WACvBkS,GAAAlS,KAAgB,UAAU,SAClBD,GAAAC,KAAA,UAAA,CAKD,OAAA2D,CAAQE,GACb7D,KAAK6D,QAAUA,EAEfA,EAAQC,OAAOR,eAAe,cAAetD,KAAKmS,YAAY5N,KAAKvE,OACnE6D,EAAQC,OAAOR,eAAe,kBAAmBtD,KAAKoS,gBAAgB7N,KAAKvE,OAC3E6D,EAAQC,OAAOR,eAAe,aAActD,KAAKqS,WAAW9N,KAAKvE,OACjE6D,EAAQC,OAAOR,eAAe,eAAgBtD,KAAKsS,aAAa/N,KAAKvE,MACvE,CAcO,WAAAmS,CAAYjR,GACjB,OAAO,IAAIkJ,QAAQ,CAACC,EAASC,KACvB,IAACtK,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKA,IAAC1C,EAAQuL,IACL,MAAAnN,EACJD,EAAgBuE,uBAChB,gBAKA,GAAuB,iBAAhB1C,EAAQuL,MAAqBvL,EAAQuL,IAAIlD,OAC5C,MAAAjK,EACJD,EAAgBuE,uBAChB,cAMA,QAAmB,IAAnB1C,EAAQsC,SADS,CAAC,MAAO,QACqB+I,SAASrL,EAAQsC,OAAO+O,eAClE,MAAAjT,EAAkBD,EAAgBuE,uBAAwB,iBAIlE,QAAwB,IAApB1C,EAAQsR,SAAoD,iBAApBtR,EAAQsR,QAC5C,MAAAlT,EAAkBD,EAAgBuE,uBAAwB,kBAIlE,QAAqB,IAAjB1C,EAAQiC,MAA8C,iBAAjBjC,EAAQiC,KACzC,MAAA7D,EAAkBD,EAAgBuE,uBAAwB,eAK9D,QAAqB,IAArB1C,EAAQuR,WADW,CAAC,OAAQ,OAAQ,UACclG,SAASrL,EAAQuR,SAAS/M,eACxE,MAAApG,EAAkBD,EAAgBuE,uBAAwB,mBAI9D,QAAoB,IAApB1C,EAAQU,UAAqD,iBAApBV,EAAQU,SAAwBV,EAAQU,SAAW,GACxF,MAAAtC,EAAkBD,EAAgBuE,uBAAwB,kBAKlE,QAA4B,IAAvB1C,EAAQwR,YAA0D,iBAAvBxR,EAAQwR,iBAAoD,IAAvBxR,EAAQwR,aADpE,CAAC,UAAW,UAAW,aAAc,cAC6EnG,SAASrL,EAAQwR,YACpJ,MAAApT,EAAkBD,EAAgBuE,uBAAwB,qBAI1D1C,EAAAsC,OAAStC,EAAQsC,QAAU,MACnCtC,EAAQsR,QAAWtR,EAAQsR,SAAWX,OAAO7I,KAAK9H,EAAQsR,SAASvQ,OAAS,EAAKf,EAAQsR,QAAU,CAAE,eAAgB,qCAC7GtR,EAAAiC,KAAOjC,EAAQiC,MAAQ,CAAA,EACvBjC,EAAAuR,SAAWvR,EAAQuR,UAAY,OAC/BvR,EAAAU,QAAUV,EAAQU,SAAW,IAC7BV,EAAAwR,WAAaxR,EAAQwR,YAAc,UAE3C,MAAMzM,EAA2B,CAC/BlB,QAAUmG,IAERb,EAAQa,IAEVlG,KAAOmG,IAELb,EAAOa,IAETvE,SAAU,QAOP5G,KAAA6D,QAAQC,OAAOkC,MAAM,KA1LhC,IAAAhD,EA2LQ,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,cACRC,OAAQzD,EACRU,QAASV,EAAQU,SAEnBqE,MAIR,CAKO,eAAAmM,CAAgBlR,GACjB,IAAClB,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKA,IAAC1C,EAAQuL,IACL,MAAAnN,EACJD,EAAgBuE,uBAChB,gBAKA,GAAuB,iBAAhB1C,EAAQuL,MAAqBvL,EAAQuL,IAAIlD,OAC5C,MAAAjK,EACJD,EAAgBuE,uBAChB,cAMA,QAAmB,IAAnB1C,EAAQsC,SADS,CAAC,MAAO,QACqB+I,SAASrL,EAAQsC,OAAO+O,eAClE,MAAAjT,EAAkBD,EAAgBuE,uBAAwB,iBAIlE,QAAwB,IAApB1C,EAAQsR,SAAoD,iBAApBtR,EAAQsR,QAC5C,MAAAlT,EAAkBD,EAAgBuE,uBAAwB,kBAIlE,QAAqB,IAAjB1C,EAAQiC,MAA8C,iBAAjBjC,EAAQiC,KACzC,MAAA7D,EAAkBD,EAAgBuE,uBAAwB,eAK9D,QAAqB,IAArB1C,EAAQuR,WADW,CAAC,OAAQ,OAAQ,UACclG,SAASrL,EAAQuR,SAAS/M,eACxE,MAAApG,EAAkBD,EAAgBuE,uBAAwB,mBAI9D,QAAoB,IAApB1C,EAAQU,UAAqD,iBAApBV,EAAQU,SAAwBV,EAAQU,SAAW,GACxF,MAAAtC,EAAkBD,EAAgBuE,uBAAwB,kBAKlE,QAA4B,IAAvB1C,EAAQwR,YAA0D,iBAAvBxR,EAAQwR,iBAAoD,IAAvBxR,EAAQwR,aADpE,CAAC,UAAW,UAAW,aAAc,cAC6EnG,SAASrL,EAAQwR,YACpJ,MAAApT,EAAkBD,EAAgBuE,uBAAwB,qBAI1D1C,EAAAsC,OAAStC,EAAQsC,QAAU,MACnCtC,EAAQsR,QAAWtR,EAAQsR,SAAWX,OAAO7I,KAAK9H,EAAQsR,SAASvQ,OAAS,EAAKf,EAAQsR,QAAU,CAAE,eAAgB,qCAC7GtR,EAAAiC,KAAOjC,EAAQiC,MAAQ,CAAA,EACvBjC,EAAAuR,SAAWvR,EAAQuR,UAAY,OAC/BvR,EAAAU,QAAUV,EAAQU,SAAW,IAC7BV,EAAAwR,WAAaxR,EAAQwR,YAAc,UAE3C,MAAMzM,EAA2B,CAC/BlB,QAAUmG,IA5QhB,IAAAlI,EA6QQ,OAAAA,EAAA,MAAA9B,OAAA,EAAAA,EAAS6D,UAAU/B,EAAA2D,KAAAzF,EAAAgK,IAErBlG,KAAOmG,IA/Qb,IAAAnI,EAgRQ,OAAAA,EAAA9B,EAAQ8D,OAAOhC,EAAA2D,KAAAzF,EAAAiK,IAEjBvE,SAAU,KAlRhB,IAAA5D,EAmRQ,OAAAA,EAAA9B,EAAQ0F,WAAR5D,EAAA2D,KAAAzF,KAMClB,KAAA6D,QAAQC,OAAOkC,MAAM,KAzR9B,IAAAhD,EA0RM,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,cACRC,OAAQzD,EACRU,QAASV,EAAQU,SAEnBqE,IAGN,CAOO,UAAAoM,CAAWnR,GAChB,OAAO,IAAIkJ,QAAQ,CAACC,EAASC,KACvB,IAACtK,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKA,KAAC1C,EAAQuL,KAAQvL,EAAQkM,UAAalM,EAAQyR,UAAazR,EAAQ0R,UACrE,OAAOtI,EAAOhL,EAAkBD,EAAgBuE,uBAAwB,+CAItE,GAAuB,iBAAhB1C,EAAQuL,MAAqBvL,EAAQuL,IAAIlD,OAClD,OAAOe,EAAOhL,EAAkBD,EAAgBuE,uBAAwB,eAItE,GAA4B,iBAArB1C,EAAQkM,WAA0BlM,EAAQkM,SAAS7D,OAC5D,OAAOe,EAAOhL,EAAkBD,EAAgBuE,uBAAwB,oBAItE,GAA4B,iBAArB1C,EAAQyR,WAA0BzR,EAAQyR,SAASpJ,OAC5D,OAAOe,EAAOhL,EAAkBD,EAAgBuE,uBAAwB,oBAK1E,IADuB,CAAC,QAAS,QAAS,SACtB2I,SAASrL,EAAQ0R,UAC5B,OAAAtI,EAAOhL,EAAkBD,EAAgBuE,uBAAwB,aAAa1C,EAAQ0R,aAI/F,QAAuB,IAAnB1R,EAAQ2R,QAAkD,iBAAnB3R,EAAQ2R,OACjD,OAAOvI,EAAOhL,EAAkBD,EAAgBuE,uBAAwB,kBAI1E,QAAyB,IAArB1C,EAAQ4R,UAAsD,iBAArB5R,EAAQ4R,SACnD,OAAOxI,EAAOhL,EAAkBD,EAAgBuE,uBAAwB,oBAG1E,MAAMqC,EAA2B,CAC/BlB,QAAUmG,IACRb,EAAQa,IAEVlG,KAAOmG,IACLb,EAAOa,IAETvE,SAAU,QAMP5G,KAAA6D,QAAQC,OAAOkC,MAAM,KApWhC,IAAAhD,EAqWQ,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,aACRC,OAAQzD,GAEV+E,MAIR,CAOO,YAAAqM,CAAapR,GAClB,OAAO,IAAIkJ,QAAQ,CAACC,EAASC,KACvB,IAACtK,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKA,IAAC1C,EAAQuL,IACX,OAAOnC,EAAOhL,EAAkBD,EAAgBuE,uBAAwB,iBAItE,GAAuB,iBAAhB1C,EAAQuL,MAAqBvL,EAAQuL,IAAIlD,OAClD,OAAOe,EAAOhL,EAAkBD,EAAgBuE,uBAAwB,eAI1E,QAAuB,IAAnB1C,EAAQ2R,QAAkD,iBAAnB3R,EAAQ2R,OACjD,OAAOvI,EAAOhL,EAAkBD,EAAgBuE,uBAAwB,kBAG1E,MAAMqC,EAA2B,CAC/BlB,QAAUmG,IACRb,EAAQa,IAEVlG,KAAOmG,IACLb,EAAOa,IAETvE,SAAU,QAMP5G,KAAA6D,QAAQC,OAAOkC,MAAM,KA1ZhC,IAAAhD,EA2ZQ,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,eACRC,OAAQzD,GAEV+E,MAIR,sKC/Ja,MAAA8M,GAAA,IAlNf,MAAA,WAAAjT,GACUC,GAAAC,KAAA,WACRD,GAAAC,KAAgB,OAAO,QACvBD,GAAAC,KAAgB,UAAU,QAAA,CAEnB,OAAA2D,CAAQE,GACb7D,KAAK6D,QAAUA,EACfA,EAAQC,OAAOR,eAAe,YAAatD,KAAKgT,UAAUzO,KAAKvE,OAC/D6D,EAAQC,OAAOR,eAAe,WAAYtD,KAAKiT,SAAS1O,KAAKvE,OAC7D6D,EAAQC,OAAOR,eAAe,cAAetD,KAAKkT,YAAY3O,KAAKvE,OACnE6D,EAAQC,OAAOR,eAAe,uBAAwBtD,KAAKmT,qBAAqB5O,KAAKvE,MACvF,CAOO,SAAAgT,GACL,OAAO,IAAI5I,QAAQ,CAACC,EAASC,KACvB,IAACtK,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAGJ,MAAMqC,EAA2B,CAC/BlB,QAAUqK,IACR/E,EAAQ+E,IAEVpK,KAAOmG,IACLb,EAAOa,KAINnL,KAAA6D,QAAQC,OAAOkC,MAAM,KAtFhC,IAAAhD,EAuFQ,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,YACRC,OAAQ,CAAC,GAEXsB,MAIR,CAMO,QAAAgN,GACL,OAAO,IAAI7I,QAAQ,CAACC,EAASC,KACvB,IAACtK,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAGJ,MAAMqC,EAA2B,CAC/BlB,QAAUqK,IACR/E,EAAQ+E,IAEVpK,KAAOmG,IACLb,EAAOa,KAINnL,KAAA6D,QAAQC,OAAOkC,MAAM,KAvHhC,IAAAhD,EAwHQ,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,WACRC,OAAQ,CAAC,GAEXsB,MAIR,CAQO,WAAAiN,CAAYhS,GACjB,OAAO,IAAIkJ,QAAQ,CAACC,EAASC,KA1IjC,IAAAtH,EA2IU,IAAChD,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKA,IAAC1C,EAAQkS,KACL,MAAA9T,EACJD,EAAgBmL,eAChB,iBAIA,GAAwB,iBAAjBtJ,EAAQkS,KACX,MAAA9T,EACJD,EAAgBmL,eAChB,cAKJ,QAAsB,IAAlBtJ,EAAQmS,OAAgD,iBAAlBnS,EAAQmS,MAC1C,MAAA/T,EACJD,EAAgBmL,eAChB,eAIJ,QAAyB,IAArBtJ,EAAQoS,UAAsD,iBAArBpS,EAAQoS,SAC7C,MAAAhU,EACJD,EAAgBmL,eAChB,kBAIJ,QAAsB,IAAlBtJ,EAAQqS,OAAgD,kBAAlBrS,EAAQqS,MAC1C,MAAAjU,EACJD,EAAgBmL,eAChB,eAKItJ,EAAAqS,MAAQ,OAAAvQ,EAAQ9B,EAAAqS,QAASvQ,EACjC,MAAMiD,EAA2B,CAC/BlB,QAAUmG,IACRb,EAAQa,IAEVlG,KAAOmG,IACLb,EAAOa,IAETvE,SAAU1F,EAAQ0F,UAGf5G,KAAA6D,QAAQC,OAAOkC,MAAM,KAnMhChD,IAAAA,EAoMQ,OAAAA,EAAAhD,KAAK6D,UAALb,EAAcc,OAAOW,WACnB,CACEC,OAAQ,cACRC,OAAQzD,GAEV+E,MAIR,CAOa,oBAAAkN,CAAqBjS,GAA2D,SAAAlB,OAAA,OAAA,YAC3F,OAAO,IAAIoK,QAAQ,CAACC,EAASC,KACvB,IAACtK,KAAK6D,QACF,MAAAvE,EACJD,EAAgBuE,uBAChB,YAKA,GAA2B,iBAApB1C,EAAQU,QACX,MAAAtC,EACJD,EAAgBmL,eAChB,iBAIA,GAA6B,iBAAtBtJ,EAAQoK,UACX,MAAAhM,EACJD,EAAgBmL,eAChB,mBAIJ,MAAMvE,EAA2B,CAC/BlB,QAAUmG,IACRb,EAAQa,IAEVlG,KAAOmG,IACLb,EAAOa,IAETvE,SAAU1F,EAAQ0F,UAGf5G,KAAA6D,QAAQC,OAAOkC,MAAM,KAtPhC,IAAAhD,EAuPQ,OAAKA,EAAAhD,KAAA6D,YAASC,OAAOW,WACnB,CACEC,OAAQ,uBACRC,OAAQzD,EACRU,QAASV,EAAQU,SAEnBqE,MAGL,yMACH,GCjMIoC,GAAesB,EAAmB,CACtC9H,QAAS,CACP+H,EACAa,EACAmB,EACA+B,EACAmB,EACAQ,EACAkE,EACArC,GACAW,GACAG,GACAc,IAEFrR,OAAO,EACPK,aAAc,CAACrC,EAAO+T,KACpB9N,QAAQjG,MAAM,wBAAwB+T,KAAW/T"}
|