qlfy-postmate 1.3.2 → 1.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
- ### 子系统认证通信插件使用文档1.2.8
1
+ ### 子系统认证通信插件使用文档
2
2
 
3
- ### 【1.2.8优化升级说明】
3
+ ### 【优化升级说明】
4
4
 
5
5
  ```txt
6
6
  1、优化了同IP链接切换时的系统资源重复加载问题
@@ -14,7 +14,7 @@
14
14
  3、建议
15
15
  已完成集成系统也建议使用最新版本,使用变化极小
16
16
  仅需以下两步操作:
17
- (1)下载新版本插件:npm i qlfy-postmate@1.2.8
17
+ (1)下载新版本插件:npm i qlfy-postmate@latest
18
18
  (2)使用处添加新参数:router
19
19
  new ChildPostmate({...保持不变}, router)
20
20
  ```
@@ -139,9 +139,3 @@ url后配置本地所启用的前端服务
139
139
  http://10.76.91.86:8000/#/test?url=http://192.168.3.136:8080/
140
140
  ```
141
141
 
142
- ### 版本更新
143
-
144
- ##### 1.2.6
145
-
146
- ​ 解决分系统在非一体化的iframe中事件不触发问题
147
-
package/lib/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  const c = "application/x-postmate-v1+json";
2
- let x = 0;
3
- const w = {
2
+ let w = 0;
3
+ const x = {
4
4
  handshake: 1,
5
5
  "handshake-reply": 1,
6
6
  call: 1,
@@ -9,7 +9,7 @@ const w = {
9
9
  request: 1
10
10
  };
11
11
  function f(a, e) {
12
- return (typeof e != "string" || a.origin === e) && !!a.data && (typeof a.data != "object" || "postmate" in a.data) && a.data.type === c && !!w[a.data.postmate];
12
+ return (typeof e != "string" || a.origin === e) && !!a.data && (typeof a.data != "object" || "postmate" in a.data) && a.data.type === c && !!x[a.data.postmate];
13
13
  }
14
14
  class E {
15
15
  constructor(e) {
@@ -21,7 +21,7 @@ class E {
21
21
  }
22
22
  get(e) {
23
23
  return new h.Promise((t) => {
24
- const s = ++x, r = (i) => {
24
+ const s = ++w, r = (i) => {
25
25
  i.data.uid === s && i.data.postmate === "reply" && (this.parent.removeEventListener("message", r, !1), t(i.data.value));
26
26
  };
27
27
  this.parent.addEventListener("message", r, !1), this.child.postMessage(
@@ -120,7 +120,7 @@ class h {
120
120
  });
121
121
  }
122
122
  }
123
- class _ {
123
+ class O {
124
124
  constructor(e) {
125
125
  return this.child = window, this.model = e, this.parent = window.parent, this.sendHandshakeReply();
126
126
  }
@@ -153,14 +153,14 @@ h.Promise = (() => {
153
153
  return Promise;
154
154
  }
155
155
  })();
156
- h.Model = _;
157
- const O = (a) => {
156
+ h.Model = O;
157
+ const _ = (a) => {
158
158
  if (!a || a === "/") return "";
159
159
  const e = a.replace(/\/$/, "");
160
160
  return e.startsWith("/") ? e : `/${e}`;
161
- }, v = (a, e = "") => {
161
+ }, $ = (a, e = "") => {
162
162
  if (!a) return null;
163
- const t = O(e);
163
+ const t = _(e);
164
164
  let s = "";
165
165
  try {
166
166
  s = new URL(a).pathname;
@@ -192,7 +192,7 @@ const O = (a) => {
192
192
  return !1;
193
193
  }, m = (a, e, t = "") => {
194
194
  if (!a || !a.length || !e) return !1;
195
- const s = v(e, t);
195
+ const s = $(e, t);
196
196
  return s ? P(a, s) : !1;
197
197
  };
198
198
  function R(a, e) {
@@ -201,7 +201,7 @@ function R(a, e) {
201
201
  return !0;
202
202
  return !1;
203
203
  }
204
- function I(a, e) {
204
+ function v(a, e) {
205
205
  e.includes("?") && (e = e.split("?")[0]);
206
206
  const t = d(a);
207
207
  return !t || t.length === 0 ? !1 : R(t, e);
@@ -223,12 +223,12 @@ function d(a) {
223
223
  let e = [];
224
224
  return typeof a.getRoutes == "function" ? e = a.getRoutes() : a.options && Array.isArray(a.options.routes) && (e = a.options.routes), e.map((t) => y(t)) || [];
225
225
  }
226
- function S(a, e) {
226
+ function I(a, e) {
227
227
  try {
228
228
  const t = new URL(a), s = new URL(e), r = t.protocol.toLowerCase() === s.protocol.toLowerCase(), i = t.hostname === s.hostname, o = t.port === s.port;
229
229
  return r && i && o;
230
230
  } catch (t) {
231
- return console.error("URL解析错误:", t), !1;
231
+ return console.warn("URL解析错误:", t), !1;
232
232
  }
233
233
  }
234
234
  const g = () => {
@@ -242,17 +242,18 @@ const g = () => {
242
242
  return t;
243
243
  };
244
244
  };
245
- function C(a, e) {
245
+ function S(a, e) {
246
246
  let t = "", s = new URL(e);
247
247
  e.split("?")[0];
248
248
  let r = "";
249
- if (s.hash && s.hash.indexOf("#/") > -1 ? r = s.hash.split("#")[1] : r = s.pathname, console.log(r), !m(a, r)) {
249
+ if (s.hash && s.hash.indexOf("#/") > -1 ? r = s.hash.split("#")[1] : r = s.pathname, !m(a, r)) {
250
+ this.executePrompt(0, `集成系统可访问路由中不存在路径(${r}),尝试解析base路由`);
250
251
  let i = r.split("/"), o = "/" + i.slice(2, i.length).join("/");
251
- console.log(a, o), m(a, o) ? t = "/" + i[1] : console.error("仅支持vue-router一级base配置");
252
+ console.log(a, o), m(a, o) ? (t = "/" + i[1], this.executePrompt(0, `成功解析base路由(${t})`)) : this.executePrompt(1, `未解析到base路由(${o})`);
252
253
  }
253
254
  return t;
254
255
  }
255
- class $ {
256
+ class C {
256
257
  constructor(e, t, s) {
257
258
  this.childPostmate = null, this.parentPostmate = null, this.isGetData = !1, this.getDataCllBack = null, this.stateOver = !1, this.router = null, this.customRouteChange = void 0, this.router = t, this.customRouteChange = s, window.top !== window.self ? (this.init(e), setTimeout(() => {
258
259
  this.stateOver || e.error({ status: 500, data: null, message: "未在一体化平台中运行" });
@@ -282,7 +283,7 @@ class $ {
282
283
  },
283
284
  // 检查路由是否存在
284
285
  isRouteExists(s) {
285
- t.router ? t.parentPostmate.emit("routeExists", I(t.router, s)) : t.parentPostmate.emit("routeExists", !1);
286
+ t.router ? t.parentPostmate.emit("routeExists", v(t.router, s)) : t.parentPostmate.emit("routeExists", !1);
286
287
  },
287
288
  // 处理路由更新
288
289
  routeUpdate(s) {
@@ -294,7 +295,7 @@ class $ {
294
295
  }
295
296
  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实例,无法进行路由更新"));
296
297
  } catch (r) {
297
- console.error("【ChildPastMate】路由更新失败:", r), t.parentPostmate.emit("route_update_result", !1);
298
+ console.warn("【ChildPastMate】路由更新失败:", r), t.parentPostmate.emit("route_update_result", !1);
298
299
  }
299
300
  }
300
301
  }).then((s) => {
@@ -411,17 +412,17 @@ class M {
411
412
  this.postmateParent = r, r.on("requestBaseData", () => {
412
413
  this.executePrompt(0, "接收到分系统的集成数据获取请求"), this.sendData();
413
414
  }), r.on("pushRoutes", (i) => {
414
- console.error("【ParentPostmate】分系统路由连接数据:", i), this.executePrompt(i ? 0 : 1, "接收到分系统router配置数据", i), i ? this.childRoutes = JSON.parse(i) : this.childRoutes = [], this.eventBus.getRoutes && this.eventBus.getRoutes();
415
+ this.executePrompt(i ? 0 : 1, "接收到分系统router配置数据", i), i ? this.childRoutes = JSON.parse(i) : this.childRoutes = [], this.eventBus.getRoutes && this.eventBus.getRoutes();
415
416
  }), r.on("routeExists", (i) => {
416
417
  }), r.on("route_update_support", (i) => {
417
- console.error("【ParentPostmate】route_update_support连接:", i), this.executePrompt(i ? 0 : 1, "接收到分系统router配置状态", i), this.childSupportsRouteUpdate = i;
418
+ this.executePrompt(i ? 0 : 1, "接收到分系统router配置状态", i), this.childSupportsRouteUpdate = i;
418
419
  }), r.on("route_update_result", (i) => {
419
420
  this.eventBus.route_update_result && this.eventBus.route_update_result(i);
420
421
  }), r.on("otherRequest", (i) => {
421
422
  this.handleOtherRequest && this.handleOtherRequest(i);
422
423
  }), typeof e == "function" && e(), this.executePrompt(0, "★ 集成连接成功");
423
424
  }).catch((r) => {
424
- console.error("【ParentPostmate】Postmate 连接失败:", r), this.executePrompt(1, "★ 集成连接失败");
425
+ console.warn("【ParentPostmate】Postmate 连接失败:", r), this.executePrompt(1, "★ 集成连接失败");
425
426
  });
426
427
  }
427
428
  /** 设置load执行事件 */
@@ -434,21 +435,21 @@ class M {
434
435
  }
435
436
  /** 设置 iframe url */
436
437
  setIframeUrl(e, t = "") {
437
- var r;
438
438
  if (this.executePrompt(
439
439
  0,
440
440
  `-------★接收到集成地址★-------
