qlfy-postmate 1.2.4 → 1.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  const u = "application/x-postmate-v1+json";
2
- let g = 0;
3
- const P = {
2
+ let P = 0;
3
+ const R = {
4
4
  handshake: 1,
5
5
  "handshake-reply": 1,
6
6
  call: 1,
@@ -9,9 +9,9 @@ const P = {
9
9
  request: 1
10
10
  };
11
11
  function m(i, e) {
12
- return (typeof e != "string" || i.origin === e) && !!i.data && (typeof i.data != "object" || "postmate" in i.data) && i.data.type === u && !!P[i.data.postmate];
12
+ return (typeof e != "string" || i.origin === e) && !!i.data && (typeof i.data != "object" || "postmate" in i.data) && i.data.type === u && !!R[i.data.postmate];
13
13
  }
14
- class R {
14
+ class y {
15
15
  constructor(e) {
16
16
  this.parent = e.parent, this.frame = e.frame, this.child = e.child, this.childOrigin = e.childOrigin, this.events = {}, this.listener = (t) => {
17
17
  if (!m(t, this.childOrigin)) return;
@@ -21,7 +21,7 @@ class R {
21
21
  }
22
22
  get(e) {
23
23
  return new l.Promise((t) => {
24
- const s = ++g, r = (a) => {
24
+ const s = ++P, r = (a) => {
25
25
  a.data.uid === s && a.data.postmate === "reply" && (this.parent.removeEventListener("message", r, !1), t(a.data.value));
26
26
  };
27
27
  this.parent.addEventListener("message", r, !1), this.child.postMessage(
@@ -53,7 +53,7 @@ class R {
53
53
  window.removeEventListener("message", this.listener, !1), this.frame.parentNode.removeChild(this.frame);
54
54
  }
55
55
  }
56
- class y {
56
+ class w {
57
57
  constructor(e) {
58
58
  this.model = e.model, this.parent = e.parent, this.parentOrigin = e.parentOrigin, this.child = e.child, this.child.addEventListener("message", (t) => {
59
59
  if (!m(t, this.parentOrigin)) return;
@@ -101,7 +101,7 @@ class l {
101
101
  return new l.Promise((a, n) => {
102
102
  const o = (d) => {
103
103
  if (!m(d, t)) return !1;
104
- d.data.postmate === "handshake-reply" ? (clearInterval(r), this.parent.removeEventListener("message", o, !1), this.childOrigin = d.origin, a(new R(this))) : n("Failed handshake");
104
+ d.data.postmate === "handshake-reply" ? (clearInterval(r), this.parent.removeEventListener("message", o, !1), this.childOrigin = d.origin, a(new y(this))) : n("Failed handshake");
105
105
  };
106
106
  this.parent.addEventListener("message", o, !1);
107
107
  const h = () => {
@@ -139,7 +139,7 @@ class U {
139
139
  const r = s.data.model;
140
140
  r && Object.keys(r).forEach((a) => {
141
141
  this.model[a] = r[a];
142
- }), e(new y(this));
142
+ }), e(new w(this));
143
143
  }
144
144
  }, !1);
145
145
  });
@@ -160,7 +160,7 @@ function f(i, e) {
160
160
  return !0;
161
161
  return !1;
162
162
  }
163
- function w(i, e) {
163
+ function E(i, e) {
164
164
  e.includes("?") && (e = e.split("?")[0]);
165
165
  const t = p(i);
166
166
  return !t || t.length === 0 ? !1 : f(t, e);
@@ -169,7 +169,7 @@ function p(i) {
169
169
  let e = [];
170
170
  return typeof i.getRoutes == "function" ? e = i.getRoutes() : i.options && Array.isArray(i.options.routes) && (e = i.options.routes), e || [];
171
171
  }
172
- function E(i, e) {
172
+ function k(i, e) {
173
173
  try {
174
174
  const t = new URL(i), s = new URL(e), r = t.protocol.toLowerCase() === s.protocol.toLowerCase(), a = t.hostname === s.hostname, n = t.port === s.port;
175
175
  return r && a && n;
@@ -177,7 +177,18 @@ function E(i, e) {
177
177
  return console.error("URL解析错误:", t), !1;
178
178
  }
179
179
  }
180
- class I {
180
+ const g = () => {
181
+ const i = /* @__PURE__ */ new WeakSet();
182
+ return (e, t) => {
183
+ if (typeof t == "object" && t !== null) {
184
+ if (i.has(t))
185
+ return "[Circular Reference]";
186
+ i.add(t);
187
+ }
188
+ return t;
189
+ };
190
+ };
191
+ class C {
181
192
  constructor(e, t, s) {
182
193
  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: "未在一体化平台中运行" });
183
194
  }
@@ -200,19 +211,19 @@ class I {
200
211
  getRoutes: () => {
201
212
  if (t.router) {
202
213
  let s = p(t.router);
203
- t.parentPostmate.emit("pushRoutes", JSON.stringify(s));
214
+ t.parentPostmate.emit("pushRoutes", JSON.stringify(s, g()));
204
215
  } else t.parentPostmate.emit("pushRoutes");
205
216
  },
206
217
  // 检查路由是否存在
207
218
  isRouteExists(s) {
208
- t.router ? t.parentPostmate.emit("routeExists", w(t.router, s)) : t.parentPostmate.emit("routeExists", !1);
219
+ t.router ? t.parentPostmate.emit("routeExists", E(t.router, s)) : t.parentPostmate.emit("routeExists", !1);
209
220
  },
210
221
  // 处理路由更新
211
222
  routeUpdate(s) {
212
223
  try {
213
224
  const r = JSON.parse(s);
214
225
  if (t.routeUpdateCallback) {
215
- t.routeUpdateCallback(r);
226
+ t.routeUpdateCallback(r), t.parentPostmate.emit("route_update_result", !0), console.log("----------------- 【ChildPastMate】路由更新完成 -----------------");
216
227
  return;
217
228
  }
218
229
  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实例,无法进行路由更新"));
@@ -227,7 +238,7 @@ class I {
227
238
  data: {
228
239
  ChildPostmate: s
229
240
  }
230
- }), t.parentPostmate.emit("route_update_support", !!t.router), t.router && t.parentPostmate.emit("pushRoutes", JSON.stringify(p(t.router)));
241
+ }), t.parentPostmate.emit("route_update_support", !!t.router), t.router && t.parentPostmate.emit("pushRoutes", JSON.stringify(p(t.router), g()));
231
242
  }).catch((s) => {
232
243
  e.error({ status: 500, data: null, message: s });
233
244
  });
@@ -260,7 +271,7 @@ class I {
260
271
  this.parentPostmate && this.parentPostmate.emit("otherRequest", e);
261
272
  }
262
273
  }
263
- class k {
274
+ class I {
264
275
  constructor(e, t, s = "", r) {
265
276
  this.postmateParent = null, this.dataInfo = {
266
277
  loginInfo: {},
@@ -356,7 +367,7 @@ class k {
356
367
  this.currentUrl = e, this.currentRouterPath = t, this.iframeEle ? this.init() : console.error("【ParentPostmate】无 iframe 容器,无法初始化");
357
368
  return;
358
369
  }
359
- if (!this.childSupportsRouteUpdate || !((r = this.childRoutes) != null && r.length) || !E(this.currentUrl, e)) {
370
+ if (!this.childSupportsRouteUpdate || !((r = this.childRoutes) != null && r.length) || !k(this.currentUrl, e)) {
360
371
  this.currentUrl = e, this.currentRouterPath = t, this.init();
361
372
  return;
362
373
  }
@@ -408,7 +419,7 @@ class k {
408
419
  }
409
420
  }
410
421
  export {
411
- I as ChildPostmate,
412
- k as ParentPostmate
422
+ C as ChildPostmate,
423
+ I as ParentPostmate
413
424
  };
414
425
  //# sourceMappingURL=index.mjs.map
package/lib/index.mjs.gz CHANGED
Binary file
package/lib/index.mjs.map CHANGED
@@ -1 +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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"}
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}\r\n\r\n\r\nexport const getCircularReplacer = () => {\r\n\tconst seen = new WeakSet();\r\n\treturn (key, value) => {\r\n\t\tif (typeof value === 'object' && value !== null) {\r\n\t\t\tif (seen.has(value)) {\r\n\t\t\t\t// 遇到循环引用时,返回一个标识或忽略\r\n\t\t\t\treturn '[Circular Reference]';\r\n\t\t\t}\r\n\t\t\tseen.add(value);\r\n\t\t}\r\n\t\treturn value;\r\n\t};\r\n};","import Postmate from './postMeta';\nimport { getCircularReplacer, getRouterPaths, isRouteExists } from './tools';\n\ninterface EventObj {\n\terror: (error: any) => void;\n\tsuccess: (success: any) => void;\n\treceive: (receive: any) => void;\n}\n\n// 路由更新接口\ninterface RouteUpdateInfo {\n\tfullPath: string;\n}\n\nexport default class ChildPostmate {\n\tchildPostmate: any = null;\n\tparentPostmate: any = null;\n\n\tisGetData: boolean = false;\n\tgetDataCllBack: Function | null = null;\n\n\t// Vue Router实例\n\trouter: any = null;\n\t// 路由更新回调函数\n\trouteUpdateCallback: ((routeInfo: RouteUpdateInfo) => void) | undefined = undefined;\n\n\tconstructor(eventObj: EventObj, router: any, routeUpdateCallback?: (routeInfo: RouteUpdateInfo) => void) {\n\t\t// 保存router实例\n\t\tthis.router = router;\n\t\t// 保存路由更新回调函数\n\t\tthis.routeUpdateCallback = routeUpdateCallback;\n\n\t\tif (window.top !== window.self) this.init(eventObj);\n\t\telse {\n\t\t\teventObj.error({ status: 500, data: null, message: '未在一体化平台中运行' });\n\t\t}\n\t}\n\n\tinit(eventObj: EventObj) {\n\t\tconst that = this;\n\t\t// 创建 Postmate Model(作为子)\n\t\tthis.childPostmate = new Postmate.Model({\n\t\t\t// 定义子页面可以暴露给父页面的方法\n\t\t\tbaseData(data: any) {\n\t\t\t\tdata = JSON.parse(data);\n\t\t\t\tif (that.isGetData) {\n\t\t\t\t\tthat.getDataCllBack &&\n\t\t\t\t\t\tthat.getDataCllBack({\n\t\t\t\t\t\t\tstatus: 200,\n\t\t\t\t\t\t\tmessage: 'success',\n\t\t\t\t\t\t\tdata: data,\n\t\t\t\t\t\t});\n\t\t\t\t} else\n\t\t\t\t\teventObj.receive({\n\t\t\t\t\t\tstatus: 200,\n\t\t\t\t\t\tmessage: 'success',\n\t\t\t\t\t\tdata: data,\n\t\t\t\t\t});\n\t\t\t\tthat.isGetData = false;\n\t\t\t},\n\n\t\t\t// 提供当前系统的路由\n\t\t\tgetRoutes: () => {\n\t\t\t\t// 有路由\n\t\t\t\tif (that.router) {\n\t\t\t\t\tlet arr = getRouterPaths(that.router);\n\t\t\t\t\tthat.parentPostmate.emit('pushRoutes', JSON.stringify(arr, getCircularReplacer()));\n\t\t\t\t}\n\t\t\t\t// 无路由\n\t\t\t\telse that.parentPostmate.emit('pushRoutes');\n\t\t\t},\n\n\t\t\t// 检查路由是否存在\n\t\t\tisRouteExists(routePath: string) {\n\t\t\t\tif (that.router) that.parentPostmate.emit('routeExists', isRouteExists(that.router, routePath));\n\t\t\t\telse that.parentPostmate.emit('routeExists', false);\n\t\t\t},\n\n\t\t\t// 处理路由更新\n\t\t\trouteUpdate(routeInfoStr: string) {\n\t\t\t\t// 向父页面同步路由数据\n\t\t\t\ttry {\n\t\t\t\t\tconst routeInfo: RouteUpdateInfo = JSON.parse(routeInfoStr);\n\n\t\t\t\t\t// 如果提供了自定义的路由更新回调函数,则调用它\n\t\t\t\t\tif (that.routeUpdateCallback) {\n\t\t\t\t\t\tthat.routeUpdateCallback(routeInfo);\n\t\t\t\t\t\tthat.parentPostmate.emit('route_update_result', true);\n\t\t\t\t\t\tconsole.log('----------------- 【ChildPastMate】路由更新完成 -----------------');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// 如果提供了router实例,则使用router进行路由更新\n\t\t\t\t\tif (that.router) {\n\t\t\t\t\t\tthat.router.replace(routeInfo.fullPath);\n\t\t\t\t\t\tthat.parentPostmate.emit('route_update_result', true);\n\t\t\t\t\t\tconsole.log('----------------- 【ChildPastMate】路由更新完成 -----------------');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthat.parentPostmate.emit('route_update_result', false);\n\t\t\t\t\t\tconsole.warn('【ChildPastMate】未提供router实例,无法进行路由更新');\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('【ChildPastMate】路由更新失败:', error);\n\t\t\t\t\tthat.parentPostmate.emit('route_update_result', false);\n\t\t\t\t}\n\t\t\t},\n\t\t})\n\t\t\t.then((parent: any) => {\n\t\t\t\tthat.parentPostmate = parent;\n\t\t\t\tthat.getData();\n\t\t\t\t// 与父页面链接建立成功\n\t\t\t\teventObj.success({\n\t\t\t\t\tstatus: 200,\n\t\t\t\t\tmessage: 'success',\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tChildPostmate: parent,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\t// 告诉父系统支持路由更新\n\t\t\t\tthat.parentPostmate.emit('route_update_support', that.router ? true : false);\n\n\t\t\t\t// 向父页面同步路由数据\n\t\t\t\tthat.router && that.parentPostmate.emit('pushRoutes', JSON.stringify(getRouterPaths(that.router), getCircularReplacer()));\n\t\t\t})\n\t\t\t.catch((err: any) => {\n\t\t\t\teventObj.error({ status: 500, data: null, message: err });\n\t\t\t});\n\t}\n\n\t// 获取数据\n\tgetData(callback?: any) {\n\t\tif (!this.parentPostmate) {\n\t\t\tcallback({\n\t\t\t\tstatus: 500,\n\t\t\t\tmessage: '父页面未连接',\n\t\t\t\tdata: null,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (callback) {\n\t\t\tthis.isGetData = true;\n\t\t\tthis.getDataCllBack = callback;\n\t\t} else {\n\t\t\tthis.isGetData = false;\n\t\t\tthis.getDataCllBack = null;\n\t\t}\n\t\t// 向父页面获取数据\n\t\tthis.parentPostmate.emit('requestBaseData');\n\t}\n\n\t/**\n\t * 设置路由实例和路由更新回调\n\t * @param router Vue Router实例\n\t * @param routeUpdateCallback 自定义路由更新回调函数\n\t */\n\tsetRouter(router: any, routeUpdateCallback?: (routeInfo: RouteUpdateInfo) => void) {\n\t\tthis.router = router;\n\t\tif (routeUpdateCallback) {\n\t\t\tthis.routeUpdateCallback = routeUpdateCallback;\n\t\t}\n\t}\n\n\t/**\n\t * 向父页面发送其他请求\n\t * @param params 请求参数\n\t */\n\tsendOtherRequest(params: any) {\n\t\tif (!this.parentPostmate) return;\n\t\tthis.parentPostmate.emit('otherRequest', params);\n\t}\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","getCircularReplacer","seen","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,2 +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 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"})});
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 y=0;const R={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&&!!R[i.data.postmate]}class w{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=++y,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 w(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 E{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=E;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 C(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 k(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}}const g=()=>{const i=new WeakSet;return(e,t)=>{if(typeof t=="object"&&t!==null){if(i.has(t))return"[Circular Reference]";i.add(t)}return t}};class I{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,g()))}else t.parentPostmate.emit("pushRoutes")},isRouteExists(s){t.router?t.parentPostmate.emit("routeExists",C(t.router,s)):t.parentPostmate.emit("routeExists",!1)},routeUpdate(s){try{const r=JSON.parse(s);if(t.routeUpdateCallback){t.routeUpdateCallback(r),t.parentPostmate.emit("route_update_result",!0),console.log("----------------- 【ChildPastMate】路由更新完成 -----------------");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),g()))}).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 S{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)||!k(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=I,u.ParentPostmate=S,Object.defineProperty(u,Symbol.toStringTag,{value:"Module"})});
2
2
  //# sourceMappingURL=index.umd.js.map
Binary file
@@ -1 +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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"}
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}\r\n\r\n\r\nexport const getCircularReplacer = () => {\r\n\tconst seen = new WeakSet();\r\n\treturn (key, value) => {\r\n\t\tif (typeof value === 'object' && value !== null) {\r\n\t\t\tif (seen.has(value)) {\r\n\t\t\t\t// 遇到循环引用时,返回一个标识或忽略\r\n\t\t\t\treturn '[Circular Reference]';\r\n\t\t\t}\r\n\t\t\tseen.add(value);\r\n\t\t}\r\n\t\treturn value;\r\n\t};\r\n};","import Postmate from './postMeta';\nimport { getCircularReplacer, getRouterPaths, isRouteExists } from './tools';\n\ninterface EventObj {\n\terror: (error: any) => void;\n\tsuccess: (success: any) => void;\n\treceive: (receive: any) => void;\n}\n\n// 路由更新接口\ninterface RouteUpdateInfo {\n\tfullPath: string;\n}\n\nexport default class ChildPostmate {\n\tchildPostmate: any = null;\n\tparentPostmate: any = null;\n\n\tisGetData: boolean = false;\n\tgetDataCllBack: Function | null = null;\n\n\t// Vue Router实例\n\trouter: any = null;\n\t// 路由更新回调函数\n\trouteUpdateCallback: ((routeInfo: RouteUpdateInfo) => void) | undefined = undefined;\n\n\tconstructor(eventObj: EventObj, router: any, routeUpdateCallback?: (routeInfo: RouteUpdateInfo) => void) {\n\t\t// 保存router实例\n\t\tthis.router = router;\n\t\t// 保存路由更新回调函数\n\t\tthis.routeUpdateCallback = routeUpdateCallback;\n\n\t\tif (window.top !== window.self) this.init(eventObj);\n\t\telse {\n\t\t\teventObj.error({ status: 500, data: null, message: '未在一体化平台中运行' });\n\t\t}\n\t}\n\n\tinit(eventObj: EventObj) {\n\t\tconst that = this;\n\t\t// 创建 Postmate Model(作为子)\n\t\tthis.childPostmate = new Postmate.Model({\n\t\t\t// 定义子页面可以暴露给父页面的方法\n\t\t\tbaseData(data: any) {\n\t\t\t\tdata = JSON.parse(data);\n\t\t\t\tif (that.isGetData) {\n\t\t\t\t\tthat.getDataCllBack &&\n\t\t\t\t\t\tthat.getDataCllBack({\n\t\t\t\t\t\t\tstatus: 200,\n\t\t\t\t\t\t\tmessage: 'success',\n\t\t\t\t\t\t\tdata: data,\n\t\t\t\t\t\t});\n\t\t\t\t} else\n\t\t\t\t\teventObj.receive({\n\t\t\t\t\t\tstatus: 200,\n\t\t\t\t\t\tmessage: 'success',\n\t\t\t\t\t\tdata: data,\n\t\t\t\t\t});\n\t\t\t\tthat.isGetData = false;\n\t\t\t},\n\n\t\t\t// 提供当前系统的路由\n\t\t\tgetRoutes: () => {\n\t\t\t\t// 有路由\n\t\t\t\tif (that.router) {\n\t\t\t\t\tlet arr = getRouterPaths(that.router);\n\t\t\t\t\tthat.parentPostmate.emit('pushRoutes', JSON.stringify(arr, getCircularReplacer()));\n\t\t\t\t}\n\t\t\t\t// 无路由\n\t\t\t\telse that.parentPostmate.emit('pushRoutes');\n\t\t\t},\n\n\t\t\t// 检查路由是否存在\n\t\t\tisRouteExists(routePath: string) {\n\t\t\t\tif (that.router) that.parentPostmate.emit('routeExists', isRouteExists(that.router, routePath));\n\t\t\t\telse that.parentPostmate.emit('routeExists', false);\n\t\t\t},\n\n\t\t\t// 处理路由更新\n\t\t\trouteUpdate(routeInfoStr: string) {\n\t\t\t\t// 向父页面同步路由数据\n\t\t\t\ttry {\n\t\t\t\t\tconst routeInfo: RouteUpdateInfo = JSON.parse(routeInfoStr);\n\n\t\t\t\t\t// 如果提供了自定义的路由更新回调函数,则调用它\n\t\t\t\t\tif (that.routeUpdateCallback) {\n\t\t\t\t\t\tthat.routeUpdateCallback(routeInfo);\n\t\t\t\t\t\tthat.parentPostmate.emit('route_update_result', true);\n\t\t\t\t\t\tconsole.log('----------------- 【ChildPastMate】路由更新完成 -----------------');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// 如果提供了router实例,则使用router进行路由更新\n\t\t\t\t\tif (that.router) {\n\t\t\t\t\t\tthat.router.replace(routeInfo.fullPath);\n\t\t\t\t\t\tthat.parentPostmate.emit('route_update_result', true);\n\t\t\t\t\t\tconsole.log('----------------- 【ChildPastMate】路由更新完成 -----------------');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthat.parentPostmate.emit('route_update_result', false);\n\t\t\t\t\t\tconsole.warn('【ChildPastMate】未提供router实例,无法进行路由更新');\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('【ChildPastMate】路由更新失败:', error);\n\t\t\t\t\tthat.parentPostmate.emit('route_update_result', false);\n\t\t\t\t}\n\t\t\t},\n\t\t})\n\t\t\t.then((parent: any) => {\n\t\t\t\tthat.parentPostmate = parent;\n\t\t\t\tthat.getData();\n\t\t\t\t// 与父页面链接建立成功\n\t\t\t\teventObj.success({\n\t\t\t\t\tstatus: 200,\n\t\t\t\t\tmessage: 'success',\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tChildPostmate: parent,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\t// 告诉父系统支持路由更新\n\t\t\t\tthat.parentPostmate.emit('route_update_support', that.router ? true : false);\n\n\t\t\t\t// 向父页面同步路由数据\n\t\t\t\tthat.router && that.parentPostmate.emit('pushRoutes', JSON.stringify(getRouterPaths(that.router), getCircularReplacer()));\n\t\t\t})\n\t\t\t.catch((err: any) => {\n\t\t\t\teventObj.error({ status: 500, data: null, message: err });\n\t\t\t});\n\t}\n\n\t// 获取数据\n\tgetData(callback?: any) {\n\t\tif (!this.parentPostmate) {\n\t\t\tcallback({\n\t\t\t\tstatus: 500,\n\t\t\t\tmessage: '父页面未连接',\n\t\t\t\tdata: null,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (callback) {\n\t\t\tthis.isGetData = true;\n\t\t\tthis.getDataCllBack = callback;\n\t\t} else {\n\t\t\tthis.isGetData = false;\n\t\t\tthis.getDataCllBack = null;\n\t\t}\n\t\t// 向父页面获取数据\n\t\tthis.parentPostmate.emit('requestBaseData');\n\t}\n\n\t/**\n\t * 设置路由实例和路由更新回调\n\t * @param router Vue Router实例\n\t * @param routeUpdateCallback 自定义路由更新回调函数\n\t */\n\tsetRouter(router: any, routeUpdateCallback?: (routeInfo: RouteUpdateInfo) => void) {\n\t\tthis.router = router;\n\t\tif (routeUpdateCallback) {\n\t\t\tthis.routeUpdateCallback = routeUpdateCallback;\n\t\t}\n\t}\n\n\t/**\n\t * 向父页面发送其他请求\n\t * @param params 请求参数\n\t */\n\tsendOtherRequest(params: any) {\n\t\tif (!this.parentPostmate) return;\n\t\tthis.parentPostmate.emit('otherRequest', params);\n\t}\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","getCircularReplacer","seen","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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"}
@@ -24,3 +24,4 @@ export declare function getRouterPaths(router: any): any[];
24
24
  * @returns 如果协议、IP(或域名)和端口都相同则返回true,否则返回false;解析失败时返回false
25
25
  */
26
26
  export declare function areUrlsSameProtocolIpPort(url1: string, url2: string): boolean;
27
+ export declare const getCircularReplacer: () => (key: any, value: any) => any;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qlfy-postmate",
3
- "version": "1.2.4",
3
+ "version": "1.2.5",
4
4
  "description": "",
5
5
  "types": "lib/index.d.ts",
6
6
  "module": "lib/index.umd.js",