qlfy-postmate 1.2.3 → 1.2.4
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 +3 -3
- package/lib/index.mjs +3 -5
- package/lib/index.mjs.gz +0 -0
- package/lib/index.mjs.map +1 -0
- package/lib/index.umd.js +2 -1
- package/lib/index.umd.js.gz +0 -0
- package/lib/index.umd.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
### 子系统认证通信插件使用文档1.2.
|
|
1
|
+
### 子系统认证通信插件使用文档1.2.4
|
|
2
2
|
|
|
3
|
-
### 【1.2.
|
|
3
|
+
### 【1.2.4优化升级说明】
|
|
4
4
|
|
|
5
5
|
```txt
|
|
6
6
|
1、优化了同IP链接切换时的系统资源重复加载问题
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
3、建议
|
|
15
15
|
已完成集成系统也建议使用最新版本,使用变化极小
|
|
16
16
|
仅需以下两步操作:
|
|
17
|
-
(1)下载新版本插件:npm i qlfy-postmate@1.2.
|
|
17
|
+
(1)下载新版本插件:npm i qlfy-postmate@1.2.4
|
|
18
18
|
(2)使用处添加新参数:router
|
|
19
19
|
new ChildPostmate({...保持不变}, router)
|
|
20
20
|
```
|
package/lib/index.mjs
CHANGED
|
@@ -379,7 +379,7 @@ class k {
|
|
|
379
379
|
this.childRoutes.forEach((a) => {
|
|
380
380
|
if (r.endsWith(a.path)) {
|
|
381
381
|
this.sendRouteUpdate({
|
|
382
|
-
fullPath:
|
|
382
|
+
fullPath: a.path
|
|
383
383
|
}), s = !0;
|
|
384
384
|
return;
|
|
385
385
|
}
|
|
@@ -391,10 +391,7 @@ class k {
|
|
|
391
391
|
let t = !1;
|
|
392
392
|
this.eventBus.route_update_result = (s) => {
|
|
393
393
|
t = s, this.loadFunction && this.loadFunction();
|
|
394
|
-
}, this.postmateParent.call(
|
|
395
|
-
"routeUpdate",
|
|
396
|
-
JSON.stringify(e)
|
|
397
|
-
), console.log("---------------------- 【ParentPostmate】推送路由更新 ----------------------"), setTimeout(() => {
|
|
394
|
+
}, this.postmateParent.call("routeUpdate", JSON.stringify(e)), console.log("---------------------- 【ParentPostmate】推送路由更新 ----------------------"), setTimeout(() => {
|
|
398
395
|
t || (console.warn("【ParentPostmate】推送路由更新失败,将重新初始化iframe"), this.childSupportsRouteUpdate = !1, this.init());
|
|
399
396
|
}, 1e3);
|
|
400
397
|
} catch (t) {
|
|
@@ -414,3 +411,4 @@ export {
|
|
|
414
411
|
I as ChildPostmate,
|
|
415
412
|
k as ParentPostmate
|
|
416
413
|
};
|
|
414
|
+
//# sourceMappingURL=index.mjs.map
|
package/lib/index.mjs.gz
CHANGED
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../packages/postMeta/postMeta.js","../packages/postMeta/tools.ts","../packages/postMeta/ChildPostmate.ts","../packages/postMeta/ParentPostmate.ts"],"sourcesContent":["const MESSAGE_TYPE = \"application/x-postmate-v1+json\";\r\nlet uid = 0;\r\n\r\nconst allowedPostmateTypes = {\r\n handshake: 1,\r\n \"handshake-reply\": 1,\r\n call: 1,\r\n emit: 1,\r\n reply: 1,\r\n request: 1,\r\n};\r\n\r\n// 校验消息是否来自合法的来源\r\nfunction isValidMessage(event, allowedOrigin) {\r\n return (\r\n (typeof allowedOrigin !== \"string\" || event.origin === allowedOrigin) &&\r\n !!event.data &&\r\n (typeof event.data !== \"object\" || \"postmate\" in event.data) &&\r\n event.data.type === MESSAGE_TYPE &&\r\n !!allowedPostmateTypes[event.data.postmate]\r\n );\r\n}\r\n\r\n// ----------------- ParentAPI -----------------\r\nclass ParentAPI {\r\n constructor(config) {\r\n this.parent = config.parent;\r\n this.frame = config.frame;\r\n this.child = config.child;\r\n this.childOrigin = config.childOrigin;\r\n this.events = {};\r\n\r\n this.listener = (event) => {\r\n if (!isValidMessage(event, this.childOrigin)) return;\r\n const { value = {} } = event.data;\r\n const { name, data } = value;\r\n if (event.data.postmate === \"emit\" && name in this.events) {\r\n this.events[name].call(this, data);\r\n }\r\n };\r\n\r\n this.parent.addEventListener(\"message\", this.listener, false);\r\n }\r\n\r\n get(property) {\r\n return new Postmate.Promise((resolve) => {\r\n const id = ++uid;\r\n const handler = (event) => {\r\n if (event.data.uid === id && event.data.postmate === \"reply\") {\r\n this.parent.removeEventListener(\"message\", handler, false);\r\n resolve(event.data.value);\r\n }\r\n };\r\n this.parent.addEventListener(\"message\", handler, false);\r\n this.child.postMessage(\r\n {\r\n postmate: \"request\",\r\n type: MESSAGE_TYPE,\r\n property,\r\n uid: id,\r\n },\r\n this.childOrigin\r\n );\r\n });\r\n }\r\n\r\n call(method, data) {\r\n this.child.postMessage(\r\n {\r\n postmate: \"call\",\r\n type: MESSAGE_TYPE,\r\n property: method,\r\n data,\r\n },\r\n this.childOrigin\r\n );\r\n }\r\n\r\n on(event, callback) {\r\n this.events[event] = callback;\r\n }\r\n\r\n destroy() {\r\n window.removeEventListener(\"message\", this.listener, false);\r\n this.frame.parentNode.removeChild(this.frame);\r\n }\r\n}\r\n\r\n// ----------------- ChildAPI -----------------\r\nclass ChildAPI {\r\n constructor(config) {\r\n this.model = config.model;\r\n this.parent = config.parent;\r\n this.parentOrigin = config.parentOrigin;\r\n this.child = config.child;\r\n\r\n this.child.addEventListener(\"message\", (event) => {\r\n if (!isValidMessage(event, this.parentOrigin)) return;\r\n\r\n const { postmate, property, uid, data } = event.data;\r\n const value = this.model[property];\r\n\r\n if (postmate !== \"call\") {\r\n const result = typeof value === \"function\" ? value() : value;\r\n Postmate.Promise.resolve(result).then((res) => {\r\n event.source.postMessage(\r\n {\r\n property,\r\n postmate: \"reply\",\r\n type: MESSAGE_TYPE,\r\n uid,\r\n value: res,\r\n },\r\n event.origin\r\n );\r\n });\r\n } else if (property in this.model && typeof value === \"function\") {\r\n value(data);\r\n }\r\n });\r\n }\r\n\r\n emit(eventName, data) {\r\n this.parent.postMessage(\r\n {\r\n postmate: \"emit\",\r\n type: MESSAGE_TYPE,\r\n value: { name: eventName, data },\r\n },\r\n this.parentOrigin\r\n );\r\n }\r\n}\r\n\r\n// ----------------- Postmate -----------------\r\nclass Postmate {\r\n constructor({ container = document.body, model, url, name, classListArray = [] }) {\r\n this.parent = window;\r\n this.frame = document.createElement(\"iframe\");\r\n this.frame.name = name || \"\";\r\n this.frame.classList.add(...classListArray);\r\n container.appendChild(this.frame);\r\n\r\n this.child = this.frame.contentWindow;\r\n this.model = model || {};\r\n\r\n return this.sendHandshake(url);\r\n }\r\n\r\n sendHandshake(url) {\r\n const origin = (() => {\r\n const link = document.createElement(\"a\");\r\n link.href = url;\r\n const protocol = link.protocol.length > 4 ? link.protocol : window.location.protocol;\r\n const host = link.host.length ? (link.port === \"80\" || link.port === \"443\" ? link.hostname : link.host) : window.location.host;\r\n return link.origin || `${protocol}//${host}`;\r\n })();\r\n\r\n let attemptCount = 0;\r\n let interval;\r\n\r\n return new Postmate.Promise((resolve, reject) => {\r\n const listener = (event) => {\r\n if (!isValidMessage(event, origin)) return false;\r\n if (event.data.postmate === \"handshake-reply\") {\r\n clearInterval(interval);\r\n this.parent.removeEventListener(\"message\", listener, false);\r\n this.childOrigin = event.origin;\r\n resolve(new ParentAPI(this));\r\n } else {\r\n reject(\"Failed handshake\");\r\n }\r\n };\r\n\r\n this.parent.addEventListener(\"message\", listener, false);\r\n\r\n const send = () => {\r\n attemptCount++;\r\n this.child.postMessage(\r\n {\r\n postmate: \"handshake\",\r\n type: MESSAGE_TYPE,\r\n model: this.model,\r\n },\r\n origin\r\n );\r\n if (attemptCount === 5) clearInterval(interval);\r\n };\r\n\r\n const init = () => {\r\n send();\r\n interval = setInterval(send, 500);\r\n };\r\n\r\n this.frame.onload = init;\r\n this.frame.attachEvent && this.frame.attachEvent(\"onload\", init);\r\n this.frame.src = url;\r\n });\r\n }\r\n}\r\n\r\n// ----------------- Model -----------------\r\nclass Model {\r\n constructor(model) {\r\n this.child = window;\r\n this.model = model;\r\n this.parent = window.parent;\r\n\r\n return this.sendHandshakeReply();\r\n }\r\n\r\n sendHandshakeReply() {\r\n return new Postmate.Promise((resolve, reject) => {\r\n this.child.addEventListener(\"message\", (event) => {\r\n if (event.data.postmate) {\r\n if (event.data.postmate !== \"handshake\") return reject(\"Handshake Reply Failed\");\r\n\r\n this.child.removeEventListener(\"message\", this, false);\r\n event.source.postMessage(\r\n {\r\n postmate: \"handshake-reply\",\r\n type: MESSAGE_TYPE,\r\n },\r\n event.origin\r\n );\r\n\r\n this.parentOrigin = event.origin;\r\n const parentModel = event.data.model;\r\n if (parentModel) {\r\n Object.keys(parentModel).forEach((key) => {\r\n this.model[key] = parentModel[key];\r\n });\r\n }\r\n resolve(new ChildAPI(this));\r\n }\r\n }, false);\r\n });\r\n }\r\n}\r\n\r\n// Attach defaults\r\nPostmate.debug = false;\r\nPostmate.Promise = (() => {\r\n try {\r\n return typeof window !== \"undefined\" ? window.Promise : Promise;\r\n } catch {\r\n return Promise;\r\n }\r\n})();\r\nPostmate.Model = Model;\r\n\r\nexport default Postmate;\r\nexport { Model };\r\n","/**\r\n * 检查路径是否存在于路由配置中(递归检查所有层级)\r\n * @param routes 路由配置数组\r\n * @param path 需要检查的路径\r\n * @returns 是否存在\r\n */\r\nexport function checkPathInRoutes(routes: any[], path: string): boolean {\r\n for (const route of routes) {\r\n // 检查当前路由\r\n if (route.path === path) {\r\n return true;\r\n }\r\n\r\n // 递归检查子路由\r\n if (route.children && Array.isArray(route.children) && route.children.length > 0) {\r\n if (checkPathInRoutes(route.children, path)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * 判断路径是否存在于vue-router对象中(兼容Vue2和Vue3)\r\n * @param router vue-router实例\r\n * @param path 需要检查的页面路径\r\n * @returns 路径是否存在\r\n */\r\nexport function isRouteExists(router: any, path: string): boolean {\r\n // 移除路径中的查询参数\r\n if (path.includes('?')) {\r\n path = path.split('?')[0];\r\n }\r\n const routes = getRouterPaths(router);\r\n if (!routes || routes.length === 0) return false;\r\n return checkPathInRoutes(routes, path);\r\n}\r\n\r\n/**\r\n * 获取路由路径\r\n *\r\n */\r\nexport function getRouterPaths(router: any): any[] {\r\n let routes: any[] = [];\r\n // 区分Vue Router 3.x (Vue2) 和 4.x (Vue3)\r\n if (typeof router.getRoutes === 'function') {\r\n // Vue Router 4.x (Vue3)\r\n routes = router.getRoutes();\r\n } else if (router.options && Array.isArray(router.options.routes)) {\r\n // Vue Router 3.x (Vue2)\r\n routes = router.options.routes;\r\n }\r\n return routes || [];\r\n}\r\n\r\n\r\n/**\r\n * 比较两个URL的协议、IP(或域名)和端口是否完全相同\r\n * @param url1 第一个URL字符串\r\n * @param url2 第二个URL字符串\r\n * @returns 如果协议、IP(或域名)和端口都相同则返回true,否则返回false;解析失败时返回false\r\n */\r\nexport function areUrlsSameProtocolIpPort(url1: string, url2: string): boolean {\r\n try {\r\n // 解析两个URL\r\n const parsedUrl1 = new URL(url1);\r\n const parsedUrl2 = new URL(url2);\r\n \r\n // 比较协议(不区分大小写,但通常URL协议是小写的)\r\n const sameProtocol = parsedUrl1.protocol.toLowerCase() === parsedUrl2.protocol.toLowerCase();\r\n \r\n // 比较主机(IP或域名)\r\n const sameHost = parsedUrl1.hostname === parsedUrl2.hostname;\r\n \r\n // 比较端口(如果未指定端口,会使用协议默认端口)\r\n const samePort = parsedUrl1.port === parsedUrl2.port;\r\n \r\n // 只有所有部分都相同时才返回true\r\n return sameProtocol && sameHost && samePort;\r\n } catch (error) {\r\n // 如果URL解析失败,返回false\r\n console.error('URL解析错误:', error);\r\n return false;\r\n }\r\n}","import Postmate from './postMeta'\nimport { getRouterPaths, isRouteExists } from './tools';\n\ninterface EventObj {\n error: (error: any) => void\n success: (success: any) => void\n receive: (receive: any) => void\n}\n\n// 路由更新接口\ninterface RouteUpdateInfo {\n fullPath: string;\n}\n\nexport default class ChildPostmate {\n childPostmate: any = null\n parentPostmate: any = null\n\n isGetData: boolean = false\n getDataCllBack: Function | null = null\n \n // Vue Router实例\n router: any = null\n // 路由更新回调函数\n routeUpdateCallback: ((routeInfo: RouteUpdateInfo) => void) | undefined = undefined\n\n constructor(eventObj: EventObj, router: any, routeUpdateCallback?: (routeInfo: RouteUpdateInfo) => void) {\n // 保存router实例\n this.router = router;\n // 保存路由更新回调函数\n this.routeUpdateCallback = routeUpdateCallback;\n \n if (window.top !== window.self) this.init(eventObj)\n else {\n eventObj.error({ status: 500, data: null, message: '未在一体化平台中运行' })\n }\n }\n\n init(eventObj: EventObj) {\n const that = this\n // 创建 Postmate Model(作为子)\n this.childPostmate = new Postmate.Model({\n // 定义子页面可以暴露给父页面的方法\n baseData(data: any) {\n data = JSON.parse(data)\n if (that.isGetData) {\n that.getDataCllBack &&\n that.getDataCllBack({\n status: 200,\n message: 'success',\n data: data,\n })\n } else\n eventObj.receive({\n status: 200,\n message: 'success',\n data: data,\n })\n that.isGetData = false\n },\n\n // 提供当前系统的路由\n getRoutes:()=>{\n // 有路由\n if(that.router){\n let arr = getRouterPaths(that.router)\n that.parentPostmate.emit('pushRoutes',JSON.stringify(arr))\n } \n // 无路由\n else that.parentPostmate.emit('pushRoutes')\n },\n\n // 检查路由是否存在\n isRouteExists(routePath:string){\n if(that.router)that.parentPostmate.emit('routeExists',isRouteExists(that.router,routePath))\n else that.parentPostmate.emit('routeExists',false)\n },\n\n // 处理路由更新\n routeUpdate(routeInfoStr: string) {\n // 向父页面同步路由数据\n try {\n const routeInfo: RouteUpdateInfo = JSON.parse(routeInfoStr);\n \n // 如果提供了自定义的路由更新回调函数,则调用它\n if (that.routeUpdateCallback) {\n that.routeUpdateCallback(routeInfo);\n return;\n }\n \n // 如果提供了router实例,则使用router进行路由更新\n if (that.router) {\n that.router.replace(routeInfo.fullPath);\n that.parentPostmate.emit('route_update_result',true)\n console.log('----------------- 【ChildPastMate】路由更新完成 -----------------')\n } else {\n that.parentPostmate.emit('route_update_result',false)\n console.warn('【ChildPastMate】未提供router实例,无法进行路由更新');\n }\n } catch (error) {\n console.error('【ChildPastMate】路由更新失败:', error);\n that.parentPostmate.emit('route_update_result',false)\n }\n },\n\n })\n .then((parent: any) => {\n that.parentPostmate = parent\n that.getData()\n // 与父页面链接建立成功\n eventObj.success({\n status: 200,\n message: 'success',\n data: {\n ChildPostmate: parent,\n },\n })\n // 告诉父系统支持路由更新\n that.parentPostmate.emit('route_update_support',that.router ? true : false)\n\n // 向父页面同步路由数据\n that.router && that.parentPostmate.emit('pushRoutes',JSON.stringify(getRouterPaths(that.router)))\n })\n .catch((err: any) => {\n eventObj.error({ status: 500, data: null, message: err })\n })\n }\n\n // 获取数据\n getData(callback?: any) {\n if (!this.parentPostmate) {\n callback({\n status: 500,\n message: '父页面未连接',\n data: null,\n })\n return\n }\n\n if (callback) {\n this.isGetData = true\n this.getDataCllBack = callback\n } else {\n this.isGetData = false\n this.getDataCllBack = null\n }\n // 向父页面获取数据\n this.parentPostmate.emit('requestBaseData')\n }\n\n /**\n * 设置路由实例和路由更新回调\n * @param router Vue Router实例\n * @param routeUpdateCallback 自定义路由更新回调函数\n */\n setRouter(router: any, routeUpdateCallback?: (routeInfo: RouteUpdateInfo) => void) {\n this.router = router;\n if (routeUpdateCallback) {\n this.routeUpdateCallback = routeUpdateCallback;\n }\n }\n\n /**\n * 向父页面发送其他请求\n * @param params 请求参数\n */\n sendOtherRequest(params: any) {\n if (!this.parentPostmate) return;\n this.parentPostmate.emit('otherRequest', params);\n }\n}","import Postmate from './postMeta';\nimport { areUrlsSameProtocolIpPort, checkPathInRoutes } from './tools';\n\ninterface DataInfo {\n\tloginInfo: { [x: string]: any };\n\ttoken: string;\n\tisHideHeader: boolean;\n}\n\n// URL解析结果接口\ninterface ParsedUrl {\n\tprotocol: string;\n\thost: string;\n\tport: string;\n\tpathname: string;\n\tsearch: string;\n\thash: string;\n\torigin: string;\n\tfullPath: string;\n}\n\nexport default class ParentPostmate {\n\t/** 连接到的子 postmate 实例 */\n\tpostmateParent: any = null;\n\t/** 通讯数据 */\n\tdataInfo: DataInfo = {\n\t\tloginInfo: {},\n\t\ttoken: '',\n\t\tisHideHeader: true,\n\t};\n\t/** iframe Dom 容器 */\n\tiframeEle: any = null;\n\t/** 当前 iframe url */\n\tcurrentUrl: string = '';\n\t/** 当前url基础地址 */\n\tcurrentBaseUrl: string = '';\n\t/** 当前路由地址 */\n\tcurrentRouterPath: string = '';\n\t/** 存储当前的 iframe 元素 */\n\tcurrentIframe: any = null;\n\t/** iframe 加载完成执行函数 */\n\tloadFunction: (() => void) | null = null;\n\t/** 处理子类的其他请求方法 */\n\thandleOtherRequest: ((params: any) => void) | null = null;\n\t/** 当前URL解析结果 */\n\tparsedCurrentUrl: ParsedUrl | null = null;\n\t/** 子页面是否支持路由更新 */\n\tchildSupportsRouteUpdate: boolean = true;\n\t/** 子系统的路由列表 */\n\tchildRoutes: any[] = [];\n\n\teventBus: any = {\n\t\tgetRoutes: null,\n\t\troute_update_resultL: null,\n\t};\n\n\tconstructor(dataInfo: DataInfo, iframeEle: HTMLElement | (() => HTMLElement), iframeUrl: string = '', handleOtherRequest?: (params: any) => void) {\n\t\tthis.dataInfo = dataInfo || this.dataInfo;\n\t\tthis.iframeEle = iframeEle;\n\t\tthis.setIframeUrl(iframeUrl);\n\t\thandleOtherRequest && (this.handleOtherRequest = handleOtherRequest);\n\t}\n\n\t/** 解析URL */\n\tparseUrl(url: string): ParsedUrl {\n\t\tconst link = document.createElement('a');\n\t\tlink.href = url;\n\n\t\t// 获取协议\n\t\tconst protocol = link.protocol.length > 4 ? link.protocol : window.location.protocol;\n\n\t\t// 获取主机和端口\n\t\tconst host = link.hostname;\n\t\tconst port = link.port || (protocol === 'https:' ? '443' : protocol === 'http:' ? '80' : '');\n\n\t\t// 获取路径、查询参数和哈希\n\t\tconst pathname = link.pathname.startsWith('/') ? link.pathname : `/${link.pathname}`;\n\t\tconst search = link.search;\n\t\tconst hash = link.hash.slice(2, link.hash.length);\n\n\t\t// 构建origin\n\t\tconst origin = link.origin || `${protocol}//${host}${port ? `:${port}` : ''}`;\n\n\t\t// 构建完整路径(不包含origin)\n\t\tconst fullPath = `${pathname}${hash}`;\n\n\t\treturn {\n\t\t\tprotocol,\n\t\t\thost,\n\t\t\tport,\n\t\t\tpathname,\n\t\t\tsearch,\n\t\t\thash,\n\t\t\torigin,\n\t\t\tfullPath,\n\t\t};\n\t}\n\n\t/** 比较两个URL是否相同*/\n\tcompareUrlBase(url1: string, url2: string): boolean {\n\t\tconst url1End = url1.endsWith('/');\n\t\tconst url2End = url2.endsWith('/');\n\t\tif ((url1End && url2End) || (!url1End && !url2End)) {\n\t\t\treturn url1 === url2;\n\t\t} else {\n\t\t\tif (url1End) url2 += '/';\n\t\t\tif (url2End) url1 += '/';\n\t\t\treturn url1 === url2;\n\t\t}\n\t}\n\n\t/** 比较两个URL的路径是否相同(不包含查询参数和哈希) */\n\tcompareUrlPath(url1: string, url2: string): boolean {\n\t\tif (!url1 || !url2) return false;\n\n\t\tconst parsed1 = this.parseUrl(url1);\n\t\tconst parsed2 = this.parseUrl(url2);\n\n\t\treturn parsed1.pathname === parsed2.pathname;\n\t}\n\n\t/** 比较两个URL是否完全相同(包括查询参数和哈希) */\n\tcompareUrlFull(url1: string, url2: string): boolean {\n\t\tif (!url1 || !url2) return false;\n\n\t\tconst parsed1 = this.parseUrl(url1);\n\t\tconst parsed2 = this.parseUrl(url2);\n\n\t\treturn parsed1.fullPath === parsed2.fullPath;\n\t}\n\n\t/** 清除当前的 iframe 和 postmate 实例 */\n\tclear() {\n\t\t// 销毁 postmate 实例\n\t\tif (this.postmateParent) {\n\t\t\tthis.postmateParent.destroy();\n\t\t\tthis.postmateParent = null;\n\t\t}\n\n\t\t// 移除 iframe\n\t\tif (this.currentIframe && this.currentIframe.parentNode) {\n\t\t\tthis.currentIframe.parentNode.removeChild(this.currentIframe);\n\t\t}\n\t\tthis.currentIframe = null;\n\t}\n\n\t/** 初始化 */\n\tasync init(callback: any = null) {\n\t\t// 清除之前的实例和 iframe\n\t\tthis.clear();\n\n\t\t// 重置子页面路由更新支持标记\n\t\tthis.childSupportsRouteUpdate = false;\n\n\t\t// 如果没有容器,或集成链接\n\t\tif (!this.iframeEle || !this.currentUrl) {\n\t\t\tthis.destroy();\n\t\t}\n\n\t\t// 获取 iframe 容器\n\t\tconst container: any = typeof this.iframeEle === 'function' ? this.iframeEle() : this.iframeEle;\n\t\tif (!container) {\n\t\t\tconsole.warn('【ParentPostmate】无法获取 iframe 容器');\n\t\t\treturn;\n\t\t}\n\n\t\t// 创建 Postmate 实例(作为父)\n\t\tconst handshake: any = new Postmate({\n\t\t\tcontainer,\n\t\t\turl: this.currentUrl,\n\t\t\tname: '',\n\t\t\tmodel: '',\n\t\t});\n\n\t\t// 存储当前创建的 iframe\n\t\tthis.currentIframe = container.querySelector('iframe');\n\t\tthis.currentIframe.setAttribute('frameborder', '0');\n\t\tthis.currentIframe.setAttribute('allow', 'fullscreen');\n\t\tthis.currentIframe.addEventListener('load', () => {\n\t\t\tthis.loadFunction && this.loadFunction();\n\t\t});\n\n\t\thandshake\n\t\t\t.then((parent: any) => {\n\t\t\t\tthis.postmateParent = parent;\n\n\t\t\t\t// 监听子页面发来的获取数据请求\n\t\t\t\tparent.on('requestBaseData', () => {\n\t\t\t\t\t// 发送相关数据\n\t\t\t\t\tthis.sendData();\n\t\t\t\t});\n\n\t\t\t\t// 监听子页面发来的路由配置数据\n\t\t\t\tparent.on('pushRoutes', (routes: string) => {\n\t\t\t\t\tif (routes) this.childRoutes = JSON.parse(routes);\n\t\t\t\t\telse this.childRoutes = [];\n\t\t\t\t\tthis.eventBus.getRoutes && this.eventBus.getRoutes();\n\t\t\t\t});\n\n\t\t\t\t// 监听子页面的路由效验结果\n\t\t\t\tparent.on('routeExists', (flag: boolean) => {});\n\n\t\t\t\t// 监听子页面的动态路由变更支持\n\t\t\t\tparent.on('route_update_support', (flag: boolean) => {\n\t\t\t\t\tthis.childSupportsRouteUpdate = flag;\n\t\t\t\t});\n\n\t\t\t\t// 监听子页面的路由变更结果\n\t\t\t\tparent.on('route_update_result', (flag: boolean) => {\n\t\t\t\t\tthis.eventBus.route_update_result && this.eventBus.route_update_result(flag);\n\t\t\t\t});\n\n\t\t\t\t// 监听子页面发来的其他请求\n\t\t\t\tparent.on('otherRequest', (params: any) => {\n\t\t\t\t\tthis.handleOtherRequest && this.handleOtherRequest(params);\n\t\t\t\t});\n\n\t\t\t\tif (typeof callback === 'function') callback();\n\t\t\t})\n\t\t\t.catch((error: any) => {\n\t\t\t\tconsole.error('【ParentPostmate】Postmate 连接失败:', error);\n\t\t\t});\n\t}\n\n\t/** 设置load执行事件 */\n\tsetLoadFunction(loadFunction: () => void) {\n\t\tthis.loadFunction = loadFunction;\n\t}\n\n\t/** 设置 iframe url */\n\tsetIframeUrl(iframeUrl: string, routerPath: string = '') {\n\t\t// 如果传入了路由,则对路径进行规范处理\n\t\tif (routerPath && !routerPath.startsWith('/')) {\n\t\t\trouterPath = '/' + routerPath;\n\t\t}\n\n\t\t// 1、传入的地址为空:销毁当前实例\n\t\tif (!iframeUrl) {\n\t\t\tthis.currentUrl = '';\n\t\t\tthis.currentRouterPath = '';\n\t\t\tthis.destroy();\n\t\t\tconsole.error('【ParentPostmate】无加载地址,无法初始化');\n\t\t\treturn;\n\t\t}\n\n\t\t// 2、如果当前无连接:直接设置并初始化\n\t\tif (!this.postmateParent || !this.currentUrl) {\n\t\t\tthis.currentUrl = iframeUrl;\n\t\t\tthis.currentRouterPath = routerPath;\n\t\t\tif (this.iframeEle) this.init();\n\t\t\telse console.error('【ParentPostmate】无 iframe 容器,无法初始化');\n\t\t\treturn;\n\t\t}\n\n\t\t// 3、如果当前系统不支持路由更新 或 新旧系统协议、ip、端口不同则重新初始化: 重新初始化\n\t\tif (!this.childSupportsRouteUpdate || !this.childRoutes?.length || !areUrlsSameProtocolIpPort(this.currentUrl, iframeUrl)) {\n\t\t\tthis.currentUrl = iframeUrl;\n\t\t\tthis.currentRouterPath = routerPath;\n\t\t\tthis.init();\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * 因新旧地址的基础地址完全相同,且已加载系统支持路由更新\n\t\t * 下面处理新旧地址的url,研判操作方式\n\t\t **/\n\t\t// 更新路由列表\n\t\tlet flag = false;\n\t\tthis.eventBus.getRoutes = () => {\n\t\t\tflag = true;\n\t\t\tthis.handleSimilarUrl(iframeUrl, routerPath);\n\t\t};\n\t\tthis.postmateParent.call('getRoutes');\n\n\t\tsetTimeout(() => {\n\t\t\tif (flag) return;\n\t\t\tthis.handleSimilarUrl(iframeUrl, routerPath);\n\t\t}, 1000);\n\t}\n\n\t// 处理相似地址\n\thandleSimilarUrl(iframeUrl: string, routerPath?: string) {\n\t\tthis.currentUrl = iframeUrl;\n\t\tthis.currentRouterPath = routerPath || '';\n\n\t\t// 1 如果传入了routerPath,将该值与子系统匹配,判断是否可以直接跳转\n\t\tif (routerPath && checkPathInRoutes(this.childRoutes, routerPath)) {\n\t\t\t// 触发更新路由\n\t\t\tthis.sendRouteUpdate({\n\t\t\t\tfullPath: routerPath,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// 2 通过已加载子系统的路由列表匹配新链接的尾部路径,如果匹配到,则触发路由更新\n\t\tlet isEnd = false;\n\t\tlet noQueryUrl = iframeUrl.split('?')[0];\n\t\tthis.childRoutes.forEach((v) => {\n\t\t\tif (noQueryUrl.endsWith(v.path)) {\n\t\t\t\t// 触发更新路由\n\t\t\t\tthis.sendRouteUpdate({\n\t\t\t\t\tfullPath: v.path,\n\t\t\t\t});\n\t\t\t\tisEnd = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t});\n\t\tif (isEnd) return;\n\n\t\t// 3 如果以上两种情况都不满足,则重新初始化\n\t\tthis.init();\n\t}\n\n\t/** 向子页面发送路由更新消息 */\n\tsendRouteUpdate(parsedUrl: any) {\n\t\ttry {\n\t\t\tlet flag = false;\n\t\t\tthis.eventBus.route_update_result = (state: boolean) => {\n\t\t\t\tflag = state;\n\t\t\t\tthis.loadFunction && this.loadFunction();\n\t\t\t};\n\t\t\tthis.postmateParent.call('routeUpdate', JSON.stringify(parsedUrl));\n\t\t\tconsole.log('---------------------- 【ParentPostmate】推送路由更新 ----------------------');\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (flag) return;\n\t\t\t\tconsole.warn('【ParentPostmate】推送路由更新失败,将重新初始化iframe');\n\t\t\t\t// 标记子页面不支持路由更新\n\t\t\t\tthis.childSupportsRouteUpdate = false;\n\t\t\t\t// 如果发送消息失败,则重新初始化iframe\n\t\t\t\tthis.init();\n\t\t\t}, 1000);\n\t\t} catch (error) {\n\t\t\tconsole.warn('【ParentPostmate】发送路由更新消息失败,将重新初始化iframe:', error);\n\t\t\t// 标记子页面不支持路由更新\n\t\t\tthis.childSupportsRouteUpdate = false;\n\t\t\t// 如果发送消息失败,则重新初始化iframe\n\t\t\tthis.init();\n\t\t}\n\t}\n\n\t/** 向子页面发送消息 */\n\tsendData() {\n\t\tif (!this.postmateParent) return;\n\t\tthis.postmateParent.call('baseData', JSON.stringify(this.dataInfo));\n\t}\n\n\t/** 销毁实例 */\n\tdestroy() {\n\t\tthis.clear();\n\t}\n}\n"],"names":["MESSAGE_TYPE","uid","allowedPostmateTypes","isValidMessage","event","allowedOrigin","ParentAPI","config","value","name","data","property","Postmate","resolve","id","handler","method","callback","ChildAPI","postmate","result","res","eventName","container","model","url","classListArray","origin","link","protocol","host","attemptCount","interval","reject","listener","send","init","Model","parentModel","key","checkPathInRoutes","routes","path","route","isRouteExists","router","getRouterPaths","areUrlsSameProtocolIpPort","url1","url2","parsedUrl1","parsedUrl2","sameProtocol","sameHost","samePort","error","ChildPostmate","eventObj","routeUpdateCallback","that","arr","routePath","routeInfoStr","routeInfo","parent","err","params","ParentPostmate","dataInfo","iframeEle","iframeUrl","handleOtherRequest","port","pathname","search","hash","fullPath","url1End","url2End","parsed1","parsed2","handshake","flag","loadFunction","routerPath","_a","isEnd","noQueryUrl","v","parsedUrl","state"],"mappings":"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"}
|
package/lib/index.umd.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
(function(u,n){typeof exports=="object"&&typeof module<"u"?n(exports):typeof define=="function"&&define.amd?define(["exports"],n):(u=typeof globalThis<"u"?globalThis:u||self,n(u["qlfy-postmate"]={}))})(this,function(u){"use strict";const n="application/x-postmate-v1+json";let P=0;const y={handshake:1,"handshake-reply":1,call:1,emit:1,reply:1,request:1};function m(i,e){return(typeof e!="string"||i.origin===e)&&!!i.data&&(typeof i.data!="object"||"postmate"in i.data)&&i.data.type===n&&!!y[i.data.postmate]}class R{constructor(e){this.parent=e.parent,this.frame=e.frame,this.child=e.child,this.childOrigin=e.childOrigin,this.events={},this.listener=t=>{if(!m(t,this.childOrigin))return;const{value:s={}}=t.data,{name:r,data:a}=s;t.data.postmate==="emit"&&r in this.events&&this.events[r].call(this,a)},this.parent.addEventListener("message",this.listener,!1)}get(e){return new l.Promise(t=>{const s=++P,r=a=>{a.data.uid===s&&a.data.postmate==="reply"&&(this.parent.removeEventListener("message",r,!1),t(a.data.value))};this.parent.addEventListener("message",r,!1),this.child.postMessage({postmate:"request",type:n,property:e,uid:s},this.childOrigin)})}call(e,t){this.child.postMessage({postmate:"call",type:n,property:e,data:t},this.childOrigin)}on(e,t){this.events[e]=t}destroy(){window.removeEventListener("message",this.listener,!1),this.frame.parentNode.removeChild(this.frame)}}class U{constructor(e){this.model=e.model,this.parent=e.parent,this.parentOrigin=e.parentOrigin,this.child=e.child,this.child.addEventListener("message",t=>{if(!m(t,this.parentOrigin))return;const{postmate:s,property:r,uid:a,data:h}=t.data,o=this.model[r];if(s!=="call"){const c=typeof o=="function"?o():o;l.Promise.resolve(c).then(d=>{t.source.postMessage({property:r,postmate:"reply",type:n,uid:a,value:d},t.origin)})}else r in this.model&&typeof o=="function"&&o(h)})}emit(e,t){this.parent.postMessage({postmate:"emit",type:n,value:{name:e,data:t}},this.parentOrigin)}}class l{constructor({container:e=document.body,model:t,url:s,name:r,classListArray:a=[]}){return this.parent=window,this.frame=document.createElement("iframe"),this.frame.name=r||"",this.frame.classList.add(...a),e.appendChild(this.frame),this.child=this.frame.contentWindow,this.model=t||{},this.sendHandshake(s)}sendHandshake(e){const t=(()=>{const a=document.createElement("a");a.href=e;const h=a.protocol.length>4?a.protocol:window.location.protocol,o=a.host.length?a.port==="80"||a.port==="443"?a.hostname:a.host:window.location.host;return a.origin||`${h}//${o}`})();let s=0,r;return new l.Promise((a,h)=>{const o=p=>{if(!m(p,t))return!1;p.data.postmate==="handshake-reply"?(clearInterval(r),this.parent.removeEventListener("message",o,!1),this.childOrigin=p.origin,a(new R(this))):h("Failed handshake")};this.parent.addEventListener("message",o,!1);const c=()=>{s++,this.child.postMessage({postmate:"handshake",type:n,model:this.model},t),s===5&&clearInterval(r)},d=()=>{c(),r=setInterval(c,500)};this.frame.onload=d,this.frame.attachEvent&&this.frame.attachEvent("onload",d),this.frame.src=e})}}class w{constructor(e){return this.child=window,this.model=e,this.parent=window.parent,this.sendHandshakeReply()}sendHandshakeReply(){return new l.Promise((e,t)=>{this.child.addEventListener("message",s=>{if(s.data.postmate){if(s.data.postmate!=="handshake")return t("Handshake Reply Failed");this.child.removeEventListener("message",this,!1),s.source.postMessage({postmate:"handshake-reply",type:n},s.origin),this.parentOrigin=s.origin;const r=s.data.model;r&&Object.keys(r).forEach(a=>{this.model[a]=r[a]}),e(new U(this))}},!1)})}}l.debug=!1,l.Promise=(()=>{try{return typeof window<"u"?window.Promise:Promise}catch{return Promise}})(),l.Model=w;function f(i,e){for(const t of i)if(t.path===e||t.children&&Array.isArray(t.children)&&t.children.length>0&&f(t.children,e))return!0;return!1}function E(i,e){e.includes("?")&&(e=e.split("?")[0]);const t=g(i);return!t||t.length===0?!1:f(t,e)}function g(i){let e=[];return typeof i.getRoutes=="function"?e=i.getRoutes():i.options&&Array.isArray(i.options.routes)&&(e=i.options.routes),e||[]}function I(i,e){try{const t=new URL(i),s=new URL(e),r=t.protocol.toLowerCase()===s.protocol.toLowerCase(),a=t.hostname===s.hostname,h=t.port===s.port;return r&&a&&h}catch(t){return console.error("URL解析错误:",t),!1}}class k{constructor(e,t,s){this.childPostmate=null,this.parentPostmate=null,this.isGetData=!1,this.getDataCllBack=null,this.router=null,this.routeUpdateCallback=void 0,this.router=t,this.routeUpdateCallback=s,window.top!==window.self?this.init(e):e.error({status:500,data:null,message:"未在一体化平台中运行"})}init(e){const t=this;this.childPostmate=new l.Model({baseData(s){s=JSON.parse(s),t.isGetData?t.getDataCllBack&&t.getDataCllBack({status:200,message:"success",data:s}):e.receive({status:200,message:"success",data:s}),t.isGetData=!1},getRoutes:()=>{if(t.router){let s=g(t.router);t.parentPostmate.emit("pushRoutes",JSON.stringify(s))}else t.parentPostmate.emit("pushRoutes")},isRouteExists(s){t.router?t.parentPostmate.emit("routeExists",E(t.router,s)):t.parentPostmate.emit("routeExists",!1)},routeUpdate(s){try{const r=JSON.parse(s);if(t.routeUpdateCallback){t.routeUpdateCallback(r);return}t.router?(t.router.replace(r.fullPath),t.parentPostmate.emit("route_update_result",!0),console.log("----------------- 【ChildPastMate】路由更新完成 -----------------")):(t.parentPostmate.emit("route_update_result",!1),console.warn("【ChildPastMate】未提供router实例,无法进行路由更新"))}catch(r){console.error("【ChildPastMate】路由更新失败:",r),t.parentPostmate.emit("route_update_result",!1)}}}).then(s=>{t.parentPostmate=s,t.getData(),e.success({status:200,message:"success",data:{ChildPostmate:s}}),t.parentPostmate.emit("route_update_support",!!t.router),t.router&&t.parentPostmate.emit("pushRoutes",JSON.stringify(g(t.router)))}).catch(s=>{e.error({status:500,data:null,message:s})})}getData(e){if(!this.parentPostmate){e({status:500,message:"父页面未连接",data:null});return}e?(this.isGetData=!0,this.getDataCllBack=e):(this.isGetData=!1,this.getDataCllBack=null),this.parentPostmate.emit("requestBaseData")}setRouter(e,t){this.router=e,t&&(this.routeUpdateCallback=t)}sendOtherRequest(e){this.parentPostmate&&this.parentPostmate.emit("otherRequest",e)}}class C{constructor(e,t,s="",r){this.postmateParent=null,this.dataInfo={loginInfo:{},token:"",isHideHeader:!0},this.iframeEle=null,this.currentUrl="",this.currentBaseUrl="",this.currentRouterPath="",this.currentIframe=null,this.loadFunction=null,this.handleOtherRequest=null,this.parsedCurrentUrl=null,this.childSupportsRouteUpdate=!0,this.childRoutes=[],this.eventBus={getRoutes:null,route_update_resultL:null},this.dataInfo=e||this.dataInfo,this.iframeEle=t,this.setIframeUrl(s),r&&(this.handleOtherRequest=r)}parseUrl(e){const t=document.createElement("a");t.href=e;const s=t.protocol.length>4?t.protocol:window.location.protocol,r=t.hostname,a=t.port||(s==="https:"?"443":s==="http:"?"80":""),h=t.pathname.startsWith("/")?t.pathname:`/${t.pathname}`,o=t.search,c=t.hash.slice(2,t.hash.length),d=t.origin||`${s}//${r}${a?`:${a}`:""}`,p=`${h}${c}`;return{protocol:s,host:r,port:a,pathname:h,search:o,hash:c,origin:d,fullPath:p}}compareUrlBase(e,t){const s=e.endsWith("/"),r=t.endsWith("/");return s&&r||!s&&!r||(s&&(t+="/"),r&&(e+="/")),e===t}compareUrlPath(e,t){if(!e||!t)return!1;const s=this.parseUrl(e),r=this.parseUrl(t);return s.pathname===r.pathname}compareUrlFull(e,t){if(!e||!t)return!1;const s=this.parseUrl(e),r=this.parseUrl(t);return s.fullPath===r.fullPath}clear(){this.postmateParent&&(this.postmateParent.destroy(),this.postmateParent=null),this.currentIframe&&this.currentIframe.parentNode&&this.currentIframe.parentNode.removeChild(this.currentIframe),this.currentIframe=null}async init(e=null){this.clear(),this.childSupportsRouteUpdate=!1,(!this.iframeEle||!this.currentUrl)&&this.destroy();const t=typeof this.iframeEle=="function"?this.iframeEle():this.iframeEle;if(!t){console.warn("【ParentPostmate】无法获取 iframe 容器");return}const s=new l({container:t,url:this.currentUrl,name:"",model:""});this.currentIframe=t.querySelector("iframe"),this.currentIframe.setAttribute("frameborder","0"),this.currentIframe.setAttribute("allow","fullscreen"),this.currentIframe.addEventListener("load",()=>{this.loadFunction&&this.loadFunction()}),s.then(r=>{this.postmateParent=r,r.on("requestBaseData",()=>{this.sendData()}),r.on("pushRoutes",a=>{a?this.childRoutes=JSON.parse(a):this.childRoutes=[],this.eventBus.getRoutes&&this.eventBus.getRoutes()}),r.on("routeExists",a=>{}),r.on("route_update_support",a=>{this.childSupportsRouteUpdate=a}),r.on("route_update_result",a=>{this.eventBus.route_update_result&&this.eventBus.route_update_result(a)}),r.on("otherRequest",a=>{this.handleOtherRequest&&this.handleOtherRequest(a)}),typeof e=="function"&&e()}).catch(r=>{console.error("【ParentPostmate】Postmate 连接失败:",r)})}setLoadFunction(e){this.loadFunction=e}setIframeUrl(e,t=""){var r;if(t&&!t.startsWith("/")&&(t="/"+t),!e){this.currentUrl="",this.currentRouterPath="",this.destroy(),console.error("【ParentPostmate】无加载地址,无法初始化");return}if(!this.postmateParent||!this.currentUrl){this.currentUrl=e,this.currentRouterPath=t,this.iframeEle?this.init():console.error("【ParentPostmate】无 iframe 容器,无法初始化");return}if(!this.childSupportsRouteUpdate||!((r=this.childRoutes)!=null&&r.length)||!I(this.currentUrl,e)){this.currentUrl=e,this.currentRouterPath=t,this.init();return}let s=!1;this.eventBus.getRoutes=()=>{s=!0,this.handleSimilarUrl(e,t)},this.postmateParent.call("getRoutes"),setTimeout(()=>{s||this.handleSimilarUrl(e,t)},1e3)}handleSimilarUrl(e,t){if(this.currentUrl=e,this.currentRouterPath=t||"",t&&f(this.childRoutes,t)){this.sendRouteUpdate({fullPath:t});return}let s=!1,r=e.split("?")[0];this.childRoutes.forEach(a=>{if(r.endsWith(a.path)){this.sendRouteUpdate({fullPath:t}),s=!0;return}}),!s&&this.init()}sendRouteUpdate(e){try{let t=!1;this.eventBus.route_update_result=s=>{t=s,this.loadFunction&&this.loadFunction()},this.postmateParent.call("routeUpdate",JSON.stringify(e)),console.log("---------------------- 【ParentPostmate】推送路由更新 ----------------------"),setTimeout(()=>{t||(console.warn("【ParentPostmate】推送路由更新失败,将重新初始化iframe"),this.childSupportsRouteUpdate=!1,this.init())},1e3)}catch(t){console.warn("【ParentPostmate】发送路由更新消息失败,将重新初始化iframe:",t),this.childSupportsRouteUpdate=!1,this.init()}}sendData(){this.postmateParent&&this.postmateParent.call("baseData",JSON.stringify(this.dataInfo))}destroy(){this.clear()}}u.ChildPostmate=k,u.ParentPostmate=C,Object.defineProperty(u,Symbol.toStringTag,{value:"Module"})});
|
|
1
|
+
(function(u,n){typeof exports=="object"&&typeof module<"u"?n(exports):typeof define=="function"&&define.amd?define(["exports"],n):(u=typeof globalThis<"u"?globalThis:u||self,n(u["qlfy-postmate"]={}))})(this,function(u){"use strict";const n="application/x-postmate-v1+json";let g=0;const y={handshake:1,"handshake-reply":1,call:1,emit:1,reply:1,request:1};function m(i,e){return(typeof e!="string"||i.origin===e)&&!!i.data&&(typeof i.data!="object"||"postmate"in i.data)&&i.data.type===n&&!!y[i.data.postmate]}class R{constructor(e){this.parent=e.parent,this.frame=e.frame,this.child=e.child,this.childOrigin=e.childOrigin,this.events={},this.listener=t=>{if(!m(t,this.childOrigin))return;const{value:s={}}=t.data,{name:r,data:a}=s;t.data.postmate==="emit"&&r in this.events&&this.events[r].call(this,a)},this.parent.addEventListener("message",this.listener,!1)}get(e){return new l.Promise(t=>{const s=++g,r=a=>{a.data.uid===s&&a.data.postmate==="reply"&&(this.parent.removeEventListener("message",r,!1),t(a.data.value))};this.parent.addEventListener("message",r,!1),this.child.postMessage({postmate:"request",type:n,property:e,uid:s},this.childOrigin)})}call(e,t){this.child.postMessage({postmate:"call",type:n,property:e,data:t},this.childOrigin)}on(e,t){this.events[e]=t}destroy(){window.removeEventListener("message",this.listener,!1),this.frame.parentNode.removeChild(this.frame)}}class U{constructor(e){this.model=e.model,this.parent=e.parent,this.parentOrigin=e.parentOrigin,this.child=e.child,this.child.addEventListener("message",t=>{if(!m(t,this.parentOrigin))return;const{postmate:s,property:r,uid:a,data:h}=t.data,o=this.model[r];if(s!=="call"){const c=typeof o=="function"?o():o;l.Promise.resolve(c).then(d=>{t.source.postMessage({property:r,postmate:"reply",type:n,uid:a,value:d},t.origin)})}else r in this.model&&typeof o=="function"&&o(h)})}emit(e,t){this.parent.postMessage({postmate:"emit",type:n,value:{name:e,data:t}},this.parentOrigin)}}class l{constructor({container:e=document.body,model:t,url:s,name:r,classListArray:a=[]}){return this.parent=window,this.frame=document.createElement("iframe"),this.frame.name=r||"",this.frame.classList.add(...a),e.appendChild(this.frame),this.child=this.frame.contentWindow,this.model=t||{},this.sendHandshake(s)}sendHandshake(e){const t=(()=>{const a=document.createElement("a");a.href=e;const h=a.protocol.length>4?a.protocol:window.location.protocol,o=a.host.length?a.port==="80"||a.port==="443"?a.hostname:a.host:window.location.host;return a.origin||`${h}//${o}`})();let s=0,r;return new l.Promise((a,h)=>{const o=p=>{if(!m(p,t))return!1;p.data.postmate==="handshake-reply"?(clearInterval(r),this.parent.removeEventListener("message",o,!1),this.childOrigin=p.origin,a(new R(this))):h("Failed handshake")};this.parent.addEventListener("message",o,!1);const c=()=>{s++,this.child.postMessage({postmate:"handshake",type:n,model:this.model},t),s===5&&clearInterval(r)},d=()=>{c(),r=setInterval(c,500)};this.frame.onload=d,this.frame.attachEvent&&this.frame.attachEvent("onload",d),this.frame.src=e})}}class w{constructor(e){return this.child=window,this.model=e,this.parent=window.parent,this.sendHandshakeReply()}sendHandshakeReply(){return new l.Promise((e,t)=>{this.child.addEventListener("message",s=>{if(s.data.postmate){if(s.data.postmate!=="handshake")return t("Handshake Reply Failed");this.child.removeEventListener("message",this,!1),s.source.postMessage({postmate:"handshake-reply",type:n},s.origin),this.parentOrigin=s.origin;const r=s.data.model;r&&Object.keys(r).forEach(a=>{this.model[a]=r[a]}),e(new U(this))}},!1)})}}l.debug=!1,l.Promise=(()=>{try{return typeof window<"u"?window.Promise:Promise}catch{return Promise}})(),l.Model=w;function f(i,e){for(const t of i)if(t.path===e||t.children&&Array.isArray(t.children)&&t.children.length>0&&f(t.children,e))return!0;return!1}function E(i,e){e.includes("?")&&(e=e.split("?")[0]);const t=P(i);return!t||t.length===0?!1:f(t,e)}function P(i){let e=[];return typeof i.getRoutes=="function"?e=i.getRoutes():i.options&&Array.isArray(i.options.routes)&&(e=i.options.routes),e||[]}function I(i,e){try{const t=new URL(i),s=new URL(e),r=t.protocol.toLowerCase()===s.protocol.toLowerCase(),a=t.hostname===s.hostname,h=t.port===s.port;return r&&a&&h}catch(t){return console.error("URL解析错误:",t),!1}}class k{constructor(e,t,s){this.childPostmate=null,this.parentPostmate=null,this.isGetData=!1,this.getDataCllBack=null,this.router=null,this.routeUpdateCallback=void 0,this.router=t,this.routeUpdateCallback=s,window.top!==window.self?this.init(e):e.error({status:500,data:null,message:"未在一体化平台中运行"})}init(e){const t=this;this.childPostmate=new l.Model({baseData(s){s=JSON.parse(s),t.isGetData?t.getDataCllBack&&t.getDataCllBack({status:200,message:"success",data:s}):e.receive({status:200,message:"success",data:s}),t.isGetData=!1},getRoutes:()=>{if(t.router){let s=P(t.router);t.parentPostmate.emit("pushRoutes",JSON.stringify(s))}else t.parentPostmate.emit("pushRoutes")},isRouteExists(s){t.router?t.parentPostmate.emit("routeExists",E(t.router,s)):t.parentPostmate.emit("routeExists",!1)},routeUpdate(s){try{const r=JSON.parse(s);if(t.routeUpdateCallback){t.routeUpdateCallback(r);return}t.router?(t.router.replace(r.fullPath),t.parentPostmate.emit("route_update_result",!0),console.log("----------------- 【ChildPastMate】路由更新完成 -----------------")):(t.parentPostmate.emit("route_update_result",!1),console.warn("【ChildPastMate】未提供router实例,无法进行路由更新"))}catch(r){console.error("【ChildPastMate】路由更新失败:",r),t.parentPostmate.emit("route_update_result",!1)}}}).then(s=>{t.parentPostmate=s,t.getData(),e.success({status:200,message:"success",data:{ChildPostmate:s}}),t.parentPostmate.emit("route_update_support",!!t.router),t.router&&t.parentPostmate.emit("pushRoutes",JSON.stringify(P(t.router)))}).catch(s=>{e.error({status:500,data:null,message:s})})}getData(e){if(!this.parentPostmate){e({status:500,message:"父页面未连接",data:null});return}e?(this.isGetData=!0,this.getDataCllBack=e):(this.isGetData=!1,this.getDataCllBack=null),this.parentPostmate.emit("requestBaseData")}setRouter(e,t){this.router=e,t&&(this.routeUpdateCallback=t)}sendOtherRequest(e){this.parentPostmate&&this.parentPostmate.emit("otherRequest",e)}}class C{constructor(e,t,s="",r){this.postmateParent=null,this.dataInfo={loginInfo:{},token:"",isHideHeader:!0},this.iframeEle=null,this.currentUrl="",this.currentBaseUrl="",this.currentRouterPath="",this.currentIframe=null,this.loadFunction=null,this.handleOtherRequest=null,this.parsedCurrentUrl=null,this.childSupportsRouteUpdate=!0,this.childRoutes=[],this.eventBus={getRoutes:null,route_update_resultL:null},this.dataInfo=e||this.dataInfo,this.iframeEle=t,this.setIframeUrl(s),r&&(this.handleOtherRequest=r)}parseUrl(e){const t=document.createElement("a");t.href=e;const s=t.protocol.length>4?t.protocol:window.location.protocol,r=t.hostname,a=t.port||(s==="https:"?"443":s==="http:"?"80":""),h=t.pathname.startsWith("/")?t.pathname:`/${t.pathname}`,o=t.search,c=t.hash.slice(2,t.hash.length),d=t.origin||`${s}//${r}${a?`:${a}`:""}`,p=`${h}${c}`;return{protocol:s,host:r,port:a,pathname:h,search:o,hash:c,origin:d,fullPath:p}}compareUrlBase(e,t){const s=e.endsWith("/"),r=t.endsWith("/");return s&&r||!s&&!r||(s&&(t+="/"),r&&(e+="/")),e===t}compareUrlPath(e,t){if(!e||!t)return!1;const s=this.parseUrl(e),r=this.parseUrl(t);return s.pathname===r.pathname}compareUrlFull(e,t){if(!e||!t)return!1;const s=this.parseUrl(e),r=this.parseUrl(t);return s.fullPath===r.fullPath}clear(){this.postmateParent&&(this.postmateParent.destroy(),this.postmateParent=null),this.currentIframe&&this.currentIframe.parentNode&&this.currentIframe.parentNode.removeChild(this.currentIframe),this.currentIframe=null}async init(e=null){this.clear(),this.childSupportsRouteUpdate=!1,(!this.iframeEle||!this.currentUrl)&&this.destroy();const t=typeof this.iframeEle=="function"?this.iframeEle():this.iframeEle;if(!t){console.warn("【ParentPostmate】无法获取 iframe 容器");return}const s=new l({container:t,url:this.currentUrl,name:"",model:""});this.currentIframe=t.querySelector("iframe"),this.currentIframe.setAttribute("frameborder","0"),this.currentIframe.setAttribute("allow","fullscreen"),this.currentIframe.addEventListener("load",()=>{this.loadFunction&&this.loadFunction()}),s.then(r=>{this.postmateParent=r,r.on("requestBaseData",()=>{this.sendData()}),r.on("pushRoutes",a=>{a?this.childRoutes=JSON.parse(a):this.childRoutes=[],this.eventBus.getRoutes&&this.eventBus.getRoutes()}),r.on("routeExists",a=>{}),r.on("route_update_support",a=>{this.childSupportsRouteUpdate=a}),r.on("route_update_result",a=>{this.eventBus.route_update_result&&this.eventBus.route_update_result(a)}),r.on("otherRequest",a=>{this.handleOtherRequest&&this.handleOtherRequest(a)}),typeof e=="function"&&e()}).catch(r=>{console.error("【ParentPostmate】Postmate 连接失败:",r)})}setLoadFunction(e){this.loadFunction=e}setIframeUrl(e,t=""){var r;if(t&&!t.startsWith("/")&&(t="/"+t),!e){this.currentUrl="",this.currentRouterPath="",this.destroy(),console.error("【ParentPostmate】无加载地址,无法初始化");return}if(!this.postmateParent||!this.currentUrl){this.currentUrl=e,this.currentRouterPath=t,this.iframeEle?this.init():console.error("【ParentPostmate】无 iframe 容器,无法初始化");return}if(!this.childSupportsRouteUpdate||!((r=this.childRoutes)!=null&&r.length)||!I(this.currentUrl,e)){this.currentUrl=e,this.currentRouterPath=t,this.init();return}let s=!1;this.eventBus.getRoutes=()=>{s=!0,this.handleSimilarUrl(e,t)},this.postmateParent.call("getRoutes"),setTimeout(()=>{s||this.handleSimilarUrl(e,t)},1e3)}handleSimilarUrl(e,t){if(this.currentUrl=e,this.currentRouterPath=t||"",t&&f(this.childRoutes,t)){this.sendRouteUpdate({fullPath:t});return}let s=!1,r=e.split("?")[0];this.childRoutes.forEach(a=>{if(r.endsWith(a.path)){this.sendRouteUpdate({fullPath:a.path}),s=!0;return}}),!s&&this.init()}sendRouteUpdate(e){try{let t=!1;this.eventBus.route_update_result=s=>{t=s,this.loadFunction&&this.loadFunction()},this.postmateParent.call("routeUpdate",JSON.stringify(e)),console.log("---------------------- 【ParentPostmate】推送路由更新 ----------------------"),setTimeout(()=>{t||(console.warn("【ParentPostmate】推送路由更新失败,将重新初始化iframe"),this.childSupportsRouteUpdate=!1,this.init())},1e3)}catch(t){console.warn("【ParentPostmate】发送路由更新消息失败,将重新初始化iframe:",t),this.childSupportsRouteUpdate=!1,this.init()}}sendData(){this.postmateParent&&this.postmateParent.call("baseData",JSON.stringify(this.dataInfo))}destroy(){this.clear()}}u.ChildPostmate=k,u.ParentPostmate=C,Object.defineProperty(u,Symbol.toStringTag,{value:"Module"})});
|
|
2
|
+
//# sourceMappingURL=index.umd.js.map
|
package/lib/index.umd.js.gz
CHANGED
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../packages/postMeta/postMeta.js","../packages/postMeta/tools.ts","../packages/postMeta/ChildPostmate.ts","../packages/postMeta/ParentPostmate.ts"],"sourcesContent":["const MESSAGE_TYPE = \"application/x-postmate-v1+json\";\r\nlet uid = 0;\r\n\r\nconst allowedPostmateTypes = {\r\n handshake: 1,\r\n \"handshake-reply\": 1,\r\n call: 1,\r\n emit: 1,\r\n reply: 1,\r\n request: 1,\r\n};\r\n\r\n// 校验消息是否来自合法的来源\r\nfunction isValidMessage(event, allowedOrigin) {\r\n return (\r\n (typeof allowedOrigin !== \"string\" || event.origin === allowedOrigin) &&\r\n !!event.data &&\r\n (typeof event.data !== \"object\" || \"postmate\" in event.data) &&\r\n event.data.type === MESSAGE_TYPE &&\r\n !!allowedPostmateTypes[event.data.postmate]\r\n );\r\n}\r\n\r\n// ----------------- ParentAPI -----------------\r\nclass ParentAPI {\r\n constructor(config) {\r\n this.parent = config.parent;\r\n this.frame = config.frame;\r\n this.child = config.child;\r\n this.childOrigin = config.childOrigin;\r\n this.events = {};\r\n\r\n this.listener = (event) => {\r\n if (!isValidMessage(event, this.childOrigin)) return;\r\n const { value = {} } = event.data;\r\n const { name, data } = value;\r\n if (event.data.postmate === \"emit\" && name in this.events) {\r\n this.events[name].call(this, data);\r\n }\r\n };\r\n\r\n this.parent.addEventListener(\"message\", this.listener, false);\r\n }\r\n\r\n get(property) {\r\n return new Postmate.Promise((resolve) => {\r\n const id = ++uid;\r\n const handler = (event) => {\r\n if (event.data.uid === id && event.data.postmate === \"reply\") {\r\n this.parent.removeEventListener(\"message\", handler, false);\r\n resolve(event.data.value);\r\n }\r\n };\r\n this.parent.addEventListener(\"message\", handler, false);\r\n this.child.postMessage(\r\n {\r\n postmate: \"request\",\r\n type: MESSAGE_TYPE,\r\n property,\r\n uid: id,\r\n },\r\n this.childOrigin\r\n );\r\n });\r\n }\r\n\r\n call(method, data) {\r\n this.child.postMessage(\r\n {\r\n postmate: \"call\",\r\n type: MESSAGE_TYPE,\r\n property: method,\r\n data,\r\n },\r\n this.childOrigin\r\n );\r\n }\r\n\r\n on(event, callback) {\r\n this.events[event] = callback;\r\n }\r\n\r\n destroy() {\r\n window.removeEventListener(\"message\", this.listener, false);\r\n this.frame.parentNode.removeChild(this.frame);\r\n }\r\n}\r\n\r\n// ----------------- ChildAPI -----------------\r\nclass ChildAPI {\r\n constructor(config) {\r\n this.model = config.model;\r\n this.parent = config.parent;\r\n this.parentOrigin = config.parentOrigin;\r\n this.child = config.child;\r\n\r\n this.child.addEventListener(\"message\", (event) => {\r\n if (!isValidMessage(event, this.parentOrigin)) return;\r\n\r\n const { postmate, property, uid, data } = event.data;\r\n const value = this.model[property];\r\n\r\n if (postmate !== \"call\") {\r\n const result = typeof value === \"function\" ? value() : value;\r\n Postmate.Promise.resolve(result).then((res) => {\r\n event.source.postMessage(\r\n {\r\n property,\r\n postmate: \"reply\",\r\n type: MESSAGE_TYPE,\r\n uid,\r\n value: res,\r\n },\r\n event.origin\r\n );\r\n });\r\n } else if (property in this.model && typeof value === \"function\") {\r\n value(data);\r\n }\r\n });\r\n }\r\n\r\n emit(eventName, data) {\r\n this.parent.postMessage(\r\n {\r\n postmate: \"emit\",\r\n type: MESSAGE_TYPE,\r\n value: { name: eventName, data },\r\n },\r\n this.parentOrigin\r\n );\r\n }\r\n}\r\n\r\n// ----------------- Postmate -----------------\r\nclass Postmate {\r\n constructor({ container = document.body, model, url, name, classListArray = [] }) {\r\n this.parent = window;\r\n this.frame = document.createElement(\"iframe\");\r\n this.frame.name = name || \"\";\r\n this.frame.classList.add(...classListArray);\r\n container.appendChild(this.frame);\r\n\r\n this.child = this.frame.contentWindow;\r\n this.model = model || {};\r\n\r\n return this.sendHandshake(url);\r\n }\r\n\r\n sendHandshake(url) {\r\n const origin = (() => {\r\n const link = document.createElement(\"a\");\r\n link.href = url;\r\n const protocol = link.protocol.length > 4 ? link.protocol : window.location.protocol;\r\n const host = link.host.length ? (link.port === \"80\" || link.port === \"443\" ? link.hostname : link.host) : window.location.host;\r\n return link.origin || `${protocol}//${host}`;\r\n })();\r\n\r\n let attemptCount = 0;\r\n let interval;\r\n\r\n return new Postmate.Promise((resolve, reject) => {\r\n const listener = (event) => {\r\n if (!isValidMessage(event, origin)) return false;\r\n if (event.data.postmate === \"handshake-reply\") {\r\n clearInterval(interval);\r\n this.parent.removeEventListener(\"message\", listener, false);\r\n this.childOrigin = event.origin;\r\n resolve(new ParentAPI(this));\r\n } else {\r\n reject(\"Failed handshake\");\r\n }\r\n };\r\n\r\n this.parent.addEventListener(\"message\", listener, false);\r\n\r\n const send = () => {\r\n attemptCount++;\r\n this.child.postMessage(\r\n {\r\n postmate: \"handshake\",\r\n type: MESSAGE_TYPE,\r\n model: this.model,\r\n },\r\n origin\r\n );\r\n if (attemptCount === 5) clearInterval(interval);\r\n };\r\n\r\n const init = () => {\r\n send();\r\n interval = setInterval(send, 500);\r\n };\r\n\r\n this.frame.onload = init;\r\n this.frame.attachEvent && this.frame.attachEvent(\"onload\", init);\r\n this.frame.src = url;\r\n });\r\n }\r\n}\r\n\r\n// ----------------- Model -----------------\r\nclass Model {\r\n constructor(model) {\r\n this.child = window;\r\n this.model = model;\r\n this.parent = window.parent;\r\n\r\n return this.sendHandshakeReply();\r\n }\r\n\r\n sendHandshakeReply() {\r\n return new Postmate.Promise((resolve, reject) => {\r\n this.child.addEventListener(\"message\", (event) => {\r\n if (event.data.postmate) {\r\n if (event.data.postmate !== \"handshake\") return reject(\"Handshake Reply Failed\");\r\n\r\n this.child.removeEventListener(\"message\", this, false);\r\n event.source.postMessage(\r\n {\r\n postmate: \"handshake-reply\",\r\n type: MESSAGE_TYPE,\r\n },\r\n event.origin\r\n );\r\n\r\n this.parentOrigin = event.origin;\r\n const parentModel = event.data.model;\r\n if (parentModel) {\r\n Object.keys(parentModel).forEach((key) => {\r\n this.model[key] = parentModel[key];\r\n });\r\n }\r\n resolve(new ChildAPI(this));\r\n }\r\n }, false);\r\n });\r\n }\r\n}\r\n\r\n// Attach defaults\r\nPostmate.debug = false;\r\nPostmate.Promise = (() => {\r\n try {\r\n return typeof window !== \"undefined\" ? window.Promise : Promise;\r\n } catch {\r\n return Promise;\r\n }\r\n})();\r\nPostmate.Model = Model;\r\n\r\nexport default Postmate;\r\nexport { Model };\r\n","/**\r\n * 检查路径是否存在于路由配置中(递归检查所有层级)\r\n * @param routes 路由配置数组\r\n * @param path 需要检查的路径\r\n * @returns 是否存在\r\n */\r\nexport function checkPathInRoutes(routes: any[], path: string): boolean {\r\n for (const route of routes) {\r\n // 检查当前路由\r\n if (route.path === path) {\r\n return true;\r\n }\r\n\r\n // 递归检查子路由\r\n if (route.children && Array.isArray(route.children) && route.children.length > 0) {\r\n if (checkPathInRoutes(route.children, path)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * 判断路径是否存在于vue-router对象中(兼容Vue2和Vue3)\r\n * @param router vue-router实例\r\n * @param path 需要检查的页面路径\r\n * @returns 路径是否存在\r\n */\r\nexport function isRouteExists(router: any, path: string): boolean {\r\n // 移除路径中的查询参数\r\n if (path.includes('?')) {\r\n path = path.split('?')[0];\r\n }\r\n const routes = getRouterPaths(router);\r\n if (!routes || routes.length === 0) return false;\r\n return checkPathInRoutes(routes, path);\r\n}\r\n\r\n/**\r\n * 获取路由路径\r\n *\r\n */\r\nexport function getRouterPaths(router: any): any[] {\r\n let routes: any[] = [];\r\n // 区分Vue Router 3.x (Vue2) 和 4.x (Vue3)\r\n if (typeof router.getRoutes === 'function') {\r\n // Vue Router 4.x (Vue3)\r\n routes = router.getRoutes();\r\n } else if (router.options && Array.isArray(router.options.routes)) {\r\n // Vue Router 3.x (Vue2)\r\n routes = router.options.routes;\r\n }\r\n return routes || [];\r\n}\r\n\r\n\r\n/**\r\n * 比较两个URL的协议、IP(或域名)和端口是否完全相同\r\n * @param url1 第一个URL字符串\r\n * @param url2 第二个URL字符串\r\n * @returns 如果协议、IP(或域名)和端口都相同则返回true,否则返回false;解析失败时返回false\r\n */\r\nexport function areUrlsSameProtocolIpPort(url1: string, url2: string): boolean {\r\n try {\r\n // 解析两个URL\r\n const parsedUrl1 = new URL(url1);\r\n const parsedUrl2 = new URL(url2);\r\n \r\n // 比较协议(不区分大小写,但通常URL协议是小写的)\r\n const sameProtocol = parsedUrl1.protocol.toLowerCase() === parsedUrl2.protocol.toLowerCase();\r\n \r\n // 比较主机(IP或域名)\r\n const sameHost = parsedUrl1.hostname === parsedUrl2.hostname;\r\n \r\n // 比较端口(如果未指定端口,会使用协议默认端口)\r\n const samePort = parsedUrl1.port === parsedUrl2.port;\r\n \r\n // 只有所有部分都相同时才返回true\r\n return sameProtocol && sameHost && samePort;\r\n } catch (error) {\r\n // 如果URL解析失败,返回false\r\n console.error('URL解析错误:', error);\r\n return false;\r\n }\r\n}","import Postmate from './postMeta'\nimport { getRouterPaths, isRouteExists } from './tools';\n\ninterface EventObj {\n error: (error: any) => void\n success: (success: any) => void\n receive: (receive: any) => void\n}\n\n// 路由更新接口\ninterface RouteUpdateInfo {\n fullPath: string;\n}\n\nexport default class ChildPostmate {\n childPostmate: any = null\n parentPostmate: any = null\n\n isGetData: boolean = false\n getDataCllBack: Function | null = null\n \n // Vue Router实例\n router: any = null\n // 路由更新回调函数\n routeUpdateCallback: ((routeInfo: RouteUpdateInfo) => void) | undefined = undefined\n\n constructor(eventObj: EventObj, router: any, routeUpdateCallback?: (routeInfo: RouteUpdateInfo) => void) {\n // 保存router实例\n this.router = router;\n // 保存路由更新回调函数\n this.routeUpdateCallback = routeUpdateCallback;\n \n if (window.top !== window.self) this.init(eventObj)\n else {\n eventObj.error({ status: 500, data: null, message: '未在一体化平台中运行' })\n }\n }\n\n init(eventObj: EventObj) {\n const that = this\n // 创建 Postmate Model(作为子)\n this.childPostmate = new Postmate.Model({\n // 定义子页面可以暴露给父页面的方法\n baseData(data: any) {\n data = JSON.parse(data)\n if (that.isGetData) {\n that.getDataCllBack &&\n that.getDataCllBack({\n status: 200,\n message: 'success',\n data: data,\n })\n } else\n eventObj.receive({\n status: 200,\n message: 'success',\n data: data,\n })\n that.isGetData = false\n },\n\n // 提供当前系统的路由\n getRoutes:()=>{\n // 有路由\n if(that.router){\n let arr = getRouterPaths(that.router)\n that.parentPostmate.emit('pushRoutes',JSON.stringify(arr))\n } \n // 无路由\n else that.parentPostmate.emit('pushRoutes')\n },\n\n // 检查路由是否存在\n isRouteExists(routePath:string){\n if(that.router)that.parentPostmate.emit('routeExists',isRouteExists(that.router,routePath))\n else that.parentPostmate.emit('routeExists',false)\n },\n\n // 处理路由更新\n routeUpdate(routeInfoStr: string) {\n // 向父页面同步路由数据\n try {\n const routeInfo: RouteUpdateInfo = JSON.parse(routeInfoStr);\n \n // 如果提供了自定义的路由更新回调函数,则调用它\n if (that.routeUpdateCallback) {\n that.routeUpdateCallback(routeInfo);\n return;\n }\n \n // 如果提供了router实例,则使用router进行路由更新\n if (that.router) {\n that.router.replace(routeInfo.fullPath);\n that.parentPostmate.emit('route_update_result',true)\n console.log('----------------- 【ChildPastMate】路由更新完成 -----------------')\n } else {\n that.parentPostmate.emit('route_update_result',false)\n console.warn('【ChildPastMate】未提供router实例,无法进行路由更新');\n }\n } catch (error) {\n console.error('【ChildPastMate】路由更新失败:', error);\n that.parentPostmate.emit('route_update_result',false)\n }\n },\n\n })\n .then((parent: any) => {\n that.parentPostmate = parent\n that.getData()\n // 与父页面链接建立成功\n eventObj.success({\n status: 200,\n message: 'success',\n data: {\n ChildPostmate: parent,\n },\n })\n // 告诉父系统支持路由更新\n that.parentPostmate.emit('route_update_support',that.router ? true : false)\n\n // 向父页面同步路由数据\n that.router && that.parentPostmate.emit('pushRoutes',JSON.stringify(getRouterPaths(that.router)))\n })\n .catch((err: any) => {\n eventObj.error({ status: 500, data: null, message: err })\n })\n }\n\n // 获取数据\n getData(callback?: any) {\n if (!this.parentPostmate) {\n callback({\n status: 500,\n message: '父页面未连接',\n data: null,\n })\n return\n }\n\n if (callback) {\n this.isGetData = true\n this.getDataCllBack = callback\n } else {\n this.isGetData = false\n this.getDataCllBack = null\n }\n // 向父页面获取数据\n this.parentPostmate.emit('requestBaseData')\n }\n\n /**\n * 设置路由实例和路由更新回调\n * @param router Vue Router实例\n * @param routeUpdateCallback 自定义路由更新回调函数\n */\n setRouter(router: any, routeUpdateCallback?: (routeInfo: RouteUpdateInfo) => void) {\n this.router = router;\n if (routeUpdateCallback) {\n this.routeUpdateCallback = routeUpdateCallback;\n }\n }\n\n /**\n * 向父页面发送其他请求\n * @param params 请求参数\n */\n sendOtherRequest(params: any) {\n if (!this.parentPostmate) return;\n this.parentPostmate.emit('otherRequest', params);\n }\n}","import Postmate from './postMeta';\nimport { areUrlsSameProtocolIpPort, checkPathInRoutes } from './tools';\n\ninterface DataInfo {\n\tloginInfo: { [x: string]: any };\n\ttoken: string;\n\tisHideHeader: boolean;\n}\n\n// URL解析结果接口\ninterface ParsedUrl {\n\tprotocol: string;\n\thost: string;\n\tport: string;\n\tpathname: string;\n\tsearch: string;\n\thash: string;\n\torigin: string;\n\tfullPath: string;\n}\n\nexport default class ParentPostmate {\n\t/** 连接到的子 postmate 实例 */\n\tpostmateParent: any = null;\n\t/** 通讯数据 */\n\tdataInfo: DataInfo = {\n\t\tloginInfo: {},\n\t\ttoken: '',\n\t\tisHideHeader: true,\n\t};\n\t/** iframe Dom 容器 */\n\tiframeEle: any = null;\n\t/** 当前 iframe url */\n\tcurrentUrl: string = '';\n\t/** 当前url基础地址 */\n\tcurrentBaseUrl: string = '';\n\t/** 当前路由地址 */\n\tcurrentRouterPath: string = '';\n\t/** 存储当前的 iframe 元素 */\n\tcurrentIframe: any = null;\n\t/** iframe 加载完成执行函数 */\n\tloadFunction: (() => void) | null = null;\n\t/** 处理子类的其他请求方法 */\n\thandleOtherRequest: ((params: any) => void) | null = null;\n\t/** 当前URL解析结果 */\n\tparsedCurrentUrl: ParsedUrl | null = null;\n\t/** 子页面是否支持路由更新 */\n\tchildSupportsRouteUpdate: boolean = true;\n\t/** 子系统的路由列表 */\n\tchildRoutes: any[] = [];\n\n\teventBus: any = {\n\t\tgetRoutes: null,\n\t\troute_update_resultL: null,\n\t};\n\n\tconstructor(dataInfo: DataInfo, iframeEle: HTMLElement | (() => HTMLElement), iframeUrl: string = '', handleOtherRequest?: (params: any) => void) {\n\t\tthis.dataInfo = dataInfo || this.dataInfo;\n\t\tthis.iframeEle = iframeEle;\n\t\tthis.setIframeUrl(iframeUrl);\n\t\thandleOtherRequest && (this.handleOtherRequest = handleOtherRequest);\n\t}\n\n\t/** 解析URL */\n\tparseUrl(url: string): ParsedUrl {\n\t\tconst link = document.createElement('a');\n\t\tlink.href = url;\n\n\t\t// 获取协议\n\t\tconst protocol = link.protocol.length > 4 ? link.protocol : window.location.protocol;\n\n\t\t// 获取主机和端口\n\t\tconst host = link.hostname;\n\t\tconst port = link.port || (protocol === 'https:' ? '443' : protocol === 'http:' ? '80' : '');\n\n\t\t// 获取路径、查询参数和哈希\n\t\tconst pathname = link.pathname.startsWith('/') ? link.pathname : `/${link.pathname}`;\n\t\tconst search = link.search;\n\t\tconst hash = link.hash.slice(2, link.hash.length);\n\n\t\t// 构建origin\n\t\tconst origin = link.origin || `${protocol}//${host}${port ? `:${port}` : ''}`;\n\n\t\t// 构建完整路径(不包含origin)\n\t\tconst fullPath = `${pathname}${hash}`;\n\n\t\treturn {\n\t\t\tprotocol,\n\t\t\thost,\n\t\t\tport,\n\t\t\tpathname,\n\t\t\tsearch,\n\t\t\thash,\n\t\t\torigin,\n\t\t\tfullPath,\n\t\t};\n\t}\n\n\t/** 比较两个URL是否相同*/\n\tcompareUrlBase(url1: string, url2: string): boolean {\n\t\tconst url1End = url1.endsWith('/');\n\t\tconst url2End = url2.endsWith('/');\n\t\tif ((url1End && url2End) || (!url1End && !url2End)) {\n\t\t\treturn url1 === url2;\n\t\t} else {\n\t\t\tif (url1End) url2 += '/';\n\t\t\tif (url2End) url1 += '/';\n\t\t\treturn url1 === url2;\n\t\t}\n\t}\n\n\t/** 比较两个URL的路径是否相同(不包含查询参数和哈希) */\n\tcompareUrlPath(url1: string, url2: string): boolean {\n\t\tif (!url1 || !url2) return false;\n\n\t\tconst parsed1 = this.parseUrl(url1);\n\t\tconst parsed2 = this.parseUrl(url2);\n\n\t\treturn parsed1.pathname === parsed2.pathname;\n\t}\n\n\t/** 比较两个URL是否完全相同(包括查询参数和哈希) */\n\tcompareUrlFull(url1: string, url2: string): boolean {\n\t\tif (!url1 || !url2) return false;\n\n\t\tconst parsed1 = this.parseUrl(url1);\n\t\tconst parsed2 = this.parseUrl(url2);\n\n\t\treturn parsed1.fullPath === parsed2.fullPath;\n\t}\n\n\t/** 清除当前的 iframe 和 postmate 实例 */\n\tclear() {\n\t\t// 销毁 postmate 实例\n\t\tif (this.postmateParent) {\n\t\t\tthis.postmateParent.destroy();\n\t\t\tthis.postmateParent = null;\n\t\t}\n\n\t\t// 移除 iframe\n\t\tif (this.currentIframe && this.currentIframe.parentNode) {\n\t\t\tthis.currentIframe.parentNode.removeChild(this.currentIframe);\n\t\t}\n\t\tthis.currentIframe = null;\n\t}\n\n\t/** 初始化 */\n\tasync init(callback: any = null) {\n\t\t// 清除之前的实例和 iframe\n\t\tthis.clear();\n\n\t\t// 重置子页面路由更新支持标记\n\t\tthis.childSupportsRouteUpdate = false;\n\n\t\t// 如果没有容器,或集成链接\n\t\tif (!this.iframeEle || !this.currentUrl) {\n\t\t\tthis.destroy();\n\t\t}\n\n\t\t// 获取 iframe 容器\n\t\tconst container: any = typeof this.iframeEle === 'function' ? this.iframeEle() : this.iframeEle;\n\t\tif (!container) {\n\t\t\tconsole.warn('【ParentPostmate】无法获取 iframe 容器');\n\t\t\treturn;\n\t\t}\n\n\t\t// 创建 Postmate 实例(作为父)\n\t\tconst handshake: any = new Postmate({\n\t\t\tcontainer,\n\t\t\turl: this.currentUrl,\n\t\t\tname: '',\n\t\t\tmodel: '',\n\t\t});\n\n\t\t// 存储当前创建的 iframe\n\t\tthis.currentIframe = container.querySelector('iframe');\n\t\tthis.currentIframe.setAttribute('frameborder', '0');\n\t\tthis.currentIframe.setAttribute('allow', 'fullscreen');\n\t\tthis.currentIframe.addEventListener('load', () => {\n\t\t\tthis.loadFunction && this.loadFunction();\n\t\t});\n\n\t\thandshake\n\t\t\t.then((parent: any) => {\n\t\t\t\tthis.postmateParent = parent;\n\n\t\t\t\t// 监听子页面发来的获取数据请求\n\t\t\t\tparent.on('requestBaseData', () => {\n\t\t\t\t\t// 发送相关数据\n\t\t\t\t\tthis.sendData();\n\t\t\t\t});\n\n\t\t\t\t// 监听子页面发来的路由配置数据\n\t\t\t\tparent.on('pushRoutes', (routes: string) => {\n\t\t\t\t\tif (routes) this.childRoutes = JSON.parse(routes);\n\t\t\t\t\telse this.childRoutes = [];\n\t\t\t\t\tthis.eventBus.getRoutes && this.eventBus.getRoutes();\n\t\t\t\t});\n\n\t\t\t\t// 监听子页面的路由效验结果\n\t\t\t\tparent.on('routeExists', (flag: boolean) => {});\n\n\t\t\t\t// 监听子页面的动态路由变更支持\n\t\t\t\tparent.on('route_update_support', (flag: boolean) => {\n\t\t\t\t\tthis.childSupportsRouteUpdate = flag;\n\t\t\t\t});\n\n\t\t\t\t// 监听子页面的路由变更结果\n\t\t\t\tparent.on('route_update_result', (flag: boolean) => {\n\t\t\t\t\tthis.eventBus.route_update_result && this.eventBus.route_update_result(flag);\n\t\t\t\t});\n\n\t\t\t\t// 监听子页面发来的其他请求\n\t\t\t\tparent.on('otherRequest', (params: any) => {\n\t\t\t\t\tthis.handleOtherRequest && this.handleOtherRequest(params);\n\t\t\t\t});\n\n\t\t\t\tif (typeof callback === 'function') callback();\n\t\t\t})\n\t\t\t.catch((error: any) => {\n\t\t\t\tconsole.error('【ParentPostmate】Postmate 连接失败:', error);\n\t\t\t});\n\t}\n\n\t/** 设置load执行事件 */\n\tsetLoadFunction(loadFunction: () => void) {\n\t\tthis.loadFunction = loadFunction;\n\t}\n\n\t/** 设置 iframe url */\n\tsetIframeUrl(iframeUrl: string, routerPath: string = '') {\n\t\t// 如果传入了路由,则对路径进行规范处理\n\t\tif (routerPath && !routerPath.startsWith('/')) {\n\t\t\trouterPath = '/' + routerPath;\n\t\t}\n\n\t\t// 1、传入的地址为空:销毁当前实例\n\t\tif (!iframeUrl) {\n\t\t\tthis.currentUrl = '';\n\t\t\tthis.currentRouterPath = '';\n\t\t\tthis.destroy();\n\t\t\tconsole.error('【ParentPostmate】无加载地址,无法初始化');\n\t\t\treturn;\n\t\t}\n\n\t\t// 2、如果当前无连接:直接设置并初始化\n\t\tif (!this.postmateParent || !this.currentUrl) {\n\t\t\tthis.currentUrl = iframeUrl;\n\t\t\tthis.currentRouterPath = routerPath;\n\t\t\tif (this.iframeEle) this.init();\n\t\t\telse console.error('【ParentPostmate】无 iframe 容器,无法初始化');\n\t\t\treturn;\n\t\t}\n\n\t\t// 3、如果当前系统不支持路由更新 或 新旧系统协议、ip、端口不同则重新初始化: 重新初始化\n\t\tif (!this.childSupportsRouteUpdate || !this.childRoutes?.length || !areUrlsSameProtocolIpPort(this.currentUrl, iframeUrl)) {\n\t\t\tthis.currentUrl = iframeUrl;\n\t\t\tthis.currentRouterPath = routerPath;\n\t\t\tthis.init();\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * 因新旧地址的基础地址完全相同,且已加载系统支持路由更新\n\t\t * 下面处理新旧地址的url,研判操作方式\n\t\t **/\n\t\t// 更新路由列表\n\t\tlet flag = false;\n\t\tthis.eventBus.getRoutes = () => {\n\t\t\tflag = true;\n\t\t\tthis.handleSimilarUrl(iframeUrl, routerPath);\n\t\t};\n\t\tthis.postmateParent.call('getRoutes');\n\n\t\tsetTimeout(() => {\n\t\t\tif (flag) return;\n\t\t\tthis.handleSimilarUrl(iframeUrl, routerPath);\n\t\t}, 1000);\n\t}\n\n\t// 处理相似地址\n\thandleSimilarUrl(iframeUrl: string, routerPath?: string) {\n\t\tthis.currentUrl = iframeUrl;\n\t\tthis.currentRouterPath = routerPath || '';\n\n\t\t// 1 如果传入了routerPath,将该值与子系统匹配,判断是否可以直接跳转\n\t\tif (routerPath && checkPathInRoutes(this.childRoutes, routerPath)) {\n\t\t\t// 触发更新路由\n\t\t\tthis.sendRouteUpdate({\n\t\t\t\tfullPath: routerPath,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// 2 通过已加载子系统的路由列表匹配新链接的尾部路径,如果匹配到,则触发路由更新\n\t\tlet isEnd = false;\n\t\tlet noQueryUrl = iframeUrl.split('?')[0];\n\t\tthis.childRoutes.forEach((v) => {\n\t\t\tif (noQueryUrl.endsWith(v.path)) {\n\t\t\t\t// 触发更新路由\n\t\t\t\tthis.sendRouteUpdate({\n\t\t\t\t\tfullPath: v.path,\n\t\t\t\t});\n\t\t\t\tisEnd = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t});\n\t\tif (isEnd) return;\n\n\t\t// 3 如果以上两种情况都不满足,则重新初始化\n\t\tthis.init();\n\t}\n\n\t/** 向子页面发送路由更新消息 */\n\tsendRouteUpdate(parsedUrl: any) {\n\t\ttry {\n\t\t\tlet flag = false;\n\t\t\tthis.eventBus.route_update_result = (state: boolean) => {\n\t\t\t\tflag = state;\n\t\t\t\tthis.loadFunction && this.loadFunction();\n\t\t\t};\n\t\t\tthis.postmateParent.call('routeUpdate', JSON.stringify(parsedUrl));\n\t\t\tconsole.log('---------------------- 【ParentPostmate】推送路由更新 ----------------------');\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (flag) return;\n\t\t\t\tconsole.warn('【ParentPostmate】推送路由更新失败,将重新初始化iframe');\n\t\t\t\t// 标记子页面不支持路由更新\n\t\t\t\tthis.childSupportsRouteUpdate = false;\n\t\t\t\t// 如果发送消息失败,则重新初始化iframe\n\t\t\t\tthis.init();\n\t\t\t}, 1000);\n\t\t} catch (error) {\n\t\t\tconsole.warn('【ParentPostmate】发送路由更新消息失败,将重新初始化iframe:', error);\n\t\t\t// 标记子页面不支持路由更新\n\t\t\tthis.childSupportsRouteUpdate = false;\n\t\t\t// 如果发送消息失败,则重新初始化iframe\n\t\t\tthis.init();\n\t\t}\n\t}\n\n\t/** 向子页面发送消息 */\n\tsendData() {\n\t\tif (!this.postmateParent) return;\n\t\tthis.postmateParent.call('baseData', JSON.stringify(this.dataInfo));\n\t}\n\n\t/** 销毁实例 */\n\tdestroy() {\n\t\tthis.clear();\n\t}\n}\n"],"names":["MESSAGE_TYPE","uid","allowedPostmateTypes","isValidMessage","event","allowedOrigin","ParentAPI","config","value","name","data","property","Postmate","resolve","id","handler","method","callback","ChildAPI","postmate","result","res","eventName","container","model","url","classListArray","origin","link","protocol","host","attemptCount","interval","reject","listener","send","init","Model","parentModel","key","checkPathInRoutes","routes","path","route","isRouteExists","router","getRouterPaths","areUrlsSameProtocolIpPort","url1","url2","parsedUrl1","parsedUrl2","sameProtocol","sameHost","samePort","error","ChildPostmate","eventObj","routeUpdateCallback","that","arr","routePath","routeInfoStr","routeInfo","parent","err","params","ParentPostmate","dataInfo","iframeEle","iframeUrl","handleOtherRequest","port","pathname","search","hash","fullPath","url1End","url2End","parsed1","parsed2","handshake","flag","loadFunction","routerPath","_a","isEnd","noQueryUrl","v","parsedUrl","state"],"mappings":"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"}
|