441
441
  【${e}】`
442
442
  ), e === this.currentUrl) return;
443
443
  if (t && !t.startsWith("/") && (t = "/" + t), t && t.endsWith("/") && (t = t.slice(0, -1)), !e) {
444
- this.currentUrl = "", this.destroy(), this.executePrompt(0, "集成地址为空,销毁当前实例"), console.error("【ParentPostmate】无加载地址,无法初始化");
444
+ this.currentUrl = "", this.destroy(), this.executePrompt(0, "集成地址为空,销毁当前实例"), console.warn("【ParentPostmate】无加载地址,无法初始化");
445
445
  return;
446
446
  }
447
447
  if (!this.postmateParent || !this.currentUrl) {
448
- this.currentUrl = e, this.executePrompt(0, "当前无链接,准备初始化容器"), this.iframeEle ? (this.executePrompt(0, "容器获取成功,准备初始化"), this.init()) : (this.executePrompt(1, "容器DOM为空,初始化失败"), console.error("【ParentPostmate】无 iframe 容器,无法初始化"));
448
+ this.currentUrl = e, this.executePrompt(0, "当前无链接,准备初始化容器"), this.iframeEle ? (this.executePrompt(0, "容器获取成功,准备初始化"), this.init()) : (this.executePrompt(1, "容器DOM为空,初始化失败"), console.warn("【ParentPostmate】无 iframe 容器,无法初始化"));
449
449
  return;
450
450
  }
451
- if (this.executePrompt(0, "当前有已集成应用,开始同源策略判定..."), !this.childSupportsRouteUpdate || !((r = this.childRoutes) != null && r.length) || !S(this.currentUrl, e)) {
451
+ if (this.executePrompt(0, "当前有已集成应用,开始同源策略判定..."), !this.childSupportsRouteUpdate || // !this.childRoutes?.length ||
452
+ !I(this.currentUrl, e)) {
452
453
  this.executePrompt(
453
454
  0,
454
455
  "同源策略检查完成,分系统不支持路由更新 或 协议、ip、端口不同,准备重新初始化"
@@ -479,8 +480,7 @@ class M {
479
480
  }), this.currentUrl = e;
480
481
  return;
481
482
  }
482
- const i = C(this.childRoutes, this.currentUrl);
483
- this.executePrompt(0, "基础路由解析完成", i);
483
+ const i = S(this.childRoutes, this.currentUrl);
484
484
  let o = new URL(e), n = "";
485
485
  if (o.hash && o.hash.indexOf("#/") > -1 ? n = o.hash.split("#")[1] : n = o.pathname + r, this.executePrompt(0, "页面路由解析完成", n), this.currentUrl.split(i)[0] === e.split(i)[0] && m(this.childRoutes, n.replace(i, ""))) {
486
486
  this.executePrompt(0, "★ 匹配完成,判定为同一系统"), this.sendRouteUpdate({
@@ -518,7 +518,7 @@ class M {
518
518
  }
519
519
  }
520
520
  export {
521
- $ as ChildPostmate,
521
+ C as ChildPostmate,
522
522
  M as ParentPostmate
523
523
  };
524
524
  //# 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/RouteMatching.ts","../packages/postMeta/tools.ts","../packages/postMeta/ChildPostmate.ts","../packages/postMeta/ParentPostmate.ts"],"sourcesContent":["const MESSAGE_TYPE = \"application/x-postmate-v1+json\";\nlet uid = 0;\n\nconst allowedPostmateTypes = {\n handshake: 1,\n \"handshake-reply\": 1,\n call: 1,\n emit: 1,\n reply: 1,\n request: 1,\n};\n\n// 校验消息是否来自合法的来源\nfunction isValidMessage(event, allowedOrigin) {\n return (\n (typeof allowedOrigin !== \"string\" || event.origin === allowedOrigin) &&\n !!event.data &&\n (typeof event.data !== \"object\" || \"postmate\" in event.data) &&\n event.data.type === MESSAGE_TYPE &&\n !!allowedPostmateTypes[event.data.postmate]\n );\n}\n\n// ----------------- ParentAPI -----------------\nclass ParentAPI {\n constructor(config) {\n this.parent = config.parent;\n this.frame = config.frame;\n this.child = config.child;\n this.childOrigin = config.childOrigin;\n this.events = {};\n\n this.listener = (event) => {\n if (!isValidMessage(event, this.childOrigin)) return;\n const { value = {} } = event.data;\n const { name, data } = value;\n if (event.data.postmate === \"emit\" && name in this.events) {\n this.events[name].call(this, data);\n }\n };\n\n this.parent.addEventListener(\"message\", this.listener, false);\n }\n\n get(property) {\n return new Postmate.Promise((resolve) => {\n const id = ++uid;\n const handler = (event) => {\n if (event.data.uid === id && event.data.postmate === \"reply\") {\n this.parent.removeEventListener(\"message\", handler, false);\n resolve(event.data.value);\n }\n };\n this.parent.addEventListener(\"message\", handler, false);\n this.child.postMessage(\n {\n postmate: \"request\",\n type: MESSAGE_TYPE,\n property,\n uid: id,\n },\n this.childOrigin\n );\n });\n }\n\n call(method, data) {\n this.child.postMessage(\n {\n postmate: \"call\",\n type: MESSAGE_TYPE,\n property: method,\n data,\n },\n this.childOrigin\n );\n }\n\n on(event, callback) {\n this.events[event] = callback;\n }\n\n destroy() {\n window.removeEventListener(\"message\", this.listener, false);\n this.frame.parentNode.removeChild(this.frame);\n }\n}\n\n// ----------------- ChildAPI -----------------\nclass ChildAPI {\n constructor(config) {\n this.model = config.model;\n this.parent = config.parent;\n this.parentOrigin = config.parentOrigin;\n this.child = config.child;\n\n this.child.addEventListener(\"message\", (event) => {\n if (!isValidMessage(event, this.parentOrigin)) return;\n\n const { postmate, property, uid, data } = event.data;\n const value = this.model[property];\n\n if (postmate !== \"call\") {\n const result = typeof value === \"function\" ? value() : value;\n Postmate.Promise.resolve(result).then((res) => {\n event.source.postMessage(\n {\n property,\n postmate: \"reply\",\n type: MESSAGE_TYPE,\n uid,\n value: res,\n },\n event.origin\n );\n });\n } else if (property in this.model && typeof value === \"function\") {\n value(data);\n }\n });\n }\n\n emit(eventName, data) {\n this.parent.postMessage(\n {\n postmate: \"emit\",\n type: MESSAGE_TYPE,\n value: { name: eventName, data },\n },\n this.parentOrigin\n );\n }\n}\n\n// ----------------- Postmate -----------------\nclass Postmate {\n constructor({ container = document.body, model, url, name, classListArray = [] }) {\n this.parent = window;\n this.frame = document.createElement(\"iframe\");\n this.frame.name = name || \"\";\n this.frame.classList.add(...classListArray);\n container.appendChild(this.frame);\n\n this.child = this.frame.contentWindow;\n this.model = model || {};\n\n return this.sendHandshake(url);\n }\n\n sendHandshake(url) {\n const origin = (() => {\n const link = document.createElement(\"a\");\n link.href = url;\n const protocol = link.protocol.length > 4 ? link.protocol : window.location.protocol;\n const host = link.host.length ? (link.port === \"80\" || link.port === \"443\" ? link.hostname : link.host) : window.location.host;\n return link.origin || `${protocol}//${host}`;\n })();\n\n let attemptCount = 0;\n let interval;\n\n return new Postmate.Promise((resolve, reject) => {\n const listener = (event) => {\n if (!isValidMessage(event, origin)) return false;\n if (event.data.postmate === \"handshake-reply\") {\n clearInterval(interval);\n this.parent.removeEventListener(\"message\", listener, false);\n this.childOrigin = event.origin;\n resolve(new ParentAPI(this));\n } else {\n reject(\"Failed handshake\");\n }\n };\n\n this.parent.addEventListener(\"message\", listener, false);\n\n const send = () => {\n attemptCount++;\n this.child.postMessage(\n {\n postmate: \"handshake\",\n type: MESSAGE_TYPE,\n model: this.model,\n },\n origin\n );\n if (attemptCount === 5) clearInterval(interval);\n };\n\n const init = () => {\n send();\n interval = setInterval(send, 500);\n };\n\n this.frame.onload = init;\n this.frame.attachEvent && this.frame.attachEvent(\"onload\", init);\n this.frame.src = url;\n });\n }\n}\n\n// ----------------- Model -----------------\nclass Model {\n constructor(model) {\n this.child = window;\n this.model = model;\n this.parent = window.parent;\n\n return this.sendHandshakeReply();\n }\n\n sendHandshakeReply() {\n return new Postmate.Promise((resolve, reject) => {\n this.child.addEventListener(\"message\", (event) => {\n if (event.data.postmate) {\n if (event.data.postmate !== \"handshake\") return reject(\"Handshake Reply Failed\");\n\n this.child.removeEventListener(\"message\", this, false);\n event.source.postMessage(\n {\n postmate: \"handshake-reply\",\n type: MESSAGE_TYPE,\n },\n event.origin\n );\n\n this.parentOrigin = event.origin;\n const parentModel = event.data.model;\n if (parentModel) {\n Object.keys(parentModel).forEach((key) => {\n this.model[key] = parentModel[key];\n });\n }\n resolve(new ChildAPI(this));\n }\n }, false);\n });\n }\n}\n\n// Attach defaults\nPostmate.debug = false;\nPostmate.Promise = (() => {\n try {\n return typeof window !== \"undefined\" ? window.Promise : Promise;\n } catch {\n return Promise;\n }\n})();\nPostmate.Model = Model;\n\nexport default Postmate;\nexport { Model };\n","import type { RouteRecordRaw } from 'vue-router';\r\n\r\n/**\r\n * 标准化基础路由(base):确保以 / 开头,不以 / 结尾(空字符串除外)\r\n */\r\nconst normalizeBase = (base: string): string => {\r\n if (!base || base === '/') return '';\r\n const trimmed = base.replace(/\\/$/, '');\r\n return trimmed.startsWith('/') ? trimmed : `/${trimmed}`;\r\n};\r\n\r\n/**\r\n * 从全量地址中提取「相对于base的路由路径」\r\n */\r\nconst extractRelativePath = (fullAddress: string, base = ''): string | null => {\r\n if (!fullAddress) return null;\r\n const normalizedBase = normalizeBase(base);\r\n let pathname = '';\r\n\r\n try {\r\n const url = new URL(fullAddress);\r\n pathname = url.pathname;\r\n } catch {\r\n pathname = fullAddress.split(/[?#]/)[0];\r\n }\r\n\r\n // 1. 去重斜杠 + 标准化路径\r\n const normalizedPathname = pathname.replace(/\\/+/g, '/').replace(/\\/$/, '') || '/';\r\n\r\n if (normalizedBase && !normalizedPathname.startsWith(normalizedBase)) {\r\n return null;\r\n }\r\n\r\n let relativePath = normalizedBase\r\n ? normalizedPathname.slice(normalizedBase.length)\r\n : normalizedPathname;\r\n\r\n // 确保相对路径以/开头,且无重复斜杠\r\n relativePath = relativePath.replace(/\\/+/g, '/');\r\n relativePath = relativePath.startsWith('/') ? relativePath : `/${relativePath}`;\r\n return relativePath === '' ? '/' : relativePath;\r\n};\r\n\r\n/**\r\n * 核心修复:路由路径转正则(解决无效转义+重复斜杠+动态参数)\r\n * 关键优化:\r\n * 1. 仅转义正则中「必须转义」的字符(移除-的转义,因为仅在[]内需要转义)\r\n * 2. 增加转义合法性校验,避免无效转义符\r\n */\r\nconst convertRoutePathToRegex = (routePath: string): RegExp => {\r\n if (!routePath) return /^$/iu;\r\n\r\n // 步骤1:标准化路由路径(去重斜杠 + 去除末尾斜杠)\r\n const normalizedRoutePath =\r\n routePath\r\n .replace(/\\/+/g, '/') // 去重所有重复斜杠(// → /)\r\n .replace(/\\/$/, '') || '/';\r\n\r\n // 步骤2:仅转义正则中「必须转义」的字符(核心修复:移除-)\r\n // 需转义的字符:. ? + ^ $ [ ] ( ) { } | \\(-不在此列,无需转义)\r\n const needEscapeChars = /([.?+^$[\\](){}|\\\\])/g;\r\n let regexStr = normalizedRoutePath.replace(needEscapeChars, '\\\\$1');\r\n\r\n // 步骤3:处理动态路由语法(不复用原有/,避免重复斜杠)\r\n regexStr = regexStr\r\n // 1. 通配符 :pathMatch(.*)* → 匹配任意多级路径\r\n .replace(/:pathMatch\\\\\\(\\.\\*\\\\\\)\\*/g, '.+')\r\n // 2. 带正则约束的参数(如 :id(\\\\d+) → 保留正则,还原转义)\r\n .replace(/:([a-zA-Z0-9_]+)\\\\\\(([^)]+)\\\\\\)/g, (_, __, regex) => regex.replace(/\\\\\\\\/g, '\\\\'))\r\n // 3. 可选动态参数(如 :id? → 匹配空或非/字符)\r\n .replace(/:([a-zA-Z0-9_]+)\\?/g, '[^/]*')\r\n // 4. 普通动态参数(仅匹配非/字符)\r\n .replace(/:([a-zA-Z0-9_]+)/g, '[^/]+');\r\n\r\n // 步骤4:最终标准化正则字符串(去重转义的/,避免\\\\/→\\/重复)\r\n regexStr = regexStr.replace(/\\\\\\/+/g, '\\\\/');\r\n\r\n // 步骤5:安全生成正则(捕获转义错误,降级返回空正则)\r\n try {\r\n return new RegExp(`^${regexStr}$`, 'iu');\r\n } catch (e) {\r\n console.warn('路由路径转正则失败', { routePath, regexStr, error: e });\r\n return /^$/iu;\r\n }\r\n};\r\n\r\n/**\r\n * 递归遍历路由(保留调试日志)\r\n */\r\nconst traverseRoutes = (\r\n routers: RouteRecordRaw[],\r\n targetRelativePath: string,\r\n parentPath = '',\r\n): boolean => {\r\n // 目标路径去重斜杠 + 标准化\r\n const normalizedTarget = targetRelativePath.replace(/\\/+/g, '/').replace(/\\/$/, '') || '/';\r\n\r\n for (const route of routers) {\r\n // 修复嵌套路由拼接逻辑(彻底避免重复斜杠)\r\n const processedParentPath = parentPath.replace(/\\/+/g, '/').replace(/\\/$/, '');\r\n const processedRoutePath = route.path.replace(/\\/+/g, '/').replace(/^\\//, '');\r\n const fullRoutePath = processedParentPath\r\n ? `${processedParentPath}/${processedRoutePath}`.replace(/\\/+/g, '/')\r\n : route.path.replace(/\\/+/g, '/');\r\n\r\n const routeRegex = convertRoutePathToRegex(fullRoutePath);\r\n const isMatched = routeRegex.test(normalizedTarget);\r\n\r\n if (isMatched) return true;\r\n\r\n if (route.children && route.children.length) {\r\n const childMatched = traverseRoutes(route.children, normalizedTarget, fullRoutePath);\r\n if (childMatched) return true;\r\n }\r\n }\r\n\r\n return false;\r\n};\r\n\r\n/**\r\n * 对外方法\r\n */\r\nexport const isRouteMatched = (\r\n routers: RouteRecordRaw[],\r\n fullAddress: string,\r\n base = '',\r\n): boolean => {\r\n if (!routers || !routers.length || !fullAddress) return false;\r\n const relativePath = extractRelativePath(fullAddress, base);\r\n if (!relativePath) return false;\r\n return traverseRoutes(routers, relativePath);\r\n};\r\n","import { isRouteMatched } from './RouteMatching';\n\n/**\n * 检查路径是否存在于路由配置中(递归检查所有层级)\n * @param routes 路由配置数组\n * @param path 需要检查的路径\n * @returns 是否存在\n */\nexport function checkPathInRoutes(routes: any[], path: string): boolean {\n\tfor (const route of routes) {\n\t\t// 检查当前路由\n\t\tif (route.path === path) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// 递归检查子路由\n\t\tif (route.children && Array.isArray(route.children) && route.children.length > 0) {\n\t\t\tif (checkPathInRoutes(route.children, path)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * 判断路径是否存在于vue-router对象中(兼容Vue2和Vue3)\n * @param router vue-router实例\n * @param path 需要检查的页面路径\n * @returns 路径是否存在\n */\nexport function isRouteExists(router: any, path: string): boolean {\n\t// 移除路径中的查询参数\n\tif (path.includes('?')) {\n\t\tpath = path.split('?')[0];\n\t}\n\tconst routes = getRouterPaths(router);\n\tif (!routes || routes.length === 0) return false;\n\treturn checkPathInRoutes(routes, path);\n}\n\n// 净化单个路由配置,只保留安全字段\nfunction purifyRoute(route) {\n\t// 只提取需要的基础字段,根据你的需求调整\n\tconst safeFields = {\n\t\tpath: route.path,\n\t\tname: route.name,\n\t\tmeta: route.meta || {}, // 确保meta是普通对象\n\t\tredirect: route.redirect,\n\t\t// 剔除 component、beforeEnter 等可能包含函数/对象引用的字段\n\t\t// 如果需要children,递归净化\n\t\tchildren: route.children ? route.children.map((child) => purifyRoute(child)) : [],\n\t};\n\n\t// 进一步净化meta(如果meta中可能有复杂对象)\n\tsafeFields.meta = JSON.parse(JSON.stringify(safeFields.meta));\n\n\treturn safeFields;\n}\n\n/**\n * 获取路由路径\n *\n */\nexport function getRouterPaths(router: any): any[] {\n\tlet routes: any[] = [];\n\t// 区分Vue Router 3.x (Vue2) 和 4.x (Vue3)\n\tif (typeof router.getRoutes === 'function') {\n\t\t// Vue Router 4.x (Vue3)\n\t\troutes = router.getRoutes();\n\t} else if (router.options && Array.isArray(router.options.routes)) {\n\t\t// Vue Router 3.x (Vue2)\n\t\troutes = router.options.routes;\n\t}\n\treturn routes.map((route) => purifyRoute(route)) || [];\n}\n\n/**\n * 比较两个URL的协议、IP(或域名)和端口是否完全相同\n * @param url1 第一个URL字符串\n * @param url2 第二个URL字符串\n * @returns 如果协议、IP(或域名)和端口都相同则返回true,否则返回false;解析失败时返回false\n */\nexport function areUrlsSameProtocolIpPort(url1: string, url2: string): boolean {\n\ttry {\n\t\t// 解析两个URL\n\t\tconst parsedUrl1 = new URL(url1);\n\t\tconst parsedUrl2 = new URL(url2);\n\n\t\t// 比较协议(不区分大小写,但通常URL协议是小写的)\n\t\tconst sameProtocol = parsedUrl1.protocol.toLowerCase() === parsedUrl2.protocol.toLowerCase();\n\n\t\t// 比较主机(IP或域名)\n\t\tconst sameHost = parsedUrl1.hostname === parsedUrl2.hostname;\n\n\t\t// 比较端口(如果未指定端口,会使用协议默认端口)\n\t\tconst samePort = parsedUrl1.port === parsedUrl2.port;\n\n\t\t// 只有所有部分都相同时才返回true\n\t\treturn sameProtocol && sameHost && samePort;\n\t} catch (error) {\n\t\t// 如果URL解析失败,返回false\n\t\tconsole.error('URL解析错误:', error);\n\t\treturn false;\n\t}\n}\n\nexport const getCircularReplacer = () => {\n\tconst seen = new WeakSet();\n\treturn (key, value) => {\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tif (seen.has(value)) {\n\t\t\t\t// 遇到循环引用时,返回一个标识或忽略\n\t\t\t\treturn '[Circular Reference]';\n\t\t\t}\n\t\t\tseen.add(value);\n\t\t}\n\t\treturn value;\n\t};\n};\n\nexport function getBaseRoute(routers: any[], url: string): string {\n\tlet baseRoute = '';\n\tlet urlObj = new URL(url);\n\tlet noQueryUrl = url.split('?')[0];\n\n\t// 判断路由模式并取值\n\tlet routePath = '';\n\tif (urlObj.hash && urlObj.hash.indexOf('#/') > -1) {\n\t\troutePath = urlObj.hash.split('#')[1];\n\n\t} else {\n\t\troutePath = urlObj.pathname;\n\t}\n\n\tconsole.log(routePath);\n\t\n\t// 当前路由中没有该路由,判定有base\n\tif (!isRouteMatched(routers, routePath)) {\n\t\t// 尝试剔除第一个路由,再判断是否匹配\n\t\tlet arr = routePath.split('/');\n\t\tlet nowRoute = '/' + arr.slice(2, arr.length).join('/');\n\t\tconsole.log(routers, nowRoute);\n\t\t\n\t\tif (isRouteMatched(routers, nowRoute)) {\n\t\t\tbaseRoute = '/' + arr[1];\n\t\t} else {\n\t\t\tconsole.error('仅支持vue-router一级base配置');\n\t\t}\n\t}\n\treturn baseRoute;\n}\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\t[x: string]: any;\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\tstateOver: boolean = false;\n\n\t// Vue Router实例\n\trouter: any = null;\n\t// 路由更新回调函数\n\tcustomRouteChange: ((routeInfo: RouteUpdateInfo) => void) | undefined = undefined;\n\n\tconstructor(eventObj: EventObj, router: any, customRouteChange?: (routeInfo: RouteUpdateInfo) => void) {\n\t\t// 保存router实例\n\t\tthis.router = router;\n\t\t// 保存路由更新回调函数\n\t\tthis.customRouteChange = customRouteChange;\n\n\t\tif (window.top !== window.self) {\n\t\t\tthis.init(eventObj);\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (this.stateOver) return;\n\t\t\t\teventObj.error({ status: 500, data: null, message: '未在一体化平台中运行' });\n\t\t\t}, 500);\n\t\t} else {\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.customRouteChange) {\n\t\t\t\t\t\tthat.customRouteChange(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\tthis.stateOver = true;\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\tthis.stateOver = true;\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 customRouteChange 自定义路由更新回调函数\n\t */\n\tsetRouter(router: any, customRouteChange?: (routeInfo: RouteUpdateInfo) => void) {\n\t\tthis.router = router;\n\t\tif (customRouteChange) {\n\t\t\tthis.customRouteChange = customRouteChange;\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 { isRouteMatched } from './RouteMatching';\nimport { areUrlsSameProtocolIpPort, checkPathInRoutes, getBaseRoute } from './tools';\n\ninterface PromptInfo {\n //\n code: 0 | 1;\n message: string;\n data?: any;\n}\n\ninterface DataInfo {\n loginInfo: { [x: string]: any };\n token: string;\n isHideHeader: boolean;\n}\n\n// URL解析结果接口\ninterface ParsedUrl {\n protocol: string;\n host: string;\n port: string;\n pathname: string;\n search: string;\n hash: string;\n origin: string;\n fullPath: string;\n}\n\nexport default class ParentPostmate {\n /** 连接到的子 postmate 实例 */\n postmateParent: any = null;\n /** 通讯数据 */\n dataInfo: DataInfo = {\n loginInfo: {},\n token: '',\n isHideHeader: true,\n };\n /** iframe Dom 容器 */\n iframeEle: any = null;\n /** 当前 iframe url */\n currentUrl: string = '';\n /** 存储当前的 iframe 元素 */\n currentIframe: any = null;\n /** iframe 加载完成执行函数 */\n loadFunction: (() => void) | null = null;\n /** 处理子类的其他请求方法 */\n handleOtherRequest: ((params: any) => void) | null = null;\n /** 子页面是否支持路由更新 */\n childSupportsRouteUpdate: boolean = true;\n /** 子系统的路由列表 */\n childRoutes: any[] = [];\n /** 获取分系统路由列表的定时器对象 */\n getRoutersTimer: any = null;\n /** 推送路由更新的定时器对象的定时器对象 */\n pushRouterTimer: any = null;\n /** 集成过程提示暴露方法 */\n getPrompt: ((info: PromptInfo) => void) | null = null;\n\n eventBus: any = {\n getRoutes: null,\n route_update_result: null,\n };\n\n constructor(\n dataInfo: DataInfo,\n iframeEle: HTMLElement | (() => HTMLElement),\n iframeUrl: string = '',\n handleOtherRequest?: (params: any) => void,\n ) {\n this.dataInfo = dataInfo || this.dataInfo;\n this.iframeEle = iframeEle;\n this.setIframeUrl(iframeUrl);\n handleOtherRequest && (this.handleOtherRequest = handleOtherRequest);\n }\n\n executePrompt(code: 0 | 1, message: string, data?: any) {\n this.getPrompt && this.getPrompt({ code, message, data });\n }\n\n /** 解析URL */\n parseUrl(url: string): ParsedUrl {\n const link = document.createElement('a');\n link.href = url;\n\n // 获取协议\n const protocol = link.protocol.length > 4 ? link.protocol : window.location.protocol;\n\n // 获取主机和端口\n const host = link.hostname;\n const port =\n link.port || (protocol === 'https:' ? '443' : protocol === 'http:' ? '80' : '');\n\n // 获取路径、查询参数和哈希\n const pathname = link.pathname.startsWith('/') ? link.pathname : `/${link.pathname}`;\n const search = link.search;\n const hash = link.hash.slice(2, link.hash.length);\n\n // 构建origin\n const origin = link.origin || `${protocol}//${host}${port ? `:${port}` : ''}`;\n\n // 构建完整路径(不包含origin)\n const fullPath = `${pathname}${hash}`;\n\n return {\n protocol,\n host,\n port,\n pathname,\n search,\n hash,\n origin,\n fullPath,\n };\n }\n\n /** 比较两个URL是否相同*/\n compareUrlBase(url1: string, url2: string): boolean {\n const url1End = url1.endsWith('/');\n const url2End = url2.endsWith('/');\n if ((url1End && url2End) || (!url1End && !url2End)) {\n return url1 === url2;\n } else {\n if (url1End) url2 += '/';\n if (url2End) url1 += '/';\n return url1 === url2;\n }\n }\n\n /** 比较两个URL的路径是否相同(不包含查询参数和哈希) */\n compareUrlPath(url1: string, url2: string): boolean {\n if (!url1 || !url2) return false;\n\n const parsed1 = this.parseUrl(url1);\n const parsed2 = this.parseUrl(url2);\n\n return parsed1.pathname === parsed2.pathname;\n }\n\n /** 比较两个URL是否完全相同(包括查询参数和哈希) */\n compareUrlFull(url1: string, url2: string): boolean {\n if (!url1 || !url2) return false;\n\n const parsed1 = this.parseUrl(url1);\n const parsed2 = this.parseUrl(url2);\n\n return parsed1.fullPath === parsed2.fullPath;\n }\n\n /** 清除当前的 iframe 和 postmate 实例 */\n clear() {\n // 销毁 postmate 实例\n if (this.postmateParent) {\n this.postmateParent.destroy();\n this.postmateParent = null;\n }\n\n this.eventBus.getRoutes = null;\n this.eventBus.route_update_result = null;\n this.childRoutes = [];\n this.childSupportsRouteUpdate = false;\n\n // 移除 iframe\n if (this.currentIframe && this.currentIframe.parentNode) {\n this.currentIframe.parentNode.removeChild(this.currentIframe);\n }\n this.currentIframe = null;\n }\n\n /** 初始化 */\n async init(callback: any = null) {\n this.executePrompt(0, '★ 开始创建集成连接');\n\n // 清除之前的实例和 iframe\n this.clear();\n\n // 重置子页面路由更新支持标记\n this.childSupportsRouteUpdate = false;\n\n // 如果没有容器,或集成链接\n if (!this.iframeEle || !this.currentUrl) {\n this.executePrompt(1, '容器获取失败或集成链接为空');\n this.destroy();\n return;\n }\n\n // 获取 iframe 容器\n const container: any =\n typeof this.iframeEle === 'function' ? this.iframeEle() : this.iframeEle;\n if (!container) {\n this.executePrompt(1, '集成容器DOM获取失败');\n console.warn('【ParentPostmate】无法获取 iframe 容器');\n return;\n }\n\n // 创建 Postmate 实例(作为父)\n const handshake: any = new Postmate({\n container,\n url: this.currentUrl,\n name: '',\n model: '',\n });\n\n // 存储当前创建的 iframe\n this.currentIframe = container.querySelector('iframe');\n this.currentIframe.setAttribute('frameborder', '0');\n this.currentIframe.setAttribute('allow', 'fullscreen');\n this.currentIframe.addEventListener('load', () => {\n this.loadFunction && this.loadFunction();\n });\n\n handshake\n .then((parent: any) => {\n this.postmateParent = parent;\n\n // 监听子页面发来的获取数据请求\n parent.on('requestBaseData', () => {\n this.executePrompt(0, '接收到分系统的集成数据获取请求');\n\n // 发送相关数据\n this.sendData();\n });\n\n // 监听子页面发来的路由配置数据\n parent.on('pushRoutes', (routes: string) => {\n console.error('【ParentPostmate】分系统路由连接数据:', routes);\n this.executePrompt(routes ? 0 : 1, '接收到分系统router配置数据', routes);\n\n if (routes) this.childRoutes = JSON.parse(routes);\n else this.childRoutes = [];\n this.eventBus.getRoutes && this.eventBus.getRoutes();\n });\n\n // 监听子页面的路由效验结果\n parent.on('routeExists', (flag: boolean) => {});\n\n // 监听子页面的动态路由变更支持\n parent.on('route_update_support', (flag: boolean) => {\n console.error('【ParentPostmate】route_update_support连接:', flag);\n this.executePrompt(flag ? 0 : 1, '接收到分系统router配置状态', flag);\n\n this.childSupportsRouteUpdate = flag;\n });\n\n // 监听子页面的路由变更结果\n parent.on('route_update_result', (flag: boolean) => {\n this.eventBus.route_update_result && this.eventBus.route_update_result(flag);\n });\n\n // 监听子页面发来的其他请求\n parent.on('otherRequest', (params: any) => {\n this.handleOtherRequest && this.handleOtherRequest(params);\n });\n\n if (typeof callback === 'function') callback();\n\n this.executePrompt(0, '★ 集成连接成功');\n })\n .catch((error: any) => {\n console.error('【ParentPostmate】Postmate 连接失败:', error);\n this.executePrompt(1, '★ 集成连接失败');\n });\n }\n\n /** 设置load执行事件 */\n setLoadFunction(loadFunction: () => void) {\n this.loadFunction = loadFunction;\n }\n\n /** 设置获取集成提示方法 */\n setGetPrompt(getPrompt: (info: PromptInfo) => void) {\n this.getPrompt = getPrompt;\n }\n\n /** 设置 iframe url */\n setIframeUrl(iframeUrl: string, routerPath: string = '') {\n this.executePrompt(\n 0,\n `-------★接收到集成地址★-------\n【${iframeUrl}】`,\n );\n\n // 如果完全一样:不操作\n if (iframeUrl === this.currentUrl) return;\n\n // 如果传入了路由,则对路径进行规范处理\n if (routerPath && !routerPath.startsWith('/')) {\n routerPath = '/' + routerPath;\n }\n\n if (routerPath && routerPath.endsWith('/')) {\n routerPath = routerPath.slice(0, -1);\n }\n\n // 1、传入的地址为空:销毁当前实例\n if (!iframeUrl) {\n this.currentUrl = '';\n this.destroy();\n this.executePrompt(0, '集成地址为空,销毁当前实例');\n console.error('【ParentPostmate】无加载地址,无法初始化');\n return;\n }\n\n // 2、如果当前无连接:直接设置并初始化\n if (!this.postmateParent || !this.currentUrl) {\n this.currentUrl = iframeUrl;\n this.executePrompt(0, '当前无链接,准备初始化容器');\n if (this.iframeEle) {\n this.executePrompt(0, '容器获取成功,准备初始化');\n this.init();\n } else {\n this.executePrompt(1, '容器DOM为空,初始化失败');\n console.error('【ParentPostmate】无 iframe 容器,无法初始化');\n }\n return;\n }\n\n this.executePrompt(0, '当前有已集成应用,开始同源策略判定...');\n // 3、如果当前系统不支持路由更新 或 新旧系统协议、ip、端口不同则重新初始化: 重新初始化\n if (\n !this.childSupportsRouteUpdate ||\n !this.childRoutes?.length ||\n !areUrlsSameProtocolIpPort(this.currentUrl, iframeUrl)\n ) {\n this.executePrompt(\n 0,\n '同源策略检查完成,分系统不支持路由更新 或 协议、ip、端口不同,准备重新初始化',\n );\n this.currentUrl = iframeUrl;\n this.init();\n return;\n }\n\n /**\n * 因新旧地址的基础地址完全相同,且已加载系统支持路由更新\n * 下面处理新旧地址的url,研判操作方式\n **/\n this.executePrompt(\n 0,\n `同源策略检查完成,新应用地址与已集成应用协议、ip、端口相同,且当前系统支持路由更新`,\n );\n\n // 更新路由列表\n let flag = false;\n this.eventBus.getRoutes = () => {\n flag = true;\n this.executePrompt(0, `路由配置更新完成`);\n this.handleSimilarUrl(iframeUrl, routerPath);\n };\n this.executePrompt(0, `开始更新已集成应用路由配置对象...`);\n this.postmateParent.call('getRoutes');\n\n this.getRoutersTimer && clearTimeout(this.getRoutersTimer);\n this.getRoutersTimer = null;\n this.getRoutersTimer = setTimeout(() => {\n if (!flag) {\n this.executePrompt(\n 1,\n `★ 已加载系统路由配置获取失败,仍尝试使用已有路由配置对象处理路由匹配策略`,\n );\n this.handleSimilarUrl(iframeUrl, routerPath);\n }\n this.getRoutersTimer && clearTimeout(this.getRoutersTimer);\n this.getRoutersTimer = null;\n }, 1000);\n }\n\n // 处理相似地址\n handleSimilarUrl(iframeUrl: string, routerPath?: string) {\n this.executePrompt(0, `开始执行深度匹配策略...`);\n\n let hasQuery = iframeUrl.split('?').length > 1;\n let urlQuery = '';\n // 判断是否携带参数\n if (hasQuery) urlQuery = '?' + iframeUrl.split('?')[1];\n\n // 1 如果传入了routerPath,将该值与子系统匹配,判断是否可以直接跳转\n if (routerPath && isRouteMatched(this.childRoutes, routerPath)) {\n this.sendRouteUpdate({\n fullPath: routerPath + urlQuery,\n });\n this.currentUrl = iframeUrl;\n return;\n }\n\n // 2 手动解析地址中的routePath,并考虑是否携带基础地址\n // 获取基础地址\n const baseRoute = getBaseRoute(this.childRoutes, this.currentUrl);\n this.executePrompt(0, `基础路由解析完成`, baseRoute);\n\n // 获取新链接的路由地址\n let urlObj = new URL(iframeUrl);\n let routePath = '';\n if (urlObj.hash && urlObj.hash.indexOf('#/') > -1) {\n routePath = urlObj.hash.split('#')[1];\n } else {\n routePath = urlObj.pathname + urlQuery;\n }\n this.executePrompt(0, `页面路由解析完成`, routePath);\n if (\n this.currentUrl.split(baseRoute)[0] === iframeUrl.split(baseRoute)[0] &&\n isRouteMatched(this.childRoutes, routePath.replace(baseRoute, ''))\n ) {\n this.executePrompt(0, `★ 匹配完成,判定为同一系统`);\n // 触发更新路由\n this.sendRouteUpdate({\n fullPath: routePath.replace(baseRoute, ''),\n });\n\n this.currentUrl = iframeUrl;\n return;\n }\n this.executePrompt(\n 1,\n `★ 匹配失败,判定为同协议、ip、端口部署的不同系统,准备重新初始化...`,\n );\n // 3 如果以上两种情况都不满足,则重新初始化\n this.currentUrl = iframeUrl;\n this.init();\n }\n\n /** 向子页面发送路由更新消息 */\n sendRouteUpdate(parsedUrl: any) {\n try {\n let flag = false;\n this.eventBus.route_update_result = (state: boolean) => {\n flag = state;\n if (flag) {\n this.executePrompt(0, '★ 分应用响应,变更成功', flag);\n } else {\n this.executePrompt(1, '★ 分应用响应,变更失败', flag);\n }\n this.loadFunction && this.loadFunction();\n };\n this.executePrompt(0, `开始推送路由更新...`, parsedUrl.fullPath);\n this.postmateParent.call('routeUpdate', JSON.stringify(parsedUrl));\n\n console.log(\n '---------------------- 【ParentPostmate】推送路由更新 ----------------------',\n );\n this.pushRouterTimer && clearTimeout(this.pushRouterTimer);\n this.pushRouterTimer = null;\n this.pushRouterTimer = setTimeout(() => {\n if (!flag) {\n this.executePrompt(1, `分应用响应超时/更新失败,准备创建新的独立连接`);\n console.warn('【ParentPostmate】推送路由更新失败,将重新初始化iframe');\n // 标记子页面不支持路由更新\n this.childSupportsRouteUpdate = false;\n // 如果发送消息失败,则重新初始化iframe\n this.init();\n }\n this.pushRouterTimer && clearTimeout(this.pushRouterTimer);\n this.pushRouterTimer = null;\n }, 1000);\n this.executePrompt(0, `推送完成,等待分应用响应...`, parsedUrl.fullPath);\n } catch (error) {\n this.executePrompt(1, `推送更新失败,准备创建新的独立连接`, error);\n console.warn('【ParentPostmate】发送路由更新消息失败,将重新初始化iframe:', error);\n // 标记子页面不支持路由更新\n this.childSupportsRouteUpdate = false;\n // 如果发送消息失败,则重新初始化iframe\n this.init();\n }\n }\n\n /** 向子页面发送消息 */\n sendData() {\n if (!this.postmateParent) return;\n this.executePrompt(0, '响应分系统请求,推送数据', JSON.stringify(this.dataInfo));\n this.postmateParent.call('baseData', JSON.stringify(this.dataInfo));\n }\n\n /** 销毁实例 */\n destroy() {\n this.clear();\n }\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","normalizeBase","base","trimmed","extractRelativePath","fullAddress","normalizedBase","pathname","normalizedPathname","relativePath","convertRoutePathToRegex","routePath","normalizedRoutePath","needEscapeChars","regexStr","_","__","regex","e","traverseRoutes","routers","targetRelativePath","parentPath","normalizedTarget","route","processedParentPath","processedRoutePath","fullRoutePath","isRouteMatched","checkPathInRoutes","routes","path","isRouteExists","router","getRouterPaths","purifyRoute","safeFields","child","areUrlsSameProtocolIpPort","url1","url2","parsedUrl1","parsedUrl2","sameProtocol","sameHost","samePort","error","getCircularReplacer","seen","getBaseRoute","baseRoute","urlObj","arr","nowRoute","ChildPostmate","eventObj","customRouteChange","that","routeInfoStr","routeInfo","parent","err","params","ParentPostmate","dataInfo","iframeEle","iframeUrl","handleOtherRequest","code","message","port","search","hash","fullPath","url1End","url2End","parsed1","parsed2","handshake","flag","loadFunction","getPrompt","routerPath","_a","hasQuery","urlQuery","parsedUrl","state"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../packages/postMeta/postMeta.js","../packages/postMeta/RouteMatching.ts","../packages/postMeta/tools.ts","../packages/postMeta/ChildPostmate.ts","../packages/postMeta/ParentPostmate.ts"],"sourcesContent":["const MESSAGE_TYPE = \"application/x-postmate-v1+json\";\nlet uid = 0;\n\nconst allowedPostmateTypes = {\n handshake: 1,\n \"handshake-reply\": 1,\n call: 1,\n emit: 1,\n reply: 1,\n request: 1,\n};\n\n// 校验消息是否来自合法的来源\nfunction isValidMessage(event, allowedOrigin) {\n return (\n (typeof allowedOrigin !== \"string\" || event.origin === allowedOrigin) &&\n !!event.data &&\n (typeof event.data !== \"object\" || \"postmate\" in event.data) &&\n event.data.type === MESSAGE_TYPE &&\n !!allowedPostmateTypes[event.data.postmate]\n );\n}\n\n// ----------------- ParentAPI -----------------\nclass ParentAPI {\n constructor(config) {\n this.parent = config.parent;\n this.frame = config.frame;\n this.child = config.child;\n this.childOrigin = config.childOrigin;\n this.events = {};\n\n this.listener = (event) => {\n if (!isValidMessage(event, this.childOrigin)) return;\n const { value = {} } = event.data;\n const { name, data } = value;\n if (event.data.postmate === \"emit\" && name in this.events) {\n this.events[name].call(this, data);\n }\n };\n\n this.parent.addEventListener(\"message\", this.listener, false);\n }\n\n get(property) {\n return new Postmate.Promise((resolve) => {\n const id = ++uid;\n const handler = (event) => {\n if (event.data.uid === id && event.data.postmate === \"reply\") {\n this.parent.removeEventListener(\"message\", handler, false);\n resolve(event.data.value);\n }\n };\n this.parent.addEventListener(\"message\", handler, false);\n this.child.postMessage(\n {\n postmate: \"request\",\n type: MESSAGE_TYPE,\n property,\n uid: id,\n },\n this.childOrigin\n );\n });\n }\n\n call(method, data) {\n this.child.postMessage(\n {\n postmate: \"call\",\n type: MESSAGE_TYPE,\n property: method,\n data,\n },\n this.childOrigin\n );\n }\n\n on(event, callback) {\n this.events[event] = callback;\n }\n\n destroy() {\n window.removeEventListener(\"message\", this.listener, false);\n this.frame.parentNode.removeChild(this.frame);\n }\n}\n\n// ----------------- ChildAPI -----------------\nclass ChildAPI {\n constructor(config) {\n this.model = config.model;\n this.parent = config.parent;\n this.parentOrigin = config.parentOrigin;\n this.child = config.child;\n\n this.child.addEventListener(\"message\", (event) => {\n if (!isValidMessage(event, this.parentOrigin)) return;\n\n const { postmate, property, uid, data } = event.data;\n const value = this.model[property];\n\n if (postmate !== \"call\") {\n const result = typeof value === \"function\" ? value() : value;\n Postmate.Promise.resolve(result).then((res) => {\n event.source.postMessage(\n {\n property,\n postmate: \"reply\",\n type: MESSAGE_TYPE,\n uid,\n value: res,\n },\n event.origin\n );\n });\n } else if (property in this.model && typeof value === \"function\") {\n value(data);\n }\n });\n }\n\n emit(eventName, data) {\n this.parent.postMessage(\n {\n postmate: \"emit\",\n type: MESSAGE_TYPE,\n value: { name: eventName, data },\n },\n this.parentOrigin\n );\n }\n}\n\n// ----------------- Postmate -----------------\nclass Postmate {\n constructor({ container = document.body, model, url, name, classListArray = [] }) {\n this.parent = window;\n this.frame = document.createElement(\"iframe\");\n this.frame.name = name || \"\";\n this.frame.classList.add(...classListArray);\n container.appendChild(this.frame);\n\n this.child = this.frame.contentWindow;\n this.model = model || {};\n\n return this.sendHandshake(url);\n }\n\n sendHandshake(url) {\n const origin = (() => {\n const link = document.createElement(\"a\");\n link.href = url;\n const protocol = link.protocol.length > 4 ? link.protocol : window.location.protocol;\n const host = link.host.length ? (link.port === \"80\" || link.port === \"443\" ? link.hostname : link.host) : window.location.host;\n return link.origin || `${protocol}//${host}`;\n })();\n\n let attemptCount = 0;\n let interval;\n\n return new Postmate.Promise((resolve, reject) => {\n const listener = (event) => {\n if (!isValidMessage(event, origin)) return false;\n if (event.data.postmate === \"handshake-reply\") {\n clearInterval(interval);\n this.parent.removeEventListener(\"message\", listener, false);\n this.childOrigin = event.origin;\n resolve(new ParentAPI(this));\n } else {\n reject(\"Failed handshake\");\n }\n };\n\n this.parent.addEventListener(\"message\", listener, false);\n\n const send = () => {\n attemptCount++;\n this.child.postMessage(\n {\n postmate: \"handshake\",\n type: MESSAGE_TYPE,\n model: this.model,\n },\n origin\n );\n if (attemptCount === 5) clearInterval(interval);\n };\n\n const init = () => {\n send();\n interval = setInterval(send, 500);\n };\n\n this.frame.onload = init;\n this.frame.attachEvent && this.frame.attachEvent(\"onload\", init);\n this.frame.src = url;\n });\n }\n}\n\n// ----------------- Model -----------------\nclass Model {\n constructor(model) {\n this.child = window;\n this.model = model;\n this.parent = window.parent;\n\n return this.sendHandshakeReply();\n }\n\n sendHandshakeReply() {\n return new Postmate.Promise((resolve, reject) => {\n this.child.addEventListener(\"message\", (event) => {\n if (event.data.postmate) {\n if (event.data.postmate !== \"handshake\") return reject(\"Handshake Reply Failed\");\n\n this.child.removeEventListener(\"message\", this, false);\n event.source.postMessage(\n {\n postmate: \"handshake-reply\",\n type: MESSAGE_TYPE,\n },\n event.origin\n );\n\n this.parentOrigin = event.origin;\n const parentModel = event.data.model;\n if (parentModel) {\n Object.keys(parentModel).forEach((key) => {\n this.model[key] = parentModel[key];\n });\n }\n resolve(new ChildAPI(this));\n }\n }, false);\n });\n }\n}\n\n// Attach defaults\nPostmate.debug = false;\nPostmate.Promise = (() => {\n try {\n return typeof window !== \"undefined\" ? window.Promise : Promise;\n } catch {\n return Promise;\n }\n})();\nPostmate.Model = Model;\n\nexport default Postmate;\nexport { Model };\n","import type { RouteRecordRaw } from 'vue-router';\r\n\r\n/**\r\n * 标准化基础路由(base):确保以 / 开头,不以 / 结尾(空字符串除外)\r\n */\r\nconst normalizeBase = (base: string): string => {\r\n if (!base || base === '/') return '';\r\n const trimmed = base.replace(/\\/$/, '');\r\n return trimmed.startsWith('/') ? trimmed : `/${trimmed}`;\r\n};\r\n\r\n/**\r\n * 从全量地址中提取「相对于base的路由路径」\r\n */\r\nconst extractRelativePath = (fullAddress: string, base = ''): string | null => {\r\n if (!fullAddress) return null;\r\n const normalizedBase = normalizeBase(base);\r\n let pathname = '';\r\n\r\n try {\r\n const url = new URL(fullAddress);\r\n pathname = url.pathname;\r\n } catch {\r\n pathname = fullAddress.split(/[?#]/)[0];\r\n }\r\n\r\n // 1. 去重斜杠 + 标准化路径\r\n const normalizedPathname = pathname.replace(/\\/+/g, '/').replace(/\\/$/, '') || '/';\r\n\r\n if (normalizedBase && !normalizedPathname.startsWith(normalizedBase)) {\r\n return null;\r\n }\r\n\r\n let relativePath = normalizedBase\r\n ? normalizedPathname.slice(normalizedBase.length)\r\n : normalizedPathname;\r\n\r\n // 确保相对路径以/开头,且无重复斜杠\r\n relativePath = relativePath.replace(/\\/+/g, '/');\r\n relativePath = relativePath.startsWith('/') ? relativePath : `/${relativePath}`;\r\n return relativePath === '' ? '/' : relativePath;\r\n};\r\n\r\n/**\r\n * 核心修复:路由路径转正则(解决无效转义+重复斜杠+动态参数)\r\n * 关键优化:\r\n * 1. 仅转义正则中「必须转义」的字符(移除-的转义,因为仅在[]内需要转义)\r\n * 2. 增加转义合法性校验,避免无效转义符\r\n */\r\nconst convertRoutePathToRegex = (routePath: string): RegExp => {\r\n if (!routePath) return /^$/iu;\r\n\r\n // 步骤1:标准化路由路径(去重斜杠 + 去除末尾斜杠)\r\n const normalizedRoutePath =\r\n routePath\r\n .replace(/\\/+/g, '/') // 去重所有重复斜杠(// → /)\r\n .replace(/\\/$/, '') || '/';\r\n\r\n // 步骤2:仅转义正则中「必须转义」的字符(核心修复:移除-)\r\n // 需转义的字符:. ? + ^ $ [ ] ( ) { } | \\(-不在此列,无需转义)\r\n const needEscapeChars = /([.?+^$[\\](){}|\\\\])/g;\r\n let regexStr = normalizedRoutePath.replace(needEscapeChars, '\\\\$1');\r\n\r\n // 步骤3:处理动态路由语法(不复用原有/,避免重复斜杠)\r\n regexStr = regexStr\r\n // 1. 通配符 :pathMatch(.*)* → 匹配任意多级路径\r\n .replace(/:pathMatch\\\\\\(\\.\\*\\\\\\)\\*/g, '.+')\r\n // 2. 带正则约束的参数(如 :id(\\\\d+) → 保留正则,还原转义)\r\n .replace(/:([a-zA-Z0-9_]+)\\\\\\(([^)]+)\\\\\\)/g, (_, __, regex) => regex.replace(/\\\\\\\\/g, '\\\\'))\r\n // 3. 可选动态参数(如 :id? → 匹配空或非/字符)\r\n .replace(/:([a-zA-Z0-9_]+)\\?/g, '[^/]*')\r\n // 4. 普通动态参数(仅匹配非/字符)\r\n .replace(/:([a-zA-Z0-9_]+)/g, '[^/]+');\r\n\r\n // 步骤4:最终标准化正则字符串(去重转义的/,避免\\\\/→\\/重复)\r\n regexStr = regexStr.replace(/\\\\\\/+/g, '\\\\/');\r\n\r\n // 步骤5:安全生成正则(捕获转义错误,降级返回空正则)\r\n try {\r\n return new RegExp(`^${regexStr}$`, 'iu');\r\n } catch (e) {\r\n console.warn('路由路径转正则失败', { routePath, regexStr, error: e });\r\n return /^$/iu;\r\n }\r\n};\r\n\r\n/**\r\n * 递归遍历路由(保留调试日志)\r\n */\r\nconst traverseRoutes = (\r\n routers: RouteRecordRaw[],\r\n targetRelativePath: string,\r\n parentPath = '',\r\n): boolean => {\r\n // 目标路径去重斜杠 + 标准化\r\n const normalizedTarget = targetRelativePath.replace(/\\/+/g, '/').replace(/\\/$/, '') || '/';\r\n\r\n for (const route of routers) {\r\n // 修复嵌套路由拼接逻辑(彻底避免重复斜杠)\r\n const processedParentPath = parentPath.replace(/\\/+/g, '/').replace(/\\/$/, '');\r\n const processedRoutePath = route.path.replace(/\\/+/g, '/').replace(/^\\//, '');\r\n const fullRoutePath = processedParentPath\r\n ? `${processedParentPath}/${processedRoutePath}`.replace(/\\/+/g, '/')\r\n : route.path.replace(/\\/+/g, '/');\r\n\r\n const routeRegex = convertRoutePathToRegex(fullRoutePath);\r\n const isMatched = routeRegex.test(normalizedTarget);\r\n\r\n if (isMatched) return true;\r\n\r\n if (route.children && route.children.length) {\r\n const childMatched = traverseRoutes(route.children, normalizedTarget, fullRoutePath);\r\n if (childMatched) return true;\r\n }\r\n }\r\n\r\n return false;\r\n};\r\n\r\n/**\r\n * 对外方法\r\n */\r\nexport const isRouteMatched = (\r\n routers: RouteRecordRaw[],\r\n fullAddress: string,\r\n base = '',\r\n): boolean => {\r\n if (!routers || !routers.length || !fullAddress) return false;\r\n const relativePath = extractRelativePath(fullAddress, base);\r\n if (!relativePath) return false;\r\n return traverseRoutes(routers, relativePath);\r\n};\r\n","import { isRouteMatched } from './RouteMatching';\n\n/**\n * 检查路径是否存在于路由配置中(递归检查所有层级)\n * @param routes 路由配置数组\n * @param path 需要检查的路径\n * @returns 是否存在\n */\nexport function checkPathInRoutes(routes: any[], path: string): boolean {\n\tfor (const route of routes) {\n\t\t// 检查当前路由\n\t\tif (route.path === path) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// 递归检查子路由\n\t\tif (route.children && Array.isArray(route.children) && route.children.length > 0) {\n\t\t\tif (checkPathInRoutes(route.children, path)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * 判断路径是否存在于vue-router对象中(兼容Vue2和Vue3)\n * @param router vue-router实例\n * @param path 需要检查的页面路径\n * @returns 路径是否存在\n */\nexport function isRouteExists(router: any, path: string): boolean {\n\t// 移除路径中的查询参数\n\tif (path.includes('?')) {\n\t\tpath = path.split('?')[0];\n\t}\n\tconst routes = getRouterPaths(router);\n\tif (!routes || routes.length === 0) return false;\n\treturn checkPathInRoutes(routes, path);\n}\n\n// 净化单个路由配置,只保留安全字段\nfunction purifyRoute(route) {\n\t// 只提取需要的基础字段,根据你的需求调整\n\tconst safeFields = {\n\t\tpath: route.path,\n\t\tname: route.name,\n\t\tmeta: route.meta || {}, // 确保meta是普通对象\n\t\tredirect: route.redirect,\n\t\t// 剔除 component、beforeEnter 等可能包含函数/对象引用的字段\n\t\t// 如果需要children,递归净化\n\t\tchildren: route.children ? route.children.map((child) => purifyRoute(child)) : [],\n\t};\n\n\t// 进一步净化meta(如果meta中可能有复杂对象)\n\tsafeFields.meta = JSON.parse(JSON.stringify(safeFields.meta));\n\n\treturn safeFields;\n}\n\n/**\n * 获取路由路径\n *\n */\nexport function getRouterPaths(router: any): any[] {\n\tlet routes: any[] = [];\n\t// 区分Vue Router 3.x (Vue2) 和 4.x (Vue3)\n\tif (typeof router.getRoutes === 'function') {\n\t\t// Vue Router 4.x (Vue3)\n\t\troutes = router.getRoutes();\n\t} else if (router.options && Array.isArray(router.options.routes)) {\n\t\t// Vue Router 3.x (Vue2)\n\t\troutes = router.options.routes;\n\t}\n\treturn routes.map((route) => purifyRoute(route)) || [];\n}\n\n/**\n * 比较两个URL的协议、IP(或域名)和端口是否完全相同\n * @param url1 第一个URL字符串\n * @param url2 第二个URL字符串\n * @returns 如果协议、IP(或域名)和端口都相同则返回true,否则返回false;解析失败时返回false\n */\nexport function areUrlsSameProtocolIpPort(url1: string, url2: string): boolean {\n\ttry {\n\t\t// 解析两个URL\n\t\tconst parsedUrl1 = new URL(url1);\n\t\tconst parsedUrl2 = new URL(url2);\n\n\t\t// 比较协议(不区分大小写,但通常URL协议是小写的)\n\t\tconst sameProtocol = parsedUrl1.protocol.toLowerCase() === parsedUrl2.protocol.toLowerCase();\n\n\t\t// 比较主机(IP或域名)\n\t\tconst sameHost = parsedUrl1.hostname === parsedUrl2.hostname;\n\n\t\t// 比较端口(如果未指定端口,会使用协议默认端口)\n\t\tconst samePort = parsedUrl1.port === parsedUrl2.port;\n\n\t\t// 只有所有部分都相同时才返回true\n\t\treturn sameProtocol && sameHost && samePort;\n\t} catch (error) {\n\t\t// 如果URL解析失败,返回false\n\t\tconsole.warn('URL解析错误:', error);\n\t\treturn false;\n\t}\n}\n\nexport const getCircularReplacer = () => {\n\tconst seen = new WeakSet();\n\treturn (key, value) => {\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tif (seen.has(value)) {\n\t\t\t\t// 遇到循环引用时,返回一个标识或忽略\n\t\t\t\treturn '[Circular Reference]';\n\t\t\t}\n\t\t\tseen.add(value);\n\t\t}\n\t\treturn value;\n\t};\n};\n\nexport function getBaseRoute(routers: any[], url: string): string {\n\tlet baseRoute = '';\n\tlet urlObj = new URL(url);\n\tlet noQueryUrl = url.split('?')[0];\n\n\t// 判断路由模式并取值\n\tlet routePath = '';\n\tif (urlObj.hash && urlObj.hash.indexOf('#/') > -1) {\n\t\troutePath = urlObj.hash.split('#')[1];\n\n\t} else {\n\t\troutePath = urlObj.pathname;\n\t}\n\t// 当前路由中没有该路由,判定有base\n\tif (!isRouteMatched(routers, routePath)) {\n\t\tthis.executePrompt(0, `集成系统可访问路由中不存在路径(${routePath}),尝试解析base路由`);\n\t\t// 尝试剔除第一个路由,再判断是否匹配\n\t\tlet arr = routePath.split('/');\n\t\tlet nowRoute = '/' + arr.slice(2, arr.length).join('/');\n\t\tconsole.log(routers, nowRoute);\n\t\t\n\t\tif (isRouteMatched(routers, nowRoute)) {\n\t\t\tbaseRoute = '/' + arr[1];\n\t\t\tthis.executePrompt(0, `成功解析base路由(${baseRoute})`);\n\t\t} else {\n\t\t\tthis.executePrompt(1, `未解析到base路由(${nowRoute})`);\n\t\t}\n\t}\n\treturn baseRoute;\n}\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\t[x: string]: any;\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\tstateOver: boolean = false;\n\n\t// Vue Router实例\n\trouter: any = null;\n\t// 路由更新回调函数\n\tcustomRouteChange: ((routeInfo: RouteUpdateInfo) => void) | undefined = undefined;\n\n\tconstructor(eventObj: EventObj, router: any, customRouteChange?: (routeInfo: RouteUpdateInfo) => void) {\n\t\t// 保存router实例\n\t\tthis.router = router;\n\t\t// 保存路由更新回调函数\n\t\tthis.customRouteChange = customRouteChange;\n\n\t\tif (window.top !== window.self) {\n\t\t\tthis.init(eventObj);\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (this.stateOver) return;\n\t\t\t\teventObj.error({ status: 500, data: null, message: '未在一体化平台中运行' });\n\t\t\t}, 500);\n\t\t} else {\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.customRouteChange) {\n\t\t\t\t\t\tthat.customRouteChange(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.warn('【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\tthis.stateOver = true;\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\tthis.stateOver = true;\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 customRouteChange 自定义路由更新回调函数\n\t */\n\tsetRouter(router: any, customRouteChange?: (routeInfo: RouteUpdateInfo) => void) {\n\t\tthis.router = router;\n\t\tif (customRouteChange) {\n\t\t\tthis.customRouteChange = customRouteChange;\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 { isRouteMatched } from './RouteMatching';\nimport { areUrlsSameProtocolIpPort, checkPathInRoutes, getBaseRoute } from './tools';\n\ninterface PromptInfo {\n //\n code: 0 | 1;\n message: string;\n data?: any;\n}\n\ninterface DataInfo {\n loginInfo: { [x: string]: any };\n token: string;\n isHideHeader: boolean;\n}\n\n// URL解析结果接口\ninterface ParsedUrl {\n protocol: string;\n host: string;\n port: string;\n pathname: string;\n search: string;\n hash: string;\n origin: string;\n fullPath: string;\n}\n\nexport default class ParentPostmate {\n /** 连接到的子 postmate 实例 */\n postmateParent: any = null;\n /** 通讯数据 */\n dataInfo: DataInfo = {\n loginInfo: {},\n token: '',\n isHideHeader: true,\n };\n /** iframe Dom 容器 */\n iframeEle: any = null;\n /** 当前 iframe url */\n currentUrl: string = '';\n /** 存储当前的 iframe 元素 */\n currentIframe: any = null;\n /** iframe 加载完成执行函数 */\n loadFunction: (() => void) | null = null;\n /** 处理子类的其他请求方法 */\n handleOtherRequest: ((params: any) => void) | null = null;\n /** 子页面是否支持路由更新 */\n childSupportsRouteUpdate: boolean = true;\n /** 子系统的路由列表 */\n childRoutes: any[] = [];\n /** 获取分系统路由列表的定时器对象 */\n getRoutersTimer: any = null;\n /** 推送路由更新的定时器对象的定时器对象 */\n pushRouterTimer: any = null;\n /** 集成过程提示暴露方法 */\n getPrompt: ((info: PromptInfo) => void) | null = null;\n\n eventBus: any = {\n getRoutes: null,\n route_update_result: null,\n };\n\n constructor(\n dataInfo: DataInfo,\n iframeEle: HTMLElement | (() => HTMLElement),\n iframeUrl: string = '',\n handleOtherRequest?: (params: any) => void,\n ) {\n this.dataInfo = dataInfo || this.dataInfo;\n this.iframeEle = iframeEle;\n this.setIframeUrl(iframeUrl);\n handleOtherRequest && (this.handleOtherRequest = handleOtherRequest);\n }\n\n executePrompt(code: 0 | 1, message: string, data?: any) {\n this.getPrompt && this.getPrompt({ code, message, data });\n }\n\n /** 解析URL */\n parseUrl(url: string): ParsedUrl {\n const link = document.createElement('a');\n link.href = url;\n\n // 获取协议\n const protocol = link.protocol.length > 4 ? link.protocol : window.location.protocol;\n\n // 获取主机和端口\n const host = link.hostname;\n const port =\n link.port || (protocol === 'https:' ? '443' : protocol === 'http:' ? '80' : '');\n\n // 获取路径、查询参数和哈希\n const pathname = link.pathname.startsWith('/') ? link.pathname : `/${link.pathname}`;\n const search = link.search;\n const hash = link.hash.slice(2, link.hash.length);\n\n // 构建origin\n const origin = link.origin || `${protocol}//${host}${port ? `:${port}` : ''}`;\n\n // 构建完整路径(不包含origin)\n const fullPath = `${pathname}${hash}`;\n\n return {\n protocol,\n host,\n port,\n pathname,\n search,\n hash,\n origin,\n fullPath,\n };\n }\n\n /** 比较两个URL是否相同*/\n compareUrlBase(url1: string, url2: string): boolean {\n const url1End = url1.endsWith('/');\n const url2End = url2.endsWith('/');\n if ((url1End && url2End) || (!url1End && !url2End)) {\n return url1 === url2;\n } else {\n if (url1End) url2 += '/';\n if (url2End) url1 += '/';\n return url1 === url2;\n }\n }\n\n /** 比较两个URL的路径是否相同(不包含查询参数和哈希) */\n compareUrlPath(url1: string, url2: string): boolean {\n if (!url1 || !url2) return false;\n\n const parsed1 = this.parseUrl(url1);\n const parsed2 = this.parseUrl(url2);\n\n return parsed1.pathname === parsed2.pathname;\n }\n\n /** 比较两个URL是否完全相同(包括查询参数和哈希) */\n compareUrlFull(url1: string, url2: string): boolean {\n if (!url1 || !url2) return false;\n\n const parsed1 = this.parseUrl(url1);\n const parsed2 = this.parseUrl(url2);\n\n return parsed1.fullPath === parsed2.fullPath;\n }\n\n /** 清除当前的 iframe 和 postmate 实例 */\n clear() {\n // 销毁 postmate 实例\n if (this.postmateParent) {\n this.postmateParent.destroy();\n this.postmateParent = null;\n }\n\n this.eventBus.getRoutes = null;\n this.eventBus.route_update_result = null;\n this.childRoutes = [];\n this.childSupportsRouteUpdate = false;\n\n // 移除 iframe\n if (this.currentIframe && this.currentIframe.parentNode) {\n this.currentIframe.parentNode.removeChild(this.currentIframe);\n }\n this.currentIframe = null;\n }\n\n /** 初始化 */\n async init(callback: any = null) {\n this.executePrompt(0, '★ 开始创建集成连接');\n\n // 清除之前的实例和 iframe\n this.clear();\n\n // 重置子页面路由更新支持标记\n this.childSupportsRouteUpdate = false;\n\n // 如果没有容器,或集成链接\n if (!this.iframeEle || !this.currentUrl) {\n this.executePrompt(1, '容器获取失败或集成链接为空');\n this.destroy();\n return;\n }\n\n // 获取 iframe 容器\n const container: any =\n typeof this.iframeEle === 'function' ? this.iframeEle() : this.iframeEle;\n if (!container) {\n this.executePrompt(1, '集成容器DOM获取失败');\n console.warn('【ParentPostmate】无法获取 iframe 容器');\n return;\n }\n\n // 创建 Postmate 实例(作为父)\n const handshake: any = new Postmate({\n container,\n url: this.currentUrl,\n name: '',\n model: '',\n });\n\n // 存储当前创建的 iframe\n this.currentIframe = container.querySelector('iframe');\n this.currentIframe.setAttribute('frameborder', '0');\n this.currentIframe.setAttribute('allow', 'fullscreen');\n this.currentIframe.addEventListener('load', () => {\n this.loadFunction && this.loadFunction();\n });\n\n handshake\n .then((parent: any) => {\n this.postmateParent = parent;\n\n // 监听子页面发来的获取数据请求\n parent.on('requestBaseData', () => {\n this.executePrompt(0, '接收到分系统的集成数据获取请求');\n\n // 发送相关数据\n this.sendData();\n });\n\n // 监听子页面发来的路由配置数据\n parent.on('pushRoutes', (routes: string) => {\n this.executePrompt(routes ? 0 : 1, '接收到分系统router配置数据', routes);\n\n if (routes) this.childRoutes = JSON.parse(routes);\n else this.childRoutes = [];\n this.eventBus.getRoutes && this.eventBus.getRoutes();\n });\n\n // 监听子页面的路由效验结果\n parent.on('routeExists', (flag: boolean) => {});\n\n // 监听子页面的动态路由变更支持\n parent.on('route_update_support', (flag: boolean) => {\n this.executePrompt(flag ? 0 : 1, '接收到分系统router配置状态', flag);\n\n this.childSupportsRouteUpdate = flag;\n });\n\n // 监听子页面的路由变更结果\n parent.on('route_update_result', (flag: boolean) => {\n this.eventBus.route_update_result && this.eventBus.route_update_result(flag);\n });\n\n // 监听子页面发来的其他请求\n parent.on('otherRequest', (params: any) => {\n this.handleOtherRequest && this.handleOtherRequest(params);\n });\n\n if (typeof callback === 'function') callback();\n\n this.executePrompt(0, '★ 集成连接成功');\n })\n .catch((error: any) => {\n console.warn('【ParentPostmate】Postmate 连接失败:', error);\n this.executePrompt(1, '★ 集成连接失败');\n });\n }\n\n /** 设置load执行事件 */\n setLoadFunction(loadFunction: () => void) {\n this.loadFunction = loadFunction;\n }\n\n /** 设置获取集成提示方法 */\n setGetPrompt(getPrompt: (info: PromptInfo) => void) {\n this.getPrompt = getPrompt;\n }\n\n /** 设置 iframe url */\n setIframeUrl(iframeUrl: string, routerPath: string = '') {\n this.executePrompt(\n 0,\n `-------★接收到集成地址★-------\n【${iframeUrl}】`,\n );\n\n // 如果完全一样:不操作\n if (iframeUrl === this.currentUrl) return;\n\n // 如果传入了路由,则对路径进行规范处理\n if (routerPath && !routerPath.startsWith('/')) {\n routerPath = '/' + routerPath;\n }\n\n if (routerPath && routerPath.endsWith('/')) {\n routerPath = routerPath.slice(0, -1);\n }\n\n // 1、传入的地址为空:销毁当前实例\n if (!iframeUrl) {\n this.currentUrl = '';\n this.destroy();\n this.executePrompt(0, '集成地址为空,销毁当前实例');\n console.warn('【ParentPostmate】无加载地址,无法初始化');\n return;\n }\n\n // 2、如果当前无连接:直接设置并初始化\n if (!this.postmateParent || !this.currentUrl) {\n this.currentUrl = iframeUrl;\n this.executePrompt(0, '当前无链接,准备初始化容器');\n if (this.iframeEle) {\n this.executePrompt(0, '容器获取成功,准备初始化');\n this.init();\n } else {\n this.executePrompt(1, '容器DOM为空,初始化失败');\n console.warn('【ParentPostmate】无 iframe 容器,无法初始化');\n }\n return;\n }\n\n this.executePrompt(0, '当前有已集成应用,开始同源策略判定...');\n // 3、如果当前系统不支持路由更新 或 新旧系统协议、ip、端口不同则重新初始化: 重新初始化\n if (\n !this.childSupportsRouteUpdate ||\n // !this.childRoutes?.length ||\n !areUrlsSameProtocolIpPort(this.currentUrl, iframeUrl)\n ) {\n this.executePrompt(\n 0,\n '同源策略检查完成,分系统不支持路由更新 或 协议、ip、端口不同,准备重新初始化',\n );\n this.currentUrl = iframeUrl;\n this.init();\n return;\n }\n\n /**\n * 因新旧地址的基础地址完全相同,且已加载系统支持路由更新\n * 下面处理新旧地址的url,研判操作方式\n **/\n this.executePrompt(\n 0,\n `同源策略检查完成,新应用地址与已集成应用协议、ip、端口相同,且当前系统支持路由更新`,\n );\n\n // 更新路由列表\n let flag = false;\n this.eventBus.getRoutes = () => {\n flag = true;\n this.executePrompt(0, `路由配置更新完成`);\n this.handleSimilarUrl(iframeUrl, routerPath);\n };\n this.executePrompt(0, `开始更新已集成应用路由配置对象...`);\n this.postmateParent.call('getRoutes');\n\n this.getRoutersTimer && clearTimeout(this.getRoutersTimer);\n this.getRoutersTimer = null;\n this.getRoutersTimer = setTimeout(() => {\n if (!flag) {\n this.executePrompt(\n 1,\n `★ 已加载系统路由配置获取失败,仍尝试使用已有路由配置对象处理路由匹配策略`,\n );\n this.handleSimilarUrl(iframeUrl, routerPath);\n }\n this.getRoutersTimer && clearTimeout(this.getRoutersTimer);\n this.getRoutersTimer = null;\n }, 1000);\n }\n\n // 处理相似地址\n handleSimilarUrl(iframeUrl: string, routerPath?: string) {\n this.executePrompt(0, `开始执行深度匹配策略...`);\n\n let hasQuery = iframeUrl.split('?').length > 1;\n let urlQuery = '';\n // 判断是否携带参数\n if (hasQuery) urlQuery = '?' + iframeUrl.split('?')[1];\n\n // 1 如果传入了routerPath,将该值与子系统匹配,判断是否可以直接跳转\n if (routerPath && isRouteMatched(this.childRoutes, routerPath)) {\n this.sendRouteUpdate({\n fullPath: routerPath + urlQuery,\n });\n this.currentUrl = iframeUrl;\n return;\n }\n\n // 2 手动解析地址中的routePath,并考虑是否携带基础地址\n // 获取基础地址\n const baseRoute = getBaseRoute(this.childRoutes, this.currentUrl);\n\n // 获取新链接的路由地址\n let urlObj = new URL(iframeUrl);\n let routePath = '';\n if (urlObj.hash && urlObj.hash.indexOf('#/') > -1) {\n routePath = urlObj.hash.split('#')[1];\n } else {\n routePath = urlObj.pathname + urlQuery;\n }\n this.executePrompt(0, `页面路由解析完成`, routePath);\n if (\n this.currentUrl.split(baseRoute)[0] === iframeUrl.split(baseRoute)[0] &&\n isRouteMatched(this.childRoutes, routePath.replace(baseRoute, ''))\n ) {\n this.executePrompt(0, `★ 匹配完成,判定为同一系统`);\n // 触发更新路由\n this.sendRouteUpdate({\n fullPath: routePath.replace(baseRoute, ''),\n });\n\n this.currentUrl = iframeUrl;\n return;\n }\n this.executePrompt(\n 1,\n `★ 匹配失败,判定为同协议、ip、端口部署的不同系统,准备重新初始化...`,\n );\n // 3 如果以上两种情况都不满足,则重新初始化\n this.currentUrl = iframeUrl;\n this.init();\n }\n\n /** 向子页面发送路由更新消息 */\n sendRouteUpdate(parsedUrl: any) {\n try {\n let flag = false;\n this.eventBus.route_update_result = (state: boolean) => {\n flag = state;\n if (flag) {\n this.executePrompt(0, '★ 分应用响应,变更成功', flag);\n } else {\n this.executePrompt(1, '★ 分应用响应,变更失败', flag);\n }\n this.loadFunction && this.loadFunction();\n };\n this.executePrompt(0, `开始推送路由更新...`, parsedUrl.fullPath);\n this.postmateParent.call('routeUpdate', JSON.stringify(parsedUrl));\n\n console.log(\n '---------------------- 【ParentPostmate】推送路由更新 ----------------------',\n );\n this.pushRouterTimer && clearTimeout(this.pushRouterTimer);\n this.pushRouterTimer = null;\n this.pushRouterTimer = setTimeout(() => {\n if (!flag) {\n this.executePrompt(1, `分应用响应超时/更新失败,准备创建新的独立连接`);\n console.warn('【ParentPostmate】推送路由更新失败,将重新初始化iframe');\n // 标记子页面不支持路由更新\n this.childSupportsRouteUpdate = false;\n // 如果发送消息失败,则重新初始化iframe\n this.init();\n }\n this.pushRouterTimer && clearTimeout(this.pushRouterTimer);\n this.pushRouterTimer = null;\n }, 1000);\n this.executePrompt(0, `推送完成,等待分应用响应...`, parsedUrl.fullPath);\n } catch (error) {\n this.executePrompt(1, `推送更新失败,准备创建新的独立连接`, error);\n console.warn('【ParentPostmate】发送路由更新消息失败,将重新初始化iframe:', error);\n // 标记子页面不支持路由更新\n this.childSupportsRouteUpdate = false;\n // 如果发送消息失败,则重新初始化iframe\n this.init();\n }\n }\n\n /** 向子页面发送消息 */\n sendData() {\n if (!this.postmateParent) return;\n this.executePrompt(0, '响应分系统请求,推送数据', JSON.stringify(this.dataInfo));\n this.postmateParent.call('baseData', JSON.stringify(this.dataInfo));\n }\n\n /** 销毁实例 */\n destroy() {\n this.clear();\n }\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","normalizeBase","base","trimmed","extractRelativePath","fullAddress","normalizedBase","pathname","normalizedPathname","relativePath","convertRoutePathToRegex","routePath","normalizedRoutePath","needEscapeChars","regexStr","_","__","regex","e","traverseRoutes","routers","targetRelativePath","parentPath","normalizedTarget","route","processedParentPath","processedRoutePath","fullRoutePath","isRouteMatched","checkPathInRoutes","routes","path","isRouteExists","router","getRouterPaths","purifyRoute","safeFields","child","areUrlsSameProtocolIpPort","url1","url2","parsedUrl1","parsedUrl2","sameProtocol","sameHost","samePort","error","getCircularReplacer","seen","getBaseRoute","baseRoute","urlObj","arr","nowRoute","ChildPostmate","eventObj","customRouteChange","that","routeInfoStr","routeInfo","parent","err","params","ParentPostmate","dataInfo","iframeEle","iframeUrl","handleOtherRequest","code","message","port","search","hash","fullPath","url1End","url2End","parsed1","parsed2","handshake","flag","loadFunction","getPrompt","routerPath","hasQuery","urlQuery","parsedUrl","state"],"mappings":"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"}
