Files
frontend-miniapp/static/sgs-map-sdk/index.mjs.map
lyf 72885b7f54
Some checks failed
CI / verify (push) Has been cancelled
升级 SGS Map SDK 至 2.5.0
2026-07-16 09:43:52 +08:00

1 line
53 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"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暂存到 _pendingFireAndForgetready 后自动发送\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 * 导航至POISDK 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"]}