1 line
53 KiB
Plaintext
1 line
53 KiB
Plaintext
{"version":3,"sources":["../../sdk-src/event-emitter.ts","../../sdk-src/utils.ts","../../sdk-src/index.ts"],"sourcesContent":["/**\r\n * 轻量级类型安全事件发射器\r\n *\r\n * <p>SDK 内部事件系统基类,提供 on/off/once/emit/removeAllListeners/listenerCount。\r\n */\r\nexport class EventEmitter<Events extends Record<string, any>> {\r\n private events: { [K in keyof Events]?: Array<(payload: Events[K]) => void> };\r\n\r\n constructor() {\r\n this.events = {};\r\n }\r\n\r\n /** 注册事件监听器 */\r\n on<K extends keyof Events>(event: K, listener: (payload: Events[K]) => void): void {\r\n if (!this.events[event]) {\r\n this.events[event] = [];\r\n }\r\n this.events[event]!.push(listener);\r\n }\r\n\r\n /** 移除指定事件的指定监听器 */\r\n off<K extends keyof Events>(event: K, listener: (payload: Events[K]) => void): void {\r\n if (this.events[event]) {\r\n this.events[event] = this.events[event]!.filter(l => l !== listener);\r\n }\r\n }\r\n\r\n /** 注册一次性监听器,触发后自动移除 */\r\n once<K extends keyof Events>(event: K, listener: (payload: Events[K]) => void): void {\r\n const wrapper = (payload: Events[K]) => {\r\n this.off(event, wrapper);\r\n listener(payload);\r\n };\r\n this.on(event, wrapper);\r\n }\r\n\r\n /** 触发事件,通知所有已注册的监听器 */\r\n emit<K extends keyof Events>(event: K, data: Events[K]): void {\r\n if (this.events[event]) {\r\n // 浅拷贝防止 once 触发时修改数组导致跳过\r\n const listeners = [...this.events[event]!];\r\n listeners.forEach(l => {\r\n try {\r\n l(data);\r\n } catch (e) {\r\n console.error(`[EventEmitter] Error emitting event ${String(event)}:`, e);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /** 移除指定事件的全部监听器;不传参则移除所有事件的所有监听器 */\r\n removeAllListeners<K extends keyof Events>(event?: K): void {\r\n if (event !== undefined) {\r\n delete this.events[event];\r\n } else {\r\n this.events = {};\r\n }\r\n }\r\n\r\n /** 返回指定事件的监听器数量 */\r\n listenerCount<K extends keyof Events>(event: K): number {\r\n return this.events[event]?.length ?? 0;\r\n }\r\n}\r\n","/**\r\n * 过滤 EXTERIOR 楼层,检查楼层是否是室内可导航楼层\r\n */\r\nexport function isIndoorNavigableFloor(floorCode: string): boolean {\r\n if (!floorCode) return false;\r\n return floorCode.toUpperCase() !== 'EXTERIOR';\r\n}\r\n\r\n/**\r\n * 物理楼层顺序由低到高排序\r\n */\r\nexport function sortIndoorFloors<T extends { floorCode: string }>(floors: T[]): T[] {\r\n const FLOOR_ORDER = [\"L-2\", \"L-1\", \"B2\", \"B1\", \"L1\", \"L1.5\", \"L2\", \"L3\", \"L4\", \"L5\"];\r\n \r\n const indoorFloors = floors.filter(f => isIndoorNavigableFloor(f.floorCode));\r\n\r\n const getFloorIndex = (floorCode: string): number => {\r\n let code = floorCode.trim().toUpperCase();\r\n if (code.startsWith('F')) {\r\n code = 'L' + code.substring(1);\r\n }\r\n const matchedIndex = FLOOR_ORDER.findIndex(f => f.toUpperCase() === code);\r\n if (matchedIndex !== -1) return matchedIndex;\r\n \r\n const numMatch = code.match(/-?\\d+(\\.\\d+)?/);\r\n if (numMatch) {\r\n const val = parseFloat(numMatch[0]);\r\n if (code.startsWith('B') || code.includes('-')) {\r\n return -Math.abs(val) - 100;\r\n }\r\n return val;\r\n }\r\n return 0;\r\n };\r\n\r\n return [...indoorFloors].sort((a, b) => getFloorIndex(a.floorCode) - getFloorIndex(b.floorCode));\r\n}\r\n","import { EventEmitter } from './event-emitter';\r\nimport {\r\n SGSMapSDKOptions,\r\n SGSMapEvents,\r\n RouteResult,\r\n SgsMapNode,\r\n MarkerConfig,\r\n SgsSdkManifest,\r\n SgsFloorBundle,\r\n SgsPoi,\r\n SgsSpaceArea,\r\n SgsGuideStop,\r\n SgsPerformanceStats,\r\n SgsNavigablePlace,\r\n SgsMapDiagnostics,\r\n SgsFloorDiagnostics,\r\n SgsPoiQueryParams,\r\n SgsFeaturedRouteSummary,\r\n SgsFeaturedRouteDetail,\r\n SgsFeaturedRoutePreviewPayload,\r\n SgsFlowlineOptions,\r\n SgsRouteRoamingOptions,\r\n RouteOptions,\r\n SdkRoutePoint,\r\n} from './types';\r\n\r\nexport * from './types';\r\n\r\nimport * as utils from './utils';\r\n\r\n/** SDK 版本号常量 — 与后端 SdkMapServiceImpl.SDK_VERSION 对齐 */\r\nconst SDK_VERSION = '2.5.0';\n/** 协议版本号 */\r\nconst PROTOCOL_VERSION = 2;\r\n/** 默认 ready 超时(ms) */\r\nconst DEFAULT_READY_TIMEOUT = 30000; // 🔧 P0: 从 15s 提升到 30s,配合延迟 ENGINE_READY 策略\r\n/** 默认命令超时(ms) */\r\nconst DEFAULT_CMD_TIMEOUT = 5000;\r\n\r\n/**\r\n * 命令队列条目 — ready 前调用的异步命令暂存于此\r\n */\r\ninterface PendingCommand {\r\n action: string;\r\n payload?: any;\r\n timeout: number;\r\n resolve: (data: any) => void;\r\n reject: (error: any) => void;\r\n}\r\n\r\n/**\r\n * SGS 3D 地图 H5 SDK 入口类\r\n *\r\n * <p>通过 iframe 嵌入独立发布的 /engine/index.html 渲染引擎,以 postMessage 进行双向通信。\n * <p>所有需要后端数据的操作均通过 postMessage 指令由底座代理,\r\n * Demo / 宿主不允许直连后端 API。\r\n *\r\n * @version 2.5.0\n */\r\nexport default class SGSMapSDK extends EventEmitter<SGSMapEvents> {\r\n public static utils = utils;\r\n private container: HTMLElement;\r\n private sdkUrl: string;\r\n private floorId: string | number;\r\n private mapId: string | number;\r\n private targetOrigin: string;\r\n private iframe: HTMLIFrameElement | null = null;\r\n private _isReady: boolean = false;\r\n private _isDestroyed: boolean = false;\r\n /** ready 失败终态:iframe 加载失败或 ready 超时后置 true,后续命令直接 reject */\r\n private _readyFailed: boolean = false;\r\n /** ready 失败时的错误对象,用于后续命令的立即 reject */\r\n private _readyFailedError: { code: string; message: string } | null = null;\r\n private defaultTimeout: number;\r\n private readyTimeoutMs: number;\r\n /** 已 ready 后正在等待响应的命令队列 */\r\n private promiseQueue: {\r\n [key: string]: {\r\n resolve: (data: any) => void;\r\n reject: (error: any) => void;\r\n };\r\n } = {};\r\n /** ready 前暂存的异步命令队列 */\r\n private _pendingCommands: PendingCommand[] = [];\r\n /** ready 前暂存的 fire-and-forget 命令队列 */\r\n private _pendingFireAndForget: Array<{ action: string; payload?: any }> = [];\r\n private _messageListener: ((event: MessageEvent) => void) | null = null;\r\n /** ready 超时计时器 */\r\n private _readyTimer: ReturnType<typeof setTimeout> | null = null;\r\n /** 🔧 P0: HELLO 重试定时器 — 解决 iframe onload 与 React useEffect 时序竞争 */\r\n private _helloInterval: ReturnType<typeof setInterval> | null = null;\r\n\r\n /** ENGINE_READY 返回的 payload(供外部读取) */\r\n public readyPayload: any = null;\r\n\r\n /** ready Promise 的 resolve/reject,保证 whenReady() 返回同一个 Promise */\r\n private _readyResolve: ((value: any) => void) | null = null;\r\n private _readyReject: ((reason: any) => void) | null = null;\r\n private _readyPromise: Promise<any>;\r\n\r\n /** 性能追踪字段 */\r\n private _sdkCreatedAt: number;\r\n private _iframeDomReadyMs: number | null = null;\r\n private _engineReadyMs: number | null = null;\r\n\r\n constructor(options: SGSMapSDKOptions) {\r\n super();\r\n this._sdkCreatedAt = Date.now();\r\n\r\n const containerEl =\r\n typeof options.container === 'string'\r\n ? document.getElementById(options.container)\r\n : options.container;\r\n\r\n if (!containerEl) {\r\n throw new Error(`[SGSMapSDK] Cannot find container: ${options.container}`);\r\n }\r\n\r\n this.container = containerEl;\r\n this.sdkUrl = options.sdkUrl || '/engine/index.html';\n this.floorId = options.floorId || 1;\r\n this.mapId = options.mapId || 1;\r\n this.defaultTimeout = options.timeout || DEFAULT_CMD_TIMEOUT;\r\n this.readyTimeoutMs = options.readyTimeout || DEFAULT_READY_TIMEOUT;\r\n\r\n this.targetOrigin = options.targetOrigin as string;\r\n if (!this.targetOrigin) {\r\n if (this.sdkUrl.startsWith('http')) {\r\n this.targetOrigin = new URL(this.sdkUrl).origin;\r\n } else if (typeof window !== 'undefined') {\r\n this.targetOrigin = window.location.origin;\r\n } else {\r\n this.targetOrigin = '*';\r\n }\r\n }\r\n\r\n // 初始化 ready Promise(全局唯一,whenReady() 返回同一个)\r\n this._readyPromise = new Promise((resolve, reject) => {\r\n this._readyResolve = resolve;\r\n this._readyReject = reject;\r\n });\r\n\r\n this._initIframeBridge();\r\n }\r\n\r\n // ==================== iframe 桥接初始化 ====================\r\n\r\n private _initIframeBridge() {\r\n const iframe = document.createElement('iframe');\r\n\r\n // 拷贝父级 URL 上的查询参数传递给 iframe 底座\r\n const iframeUrl = new URL(\r\n this.sdkUrl,\r\n typeof window !== 'undefined' ? window.location.href : 'http://localhost'\r\n );\r\n if (typeof window !== 'undefined') {\r\n const parentParams = new URLSearchParams(window.location.search);\r\n parentParams.forEach((value, key) => {\r\n iframeUrl.searchParams.set(key, value);\r\n });\r\n }\r\n // 附带 floorId\r\n if (!iframeUrl.searchParams.has('floorId')) {\r\n iframeUrl.searchParams.set('floorId', String(this.floorId));\r\n }\r\n\r\n iframe.src = iframeUrl.toString();\r\n iframe.style.cssText = 'width:100%;height:100%;border:none;background:transparent;';\r\n\r\n this.container.innerHTML = '';\r\n this.container.appendChild(iframe);\r\n this.iframe = iframe;\r\n\r\n // ── 消息监听 ──\r\n this._messageListener = (event: MessageEvent) => {\r\n if (this.targetOrigin !== '*' && event.origin !== this.targetOrigin) {\r\n return; // 静默忽略不匹配的来源\r\n }\r\n\r\n if (!this.iframe || event.source !== this.iframe.contentWindow) {\r\n return;\r\n }\r\n\r\n const data = event.data;\r\n if (!data) return;\r\n\r\n // ── 事件类型消息 ──\r\n if (data.type === 'SGS_MAP_EVENT') {\r\n const { action, payload } = data;\r\n if (action === 'ON_POI_CLICK') {\r\n this.emit('poiClick', payload);\r\n } else if (action === 'ON_POI_DETAIL') {\r\n this.emit('poiDetail', payload);\r\n } else if (action === 'ON_POI_NAVIGATE') {\r\n this.emit('poiNavigate', payload);\r\n } else if (action === 'ON_POI_CLOSE') {\r\n this.emit('poiClose', payload);\r\n } else if (action === 'ON_SPACE_CLICK') {\r\n this.emit('spaceClick', payload);\r\n } else if (action === 'ON_SPACE_DETAIL') {\r\n this.emit('spaceDetail', payload);\r\n } else if (action === 'ON_SPACE_NAVIGATE') {\r\n this.emit('spaceNavigate', payload);\r\n } else if (action === 'ON_SPACE_CLOSE') {\r\n this.emit('spaceClose', payload);\r\n } else if (action === 'ENGINE_READY') {\r\n this._onEngineReady(payload);\r\n } else if (action === 'ON_FLOOR_CHANGED') {\r\n this.emit('floorChanged', payload);\r\n } else if (action === 'ON_ROUTE_TRANSFER') {\r\n this.emit('routeTransfer', payload);\r\n } else if (action === 'ON_MODEL_LOADING') {\r\n this.emit('modelLoading', payload);\r\n } else if (action === 'ON_MODEL_READY') {\r\n this.emit('modelReady', payload);\r\n } else if (action === 'ON_MODEL_ERROR') {\r\n this.emit('modelError', payload);\r\n } else if (action === 'ON_FLOOR_BUNDLE_READY') {\r\n this.emit('floorBundleReady', payload);\r\n } else if (action === 'ON_ROUTE_READY') {\r\n this.emit('routeReady', payload);\r\n } else if (action === 'ON_ROAMING_PROGRESS') {\r\n this.emit('roamingProgress', payload);\r\n } else if (action === 'ON_ROAMING_DONE') {\r\n this.emit('roamingDone', payload);\r\n }\r\n }\r\n\r\n // ── 命令响应消息 ──\r\n if (data.type === 'SGS_MAP_RESPONSE') {\r\n const { action, requestId, payload, error } = data;\r\n const resolver = this.promiseQueue[requestId];\r\n if (resolver) {\r\n if (payload && payload.success !== false) {\r\n resolver.resolve(payload);\r\n } else {\r\n const errObj = error || { code: 'ERR_FAILED', message: `${action} command failed` };\r\n resolver.reject(errObj);\r\n }\r\n delete this.promiseQueue[requestId];\r\n }\r\n }\r\n };\r\n\r\n window.addEventListener('message', this._messageListener);\r\n\r\n // ── iframe 加载完成 → 发送 HELLO 握手 ──\r\n iframe.onload = () => {\r\n this._iframeDomReadyMs = Date.now() - this._sdkCreatedAt;\r\n if (this._isReady) return;\r\n\r\n // 🔧 P0 修复:HELLO 重试机制\r\n // iframe onload 触发时 React useEffect 可能尚未挂载 message listener,\r\n // 单次 HELLO 会丢失。改为每 500ms 重试,直到 ENGINE_READY 到达。\r\n const sendHello = () => {\r\n if (this._isReady || this._isDestroyed) {\r\n if (this._helloInterval) { clearInterval(this._helloInterval); this._helloInterval = null; }\r\n return;\r\n }\r\n this._postCommand('HELLO', { protocolVersion: PROTOCOL_VERSION, sdkVersion: SDK_VERSION });\r\n };\r\n sendHello(); // 立即发第一次\r\n this._helloInterval = setInterval(sendHello, 500);\r\n console.log(`[SGSMapSDK] Sent HELLO handshake (v${SDK_VERSION}), will retry every 500ms until ENGINE_READY...`);\r\n };\r\n\r\n // ── iframe 加载失败 → reject ready + 清空命令队列 ──\r\n iframe.onerror = (err) => {\r\n console.error('[SGSMapSDK] Iframe load error', err);\r\n const error = { code: 'ERR_IFRAME_LOAD' as const, message: 'Failed to load map engine iframe.' };\r\n this.emit('loadError', { type: 'iframe_error', detail: error.message });\r\n this._rejectReady(error);\r\n };\r\n\r\n // ── ready 超时计时器 ──\r\n this._readyTimer = setTimeout(() => {\r\n if (!this._isReady && !this._isDestroyed) {\r\n const error = {\r\n code: 'ERR_READY_TIMEOUT' as const,\r\n message: `ENGINE_READY not received within ${this.readyTimeoutMs}ms`\r\n };\r\n console.error(`[SGSMapSDK] ${error.message}`);\r\n this._rejectReady(error);\r\n }\r\n }, this.readyTimeoutMs);\r\n }\r\n\r\n // ==================== ready 生命周期管理 ====================\r\n\r\n /**\r\n * ENGINE_READY 到达时的处理\r\n */\r\n private _onEngineReady(payload: any) {\r\n if (this._isReady) return; // 防重入\r\n\r\n this._isReady = true;\r\n this.readyPayload = payload;\r\n this._engineReadyMs = Date.now() - this._sdkCreatedAt;\r\n\r\n // 🔧 P0: 清除 HELLO 重试定时器\r\n if (this._helloInterval) {\r\n clearInterval(this._helloInterval);\r\n this._helloInterval = null;\r\n }\r\n\r\n // 清除 ready 超时计时器\r\n if (this._readyTimer) {\r\n clearTimeout(this._readyTimer);\r\n this._readyTimer = null;\r\n }\r\n\r\n // resolve ready Promise\r\n if (this._readyResolve) {\r\n this._readyResolve(payload);\r\n this._readyResolve = null;\r\n this._readyReject = null;\r\n }\r\n\r\n // 触发 ready 事件\r\n this.emit('ready', payload);\r\n console.log('[SGSMapSDK] Handshake complete: Engine Ready received ✅');\r\n\r\n // 排空命令队列 — ready 前暂存的命令逐个发送\r\n this._flushPendingCommands();\r\n }\r\n\r\n /**\r\n * reject ready Promise 并清空所有挂起命令,设置失败终态\r\n */\r\n private _rejectReady(error: { code: string; message: string }) {\r\n // 设置失败终态 — 后续所有新命令直接 reject\r\n this._readyFailed = true;\r\n this._readyFailedError = error;\r\n\r\n // reject ready Promise\r\n if (this._readyReject) {\r\n this._readyReject(error);\r\n this._readyResolve = null;\r\n this._readyReject = null;\r\n }\r\n\r\n // 清空 ready 超时计时器\r\n if (this._readyTimer) {\r\n clearTimeout(this._readyTimer);\r\n this._readyTimer = null;\r\n }\r\n\r\n // reject 所有命令队列 + 清空 fire-and-forget 队列\r\n this._rejectAllPending(error.code, error.message);\r\n this._pendingFireAndForget.splice(0);\r\n }\r\n\r\n /**\r\n * 排空 ready 前暂存的命令队列 — 逐个以 _postCommandAsync 发送\r\n */\r\n private _flushPendingCommands() {\r\n // 1. 排空 fire-and-forget 队列\r\n const fireAndForget = this._pendingFireAndForget.splice(0);\r\n for (const cmd of fireAndForget) {\r\n this._postCommand(cmd.action, cmd.payload);\r\n }\r\n\r\n // 2. 排空异步命令队列\r\n const pending = this._pendingCommands.splice(0);\r\n for (const cmd of pending) {\r\n this._postCommandAsyncInner(cmd.action, cmd.payload, cmd.timeout)\r\n .then(cmd.resolve)\r\n .catch(cmd.reject);\r\n }\r\n\r\n const total = fireAndForget.length + pending.length;\r\n if (total > 0) {\r\n console.log(`[SGSMapSDK] Flushed ${total} pending commands after ready (${fireAndForget.length} fire-and-forget, ${pending.length} async)`);\r\n }\r\n }\r\n\r\n /**\r\n * reject 所有挂起的 Promise 和命令队列\r\n */\r\n private _rejectAllPending(code: string, message: string) {\r\n // 1. reject 已发送的 promiseQueue\r\n Object.keys(this.promiseQueue).forEach((requestId) => {\r\n const resolver = this.promiseQueue[requestId];\r\n if (resolver) {\r\n resolver.reject({ code, message });\r\n }\r\n delete this.promiseQueue[requestId];\r\n });\r\n\r\n // 2. reject 命令队列\r\n const pending = this._pendingCommands.splice(0);\r\n for (const cmd of pending) {\r\n cmd.reject({ code, message });\r\n }\r\n }\r\n\r\n // ==================== 公共生命周期方法 ====================\r\n\r\n /**\r\n * 返回 ready Promise(全局唯一,多次调用返回同一个)。\r\n * 别名:ready()\r\n *\r\n * @example\r\n * await sdk.whenReady();\r\n * sdk.changeFloor(floorId);\r\n */\r\n whenReady(): Promise<any> {\r\n return this._readyPromise;\r\n }\r\n\r\n /**\r\n * whenReady 的别名\r\n */\r\n ready(): Promise<any> {\r\n return this._readyPromise;\r\n }\r\n\r\n /** 获取 ready 状态 */\r\n getIsReady(): boolean {\r\n return this._isReady;\r\n }\r\n\r\n /** 获取当前楼层 ID */\r\n getCurrentFloor(): string | number {\r\n return this.floorId;\r\n }\r\n\r\n /** 获取当前 mapId */\r\n getMapId(): string | number {\r\n return this.mapId;\r\n }\r\n\r\n /** 获取 SDK 版本号 */\r\n getVersion(): string {\r\n return SDK_VERSION;\r\n }\r\n\r\n // ==================== 核心通信方法 ====================\r\n\r\n private _generateRequestId(): string {\r\n return `req_sdk_${Date.now()}_${Math.floor(Math.random() * 100000)}`;\r\n }\r\n\r\n private _postCommand(action: string, payload?: any, requestId?: string | null) {\r\n if (!this.iframe || !this.iframe.contentWindow) {\r\n console.error('[SGSMapSDK] SDK Iframe is not available!');\r\n return;\r\n }\r\n\r\n this.iframe.contentWindow.postMessage(\r\n {\r\n type: 'SGS_MAP_COMMAND',\r\n action,\r\n requestId,\r\n payload\r\n },\r\n this.targetOrigin\r\n );\r\n }\r\n\r\n /**\r\n * 异步命令发送(外部入口)— 支持命令队列\r\n *\r\n * <p>状态机优先级:destroyed > readyFailed > !ready(入队) > ready(发送)\r\n */\r\n private _postCommandAsync<T>(action: string, payload?: any, timeout: number = this.defaultTimeout): Promise<T> {\r\n // destroyed 后直接 reject\r\n if (this._isDestroyed) {\r\n return Promise.reject({\r\n code: 'ERR_DESTROYED',\r\n message: 'SGSMapSDK has been destroyed. Cannot send commands.'\r\n });\r\n }\r\n\r\n // ready 失败终态 — 立即 reject,不再入队\r\n if (this._readyFailed) {\r\n return Promise.reject(\r\n this._readyFailedError || { code: 'ERR_NOT_READY', message: 'SDK ready failed.' }\r\n );\r\n }\r\n\r\n // ready 前入队\r\n if (!this._isReady) {\r\n return new Promise<T>((resolve, reject) => {\r\n this._pendingCommands.push({\r\n action,\r\n payload,\r\n timeout,\r\n resolve,\r\n reject\r\n });\r\n console.log(`[SGSMapSDK] Command \"${action}\" queued (waiting for ready). Queue size: ${this._pendingCommands.length}`);\r\n });\r\n }\r\n\r\n // ready 后直接发送\r\n return this._postCommandAsyncInner<T>(action, payload, timeout);\r\n }\r\n\r\n /**\r\n * fire-and-forget 命令发送(void 方法统一入口)\r\n *\r\n * <p>受 destroyed/readyFailed/!ready 状态保护:\r\n * - destroyed/readyFailed:静默丢弃 + console.warn\r\n * - !ready:暂存到 _pendingFireAndForget,ready 后自动发送\r\n * - ready:立即发送\r\n */\r\n private _postCommandSafe(action: string, payload?: any): void {\r\n if (this._isDestroyed) {\r\n console.warn(`[SGSMapSDK] Command \"${action}\" ignored: SDK destroyed.`);\r\n return;\r\n }\r\n if (this._readyFailed) {\r\n console.warn(`[SGSMapSDK] Command \"${action}\" ignored: SDK ready failed.`);\r\n return;\r\n }\r\n if (!this._isReady) {\r\n this._pendingFireAndForget.push({ action, payload });\r\n console.log(`[SGSMapSDK] Command \"${action}\" queued (fire-and-forget, waiting for ready). Queue size: ${this._pendingFireAndForget.length}`);\r\n return;\r\n }\r\n this._postCommand(action, payload);\r\n }\r\n\r\n /**\r\n * 异步命令发送(内部实现)— 已确认 ready\r\n */\r\n private _postCommandAsyncInner<T>(action: string, payload?: any, timeout: number = this.defaultTimeout): Promise<T> {\r\n const requestId = this._generateRequestId();\r\n return new Promise((resolve, reject) => {\r\n const timer = setTimeout(() => {\r\n if (this.promiseQueue[requestId]) {\r\n this.promiseQueue[requestId].reject({\r\n code: 'ERR_TIMEOUT',\r\n message: `Command \"${action}\" timed out after ${timeout}ms`\r\n });\r\n delete this.promiseQueue[requestId];\r\n }\r\n }, timeout);\r\n\r\n this.promiseQueue[requestId] = {\r\n resolve: (data) => {\r\n clearTimeout(timer);\r\n resolve(data as T);\r\n },\r\n reject: (error) => {\r\n clearTimeout(timer);\r\n reject(error);\r\n }\r\n };\r\n\r\n this._postCommand(action, payload, requestId);\r\n });\r\n }\r\n\r\n // ==================== v2.0 核心指令 API ====================\r\n\r\n /** 聚焦到指定要素节点 */\r\n focusTo(node: SgsMapNode | string) {\r\n if (typeof node === 'string') {\r\n this._postCommandSafe('FOCUS_TO', { nodeName: node });\r\n } else {\r\n this._postCommandSafe('FOCUS_TO', node);\r\n }\r\n }\r\n\r\n /** 切换楼层 */\r\n changeFloor(floorId: string | number, timeout?: number, options?: { forceReload?: boolean }): Promise<{ success: boolean; floorId: string | number }> {\r\n return this._postCommandAsync<{ success: boolean; floorId: string | number }>('CHANGE_FLOOR', { floorId, ...options }, timeout).then((res) => {\r\n this.floorId = floorId;\r\n return res;\r\n });\r\n }\r\n\r\n /** 添加业务图钉 */\r\n addMarker(config: MarkerConfig) {\r\n this._postCommandSafe('ADD_MARKER', config);\r\n }\r\n\r\n /** 移除指定图钉 */\r\n removeMarker(markerId: string) {\r\n this._postCommandSafe('REMOVE_MARKER', { markerId });\r\n }\r\n\r\n /** 清空所有业务图钉 */\r\n clearMarkers() {\r\n this._postCommandSafe('CLEAR_MARKERS');\r\n }\r\n\r\n /** 高亮多边形轮廓 */\r\n highlightPolygon(payload: string | object) {\r\n if (typeof payload === 'string') {\r\n this._postCommandSafe('HIGHLIGHT_POLYGON', { nodeName: payload });\r\n } else {\r\n this._postCommandSafe('HIGHLIGHT_POLYGON', payload);\r\n }\r\n }\r\n\r\n /** 寻路规划(v1 兼容) */\r\n planRoute(from: SgsMapNode | string, to: SgsMapNode | string, options?: any, timeout: number = 5000): Promise<RouteResult> {\r\n const startNode = typeof from === 'string' ? from : undefined;\r\n const endNode = typeof to === 'string' ? to : undefined;\r\n\r\n const payload: any = {};\r\n if (startNode) payload.startNode = startNode;\r\n else payload.from = from;\r\n\r\n if (endNode) payload.endNode = endNode;\r\n else payload.to = to;\r\n\r\n if (options) payload.options = options;\r\n\r\n return this._postCommandAsync<RouteResult>('PLAN_ROUTE', payload, timeout);\r\n }\r\n\r\n /** 寻路规划 V2(结构化参数) */\r\n planRouteV2(from: SgsMapNode, to: SgsMapNode, options?: any, timeout: number = 5000): Promise<RouteResult> {\r\n const payload = { from, to, options };\r\n return this._postCommandAsync<RouteResult>('PLAN_ROUTE', payload, timeout);\r\n }\r\n\r\n /** 清除当前路线 */\r\n clearRoute() {\r\n this._postCommandSafe('CLEAR_ROUTE');\r\n }\r\n\r\n /** 渲染已有路线点,供外部宿主直接展示自定义路线 */\r\n renderRoutePoints(\r\n pathPoints: Array<{ x: number; y: number; z: number }>,\r\n options?: any,\r\n timeout: number = 12000\r\n ): Promise<RouteResult> {\r\n return this._postCommandAsync<RouteResult>('RENDER_ROUTE_POINTS', { ...options, pathPoints }, timeout);\r\n }\r\n\r\n /** 启动路线漫游;pathPoints 为空时,基座会优先使用当前已渲染路线 */\r\n startRoaming(\r\n pathPoints: Array<{ x: number; y: number; z: number }> = [],\r\n options?: SgsRouteRoamingOptions,\r\n timeout: number = 12000\r\n ): Promise<{ success: boolean; mode?: string }> {\r\n return this._postCommandAsync<{ success: boolean; mode?: string }>('START_ROAMING', { ...options, pathPoints }, timeout);\r\n }\r\n\r\n /** 停止路线漫游 */\r\n stopRoaming(timeout?: number): Promise<{ success: boolean }> {\r\n return this._postCommandAsync<{ success: boolean }>('STOP_ROAMING', {}, timeout);\r\n }\r\n\r\n /** 暂停或继续路线漫游 */\r\n toggleRoamingPause(timeout?: number): Promise<{ success: boolean; paused?: boolean }> {\r\n return this._postCommandAsync<{ success: boolean; paused?: boolean }>('TOGGLE_ROAMING_PAUSE', {}, timeout);\r\n }\r\n\r\n // ==================== SDK 2.4.1 高层导航 API ====================\r\n\r\n /**\r\n * 导航至POI(SDK 2.4.1)\r\n *\r\n * 支持从坐标或POI导航到目标POI,后端自动查询POI坐标。\r\n *\r\n * @param from 起点(POI ID字符串/数字 或 坐标对象)\r\n * @param toPoiId 目标POI ID(建议使用string避免Snowflake精度丢失)\r\n * @param options 路径选项(wheelchair, preferElevator)\r\n * @param timeout 超时时间(毫秒)\r\n */\r\n planRouteToPoi(from: string | number | SdkRoutePoint, toPoiId: string | number, options?: RouteOptions, timeout: number = 5000): Promise<RouteResult> {\r\n // 将 string/number 转为 { poiId: from }\r\n const fromPoint: SdkRoutePoint = (typeof from === 'string' || typeof from === 'number')\r\n ? { poiId: from }\r\n : from;\r\n\r\n const payload = {\r\n from: fromPoint,\r\n toPoiId,\r\n wheelchair: options?.wheelchair ? 1 : 0,\r\n preferElevator: options?.preferElevator,\r\n };\r\n return this._postCommandAsync<RouteResult>('PLAN_ROUTE_TO_POI', payload, timeout);\r\n }\r\n\r\n /**\r\n * POI间导航(SDK 2.4.1)\r\n *\r\n * 两个POI之间的导航,后端自动查询POI坐标。\r\n *\r\n * @param fromPoiId 起点POI ID\r\n * @param toPoiId 终点POI ID\r\n * @param options 路径选项(wheelchair, preferElevator)\r\n * @param timeout 超时时间(毫秒)\r\n */\r\n planRouteBetweenPois(fromPoiId: string | number, toPoiId: string | number, options?: RouteOptions, timeout: number = 5000): Promise<RouteResult> {\r\n const payload = {\r\n fromPoiId,\r\n toPoiId,\r\n wheelchair: options?.wheelchair ? 1 : 0,\r\n preferElevator: options?.preferElevator,\r\n };\r\n return this._postCommandAsync<RouteResult>('PLAN_ROUTE_BETWEEN_POIS', payload, timeout);\r\n }\r\n\r\n // ==================== 状态和视图控制 ====================\r\n getState(): Promise<any> {\r\n return this._postCommandAsync('GET_STATE');\r\n }\r\n\r\n /** 重置视角 */\r\n resetView(timeout?: number): Promise<{ success: boolean }> {\r\n return this._postCommandAsync<{ success: boolean }>('RESET_VIEW', {}, timeout);\r\n }\r\n\r\n /** 设置 2D/3D 视图模式 */\r\n setViewMode(mode: '2d' | '3d', timeout?: number): Promise<{ success: boolean; mode: string }> {\r\n return this._postCommandAsync<{ success: boolean; mode: string }>('SET_VIEW_MODE', { mode }, timeout);\r\n }\r\n\r\n /** 切换图层可见性 */\r\n toggleLayer(types: string[], visible: boolean, timeout?: number): Promise<{ success: boolean; visibleTypes: string[] }> {\r\n return this._postCommandAsync<{ success: boolean; visibleTypes: string[] }>('TOGGLE_LAYER', { types, visible }, timeout);\r\n }\r\n\r\n /** 设置可见图层类型列表 */\r\n setVisibleLayers(types: string[], timeout?: number): Promise<{ success: boolean; visibleTypes: string[] }> {\r\n return this._postCommandAsync<{ success: boolean; visibleTypes: string[] }>('SET_VISIBLE_TYPES', { types }, timeout);\r\n }\r\n\r\n /** 设置路线展示视图是否活跃 */\r\n setRouteViewActive(active: boolean, timeout?: number): Promise<{ success: boolean; active: boolean }> {\r\n return this._postCommandAsync<{ success: boolean; active: boolean }>('SET_ROUTE_VIEW_ACTIVE', { active }, timeout);\r\n }\r\n\r\n // ==================== v2.2.0 / v2.2.0 数据消费 API ====================\r\n\r\n /** 获取地图 Manifest 清单 */\r\n getManifest(timeout?: number): Promise<SgsSdkManifest> {\r\n return this._postCommandAsync<SgsSdkManifest>('GET_MANIFEST', {}, timeout);\r\n }\r\n\r\n /** 加载指定楼层的完整 Bundle 数据(含 POI/空间面/讲解点/路网) */\r\n loadFloorBundle(floorId: string | number, timeout?: number): Promise<SgsFloorBundle> {\r\n return this._postCommandAsync<SgsFloorBundle>('LOAD_FLOOR_BUNDLE', { floorId }, timeout);\r\n }\r\n\r\n /** 获取指定楼层的 POI 列表 */\r\n getFloorPois(floorId: string | number, timeout?: number): Promise<SgsPoi[]> {\r\n return this._postCommandAsync<any>('GET_FLOOR_POIS', { floorId }, timeout)\r\n .then((res) => Array.isArray(res) ? res : (res?.pois || []));\r\n }\r\n\r\n /** 获取指定楼层的起终点候选目的地列表(门点/POI/空间等吸附后目的地) */\r\n getNavigablePlaces(floorId: string | number, timeout?: number): Promise<SgsNavigablePlace[]> {\r\n return this._postCommandAsync<any>('GET_NAVIGABLE_PLACES', { floorId }, timeout)\r\n .then((res) => Array.isArray(res) ? res : (res?.navigablePlaces || res?.places || []));\r\n }\r\n\r\n /** 获取当前楼层的 POI 列表(根据 floorCode 参数) */\r\n getPois(floorCode: string, timeout?: number): Promise<SgsPoi[]> {\r\n return this._postCommandAsync<SgsPoi[]>('GET_POIS', { floorCode }, timeout);\r\n }\r\n\r\n /** 获取指定楼层的空间面列表 */\r\n getSpaces(floorId: string | number, timeout?: number): Promise<SgsSpaceArea[]> {\r\n return this._postCommandAsync<any>('GET_SPACES', { floorId }, timeout)\r\n .then((res) => Array.isArray(res) ? res : (res?.spaces || []));\r\n }\r\n\r\n /** 获取指定楼层的已标定讲解点列表(地图渲染入口) */\r\n getGuideStops(floorId: string | number, timeout?: number): Promise<SgsGuideStop[]> {\r\n return this._postCommandAsync<any>('GET_GUIDE_STOPS', { floorId }, timeout)\r\n .then((res) => Array.isArray(res) ? res : (res?.guideStops || []));\r\n }\r\n\r\n /** 获取指定展厅的已标定讲解点列表(业务导览入口) */\r\n getGuideStopsByHall(hallId: string | number, timeout?: number): Promise<SgsGuideStop[]> {\r\n return this._postCommandAsync<any>('GET_GUIDE_STOPS_BY_HALL', { hallId }, timeout)\r\n .then((res) => Array.isArray(res) ? res : (res?.guideStops || []));\r\n }\r\n\r\n /** 预加载指定楼层的模型资源(不渲染) */\r\n preloadFloor(floorId: string | number, timeout?: number): Promise<{ cached: boolean }> {\r\n return this._postCommandAsync<{ cached: boolean }>('PRELOAD_FLOOR', { floorId }, timeout);\r\n }\r\n\r\n /** 获取性能统计信息 */\r\n getPerformanceStats(timeout?: number): Promise<SgsPerformanceStats> {\r\n return this._postCommandAsync<SgsPerformanceStats>('GET_PERFORMANCE_STATS', {}, timeout).then(stats => ({\r\n sdkCreatedAt: this._sdkCreatedAt,\r\n iframeDomReadyMs: this._iframeDomReadyMs ?? undefined,\r\n engineReadyMs: this._engineReadyMs ?? undefined,\r\n ...stats\r\n }));\r\n }\r\n\r\n // ==================== v2.3.0 诊断接口 ====================\r\n\r\n /** 获取地图级诊断信息 */\r\n getDiagnostics(timeout?: number): Promise<SgsMapDiagnostics> {\r\n return this._postCommandAsync<SgsMapDiagnostics>('GET_DIAGNOSTICS', {}, timeout);\r\n }\r\n\r\n /** 获取楼层级诊断信息 */\r\n getFloorDiagnostics(floorId: string | number, timeout?: number): Promise<SgsFloorDiagnostics> {\r\n return this._postCommandAsync<SgsFloorDiagnostics>('GET_FLOOR_DIAGNOSTICS', { floorId }, timeout);\r\n }\r\n\r\n /** 清空客户端模型缓存 */\r\n clearModelCache(): void {\r\n this._postCommandSafe('CLEAR_MODEL_CACHE');\r\n }\r\n\r\n // ==================== v2.4.0 新增 API ====================\r\n\r\n /** 获取指定楼层的业务 POI 列表 */\r\n getBusinessPois(floorId: string | number, options?: { types?: string[]; keyword?: string; limit?: number }, timeout?: number): Promise<SgsPoi[]> {\r\n return this._postCommandAsync<any>('GET_BUSINESS_POIS', { floorId, options }, timeout)\r\n .then((res) => Array.isArray(res) ? res : (res?.pois || []));\r\n }\r\n\r\n /** 查询 POI 列表 */\r\n queryPois(params: SgsPoiQueryParams, timeout?: number): Promise<SgsPoi[]> {\r\n return this._postCommandAsync<any>('QUERY_POIS', params, timeout)\r\n .then((res) => Array.isArray(res) ? res : (res?.pois || []));\r\n }\r\n\r\n /** 获取特色路线列表 */\r\n getFeaturedRoutes(mapId?: string | number, options?: { limit?: number }, timeout?: number): Promise<SgsFeaturedRouteSummary[]> {\r\n return this._postCommandAsync<any>('GET_FEATURED_ROUTES', { mapId, options }, timeout)\r\n .then((res) => Array.isArray(res) ? res : (res?.routes || []));\r\n }\r\n\r\n /** 获取特色路线详情 */\r\n getFeaturedRoute(routeId: string | number, timeout?: number): Promise<SgsFeaturedRouteDetail> {\r\n return this._postCommandAsync<any>('GET_FEATURED_ROUTE', { routeId }, timeout)\r\n .then((res) => res?.route || res);\r\n }\r\n\r\n /** 生成并展示精品路线预览 */\r\n planFeaturedRoutePreview(\r\n payload: SgsFeaturedRoutePreviewPayload,\r\n timeout: number = 15000\r\n ): Promise<RouteResult> {\r\n return this._postCommandAsync<RouteResult>('PLAN_FEATURED_ROUTE_PREVIEW', payload, timeout);\r\n }\r\n\r\n /** 显示动线 */\r\n showFlowline(routeId: string | number, options?: SgsFlowlineOptions, timeout?: number): Promise<{ success: boolean; routeId: string | number }> {\r\n return this._postCommandAsync<{ success: boolean; routeId: string | number }>('SHOW_FLOWLINE', { routeId, options }, timeout);\r\n }\r\n\r\n /** 清除动线 */\r\n clearFlowline(): void {\r\n this._postCommandSafe('CLEAR_FLOWLINE');\r\n }\r\n\r\n // ==================== @deprecated 兼容层 ====================\r\n // 以下方法已废弃,保留 API 签名避免外部接入方断裂。\r\n // 内部返回 ERR_UNSUPPORTED,不进入任何发布路径。\r\n\r\n /** @deprecated 使用 getManifest() 替代 */\r\n getReleaseManifest(timeout?: number): Promise<any> {\r\n console.warn('[SGSMapSDK] getReleaseManifest() is deprecated. Use getManifest() instead.');\r\n return Promise.reject({ code: 'ERR_UNSUPPORTED', message: 'getReleaseManifest() is deprecated. Use getManifest() instead.' });\r\n }\r\n\r\n /** @deprecated 已废弃,无替代方法 */\r\n getModelResources(timeout?: number): Promise<any> {\r\n console.warn('[SGSMapSDK] getModelResources() is deprecated.');\r\n return Promise.reject({ code: 'ERR_UNSUPPORTED', message: 'getModelResources() is deprecated.' });\r\n }\r\n\r\n /** @deprecated 已废弃,无替代方法 */\r\n getLayerTree(timeout?: number): Promise<any> {\r\n console.warn('[SGSMapSDK] getLayerTree() is deprecated.');\r\n return Promise.reject({ code: 'ERR_UNSUPPORTED', message: 'getLayerTree() is deprecated.' });\r\n }\r\n\r\n /** @deprecated 已废弃,无替代方法 */\r\n loadMockReleaseRoute(timeout?: number): Promise<any> {\r\n console.warn('[SGSMapSDK] loadMockReleaseRoute() is deprecated.');\r\n return Promise.reject({ code: 'ERR_UNSUPPORTED', message: 'loadMockReleaseRoute() is deprecated.' });\r\n }\r\n\r\n // ==================== 销毁 ====================\r\n\r\n /**\r\n * 销毁 SDK 实例\r\n *\r\n * <p>清理 iframe、移除事件监听器、reject 所有挂起的 Promise。\r\n * <p>销毁后调用任何命令方法都会 reject ERR_DESTROYED。\r\n */\r\n destroy() {\r\n if (this._isDestroyed) return; // 防重复销毁\r\n this._isDestroyed = true;\r\n\r\n // 清除 ready 超时计时器\r\n if (this._readyTimer) {\r\n clearTimeout(this._readyTimer);\r\n this._readyTimer = null;\r\n }\r\n\r\n // 🔧 P0: 清除 HELLO 重试定时器\r\n if (this._helloInterval) {\r\n clearInterval(this._helloInterval);\r\n this._helloInterval = null;\r\n }\r\n\r\n // reject ready Promise(如果还没 resolve/reject)\r\n if (this._readyReject) {\r\n this._readyReject({\r\n code: 'ERR_DESTROYED',\r\n message: 'SGSMapSDK has been destroyed before ready.'\r\n });\r\n this._readyResolve = null;\r\n this._readyReject = null;\r\n }\r\n\r\n // reject 所有挂起的命令\r\n this._rejectAllPending('ERR_DESTROYED', 'SGSMapSDK has been destroyed. Pending promises were rejected.');\r\n\r\n // 移除 iframe\r\n if (this.iframe) {\r\n if (this.iframe.parentNode) {\r\n this.iframe.parentNode.removeChild(this.iframe);\r\n }\r\n this.iframe = null;\r\n }\r\n\r\n // 移除事件监听器\r\n if (this._messageListener) {\r\n window.removeEventListener('message', this._messageListener);\r\n this._messageListener = null;\r\n }\r\n\r\n // 移除所有 EventEmitter 监听器\r\n this.removeAllListeners();\r\n\r\n this._isReady = false;\r\n console.log('[SGSMapSDK] Destroyed successfully. Cleaned up iframe, listeners and pending queues.');\r\n }\r\n}\r\n\r\n// 全局暴露(IIFE 产物使用)\r\nif (typeof window !== 'undefined') {\r\n (window as any).SGSMapSDK = SGSMapSDK;\r\n}\r\n"],"mappings":"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","names":["EventEmitter","event","listener","l","wrapper","payload","data","e","utils_exports","__export","isIndoorNavigableFloor","sortIndoorFloors","floorCode","floors","FLOOR_ORDER","indoorFloors","f","getFloorIndex","code","matchedIndex","numMatch","val","a","b","SDK_VERSION","PROTOCOL_VERSION","DEFAULT_READY_TIMEOUT","DEFAULT_CMD_TIMEOUT","SGSMapSDK","EventEmitter","options","containerEl","resolve","reject","iframe","iframeUrl","value","key","event","data","action","payload","requestId","error","resolver","errObj","sendHello","err","fireAndForget","cmd","pending","total","code","message","timeout","timer","node","floorId","res","config","markerId","from","to","startNode","endNode","pathPoints","toPoiId","fromPoiId","mode","types","visible","active","floorCode","hallId","stats","params","mapId","routeId","utils_exports"]} |