package/lib/index.umd.js CHANGED
@@ -1,3 +1,3 @@
1
- (function(c,h){typeof exports=="object"&&typeof module<"u"?h(exports):typeof define=="function"&&define.amd?define(["exports"],h):(c=typeof globalThis<"u"?globalThis:c||self,h(c["qlfy-postmate"]={}))})(this,function(c){"use strict";const h="application/x-postmate-v1+json";let w=0;const E={handshake:1,"handshake-reply":1,call:1,emit:1,reply:1,request:1};function f(a,e){return(typeof e!="string"||a.origin===e)&&!!a.data&&(typeof a.data!="object"||"postmate"in a.data)&&a.data.type===h&&!!E[a.data.postmate]}class U{constructor(e){this.parent=e.parent,this.frame=e.frame,this.child=e.child,this.childOrigin=e.childOrigin,this.events={},this.listener=t=>{if(!f(t,this.childOrigin))return;const{value:s={}}=t.data,{name:r,data:i}=s;t.data.postmate==="emit"&&r in this.events&&this.events[r].call(this,i)},this.parent.addEventListener("message",this.listener,!1)}get(e){return new l.Promise(t=>{const s=++w,r=i=>{i.data.uid===s&&i.data.postmate==="reply"&&(this.parent.removeEventListener("message",r,!1),t(i.data.value))};this.parent.addEventListener("message",r,!1),this.child.postMessage({postmate:"request",type:h,property:e,uid:s},this.childOrigin)})}call(e,t){this.child.postMessage({postmate:"call",type:h,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 O{constructor(e){this.model=e.model,this.parent=e.parent,this.parentOrigin=e.parentOrigin,this.child=e.child,this.child.addEventListener("message",t=>{if(!f(t,this.parentOrigin))return;const{postmate:s,property:r,uid:i,data:o}=t.data,n=this.model[r];if(s!=="call"){const u=typeof n=="function"?n():n;l.Promise.resolve(u).then(p=>{t.source.postMessage({property:r,postmate:"reply",type:h,uid:i,value:p},t.origin)})}else r in this.model&&typeof n=="function"&&n(o)})}emit(e,t){this.parent.postMessage({postmate:"emit",type:h,value:{name:e,data:t}},this.parentOrigin)}}class l{constructor({container:e=document.body,model:t,url:s,name:r,classListArray:i=[]}){return this.parent=window,this.frame=document.createElement("iframe"),this.frame.name=r||"",this.frame.classList.add(...i),e.appendChild(this.frame),this.child=this.frame.contentWindow,this.model=t||{},this.sendHandshake(s)}sendHandshake(e){const t=(()=>{const i=document.createElement("a");i.href=e;const o=i.protocol.length>4?i.protocol:window.location.protocol,n=i.host.length?i.port==="80"||i.port==="443"?i.hostname:i.host:window.location.host;return i.origin||`${o}//${n}`})();let s=0,r;return new l.Promise((i,o)=>{const n=m=>{if(!f(m,t))return!1;m.data.postmate==="handshake-reply"?(clearInterval(r),this.parent.removeEventListener("message",n,!1),this.childOrigin=m.origin,i(new U(this))):o("Failed handshake")};this.parent.addEventListener("message",n,!1);const u=()=>{s++,this.child.postMessage({postmate:"handshake",type:h,model:this.model},t),s===5&&clearInterval(r)},p=()=>{u(),r=setInterval(u,500)};this.frame.onload=p,this.frame.attachEvent&&this.frame.attachEvent("onload",p),this.frame.src=e})}}class _{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:h},s.origin),this.parentOrigin=s.origin;const r=s.data.model;r&&Object.keys(r).forEach(i=>{this.model[i]=r[i]}),e(new O(this))}},!1)})}}l.debug=!1,l.Promise=(()=>{try{return typeof window<"u"?window.Promise:Promise}catch{return Promise}})(),l.Model=_;const T=a=>{if(!a||a==="/")return"";const e=a.replace(/\/$/,"");return e.startsWith("/")?e:`/${e}`},v=(a,e="")=>{if(!a)return null;const t=T(e);let s="";try{s=new URL(a).pathname}catch{s=a.split(/[?#]/)[0]}const r=s.replace(/\/+/g,"/").replace(/\/$/,"")||"/";if(t&&!r.startsWith(t))return null;let i=t?r.slice(t.length):r;return i=i.replace(/\/+/g,"/"),i=i.startsWith("/")?i:`/${i}`,i===""?"/":i},S=a=>{if(!a)return/^$/iu;const e=a.replace(/\/+/g,"/").replace(/\/$/,"")||"/",t=/([.?+^$[\](){}|\\])/g;let s=e.replace(t,"\\$1");s=s.replace(/:pathMatch\\\(\.\*\\\)\*/g,".+").replace(/:([a-zA-Z0-9_]+)\\\(([^)]+)\\\)/g,(r,i,o)=>o.replace(/\\\\/g,"\\")).replace(/:([a-zA-Z0-9_]+)\?/g,"[^/]*").replace(/:([a-zA-Z0-9_]+)/g,"[^/]+"),s=s.replace(/\\\/+/g,"\\/");try{return new RegExp(`^${s}$`,"iu")}catch(r){return console.warn("路由路径转正则失败",{routePath:a,regexStr:s,error:r}),/^$/iu}},g=(a,e,t="")=>{const s=e.replace(/\/+/g,"/").replace(/\/$/,"")||"/";for(const r of a){const i=t.replace(/\/+/g,"/").replace(/\/$/,""),o=r.path.replace(/\/+/g,"/").replace(/^\//,""),n=i?`${i}/${o}`.replace(/\/+/g,"/"):r.path.replace(/\/+/g,"/");if(S(n).test(s)||r.children&&r.children.length&&g(r.children,s,n))return!0}return!1},d=(a,e,t="")=>{if(!a||!a.length||!e)return!1;const s=v(e,t);return s?g(a,s):!1};function R(a,e){for(const t of a)if(t.path===e||t.children&&Array.isArray(t.children)&&t.children.length>0&&R(t.children,e))return!0;return!1}function C(a,e){e.includes("?")&&(e=e.split("?")[0]);const t=P(a);return!t||t.length===0?!1:R(t,e)}function y(a){const e={path:a.path,name:a.name,meta:a.meta||{},redirect:a.redirect,children:a.children?a.children.map(t=>y(t)):[]};return e.meta=JSON.parse(JSON.stringify(e.meta)),e}function P(a){let e=[];return typeof a.getRoutes=="function"?e=a.getRoutes():a.options&&Array.isArray(a.options.routes)&&(e=a.options.routes),e.map(t=>y(t))||[]}function I(a,e){try{const t=new URL(a),s=new URL(e),r=t.protocol.toLowerCase()===s.protocol.toLowerCase(),i=t.hostname===s.hostname,o=t.port===s.port;return r&&i&&o}catch(t){return console.error("URL解析错误:",t),!1}}const x=()=>{const a=new WeakSet;return(e,t)=>{if(typeof t=="object"&&t!==null){if(a.has(t))return"[Circular Reference]";a.add(t)}return t}};function M(a,e){let t="",s=new URL(e);e.split("?")[0];let r="";if(s.hash&&s.hash.indexOf("#/")>-1?r=s.hash.split("#")[1]:r=s.pathname,console.log(r),!d(a,r)){let i=r.split("/"),o="/"+i.slice(2,i.length).join("/");console.log(a,o),d(a,o)?t="/"+i[1]:console.error("仅支持vue-router一级base配置")}return t}class ${constructor(e,t,s){this.childPostmate=null,this.parentPostmate=null,this.isGetData=!1,this.getDataCllBack=null,this.stateOver=!1,this.router=null,this.customRouteChange=void 0,this.router=t,this.customRouteChange=s,window.top!==window.self?(this.init(e),setTimeout(()=>{this.stateOver||e.error({status:500,data:null,message:"未在一体化平台中运行"})},500)):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,x()))}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.customRouteChange){t.customRouteChange(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=>{this.stateOver=!0,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),x()))}).catch(s=>{this.stateOver=!0,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.customRouteChange=t)}sendOtherRequest(e){this.parentPostmate&&this.parentPostmate.emit("otherRequest",e)}}class k{constructor(e,t,s="",r){this.postmateParent=null,this.dataInfo={loginInfo:{},token:"",isHideHeader:!0},this.iframeEle=null,this.currentUrl="",this.currentIframe=null,this.loadFunction=null,this.handleOtherRequest=null,this.childSupportsRouteUpdate=!0,this.childRoutes=[],this.getRoutersTimer=null,this.pushRouterTimer=null,this.getPrompt=null,this.eventBus={getRoutes:null,route_update_result:null},this.dataInfo=e||this.dataInfo,this.iframeEle=t,this.setIframeUrl(s),r&&(this.handleOtherRequest=r)}executePrompt(e,t,s){this.getPrompt&&this.getPrompt({code:e,message:t,data:s})}parseUrl(e){const t=document.createElement("a");t.href=e;const s=t.protocol.length>4?t.protocol:window.location.protocol,r=t.hostname,i=t.port||(s==="https:"?"443":s==="http:"?"80":""),o=t.pathname.startsWith("/")?t.pathname:`/${t.pathname}`,n=t.search,u=t.hash.slice(2,t.hash.length),p=t.origin||`${s}//${r}${i?`:${i}`:""}`,m=`${o}${u}`;return{protocol:s,host:r,port:i,pathname:o,search:n,hash:u,origin:p,fullPath:m}}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.eventBus.getRoutes=null,this.eventBus.route_update_result=null,this.childRoutes=[],this.childSupportsRouteUpdate=!1,this.currentIframe&&this.currentIframe.parentNode&&this.currentIframe.parentNode.removeChild(this.currentIframe),this.currentIframe=null}async init(e=null){if(this.executePrompt(0,"★ 开始创建集成连接"),this.clear(),this.childSupportsRouteUpdate=!1,!this.iframeEle||!this.currentUrl){this.executePrompt(1,"容器获取失败或集成链接为空"),this.destroy();return}const t=typeof this.iframeEle=="function"?this.iframeEle():this.iframeEle;if(!t){this.executePrompt(1,"集成容器DOM获取失败"),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.executePrompt(0,"接收到分系统的集成数据获取请求"),this.sendData()}),r.on("pushRoutes",i=>{console.error("【ParentPostmate】分系统路由连接数据:",i),this.executePrompt(i?0:1,"接收到分系统router配置数据",i),i?this.childRoutes=JSON.parse(i):this.childRoutes=[],this.eventBus.getRoutes&&this.eventBus.getRoutes()}),r.on("routeExists",i=>{}),r.on("route_update_support",i=>{console.error("【ParentPostmate】route_update_support连接:",i),this.executePrompt(i?0:1,"接收到分系统router配置状态",i),this.childSupportsRouteUpdate=i}),r.on("route_update_result",i=>{this.eventBus.route_update_result&&this.eventBus.route_update_result(i)}),r.on("otherRequest",i=>{this.handleOtherRequest&&this.handleOtherRequest(i)}),typeof e=="function"&&e(),this.executePrompt(0,"★ 集成连接成功")}).catch(r=>{console.error("【ParentPostmate】Postmate 连接失败:",r),this.executePrompt(1,"★ 集成连接失败")})}setLoadFunction(e){this.loadFunction=e}setGetPrompt(e){this.getPrompt=e}setIframeUrl(e,t=""){var r;if(this.executePrompt(0,`-------★接收到集成地址★-------
2
- 【${e}】`),e===this.currentUrl)return;if(t&&!t.startsWith("/")&&(t="/"+t),t&&t.endsWith("/")&&(t=t.slice(0,-1)),!e){this.currentUrl="",this.destroy(),this.executePrompt(0,"集成地址为空,销毁当前实例"),console.error("【ParentPostmate】无加载地址,无法初始化");return}if(!this.postmateParent||!this.currentUrl){this.currentUrl=e,this.executePrompt(0,"当前无链接,准备初始化容器"),this.iframeEle?(this.executePrompt(0,"容器获取成功,准备初始化"),this.init()):(this.executePrompt(1,"容器DOM为空,初始化失败"),console.error("【ParentPostmate】无 iframe 容器,无法初始化"));return}if(this.executePrompt(0,"当前有已集成应用,开始同源策略判定..."),!this.childSupportsRouteUpdate||!((r=this.childRoutes)!=null&&r.length)||!I(this.currentUrl,e)){this.executePrompt(0,"同源策略检查完成,分系统不支持路由更新 或 协议、ip、端口不同,准备重新初始化"),this.currentUrl=e,this.init();return}this.executePrompt(0,"同源策略检查完成,新应用地址与已集成应用协议、ip、端口相同,且当前系统支持路由更新");let s=!1;this.eventBus.getRoutes=()=>{s=!0,this.executePrompt(0,"路由配置更新完成"),this.handleSimilarUrl(e,t)},this.executePrompt(0,"开始更新已集成应用路由配置对象..."),this.postmateParent.call("getRoutes"),this.getRoutersTimer&&clearTimeout(this.getRoutersTimer),this.getRoutersTimer=null,this.getRoutersTimer=setTimeout(()=>{s||(this.executePrompt(1,"★ 已加载系统路由配置获取失败,仍尝试使用已有路由配置对象处理路由匹配策略"),this.handleSimilarUrl(e,t)),this.getRoutersTimer&&clearTimeout(this.getRoutersTimer),this.getRoutersTimer=null},1e3)}handleSimilarUrl(e,t){this.executePrompt(0,"开始执行深度匹配策略...");let s=e.split("?").length>1,r="";if(s&&(r="?"+e.split("?")[1]),t&&d(this.childRoutes,t)){this.sendRouteUpdate({fullPath:t+r}),this.currentUrl=e;return}const i=M(this.childRoutes,this.currentUrl);this.executePrompt(0,"基础路由解析完成",i);let o=new URL(e),n="";if(o.hash&&o.hash.indexOf("#/")>-1?n=o.hash.split("#")[1]:n=o.pathname+r,this.executePrompt(0,"页面路由解析完成",n),this.currentUrl.split(i)[0]===e.split(i)[0]&&d(this.childRoutes,n.replace(i,""))){this.executePrompt(0,"★ 匹配完成,判定为同一系统"),this.sendRouteUpdate({fullPath:n.replace(i,"")}),this.currentUrl=e;return}this.executePrompt(1,"★ 匹配失败,判定为同协议、ip、端口部署的不同系统,准备重新初始化..."),this.currentUrl=e,this.init()}sendRouteUpdate(e){try{let t=!1;this.eventBus.route_update_result=s=>{t=s,t?this.executePrompt(0,"★ 分应用响应,变更成功",t):this.executePrompt(1,"★ 分应用响应,变更失败",t),this.loadFunction&&this.loadFunction()},this.executePrompt(0,"开始推送路由更新...",e.fullPath),this.postmateParent.call("routeUpdate",JSON.stringify(e)),console.log("---------------------- 【ParentPostmate】推送路由更新 ----------------------"),this.pushRouterTimer&&clearTimeout(this.pushRouterTimer),this.pushRouterTimer=null,this.pushRouterTimer=setTimeout(()=>{t||(this.executePrompt(1,"分应用响应超时/更新失败,准备创建新的独立连接"),console.warn("【ParentPostmate】推送路由更新失败,将重新初始化iframe"),this.childSupportsRouteUpdate=!1,this.init()),this.pushRouterTimer&&clearTimeout(this.pushRouterTimer),this.pushRouterTimer=null},1e3),this.executePrompt(0,"推送完成,等待分应用响应...",e.fullPath)}catch(t){this.executePrompt(1,"推送更新失败,准备创建新的独立连接",t),console.warn("【ParentPostmate】发送路由更新消息失败,将重新初始化iframe:",t),this.childSupportsRouteUpdate=!1,this.init()}}sendData(){this.postmateParent&&(this.executePrompt(0,"响应分系统请求,推送数据",JSON.stringify(this.dataInfo)),this.postmateParent.call("baseData",JSON.stringify(this.dataInfo)))}destroy(){this.clear()}}c.ChildPostmate=$,c.ParentPostmate=k,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})});
1
+ (function(c,h){typeof exports=="object"&&typeof module<"u"?h(exports):typeof define=="function"&&define.amd?define(["exports"],h):(c=typeof globalThis<"u"?globalThis:c||self,h(c["qlfy-postmate"]={}))})(this,function(c){"use strict";const h="application/x-postmate-v1+json";let x=0;const E={handshake:1,"handshake-reply":1,call:1,emit:1,reply:1,request:1};function f(a,e){return(typeof e!="string"||a.origin===e)&&!!a.data&&(typeof a.data!="object"||"postmate"in a.data)&&a.data.type===h&&!!E[a.data.postmate]}class U{constructor(e){this.parent=e.parent,this.frame=e.frame,this.child=e.child,this.childOrigin=e.childOrigin,this.events={},this.listener=t=>{if(!f(t,this.childOrigin))return;const{value:s={}}=t.data,{name:r,data:i}=s;t.data.postmate==="emit"&&r in this.events&&this.events[r].call(this,i)},this.parent.addEventListener("message",this.listener,!1)}get(e){return new l.Promise(t=>{const s=++x,r=i=>{i.data.uid===s&&i.data.postmate==="reply"&&(this.parent.removeEventListener("message",r,!1),t(i.data.value))};this.parent.addEventListener("message",r,!1),this.child.postMessage({postmate:"request",type:h,property:e,uid:s},this.childOrigin)})}call(e,t){this.child.postMessage({postmate:"call",type:h,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 O{constructor(e){this.model=e.model,this.parent=e.parent,this.parentOrigin=e.parentOrigin,this.child=e.child,this.child.addEventListener("message",t=>{if(!f(t,this.parentOrigin))return;const{postmate:s,property:r,uid:i,data:o}=t.data,n=this.model[r];if(s!=="call"){const u=typeof n=="function"?n():n;l.Promise.resolve(u).then(p=>{t.source.postMessage({property:r,postmate:"reply",type:h,uid:i,value:p},t.origin)})}else r in this.model&&typeof n=="function"&&n(o)})}emit(e,t){this.parent.postMessage({postmate:"emit",type:h,value:{name:e,data:t}},this.parentOrigin)}}class l{constructor({container:e=document.body,model:t,url:s,name:r,classListArray:i=[]}){return this.parent=window,this.frame=document.createElement("iframe"),this.frame.name=r||"",this.frame.classList.add(...i),e.appendChild(this.frame),this.child=this.frame.contentWindow,this.model=t||{},this.sendHandshake(s)}sendHandshake(e){const t=(()=>{const i=document.createElement("a");i.href=e;const o=i.protocol.length>4?i.protocol:window.location.protocol,n=i.host.length?i.port==="80"||i.port==="443"?i.hostname:i.host:window.location.host;return i.origin||`${o}//${n}`})();let s=0,r;return new l.Promise((i,o)=>{const n=m=>{if(!f(m,t))return!1;m.data.postmate==="handshake-reply"?(clearInterval(r),this.parent.removeEventListener("message",n,!1),this.childOrigin=m.origin,i(new U(this))):o("Failed handshake")};this.parent.addEventListener("message",n,!1);const u=()=>{s++,this.child.postMessage({postmate:"handshake",type:h,model:this.model},t),s===5&&clearInterval(r)},p=()=>{u(),r=setInterval(u,500)};this.frame.onload=p,this.frame.attachEvent&&this.frame.attachEvent("onload",p),this.frame.src=e})}}class T{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:h},s.origin),this.parentOrigin=s.origin;const r=s.data.model;r&&Object.keys(r).forEach(i=>{this.model[i]=r[i]}),e(new O(this))}},!1)})}}l.debug=!1,l.Promise=(()=>{try{return typeof window<"u"?window.Promise:Promise}catch{return Promise}})(),l.Model=T;const _=a=>{if(!a||a==="/")return"";const e=a.replace(/\/$/,"");return e.startsWith("/")?e:`/${e}`},S=(a,e="")=>{if(!a)return null;const t=_(e);let s="";try{s=new URL(a).pathname}catch{s=a.split(/[?#]/)[0]}const r=s.replace(/\/+/g,"/").replace(/\/$/,"")||"/";if(t&&!r.startsWith(t))return null;let i=t?r.slice(t.length):r;return i=i.replace(/\/+/g,"/"),i=i.startsWith("/")?i:`/${i}`,i===""?"/":i},$=a=>{if(!a)return/^$/iu;const e=a.replace(/\/+/g,"/").replace(/\/$/,"")||"/",t=/([.?+^$[\](){}|\\])/g;let s=e.replace(t,"\\$1");s=s.replace(/:pathMatch\\\(\.\*\\\)\*/g,".+").replace(/:([a-zA-Z0-9_]+)\\\(([^)]+)\\\)/g,(r,i,o)=>o.replace(/\\\\/g,"\\")).replace(/:([a-zA-Z0-9_]+)\?/g,"[^/]*").replace(/:([a-zA-Z0-9_]+)/g,"[^/]+"),s=s.replace(/\\\/+/g,"\\/");try{return new RegExp(`^${s}$`,"iu")}catch(r){return console.warn("路由路径转正则失败",{routePath:a,regexStr:s,error:r}),/^$/iu}},g=(a,e,t="")=>{const s=e.replace(/\/+/g,"/").replace(/\/$/,"")||"/";for(const r of a){const i=t.replace(/\/+/g,"/").replace(/\/$/,""),o=r.path.replace(/\/+/g,"/").replace(/^\//,""),n=i?`${i}/${o}`.replace(/\/+/g,"/"):r.path.replace(/\/+/g,"/");if($(n).test(s)||r.children&&r.children.length&&g(r.children,s,n))return!0}return!1},d=(a,e,t="")=>{if(!a||!a.length||!e)return!1;const s=S(e,t);return s?g(a,s):!1};function R(a,e){for(const t of a)if(t.path===e||t.children&&Array.isArray(t.children)&&t.children.length>0&&R(t.children,e))return!0;return!1}function v(a,e){e.includes("?")&&(e=e.split("?")[0]);const t=P(a);return!t||t.length===0?!1:R(t,e)}function y(a){const e={path:a.path,name:a.name,meta:a.meta||{},redirect:a.redirect,children:a.children?a.children.map(t=>y(t)):[]};return e.meta=JSON.parse(JSON.stringify(e.meta)),e}function P(a){let e=[];return typeof a.getRoutes=="function"?e=a.getRoutes():a.options&&Array.isArray(a.options.routes)&&(e=a.options.routes),e.map(t=>y(t))||[]}function C(a,e){try{const t=new URL(a),s=new URL(e),r=t.protocol.toLowerCase()===s.protocol.toLowerCase(),i=t.hostname===s.hostname,o=t.port===s.port;return r&&i&&o}catch(t){return console.warn("URL解析错误:",t),!1}}const w=()=>{const a=new WeakSet;return(e,t)=>{if(typeof t=="object"&&t!==null){if(a.has(t))return"[Circular Reference]";a.add(t)}return t}};function I(a,e){let t="",s=new URL(e);e.split("?")[0];let r="";if(s.hash&&s.hash.indexOf("#/")>-1?r=s.hash.split("#")[1]:r=s.pathname,!d(a,r)){this.executePrompt(0,`集成系统可访问路由中不存在路径(${r}),尝试解析base路由`);let i=r.split("/"),o="/"+i.slice(2,i.length).join("/");console.log(a,o),d(a,o)?(t="/"+i[1],this.executePrompt(0,`成功解析base路由(${t})`)):this.executePrompt(1,`未解析到base路由(${o})`)}return t}class M{constructor(e,t,s){this.childPostmate=null,this.parentPostmate=null,this.isGetData=!1,this.getDataCllBack=null,this.stateOver=!1,this.router=null,this.customRouteChange=void 0,this.router=t,this.customRouteChange=s,window.top!==window.self?(this.init(e),setTimeout(()=>{this.stateOver||e.error({status:500,data:null,message:"未在一体化平台中运行"})},500)):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,w()))}else t.parentPostmate.emit("pushRoutes")},isRouteExists(s){t.router?t.parentPostmate.emit("routeExists",v(t.router,s)):t.parentPostmate.emit("routeExists",!1)},routeUpdate(s){try{const r=JSON.parse(s);if(t.customRouteChange){t.customRouteChange(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.warn("【ChildPastMate】路由更新失败:",r),t.parentPostmate.emit("route_update_result",!1)}}}).then(s=>{this.stateOver=!0,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),w()))}).catch(s=>{this.stateOver=!0,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.customRouteChange=t)}sendOtherRequest(e){this.parentPostmate&&this.parentPostmate.emit("otherRequest",e)}}class k{constructor(e,t,s="",r){this.postmateParent=null,this.dataInfo={loginInfo:{},token:"",isHideHeader:!0},this.iframeEle=null,this.currentUrl="",this.currentIframe=null,this.loadFunction=null,this.handleOtherRequest=null,this.childSupportsRouteUpdate=!0,this.childRoutes=[],this.getRoutersTimer=null,this.pushRouterTimer=null,this.getPrompt=null,this.eventBus={getRoutes:null,route_update_result:null},this.dataInfo=e||this.dataInfo,this.iframeEle=t,this.setIframeUrl(s),r&&(this.handleOtherRequest=r)}executePrompt(e,t,s){this.getPrompt&&this.getPrompt({code:e,message:t,data:s})}parseUrl(e){const t=document.createElement("a");t.href=e;const s=t.protocol.length>4?t.protocol:window.location.protocol,r=t.hostname,i=t.port||(s==="https:"?"443":s==="http:"?"80":""),o=t.pathname.startsWith("/")?t.pathname:`/${t.pathname}`,n=t.search,u=t.hash.slice(2,t.hash.length),p=t.origin||`${s}//${r}${i?`:${i}`:""}`,m=`${o}${u}`;return{protocol:s,host:r,port:i,pathname:o,search:n,hash:u,origin:p,fullPath:m}}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.eventBus.getRoutes=null,this.eventBus.route_update_result=null,this.childRoutes=[],this.childSupportsRouteUpdate=!1,this.currentIframe&&this.currentIframe.parentNode&&this.currentIframe.parentNode.removeChild(this.currentIframe),this.currentIframe=null}async init(e=null){if(this.executePrompt(0,"★ 开始创建集成连接"),this.clear(),this.childSupportsRouteUpdate=!1,!this.iframeEle||!this.currentUrl){this.executePrompt(1,"容器获取失败或集成链接为空"),this.destroy();return}const t=typeof this.iframeEle=="function"?this.iframeEle():this.iframeEle;if(!t){this.executePrompt(1,"集成容器DOM获取失败"),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.executePrompt(0,"接收到分系统的集成数据获取请求"),this.sendData()}),r.on("pushRoutes",i=>{this.executePrompt(i?0:1,"接收到分系统router配置数据",i),i?this.childRoutes=JSON.parse(i):this.childRoutes=[],this.eventBus.getRoutes&&this.eventBus.getRoutes()}),r.on("routeExists",i=>{}),r.on("route_update_support",i=>{this.executePrompt(i?0:1,"接收到分系统router配置状态",i),this.childSupportsRouteUpdate=i}),r.on("route_update_result",i=>{this.eventBus.route_update_result&&this.eventBus.route_update_result(i)}),r.on("otherRequest",i=>{this.handleOtherRequest&&this.handleOtherRequest(i)}),typeof e=="function"&&e(),this.executePrompt(0,"★ 集成连接成功")}).catch(r=>{console.warn("【ParentPostmate】Postmate 连接失败:",r),this.executePrompt(1,"★ 集成连接失败")})}setLoadFunction(e){this.loadFunction=e}setGetPrompt(e){this.getPrompt=e}setIframeUrl(e,t=""){if(this.executePrompt(0,`-------★接收到集成地址★-------
2
+ 【${e}】`),e===this.currentUrl)return;if(t&&!t.startsWith("/")&&(t="/"+t),t&&t.endsWith("/")&&(t=t.slice(0,-1)),!e){this.currentUrl="",this.destroy(),this.executePrompt(0,"集成地址为空,销毁当前实例"),console.warn("【ParentPostmate】无加载地址,无法初始化");return}if(!this.postmateParent||!this.currentUrl){this.currentUrl=e,this.executePrompt(0,"当前无链接,准备初始化容器"),this.iframeEle?(this.executePrompt(0,"容器获取成功,准备初始化"),this.init()):(this.executePrompt(1,"容器DOM为空,初始化失败"),console.warn("【ParentPostmate】无 iframe 容器,无法初始化"));return}if(this.executePrompt(0,"当前有已集成应用,开始同源策略判定..."),!this.childSupportsRouteUpdate||!C(this.currentUrl,e)){this.executePrompt(0,"同源策略检查完成,分系统不支持路由更新 或 协议、ip、端口不同,准备重新初始化"),this.currentUrl=e,this.init();return}this.executePrompt(0,"同源策略检查完成,新应用地址与已集成应用协议、ip、端口相同,且当前系统支持路由更新");let s=!1;this.eventBus.getRoutes=()=>{s=!0,this.executePrompt(0,"路由配置更新完成"),this.handleSimilarUrl(e,t)},this.executePrompt(0,"开始更新已集成应用路由配置对象..."),this.postmateParent.call("getRoutes"),this.getRoutersTimer&&clearTimeout(this.getRoutersTimer),this.getRoutersTimer=null,this.getRoutersTimer=setTimeout(()=>{s||(this.executePrompt(1,"★ 已加载系统路由配置获取失败,仍尝试使用已有路由配置对象处理路由匹配策略"),this.handleSimilarUrl(e,t)),this.getRoutersTimer&&clearTimeout(this.getRoutersTimer),this.getRoutersTimer=null},1e3)}handleSimilarUrl(e,t){this.executePrompt(0,"开始执行深度匹配策略...");let s=e.split("?").length>1,r="";if(s&&(r="?"+e.split("?")[1]),t&&d(this.childRoutes,t)){this.sendRouteUpdate({fullPath:t+r}),this.currentUrl=e;return}const i=I(this.childRoutes,this.currentUrl);let o=new URL(e),n="";if(o.hash&&o.hash.indexOf("#/")>-1?n=o.hash.split("#")[1]:n=o.pathname+r,this.executePrompt(0,"页面路由解析完成",n),this.currentUrl.split(i)[0]===e.split(i)[0]&&d(this.childRoutes,n.replace(i,""))){this.executePrompt(0,"★ 匹配完成,判定为同一系统"),this.sendRouteUpdate({fullPath:n.replace(i,"")}),this.currentUrl=e;return}this.executePrompt(1,"★ 匹配失败,判定为同协议、ip、端口部署的不同系统,准备重新初始化..."),this.currentUrl=e,this.init()}sendRouteUpdate(e){try{let t=!1;this.eventBus.route_update_result=s=>{t=s,t?this.executePrompt(0,"★ 分应用响应,变更成功",t):this.executePrompt(1,"★ 分应用响应,变更失败",t),this.loadFunction&&this.loadFunction()},this.executePrompt(0,"开始推送路由更新...",e.fullPath),this.postmateParent.call("routeUpdate",JSON.stringify(e)),console.log("---------------------- 【ParentPostmate】推送路由更新 ----------------------"),this.pushRouterTimer&&clearTimeout(this.pushRouterTimer),this.pushRouterTimer=null,this.pushRouterTimer=setTimeout(()=>{t||(this.executePrompt(1,"分应用响应超时/更新失败,准备创建新的独立连接"),console.warn("【ParentPostmate】推送路由更新失败,将重新初始化iframe"),this.childSupportsRouteUpdate=!1,this.init()),this.pushRouterTimer&&clearTimeout(this.pushRouterTimer),this.pushRouterTimer=null},1e3),this.executePrompt(0,"推送完成,等待分应用响应...",e.fullPath)}catch(t){this.executePrompt(1,"推送更新失败,准备创建新的独立连接",t),console.warn("【ParentPostmate】发送路由更新消息失败,将重新初始化iframe:",t),this.childSupportsRouteUpdate=!1,this.init()}}sendData(){this.postmateParent&&(this.executePrompt(0,"响应分系统请求,推送数据",JSON.stringify(this.dataInfo)),this.postmateParent.call("baseData",JSON.stringify(this.dataInfo)))}destroy(){this.clear()}}c.ChildPostmate=M,c.ParentPostmate=k,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})});
3
3
  //# sourceMappingURL=index.umd.js.map
Binary file
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../packages/postMeta/postMeta.js","../packages/postMeta/RouteMatching.ts","../packages/postMeta/tools.ts","../packages/postMeta/ChildPostmate.ts","../packages/postMeta/ParentPostmate.ts"],"sourcesContent":["const MESSAGE_TYPE = \"application/x-postmate-v1+json\";\nlet uid = 0;\n\nconst allowedPostmateTypes = {\n handshake: 1,\n \"handshake-reply\": 1,\n call: 1,\n emit: 1,\n reply: 1,\n request: 1,\n};\n\n// 校验消息是否来自合法的来源\nfunction isValidMessage(event, allowedOrigin) {\n return (\n (typeof allowedOrigin !== \"string\" || event.origin === allowedOrigin) &&\n !!event.data &&\n (typeof event.data !== \"object\" || \"postmate\" in event.data) &&\n event.data.type === MESSAGE_TYPE &&\n !!allowedPostmateTypes[event.data.postmate]\n );\n}\n\n// ----------------- ParentAPI -----------------\nclass ParentAPI {\n constructor(config) {\n this.parent = config.parent;\n this.frame = config.frame;\n this.child = config.child;\n this.childOrigin = config.childOrigin;\n this.events = {};\n\n this.listener = (event) => {\n if (!isValidMessage(event, this.childOrigin)) return;\n const { value = {} } = event.data;\n const { name, data } = value;\n if (event.data.postmate === \"emit\" && name in this.events) {\n this.events[name].call(this, data);\n }\n };\n\n this.parent.addEventListener(\"message\", this.listener, false);\n }\n\n get(property) {\n return new Postmate.Promise((resolve) => {\n const id = ++uid;\n const handler = (event) => {\n if (event.data.uid === id && event.data.postmate === \"reply\") {\n this.parent.removeEventListener(\"message\", handler, false);\n resolve(event.data.value);\n }\n };\n this.parent.addEventListener(\"message\", handler, false);\n this.child.postMessage(\n {\n postmate: \"request\",\n type: MESSAGE_TYPE,\n property,\n uid: id,\n },\n this.childOrigin\n );\n });\n }\n\n call(method, data) {\n this.child.postMessage(\n {\n postmate: \"call\",\n type: MESSAGE_TYPE,\n property: method,\n data,\n },\n this.childOrigin\n );\n }\n\n on(event, callback) {\n this.events[event] = callback;\n }\n\n destroy() {\n window.removeEventListener(\"message\", this.listener, false);\n this.frame.parentNode.removeChild(this.frame);\n }\n}\n\n// ----------------- ChildAPI -----------------\nclass ChildAPI {\n constructor(config) {\n this.model = config.model;\n this.parent = config.parent;\n this.parentOrigin = config.parentOrigin;\n this.child = config.child;\n\n this.child.addEventListener(\"message\", (event) => {\n if (!isValidMessage(event, this.parentOrigin)) return;\n\n const { postmate, property, uid, data } = event.data;\n const value = this.model[property];\n\n if (postmate !== \"call\") {\n const result = typeof value === \"function\" ? value() : value;\n Postmate.Promise.resolve(result).then((res) => {\n event.source.postMessage(\n {\n property,\n postmate: \"reply\",\n type: MESSAGE_TYPE,\n uid,\n value: res,\n },\n event.origin\n );\n });\n } else if (property in this.model && typeof value === \"function\") {\n value(data);\n }\n });\n }\n\n emit(eventName, data) {\n this.parent.postMessage(\n {\n postmate: \"emit\",\n type: MESSAGE_TYPE,\n value: { name: eventName, data },\n },\n this.parentOrigin\n );\n }\n}\n\n// ----------------- Postmate -----------------\nclass Postmate {\n constructor({ container = document.body, model, url, name, classListArray = [] }) {\n this.parent = window;\n this.frame = document.createElement(\"iframe\");\n this.frame.name = name || \"\";\n this.frame.classList.add(...classListArray);\n container.appendChild(this.frame);\n\n this.child = this.frame.contentWindow;\n this.model = model || {};\n\n return this.sendHandshake(url);\n }\n\n sendHandshake(url) {\n const origin = (() => {\n const link = document.createElement(\"a\");\n link.href = url;\n const protocol = link.protocol.length > 4 ? link.protocol : window.location.protocol;\n const host = link.host.length ? (link.port === \"80\" || link.port === \"443\" ? link.hostname : link.host) : window.location.host;\n return link.origin || `${protocol}//${host}`;\n })();\n\n let attemptCount = 0;\n let interval;\n\n return new Postmate.Promise((resolve, reject) => {\n const listener = (event) => {\n if (!isValidMessage(event, origin)) return false;\n if (event.data.postmate === \"handshake-reply\") {\n clearInterval(interval);\n this.parent.removeEventListener(\"message\", listener, false);\n this.childOrigin = event.origin;\n resolve(new ParentAPI(this));\n } else {\n reject(\"Failed handshake\");\n }\n };\n\n this.parent.addEventListener(\"message\", listener, false);\n\n const send = () => {\n attemptCount++;\n this.child.postMessage(\n {\n postmate: \"handshake\",\n type: MESSAGE_TYPE,\n model: this.model,\n },\n origin\n );\n if (attemptCount === 5) clearInterval(interval);\n };\n\n const init = () => {\n send();\n interval = setInterval(send, 500);\n };\n\n this.frame.onload = init;\n this.frame.attachEvent && this.frame.attachEvent(\"onload\", init);\n this.frame.src = url;\n });\n }\n}\n\n// ----------------- Model -----------------\nclass Model {\n constructor(model) {\n this.child = window;\n this.model = model;\n this.parent = window.parent;\n\n return this.sendHandshakeReply();\n }\n\n sendHandshakeReply() {\n return new Postmate.Promise((resolve, reject) => {\n this.child.addEventListener(\"message\", (event) => {\n if (event.data.postmate) {\n if (event.data.postmate !== \"handshake\") return reject(\"Handshake Reply Failed\");\n\n this.child.removeEventListener(\"message\", this, false);\n event.source.postMessage(\n {\n postmate: \"handshake-reply\",\n type: MESSAGE_TYPE,\n },\n event.origin\n );\n\n this.parentOrigin = event.origin;\n const parentModel = event.data.model;\n if (parentModel) {\n Object.keys(parentModel).forEach((key) => {\n this.model[key] = parentModel[key];\n });\n }\n resolve(new ChildAPI(this));\n }\n }, false);\n });\n }\n}\n\n// Attach defaults\nPostmate.debug = false;\nPostmate.Promise = (() => {\n try {\n return typeof window !== \"undefined\" ? window.Promise : Promise;\n } catch {\n return Promise;\n }\n})();\nPostmate.Model = Model;\n\nexport default Postmate;\nexport { Model };\n","import type { RouteRecordRaw } from 'vue-router';\r\n\r\n/**\r\n * 标准化基础路由(base):确保以 / 开头,不以 / 结尾(空字符串除外)\r\n */\r\nconst normalizeBase = (base: string): string => {\r\n if (!base || base === '/') return '';\r\n const trimmed = base.replace(/\\/$/, '');\r\n return trimmed.startsWith('/') ? trimmed : `/${trimmed}`;\r\n};\r\n\r\n/**\r\n * 从全量地址中提取「相对于base的路由路径」\r\n */\r\nconst extractRelativePath = (fullAddress: string, base = ''): string | null => {\r\n if (!fullAddress) return null;\r\n const normalizedBase = normalizeBase(base);\r\n let pathname = '';\r\n\r\n try {\r\n const url = new URL(fullAddress);\r\n pathname = url.pathname;\r\n } catch {\r\n pathname = fullAddress.split(/[?#]/)[0];\r\n }\r\n\r\n // 1. 去重斜杠 + 标准化路径\r\n const normalizedPathname = pathname.replace(/\\/+/g, '/').replace(/\\/$/, '') || '/';\r\n\r\n if (normalizedBase && !normalizedPathname.startsWith(normalizedBase)) {\r\n return null;\r\n }\r\n\r\n let relativePath = normalizedBase\r\n ? normalizedPathname.slice(normalizedBase.length)\r\n : normalizedPathname;\r\n\r\n // 确保相对路径以/开头,且无重复斜杠\r\n relativePath = relativePath.replace(/\\/+/g, '/');\r\n relativePath = relativePath.startsWith('/') ? relativePath : `/${relativePath}`;\r\n return relativePath === '' ? '/' : relativePath;\r\n};\r\n\r\n/**\r\n * 核心修复:路由路径转正则(解决无效转义+重复斜杠+动态参数)\r\n * 关键优化:\r\n * 1. 仅转义正则中「必须转义」的字符(移除-的转义,因为仅在[]内需要转义)\r\n * 2. 增加转义合法性校验,避免无效转义符\r\n */\r\nconst convertRoutePathToRegex = (routePath: string): RegExp => {\r\n if (!routePath) return /^$/iu;\r\n\r\n // 步骤1:标准化路由路径(去重斜杠 + 去除末尾斜杠)\r\n const normalizedRoutePath =\r\n routePath\r\n .replace(/\\/+/g, '/') // 去重所有重复斜杠(// → /)\r\n .replace(/\\/$/, '') || '/';\r\n\r\n // 步骤2:仅转义正则中「必须转义」的字符(核心修复:移除-)\r\n // 需转义的字符:. ? + ^ $ [ ] ( ) { } | \\(-不在此列,无需转义)\r\n const needEscapeChars = /([.?+^$[\\](){}|\\\\])/g;\r\n let regexStr = normalizedRoutePath.replace(needEscapeChars, '\\\\$1');\r\n\r\n // 步骤3:处理动态路由语法(不复用原有/,避免重复斜杠)\r\n regexStr = regexStr\r\n // 1. 通配符 :pathMatch(.*)* → 匹配任意多级路径\r\n .replace(/:pathMatch\\\\\\(\\.\\*\\\\\\)\\*/g, '.+')\r\n // 2. 带正则约束的参数(如 :id(\\\\d+) → 保留正则,还原转义)\r\n .replace(/:([a-zA-Z0-9_]+)\\\\\\(([^)]+)\\\\\\)/g, (_, __, regex) => regex.replace(/\\\\\\\\/g, '\\\\'))\r\n // 3. 可选动态参数(如 :id? → 匹配空或非/字符)\r\n .replace(/:([a-zA-Z0-9_]+)\\?/g, '[^/]*')\r\n // 4. 普通动态参数(仅匹配非/字符)\r\n .replace(/:([a-zA-Z0-9_]+)/g, '[^/]+');\r\n\r\n // 步骤4:最终标准化正则字符串(去重转义的/,避免\\\\/→\\/重复)\r\n regexStr = regexStr.replace(/\\\\\\/+/g, '\\\\/');\r\n\r\n // 步骤5:安全生成正则(捕获转义错误,降级返回空正则)\r\n try {\r\n return new RegExp(`^${regexStr}$`, 'iu');\r\n } catch (e) {\r\n console.warn('路由路径转正则失败', { routePath, regexStr, error: e });\r\n return /^$/iu;\r\n }\r\n};\r\n\r\n/**\r\n * 递归遍历路由(保留调试日志)\r\n */\r\nconst traverseRoutes = (\r\n routers: RouteRecordRaw[],\r\n targetRelativePath: string,\r\n parentPath = '',\r\n): boolean => {\r\n // 目标路径去重斜杠 + 标准化\r\n const normalizedTarget = targetRelativePath.replace(/\\/+/g, '/').replace(/\\/$/, '') || '/';\r\n\r\n for (const route of routers) {\r\n // 修复嵌套路由拼接逻辑(彻底避免重复斜杠)\r\n const processedParentPath = parentPath.replace(/\\/+/g, '/').replace(/\\/$/, '');\r\n const processedRoutePath = route.path.replace(/\\/+/g, '/').replace(/^\\//, '');\r\n const fullRoutePath = processedParentPath\r\n ? `${processedParentPath}/${processedRoutePath}`.replace(/\\/+/g, '/')\r\n : route.path.replace(/\\/+/g, '/');\r\n\r\n const routeRegex = convertRoutePathToRegex(fullRoutePath);\r\n const isMatched = routeRegex.test(normalizedTarget);\r\n\r\n if (isMatched) return true;\r\n\r\n if (route.children && route.children.length) {\r\n const childMatched = traverseRoutes(route.children, normalizedTarget, fullRoutePath);\r\n if (childMatched) return true;\r\n }\r\n }\r\n\r\n return false;\r\n};\r\n\r\n/**\r\n * 对外方法\r\n */\r\nexport const isRouteMatched = (\r\n routers: RouteRecordRaw[],\r\n fullAddress: string,\r\n base = '',\r\n): boolean => {\r\n if (!routers || !routers.length || !fullAddress) return false;\r\n const relativePath = extractRelativePath(fullAddress, base);\r\n if (!relativePath) return false;\r\n return traverseRoutes(routers, relativePath);\r\n};\r\n","import { isRouteMatched } from './RouteMatching';\n\n/**\n * 检查路径是否存在于路由配置中(递归检查所有层级)\n * @param routes 路由配置数组\n * @param path 需要检查的路径\n * @returns 是否存在\n */\nexport function checkPathInRoutes(routes: any[], path: string): boolean {\n\tfor (const route of routes) {\n\t\t// 检查当前路由\n\t\tif (route.path === path) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// 递归检查子路由\n\t\tif (route.children && Array.isArray(route.children) && route.children.length > 0) {\n\t\t\tif (checkPathInRoutes(route.children, path)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * 判断路径是否存在于vue-router对象中(兼容Vue2和Vue3)\n * @param router vue-router实例\n * @param path 需要检查的页面路径\n * @returns 路径是否存在\n */\nexport function isRouteExists(router: any, path: string): boolean {\n\t// 移除路径中的查询参数\n\tif (path.includes('?')) {\n\t\tpath = path.split('?')[0];\n\t}\n\tconst routes = getRouterPaths(router);\n\tif (!routes || routes.length === 0) return false;\n\treturn checkPathInRoutes(routes, path);\n}\n\n// 净化单个路由配置,只保留安全字段\nfunction purifyRoute(route) {\n\t// 只提取需要的基础字段,根据你的需求调整\n\tconst safeFields = {\n\t\tpath: route.path,\n\t\tname: route.name,\n\t\tmeta: route.meta || {}, // 确保meta是普通对象\n\t\tredirect: route.redirect,\n\t\t// 剔除 component、beforeEnter 等可能包含函数/对象引用的字段\n\t\t// 如果需要children,递归净化\n\t\tchildren: route.children ? route.children.map((child) => purifyRoute(child)) : [],\n\t};\n\n\t// 进一步净化meta(如果meta中可能有复杂对象)\n\tsafeFields.meta = JSON.parse(JSON.stringify(safeFields.meta));\n\n\treturn safeFields;\n}\n\n/**\n * 获取路由路径\n *\n */\nexport function getRouterPaths(router: any): any[] {\n\tlet routes: any[] = [];\n\t// 区分Vue Router 3.x (Vue2) 和 4.x (Vue3)\n\tif (typeof router.getRoutes === 'function') {\n\t\t// Vue Router 4.x (Vue3)\n\t\troutes = router.getRoutes();\n\t} else if (router.options && Array.isArray(router.options.routes)) {\n\t\t// Vue Router 3.x (Vue2)\n\t\troutes = router.options.routes;\n\t}\n\treturn routes.map((route) => purifyRoute(route)) || [];\n}\n\n/**\n * 比较两个URL的协议、IP(或域名)和端口是否完全相同\n * @param url1 第一个URL字符串\n * @param url2 第二个URL字符串\n * @returns 如果协议、IP(或域名)和端口都相同则返回true,否则返回false;解析失败时返回false\n */\nexport function areUrlsSameProtocolIpPort(url1: string, url2: string): boolean {\n\ttry {\n\t\t// 解析两个URL\n\t\tconst parsedUrl1 = new URL(url1);\n\t\tconst parsedUrl2 = new URL(url2);\n\n\t\t// 比较协议(不区分大小写,但通常URL协议是小写的)\n\t\tconst sameProtocol = parsedUrl1.protocol.toLowerCase() === parsedUrl2.protocol.toLowerCase();\n\n\t\t// 比较主机(IP或域名)\n\t\tconst sameHost = parsedUrl1.hostname === parsedUrl2.hostname;\n\n\t\t// 比较端口(如果未指定端口,会使用协议默认端口)\n\t\tconst samePort = parsedUrl1.port === parsedUrl2.port;\n\n\t\t// 只有所有部分都相同时才返回true\n\t\treturn sameProtocol && sameHost && samePort;\n\t} catch (error) {\n\t\t// 如果URL解析失败,返回false\n\t\tconsole.error('URL解析错误:', error);\n\t\treturn false;\n\t}\n}\n\nexport const getCircularReplacer = () => {\n\tconst seen = new WeakSet();\n\treturn (key, value) => {\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tif (seen.has(value)) {\n\t\t\t\t// 遇到循环引用时,返回一个标识或忽略\n\t\t\t\treturn '[Circular Reference]';\n\t\t\t}\n\t\t\tseen.add(value);\n\t\t}\n\t\treturn value;\n\t};\n};\n\nexport function getBaseRoute(routers: any[], url: string): string {\n\tlet baseRoute = '';\n\tlet urlObj = new URL(url);\n\tlet noQueryUrl = url.split('?')[0];\n\n\t// 判断路由模式并取值\n\tlet routePath = '';\n\tif (urlObj.hash && urlObj.hash.indexOf('#/') > -1) {\n\t\troutePath = urlObj.hash.split('#')[1];\n\n\t} else {\n\t\troutePath = urlObj.pathname;\n\t}\n\n\tconsole.log(routePath);\n\t\n\t// 当前路由中没有该路由,判定有base\n\tif (!isRouteMatched(routers, routePath)) {\n\t\t// 尝试剔除第一个路由,再判断是否匹配\n\t\tlet arr = routePath.split('/');\n\t\tlet nowRoute = '/' + arr.slice(2, arr.length).join('/');\n\t\tconsole.log(routers, nowRoute);\n\t\t\n\t\tif (isRouteMatched(routers, nowRoute)) {\n\t\t\tbaseRoute = '/' + arr[1];\n\t\t} else {\n\t\t\tconsole.error('仅支持vue-router一级base配置');\n\t\t}\n\t}\n\treturn baseRoute;\n}\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\t[x: string]: any;\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\tstateOver: boolean = false;\n\n\t// Vue Router实例\n\trouter: any = null;\n\t// 路由更新回调函数\n\tcustomRouteChange: ((routeInfo: RouteUpdateInfo) => void) | undefined = undefined;\n\n\tconstructor(eventObj: EventObj, router: any, customRouteChange?: (routeInfo: RouteUpdateInfo) => void) {\n\t\t// 保存router实例\n\t\tthis.router = router;\n\t\t// 保存路由更新回调函数\n\t\tthis.customRouteChange = customRouteChange;\n\n\t\tif (window.top !== window.self) {\n\t\t\tthis.init(eventObj);\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (this.stateOver) return;\n\t\t\t\teventObj.error({ status: 500, data: null, message: '未在一体化平台中运行' });\n\t\t\t}, 500);\n\t\t} else {\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.customRouteChange) {\n\t\t\t\t\t\tthat.customRouteChange(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\tthis.stateOver = true;\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\tthis.stateOver = true;\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 customRouteChange 自定义路由更新回调函数\n\t */\n\tsetRouter(router: any, customRouteChange?: (routeInfo: RouteUpdateInfo) => void) {\n\t\tthis.router = router;\n\t\tif (customRouteChange) {\n\t\t\tthis.customRouteChange = customRouteChange;\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 { isRouteMatched } from './RouteMatching';\nimport { areUrlsSameProtocolIpPort, checkPathInRoutes, getBaseRoute } from './tools';\n\ninterface PromptInfo {\n //\n code: 0 | 1;\n message: string;\n data?: any;\n}\n\ninterface DataInfo {\n loginInfo: { [x: string]: any };\n token: string;\n isHideHeader: boolean;\n}\n\n// URL解析结果接口\ninterface ParsedUrl {\n protocol: string;\n host: string;\n port: string;\n pathname: string;\n search: string;\n hash: string;\n origin: string;\n fullPath: string;\n}\n\nexport default class ParentPostmate {\n /** 连接到的子 postmate 实例 */\n postmateParent: any = null;\n /** 通讯数据 */\n dataInfo: DataInfo = {\n loginInfo: {},\n token: '',\n isHideHeader: true,\n };\n /** iframe Dom 容器 */\n iframeEle: any = null;\n /** 当前 iframe url */\n currentUrl: string = '';\n /** 存储当前的 iframe 元素 */\n currentIframe: any = null;\n /** iframe 加载完成执行函数 */\n loadFunction: (() => void) | null = null;\n /** 处理子类的其他请求方法 */\n handleOtherRequest: ((params: any) => void) | null = null;\n /** 子页面是否支持路由更新 */\n childSupportsRouteUpdate: boolean = true;\n /** 子系统的路由列表 */\n childRoutes: any[] = [];\n /** 获取分系统路由列表的定时器对象 */\n getRoutersTimer: any = null;\n /** 推送路由更新的定时器对象的定时器对象 */\n pushRouterTimer: any = null;\n /** 集成过程提示暴露方法 */\n getPrompt: ((info: PromptInfo) => void) | null = null;\n\n eventBus: any = {\n getRoutes: null,\n route_update_result: null,\n };\n\n constructor(\n dataInfo: DataInfo,\n iframeEle: HTMLElement | (() => HTMLElement),\n iframeUrl: string = '',\n handleOtherRequest?: (params: any) => void,\n ) {\n this.dataInfo = dataInfo || this.dataInfo;\n this.iframeEle = iframeEle;\n this.setIframeUrl(iframeUrl);\n handleOtherRequest && (this.handleOtherRequest = handleOtherRequest);\n }\n\n executePrompt(code: 0 | 1, message: string, data?: any) {\n this.getPrompt && this.getPrompt({ code, message, data });\n }\n\n /** 解析URL */\n parseUrl(url: string): ParsedUrl {\n const link = document.createElement('a');\n link.href = url;\n\n // 获取协议\n const protocol = link.protocol.length > 4 ? link.protocol : window.location.protocol;\n\n // 获取主机和端口\n const host = link.hostname;\n const port =\n link.port || (protocol === 'https:' ? '443' : protocol === 'http:' ? '80' : '');\n\n // 获取路径、查询参数和哈希\n const pathname = link.pathname.startsWith('/') ? link.pathname : `/${link.pathname}`;\n const search = link.search;\n const hash = link.hash.slice(2, link.hash.length);\n\n // 构建origin\n const origin = link.origin || `${protocol}//${host}${port ? `:${port}` : ''}`;\n\n // 构建完整路径(不包含origin)\n const fullPath = `${pathname}${hash}`;\n\n return {\n protocol,\n host,\n port,\n pathname,\n search,\n hash,\n origin,\n fullPath,\n };\n }\n\n /** 比较两个URL是否相同*/\n compareUrlBase(url1: string, url2: string): boolean {\n const url1End = url1.endsWith('/');\n const url2End = url2.endsWith('/');\n if ((url1End && url2End) || (!url1End && !url2End)) {\n return url1 === url2;\n } else {\n if (url1End) url2 += '/';\n if (url2End) url1 += '/';\n return url1 === url2;\n }\n }\n\n /** 比较两个URL的路径是否相同(不包含查询参数和哈希) */\n compareUrlPath(url1: string, url2: string): boolean {\n if (!url1 || !url2) return false;\n\n const parsed1 = this.parseUrl(url1);\n const parsed2 = this.parseUrl(url2);\n\n return parsed1.pathname === parsed2.pathname;\n }\n\n /** 比较两个URL是否完全相同(包括查询参数和哈希) */\n compareUrlFull(url1: string, url2: string): boolean {\n if (!url1 || !url2) return false;\n\n const parsed1 = this.parseUrl(url1);\n const parsed2 = this.parseUrl(url2);\n\n return parsed1.fullPath === parsed2.fullPath;\n }\n\n /** 清除当前的 iframe 和 postmate 实例 */\n clear() {\n // 销毁 postmate 实例\n if (this.postmateParent) {\n this.postmateParent.destroy();\n this.postmateParent = null;\n }\n\n this.eventBus.getRoutes = null;\n this.eventBus.route_update_result = null;\n this.childRoutes = [];\n this.childSupportsRouteUpdate = false;\n\n // 移除 iframe\n if (this.currentIframe && this.currentIframe.parentNode) {\n this.currentIframe.parentNode.removeChild(this.currentIframe);\n }\n this.currentIframe = null;\n }\n\n /** 初始化 */\n async init(callback: any = null) {\n this.executePrompt(0, '★ 开始创建集成连接');\n\n // 清除之前的实例和 iframe\n this.clear();\n\n // 重置子页面路由更新支持标记\n this.childSupportsRouteUpdate = false;\n\n // 如果没有容器,或集成链接\n if (!this.iframeEle || !this.currentUrl) {\n this.executePrompt(1, '容器获取失败或集成链接为空');\n this.destroy();\n return;\n }\n\n // 获取 iframe 容器\n const container: any =\n typeof this.iframeEle === 'function' ? this.iframeEle() : this.iframeEle;\n if (!container) {\n this.executePrompt(1, '集成容器DOM获取失败');\n console.warn('【ParentPostmate】无法获取 iframe 容器');\n return;\n }\n\n // 创建 Postmate 实例(作为父)\n const handshake: any = new Postmate({\n container,\n url: this.currentUrl,\n name: '',\n model: '',\n });\n\n // 存储当前创建的 iframe\n this.currentIframe = container.querySelector('iframe');\n this.currentIframe.setAttribute('frameborder', '0');\n this.currentIframe.setAttribute('allow', 'fullscreen');\n this.currentIframe.addEventListener('load', () => {\n this.loadFunction && this.loadFunction();\n });\n\n handshake\n .then((parent: any) => {\n this.postmateParent = parent;\n\n // 监听子页面发来的获取数据请求\n parent.on('requestBaseData', () => {\n this.executePrompt(0, '接收到分系统的集成数据获取请求');\n\n // 发送相关数据\n this.sendData();\n });\n\n // 监听子页面发来的路由配置数据\n parent.on('pushRoutes', (routes: string) => {\n console.error('【ParentPostmate】分系统路由连接数据:', routes);\n this.executePrompt(routes ? 0 : 1, '接收到分系统router配置数据', routes);\n\n if (routes) this.childRoutes = JSON.parse(routes);\n else this.childRoutes = [];\n this.eventBus.getRoutes && this.eventBus.getRoutes();\n });\n\n // 监听子页面的路由效验结果\n parent.on('routeExists', (flag: boolean) => {});\n\n // 监听子页面的动态路由变更支持\n parent.on('route_update_support', (flag: boolean) => {\n console.error('【ParentPostmate】route_update_support连接:', flag);\n this.executePrompt(flag ? 0 : 1, '接收到分系统router配置状态', flag);\n\n this.childSupportsRouteUpdate = flag;\n });\n\n // 监听子页面的路由变更结果\n parent.on('route_update_result', (flag: boolean) => {\n this.eventBus.route_update_result && this.eventBus.route_update_result(flag);\n });\n\n // 监听子页面发来的其他请求\n parent.on('otherRequest', (params: any) => {\n this.handleOtherRequest && this.handleOtherRequest(params);\n });\n\n if (typeof callback === 'function') callback();\n\n this.executePrompt(0, '★ 集成连接成功');\n })\n .catch((error: any) => {\n console.error('【ParentPostmate】Postmate 连接失败:', error);\n this.executePrompt(1, '★ 集成连接失败');\n });\n }\n\n /** 设置load执行事件 */\n setLoadFunction(loadFunction: () => void) {\n this.loadFunction = loadFunction;\n }\n\n /** 设置获取集成提示方法 */\n setGetPrompt(getPrompt: (info: PromptInfo) => void) {\n this.getPrompt = getPrompt;\n }\n\n /** 设置 iframe url */\n setIframeUrl(iframeUrl: string, routerPath: string = '') {\n this.executePrompt(\n 0,\n `-------★接收到集成地址★-------\n【${iframeUrl}】`,\n );\n\n // 如果完全一样:不操作\n if (iframeUrl === this.currentUrl) return;\n\n // 如果传入了路由,则对路径进行规范处理\n if (routerPath && !routerPath.startsWith('/')) {\n routerPath = '/' + routerPath;\n }\n\n if (routerPath && routerPath.endsWith('/')) {\n routerPath = routerPath.slice(0, -1);\n }\n\n // 1、传入的地址为空:销毁当前实例\n if (!iframeUrl) {\n this.currentUrl = '';\n this.destroy();\n this.executePrompt(0, '集成地址为空,销毁当前实例');\n console.error('【ParentPostmate】无加载地址,无法初始化');\n return;\n }\n\n // 2、如果当前无连接:直接设置并初始化\n if (!this.postmateParent || !this.currentUrl) {\n this.currentUrl = iframeUrl;\n this.executePrompt(0, '当前无链接,准备初始化容器');\n if (this.iframeEle) {\n this.executePrompt(0, '容器获取成功,准备初始化');\n this.init();\n } else {\n this.executePrompt(1, '容器DOM为空,初始化失败');\n console.error('【ParentPostmate】无 iframe 容器,无法初始化');\n }\n return;\n }\n\n this.executePrompt(0, '当前有已集成应用,开始同源策略判定...');\n // 3、如果当前系统不支持路由更新 或 新旧系统协议、ip、端口不同则重新初始化: 重新初始化\n if (\n !this.childSupportsRouteUpdate ||\n !this.childRoutes?.length ||\n !areUrlsSameProtocolIpPort(this.currentUrl, iframeUrl)\n ) {\n this.executePrompt(\n 0,\n '同源策略检查完成,分系统不支持路由更新 或 协议、ip、端口不同,准备重新初始化',\n );\n this.currentUrl = iframeUrl;\n this.init();\n return;\n }\n\n /**\n * 因新旧地址的基础地址完全相同,且已加载系统支持路由更新\n * 下面处理新旧地址的url,研判操作方式\n **/\n this.executePrompt(\n 0,\n `同源策略检查完成,新应用地址与已集成应用协议、ip、端口相同,且当前系统支持路由更新`,\n );\n\n // 更新路由列表\n let flag = false;\n this.eventBus.getRoutes = () => {\n flag = true;\n this.executePrompt(0, `路由配置更新完成`);\n this.handleSimilarUrl(iframeUrl, routerPath);\n };\n this.executePrompt(0, `开始更新已集成应用路由配置对象...`);\n this.postmateParent.call('getRoutes');\n\n this.getRoutersTimer && clearTimeout(this.getRoutersTimer);\n this.getRoutersTimer = null;\n this.getRoutersTimer = setTimeout(() => {\n if (!flag) {\n this.executePrompt(\n 1,\n `★ 已加载系统路由配置获取失败,仍尝试使用已有路由配置对象处理路由匹配策略`,\n );\n this.handleSimilarUrl(iframeUrl, routerPath);\n }\n this.getRoutersTimer && clearTimeout(this.getRoutersTimer);\n this.getRoutersTimer = null;\n }, 1000);\n }\n\n // 处理相似地址\n handleSimilarUrl(iframeUrl: string, routerPath?: string) {\n this.executePrompt(0, `开始执行深度匹配策略...`);\n\n let hasQuery = iframeUrl.split('?').length > 1;\n let urlQuery = '';\n // 判断是否携带参数\n if (hasQuery) urlQuery = '?' + iframeUrl.split('?')[1];\n\n // 1 如果传入了routerPath,将该值与子系统匹配,判断是否可以直接跳转\n if (routerPath && isRouteMatched(this.childRoutes, routerPath)) {\n this.sendRouteUpdate({\n fullPath: routerPath + urlQuery,\n });\n this.currentUrl = iframeUrl;\n return;\n }\n\n // 2 手动解析地址中的routePath,并考虑是否携带基础地址\n // 获取基础地址\n const baseRoute = getBaseRoute(this.childRoutes, this.currentUrl);\n this.executePrompt(0, `基础路由解析完成`, baseRoute);\n\n // 获取新链接的路由地址\n let urlObj = new URL(iframeUrl);\n let routePath = '';\n if (urlObj.hash && urlObj.hash.indexOf('#/') > -1) {\n routePath = urlObj.hash.split('#')[1];\n } else {\n routePath = urlObj.pathname + urlQuery;\n }\n this.executePrompt(0, `页面路由解析完成`, routePath);\n if (\n this.currentUrl.split(baseRoute)[0] === iframeUrl.split(baseRoute)[0] &&\n isRouteMatched(this.childRoutes, routePath.replace(baseRoute, ''))\n ) {\n this.executePrompt(0, `★ 匹配完成,判定为同一系统`);\n // 触发更新路由\n this.sendRouteUpdate({\n fullPath: routePath.replace(baseRoute, ''),\n });\n\n this.currentUrl = iframeUrl;\n return;\n }\n this.executePrompt(\n 1,\n `★ 匹配失败,判定为同协议、ip、端口部署的不同系统,准备重新初始化...`,\n );\n // 3 如果以上两种情况都不满足,则重新初始化\n this.currentUrl = iframeUrl;\n this.init();\n }\n\n /** 向子页面发送路由更新消息 */\n sendRouteUpdate(parsedUrl: any) {\n try {\n let flag = false;\n this.eventBus.route_update_result = (state: boolean) => {\n flag = state;\n if (flag) {\n this.executePrompt(0, '★ 分应用响应,变更成功', flag);\n } else {\n this.executePrompt(1, '★ 分应用响应,变更失败', flag);\n }\n this.loadFunction && this.loadFunction();\n };\n this.executePrompt(0, `开始推送路由更新...`, parsedUrl.fullPath);\n this.postmateParent.call('routeUpdate', JSON.stringify(parsedUrl));\n\n console.log(\n '---------------------- 【ParentPostmate】推送路由更新 ----------------------',\n );\n this.pushRouterTimer && clearTimeout(this.pushRouterTimer);\n this.pushRouterTimer = null;\n this.pushRouterTimer = setTimeout(() => {\n if (!flag) {\n this.executePrompt(1, `分应用响应超时/更新失败,准备创建新的独立连接`);\n console.warn('【ParentPostmate】推送路由更新失败,将重新初始化iframe');\n // 标记子页面不支持路由更新\n this.childSupportsRouteUpdate = false;\n // 如果发送消息失败,则重新初始化iframe\n this.init();\n }\n this.pushRouterTimer && clearTimeout(this.pushRouterTimer);\n this.pushRouterTimer = null;\n }, 1000);\n this.executePrompt(0, `推送完成,等待分应用响应...`, parsedUrl.fullPath);\n } catch (error) {\n this.executePrompt(1, `推送更新失败,准备创建新的独立连接`, error);\n console.warn('【ParentPostmate】发送路由更新消息失败,将重新初始化iframe:', error);\n // 标记子页面不支持路由更新\n this.childSupportsRouteUpdate = false;\n // 如果发送消息失败,则重新初始化iframe\n this.init();\n }\n }\n\n /** 向子页面发送消息 */\n sendData() {\n if (!this.postmateParent) return;\n this.executePrompt(0, '响应分系统请求,推送数据', JSON.stringify(this.dataInfo));\n this.postmateParent.call('baseData', JSON.stringify(this.dataInfo));\n }\n\n /** 销毁实例 */\n destroy() {\n this.clear();\n }\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","normalizeBase","base","trimmed","extractRelativePath","fullAddress","normalizedBase","pathname","normalizedPathname","relativePath","convertRoutePathToRegex","routePath","normalizedRoutePath","needEscapeChars","regexStr","_","__","regex","e","traverseRoutes","routers","targetRelativePath","parentPath","normalizedTarget","route","processedParentPath","processedRoutePath","fullRoutePath","isRouteMatched","checkPathInRoutes","routes","path","isRouteExists","router","getRouterPaths","purifyRoute","safeFields","child","areUrlsSameProtocolIpPort","url1","url2","parsedUrl1","parsedUrl2","sameProtocol","sameHost","samePort","error","getCircularReplacer","seen","getBaseRoute","baseRoute","urlObj","arr","nowRoute","ChildPostmate","eventObj","customRouteChange","that","routeInfoStr","routeInfo","parent","err","params","ParentPostmate","dataInfo","iframeEle","iframeUrl","handleOtherRequest","code","message","port","search","hash","fullPath","url1End","url2End","parsed1","parsed2","handshake","flag","loadFunction","getPrompt","routerPath","_a","hasQuery","urlQuery","parsedUrl","state"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.js","sources":["../packages/postMeta/postMeta.js","../packages/postMeta/RouteMatching.ts","../packages/postMeta/tools.ts","../packages/postMeta/ChildPostmate.ts","../packages/postMeta/ParentPostmate.ts"],"sourcesContent":["const MESSAGE_TYPE = \"application/x-postmate-v1+json\";\nlet uid = 0;\n\nconst allowedPostmateTypes = {\n handshake: 1,\n \"handshake-reply\": 1,\n call: 1,\n emit: 1,\n reply: 1,\n request: 1,\n};\n\n// 校验消息是否来自合法的来源\nfunction isValidMessage(event, allowedOrigin) {\n return (\n (typeof allowedOrigin !== \"string\" || event.origin === allowedOrigin) &&\n !!event.data &&\n (typeof event.data !== \"object\" || \"postmate\" in event.data) &&\n event.data.type === MESSAGE_TYPE &&\n !!allowedPostmateTypes[event.data.postmate]\n );\n}\n\n// ----------------- ParentAPI -----------------\nclass ParentAPI {\n constructor(config) {\n this.parent = config.parent;\n this.frame = config.frame;\n this.child = config.child;\n this.childOrigin = config.childOrigin;\n this.events = {};\n\n this.listener = (event) => {\n if (!isValidMessage(event, this.childOrigin)) return;\n const { value = {} } = event.data;\n const { name, data } = value;\n if (event.data.postmate === \"emit\" && name in this.events) {\n this.events[name].call(this, data);\n }\n };\n\n this.parent.addEventListener(\"message\", this.listener, false);\n }\n\n get(property) {\n return new Postmate.Promise((resolve) => {\n const id = ++uid;\n const handler = (event) => {\n if (event.data.uid === id && event.data.postmate === \"reply\") {\n this.parent.removeEventListener(\"message\", handler, false);\n resolve(event.data.value);\n }\n };\n this.parent.addEventListener(\"message\", handler, false);\n this.child.postMessage(\n {\n postmate: \"request\",\n type: MESSAGE_TYPE,\n property,\n uid: id,\n },\n this.childOrigin\n );\n });\n }\n\n call(method, data) {\n this.child.postMessage(\n {\n postmate: \"call\",\n type: MESSAGE_TYPE,\n property: method,\n data,\n },\n this.childOrigin\n );\n }\n\n on(event, callback) {\n this.events[event] = callback;\n }\n\n destroy() {\n window.removeEventListener(\"message\", this.listener, false);\n this.frame.parentNode.removeChild(this.frame);\n }\n}\n\n// ----------------- ChildAPI -----------------\nclass ChildAPI {\n constructor(config) {\n this.model = config.model;\n this.parent = config.parent;\n this.parentOrigin = config.parentOrigin;\n this.child = config.child;\n\n this.child.addEventListener(\"message\", (event) => {\n if (!isValidMessage(event, this.parentOrigin)) return;\n\n const { postmate, property, uid, data } = event.data;\n const value = this.model[property];\n\n if (postmate !== \"call\") {\n const result = typeof value === \"function\" ? value() : value;\n Postmate.Promise.resolve(result).then((res) => {\n event.source.postMessage(\n {\n property,\n postmate: \"reply\",\n type: MESSAGE_TYPE,\n uid,\n value: res,\n },\n event.origin\n );\n });\n } else if (property in this.model && typeof value === \"function\") {\n value(data);\n }\n });\n }\n\n emit(eventName, data) {\n this.parent.postMessage(\n {\n postmate: \"emit\",\n type: MESSAGE_TYPE,\n value: { name: eventName, data },\n },\n this.parentOrigin\n );\n }\n}\n\n// ----------------- Postmate -----------------\nclass Postmate {\n constructor({ container = document.body, model, url, name, classListArray = [] }) {\n this.parent = window;\n this.frame = document.createElement(\"iframe\");\n this.frame.name = name || \"\";\n this.frame.classList.add(...classListArray);\n container.appendChild(this.frame);\n\n this.child = this.frame.contentWindow;\n this.model = model || {};\n\n return this.sendHandshake(url);\n }\n\n sendHandshake(url) {\n const origin = (() => {\n const link = document.createElement(\"a\");\n link.href = url;\n const protocol = link.protocol.length > 4 ? link.protocol : window.location.protocol;\n const host = link.host.length ? (link.port === \"80\" || link.port === \"443\" ? link.hostname : link.host) : window.location.host;\n return link.origin || `${protocol}//${host}`;\n })();\n\n let attemptCount = 0;\n let interval;\n\n return new Postmate.Promise((resolve, reject) => {\n const listener = (event) => {\n if (!isValidMessage(event, origin)) return false;\n if (event.data.postmate === \"handshake-reply\") {\n clearInterval(interval);\n this.parent.removeEventListener(\"message\", listener, false);\n this.childOrigin = event.origin;\n resolve(new ParentAPI(this));\n } else {\n reject(\"Failed handshake\");\n }\n };\n\n this.parent.addEventListener(\"message\", listener, false);\n\n const send = () => {\n attemptCount++;\n this.child.postMessage(\n {\n postmate: \"handshake\",\n type: MESSAGE_TYPE,\n model: this.model,\n },\n origin\n );\n if (attemptCount === 5) clearInterval(interval);\n };\n\n const init = () => {\n send();\n interval = setInterval(send, 500);\n };\n\n this.frame.onload = init;\n this.frame.attachEvent && this.frame.attachEvent(\"onload\", init);\n this.frame.src = url;\n });\n }\n}\n\n// ----------------- Model -----------------\nclass Model {\n constructor(model) {\n this.child = window;\n this.model = model;\n this.parent = window.parent;\n\n return this.sendHandshakeReply();\n }\n\n sendHandshakeReply() {\n return new Postmate.Promise((resolve, reject) => {\n this.child.addEventListener(\"message\", (event) => {\n if (event.data.postmate) {\n if (event.data.postmate !== \"handshake\") return reject(\"Handshake Reply Failed\");\n\n this.child.removeEventListener(\"message\", this, false);\n event.source.postMessage(\n {\n postmate: \"handshake-reply\",\n type: MESSAGE_TYPE,\n },\n event.origin\n );\n\n this.parentOrigin = event.origin;\n const parentModel = event.data.model;\n if (parentModel) {\n Object.keys(parentModel).forEach((key) => {\n this.model[key] = parentModel[key];\n });\n }\n resolve(new ChildAPI(this));\n }\n }, false);\n });\n }\n}\n\n// Attach defaults\nPostmate.debug = false;\nPostmate.Promise = (() => {\n try {\n return typeof window !== \"undefined\" ? window.Promise : Promise;\n } catch {\n return Promise;\n }\n})();\nPostmate.Model = Model;\n\nexport default Postmate;\nexport { Model };\n","import type { RouteRecordRaw } from 'vue-router';\r\n\r\n/**\r\n * 标准化基础路由(base):确保以 / 开头,不以 / 结尾(空字符串除外)\r\n */\r\nconst normalizeBase = (base: string): string => {\r\n if (!base || base === '/') return '';\r\n const trimmed = base.replace(/\\/$/, '');\r\n return trimmed.startsWith('/') ? trimmed : `/${trimmed}`;\r\n};\r\n\r\n/**\r\n * 从全量地址中提取「相对于base的路由路径」\r\n */\r\nconst extractRelativePath = (fullAddress: string, base = ''): string | null => {\r\n if (!fullAddress) return null;\r\n const normalizedBase = normalizeBase(base);\r\n let pathname = '';\r\n\r\n try {\r\n const url = new URL(fullAddress);\r\n pathname = url.pathname;\r\n } catch {\r\n pathname = fullAddress.split(/[?#]/)[0];\r\n }\r\n\r\n // 1. 去重斜杠 + 标准化路径\r\n const normalizedPathname = pathname.replace(/\\/+/g, '/').replace(/\\/$/, '') || '/';\r\n\r\n if (normalizedBase && !normalizedPathname.startsWith(normalizedBase)) {\r\n return null;\r\n }\r\n\r\n let relativePath = normalizedBase\r\n ? normalizedPathname.slice(normalizedBase.length)\r\n : normalizedPathname;\r\n\r\n // 确保相对路径以/开头,且无重复斜杠\r\n relativePath = relativePath.replace(/\\/+/g, '/');\r\n relativePath = relativePath.startsWith('/') ? relativePath : `/${relativePath}`;\r\n return relativePath === '' ? '/' : relativePath;\r\n};\r\n\r\n/**\r\n * 核心修复:路由路径转正则(解决无效转义+重复斜杠+动态参数)\r\n * 关键优化:\r\n * 1. 仅转义正则中「必须转义」的字符(移除-的转义,因为仅在[]内需要转义)\r\n * 2. 增加转义合法性校验,避免无效转义符\r\n */\r\nconst convertRoutePathToRegex = (routePath: string): RegExp => {\r\n if (!routePath) return /^$/iu;\r\n\r\n // 步骤1:标准化路由路径(去重斜杠 + 去除末尾斜杠)\r\n const normalizedRoutePath =\r\n routePath\r\n .replace(/\\/+/g, '/') // 去重所有重复斜杠(// → /)\r\n .replace(/\\/$/, '') || '/';\r\n\r\n // 步骤2:仅转义正则中「必须转义」的字符(核心修复:移除-)\r\n // 需转义的字符:. ? + ^ $ [ ] ( ) { } | \\(-不在此列,无需转义)\r\n const needEscapeChars = /([.?+^$[\\](){}|\\\\])/g;\r\n let regexStr = normalizedRoutePath.replace(needEscapeChars, '\\\\$1');\r\n\r\n // 步骤3:处理动态路由语法(不复用原有/,避免重复斜杠)\r\n regexStr = regexStr\r\n // 1. 通配符 :pathMatch(.*)* → 匹配任意多级路径\r\n .replace(/:pathMatch\\\\\\(\\.\\*\\\\\\)\\*/g, '.+')\r\n // 2. 带正则约束的参数(如 :id(\\\\d+) → 保留正则,还原转义)\r\n .replace(/:([a-zA-Z0-9_]+)\\\\\\(([^)]+)\\\\\\)/g, (_, __, regex) => regex.replace(/\\\\\\\\/g, '\\\\'))\r\n // 3. 可选动态参数(如 :id? → 匹配空或非/字符)\r\n .replace(/:([a-zA-Z0-9_]+)\\?/g, '[^/]*')\r\n // 4. 普通动态参数(仅匹配非/字符)\r\n .replace(/:([a-zA-Z0-9_]+)/g, '[^/]+');\r\n\r\n // 步骤4:最终标准化正则字符串(去重转义的/,避免\\\\/→\\/重复)\r\n regexStr = regexStr.replace(/\\\\\\/+/g, '\\\\/');\r\n\r\n // 步骤5:安全生成正则(捕获转义错误,降级返回空正则)\r\n try {\r\n return new RegExp(`^${regexStr}$`, 'iu');\r\n } catch (e) {\r\n console.warn('路由路径转正则失败', { routePath, regexStr, error: e });\r\n return /^$/iu;\r\n }\r\n};\r\n\r\n/**\r\n * 递归遍历路由(保留调试日志)\r\n */\r\nconst traverseRoutes = (\r\n routers: RouteRecordRaw[],\r\n targetRelativePath: string,\r\n parentPath = '',\r\n): boolean => {\r\n // 目标路径去重斜杠 + 标准化\r\n const normalizedTarget = targetRelativePath.replace(/\\/+/g, '/').replace(/\\/$/, '') || '/';\r\n\r\n for (const route of routers) {\r\n // 修复嵌套路由拼接逻辑(彻底避免重复斜杠)\r\n const processedParentPath = parentPath.replace(/\\/+/g, '/').replace(/\\/$/, '');\r\n const processedRoutePath = route.path.replace(/\\/+/g, '/').replace(/^\\//, '');\r\n const fullRoutePath = processedParentPath\r\n ? `${processedParentPath}/${processedRoutePath}`.replace(/\\/+/g, '/')\r\n : route.path.replace(/\\/+/g, '/');\r\n\r\n const routeRegex = convertRoutePathToRegex(fullRoutePath);\r\n const isMatched = routeRegex.test(normalizedTarget);\r\n\r\n if (isMatched) return true;\r\n\r\n if (route.children && route.children.length) {\r\n const childMatched = traverseRoutes(route.children, normalizedTarget, fullRoutePath);\r\n if (childMatched) return true;\r\n }\r\n }\r\n\r\n return false;\r\n};\r\n\r\n/**\r\n * 对外方法\r\n */\r\nexport const isRouteMatched = (\r\n routers: RouteRecordRaw[],\r\n fullAddress: string,\r\n base = '',\r\n): boolean => {\r\n if (!routers || !routers.length || !fullAddress) return false;\r\n const relativePath = extractRelativePath(fullAddress, base);\r\n if (!relativePath) return false;\r\n return traverseRoutes(routers, relativePath);\r\n};\r\n","import { isRouteMatched } from './RouteMatching';\n\n/**\n * 检查路径是否存在于路由配置中(递归检查所有层级)\n * @param routes 路由配置数组\n * @param path 需要检查的路径\n * @returns 是否存在\n */\nexport function checkPathInRoutes(routes: any[], path: string): boolean {\n\tfor (const route of routes) {\n\t\t// 检查当前路由\n\t\tif (route.path === path) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// 递归检查子路由\n\t\tif (route.children && Array.isArray(route.children) && route.children.length > 0) {\n\t\t\tif (checkPathInRoutes(route.children, path)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * 判断路径是否存在于vue-router对象中(兼容Vue2和Vue3)\n * @param router vue-router实例\n * @param path 需要检查的页面路径\n * @returns 路径是否存在\n */\nexport function isRouteExists(router: any, path: string): boolean {\n\t// 移除路径中的查询参数\n\tif (path.includes('?')) {\n\t\tpath = path.split('?')[0];\n\t}\n\tconst routes = getRouterPaths(router);\n\tif (!routes || routes.length === 0) return false;\n\treturn checkPathInRoutes(routes, path);\n}\n\n// 净化单个路由配置,只保留安全字段\nfunction purifyRoute(route) {\n\t// 只提取需要的基础字段,根据你的需求调整\n\tconst safeFields = {\n\t\tpath: route.path,\n\t\tname: route.name,\n\t\tmeta: route.meta || {}, // 确保meta是普通对象\n\t\tredirect: route.redirect,\n\t\t// 剔除 component、beforeEnter 等可能包含函数/对象引用的字段\n\t\t// 如果需要children,递归净化\n\t\tchildren: route.children ? route.children.map((child) => purifyRoute(child)) : [],\n\t};\n\n\t// 进一步净化meta(如果meta中可能有复杂对象)\n\tsafeFields.meta = JSON.parse(JSON.stringify(safeFields.meta));\n\n\treturn safeFields;\n}\n\n/**\n * 获取路由路径\n *\n */\nexport function getRouterPaths(router: any): any[] {\n\tlet routes: any[] = [];\n\t// 区分Vue Router 3.x (Vue2) 和 4.x (Vue3)\n\tif (typeof router.getRoutes === 'function') {\n\t\t// Vue Router 4.x (Vue3)\n\t\troutes = router.getRoutes();\n\t} else if (router.options && Array.isArray(router.options.routes)) {\n\t\t// Vue Router 3.x (Vue2)\n\t\troutes = router.options.routes;\n\t}\n\treturn routes.map((route) => purifyRoute(route)) || [];\n}\n\n/**\n * 比较两个URL的协议、IP(或域名)和端口是否完全相同\n * @param url1 第一个URL字符串\n * @param url2 第二个URL字符串\n * @returns 如果协议、IP(或域名)和端口都相同则返回true,否则返回false;解析失败时返回false\n */\nexport function areUrlsSameProtocolIpPort(url1: string, url2: string): boolean {\n\ttry {\n\t\t// 解析两个URL\n\t\tconst parsedUrl1 = new URL(url1);\n\t\tconst parsedUrl2 = new URL(url2);\n\n\t\t// 比较协议(不区分大小写,但通常URL协议是小写的)\n\t\tconst sameProtocol = parsedUrl1.protocol.toLowerCase() === parsedUrl2.protocol.toLowerCase();\n\n\t\t// 比较主机(IP或域名)\n\t\tconst sameHost = parsedUrl1.hostname === parsedUrl2.hostname;\n\n\t\t// 比较端口(如果未指定端口,会使用协议默认端口)\n\t\tconst samePort = parsedUrl1.port === parsedUrl2.port;\n\n\t\t// 只有所有部分都相同时才返回true\n\t\treturn sameProtocol && sameHost && samePort;\n\t} catch (error) {\n\t\t// 如果URL解析失败,返回false\n\t\tconsole.warn('URL解析错误:', error);\n\t\treturn false;\n\t}\n}\n\nexport const getCircularReplacer = () => {\n\tconst seen = new WeakSet();\n\treturn (key, value) => {\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tif (seen.has(value)) {\n\t\t\t\t// 遇到循环引用时,返回一个标识或忽略\n\t\t\t\treturn '[Circular Reference]';\n\t\t\t}\n\t\t\tseen.add(value);\n\t\t}\n\t\treturn value;\n\t};\n};\n\nexport function getBaseRoute(routers: any[], url: string): string {\n\tlet baseRoute = '';\n\tlet urlObj = new URL(url);\n\tlet noQueryUrl = url.split('?')[0];\n\n\t// 判断路由模式并取值\n\tlet routePath = '';\n\tif (urlObj.hash && urlObj.hash.indexOf('#/') > -1) {\n\t\troutePath = urlObj.hash.split('#')[1];\n\n\t} else {\n\t\troutePath = urlObj.pathname;\n\t}\n\t// 当前路由中没有该路由,判定有base\n\tif (!isRouteMatched(routers, routePath)) {\n\t\tthis.executePrompt(0, `集成系统可访问路由中不存在路径(${routePath}),尝试解析base路由`);\n\t\t// 尝试剔除第一个路由,再判断是否匹配\n\t\tlet arr = routePath.split('/');\n\t\tlet nowRoute = '/' + arr.slice(2, arr.length).join('/');\n\t\tconsole.log(routers, nowRoute);\n\t\t\n\t\tif (isRouteMatched(routers, nowRoute)) {\n\t\t\tbaseRoute = '/' + arr[1];\n\t\t\tthis.executePrompt(0, `成功解析base路由(${baseRoute})`);\n\t\t} else {\n\t\t\tthis.executePrompt(1, `未解析到base路由(${nowRoute})`);\n\t\t}\n\t}\n\treturn baseRoute;\n}\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\t[x: string]: any;\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\tstateOver: boolean = false;\n\n\t// Vue Router实例\n\trouter: any = null;\n\t// 路由更新回调函数\n\tcustomRouteChange: ((routeInfo: RouteUpdateInfo) => void) | undefined = undefined;\n\n\tconstructor(eventObj: EventObj, router: any, customRouteChange?: (routeInfo: RouteUpdateInfo) => void) {\n\t\t// 保存router实例\n\t\tthis.router = router;\n\t\t// 保存路由更新回调函数\n\t\tthis.customRouteChange = customRouteChange;\n\n\t\tif (window.top !== window.self) {\n\t\t\tthis.init(eventObj);\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (this.stateOver) return;\n\t\t\t\teventObj.error({ status: 500, data: null, message: '未在一体化平台中运行' });\n\t\t\t}, 500);\n\t\t} else {\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.customRouteChange) {\n\t\t\t\t\t\tthat.customRouteChange(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.warn('【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\tthis.stateOver = true;\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\tthis.stateOver = true;\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 customRouteChange 自定义路由更新回调函数\n\t */\n\tsetRouter(router: any, customRouteChange?: (routeInfo: RouteUpdateInfo) => void) {\n\t\tthis.router = router;\n\t\tif (customRouteChange) {\n\t\t\tthis.customRouteChange = customRouteChange;\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 { isRouteMatched } from './RouteMatching';\nimport { areUrlsSameProtocolIpPort, checkPathInRoutes, getBaseRoute } from './tools';\n\ninterface PromptInfo {\n //\n code: 0 | 1;\n message: string;\n data?: any;\n}\n\ninterface DataInfo {\n loginInfo: { [x: string]: any };\n token: string;\n isHideHeader: boolean;\n}\n\n// URL解析结果接口\ninterface ParsedUrl {\n protocol: string;\n host: string;\n port: string;\n pathname: string;\n search: string;\n hash: string;\n origin: string;\n fullPath: string;\n}\n\nexport default class ParentPostmate {\n /** 连接到的子 postmate 实例 */\n postmateParent: any = null;\n /** 通讯数据 */\n dataInfo: DataInfo = {\n loginInfo: {},\n token: '',\n isHideHeader: true,\n };\n /** iframe Dom 容器 */\n iframeEle: any = null;\n /** 当前 iframe url */\n currentUrl: string = '';\n /** 存储当前的 iframe 元素 */\n currentIframe: any = null;\n /** iframe 加载完成执行函数 */\n loadFunction: (() => void) | null = null;\n /** 处理子类的其他请求方法 */\n handleOtherRequest: ((params: any) => void) | null = null;\n /** 子页面是否支持路由更新 */\n childSupportsRouteUpdate: boolean = true;\n /** 子系统的路由列表 */\n childRoutes: any[] = [];\n /** 获取分系统路由列表的定时器对象 */\n getRoutersTimer: any = null;\n /** 推送路由更新的定时器对象的定时器对象 */\n pushRouterTimer: any = null;\n /** 集成过程提示暴露方法 */\n getPrompt: ((info: PromptInfo) => void) | null = null;\n\n eventBus: any = {\n getRoutes: null,\n route_update_result: null,\n };\n\n constructor(\n dataInfo: DataInfo,\n iframeEle: HTMLElement | (() => HTMLElement),\n iframeUrl: string = '',\n handleOtherRequest?: (params: any) => void,\n ) {\n this.dataInfo = dataInfo || this.dataInfo;\n this.iframeEle = iframeEle;\n this.setIframeUrl(iframeUrl);\n handleOtherRequest && (this.handleOtherRequest = handleOtherRequest);\n }\n\n executePrompt(code: 0 | 1, message: string, data?: any) {\n this.getPrompt && this.getPrompt({ code, message, data });\n }\n\n /** 解析URL */\n parseUrl(url: string): ParsedUrl {\n const link = document.createElement('a');\n link.href = url;\n\n // 获取协议\n const protocol = link.protocol.length > 4 ? link.protocol : window.location.protocol;\n\n // 获取主机和端口\n const host = link.hostname;\n const port =\n link.port || (protocol === 'https:' ? '443' : protocol === 'http:' ? '80' : '');\n\n // 获取路径、查询参数和哈希\n const pathname = link.pathname.startsWith('/') ? link.pathname : `/${link.pathname}`;\n const search = link.search;\n const hash = link.hash.slice(2, link.hash.length);\n\n // 构建origin\n const origin = link.origin || `${protocol}//${host}${port ? `:${port}` : ''}`;\n\n // 构建完整路径(不包含origin)\n const fullPath = `${pathname}${hash}`;\n\n return {\n protocol,\n host,\n port,\n pathname,\n search,\n hash,\n origin,\n fullPath,\n };\n }\n\n /** 比较两个URL是否相同*/\n compareUrlBase(url1: string, url2: string): boolean {\n const url1End = url1.endsWith('/');\n const url2End = url2.endsWith('/');\n if ((url1End && url2End) || (!url1End && !url2End)) {\n return url1 === url2;\n } else {\n if (url1End) url2 += '/';\n if (url2End) url1 += '/';\n return url1 === url2;\n }\n }\n\n /** 比较两个URL的路径是否相同(不包含查询参数和哈希) */\n compareUrlPath(url1: string, url2: string): boolean {\n if (!url1 || !url2) return false;\n\n const parsed1 = this.parseUrl(url1);\n const parsed2 = this.parseUrl(url2);\n\n return parsed1.pathname === parsed2.pathname;\n }\n\n /** 比较两个URL是否完全相同(包括查询参数和哈希) */\n compareUrlFull(url1: string, url2: string): boolean {\n if (!url1 || !url2) return false;\n\n const parsed1 = this.parseUrl(url1);\n const parsed2 = this.parseUrl(url2);\n\n return parsed1.fullPath === parsed2.fullPath;\n }\n\n /** 清除当前的 iframe 和 postmate 实例 */\n clear() {\n // 销毁 postmate 实例\n if (this.postmateParent) {\n this.postmateParent.destroy();\n this.postmateParent = null;\n }\n\n this.eventBus.getRoutes = null;\n this.eventBus.route_update_result = null;\n this.childRoutes = [];\n this.childSupportsRouteUpdate = false;\n\n // 移除 iframe\n if (this.currentIframe && this.currentIframe.parentNode) {\n this.currentIframe.parentNode.removeChild(this.currentIframe);\n }\n this.currentIframe = null;\n }\n\n /** 初始化 */\n async init(callback: any = null) {\n this.executePrompt(0, '★ 开始创建集成连接');\n\n // 清除之前的实例和 iframe\n this.clear();\n\n // 重置子页面路由更新支持标记\n this.childSupportsRouteUpdate = false;\n\n // 如果没有容器,或集成链接\n if (!this.iframeEle || !this.currentUrl) {\n this.executePrompt(1, '容器获取失败或集成链接为空');\n this.destroy();\n return;\n }\n\n // 获取 iframe 容器\n const container: any =\n typeof this.iframeEle === 'function' ? this.iframeEle() : this.iframeEle;\n if (!container) {\n this.executePrompt(1, '集成容器DOM获取失败');\n console.warn('【ParentPostmate】无法获取 iframe 容器');\n return;\n }\n\n // 创建 Postmate 实例(作为父)\n const handshake: any = new Postmate({\n container,\n url: this.currentUrl,\n name: '',\n model: '',\n });\n\n // 存储当前创建的 iframe\n this.currentIframe = container.querySelector('iframe');\n this.currentIframe.setAttribute('frameborder', '0');\n this.currentIframe.setAttribute('allow', 'fullscreen');\n this.currentIframe.addEventListener('load', () => {\n this.loadFunction && this.loadFunction();\n });\n\n handshake\n .then((parent: any) => {\n this.postmateParent = parent;\n\n // 监听子页面发来的获取数据请求\n parent.on('requestBaseData', () => {\n this.executePrompt(0, '接收到分系统的集成数据获取请求');\n\n // 发送相关数据\n this.sendData();\n });\n\n // 监听子页面发来的路由配置数据\n parent.on('pushRoutes', (routes: string) => {\n this.executePrompt(routes ? 0 : 1, '接收到分系统router配置数据', routes);\n\n if (routes) this.childRoutes = JSON.parse(routes);\n else this.childRoutes = [];\n this.eventBus.getRoutes && this.eventBus.getRoutes();\n });\n\n // 监听子页面的路由效验结果\n parent.on('routeExists', (flag: boolean) => {});\n\n // 监听子页面的动态路由变更支持\n parent.on('route_update_support', (flag: boolean) => {\n this.executePrompt(flag ? 0 : 1, '接收到分系统router配置状态', flag);\n\n this.childSupportsRouteUpdate = flag;\n });\n\n // 监听子页面的路由变更结果\n parent.on('route_update_result', (flag: boolean) => {\n this.eventBus.route_update_result && this.eventBus.route_update_result(flag);\n });\n\n // 监听子页面发来的其他请求\n parent.on('otherRequest', (params: any) => {\n this.handleOtherRequest && this.handleOtherRequest(params);\n });\n\n if (typeof callback === 'function') callback();\n\n this.executePrompt(0, '★ 集成连接成功');\n })\n .catch((error: any) => {\n console.warn('【ParentPostmate】Postmate 连接失败:', error);\n this.executePrompt(1, '★ 集成连接失败');\n });\n }\n\n /** 设置load执行事件 */\n setLoadFunction(loadFunction: () => void) {\n this.loadFunction = loadFunction;\n }\n\n /** 设置获取集成提示方法 */\n setGetPrompt(getPrompt: (info: PromptInfo) => void) {\n this.getPrompt = getPrompt;\n }\n\n /** 设置 iframe url */\n setIframeUrl(iframeUrl: string, routerPath: string = '') {\n this.executePrompt(\n 0,\n `-------★接收到集成地址★-------\n【${iframeUrl}】`,\n );\n\n // 如果完全一样:不操作\n if (iframeUrl === this.currentUrl) return;\n\n // 如果传入了路由,则对路径进行规范处理\n if (routerPath && !routerPath.startsWith('/')) {\n routerPath = '/' + routerPath;\n }\n\n if (routerPath && routerPath.endsWith('/')) {\n routerPath = routerPath.slice(0, -1);\n }\n\n // 1、传入的地址为空:销毁当前实例\n if (!iframeUrl) {\n this.currentUrl = '';\n this.destroy();\n this.executePrompt(0, '集成地址为空,销毁当前实例');\n console.warn('【ParentPostmate】无加载地址,无法初始化');\n return;\n }\n\n // 2、如果当前无连接:直接设置并初始化\n if (!this.postmateParent || !this.currentUrl) {\n this.currentUrl = iframeUrl;\n this.executePrompt(0, '当前无链接,准备初始化容器');\n if (this.iframeEle) {\n this.executePrompt(0, '容器获取成功,准备初始化');\n this.init();\n } else {\n this.executePrompt(1, '容器DOM为空,初始化失败');\n console.warn('【ParentPostmate】无 iframe 容器,无法初始化');\n }\n return;\n }\n\n this.executePrompt(0, '当前有已集成应用,开始同源策略判定...');\n // 3、如果当前系统不支持路由更新 或 新旧系统协议、ip、端口不同则重新初始化: 重新初始化\n if (\n !this.childSupportsRouteUpdate ||\n // !this.childRoutes?.length ||\n !areUrlsSameProtocolIpPort(this.currentUrl, iframeUrl)\n ) {\n this.executePrompt(\n 0,\n '同源策略检查完成,分系统不支持路由更新 或 协议、ip、端口不同,准备重新初始化',\n );\n this.currentUrl = iframeUrl;\n this.init();\n return;\n }\n\n /**\n * 因新旧地址的基础地址完全相同,且已加载系统支持路由更新\n * 下面处理新旧地址的url,研判操作方式\n **/\n this.executePrompt(\n 0,\n `同源策略检查完成,新应用地址与已集成应用协议、ip、端口相同,且当前系统支持路由更新`,\n );\n\n // 更新路由列表\n let flag = false;\n this.eventBus.getRoutes = () => {\n flag = true;\n this.executePrompt(0, `路由配置更新完成`);\n this.handleSimilarUrl(iframeUrl, routerPath);\n };\n this.executePrompt(0, `开始更新已集成应用路由配置对象...`);\n this.postmateParent.call('getRoutes');\n\n this.getRoutersTimer && clearTimeout(this.getRoutersTimer);\n this.getRoutersTimer = null;\n this.getRoutersTimer = setTimeout(() => {\n if (!flag) {\n this.executePrompt(\n 1,\n `★ 已加载系统路由配置获取失败,仍尝试使用已有路由配置对象处理路由匹配策略`,\n );\n this.handleSimilarUrl(iframeUrl, routerPath);\n }\n this.getRoutersTimer && clearTimeout(this.getRoutersTimer);\n this.getRoutersTimer = null;\n }, 1000);\n }\n\n // 处理相似地址\n handleSimilarUrl(iframeUrl: string, routerPath?: string) {\n this.executePrompt(0, `开始执行深度匹配策略...`);\n\n let hasQuery = iframeUrl.split('?').length > 1;\n let urlQuery = '';\n // 判断是否携带参数\n if (hasQuery) urlQuery = '?' + iframeUrl.split('?')[1];\n\n // 1 如果传入了routerPath,将该值与子系统匹配,判断是否可以直接跳转\n if (routerPath && isRouteMatched(this.childRoutes, routerPath)) {\n this.sendRouteUpdate({\n fullPath: routerPath + urlQuery,\n });\n this.currentUrl = iframeUrl;\n return;\n }\n\n // 2 手动解析地址中的routePath,并考虑是否携带基础地址\n // 获取基础地址\n const baseRoute = getBaseRoute(this.childRoutes, this.currentUrl);\n\n // 获取新链接的路由地址\n let urlObj = new URL(iframeUrl);\n let routePath = '';\n if (urlObj.hash && urlObj.hash.indexOf('#/') > -1) {\n routePath = urlObj.hash.split('#')[1];\n } else {\n routePath = urlObj.pathname + urlQuery;\n }\n this.executePrompt(0, `页面路由解析完成`, routePath);\n if (\n this.currentUrl.split(baseRoute)[0] === iframeUrl.split(baseRoute)[0] &&\n isRouteMatched(this.childRoutes, routePath.replace(baseRoute, ''))\n ) {\n this.executePrompt(0, `★ 匹配完成,判定为同一系统`);\n // 触发更新路由\n this.sendRouteUpdate({\n fullPath: routePath.replace(baseRoute, ''),\n });\n\n this.currentUrl = iframeUrl;\n return;\n }\n this.executePrompt(\n 1,\n `★ 匹配失败,判定为同协议、ip、端口部署的不同系统,准备重新初始化...`,\n );\n // 3 如果以上两种情况都不满足,则重新初始化\n this.currentUrl = iframeUrl;\n this.init();\n }\n\n /** 向子页面发送路由更新消息 */\n sendRouteUpdate(parsedUrl: any) {\n try {\n let flag = false;\n this.eventBus.route_update_result = (state: boolean) => {\n flag = state;\n if (flag) {\n this.executePrompt(0, '★ 分应用响应,变更成功', flag);\n } else {\n this.executePrompt(1, '★ 分应用响应,变更失败', flag);\n }\n this.loadFunction && this.loadFunction();\n };\n this.executePrompt(0, `开始推送路由更新...`, parsedUrl.fullPath);\n this.postmateParent.call('routeUpdate', JSON.stringify(parsedUrl));\n\n console.log(\n '---------------------- 【ParentPostmate】推送路由更新 ----------------------',\n );\n this.pushRouterTimer && clearTimeout(this.pushRouterTimer);\n this.pushRouterTimer = null;\n this.pushRouterTimer = setTimeout(() => {\n if (!flag) {\n this.executePrompt(1, `分应用响应超时/更新失败,准备创建新的独立连接`);\n console.warn('【ParentPostmate】推送路由更新失败,将重新初始化iframe');\n // 标记子页面不支持路由更新\n this.childSupportsRouteUpdate = false;\n // 如果发送消息失败,则重新初始化iframe\n this.init();\n }\n this.pushRouterTimer && clearTimeout(this.pushRouterTimer);\n this.pushRouterTimer = null;\n }, 1000);\n this.executePrompt(0, `推送完成,等待分应用响应...`, parsedUrl.fullPath);\n } catch (error) {\n this.executePrompt(1, `推送更新失败,准备创建新的独立连接`, error);\n console.warn('【ParentPostmate】发送路由更新消息失败,将重新初始化iframe:', error);\n // 标记子页面不支持路由更新\n this.childSupportsRouteUpdate = false;\n // 如果发送消息失败,则重新初始化iframe\n this.init();\n }\n }\n\n /** 向子页面发送消息 */\n sendData() {\n if (!this.postmateParent) return;\n this.executePrompt(0, '响应分系统请求,推送数据', JSON.stringify(this.dataInfo));\n this.postmateParent.call('baseData', JSON.stringify(this.dataInfo));\n }\n\n /** 销毁实例 */\n destroy() {\n this.clear();\n }\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","normalizeBase","base","trimmed","extractRelativePath","fullAddress","normalizedBase","pathname","normalizedPathname","relativePath","convertRoutePathToRegex","routePath","normalizedRoutePath","needEscapeChars","regexStr","_","__","regex","e","traverseRoutes","routers","targetRelativePath","parentPath","normalizedTarget","route","processedParentPath","processedRoutePath","fullRoutePath","isRouteMatched","checkPathInRoutes","routes","path","isRouteExists","router","getRouterPaths","purifyRoute","safeFields","child","areUrlsSameProtocolIpPort","url1","url2","parsedUrl1","parsedUrl2","sameProtocol","sameHost","samePort","error","getCircularReplacer","seen","getBaseRoute","baseRoute","urlObj","arr","nowRoute","ChildPostmate","eventObj","customRouteChange","that","routeInfoStr","routeInfo","parent","err","params","ParentPostmate","dataInfo","iframeEle","iframeUrl","handleOtherRequest","code","message","port","search","hash","fullPath","url1End","url2End","parsed1","parsed2","handshake","flag","loadFunction","getPrompt","routerPath","hasQuery","urlQuery","parsedUrl","state"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qlfy-postmate",
3
- "version": "1.3.2",
3
+ "version": "1.3.4",
4
4
  "description": "",
5
5
  "types": "lib/index.d.ts",
6
6
  "module": "lib/index.umd.js",