qlfy-postmate 1.2.5 → 1.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/lib/index.mjs +43 -30
- package/lib/index.mjs.gz +0 -0
- package/lib/index.mjs.map +1 -1
- package/lib/index.umd.js +1 -1
- package/lib/index.umd.js.gz +0 -0
- package/lib/index.umd.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
### 子系统认证通信插件使用文档1.2.
|
|
1
|
+
### 子系统认证通信插件使用文档1.2.6
|
|
2
2
|
|
|
3
|
-
### 【1.2.
|
|
3
|
+
### 【1.2.6优化升级说明】
|
|
4
4
|
|
|
5
5
|
```txt
|
|
6
6
|
1、优化了同IP链接切换时的系统资源重复加载问题
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
3、建议
|
|
15
15
|
已完成集成系统也建议使用最新版本,使用变化极小
|
|
16
16
|
仅需以下两步操作:
|
|
17
|
-
(1)下载新版本插件:npm i qlfy-postmate@1.2.
|
|
17
|
+
(1)下载新版本插件:npm i qlfy-postmate@1.2.6
|
|
18
18
|
(2)使用处添加新参数:router
|
|
19
19
|
new ChildPostmate({...保持不变}, router)
|
|
20
20
|
```
|
package/lib/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const u = "application/x-postmate-v1+json";
|
|
2
|
-
let
|
|
2
|
+
let y = 0;
|
|
3
3
|
const R = {
|
|
4
4
|
handshake: 1,
|
|
5
5
|
"handshake-reply": 1,
|
|
@@ -11,7 +11,7 @@ const R = {
|
|
|
11
11
|
function m(i, e) {
|
|
12
12
|
return (typeof e != "string" || i.origin === e) && !!i.data && (typeof i.data != "object" || "postmate" in i.data) && i.data.type === u && !!R[i.data.postmate];
|
|
13
13
|
}
|
|
14
|
-
class
|
|
14
|
+
class w {
|
|
15
15
|
constructor(e) {
|
|
16
16
|
this.parent = e.parent, this.frame = e.frame, this.child = e.child, this.childOrigin = e.childOrigin, this.events = {}, this.listener = (t) => {
|
|
17
17
|
if (!m(t, this.childOrigin)) return;
|
|
@@ -21,7 +21,7 @@ class y {
|
|
|
21
21
|
}
|
|
22
22
|
get(e) {
|
|
23
23
|
return new l.Promise((t) => {
|
|
24
|
-
const s = ++
|
|
24
|
+
const s = ++y, r = (a) => {
|
|
25
25
|
a.data.uid === s && a.data.postmate === "reply" && (this.parent.removeEventListener("message", r, !1), t(a.data.value));
|
|
26
26
|
};
|
|
27
27
|
this.parent.addEventListener("message", r, !1), this.child.postMessage(
|
|
@@ -53,13 +53,13 @@ class y {
|
|
|
53
53
|
window.removeEventListener("message", this.listener, !1), this.frame.parentNode.removeChild(this.frame);
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
|
-
class
|
|
56
|
+
class U {
|
|
57
57
|
constructor(e) {
|
|
58
58
|
this.model = e.model, this.parent = e.parent, this.parentOrigin = e.parentOrigin, this.child = e.child, this.child.addEventListener("message", (t) => {
|
|
59
59
|
if (!m(t, this.parentOrigin)) return;
|
|
60
|
-
const { postmate: s, property: r, uid: a, data:
|
|
60
|
+
const { postmate: s, property: r, uid: a, data: o } = t.data, n = this.model[r];
|
|
61
61
|
if (s !== "call") {
|
|
62
|
-
const h = typeof
|
|
62
|
+
const h = typeof n == "function" ? n() : n;
|
|
63
63
|
l.Promise.resolve(h).then((c) => {
|
|
64
64
|
t.source.postMessage(
|
|
65
65
|
{
|
|
@@ -72,7 +72,7 @@ class w {
|
|
|
72
72
|
t.origin
|
|
73
73
|
);
|
|
74
74
|
});
|
|
75
|
-
} else r in this.model && typeof
|
|
75
|
+
} else r in this.model && typeof n == "function" && n(o);
|
|
76
76
|
});
|
|
77
77
|
}
|
|
78
78
|
emit(e, t) {
|
|
@@ -94,16 +94,16 @@ class l {
|
|
|
94
94
|
const t = (() => {
|
|
95
95
|
const a = document.createElement("a");
|
|
96
96
|
a.href = e;
|
|
97
|
-
const
|
|
98
|
-
return a.origin || `${
|
|
97
|
+
const o = a.protocol.length > 4 ? a.protocol : window.location.protocol, n = a.host.length ? a.port === "80" || a.port === "443" ? a.hostname : a.host : window.location.host;
|
|
98
|
+
return a.origin || `${o}//${n}`;
|
|
99
99
|
})();
|
|
100
100
|
let s = 0, r;
|
|
101
|
-
return new l.Promise((a,
|
|
102
|
-
const
|
|
101
|
+
return new l.Promise((a, o) => {
|
|
102
|
+
const n = (d) => {
|
|
103
103
|
if (!m(d, t)) return !1;
|
|
104
|
-
d.data.postmate === "handshake-reply" ? (clearInterval(r), this.parent.removeEventListener("message",
|
|
104
|
+
d.data.postmate === "handshake-reply" ? (clearInterval(r), this.parent.removeEventListener("message", n, !1), this.childOrigin = d.origin, a(new w(this))) : o("Failed handshake");
|
|
105
105
|
};
|
|
106
|
-
this.parent.addEventListener("message",
|
|
106
|
+
this.parent.addEventListener("message", n, !1);
|
|
107
107
|
const h = () => {
|
|
108
108
|
s++, this.child.postMessage(
|
|
109
109
|
{
|
|
@@ -120,7 +120,7 @@ class l {
|
|
|
120
120
|
});
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
|
-
class
|
|
123
|
+
class E {
|
|
124
124
|
constructor(e) {
|
|
125
125
|
return this.child = window, this.model = e, this.parent = window.parent, this.sendHandshakeReply();
|
|
126
126
|
}
|
|
@@ -139,7 +139,7 @@ class U {
|
|
|
139
139
|
const r = s.data.model;
|
|
140
140
|
r && Object.keys(r).forEach((a) => {
|
|
141
141
|
this.model[a] = r[a];
|
|
142
|
-
}), e(new
|
|
142
|
+
}), e(new U(this));
|
|
143
143
|
}
|
|
144
144
|
}, !1);
|
|
145
145
|
});
|
|
@@ -153,26 +153,39 @@ l.Promise = (() => {
|
|
|
153
153
|
return Promise;
|
|
154
154
|
}
|
|
155
155
|
})();
|
|
156
|
-
l.Model =
|
|
156
|
+
l.Model = E;
|
|
157
157
|
function f(i, e) {
|
|
158
158
|
for (const t of i)
|
|
159
159
|
if (t.path === e || t.children && Array.isArray(t.children) && t.children.length > 0 && f(t.children, e))
|
|
160
160
|
return !0;
|
|
161
161
|
return !1;
|
|
162
162
|
}
|
|
163
|
-
function
|
|
163
|
+
function k(i, e) {
|
|
164
164
|
e.includes("?") && (e = e.split("?")[0]);
|
|
165
165
|
const t = p(i);
|
|
166
166
|
return !t || t.length === 0 ? !1 : f(t, e);
|
|
167
167
|
}
|
|
168
|
+
function P(i) {
|
|
169
|
+
const e = {
|
|
170
|
+
path: i.path,
|
|
171
|
+
name: i.name,
|
|
172
|
+
meta: i.meta || {},
|
|
173
|
+
// 确保meta是普通对象
|
|
174
|
+
redirect: i.redirect,
|
|
175
|
+
// 剔除 component、beforeEnter 等可能包含函数/对象引用的字段
|
|
176
|
+
// 如果需要children,递归净化
|
|
177
|
+
children: i.children ? i.children.map((t) => P(t)) : []
|
|
178
|
+
};
|
|
179
|
+
return e.meta = JSON.parse(JSON.stringify(e.meta)), e;
|
|
180
|
+
}
|
|
168
181
|
function p(i) {
|
|
169
182
|
let e = [];
|
|
170
|
-
return typeof i.getRoutes == "function" ? e = i.getRoutes() : i.options && Array.isArray(i.options.routes) && (e = i.options.routes), e || [];
|
|
183
|
+
return typeof i.getRoutes == "function" ? e = i.getRoutes() : i.options && Array.isArray(i.options.routes) && (e = i.options.routes), e.map((t) => P(t)) || [];
|
|
171
184
|
}
|
|
172
|
-
function
|
|
185
|
+
function C(i, e) {
|
|
173
186
|
try {
|
|
174
|
-
const t = new URL(i), s = new URL(e), r = t.protocol.toLowerCase() === s.protocol.toLowerCase(), a = t.hostname === s.hostname,
|
|
175
|
-
return r && a &&
|
|
187
|
+
const t = new URL(i), s = new URL(e), r = t.protocol.toLowerCase() === s.protocol.toLowerCase(), a = t.hostname === s.hostname, o = t.port === s.port;
|
|
188
|
+
return r && a && o;
|
|
176
189
|
} catch (t) {
|
|
177
190
|
return console.error("URL解析错误:", t), !1;
|
|
178
191
|
}
|
|
@@ -188,7 +201,7 @@ const g = () => {
|
|
|
188
201
|
return t;
|
|
189
202
|
};
|
|
190
203
|
};
|
|
191
|
-
class
|
|
204
|
+
class I {
|
|
192
205
|
constructor(e, t, s) {
|
|
193
206
|
this.childPostmate = null, this.parentPostmate = null, this.isGetData = !1, this.getDataCllBack = null, this.router = null, this.routeUpdateCallback = void 0, this.router = t, this.routeUpdateCallback = s, window.top !== window.self ? this.init(e) : e.error({ status: 500, data: null, message: "未在一体化平台中运行" });
|
|
194
207
|
}
|
|
@@ -216,7 +229,7 @@ class C {
|
|
|
216
229
|
},
|
|
217
230
|
// 检查路由是否存在
|
|
218
231
|
isRouteExists(s) {
|
|
219
|
-
t.router ? t.parentPostmate.emit("routeExists",
|
|
232
|
+
t.router ? t.parentPostmate.emit("routeExists", k(t.router, s)) : t.parentPostmate.emit("routeExists", !1);
|
|
220
233
|
},
|
|
221
234
|
// 处理路由更新
|
|
222
235
|
routeUpdate(s) {
|
|
@@ -271,7 +284,7 @@ class C {
|
|
|
271
284
|
this.parentPostmate && this.parentPostmate.emit("otherRequest", e);
|
|
272
285
|
}
|
|
273
286
|
}
|
|
274
|
-
class
|
|
287
|
+
class S {
|
|
275
288
|
constructor(e, t, s = "", r) {
|
|
276
289
|
this.postmateParent = null, this.dataInfo = {
|
|
277
290
|
loginInfo: {},
|
|
@@ -286,13 +299,13 @@ class I {
|
|
|
286
299
|
parseUrl(e) {
|
|
287
300
|
const t = document.createElement("a");
|
|
288
301
|
t.href = e;
|
|
289
|
-
const s = t.protocol.length > 4 ? t.protocol : window.location.protocol, r = t.hostname, a = t.port || (s === "https:" ? "443" : s === "http:" ? "80" : ""),
|
|
302
|
+
const s = t.protocol.length > 4 ? t.protocol : window.location.protocol, r = t.hostname, a = t.port || (s === "https:" ? "443" : s === "http:" ? "80" : ""), o = t.pathname.startsWith("/") ? t.pathname : `/${t.pathname}`, n = t.search, h = t.hash.slice(2, t.hash.length), c = t.origin || `${s}//${r}${a ? `:${a}` : ""}`, d = `${o}${h}`;
|
|
290
303
|
return {
|
|
291
304
|
protocol: s,
|
|
292
305
|
host: r,
|
|
293
306
|
port: a,
|
|
294
|
-
pathname:
|
|
295
|
-
search:
|
|
307
|
+
pathname: o,
|
|
308
|
+
search: n,
|
|
296
309
|
hash: h,
|
|
297
310
|
origin: c,
|
|
298
311
|
fullPath: d
|
|
@@ -367,7 +380,7 @@ class I {
|
|
|
367
380
|
this.currentUrl = e, this.currentRouterPath = t, this.iframeEle ? this.init() : console.error("【ParentPostmate】无 iframe 容器,无法初始化");
|
|
368
381
|
return;
|
|
369
382
|
}
|
|
370
|
-
if (!this.childSupportsRouteUpdate || !((r = this.childRoutes) != null && r.length) || !
|
|
383
|
+
if (!this.childSupportsRouteUpdate || !((r = this.childRoutes) != null && r.length) || !C(this.currentUrl, e)) {
|
|
371
384
|
this.currentUrl = e, this.currentRouterPath = t, this.init();
|
|
372
385
|
return;
|
|
373
386
|
}
|
|
@@ -419,7 +432,7 @@ class I {
|
|
|
419
432
|
}
|
|
420
433
|
}
|
|
421
434
|
export {
|
|
422
|
-
|
|
423
|
-
|
|
435
|
+
I as ChildPostmate,
|
|
436
|
+
S as ParentPostmate
|
|
424
437
|
};
|
|
425
438
|
//# sourceMappingURL=index.mjs.map
|
package/lib/index.mjs.gz
CHANGED
|
Binary file
|
package/lib/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../packages/postMeta/postMeta.js","../packages/postMeta/tools.ts","../packages/postMeta/ChildPostmate.ts","../packages/postMeta/ParentPostmate.ts"],"sourcesContent":["const MESSAGE_TYPE = \"application/x-postmate-v1+json\";\r\nlet uid = 0;\r\n\r\nconst allowedPostmateTypes = {\r\n handshake: 1,\r\n \"handshake-reply\": 1,\r\n call: 1,\r\n emit: 1,\r\n reply: 1,\r\n request: 1,\r\n};\r\n\r\n// 校验消息是否来自合法的来源\r\nfunction isValidMessage(event, allowedOrigin) {\r\n return (\r\n (typeof allowedOrigin !== \"string\" || event.origin === allowedOrigin) &&\r\n !!event.data &&\r\n (typeof event.data !== \"object\" || \"postmate\" in event.data) &&\r\n event.data.type === MESSAGE_TYPE &&\r\n !!allowedPostmateTypes[event.data.postmate]\r\n );\r\n}\r\n\r\n// ----------------- ParentAPI -----------------\r\nclass ParentAPI {\r\n constructor(config) {\r\n this.parent = config.parent;\r\n this.frame = config.frame;\r\n this.child = config.child;\r\n this.childOrigin = config.childOrigin;\r\n this.events = {};\r\n\r\n this.listener = (event) => {\r\n if (!isValidMessage(event, this.childOrigin)) return;\r\n const { value = {} } = event.data;\r\n const { name, data } = value;\r\n if (event.data.postmate === \"emit\" && name in this.events) {\r\n this.events[name].call(this, data);\r\n }\r\n };\r\n\r\n this.parent.addEventListener(\"message\", this.listener, false);\r\n }\r\n\r\n get(property) {\r\n return new Postmate.Promise((resolve) => {\r\n const id = ++uid;\r\n const handler = (event) => {\r\n if (event.data.uid === id && event.data.postmate === \"reply\") {\r\n this.parent.removeEventListener(\"message\", handler, false);\r\n resolve(event.data.value);\r\n }\r\n };\r\n this.parent.addEventListener(\"message\", handler, false);\r\n this.child.postMessage(\r\n {\r\n postmate: \"request\",\r\n type: MESSAGE_TYPE,\r\n property,\r\n uid: id,\r\n },\r\n this.childOrigin\r\n );\r\n });\r\n }\r\n\r\n call(method, data) {\r\n this.child.postMessage(\r\n {\r\n postmate: \"call\",\r\n type: MESSAGE_TYPE,\r\n property: method,\r\n data,\r\n },\r\n this.childOrigin\r\n );\r\n }\r\n\r\n on(event, callback) {\r\n this.events[event] = callback;\r\n }\r\n\r\n destroy() {\r\n window.removeEventListener(\"message\", this.listener, false);\r\n this.frame.parentNode.removeChild(this.frame);\r\n }\r\n}\r\n\r\n// ----------------- ChildAPI -----------------\r\nclass ChildAPI {\r\n constructor(config) {\r\n this.model = config.model;\r\n this.parent = config.parent;\r\n this.parentOrigin = config.parentOrigin;\r\n this.child = config.child;\r\n\r\n this.child.addEventListener(\"message\", (event) => {\r\n if (!isValidMessage(event, this.parentOrigin)) return;\r\n\r\n const { postmate, property, uid, data } = event.data;\r\n const value = this.model[property];\r\n\r\n if (postmate !== \"call\") {\r\n const result = typeof value === \"function\" ? value() : value;\r\n Postmate.Promise.resolve(result).then((res) => {\r\n event.source.postMessage(\r\n {\r\n property,\r\n postmate: \"reply\",\r\n type: MESSAGE_TYPE,\r\n uid,\r\n value: res,\r\n },\r\n event.origin\r\n );\r\n });\r\n } else if (property in this.model && typeof value === \"function\") {\r\n value(data);\r\n }\r\n });\r\n }\r\n\r\n emit(eventName, data) {\r\n this.parent.postMessage(\r\n {\r\n postmate: \"emit\",\r\n type: MESSAGE_TYPE,\r\n value: { name: eventName, data },\r\n },\r\n this.parentOrigin\r\n );\r\n }\r\n}\r\n\r\n// ----------------- Postmate -----------------\r\nclass Postmate {\r\n constructor({ container = document.body, model, url, name, classListArray = [] }) {\r\n this.parent = window;\r\n this.frame = document.createElement(\"iframe\");\r\n this.frame.name = name || \"\";\r\n this.frame.classList.add(...classListArray);\r\n container.appendChild(this.frame);\r\n\r\n this.child = this.frame.contentWindow;\r\n this.model = model || {};\r\n\r\n return this.sendHandshake(url);\r\n }\r\n\r\n sendHandshake(url) {\r\n const origin = (() => {\r\n const link = document.createElement(\"a\");\r\n link.href = url;\r\n const protocol = link.protocol.length > 4 ? link.protocol : window.location.protocol;\r\n const host = link.host.length ? (link.port === \"80\" || link.port === \"443\" ? link.hostname : link.host) : window.location.host;\r\n return link.origin || `${protocol}//${host}`;\r\n })();\r\n\r\n let attemptCount = 0;\r\n let interval;\r\n\r\n return new Postmate.Promise((resolve, reject) => {\r\n const listener = (event) => {\r\n if (!isValidMessage(event, origin)) return false;\r\n if (event.data.postmate === \"handshake-reply\") {\r\n clearInterval(interval);\r\n this.parent.removeEventListener(\"message\", listener, false);\r\n this.childOrigin = event.origin;\r\n resolve(new ParentAPI(this));\r\n } else {\r\n reject(\"Failed handshake\");\r\n }\r\n };\r\n\r\n this.parent.addEventListener(\"message\", listener, false);\r\n\r\n const send = () => {\r\n attemptCount++;\r\n this.child.postMessage(\r\n {\r\n postmate: \"handshake\",\r\n type: MESSAGE_TYPE,\r\n model: this.model,\r\n },\r\n origin\r\n );\r\n if (attemptCount === 5) clearInterval(interval);\r\n };\r\n\r\n const init = () => {\r\n send();\r\n interval = setInterval(send, 500);\r\n };\r\n\r\n this.frame.onload = init;\r\n this.frame.attachEvent && this.frame.attachEvent(\"onload\", init);\r\n this.frame.src = url;\r\n });\r\n }\r\n}\r\n\r\n// ----------------- Model -----------------\r\nclass Model {\r\n constructor(model) {\r\n this.child = window;\r\n this.model = model;\r\n this.parent = window.parent;\r\n\r\n return this.sendHandshakeReply();\r\n }\r\n\r\n sendHandshakeReply() {\r\n return new Postmate.Promise((resolve, reject) => {\r\n this.child.addEventListener(\"message\", (event) => {\r\n if (event.data.postmate) {\r\n if (event.data.postmate !== \"handshake\") return reject(\"Handshake Reply Failed\");\r\n\r\n this.child.removeEventListener(\"message\", this, false);\r\n event.source.postMessage(\r\n {\r\n postmate: \"handshake-reply\",\r\n type: MESSAGE_TYPE,\r\n },\r\n event.origin\r\n );\r\n\r\n this.parentOrigin = event.origin;\r\n const parentModel = event.data.model;\r\n if (parentModel) {\r\n Object.keys(parentModel).forEach((key) => {\r\n this.model[key] = parentModel[key];\r\n });\r\n }\r\n resolve(new ChildAPI(this));\r\n }\r\n }, false);\r\n });\r\n }\r\n}\r\n\r\n// Attach defaults\r\nPostmate.debug = false;\r\nPostmate.Promise = (() => {\r\n try {\r\n return typeof window !== \"undefined\" ? window.Promise : Promise;\r\n } catch {\r\n return Promise;\r\n }\r\n})();\r\nPostmate.Model = Model;\r\n\r\nexport default Postmate;\r\nexport { Model };\r\n","/**\r\n * 检查路径是否存在于路由配置中(递归检查所有层级)\r\n * @param routes 路由配置数组\r\n * @param path 需要检查的路径\r\n * @returns 是否存在\r\n */\r\nexport function checkPathInRoutes(routes: any[], path: string): boolean {\r\n for (const route of routes) {\r\n // 检查当前路由\r\n if (route.path === path) {\r\n return true;\r\n }\r\n\r\n // 递归检查子路由\r\n if (route.children && Array.isArray(route.children) && route.children.length > 0) {\r\n if (checkPathInRoutes(route.children, path)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * 判断路径是否存在于vue-router对象中(兼容Vue2和Vue3)\r\n * @param router vue-router实例\r\n * @param path 需要检查的页面路径\r\n * @returns 路径是否存在\r\n */\r\nexport function isRouteExists(router: any, path: string): boolean {\r\n // 移除路径中的查询参数\r\n if (path.includes('?')) {\r\n path = path.split('?')[0];\r\n }\r\n const routes = getRouterPaths(router);\r\n if (!routes || routes.length === 0) return false;\r\n return checkPathInRoutes(routes, path);\r\n}\r\n\r\n/**\r\n * 获取路由路径\r\n *\r\n */\r\nexport function getRouterPaths(router: any): any[] {\r\n let routes: any[] = [];\r\n // 区分Vue Router 3.x (Vue2) 和 4.x (Vue3)\r\n if (typeof router.getRoutes === 'function') {\r\n // Vue Router 4.x (Vue3)\r\n routes = router.getRoutes();\r\n } else if (router.options && Array.isArray(router.options.routes)) {\r\n // Vue Router 3.x (Vue2)\r\n routes = router.options.routes;\r\n }\r\n return routes || [];\r\n}\r\n\r\n\r\n/**\r\n * 比较两个URL的协议、IP(或域名)和端口是否完全相同\r\n * @param url1 第一个URL字符串\r\n * @param url2 第二个URL字符串\r\n * @returns 如果协议、IP(或域名)和端口都相同则返回true,否则返回false;解析失败时返回false\r\n */\r\nexport function areUrlsSameProtocolIpPort(url1: string, url2: string): boolean {\r\n try {\r\n // 解析两个URL\r\n const parsedUrl1 = new URL(url1);\r\n const parsedUrl2 = new URL(url2);\r\n \r\n // 比较协议(不区分大小写,但通常URL协议是小写的)\r\n const sameProtocol = parsedUrl1.protocol.toLowerCase() === parsedUrl2.protocol.toLowerCase();\r\n \r\n // 比较主机(IP或域名)\r\n const sameHost = parsedUrl1.hostname === parsedUrl2.hostname;\r\n \r\n // 比较端口(如果未指定端口,会使用协议默认端口)\r\n const samePort = parsedUrl1.port === parsedUrl2.port;\r\n \r\n // 只有所有部分都相同时才返回true\r\n return sameProtocol && sameHost && samePort;\r\n } catch (error) {\r\n // 如果URL解析失败,返回false\r\n console.error('URL解析错误:', error);\r\n return false;\r\n }\r\n}\r\n\r\n\r\nexport const getCircularReplacer = () => {\r\n\tconst seen = new WeakSet();\r\n\treturn (key, value) => {\r\n\t\tif (typeof value === 'object' && value !== null) {\r\n\t\t\tif (seen.has(value)) {\r\n\t\t\t\t// 遇到循环引用时,返回一个标识或忽略\r\n\t\t\t\treturn '[Circular Reference]';\r\n\t\t\t}\r\n\t\t\tseen.add(value);\r\n\t\t}\r\n\t\treturn value;\r\n\t};\r\n};","import Postmate from './postMeta';\nimport { getCircularReplacer, getRouterPaths, isRouteExists } from './tools';\n\ninterface EventObj {\n\terror: (error: any) => void;\n\tsuccess: (success: any) => void;\n\treceive: (receive: any) => void;\n}\n\n// 路由更新接口\ninterface RouteUpdateInfo {\n\tfullPath: string;\n}\n\nexport default class ChildPostmate {\n\tchildPostmate: any = null;\n\tparentPostmate: any = null;\n\n\tisGetData: boolean = false;\n\tgetDataCllBack: Function | null = null;\n\n\t// Vue Router实例\n\trouter: any = null;\n\t// 路由更新回调函数\n\trouteUpdateCallback: ((routeInfo: RouteUpdateInfo) => void) | undefined = undefined;\n\n\tconstructor(eventObj: EventObj, router: any, routeUpdateCallback?: (routeInfo: RouteUpdateInfo) => void) {\n\t\t// 保存router实例\n\t\tthis.router = router;\n\t\t// 保存路由更新回调函数\n\t\tthis.routeUpdateCallback = routeUpdateCallback;\n\n\t\tif (window.top !== window.self) this.init(eventObj);\n\t\telse {\n\t\t\teventObj.error({ status: 500, data: null, message: '未在一体化平台中运行' });\n\t\t}\n\t}\n\n\tinit(eventObj: EventObj) {\n\t\tconst that = this;\n\t\t// 创建 Postmate Model(作为子)\n\t\tthis.childPostmate = new Postmate.Model({\n\t\t\t// 定义子页面可以暴露给父页面的方法\n\t\t\tbaseData(data: any) {\n\t\t\t\tdata = JSON.parse(data);\n\t\t\t\tif (that.isGetData) {\n\t\t\t\t\tthat.getDataCllBack &&\n\t\t\t\t\t\tthat.getDataCllBack({\n\t\t\t\t\t\t\tstatus: 200,\n\t\t\t\t\t\t\tmessage: 'success',\n\t\t\t\t\t\t\tdata: data,\n\t\t\t\t\t\t});\n\t\t\t\t} else\n\t\t\t\t\teventObj.receive({\n\t\t\t\t\t\tstatus: 200,\n\t\t\t\t\t\tmessage: 'success',\n\t\t\t\t\t\tdata: data,\n\t\t\t\t\t});\n\t\t\t\tthat.isGetData = false;\n\t\t\t},\n\n\t\t\t// 提供当前系统的路由\n\t\t\tgetRoutes: () => {\n\t\t\t\t// 有路由\n\t\t\t\tif (that.router) {\n\t\t\t\t\tlet arr = getRouterPaths(that.router);\n\t\t\t\t\tthat.parentPostmate.emit('pushRoutes', JSON.stringify(arr, getCircularReplacer()));\n\t\t\t\t}\n\t\t\t\t// 无路由\n\t\t\t\telse that.parentPostmate.emit('pushRoutes');\n\t\t\t},\n\n\t\t\t// 检查路由是否存在\n\t\t\tisRouteExists(routePath: string) {\n\t\t\t\tif (that.router) that.parentPostmate.emit('routeExists', isRouteExists(that.router, routePath));\n\t\t\t\telse that.parentPostmate.emit('routeExists', false);\n\t\t\t},\n\n\t\t\t// 处理路由更新\n\t\t\trouteUpdate(routeInfoStr: string) {\n\t\t\t\t// 向父页面同步路由数据\n\t\t\t\ttry {\n\t\t\t\t\tconst routeInfo: RouteUpdateInfo = JSON.parse(routeInfoStr);\n\n\t\t\t\t\t// 如果提供了自定义的路由更新回调函数,则调用它\n\t\t\t\t\tif (that.routeUpdateCallback) {\n\t\t\t\t\t\tthat.routeUpdateCallback(routeInfo);\n\t\t\t\t\t\tthat.parentPostmate.emit('route_update_result', true);\n\t\t\t\t\t\tconsole.log('----------------- 【ChildPastMate】路由更新完成 -----------------');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// 如果提供了router实例,则使用router进行路由更新\n\t\t\t\t\tif (that.router) {\n\t\t\t\t\t\tthat.router.replace(routeInfo.fullPath);\n\t\t\t\t\t\tthat.parentPostmate.emit('route_update_result', true);\n\t\t\t\t\t\tconsole.log('----------------- 【ChildPastMate】路由更新完成 -----------------');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthat.parentPostmate.emit('route_update_result', false);\n\t\t\t\t\t\tconsole.warn('【ChildPastMate】未提供router实例,无法进行路由更新');\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('【ChildPastMate】路由更新失败:', error);\n\t\t\t\t\tthat.parentPostmate.emit('route_update_result', false);\n\t\t\t\t}\n\t\t\t},\n\t\t})\n\t\t\t.then((parent: any) => {\n\t\t\t\tthat.parentPostmate = parent;\n\t\t\t\tthat.getData();\n\t\t\t\t// 与父页面链接建立成功\n\t\t\t\teventObj.success({\n\t\t\t\t\tstatus: 200,\n\t\t\t\t\tmessage: 'success',\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tChildPostmate: parent,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\t// 告诉父系统支持路由更新\n\t\t\t\tthat.parentPostmate.emit('route_update_support', that.router ? true : false);\n\n\t\t\t\t// 向父页面同步路由数据\n\t\t\t\tthat.router && that.parentPostmate.emit('pushRoutes', JSON.stringify(getRouterPaths(that.router), getCircularReplacer()));\n\t\t\t})\n\t\t\t.catch((err: any) => {\n\t\t\t\teventObj.error({ status: 500, data: null, message: err });\n\t\t\t});\n\t}\n\n\t// 获取数据\n\tgetData(callback?: any) {\n\t\tif (!this.parentPostmate) {\n\t\t\tcallback({\n\t\t\t\tstatus: 500,\n\t\t\t\tmessage: '父页面未连接',\n\t\t\t\tdata: null,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (callback) {\n\t\t\tthis.isGetData = true;\n\t\t\tthis.getDataCllBack = callback;\n\t\t} else {\n\t\t\tthis.isGetData = false;\n\t\t\tthis.getDataCllBack = null;\n\t\t}\n\t\t// 向父页面获取数据\n\t\tthis.parentPostmate.emit('requestBaseData');\n\t}\n\n\t/**\n\t * 设置路由实例和路由更新回调\n\t * @param router Vue Router实例\n\t * @param routeUpdateCallback 自定义路由更新回调函数\n\t */\n\tsetRouter(router: any, routeUpdateCallback?: (routeInfo: RouteUpdateInfo) => void) {\n\t\tthis.router = router;\n\t\tif (routeUpdateCallback) {\n\t\t\tthis.routeUpdateCallback = routeUpdateCallback;\n\t\t}\n\t}\n\n\t/**\n\t * 向父页面发送其他请求\n\t * @param params 请求参数\n\t */\n\tsendOtherRequest(params: any) {\n\t\tif (!this.parentPostmate) return;\n\t\tthis.parentPostmate.emit('otherRequest', params);\n\t}\n}\n","import Postmate from './postMeta';\nimport { areUrlsSameProtocolIpPort, checkPathInRoutes } from './tools';\n\ninterface DataInfo {\n\tloginInfo: { [x: string]: any };\n\ttoken: string;\n\tisHideHeader: boolean;\n}\n\n// URL解析结果接口\ninterface ParsedUrl {\n\tprotocol: string;\n\thost: string;\n\tport: string;\n\tpathname: string;\n\tsearch: string;\n\thash: string;\n\torigin: string;\n\tfullPath: string;\n}\n\nexport default class ParentPostmate {\n\t/** 连接到的子 postmate 实例 */\n\tpostmateParent: any = null;\n\t/** 通讯数据 */\n\tdataInfo: DataInfo = {\n\t\tloginInfo: {},\n\t\ttoken: '',\n\t\tisHideHeader: true,\n\t};\n\t/** iframe Dom 容器 */\n\tiframeEle: any = null;\n\t/** 当前 iframe url */\n\tcurrentUrl: string = '';\n\t/** 当前url基础地址 */\n\tcurrentBaseUrl: string = '';\n\t/** 当前路由地址 */\n\tcurrentRouterPath: string = '';\n\t/** 存储当前的 iframe 元素 */\n\tcurrentIframe: any = null;\n\t/** iframe 加载完成执行函数 */\n\tloadFunction: (() => void) | null = null;\n\t/** 处理子类的其他请求方法 */\n\thandleOtherRequest: ((params: any) => void) | null = null;\n\t/** 当前URL解析结果 */\n\tparsedCurrentUrl: ParsedUrl | null = null;\n\t/** 子页面是否支持路由更新 */\n\tchildSupportsRouteUpdate: boolean = true;\n\t/** 子系统的路由列表 */\n\tchildRoutes: any[] = [];\n\n\teventBus: any = {\n\t\tgetRoutes: null,\n\t\troute_update_resultL: null,\n\t};\n\n\tconstructor(dataInfo: DataInfo, iframeEle: HTMLElement | (() => HTMLElement), iframeUrl: string = '', handleOtherRequest?: (params: any) => void) {\n\t\tthis.dataInfo = dataInfo || this.dataInfo;\n\t\tthis.iframeEle = iframeEle;\n\t\tthis.setIframeUrl(iframeUrl);\n\t\thandleOtherRequest && (this.handleOtherRequest = handleOtherRequest);\n\t}\n\n\t/** 解析URL */\n\tparseUrl(url: string): ParsedUrl {\n\t\tconst link = document.createElement('a');\n\t\tlink.href = url;\n\n\t\t// 获取协议\n\t\tconst protocol = link.protocol.length > 4 ? link.protocol : window.location.protocol;\n\n\t\t// 获取主机和端口\n\t\tconst host = link.hostname;\n\t\tconst port = link.port || (protocol === 'https:' ? '443' : protocol === 'http:' ? '80' : '');\n\n\t\t// 获取路径、查询参数和哈希\n\t\tconst pathname = link.pathname.startsWith('/') ? link.pathname : `/${link.pathname}`;\n\t\tconst search = link.search;\n\t\tconst hash = link.hash.slice(2, link.hash.length);\n\n\t\t// 构建origin\n\t\tconst origin = link.origin || `${protocol}//${host}${port ? `:${port}` : ''}`;\n\n\t\t// 构建完整路径(不包含origin)\n\t\tconst fullPath = `${pathname}${hash}`;\n\n\t\treturn {\n\t\t\tprotocol,\n\t\t\thost,\n\t\t\tport,\n\t\t\tpathname,\n\t\t\tsearch,\n\t\t\thash,\n\t\t\torigin,\n\t\t\tfullPath,\n\t\t};\n\t}\n\n\t/** 比较两个URL是否相同*/\n\tcompareUrlBase(url1: string, url2: string): boolean {\n\t\tconst url1End = url1.endsWith('/');\n\t\tconst url2End = url2.endsWith('/');\n\t\tif ((url1End && url2End) || (!url1End && !url2End)) {\n\t\t\treturn url1 === url2;\n\t\t} else {\n\t\t\tif (url1End) url2 += '/';\n\t\t\tif (url2End) url1 += '/';\n\t\t\treturn url1 === url2;\n\t\t}\n\t}\n\n\t/** 比较两个URL的路径是否相同(不包含查询参数和哈希) */\n\tcompareUrlPath(url1: string, url2: string): boolean {\n\t\tif (!url1 || !url2) return false;\n\n\t\tconst parsed1 = this.parseUrl(url1);\n\t\tconst parsed2 = this.parseUrl(url2);\n\n\t\treturn parsed1.pathname === parsed2.pathname;\n\t}\n\n\t/** 比较两个URL是否完全相同(包括查询参数和哈希) */\n\tcompareUrlFull(url1: string, url2: string): boolean {\n\t\tif (!url1 || !url2) return false;\n\n\t\tconst parsed1 = this.parseUrl(url1);\n\t\tconst parsed2 = this.parseUrl(url2);\n\n\t\treturn parsed1.fullPath === parsed2.fullPath;\n\t}\n\n\t/** 清除当前的 iframe 和 postmate 实例 */\n\tclear() {\n\t\t// 销毁 postmate 实例\n\t\tif (this.postmateParent) {\n\t\t\tthis.postmateParent.destroy();\n\t\t\tthis.postmateParent = null;\n\t\t}\n\n\t\t// 移除 iframe\n\t\tif (this.currentIframe && this.currentIframe.parentNode) {\n\t\t\tthis.currentIframe.parentNode.removeChild(this.currentIframe);\n\t\t}\n\t\tthis.currentIframe = null;\n\t}\n\n\t/** 初始化 */\n\tasync init(callback: any = null) {\n\t\t// 清除之前的实例和 iframe\n\t\tthis.clear();\n\n\t\t// 重置子页面路由更新支持标记\n\t\tthis.childSupportsRouteUpdate = false;\n\n\t\t// 如果没有容器,或集成链接\n\t\tif (!this.iframeEle || !this.currentUrl) {\n\t\t\tthis.destroy();\n\t\t}\n\n\t\t// 获取 iframe 容器\n\t\tconst container: any = typeof this.iframeEle === 'function' ? this.iframeEle() : this.iframeEle;\n\t\tif (!container) {\n\t\t\tconsole.warn('【ParentPostmate】无法获取 iframe 容器');\n\t\t\treturn;\n\t\t}\n\n\t\t// 创建 Postmate 实例(作为父)\n\t\tconst handshake: any = new Postmate({\n\t\t\tcontainer,\n\t\t\turl: this.currentUrl,\n\t\t\tname: '',\n\t\t\tmodel: '',\n\t\t});\n\n\t\t// 存储当前创建的 iframe\n\t\tthis.currentIframe = container.querySelector('iframe');\n\t\tthis.currentIframe.setAttribute('frameborder', '0');\n\t\tthis.currentIframe.setAttribute('allow', 'fullscreen');\n\t\tthis.currentIframe.addEventListener('load', () => {\n\t\t\tthis.loadFunction && this.loadFunction();\n\t\t});\n\n\t\thandshake\n\t\t\t.then((parent: any) => {\n\t\t\t\tthis.postmateParent = parent;\n\n\t\t\t\t// 监听子页面发来的获取数据请求\n\t\t\t\tparent.on('requestBaseData', () => {\n\t\t\t\t\t// 发送相关数据\n\t\t\t\t\tthis.sendData();\n\t\t\t\t});\n\n\t\t\t\t// 监听子页面发来的路由配置数据\n\t\t\t\tparent.on('pushRoutes', (routes: string) => {\n\t\t\t\t\tif (routes) this.childRoutes = JSON.parse(routes);\n\t\t\t\t\telse this.childRoutes = [];\n\t\t\t\t\tthis.eventBus.getRoutes && this.eventBus.getRoutes();\n\t\t\t\t});\n\n\t\t\t\t// 监听子页面的路由效验结果\n\t\t\t\tparent.on('routeExists', (flag: boolean) => {});\n\n\t\t\t\t// 监听子页面的动态路由变更支持\n\t\t\t\tparent.on('route_update_support', (flag: boolean) => {\n\t\t\t\t\tthis.childSupportsRouteUpdate = flag;\n\t\t\t\t});\n\n\t\t\t\t// 监听子页面的路由变更结果\n\t\t\t\tparent.on('route_update_result', (flag: boolean) => {\n\t\t\t\t\tthis.eventBus.route_update_result && this.eventBus.route_update_result(flag);\n\t\t\t\t});\n\n\t\t\t\t// 监听子页面发来的其他请求\n\t\t\t\tparent.on('otherRequest', (params: any) => {\n\t\t\t\t\tthis.handleOtherRequest && this.handleOtherRequest(params);\n\t\t\t\t});\n\n\t\t\t\tif (typeof callback === 'function') callback();\n\t\t\t})\n\t\t\t.catch((error: any) => {\n\t\t\t\tconsole.error('【ParentPostmate】Postmate 连接失败:', error);\n\t\t\t});\n\t}\n\n\t/** 设置load执行事件 */\n\tsetLoadFunction(loadFunction: () => void) {\n\t\tthis.loadFunction = loadFunction;\n\t}\n\n\t/** 设置 iframe url */\n\tsetIframeUrl(iframeUrl: string, routerPath: string = '') {\n\t\t// 如果传入了路由,则对路径进行规范处理\n\t\tif (routerPath && !routerPath.startsWith('/')) {\n\t\t\trouterPath = '/' + routerPath;\n\t\t}\n\n\t\t// 1、传入的地址为空:销毁当前实例\n\t\tif (!iframeUrl) {\n\t\t\tthis.currentUrl = '';\n\t\t\tthis.currentRouterPath = '';\n\t\t\tthis.destroy();\n\t\t\tconsole.error('【ParentPostmate】无加载地址,无法初始化');\n\t\t\treturn;\n\t\t}\n\n\t\t// 2、如果当前无连接:直接设置并初始化\n\t\tif (!this.postmateParent || !this.currentUrl) {\n\t\t\tthis.currentUrl = iframeUrl;\n\t\t\tthis.currentRouterPath = routerPath;\n\t\t\tif (this.iframeEle) this.init();\n\t\t\telse console.error('【ParentPostmate】无 iframe 容器,无法初始化');\n\t\t\treturn;\n\t\t}\n\n\t\t// 3、如果当前系统不支持路由更新 或 新旧系统协议、ip、端口不同则重新初始化: 重新初始化\n\t\tif (!this.childSupportsRouteUpdate || !this.childRoutes?.length || !areUrlsSameProtocolIpPort(this.currentUrl, iframeUrl)) {\n\t\t\tthis.currentUrl = iframeUrl;\n\t\t\tthis.currentRouterPath = routerPath;\n\t\t\tthis.init();\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * 因新旧地址的基础地址完全相同,且已加载系统支持路由更新\n\t\t * 下面处理新旧地址的url,研判操作方式\n\t\t **/\n\t\t// 更新路由列表\n\t\tlet flag = false;\n\t\tthis.eventBus.getRoutes = () => {\n\t\t\tflag = true;\n\t\t\tthis.handleSimilarUrl(iframeUrl, routerPath);\n\t\t};\n\t\tthis.postmateParent.call('getRoutes');\n\n\t\tsetTimeout(() => {\n\t\t\tif (flag) return;\n\t\t\tthis.handleSimilarUrl(iframeUrl, routerPath);\n\t\t}, 1000);\n\t}\n\n\t// 处理相似地址\n\thandleSimilarUrl(iframeUrl: string, routerPath?: string) {\n\t\tthis.currentUrl = iframeUrl;\n\t\tthis.currentRouterPath = routerPath || '';\n\n\t\t// 1 如果传入了routerPath,将该值与子系统匹配,判断是否可以直接跳转\n\t\tif (routerPath && checkPathInRoutes(this.childRoutes, routerPath)) {\n\t\t\t// 触发更新路由\n\t\t\tthis.sendRouteUpdate({\n\t\t\t\tfullPath: routerPath,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// 2 通过已加载子系统的路由列表匹配新链接的尾部路径,如果匹配到,则触发路由更新\n\t\tlet isEnd = false;\n\t\tlet noQueryUrl = iframeUrl.split('?')[0];\n\t\tthis.childRoutes.forEach((v) => {\n\t\t\tif (noQueryUrl.endsWith(v.path)) {\n\t\t\t\t// 触发更新路由\n\t\t\t\tthis.sendRouteUpdate({\n\t\t\t\t\tfullPath: v.path,\n\t\t\t\t});\n\t\t\t\tisEnd = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t});\n\t\tif (isEnd) return;\n\n\t\t// 3 如果以上两种情况都不满足,则重新初始化\n\t\tthis.init();\n\t}\n\n\t/** 向子页面发送路由更新消息 */\n\tsendRouteUpdate(parsedUrl: any) {\n\t\ttry {\n\t\t\tlet flag = false;\n\t\t\tthis.eventBus.route_update_result = (state: boolean) => {\n\t\t\t\tflag = state;\n\t\t\t\tthis.loadFunction && this.loadFunction();\n\t\t\t};\n\t\t\tthis.postmateParent.call('routeUpdate', JSON.stringify(parsedUrl));\n\t\t\tconsole.log('---------------------- 【ParentPostmate】推送路由更新 ----------------------');\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (flag) return;\n\t\t\t\tconsole.warn('【ParentPostmate】推送路由更新失败,将重新初始化iframe');\n\t\t\t\t// 标记子页面不支持路由更新\n\t\t\t\tthis.childSupportsRouteUpdate = false;\n\t\t\t\t// 如果发送消息失败,则重新初始化iframe\n\t\t\t\tthis.init();\n\t\t\t}, 1000);\n\t\t} catch (error) {\n\t\t\tconsole.warn('【ParentPostmate】发送路由更新消息失败,将重新初始化iframe:', error);\n\t\t\t// 标记子页面不支持路由更新\n\t\t\tthis.childSupportsRouteUpdate = false;\n\t\t\t// 如果发送消息失败,则重新初始化iframe\n\t\t\tthis.init();\n\t\t}\n\t}\n\n\t/** 向子页面发送消息 */\n\tsendData() {\n\t\tif (!this.postmateParent) return;\n\t\tthis.postmateParent.call('baseData', JSON.stringify(this.dataInfo));\n\t}\n\n\t/** 销毁实例 */\n\tdestroy() {\n\t\tthis.clear();\n\t}\n}\n"],"names":["MESSAGE_TYPE","uid","allowedPostmateTypes","isValidMessage","event","allowedOrigin","ParentAPI","config","value","name","data","property","Postmate","resolve","id","handler","method","callback","ChildAPI","postmate","result","res","eventName","container","model","url","classListArray","origin","link","protocol","host","attemptCount","interval","reject","listener","send","init","Model","parentModel","key","checkPathInRoutes","routes","path","route","isRouteExists","router","getRouterPaths","areUrlsSameProtocolIpPort","url1","url2","parsedUrl1","parsedUrl2","sameProtocol","sameHost","samePort","error","getCircularReplacer","seen","ChildPostmate","eventObj","routeUpdateCallback","that","arr","routePath","routeInfoStr","routeInfo","parent","err","params","ParentPostmate","dataInfo","iframeEle","iframeUrl","handleOtherRequest","port","pathname","search","hash","fullPath","url1End","url2End","parsed1","parsed2","handshake","flag","loadFunction","routerPath","_a","isEnd","noQueryUrl","v","parsedUrl","state"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../packages/postMeta/postMeta.js","../packages/postMeta/tools.ts","../packages/postMeta/ChildPostmate.ts","../packages/postMeta/ParentPostmate.ts"],"sourcesContent":["const MESSAGE_TYPE = \"application/x-postmate-v1+json\";\r\nlet uid = 0;\r\n\r\nconst allowedPostmateTypes = {\r\n handshake: 1,\r\n \"handshake-reply\": 1,\r\n call: 1,\r\n emit: 1,\r\n reply: 1,\r\n request: 1,\r\n};\r\n\r\n// 校验消息是否来自合法的来源\r\nfunction isValidMessage(event, allowedOrigin) {\r\n return (\r\n (typeof allowedOrigin !== \"string\" || event.origin === allowedOrigin) &&\r\n !!event.data &&\r\n (typeof event.data !== \"object\" || \"postmate\" in event.data) &&\r\n event.data.type === MESSAGE_TYPE &&\r\n !!allowedPostmateTypes[event.data.postmate]\r\n );\r\n}\r\n\r\n// ----------------- ParentAPI -----------------\r\nclass ParentAPI {\r\n constructor(config) {\r\n this.parent = config.parent;\r\n this.frame = config.frame;\r\n this.child = config.child;\r\n this.childOrigin = config.childOrigin;\r\n this.events = {};\r\n\r\n this.listener = (event) => {\r\n if (!isValidMessage(event, this.childOrigin)) return;\r\n const { value = {} } = event.data;\r\n const { name, data } = value;\r\n if (event.data.postmate === \"emit\" && name in this.events) {\r\n this.events[name].call(this, data);\r\n }\r\n };\r\n\r\n this.parent.addEventListener(\"message\", this.listener, false);\r\n }\r\n\r\n get(property) {\r\n return new Postmate.Promise((resolve) => {\r\n const id = ++uid;\r\n const handler = (event) => {\r\n if (event.data.uid === id && event.data.postmate === \"reply\") {\r\n this.parent.removeEventListener(\"message\", handler, false);\r\n resolve(event.data.value);\r\n }\r\n };\r\n this.parent.addEventListener(\"message\", handler, false);\r\n this.child.postMessage(\r\n {\r\n postmate: \"request\",\r\n type: MESSAGE_TYPE,\r\n property,\r\n uid: id,\r\n },\r\n this.childOrigin\r\n );\r\n });\r\n }\r\n\r\n call(method, data) {\r\n this.child.postMessage(\r\n {\r\n postmate: \"call\",\r\n type: MESSAGE_TYPE,\r\n property: method,\r\n data,\r\n },\r\n this.childOrigin\r\n );\r\n }\r\n\r\n on(event, callback) {\r\n this.events[event] = callback;\r\n }\r\n\r\n destroy() {\r\n window.removeEventListener(\"message\", this.listener, false);\r\n this.frame.parentNode.removeChild(this.frame);\r\n }\r\n}\r\n\r\n// ----------------- ChildAPI -----------------\r\nclass ChildAPI {\r\n constructor(config) {\r\n this.model = config.model;\r\n this.parent = config.parent;\r\n this.parentOrigin = config.parentOrigin;\r\n this.child = config.child;\r\n\r\n this.child.addEventListener(\"message\", (event) => {\r\n if (!isValidMessage(event, this.parentOrigin)) return;\r\n\r\n const { postmate, property, uid, data } = event.data;\r\n const value = this.model[property];\r\n\r\n if (postmate !== \"call\") {\r\n const result = typeof value === \"function\" ? value() : value;\r\n Postmate.Promise.resolve(result).then((res) => {\r\n event.source.postMessage(\r\n {\r\n property,\r\n postmate: \"reply\",\r\n type: MESSAGE_TYPE,\r\n uid,\r\n value: res,\r\n },\r\n event.origin\r\n );\r\n });\r\n } else if (property in this.model && typeof value === \"function\") {\r\n value(data);\r\n }\r\n });\r\n }\r\n\r\n emit(eventName, data) {\r\n this.parent.postMessage(\r\n {\r\n postmate: \"emit\",\r\n type: MESSAGE_TYPE,\r\n value: { name: eventName, data },\r\n },\r\n this.parentOrigin\r\n );\r\n }\r\n}\r\n\r\n// ----------------- Postmate -----------------\r\nclass Postmate {\r\n constructor({ container = document.body, model, url, name, classListArray = [] }) {\r\n this.parent = window;\r\n this.frame = document.createElement(\"iframe\");\r\n this.frame.name = name || \"\";\r\n this.frame.classList.add(...classListArray);\r\n container.appendChild(this.frame);\r\n\r\n this.child = this.frame.contentWindow;\r\n this.model = model || {};\r\n\r\n return this.sendHandshake(url);\r\n }\r\n\r\n sendHandshake(url) {\r\n const origin = (() => {\r\n const link = document.createElement(\"a\");\r\n link.href = url;\r\n const protocol = link.protocol.length > 4 ? link.protocol : window.location.protocol;\r\n const host = link.host.length ? (link.port === \"80\" || link.port === \"443\" ? link.hostname : link.host) : window.location.host;\r\n return link.origin || `${protocol}//${host}`;\r\n })();\r\n\r\n let attemptCount = 0;\r\n let interval;\r\n\r\n return new Postmate.Promise((resolve, reject) => {\r\n const listener = (event) => {\r\n if (!isValidMessage(event, origin)) return false;\r\n if (event.data.postmate === \"handshake-reply\") {\r\n clearInterval(interval);\r\n this.parent.removeEventListener(\"message\", listener, false);\r\n this.childOrigin = event.origin;\r\n resolve(new ParentAPI(this));\r\n } else {\r\n reject(\"Failed handshake\");\r\n }\r\n };\r\n\r\n this.parent.addEventListener(\"message\", listener, false);\r\n\r\n const send = () => {\r\n attemptCount++;\r\n this.child.postMessage(\r\n {\r\n postmate: \"handshake\",\r\n type: MESSAGE_TYPE,\r\n model: this.model,\r\n },\r\n origin\r\n );\r\n if (attemptCount === 5) clearInterval(interval);\r\n };\r\n\r\n const init = () => {\r\n send();\r\n interval = setInterval(send, 500);\r\n };\r\n\r\n this.frame.onload = init;\r\n this.frame.attachEvent && this.frame.attachEvent(\"onload\", init);\r\n this.frame.src = url;\r\n });\r\n }\r\n}\r\n\r\n// ----------------- Model -----------------\r\nclass Model {\r\n constructor(model) {\r\n this.child = window;\r\n this.model = model;\r\n this.parent = window.parent;\r\n\r\n return this.sendHandshakeReply();\r\n }\r\n\r\n sendHandshakeReply() {\r\n return new Postmate.Promise((resolve, reject) => {\r\n this.child.addEventListener(\"message\", (event) => {\r\n if (event.data.postmate) {\r\n if (event.data.postmate !== \"handshake\") return reject(\"Handshake Reply Failed\");\r\n\r\n this.child.removeEventListener(\"message\", this, false);\r\n event.source.postMessage(\r\n {\r\n postmate: \"handshake-reply\",\r\n type: MESSAGE_TYPE,\r\n },\r\n event.origin\r\n );\r\n\r\n this.parentOrigin = event.origin;\r\n const parentModel = event.data.model;\r\n if (parentModel) {\r\n Object.keys(parentModel).forEach((key) => {\r\n this.model[key] = parentModel[key];\r\n });\r\n }\r\n resolve(new ChildAPI(this));\r\n }\r\n }, false);\r\n });\r\n }\r\n}\r\n\r\n// Attach defaults\r\nPostmate.debug = false;\r\nPostmate.Promise = (() => {\r\n try {\r\n return typeof window !== \"undefined\" ? window.Promise : Promise;\r\n } catch {\r\n return Promise;\r\n }\r\n})();\r\nPostmate.Model = Model;\r\n\r\nexport default Postmate;\r\nexport { Model };\r\n","/**\r\n * 检查路径是否存在于路由配置中(递归检查所有层级)\r\n * @param routes 路由配置数组\r\n * @param path 需要检查的路径\r\n * @returns 是否存在\r\n */\r\nexport function checkPathInRoutes(routes: any[], path: string): boolean {\r\n\tfor (const route of routes) {\r\n\t\t// 检查当前路由\r\n\t\tif (route.path === path) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t// 递归检查子路由\r\n\t\tif (route.children && Array.isArray(route.children) && route.children.length > 0) {\r\n\t\t\tif (checkPathInRoutes(route.children, path)) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn false;\r\n}\r\n\r\n/**\r\n * 判断路径是否存在于vue-router对象中(兼容Vue2和Vue3)\r\n * @param router vue-router实例\r\n * @param path 需要检查的页面路径\r\n * @returns 路径是否存在\r\n */\r\nexport function isRouteExists(router: any, path: string): boolean {\r\n\t// 移除路径中的查询参数\r\n\tif (path.includes('?')) {\r\n\t\tpath = path.split('?')[0];\r\n\t}\r\n\tconst routes = getRouterPaths(router);\r\n\tif (!routes || routes.length === 0) return false;\r\n\treturn checkPathInRoutes(routes, path);\r\n}\r\n\r\n// 净化单个路由配置,只保留安全字段\r\nfunction purifyRoute(route) {\r\n\t// 只提取需要的基础字段,根据你的需求调整\r\n\tconst safeFields = {\r\n\t\tpath: route.path,\r\n\t\tname: route.name,\r\n\t\tmeta: route.meta || {}, // 确保meta是普通对象\r\n\t\tredirect: route.redirect,\r\n\t\t// 剔除 component、beforeEnter 等可能包含函数/对象引用的字段\r\n\t\t// 如果需要children,递归净化\r\n\t\tchildren: route.children ? route.children.map((child) => purifyRoute(child)) : [],\r\n\t};\r\n\r\n\t// 进一步净化meta(如果meta中可能有复杂对象)\r\n\tsafeFields.meta = JSON.parse(JSON.stringify(safeFields.meta));\r\n\r\n\treturn safeFields;\r\n}\r\n\r\n/**\r\n * 获取路由路径\r\n *\r\n */\r\nexport function getRouterPaths(router: any): any[] {\r\n\tlet routes: any[] = [];\r\n\t// 区分Vue Router 3.x (Vue2) 和 4.x (Vue3)\r\n\tif (typeof router.getRoutes === 'function') {\r\n\t\t// Vue Router 4.x (Vue3)\r\n\t\troutes = router.getRoutes();\r\n\t} else if (router.options && Array.isArray(router.options.routes)) {\r\n\t\t// Vue Router 3.x (Vue2)\r\n\t\troutes = router.options.routes;\r\n\t}\r\n\treturn routes.map((route) => purifyRoute(route)) || [];\r\n}\r\n\r\n/**\r\n * 比较两个URL的协议、IP(或域名)和端口是否完全相同\r\n * @param url1 第一个URL字符串\r\n * @param url2 第二个URL字符串\r\n * @returns 如果协议、IP(或域名)和端口都相同则返回true,否则返回false;解析失败时返回false\r\n */\r\nexport function areUrlsSameProtocolIpPort(url1: string, url2: string): boolean {\r\n\ttry {\r\n\t\t// 解析两个URL\r\n\t\tconst parsedUrl1 = new URL(url1);\r\n\t\tconst parsedUrl2 = new URL(url2);\r\n\r\n\t\t// 比较协议(不区分大小写,但通常URL协议是小写的)\r\n\t\tconst sameProtocol = parsedUrl1.protocol.toLowerCase() === parsedUrl2.protocol.toLowerCase();\r\n\r\n\t\t// 比较主机(IP或域名)\r\n\t\tconst sameHost = parsedUrl1.hostname === parsedUrl2.hostname;\r\n\r\n\t\t// 比较端口(如果未指定端口,会使用协议默认端口)\r\n\t\tconst samePort = parsedUrl1.port === parsedUrl2.port;\r\n\r\n\t\t// 只有所有部分都相同时才返回true\r\n\t\treturn sameProtocol && sameHost && samePort;\r\n\t} catch (error) {\r\n\t\t// 如果URL解析失败,返回false\r\n\t\tconsole.error('URL解析错误:', error);\r\n\t\treturn false;\r\n\t}\r\n}\r\n\r\nexport const getCircularReplacer = () => {\r\n\tconst seen = new WeakSet();\r\n\treturn (key, value) => {\r\n\t\tif (typeof value === 'object' && value !== null) {\r\n\t\t\tif (seen.has(value)) {\r\n\t\t\t\t// 遇到循环引用时,返回一个标识或忽略\r\n\t\t\t\treturn '[Circular Reference]';\r\n\t\t\t}\r\n\t\t\tseen.add(value);\r\n\t\t}\r\n\t\treturn value;\r\n\t};\r\n};\r\n","import Postmate from './postMeta';\nimport { getCircularReplacer, getRouterPaths, isRouteExists } from './tools';\n\ninterface EventObj {\n\terror: (error: any) => void;\n\tsuccess: (success: any) => void;\n\treceive: (receive: any) => void;\n}\n\n// 路由更新接口\ninterface RouteUpdateInfo {\n\tfullPath: string;\n}\n\nexport default class ChildPostmate {\n\tchildPostmate: any = null;\n\tparentPostmate: any = null;\n\n\tisGetData: boolean = false;\n\tgetDataCllBack: Function | null = null;\n\n\t// Vue Router实例\n\trouter: any = null;\n\t// 路由更新回调函数\n\trouteUpdateCallback: ((routeInfo: RouteUpdateInfo) => void) | undefined = undefined;\n\n\tconstructor(eventObj: EventObj, router: any, routeUpdateCallback?: (routeInfo: RouteUpdateInfo) => void) {\n\t\t// 保存router实例\n\t\tthis.router = router;\n\t\t// 保存路由更新回调函数\n\t\tthis.routeUpdateCallback = routeUpdateCallback;\n\n\t\tif (window.top !== window.self) this.init(eventObj);\n\t\telse {\n\t\t\teventObj.error({ status: 500, data: null, message: '未在一体化平台中运行' });\n\t\t}\n\t}\n\n\tinit(eventObj: EventObj) {\n\t\tconst that = this;\n\t\t// 创建 Postmate Model(作为子)\n\t\tthis.childPostmate = new Postmate.Model({\n\t\t\t// 定义子页面可以暴露给父页面的方法\n\t\t\tbaseData(data: any) {\n\t\t\t\tdata = JSON.parse(data);\n\t\t\t\tif (that.isGetData) {\n\t\t\t\t\tthat.getDataCllBack &&\n\t\t\t\t\t\tthat.getDataCllBack({\n\t\t\t\t\t\t\tstatus: 200,\n\t\t\t\t\t\t\tmessage: 'success',\n\t\t\t\t\t\t\tdata: data,\n\t\t\t\t\t\t});\n\t\t\t\t} else\n\t\t\t\t\teventObj.receive({\n\t\t\t\t\t\tstatus: 200,\n\t\t\t\t\t\tmessage: 'success',\n\t\t\t\t\t\tdata: data,\n\t\t\t\t\t});\n\t\t\t\tthat.isGetData = false;\n\t\t\t},\n\n\t\t\t// 提供当前系统的路由\n\t\t\tgetRoutes: () => {\n\t\t\t\t// 有路由\n\t\t\t\tif (that.router) {\n\t\t\t\t\tlet arr = getRouterPaths(that.router);\n\t\t\t\t\tthat.parentPostmate.emit('pushRoutes', JSON.stringify(arr, getCircularReplacer()));\n\t\t\t\t}\n\t\t\t\t// 无路由\n\t\t\t\telse that.parentPostmate.emit('pushRoutes');\n\t\t\t},\n\n\t\t\t// 检查路由是否存在\n\t\t\tisRouteExists(routePath: string) {\n\t\t\t\tif (that.router) that.parentPostmate.emit('routeExists', isRouteExists(that.router, routePath));\n\t\t\t\telse that.parentPostmate.emit('routeExists', false);\n\t\t\t},\n\n\t\t\t// 处理路由更新\n\t\t\trouteUpdate(routeInfoStr: string) {\n\t\t\t\t// 向父页面同步路由数据\n\t\t\t\ttry {\n\t\t\t\t\tconst routeInfo: RouteUpdateInfo = JSON.parse(routeInfoStr);\n\n\t\t\t\t\t// 如果提供了自定义的路由更新回调函数,则调用它\n\t\t\t\t\tif (that.routeUpdateCallback) {\n\t\t\t\t\t\tthat.routeUpdateCallback(routeInfo);\n\t\t\t\t\t\tthat.parentPostmate.emit('route_update_result', true);\n\t\t\t\t\t\tconsole.log('----------------- 【ChildPastMate】路由更新完成 -----------------');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// 如果提供了router实例,则使用router进行路由更新\n\t\t\t\t\tif (that.router) {\n\t\t\t\t\t\tthat.router.replace(routeInfo.fullPath);\n\t\t\t\t\t\tthat.parentPostmate.emit('route_update_result', true);\n\t\t\t\t\t\tconsole.log('----------------- 【ChildPastMate】路由更新完成 -----------------');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthat.parentPostmate.emit('route_update_result', false);\n\t\t\t\t\t\tconsole.warn('【ChildPastMate】未提供router实例,无法进行路由更新');\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('【ChildPastMate】路由更新失败:', error);\n\t\t\t\t\tthat.parentPostmate.emit('route_update_result', false);\n\t\t\t\t}\n\t\t\t},\n\t\t})\n\t\t\t.then((parent: any) => {\n\t\t\t\tthat.parentPostmate = parent;\n\t\t\t\tthat.getData();\n\t\t\t\t// 与父页面链接建立成功\n\t\t\t\teventObj.success({\n\t\t\t\t\tstatus: 200,\n\t\t\t\t\tmessage: 'success',\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tChildPostmate: parent,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\t// 告诉父系统支持路由更新\n\t\t\t\tthat.parentPostmate.emit('route_update_support', that.router ? true : false);\n\n\t\t\t\t// 向父页面同步路由数据\n\t\t\t\tthat.router && that.parentPostmate.emit('pushRoutes', JSON.stringify(getRouterPaths(that.router), getCircularReplacer()));\n\t\t\t})\n\t\t\t.catch((err: any) => {\n\t\t\t\teventObj.error({ status: 500, data: null, message: err });\n\t\t\t});\n\t}\n\n\t// 获取数据\n\tgetData(callback?: any) {\n\t\tif (!this.parentPostmate) {\n\t\t\tcallback({\n\t\t\t\tstatus: 500,\n\t\t\t\tmessage: '父页面未连接',\n\t\t\t\tdata: null,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (callback) {\n\t\t\tthis.isGetData = true;\n\t\t\tthis.getDataCllBack = callback;\n\t\t} else {\n\t\t\tthis.isGetData = false;\n\t\t\tthis.getDataCllBack = null;\n\t\t}\n\t\t// 向父页面获取数据\n\t\tthis.parentPostmate.emit('requestBaseData');\n\t}\n\n\t/**\n\t * 设置路由实例和路由更新回调\n\t * @param router Vue Router实例\n\t * @param routeUpdateCallback 自定义路由更新回调函数\n\t */\n\tsetRouter(router: any, routeUpdateCallback?: (routeInfo: RouteUpdateInfo) => void) {\n\t\tthis.router = router;\n\t\tif (routeUpdateCallback) {\n\t\t\tthis.routeUpdateCallback = routeUpdateCallback;\n\t\t}\n\t}\n\n\t/**\n\t * 向父页面发送其他请求\n\t * @param params 请求参数\n\t */\n\tsendOtherRequest(params: any) {\n\t\tif (!this.parentPostmate) return;\n\t\tthis.parentPostmate.emit('otherRequest', params);\n\t}\n}","import Postmate from './postMeta';\nimport { areUrlsSameProtocolIpPort, checkPathInRoutes } from './tools';\n\ninterface DataInfo {\n\tloginInfo: { [x: string]: any };\n\ttoken: string;\n\tisHideHeader: boolean;\n}\n\n// URL解析结果接口\ninterface ParsedUrl {\n\tprotocol: string;\n\thost: string;\n\tport: string;\n\tpathname: string;\n\tsearch: string;\n\thash: string;\n\torigin: string;\n\tfullPath: string;\n}\n\nexport default class ParentPostmate {\n\t/** 连接到的子 postmate 实例 */\n\tpostmateParent: any = null;\n\t/** 通讯数据 */\n\tdataInfo: DataInfo = {\n\t\tloginInfo: {},\n\t\ttoken: '',\n\t\tisHideHeader: true,\n\t};\n\t/** iframe Dom 容器 */\n\tiframeEle: any = null;\n\t/** 当前 iframe url */\n\tcurrentUrl: string = '';\n\t/** 当前url基础地址 */\n\tcurrentBaseUrl: string = '';\n\t/** 当前路由地址 */\n\tcurrentRouterPath: string = '';\n\t/** 存储当前的 iframe 元素 */\n\tcurrentIframe: any = null;\n\t/** iframe 加载完成执行函数 */\n\tloadFunction: (() => void) | null = null;\n\t/** 处理子类的其他请求方法 */\n\thandleOtherRequest: ((params: any) => void) | null = null;\n\t/** 当前URL解析结果 */\n\tparsedCurrentUrl: ParsedUrl | null = null;\n\t/** 子页面是否支持路由更新 */\n\tchildSupportsRouteUpdate: boolean = true;\n\t/** 子系统的路由列表 */\n\tchildRoutes: any[] = [];\n\n\teventBus: any = {\n\t\tgetRoutes: null,\n\t\troute_update_resultL: null,\n\t};\n\n\tconstructor(dataInfo: DataInfo, iframeEle: HTMLElement | (() => HTMLElement), iframeUrl: string = '', handleOtherRequest?: (params: any) => void) {\n\t\tthis.dataInfo = dataInfo || this.dataInfo;\n\t\tthis.iframeEle = iframeEle;\n\t\tthis.setIframeUrl(iframeUrl);\n\t\thandleOtherRequest && (this.handleOtherRequest = handleOtherRequest);\n\t}\n\n\t/** 解析URL */\n\tparseUrl(url: string): ParsedUrl {\n\t\tconst link = document.createElement('a');\n\t\tlink.href = url;\n\n\t\t// 获取协议\n\t\tconst protocol = link.protocol.length > 4 ? link.protocol : window.location.protocol;\n\n\t\t// 获取主机和端口\n\t\tconst host = link.hostname;\n\t\tconst port = link.port || (protocol === 'https:' ? '443' : protocol === 'http:' ? '80' : '');\n\n\t\t// 获取路径、查询参数和哈希\n\t\tconst pathname = link.pathname.startsWith('/') ? link.pathname : `/${link.pathname}`;\n\t\tconst search = link.search;\n\t\tconst hash = link.hash.slice(2, link.hash.length);\n\n\t\t// 构建origin\n\t\tconst origin = link.origin || `${protocol}//${host}${port ? `:${port}` : ''}`;\n\n\t\t// 构建完整路径(不包含origin)\n\t\tconst fullPath = `${pathname}${hash}`;\n\n\t\treturn {\n\t\t\tprotocol,\n\t\t\thost,\n\t\t\tport,\n\t\t\tpathname,\n\t\t\tsearch,\n\t\t\thash,\n\t\t\torigin,\n\t\t\tfullPath,\n\t\t};\n\t}\n\n\t/** 比较两个URL是否相同*/\n\tcompareUrlBase(url1: string, url2: string): boolean {\n\t\tconst url1End = url1.endsWith('/');\n\t\tconst url2End = url2.endsWith('/');\n\t\tif ((url1End && url2End) || (!url1End && !url2End)) {\n\t\t\treturn url1 === url2;\n\t\t} else {\n\t\t\tif (url1End) url2 += '/';\n\t\t\tif (url2End) url1 += '/';\n\t\t\treturn url1 === url2;\n\t\t}\n\t}\n\n\t/** 比较两个URL的路径是否相同(不包含查询参数和哈希) */\n\tcompareUrlPath(url1: string, url2: string): boolean {\n\t\tif (!url1 || !url2) return false;\n\n\t\tconst parsed1 = this.parseUrl(url1);\n\t\tconst parsed2 = this.parseUrl(url2);\n\n\t\treturn parsed1.pathname === parsed2.pathname;\n\t}\n\n\t/** 比较两个URL是否完全相同(包括查询参数和哈希) */\n\tcompareUrlFull(url1: string, url2: string): boolean {\n\t\tif (!url1 || !url2) return false;\n\n\t\tconst parsed1 = this.parseUrl(url1);\n\t\tconst parsed2 = this.parseUrl(url2);\n\n\t\treturn parsed1.fullPath === parsed2.fullPath;\n\t}\n\n\t/** 清除当前的 iframe 和 postmate 实例 */\n\tclear() {\n\t\t// 销毁 postmate 实例\n\t\tif (this.postmateParent) {\n\t\t\tthis.postmateParent.destroy();\n\t\t\tthis.postmateParent = null;\n\t\t}\n\n\t\t// 移除 iframe\n\t\tif (this.currentIframe && this.currentIframe.parentNode) {\n\t\t\tthis.currentIframe.parentNode.removeChild(this.currentIframe);\n\t\t}\n\t\tthis.currentIframe = null;\n\t}\n\n\t/** 初始化 */\n\tasync init(callback: any = null) {\n\t\t// 清除之前的实例和 iframe\n\t\tthis.clear();\n\n\t\t// 重置子页面路由更新支持标记\n\t\tthis.childSupportsRouteUpdate = false;\n\n\t\t// 如果没有容器,或集成链接\n\t\tif (!this.iframeEle || !this.currentUrl) {\n\t\t\tthis.destroy();\n\t\t}\n\n\t\t// 获取 iframe 容器\n\t\tconst container: any = typeof this.iframeEle === 'function' ? this.iframeEle() : this.iframeEle;\n\t\tif (!container) {\n\t\t\tconsole.warn('【ParentPostmate】无法获取 iframe 容器');\n\t\t\treturn;\n\t\t}\n\n\t\t// 创建 Postmate 实例(作为父)\n\t\tconst handshake: any = new Postmate({\n\t\t\tcontainer,\n\t\t\turl: this.currentUrl,\n\t\t\tname: '',\n\t\t\tmodel: '',\n\t\t});\n\n\t\t// 存储当前创建的 iframe\n\t\tthis.currentIframe = container.querySelector('iframe');\n\t\tthis.currentIframe.setAttribute('frameborder', '0');\n\t\tthis.currentIframe.setAttribute('allow', 'fullscreen');\n\t\tthis.currentIframe.addEventListener('load', () => {\n\t\t\tthis.loadFunction && this.loadFunction();\n\t\t});\n\n\t\thandshake\n\t\t\t.then((parent: any) => {\n\t\t\t\tthis.postmateParent = parent;\n\n\t\t\t\t// 监听子页面发来的获取数据请求\n\t\t\t\tparent.on('requestBaseData', () => {\n\t\t\t\t\t// 发送相关数据\n\t\t\t\t\tthis.sendData();\n\t\t\t\t});\n\n\t\t\t\t// 监听子页面发来的路由配置数据\n\t\t\t\tparent.on('pushRoutes', (routes: string) => {\n\t\t\t\t\tif (routes) this.childRoutes = JSON.parse(routes);\n\t\t\t\t\telse this.childRoutes = [];\n\t\t\t\t\tthis.eventBus.getRoutes && this.eventBus.getRoutes();\n\t\t\t\t});\n\n\t\t\t\t// 监听子页面的路由效验结果\n\t\t\t\tparent.on('routeExists', (flag: boolean) => {});\n\n\t\t\t\t// 监听子页面的动态路由变更支持\n\t\t\t\tparent.on('route_update_support', (flag: boolean) => {\n\t\t\t\t\tthis.childSupportsRouteUpdate = flag;\n\t\t\t\t});\n\n\t\t\t\t// 监听子页面的路由变更结果\n\t\t\t\tparent.on('route_update_result', (flag: boolean) => {\n\t\t\t\t\tthis.eventBus.route_update_result && this.eventBus.route_update_result(flag);\n\t\t\t\t});\n\n\t\t\t\t// 监听子页面发来的其他请求\n\t\t\t\tparent.on('otherRequest', (params: any) => {\n\t\t\t\t\tthis.handleOtherRequest && this.handleOtherRequest(params);\n\t\t\t\t});\n\n\t\t\t\tif (typeof callback === 'function') callback();\n\t\t\t})\n\t\t\t.catch((error: any) => {\n\t\t\t\tconsole.error('【ParentPostmate】Postmate 连接失败:', error);\n\t\t\t});\n\t}\n\n\t/** 设置load执行事件 */\n\tsetLoadFunction(loadFunction: () => void) {\n\t\tthis.loadFunction = loadFunction;\n\t}\n\n\t/** 设置 iframe url */\n\tsetIframeUrl(iframeUrl: string, routerPath: string = '') {\n\t\t// 如果传入了路由,则对路径进行规范处理\n\t\tif (routerPath && !routerPath.startsWith('/')) {\n\t\t\trouterPath = '/' + routerPath;\n\t\t}\n\n\t\t// 1、传入的地址为空:销毁当前实例\n\t\tif (!iframeUrl) {\n\t\t\tthis.currentUrl = '';\n\t\t\tthis.currentRouterPath = '';\n\t\t\tthis.destroy();\n\t\t\tconsole.error('【ParentPostmate】无加载地址,无法初始化');\n\t\t\treturn;\n\t\t}\n\n\t\t// 2、如果当前无连接:直接设置并初始化\n\t\tif (!this.postmateParent || !this.currentUrl) {\n\t\t\tthis.currentUrl = iframeUrl;\n\t\t\tthis.currentRouterPath = routerPath;\n\t\t\tif (this.iframeEle) this.init();\n\t\t\telse console.error('【ParentPostmate】无 iframe 容器,无法初始化');\n\t\t\treturn;\n\t\t}\n\n\t\t// 3、如果当前系统不支持路由更新 或 新旧系统协议、ip、端口不同则重新初始化: 重新初始化\n\t\tif (!this.childSupportsRouteUpdate || !this.childRoutes?.length || !areUrlsSameProtocolIpPort(this.currentUrl, iframeUrl)) {\n\t\t\tthis.currentUrl = iframeUrl;\n\t\t\tthis.currentRouterPath = routerPath;\n\t\t\tthis.init();\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * 因新旧地址的基础地址完全相同,且已加载系统支持路由更新\n\t\t * 下面处理新旧地址的url,研判操作方式\n\t\t **/\n\t\t// 更新路由列表\n\t\tlet flag = false;\n\t\tthis.eventBus.getRoutes = () => {\n\t\t\tflag = true;\n\t\t\tthis.handleSimilarUrl(iframeUrl, routerPath);\n\t\t};\n\t\tthis.postmateParent.call('getRoutes');\n\n\t\tsetTimeout(() => {\n\t\t\tif (flag) return;\n\t\t\tthis.handleSimilarUrl(iframeUrl, routerPath);\n\t\t}, 1000);\n\t}\n\n\t// 处理相似地址\n\thandleSimilarUrl(iframeUrl: string, routerPath?: string) {\n\t\tthis.currentUrl = iframeUrl;\n\t\tthis.currentRouterPath = routerPath || '';\n\n\t\t// 1 如果传入了routerPath,将该值与子系统匹配,判断是否可以直接跳转\n\t\tif (routerPath && checkPathInRoutes(this.childRoutes, routerPath)) {\n\t\t\t// 触发更新路由\n\t\t\tthis.sendRouteUpdate({\n\t\t\t\tfullPath: routerPath,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// 2 通过已加载子系统的路由列表匹配新链接的尾部路径,如果匹配到,则触发路由更新\n\t\tlet isEnd = false;\n\t\tlet noQueryUrl = iframeUrl.split('?')[0];\n\t\tthis.childRoutes.forEach((v) => {\n\t\t\tif (noQueryUrl.endsWith(v.path)) {\n\t\t\t\t// 触发更新路由\n\t\t\t\tthis.sendRouteUpdate({\n\t\t\t\t\tfullPath: v.path,\n\t\t\t\t});\n\t\t\t\tisEnd = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t});\n\t\tif (isEnd) return;\n\n\t\t// 3 如果以上两种情况都不满足,则重新初始化\n\t\tthis.init();\n\t}\n\n\t/** 向子页面发送路由更新消息 */\n\tsendRouteUpdate(parsedUrl: any) {\n\t\ttry {\n\t\t\tlet flag = false;\n\t\t\tthis.eventBus.route_update_result = (state: boolean) => {\n\t\t\t\tflag = state;\n\t\t\t\tthis.loadFunction && this.loadFunction();\n\t\t\t};\n\t\t\tthis.postmateParent.call('routeUpdate', JSON.stringify(parsedUrl));\n\t\t\tconsole.log('---------------------- 【ParentPostmate】推送路由更新 ----------------------');\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (flag) return;\n\t\t\t\tconsole.warn('【ParentPostmate】推送路由更新失败,将重新初始化iframe');\n\t\t\t\t// 标记子页面不支持路由更新\n\t\t\t\tthis.childSupportsRouteUpdate = false;\n\t\t\t\t// 如果发送消息失败,则重新初始化iframe\n\t\t\t\tthis.init();\n\t\t\t}, 1000);\n\t\t} catch (error) {\n\t\t\tconsole.warn('【ParentPostmate】发送路由更新消息失败,将重新初始化iframe:', error);\n\t\t\t// 标记子页面不支持路由更新\n\t\t\tthis.childSupportsRouteUpdate = false;\n\t\t\t// 如果发送消息失败,则重新初始化iframe\n\t\t\tthis.init();\n\t\t}\n\t}\n\n\t/** 向子页面发送消息 */\n\tsendData() {\n\t\tif (!this.postmateParent) return;\n\t\tthis.postmateParent.call('baseData', JSON.stringify(this.dataInfo));\n\t}\n\n\t/** 销毁实例 */\n\tdestroy() {\n\t\tthis.clear();\n\t}\n}\n"],"names":["MESSAGE_TYPE","uid","allowedPostmateTypes","isValidMessage","event","allowedOrigin","ParentAPI","config","value","name","data","property","Postmate","resolve","id","handler","method","callback","ChildAPI","postmate","result","res","eventName","container","model","url","classListArray","origin","link","protocol","host","attemptCount","interval","reject","listener","send","init","Model","parentModel","key","checkPathInRoutes","routes","path","route","isRouteExists","router","getRouterPaths","purifyRoute","safeFields","child","areUrlsSameProtocolIpPort","url1","url2","parsedUrl1","parsedUrl2","sameProtocol","sameHost","samePort","error","getCircularReplacer","seen","ChildPostmate","eventObj","routeUpdateCallback","that","arr","routePath","routeInfoStr","routeInfo","parent","err","params","ParentPostmate","dataInfo","iframeEle","iframeUrl","handleOtherRequest","port","pathname","search","hash","fullPath","url1End","url2End","parsed1","parsed2","handshake","flag","loadFunction","routerPath","_a","isEnd","noQueryUrl","v","parsedUrl","state"],"mappings":"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"}
|
package/lib/index.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(u,n){typeof exports=="object"&&typeof module<"u"?n(exports):typeof define=="function"&&define.amd?define(["exports"],n):(u=typeof globalThis<"u"?globalThis:u||self,n(u["qlfy-postmate"]={}))})(this,function(u){"use strict";const n="application/x-postmate-v1+json";let y=0;const R={handshake:1,"handshake-reply":1,call:1,emit:1,reply:1,request:1};function m(i,e){return(typeof e!="string"||i.origin===e)&&!!i.data&&(typeof i.data!="object"||"postmate"in i.data)&&i.data.type===n&&!!R[i.data.postmate]}class w{constructor(e){this.parent=e.parent,this.frame=e.frame,this.child=e.child,this.childOrigin=e.childOrigin,this.events={},this.listener=t=>{if(!m(t,this.childOrigin))return;const{value:s={}}=t.data,{name:r,data:a}=s;t.data.postmate==="emit"&&r in this.events&&this.events[r].call(this,a)},this.parent.addEventListener("message",this.listener,!1)}get(e){return new l.Promise(t=>{const s=++y,r=a=>{a.data.uid===s&&a.data.postmate==="reply"&&(this.parent.removeEventListener("message",r,!1),t(a.data.value))};this.parent.addEventListener("message",r,!1),this.child.postMessage({postmate:"request",type:n,property:e,uid:s},this.childOrigin)})}call(e,t){this.child.postMessage({postmate:"call",type:n,property:e,data:t},this.childOrigin)}on(e,t){this.events[e]=t}destroy(){window.removeEventListener("message",this.listener,!1),this.frame.parentNode.removeChild(this.frame)}}class U{constructor(e){this.model=e.model,this.parent=e.parent,this.parentOrigin=e.parentOrigin,this.child=e.child,this.child.addEventListener("message",t=>{if(!m(t,this.parentOrigin))return;const{postmate:s,property:r,uid:a,data:h}=t.data,o=this.model[r];if(s!=="call"){const c=typeof o=="function"?o():o;l.Promise.resolve(c).then(d=>{t.source.postMessage({property:r,postmate:"reply",type:n,uid:a,value:d},t.origin)})}else r in this.model&&typeof o=="function"&&o(h)})}emit(e,t){this.parent.postMessage({postmate:"emit",type:n,value:{name:e,data:t}},this.parentOrigin)}}class l{constructor({container:e=document.body,model:t,url:s,name:r,classListArray:a=[]}){return this.parent=window,this.frame=document.createElement("iframe"),this.frame.name=r||"",this.frame.classList.add(...a),e.appendChild(this.frame),this.child=this.frame.contentWindow,this.model=t||{},this.sendHandshake(s)}sendHandshake(e){const t=(()=>{const a=document.createElement("a");a.href=e;const h=a.protocol.length>4?a.protocol:window.location.protocol,o=a.host.length?a.port==="80"||a.port==="443"?a.hostname:a.host:window.location.host;return a.origin||`${h}//${o}`})();let s=0,r;return new l.Promise((a,h)=>{const o=p=>{if(!m(p,t))return!1;p.data.postmate==="handshake-reply"?(clearInterval(r),this.parent.removeEventListener("message",o,!1),this.childOrigin=p.origin,a(new w(this))):h("Failed handshake")};this.parent.addEventListener("message",o,!1);const c=()=>{s++,this.child.postMessage({postmate:"handshake",type:n,model:this.model},t),s===5&&clearInterval(r)},d=()=>{c(),r=setInterval(c,500)};this.frame.onload=d,this.frame.attachEvent&&this.frame.attachEvent("onload",d),this.frame.src=e})}}class E{constructor(e){return this.child=window,this.model=e,this.parent=window.parent,this.sendHandshakeReply()}sendHandshakeReply(){return new l.Promise((e,t)=>{this.child.addEventListener("message",s=>{if(s.data.postmate){if(s.data.postmate!=="handshake")return t("Handshake Reply Failed");this.child.removeEventListener("message",this,!1),s.source.postMessage({postmate:"handshake-reply",type:n},s.origin),this.parentOrigin=s.origin;const r=s.data.model;r&&Object.keys(r).forEach(a=>{this.model[a]=r[a]}),e(new U(this))}},!1)})}}l.debug=!1,l.Promise=(()=>{try{return typeof window<"u"?window.Promise:Promise}catch{return Promise}})(),l.Model=E;function f(i,e){for(const t of i)if(t.path===e||t.children&&Array.isArray(t.children)&&t.children.length>0&&f(t.children,e))return!0;return!1}function C(i,e){e.includes("?")&&(e=e.split("?")[0]);const t=P(i);return!t||t.length===0?!1:f(t,e)}function P(i){let e=[];return typeof i.getRoutes=="function"?e=i.getRoutes():i.options&&Array.isArray(i.options.routes)&&(e=i.options.routes),e||[]}function k(i,e){try{const t=new URL(i),s=new URL(e),r=t.protocol.toLowerCase()===s.protocol.toLowerCase(),a=t.hostname===s.hostname,h=t.port===s.port;return r&&a&&h}catch(t){return console.error("URL解析错误:",t),!1}}const g=()=>{const i=new WeakSet;return(e,t)=>{if(typeof t=="object"&&t!==null){if(i.has(t))return"[Circular Reference]";i.add(t)}return t}};class I{constructor(e,t,s){this.childPostmate=null,this.parentPostmate=null,this.isGetData=!1,this.getDataCllBack=null,this.router=null,this.routeUpdateCallback=void 0,this.router=t,this.routeUpdateCallback=s,window.top!==window.self?this.init(e):e.error({status:500,data:null,message:"未在一体化平台中运行"})}init(e){const t=this;this.childPostmate=new l.Model({baseData(s){s=JSON.parse(s),t.isGetData?t.getDataCllBack&&t.getDataCllBack({status:200,message:"success",data:s}):e.receive({status:200,message:"success",data:s}),t.isGetData=!1},getRoutes:()=>{if(t.router){let s=P(t.router);t.parentPostmate.emit("pushRoutes",JSON.stringify(s,g()))}else t.parentPostmate.emit("pushRoutes")},isRouteExists(s){t.router?t.parentPostmate.emit("routeExists",C(t.router,s)):t.parentPostmate.emit("routeExists",!1)},routeUpdate(s){try{const r=JSON.parse(s);if(t.routeUpdateCallback){t.routeUpdateCallback(r),t.parentPostmate.emit("route_update_result",!0),console.log("----------------- 【ChildPastMate】路由更新完成 -----------------");return}t.router?(t.router.replace(r.fullPath),t.parentPostmate.emit("route_update_result",!0),console.log("----------------- 【ChildPastMate】路由更新完成 -----------------")):(t.parentPostmate.emit("route_update_result",!1),console.warn("【ChildPastMate】未提供router实例,无法进行路由更新"))}catch(r){console.error("【ChildPastMate】路由更新失败:",r),t.parentPostmate.emit("route_update_result",!1)}}}).then(s=>{t.parentPostmate=s,t.getData(),e.success({status:200,message:"success",data:{ChildPostmate:s}}),t.parentPostmate.emit("route_update_support",!!t.router),t.router&&t.parentPostmate.emit("pushRoutes",JSON.stringify(P(t.router),g()))}).catch(s=>{e.error({status:500,data:null,message:s})})}getData(e){if(!this.parentPostmate){e({status:500,message:"父页面未连接",data:null});return}e?(this.isGetData=!0,this.getDataCllBack=e):(this.isGetData=!1,this.getDataCllBack=null),this.parentPostmate.emit("requestBaseData")}setRouter(e,t){this.router=e,t&&(this.routeUpdateCallback=t)}sendOtherRequest(e){this.parentPostmate&&this.parentPostmate.emit("otherRequest",e)}}class S{constructor(e,t,s="",r){this.postmateParent=null,this.dataInfo={loginInfo:{},token:"",isHideHeader:!0},this.iframeEle=null,this.currentUrl="",this.currentBaseUrl="",this.currentRouterPath="",this.currentIframe=null,this.loadFunction=null,this.handleOtherRequest=null,this.parsedCurrentUrl=null,this.childSupportsRouteUpdate=!0,this.childRoutes=[],this.eventBus={getRoutes:null,route_update_resultL:null},this.dataInfo=e||this.dataInfo,this.iframeEle=t,this.setIframeUrl(s),r&&(this.handleOtherRequest=r)}parseUrl(e){const t=document.createElement("a");t.href=e;const s=t.protocol.length>4?t.protocol:window.location.protocol,r=t.hostname,a=t.port||(s==="https:"?"443":s==="http:"?"80":""),h=t.pathname.startsWith("/")?t.pathname:`/${t.pathname}`,o=t.search,c=t.hash.slice(2,t.hash.length),d=t.origin||`${s}//${r}${a?`:${a}`:""}`,p=`${h}${c}`;return{protocol:s,host:r,port:a,pathname:h,search:o,hash:c,origin:d,fullPath:p}}compareUrlBase(e,t){const s=e.endsWith("/"),r=t.endsWith("/");return s&&r||!s&&!r||(s&&(t+="/"),r&&(e+="/")),e===t}compareUrlPath(e,t){if(!e||!t)return!1;const s=this.parseUrl(e),r=this.parseUrl(t);return s.pathname===r.pathname}compareUrlFull(e,t){if(!e||!t)return!1;const s=this.parseUrl(e),r=this.parseUrl(t);return s.fullPath===r.fullPath}clear(){this.postmateParent&&(this.postmateParent.destroy(),this.postmateParent=null),this.currentIframe&&this.currentIframe.parentNode&&this.currentIframe.parentNode.removeChild(this.currentIframe),this.currentIframe=null}async init(e=null){this.clear(),this.childSupportsRouteUpdate=!1,(!this.iframeEle||!this.currentUrl)&&this.destroy();const t=typeof this.iframeEle=="function"?this.iframeEle():this.iframeEle;if(!t){console.warn("【ParentPostmate】无法获取 iframe 容器");return}const s=new l({container:t,url:this.currentUrl,name:"",model:""});this.currentIframe=t.querySelector("iframe"),this.currentIframe.setAttribute("frameborder","0"),this.currentIframe.setAttribute("allow","fullscreen"),this.currentIframe.addEventListener("load",()=>{this.loadFunction&&this.loadFunction()}),s.then(r=>{this.postmateParent=r,r.on("requestBaseData",()=>{this.sendData()}),r.on("pushRoutes",a=>{a?this.childRoutes=JSON.parse(a):this.childRoutes=[],this.eventBus.getRoutes&&this.eventBus.getRoutes()}),r.on("routeExists",a=>{}),r.on("route_update_support",a=>{this.childSupportsRouteUpdate=a}),r.on("route_update_result",a=>{this.eventBus.route_update_result&&this.eventBus.route_update_result(a)}),r.on("otherRequest",a=>{this.handleOtherRequest&&this.handleOtherRequest(a)}),typeof e=="function"&&e()}).catch(r=>{console.error("【ParentPostmate】Postmate 连接失败:",r)})}setLoadFunction(e){this.loadFunction=e}setIframeUrl(e,t=""){var r;if(t&&!t.startsWith("/")&&(t="/"+t),!e){this.currentUrl="",this.currentRouterPath="",this.destroy(),console.error("【ParentPostmate】无加载地址,无法初始化");return}if(!this.postmateParent||!this.currentUrl){this.currentUrl=e,this.currentRouterPath=t,this.iframeEle?this.init():console.error("【ParentPostmate】无 iframe 容器,无法初始化");return}if(!this.childSupportsRouteUpdate||!((r=this.childRoutes)!=null&&r.length)||!k(this.currentUrl,e)){this.currentUrl=e,this.currentRouterPath=t,this.init();return}let s=!1;this.eventBus.getRoutes=()=>{s=!0,this.handleSimilarUrl(e,t)},this.postmateParent.call("getRoutes"),setTimeout(()=>{s||this.handleSimilarUrl(e,t)},1e3)}handleSimilarUrl(e,t){if(this.currentUrl=e,this.currentRouterPath=t||"",t&&f(this.childRoutes,t)){this.sendRouteUpdate({fullPath:t});return}let s=!1,r=e.split("?")[0];this.childRoutes.forEach(a=>{if(r.endsWith(a.path)){this.sendRouteUpdate({fullPath:a.path}),s=!0;return}}),!s&&this.init()}sendRouteUpdate(e){try{let t=!1;this.eventBus.route_update_result=s=>{t=s,this.loadFunction&&this.loadFunction()},this.postmateParent.call("routeUpdate",JSON.stringify(e)),console.log("---------------------- 【ParentPostmate】推送路由更新 ----------------------"),setTimeout(()=>{t||(console.warn("【ParentPostmate】推送路由更新失败,将重新初始化iframe"),this.childSupportsRouteUpdate=!1,this.init())},1e3)}catch(t){console.warn("【ParentPostmate】发送路由更新消息失败,将重新初始化iframe:",t),this.childSupportsRouteUpdate=!1,this.init()}}sendData(){this.postmateParent&&this.postmateParent.call("baseData",JSON.stringify(this.dataInfo))}destroy(){this.clear()}}u.ChildPostmate=I,u.ParentPostmate=S,Object.defineProperty(u,Symbol.toStringTag,{value:"Module"})});
|
|
1
|
+
(function(u,o){typeof exports=="object"&&typeof module<"u"?o(exports):typeof define=="function"&&define.amd?define(["exports"],o):(u=typeof globalThis<"u"?globalThis:u||self,o(u["qlfy-postmate"]={}))})(this,function(u){"use strict";const o="application/x-postmate-v1+json";let R=0;const w={handshake:1,"handshake-reply":1,call:1,emit:1,reply:1,request:1};function m(i,e){return(typeof e!="string"||i.origin===e)&&!!i.data&&(typeof i.data!="object"||"postmate"in i.data)&&i.data.type===o&&!!w[i.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(!m(t,this.childOrigin))return;const{value:s={}}=t.data,{name:r,data:a}=s;t.data.postmate==="emit"&&r in this.events&&this.events[r].call(this,a)},this.parent.addEventListener("message",this.listener,!1)}get(e){return new l.Promise(t=>{const s=++R,r=a=>{a.data.uid===s&&a.data.postmate==="reply"&&(this.parent.removeEventListener("message",r,!1),t(a.data.value))};this.parent.addEventListener("message",r,!1),this.child.postMessage({postmate:"request",type:o,property:e,uid:s},this.childOrigin)})}call(e,t){this.child.postMessage({postmate:"call",type:o,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 E{constructor(e){this.model=e.model,this.parent=e.parent,this.parentOrigin=e.parentOrigin,this.child=e.child,this.child.addEventListener("message",t=>{if(!m(t,this.parentOrigin))return;const{postmate:s,property:r,uid:a,data:h}=t.data,n=this.model[r];if(s!=="call"){const c=typeof n=="function"?n():n;l.Promise.resolve(c).then(d=>{t.source.postMessage({property:r,postmate:"reply",type:o,uid:a,value:d},t.origin)})}else r in this.model&&typeof n=="function"&&n(h)})}emit(e,t){this.parent.postMessage({postmate:"emit",type:o,value:{name:e,data:t}},this.parentOrigin)}}class l{constructor({container:e=document.body,model:t,url:s,name:r,classListArray:a=[]}){return this.parent=window,this.frame=document.createElement("iframe"),this.frame.name=r||"",this.frame.classList.add(...a),e.appendChild(this.frame),this.child=this.frame.contentWindow,this.model=t||{},this.sendHandshake(s)}sendHandshake(e){const t=(()=>{const a=document.createElement("a");a.href=e;const h=a.protocol.length>4?a.protocol:window.location.protocol,n=a.host.length?a.port==="80"||a.port==="443"?a.hostname:a.host:window.location.host;return a.origin||`${h}//${n}`})();let s=0,r;return new l.Promise((a,h)=>{const n=p=>{if(!m(p,t))return!1;p.data.postmate==="handshake-reply"?(clearInterval(r),this.parent.removeEventListener("message",n,!1),this.childOrigin=p.origin,a(new U(this))):h("Failed handshake")};this.parent.addEventListener("message",n,!1);const c=()=>{s++,this.child.postMessage({postmate:"handshake",type:o,model:this.model},t),s===5&&clearInterval(r)},d=()=>{c(),r=setInterval(c,500)};this.frame.onload=d,this.frame.attachEvent&&this.frame.attachEvent("onload",d),this.frame.src=e})}}class C{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:o},s.origin),this.parentOrigin=s.origin;const r=s.data.model;r&&Object.keys(r).forEach(a=>{this.model[a]=r[a]}),e(new E(this))}},!1)})}}l.debug=!1,l.Promise=(()=>{try{return typeof window<"u"?window.Promise:Promise}catch{return Promise}})(),l.Model=C;function f(i,e){for(const t of i)if(t.path===e||t.children&&Array.isArray(t.children)&&t.children.length>0&&f(t.children,e))return!0;return!1}function k(i,e){e.includes("?")&&(e=e.split("?")[0]);const t=g(i);return!t||t.length===0?!1:f(t,e)}function P(i){const e={path:i.path,name:i.name,meta:i.meta||{},redirect:i.redirect,children:i.children?i.children.map(t=>P(t)):[]};return e.meta=JSON.parse(JSON.stringify(e.meta)),e}function g(i){let e=[];return typeof i.getRoutes=="function"?e=i.getRoutes():i.options&&Array.isArray(i.options.routes)&&(e=i.options.routes),e.map(t=>P(t))||[]}function I(i,e){try{const t=new URL(i),s=new URL(e),r=t.protocol.toLowerCase()===s.protocol.toLowerCase(),a=t.hostname===s.hostname,h=t.port===s.port;return r&&a&&h}catch(t){return console.error("URL解析错误:",t),!1}}const y=()=>{const i=new WeakSet;return(e,t)=>{if(typeof t=="object"&&t!==null){if(i.has(t))return"[Circular Reference]";i.add(t)}return t}};class S{constructor(e,t,s){this.childPostmate=null,this.parentPostmate=null,this.isGetData=!1,this.getDataCllBack=null,this.router=null,this.routeUpdateCallback=void 0,this.router=t,this.routeUpdateCallback=s,window.top!==window.self?this.init(e):e.error({status:500,data:null,message:"未在一体化平台中运行"})}init(e){const t=this;this.childPostmate=new l.Model({baseData(s){s=JSON.parse(s),t.isGetData?t.getDataCllBack&&t.getDataCllBack({status:200,message:"success",data:s}):e.receive({status:200,message:"success",data:s}),t.isGetData=!1},getRoutes:()=>{if(t.router){let s=g(t.router);t.parentPostmate.emit("pushRoutes",JSON.stringify(s,y()))}else t.parentPostmate.emit("pushRoutes")},isRouteExists(s){t.router?t.parentPostmate.emit("routeExists",k(t.router,s)):t.parentPostmate.emit("routeExists",!1)},routeUpdate(s){try{const r=JSON.parse(s);if(t.routeUpdateCallback){t.routeUpdateCallback(r),t.parentPostmate.emit("route_update_result",!0),console.log("----------------- 【ChildPastMate】路由更新完成 -----------------");return}t.router?(t.router.replace(r.fullPath),t.parentPostmate.emit("route_update_result",!0),console.log("----------------- 【ChildPastMate】路由更新完成 -----------------")):(t.parentPostmate.emit("route_update_result",!1),console.warn("【ChildPastMate】未提供router实例,无法进行路由更新"))}catch(r){console.error("【ChildPastMate】路由更新失败:",r),t.parentPostmate.emit("route_update_result",!1)}}}).then(s=>{t.parentPostmate=s,t.getData(),e.success({status:200,message:"success",data:{ChildPostmate:s}}),t.parentPostmate.emit("route_update_support",!!t.router),t.router&&t.parentPostmate.emit("pushRoutes",JSON.stringify(g(t.router),y()))}).catch(s=>{e.error({status:500,data:null,message:s})})}getData(e){if(!this.parentPostmate){e({status:500,message:"父页面未连接",data:null});return}e?(this.isGetData=!0,this.getDataCllBack=e):(this.isGetData=!1,this.getDataCllBack=null),this.parentPostmate.emit("requestBaseData")}setRouter(e,t){this.router=e,t&&(this.routeUpdateCallback=t)}sendOtherRequest(e){this.parentPostmate&&this.parentPostmate.emit("otherRequest",e)}}class O{constructor(e,t,s="",r){this.postmateParent=null,this.dataInfo={loginInfo:{},token:"",isHideHeader:!0},this.iframeEle=null,this.currentUrl="",this.currentBaseUrl="",this.currentRouterPath="",this.currentIframe=null,this.loadFunction=null,this.handleOtherRequest=null,this.parsedCurrentUrl=null,this.childSupportsRouteUpdate=!0,this.childRoutes=[],this.eventBus={getRoutes:null,route_update_resultL:null},this.dataInfo=e||this.dataInfo,this.iframeEle=t,this.setIframeUrl(s),r&&(this.handleOtherRequest=r)}parseUrl(e){const t=document.createElement("a");t.href=e;const s=t.protocol.length>4?t.protocol:window.location.protocol,r=t.hostname,a=t.port||(s==="https:"?"443":s==="http:"?"80":""),h=t.pathname.startsWith("/")?t.pathname:`/${t.pathname}`,n=t.search,c=t.hash.slice(2,t.hash.length),d=t.origin||`${s}//${r}${a?`:${a}`:""}`,p=`${h}${c}`;return{protocol:s,host:r,port:a,pathname:h,search:n,hash:c,origin:d,fullPath:p}}compareUrlBase(e,t){const s=e.endsWith("/"),r=t.endsWith("/");return s&&r||!s&&!r||(s&&(t+="/"),r&&(e+="/")),e===t}compareUrlPath(e,t){if(!e||!t)return!1;const s=this.parseUrl(e),r=this.parseUrl(t);return s.pathname===r.pathname}compareUrlFull(e,t){if(!e||!t)return!1;const s=this.parseUrl(e),r=this.parseUrl(t);return s.fullPath===r.fullPath}clear(){this.postmateParent&&(this.postmateParent.destroy(),this.postmateParent=null),this.currentIframe&&this.currentIframe.parentNode&&this.currentIframe.parentNode.removeChild(this.currentIframe),this.currentIframe=null}async init(e=null){this.clear(),this.childSupportsRouteUpdate=!1,(!this.iframeEle||!this.currentUrl)&&this.destroy();const t=typeof this.iframeEle=="function"?this.iframeEle():this.iframeEle;if(!t){console.warn("【ParentPostmate】无法获取 iframe 容器");return}const s=new l({container:t,url:this.currentUrl,name:"",model:""});this.currentIframe=t.querySelector("iframe"),this.currentIframe.setAttribute("frameborder","0"),this.currentIframe.setAttribute("allow","fullscreen"),this.currentIframe.addEventListener("load",()=>{this.loadFunction&&this.loadFunction()}),s.then(r=>{this.postmateParent=r,r.on("requestBaseData",()=>{this.sendData()}),r.on("pushRoutes",a=>{a?this.childRoutes=JSON.parse(a):this.childRoutes=[],this.eventBus.getRoutes&&this.eventBus.getRoutes()}),r.on("routeExists",a=>{}),r.on("route_update_support",a=>{this.childSupportsRouteUpdate=a}),r.on("route_update_result",a=>{this.eventBus.route_update_result&&this.eventBus.route_update_result(a)}),r.on("otherRequest",a=>{this.handleOtherRequest&&this.handleOtherRequest(a)}),typeof e=="function"&&e()}).catch(r=>{console.error("【ParentPostmate】Postmate 连接失败:",r)})}setLoadFunction(e){this.loadFunction=e}setIframeUrl(e,t=""){var r;if(t&&!t.startsWith("/")&&(t="/"+t),!e){this.currentUrl="",this.currentRouterPath="",this.destroy(),console.error("【ParentPostmate】无加载地址,无法初始化");return}if(!this.postmateParent||!this.currentUrl){this.currentUrl=e,this.currentRouterPath=t,this.iframeEle?this.init():console.error("【ParentPostmate】无 iframe 容器,无法初始化");return}if(!this.childSupportsRouteUpdate||!((r=this.childRoutes)!=null&&r.length)||!I(this.currentUrl,e)){this.currentUrl=e,this.currentRouterPath=t,this.init();return}let s=!1;this.eventBus.getRoutes=()=>{s=!0,this.handleSimilarUrl(e,t)},this.postmateParent.call("getRoutes"),setTimeout(()=>{s||this.handleSimilarUrl(e,t)},1e3)}handleSimilarUrl(e,t){if(this.currentUrl=e,this.currentRouterPath=t||"",t&&f(this.childRoutes,t)){this.sendRouteUpdate({fullPath:t});return}let s=!1,r=e.split("?")[0];this.childRoutes.forEach(a=>{if(r.endsWith(a.path)){this.sendRouteUpdate({fullPath:a.path}),s=!0;return}}),!s&&this.init()}sendRouteUpdate(e){try{let t=!1;this.eventBus.route_update_result=s=>{t=s,this.loadFunction&&this.loadFunction()},this.postmateParent.call("routeUpdate",JSON.stringify(e)),console.log("---------------------- 【ParentPostmate】推送路由更新 ----------------------"),setTimeout(()=>{t||(console.warn("【ParentPostmate】推送路由更新失败,将重新初始化iframe"),this.childSupportsRouteUpdate=!1,this.init())},1e3)}catch(t){console.warn("【ParentPostmate】发送路由更新消息失败,将重新初始化iframe:",t),this.childSupportsRouteUpdate=!1,this.init()}}sendData(){this.postmateParent&&this.postmateParent.call("baseData",JSON.stringify(this.dataInfo))}destroy(){this.clear()}}u.ChildPostmate=S,u.ParentPostmate=O,Object.defineProperty(u,Symbol.toStringTag,{value:"Module"})});
|
|
2
2
|
//# sourceMappingURL=index.umd.js.map
|
package/lib/index.umd.js.gz
CHANGED
|
Binary file
|
package/lib/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../packages/postMeta/postMeta.js","../packages/postMeta/tools.ts","../packages/postMeta/ChildPostmate.ts","../packages/postMeta/ParentPostmate.ts"],"sourcesContent":["const MESSAGE_TYPE = \"application/x-postmate-v1+json\";\r\nlet uid = 0;\r\n\r\nconst allowedPostmateTypes = {\r\n handshake: 1,\r\n \"handshake-reply\": 1,\r\n call: 1,\r\n emit: 1,\r\n reply: 1,\r\n request: 1,\r\n};\r\n\r\n// 校验消息是否来自合法的来源\r\nfunction isValidMessage(event, allowedOrigin) {\r\n return (\r\n (typeof allowedOrigin !== \"string\" || event.origin === allowedOrigin) &&\r\n !!event.data &&\r\n (typeof event.data !== \"object\" || \"postmate\" in event.data) &&\r\n event.data.type === MESSAGE_TYPE &&\r\n !!allowedPostmateTypes[event.data.postmate]\r\n );\r\n}\r\n\r\n// ----------------- ParentAPI -----------------\r\nclass ParentAPI {\r\n constructor(config) {\r\n this.parent = config.parent;\r\n this.frame = config.frame;\r\n this.child = config.child;\r\n this.childOrigin = config.childOrigin;\r\n this.events = {};\r\n\r\n this.listener = (event) => {\r\n if (!isValidMessage(event, this.childOrigin)) return;\r\n const { value = {} } = event.data;\r\n const { name, data } = value;\r\n if (event.data.postmate === \"emit\" && name in this.events) {\r\n this.events[name].call(this, data);\r\n }\r\n };\r\n\r\n this.parent.addEventListener(\"message\", this.listener, false);\r\n }\r\n\r\n get(property) {\r\n return new Postmate.Promise((resolve) => {\r\n const id = ++uid;\r\n const handler = (event) => {\r\n if (event.data.uid === id && event.data.postmate === \"reply\") {\r\n this.parent.removeEventListener(\"message\", handler, false);\r\n resolve(event.data.value);\r\n }\r\n };\r\n this.parent.addEventListener(\"message\", handler, false);\r\n this.child.postMessage(\r\n {\r\n postmate: \"request\",\r\n type: MESSAGE_TYPE,\r\n property,\r\n uid: id,\r\n },\r\n this.childOrigin\r\n );\r\n });\r\n }\r\n\r\n call(method, data) {\r\n this.child.postMessage(\r\n {\r\n postmate: \"call\",\r\n type: MESSAGE_TYPE,\r\n property: method,\r\n data,\r\n },\r\n this.childOrigin\r\n );\r\n }\r\n\r\n on(event, callback) {\r\n this.events[event] = callback;\r\n }\r\n\r\n destroy() {\r\n window.removeEventListener(\"message\", this.listener, false);\r\n this.frame.parentNode.removeChild(this.frame);\r\n }\r\n}\r\n\r\n// ----------------- ChildAPI -----------------\r\nclass ChildAPI {\r\n constructor(config) {\r\n this.model = config.model;\r\n this.parent = config.parent;\r\n this.parentOrigin = config.parentOrigin;\r\n this.child = config.child;\r\n\r\n this.child.addEventListener(\"message\", (event) => {\r\n if (!isValidMessage(event, this.parentOrigin)) return;\r\n\r\n const { postmate, property, uid, data } = event.data;\r\n const value = this.model[property];\r\n\r\n if (postmate !== \"call\") {\r\n const result = typeof value === \"function\" ? value() : value;\r\n Postmate.Promise.resolve(result).then((res) => {\r\n event.source.postMessage(\r\n {\r\n property,\r\n postmate: \"reply\",\r\n type: MESSAGE_TYPE,\r\n uid,\r\n value: res,\r\n },\r\n event.origin\r\n );\r\n });\r\n } else if (property in this.model && typeof value === \"function\") {\r\n value(data);\r\n }\r\n });\r\n }\r\n\r\n emit(eventName, data) {\r\n this.parent.postMessage(\r\n {\r\n postmate: \"emit\",\r\n type: MESSAGE_TYPE,\r\n value: { name: eventName, data },\r\n },\r\n this.parentOrigin\r\n );\r\n }\r\n}\r\n\r\n// ----------------- Postmate -----------------\r\nclass Postmate {\r\n constructor({ container = document.body, model, url, name, classListArray = [] }) {\r\n this.parent = window;\r\n this.frame = document.createElement(\"iframe\");\r\n this.frame.name = name || \"\";\r\n this.frame.classList.add(...classListArray);\r\n container.appendChild(this.frame);\r\n\r\n this.child = this.frame.contentWindow;\r\n this.model = model || {};\r\n\r\n return this.sendHandshake(url);\r\n }\r\n\r\n sendHandshake(url) {\r\n const origin = (() => {\r\n const link = document.createElement(\"a\");\r\n link.href = url;\r\n const protocol = link.protocol.length > 4 ? link.protocol : window.location.protocol;\r\n const host = link.host.length ? (link.port === \"80\" || link.port === \"443\" ? link.hostname : link.host) : window.location.host;\r\n return link.origin || `${protocol}//${host}`;\r\n })();\r\n\r\n let attemptCount = 0;\r\n let interval;\r\n\r\n return new Postmate.Promise((resolve, reject) => {\r\n const listener = (event) => {\r\n if (!isValidMessage(event, origin)) return false;\r\n if (event.data.postmate === \"handshake-reply\") {\r\n clearInterval(interval);\r\n this.parent.removeEventListener(\"message\", listener, false);\r\n this.childOrigin = event.origin;\r\n resolve(new ParentAPI(this));\r\n } else {\r\n reject(\"Failed handshake\");\r\n }\r\n };\r\n\r\n this.parent.addEventListener(\"message\", listener, false);\r\n\r\n const send = () => {\r\n attemptCount++;\r\n this.child.postMessage(\r\n {\r\n postmate: \"handshake\",\r\n type: MESSAGE_TYPE,\r\n model: this.model,\r\n },\r\n origin\r\n );\r\n if (attemptCount === 5) clearInterval(interval);\r\n };\r\n\r\n const init = () => {\r\n send();\r\n interval = setInterval(send, 500);\r\n };\r\n\r\n this.frame.onload = init;\r\n this.frame.attachEvent && this.frame.attachEvent(\"onload\", init);\r\n this.frame.src = url;\r\n });\r\n }\r\n}\r\n\r\n// ----------------- Model -----------------\r\nclass Model {\r\n constructor(model) {\r\n this.child = window;\r\n this.model = model;\r\n this.parent = window.parent;\r\n\r\n return this.sendHandshakeReply();\r\n }\r\n\r\n sendHandshakeReply() {\r\n return new Postmate.Promise((resolve, reject) => {\r\n this.child.addEventListener(\"message\", (event) => {\r\n if (event.data.postmate) {\r\n if (event.data.postmate !== \"handshake\") return reject(\"Handshake Reply Failed\");\r\n\r\n this.child.removeEventListener(\"message\", this, false);\r\n event.source.postMessage(\r\n {\r\n postmate: \"handshake-reply\",\r\n type: MESSAGE_TYPE,\r\n },\r\n event.origin\r\n );\r\n\r\n this.parentOrigin = event.origin;\r\n const parentModel = event.data.model;\r\n if (parentModel) {\r\n Object.keys(parentModel).forEach((key) => {\r\n this.model[key] = parentModel[key];\r\n });\r\n }\r\n resolve(new ChildAPI(this));\r\n }\r\n }, false);\r\n });\r\n }\r\n}\r\n\r\n// Attach defaults\r\nPostmate.debug = false;\r\nPostmate.Promise = (() => {\r\n try {\r\n return typeof window !== \"undefined\" ? window.Promise : Promise;\r\n } catch {\r\n return Promise;\r\n }\r\n})();\r\nPostmate.Model = Model;\r\n\r\nexport default Postmate;\r\nexport { Model };\r\n","/**\r\n * 检查路径是否存在于路由配置中(递归检查所有层级)\r\n * @param routes 路由配置数组\r\n * @param path 需要检查的路径\r\n * @returns 是否存在\r\n */\r\nexport function checkPathInRoutes(routes: any[], path: string): boolean {\r\n for (const route of routes) {\r\n // 检查当前路由\r\n if (route.path === path) {\r\n return true;\r\n }\r\n\r\n // 递归检查子路由\r\n if (route.children && Array.isArray(route.children) && route.children.length > 0) {\r\n if (checkPathInRoutes(route.children, path)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * 判断路径是否存在于vue-router对象中(兼容Vue2和Vue3)\r\n * @param router vue-router实例\r\n * @param path 需要检查的页面路径\r\n * @returns 路径是否存在\r\n */\r\nexport function isRouteExists(router: any, path: string): boolean {\r\n // 移除路径中的查询参数\r\n if (path.includes('?')) {\r\n path = path.split('?')[0];\r\n }\r\n const routes = getRouterPaths(router);\r\n if (!routes || routes.length === 0) return false;\r\n return checkPathInRoutes(routes, path);\r\n}\r\n\r\n/**\r\n * 获取路由路径\r\n *\r\n */\r\nexport function getRouterPaths(router: any): any[] {\r\n let routes: any[] = [];\r\n // 区分Vue Router 3.x (Vue2) 和 4.x (Vue3)\r\n if (typeof router.getRoutes === 'function') {\r\n // Vue Router 4.x (Vue3)\r\n routes = router.getRoutes();\r\n } else if (router.options && Array.isArray(router.options.routes)) {\r\n // Vue Router 3.x (Vue2)\r\n routes = router.options.routes;\r\n }\r\n return routes || [];\r\n}\r\n\r\n\r\n/**\r\n * 比较两个URL的协议、IP(或域名)和端口是否完全相同\r\n * @param url1 第一个URL字符串\r\n * @param url2 第二个URL字符串\r\n * @returns 如果协议、IP(或域名)和端口都相同则返回true,否则返回false;解析失败时返回false\r\n */\r\nexport function areUrlsSameProtocolIpPort(url1: string, url2: string): boolean {\r\n try {\r\n // 解析两个URL\r\n const parsedUrl1 = new URL(url1);\r\n const parsedUrl2 = new URL(url2);\r\n \r\n // 比较协议(不区分大小写,但通常URL协议是小写的)\r\n const sameProtocol = parsedUrl1.protocol.toLowerCase() === parsedUrl2.protocol.toLowerCase();\r\n \r\n // 比较主机(IP或域名)\r\n const sameHost = parsedUrl1.hostname === parsedUrl2.hostname;\r\n \r\n // 比较端口(如果未指定端口,会使用协议默认端口)\r\n const samePort = parsedUrl1.port === parsedUrl2.port;\r\n \r\n // 只有所有部分都相同时才返回true\r\n return sameProtocol && sameHost && samePort;\r\n } catch (error) {\r\n // 如果URL解析失败,返回false\r\n console.error('URL解析错误:', error);\r\n return false;\r\n }\r\n}\r\n\r\n\r\nexport const getCircularReplacer = () => {\r\n\tconst seen = new WeakSet();\r\n\treturn (key, value) => {\r\n\t\tif (typeof value === 'object' && value !== null) {\r\n\t\t\tif (seen.has(value)) {\r\n\t\t\t\t// 遇到循环引用时,返回一个标识或忽略\r\n\t\t\t\treturn '[Circular Reference]';\r\n\t\t\t}\r\n\t\t\tseen.add(value);\r\n\t\t}\r\n\t\treturn value;\r\n\t};\r\n};","import Postmate from './postMeta';\nimport { getCircularReplacer, getRouterPaths, isRouteExists } from './tools';\n\ninterface EventObj {\n\terror: (error: any) => void;\n\tsuccess: (success: any) => void;\n\treceive: (receive: any) => void;\n}\n\n// 路由更新接口\ninterface RouteUpdateInfo {\n\tfullPath: string;\n}\n\nexport default class ChildPostmate {\n\tchildPostmate: any = null;\n\tparentPostmate: any = null;\n\n\tisGetData: boolean = false;\n\tgetDataCllBack: Function | null = null;\n\n\t// Vue Router实例\n\trouter: any = null;\n\t// 路由更新回调函数\n\trouteUpdateCallback: ((routeInfo: RouteUpdateInfo) => void) | undefined = undefined;\n\n\tconstructor(eventObj: EventObj, router: any, routeUpdateCallback?: (routeInfo: RouteUpdateInfo) => void) {\n\t\t// 保存router实例\n\t\tthis.router = router;\n\t\t// 保存路由更新回调函数\n\t\tthis.routeUpdateCallback = routeUpdateCallback;\n\n\t\tif (window.top !== window.self) this.init(eventObj);\n\t\telse {\n\t\t\teventObj.error({ status: 500, data: null, message: '未在一体化平台中运行' });\n\t\t}\n\t}\n\n\tinit(eventObj: EventObj) {\n\t\tconst that = this;\n\t\t// 创建 Postmate Model(作为子)\n\t\tthis.childPostmate = new Postmate.Model({\n\t\t\t// 定义子页面可以暴露给父页面的方法\n\t\t\tbaseData(data: any) {\n\t\t\t\tdata = JSON.parse(data);\n\t\t\t\tif (that.isGetData) {\n\t\t\t\t\tthat.getDataCllBack &&\n\t\t\t\t\t\tthat.getDataCllBack({\n\t\t\t\t\t\t\tstatus: 200,\n\t\t\t\t\t\t\tmessage: 'success',\n\t\t\t\t\t\t\tdata: data,\n\t\t\t\t\t\t});\n\t\t\t\t} else\n\t\t\t\t\teventObj.receive({\n\t\t\t\t\t\tstatus: 200,\n\t\t\t\t\t\tmessage: 'success',\n\t\t\t\t\t\tdata: data,\n\t\t\t\t\t});\n\t\t\t\tthat.isGetData = false;\n\t\t\t},\n\n\t\t\t// 提供当前系统的路由\n\t\t\tgetRoutes: () => {\n\t\t\t\t// 有路由\n\t\t\t\tif (that.router) {\n\t\t\t\t\tlet arr = getRouterPaths(that.router);\n\t\t\t\t\tthat.parentPostmate.emit('pushRoutes', JSON.stringify(arr, getCircularReplacer()));\n\t\t\t\t}\n\t\t\t\t// 无路由\n\t\t\t\telse that.parentPostmate.emit('pushRoutes');\n\t\t\t},\n\n\t\t\t// 检查路由是否存在\n\t\t\tisRouteExists(routePath: string) {\n\t\t\t\tif (that.router) that.parentPostmate.emit('routeExists', isRouteExists(that.router, routePath));\n\t\t\t\telse that.parentPostmate.emit('routeExists', false);\n\t\t\t},\n\n\t\t\t// 处理路由更新\n\t\t\trouteUpdate(routeInfoStr: string) {\n\t\t\t\t// 向父页面同步路由数据\n\t\t\t\ttry {\n\t\t\t\t\tconst routeInfo: RouteUpdateInfo = JSON.parse(routeInfoStr);\n\n\t\t\t\t\t// 如果提供了自定义的路由更新回调函数,则调用它\n\t\t\t\t\tif (that.routeUpdateCallback) {\n\t\t\t\t\t\tthat.routeUpdateCallback(routeInfo);\n\t\t\t\t\t\tthat.parentPostmate.emit('route_update_result', true);\n\t\t\t\t\t\tconsole.log('----------------- 【ChildPastMate】路由更新完成 -----------------');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// 如果提供了router实例,则使用router进行路由更新\n\t\t\t\t\tif (that.router) {\n\t\t\t\t\t\tthat.router.replace(routeInfo.fullPath);\n\t\t\t\t\t\tthat.parentPostmate.emit('route_update_result', true);\n\t\t\t\t\t\tconsole.log('----------------- 【ChildPastMate】路由更新完成 -----------------');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthat.parentPostmate.emit('route_update_result', false);\n\t\t\t\t\t\tconsole.warn('【ChildPastMate】未提供router实例,无法进行路由更新');\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('【ChildPastMate】路由更新失败:', error);\n\t\t\t\t\tthat.parentPostmate.emit('route_update_result', false);\n\t\t\t\t}\n\t\t\t},\n\t\t})\n\t\t\t.then((parent: any) => {\n\t\t\t\tthat.parentPostmate = parent;\n\t\t\t\tthat.getData();\n\t\t\t\t// 与父页面链接建立成功\n\t\t\t\teventObj.success({\n\t\t\t\t\tstatus: 200,\n\t\t\t\t\tmessage: 'success',\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tChildPostmate: parent,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\t// 告诉父系统支持路由更新\n\t\t\t\tthat.parentPostmate.emit('route_update_support', that.router ? true : false);\n\n\t\t\t\t// 向父页面同步路由数据\n\t\t\t\tthat.router && that.parentPostmate.emit('pushRoutes', JSON.stringify(getRouterPaths(that.router), getCircularReplacer()));\n\t\t\t})\n\t\t\t.catch((err: any) => {\n\t\t\t\teventObj.error({ status: 500, data: null, message: err });\n\t\t\t});\n\t}\n\n\t// 获取数据\n\tgetData(callback?: any) {\n\t\tif (!this.parentPostmate) {\n\t\t\tcallback({\n\t\t\t\tstatus: 500,\n\t\t\t\tmessage: '父页面未连接',\n\t\t\t\tdata: null,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (callback) {\n\t\t\tthis.isGetData = true;\n\t\t\tthis.getDataCllBack = callback;\n\t\t} else {\n\t\t\tthis.isGetData = false;\n\t\t\tthis.getDataCllBack = null;\n\t\t}\n\t\t// 向父页面获取数据\n\t\tthis.parentPostmate.emit('requestBaseData');\n\t}\n\n\t/**\n\t * 设置路由实例和路由更新回调\n\t * @param router Vue Router实例\n\t * @param routeUpdateCallback 自定义路由更新回调函数\n\t */\n\tsetRouter(router: any, routeUpdateCallback?: (routeInfo: RouteUpdateInfo) => void) {\n\t\tthis.router = router;\n\t\tif (routeUpdateCallback) {\n\t\t\tthis.routeUpdateCallback = routeUpdateCallback;\n\t\t}\n\t}\n\n\t/**\n\t * 向父页面发送其他请求\n\t * @param params 请求参数\n\t */\n\tsendOtherRequest(params: any) {\n\t\tif (!this.parentPostmate) return;\n\t\tthis.parentPostmate.emit('otherRequest', params);\n\t}\n}\n","import Postmate from './postMeta';\nimport { areUrlsSameProtocolIpPort, checkPathInRoutes } from './tools';\n\ninterface DataInfo {\n\tloginInfo: { [x: string]: any };\n\ttoken: string;\n\tisHideHeader: boolean;\n}\n\n// URL解析结果接口\ninterface ParsedUrl {\n\tprotocol: string;\n\thost: string;\n\tport: string;\n\tpathname: string;\n\tsearch: string;\n\thash: string;\n\torigin: string;\n\tfullPath: string;\n}\n\nexport default class ParentPostmate {\n\t/** 连接到的子 postmate 实例 */\n\tpostmateParent: any = null;\n\t/** 通讯数据 */\n\tdataInfo: DataInfo = {\n\t\tloginInfo: {},\n\t\ttoken: '',\n\t\tisHideHeader: true,\n\t};\n\t/** iframe Dom 容器 */\n\tiframeEle: any = null;\n\t/** 当前 iframe url */\n\tcurrentUrl: string = '';\n\t/** 当前url基础地址 */\n\tcurrentBaseUrl: string = '';\n\t/** 当前路由地址 */\n\tcurrentRouterPath: string = '';\n\t/** 存储当前的 iframe 元素 */\n\tcurrentIframe: any = null;\n\t/** iframe 加载完成执行函数 */\n\tloadFunction: (() => void) | null = null;\n\t/** 处理子类的其他请求方法 */\n\thandleOtherRequest: ((params: any) => void) | null = null;\n\t/** 当前URL解析结果 */\n\tparsedCurrentUrl: ParsedUrl | null = null;\n\t/** 子页面是否支持路由更新 */\n\tchildSupportsRouteUpdate: boolean = true;\n\t/** 子系统的路由列表 */\n\tchildRoutes: any[] = [];\n\n\teventBus: any = {\n\t\tgetRoutes: null,\n\t\troute_update_resultL: null,\n\t};\n\n\tconstructor(dataInfo: DataInfo, iframeEle: HTMLElement | (() => HTMLElement), iframeUrl: string = '', handleOtherRequest?: (params: any) => void) {\n\t\tthis.dataInfo = dataInfo || this.dataInfo;\n\t\tthis.iframeEle = iframeEle;\n\t\tthis.setIframeUrl(iframeUrl);\n\t\thandleOtherRequest && (this.handleOtherRequest = handleOtherRequest);\n\t}\n\n\t/** 解析URL */\n\tparseUrl(url: string): ParsedUrl {\n\t\tconst link = document.createElement('a');\n\t\tlink.href = url;\n\n\t\t// 获取协议\n\t\tconst protocol = link.protocol.length > 4 ? link.protocol : window.location.protocol;\n\n\t\t// 获取主机和端口\n\t\tconst host = link.hostname;\n\t\tconst port = link.port || (protocol === 'https:' ? '443' : protocol === 'http:' ? '80' : '');\n\n\t\t// 获取路径、查询参数和哈希\n\t\tconst pathname = link.pathname.startsWith('/') ? link.pathname : `/${link.pathname}`;\n\t\tconst search = link.search;\n\t\tconst hash = link.hash.slice(2, link.hash.length);\n\n\t\t// 构建origin\n\t\tconst origin = link.origin || `${protocol}//${host}${port ? `:${port}` : ''}`;\n\n\t\t// 构建完整路径(不包含origin)\n\t\tconst fullPath = `${pathname}${hash}`;\n\n\t\treturn {\n\t\t\tprotocol,\n\t\t\thost,\n\t\t\tport,\n\t\t\tpathname,\n\t\t\tsearch,\n\t\t\thash,\n\t\t\torigin,\n\t\t\tfullPath,\n\t\t};\n\t}\n\n\t/** 比较两个URL是否相同*/\n\tcompareUrlBase(url1: string, url2: string): boolean {\n\t\tconst url1End = url1.endsWith('/');\n\t\tconst url2End = url2.endsWith('/');\n\t\tif ((url1End && url2End) || (!url1End && !url2End)) {\n\t\t\treturn url1 === url2;\n\t\t} else {\n\t\t\tif (url1End) url2 += '/';\n\t\t\tif (url2End) url1 += '/';\n\t\t\treturn url1 === url2;\n\t\t}\n\t}\n\n\t/** 比较两个URL的路径是否相同(不包含查询参数和哈希) */\n\tcompareUrlPath(url1: string, url2: string): boolean {\n\t\tif (!url1 || !url2) return false;\n\n\t\tconst parsed1 = this.parseUrl(url1);\n\t\tconst parsed2 = this.parseUrl(url2);\n\n\t\treturn parsed1.pathname === parsed2.pathname;\n\t}\n\n\t/** 比较两个URL是否完全相同(包括查询参数和哈希) */\n\tcompareUrlFull(url1: string, url2: string): boolean {\n\t\tif (!url1 || !url2) return false;\n\n\t\tconst parsed1 = this.parseUrl(url1);\n\t\tconst parsed2 = this.parseUrl(url2);\n\n\t\treturn parsed1.fullPath === parsed2.fullPath;\n\t}\n\n\t/** 清除当前的 iframe 和 postmate 实例 */\n\tclear() {\n\t\t// 销毁 postmate 实例\n\t\tif (this.postmateParent) {\n\t\t\tthis.postmateParent.destroy();\n\t\t\tthis.postmateParent = null;\n\t\t}\n\n\t\t// 移除 iframe\n\t\tif (this.currentIframe && this.currentIframe.parentNode) {\n\t\t\tthis.currentIframe.parentNode.removeChild(this.currentIframe);\n\t\t}\n\t\tthis.currentIframe = null;\n\t}\n\n\t/** 初始化 */\n\tasync init(callback: any = null) {\n\t\t// 清除之前的实例和 iframe\n\t\tthis.clear();\n\n\t\t// 重置子页面路由更新支持标记\n\t\tthis.childSupportsRouteUpdate = false;\n\n\t\t// 如果没有容器,或集成链接\n\t\tif (!this.iframeEle || !this.currentUrl) {\n\t\t\tthis.destroy();\n\t\t}\n\n\t\t// 获取 iframe 容器\n\t\tconst container: any = typeof this.iframeEle === 'function' ? this.iframeEle() : this.iframeEle;\n\t\tif (!container) {\n\t\t\tconsole.warn('【ParentPostmate】无法获取 iframe 容器');\n\t\t\treturn;\n\t\t}\n\n\t\t// 创建 Postmate 实例(作为父)\n\t\tconst handshake: any = new Postmate({\n\t\t\tcontainer,\n\t\t\turl: this.currentUrl,\n\t\t\tname: '',\n\t\t\tmodel: '',\n\t\t});\n\n\t\t// 存储当前创建的 iframe\n\t\tthis.currentIframe = container.querySelector('iframe');\n\t\tthis.currentIframe.setAttribute('frameborder', '0');\n\t\tthis.currentIframe.setAttribute('allow', 'fullscreen');\n\t\tthis.currentIframe.addEventListener('load', () => {\n\t\t\tthis.loadFunction && this.loadFunction();\n\t\t});\n\n\t\thandshake\n\t\t\t.then((parent: any) => {\n\t\t\t\tthis.postmateParent = parent;\n\n\t\t\t\t// 监听子页面发来的获取数据请求\n\t\t\t\tparent.on('requestBaseData', () => {\n\t\t\t\t\t// 发送相关数据\n\t\t\t\t\tthis.sendData();\n\t\t\t\t});\n\n\t\t\t\t// 监听子页面发来的路由配置数据\n\t\t\t\tparent.on('pushRoutes', (routes: string) => {\n\t\t\t\t\tif (routes) this.childRoutes = JSON.parse(routes);\n\t\t\t\t\telse this.childRoutes = [];\n\t\t\t\t\tthis.eventBus.getRoutes && this.eventBus.getRoutes();\n\t\t\t\t});\n\n\t\t\t\t// 监听子页面的路由效验结果\n\t\t\t\tparent.on('routeExists', (flag: boolean) => {});\n\n\t\t\t\t// 监听子页面的动态路由变更支持\n\t\t\t\tparent.on('route_update_support', (flag: boolean) => {\n\t\t\t\t\tthis.childSupportsRouteUpdate = flag;\n\t\t\t\t});\n\n\t\t\t\t// 监听子页面的路由变更结果\n\t\t\t\tparent.on('route_update_result', (flag: boolean) => {\n\t\t\t\t\tthis.eventBus.route_update_result && this.eventBus.route_update_result(flag);\n\t\t\t\t});\n\n\t\t\t\t// 监听子页面发来的其他请求\n\t\t\t\tparent.on('otherRequest', (params: any) => {\n\t\t\t\t\tthis.handleOtherRequest && this.handleOtherRequest(params);\n\t\t\t\t});\n\n\t\t\t\tif (typeof callback === 'function') callback();\n\t\t\t})\n\t\t\t.catch((error: any) => {\n\t\t\t\tconsole.error('【ParentPostmate】Postmate 连接失败:', error);\n\t\t\t});\n\t}\n\n\t/** 设置load执行事件 */\n\tsetLoadFunction(loadFunction: () => void) {\n\t\tthis.loadFunction = loadFunction;\n\t}\n\n\t/** 设置 iframe url */\n\tsetIframeUrl(iframeUrl: string, routerPath: string = '') {\n\t\t// 如果传入了路由,则对路径进行规范处理\n\t\tif (routerPath && !routerPath.startsWith('/')) {\n\t\t\trouterPath = '/' + routerPath;\n\t\t}\n\n\t\t// 1、传入的地址为空:销毁当前实例\n\t\tif (!iframeUrl) {\n\t\t\tthis.currentUrl = '';\n\t\t\tthis.currentRouterPath = '';\n\t\t\tthis.destroy();\n\t\t\tconsole.error('【ParentPostmate】无加载地址,无法初始化');\n\t\t\treturn;\n\t\t}\n\n\t\t// 2、如果当前无连接:直接设置并初始化\n\t\tif (!this.postmateParent || !this.currentUrl) {\n\t\t\tthis.currentUrl = iframeUrl;\n\t\t\tthis.currentRouterPath = routerPath;\n\t\t\tif (this.iframeEle) this.init();\n\t\t\telse console.error('【ParentPostmate】无 iframe 容器,无法初始化');\n\t\t\treturn;\n\t\t}\n\n\t\t// 3、如果当前系统不支持路由更新 或 新旧系统协议、ip、端口不同则重新初始化: 重新初始化\n\t\tif (!this.childSupportsRouteUpdate || !this.childRoutes?.length || !areUrlsSameProtocolIpPort(this.currentUrl, iframeUrl)) {\n\t\t\tthis.currentUrl = iframeUrl;\n\t\t\tthis.currentRouterPath = routerPath;\n\t\t\tthis.init();\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * 因新旧地址的基础地址完全相同,且已加载系统支持路由更新\n\t\t * 下面处理新旧地址的url,研判操作方式\n\t\t **/\n\t\t// 更新路由列表\n\t\tlet flag = false;\n\t\tthis.eventBus.getRoutes = () => {\n\t\t\tflag = true;\n\t\t\tthis.handleSimilarUrl(iframeUrl, routerPath);\n\t\t};\n\t\tthis.postmateParent.call('getRoutes');\n\n\t\tsetTimeout(() => {\n\t\t\tif (flag) return;\n\t\t\tthis.handleSimilarUrl(iframeUrl, routerPath);\n\t\t}, 1000);\n\t}\n\n\t// 处理相似地址\n\thandleSimilarUrl(iframeUrl: string, routerPath?: string) {\n\t\tthis.currentUrl = iframeUrl;\n\t\tthis.currentRouterPath = routerPath || '';\n\n\t\t// 1 如果传入了routerPath,将该值与子系统匹配,判断是否可以直接跳转\n\t\tif (routerPath && checkPathInRoutes(this.childRoutes, routerPath)) {\n\t\t\t// 触发更新路由\n\t\t\tthis.sendRouteUpdate({\n\t\t\t\tfullPath: routerPath,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// 2 通过已加载子系统的路由列表匹配新链接的尾部路径,如果匹配到,则触发路由更新\n\t\tlet isEnd = false;\n\t\tlet noQueryUrl = iframeUrl.split('?')[0];\n\t\tthis.childRoutes.forEach((v) => {\n\t\t\tif (noQueryUrl.endsWith(v.path)) {\n\t\t\t\t// 触发更新路由\n\t\t\t\tthis.sendRouteUpdate({\n\t\t\t\t\tfullPath: v.path,\n\t\t\t\t});\n\t\t\t\tisEnd = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t});\n\t\tif (isEnd) return;\n\n\t\t// 3 如果以上两种情况都不满足,则重新初始化\n\t\tthis.init();\n\t}\n\n\t/** 向子页面发送路由更新消息 */\n\tsendRouteUpdate(parsedUrl: any) {\n\t\ttry {\n\t\t\tlet flag = false;\n\t\t\tthis.eventBus.route_update_result = (state: boolean) => {\n\t\t\t\tflag = state;\n\t\t\t\tthis.loadFunction && this.loadFunction();\n\t\t\t};\n\t\t\tthis.postmateParent.call('routeUpdate', JSON.stringify(parsedUrl));\n\t\t\tconsole.log('---------------------- 【ParentPostmate】推送路由更新 ----------------------');\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (flag) return;\n\t\t\t\tconsole.warn('【ParentPostmate】推送路由更新失败,将重新初始化iframe');\n\t\t\t\t// 标记子页面不支持路由更新\n\t\t\t\tthis.childSupportsRouteUpdate = false;\n\t\t\t\t// 如果发送消息失败,则重新初始化iframe\n\t\t\t\tthis.init();\n\t\t\t}, 1000);\n\t\t} catch (error) {\n\t\t\tconsole.warn('【ParentPostmate】发送路由更新消息失败,将重新初始化iframe:', error);\n\t\t\t// 标记子页面不支持路由更新\n\t\t\tthis.childSupportsRouteUpdate = false;\n\t\t\t// 如果发送消息失败,则重新初始化iframe\n\t\t\tthis.init();\n\t\t}\n\t}\n\n\t/** 向子页面发送消息 */\n\tsendData() {\n\t\tif (!this.postmateParent) return;\n\t\tthis.postmateParent.call('baseData', JSON.stringify(this.dataInfo));\n\t}\n\n\t/** 销毁实例 */\n\tdestroy() {\n\t\tthis.clear();\n\t}\n}\n"],"names":["MESSAGE_TYPE","uid","allowedPostmateTypes","isValidMessage","event","allowedOrigin","ParentAPI","config","value","name","data","property","Postmate","resolve","id","handler","method","callback","ChildAPI","postmate","result","res","eventName","container","model","url","classListArray","origin","link","protocol","host","attemptCount","interval","reject","listener","send","init","Model","parentModel","key","checkPathInRoutes","routes","path","route","isRouteExists","router","getRouterPaths","areUrlsSameProtocolIpPort","url1","url2","parsedUrl1","parsedUrl2","sameProtocol","sameHost","samePort","error","getCircularReplacer","seen","ChildPostmate","eventObj","routeUpdateCallback","that","arr","routePath","routeInfoStr","routeInfo","parent","err","params","ParentPostmate","dataInfo","iframeEle","iframeUrl","handleOtherRequest","port","pathname","search","hash","fullPath","url1End","url2End","parsed1","parsed2","handshake","flag","loadFunction","routerPath","_a","isEnd","noQueryUrl","v","parsedUrl","state"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../packages/postMeta/postMeta.js","../packages/postMeta/tools.ts","../packages/postMeta/ChildPostmate.ts","../packages/postMeta/ParentPostmate.ts"],"sourcesContent":["const MESSAGE_TYPE = \"application/x-postmate-v1+json\";\r\nlet uid = 0;\r\n\r\nconst allowedPostmateTypes = {\r\n handshake: 1,\r\n \"handshake-reply\": 1,\r\n call: 1,\r\n emit: 1,\r\n reply: 1,\r\n request: 1,\r\n};\r\n\r\n// 校验消息是否来自合法的来源\r\nfunction isValidMessage(event, allowedOrigin) {\r\n return (\r\n (typeof allowedOrigin !== \"string\" || event.origin === allowedOrigin) &&\r\n !!event.data &&\r\n (typeof event.data !== \"object\" || \"postmate\" in event.data) &&\r\n event.data.type === MESSAGE_TYPE &&\r\n !!allowedPostmateTypes[event.data.postmate]\r\n );\r\n}\r\n\r\n// ----------------- ParentAPI -----------------\r\nclass ParentAPI {\r\n constructor(config) {\r\n this.parent = config.parent;\r\n this.frame = config.frame;\r\n this.child = config.child;\r\n this.childOrigin = config.childOrigin;\r\n this.events = {};\r\n\r\n this.listener = (event) => {\r\n if (!isValidMessage(event, this.childOrigin)) return;\r\n const { value = {} } = event.data;\r\n const { name, data } = value;\r\n if (event.data.postmate === \"emit\" && name in this.events) {\r\n this.events[name].call(this, data);\r\n }\r\n };\r\n\r\n this.parent.addEventListener(\"message\", this.listener, false);\r\n }\r\n\r\n get(property) {\r\n return new Postmate.Promise((resolve) => {\r\n const id = ++uid;\r\n const handler = (event) => {\r\n if (event.data.uid === id && event.data.postmate === \"reply\") {\r\n this.parent.removeEventListener(\"message\", handler, false);\r\n resolve(event.data.value);\r\n }\r\n };\r\n this.parent.addEventListener(\"message\", handler, false);\r\n this.child.postMessage(\r\n {\r\n postmate: \"request\",\r\n type: MESSAGE_TYPE,\r\n property,\r\n uid: id,\r\n },\r\n this.childOrigin\r\n );\r\n });\r\n }\r\n\r\n call(method, data) {\r\n this.child.postMessage(\r\n {\r\n postmate: \"call\",\r\n type: MESSAGE_TYPE,\r\n property: method,\r\n data,\r\n },\r\n this.childOrigin\r\n );\r\n }\r\n\r\n on(event, callback) {\r\n this.events[event] = callback;\r\n }\r\n\r\n destroy() {\r\n window.removeEventListener(\"message\", this.listener, false);\r\n this.frame.parentNode.removeChild(this.frame);\r\n }\r\n}\r\n\r\n// ----------------- ChildAPI -----------------\r\nclass ChildAPI {\r\n constructor(config) {\r\n this.model = config.model;\r\n this.parent = config.parent;\r\n this.parentOrigin = config.parentOrigin;\r\n this.child = config.child;\r\n\r\n this.child.addEventListener(\"message\", (event) => {\r\n if (!isValidMessage(event, this.parentOrigin)) return;\r\n\r\n const { postmate, property, uid, data } = event.data;\r\n const value = this.model[property];\r\n\r\n if (postmate !== \"call\") {\r\n const result = typeof value === \"function\" ? value() : value;\r\n Postmate.Promise.resolve(result).then((res) => {\r\n event.source.postMessage(\r\n {\r\n property,\r\n postmate: \"reply\",\r\n type: MESSAGE_TYPE,\r\n uid,\r\n value: res,\r\n },\r\n event.origin\r\n );\r\n });\r\n } else if (property in this.model && typeof value === \"function\") {\r\n value(data);\r\n }\r\n });\r\n }\r\n\r\n emit(eventName, data) {\r\n this.parent.postMessage(\r\n {\r\n postmate: \"emit\",\r\n type: MESSAGE_TYPE,\r\n value: { name: eventName, data },\r\n },\r\n this.parentOrigin\r\n );\r\n }\r\n}\r\n\r\n// ----------------- Postmate -----------------\r\nclass Postmate {\r\n constructor({ container = document.body, model, url, name, classListArray = [] }) {\r\n this.parent = window;\r\n this.frame = document.createElement(\"iframe\");\r\n this.frame.name = name || \"\";\r\n this.frame.classList.add(...classListArray);\r\n container.appendChild(this.frame);\r\n\r\n this.child = this.frame.contentWindow;\r\n this.model = model || {};\r\n\r\n return this.sendHandshake(url);\r\n }\r\n\r\n sendHandshake(url) {\r\n const origin = (() => {\r\n const link = document.createElement(\"a\");\r\n link.href = url;\r\n const protocol = link.protocol.length > 4 ? link.protocol : window.location.protocol;\r\n const host = link.host.length ? (link.port === \"80\" || link.port === \"443\" ? link.hostname : link.host) : window.location.host;\r\n return link.origin || `${protocol}//${host}`;\r\n })();\r\n\r\n let attemptCount = 0;\r\n let interval;\r\n\r\n return new Postmate.Promise((resolve, reject) => {\r\n const listener = (event) => {\r\n if (!isValidMessage(event, origin)) return false;\r\n if (event.data.postmate === \"handshake-reply\") {\r\n clearInterval(interval);\r\n this.parent.removeEventListener(\"message\", listener, false);\r\n this.childOrigin = event.origin;\r\n resolve(new ParentAPI(this));\r\n } else {\r\n reject(\"Failed handshake\");\r\n }\r\n };\r\n\r\n this.parent.addEventListener(\"message\", listener, false);\r\n\r\n const send = () => {\r\n attemptCount++;\r\n this.child.postMessage(\r\n {\r\n postmate: \"handshake\",\r\n type: MESSAGE_TYPE,\r\n model: this.model,\r\n },\r\n origin\r\n );\r\n if (attemptCount === 5) clearInterval(interval);\r\n };\r\n\r\n const init = () => {\r\n send();\r\n interval = setInterval(send, 500);\r\n };\r\n\r\n this.frame.onload = init;\r\n this.frame.attachEvent && this.frame.attachEvent(\"onload\", init);\r\n this.frame.src = url;\r\n });\r\n }\r\n}\r\n\r\n// ----------------- Model -----------------\r\nclass Model {\r\n constructor(model) {\r\n this.child = window;\r\n this.model = model;\r\n this.parent = window.parent;\r\n\r\n return this.sendHandshakeReply();\r\n }\r\n\r\n sendHandshakeReply() {\r\n return new Postmate.Promise((resolve, reject) => {\r\n this.child.addEventListener(\"message\", (event) => {\r\n if (event.data.postmate) {\r\n if (event.data.postmate !== \"handshake\") return reject(\"Handshake Reply Failed\");\r\n\r\n this.child.removeEventListener(\"message\", this, false);\r\n event.source.postMessage(\r\n {\r\n postmate: \"handshake-reply\",\r\n type: MESSAGE_TYPE,\r\n },\r\n event.origin\r\n );\r\n\r\n this.parentOrigin = event.origin;\r\n const parentModel = event.data.model;\r\n if (parentModel) {\r\n Object.keys(parentModel).forEach((key) => {\r\n this.model[key] = parentModel[key];\r\n });\r\n }\r\n resolve(new ChildAPI(this));\r\n }\r\n }, false);\r\n });\r\n }\r\n}\r\n\r\n// Attach defaults\r\nPostmate.debug = false;\r\nPostmate.Promise = (() => {\r\n try {\r\n return typeof window !== \"undefined\" ? window.Promise : Promise;\r\n } catch {\r\n return Promise;\r\n }\r\n})();\r\nPostmate.Model = Model;\r\n\r\nexport default Postmate;\r\nexport { Model };\r\n","/**\r\n * 检查路径是否存在于路由配置中(递归检查所有层级)\r\n * @param routes 路由配置数组\r\n * @param path 需要检查的路径\r\n * @returns 是否存在\r\n */\r\nexport function checkPathInRoutes(routes: any[], path: string): boolean {\r\n\tfor (const route of routes) {\r\n\t\t// 检查当前路由\r\n\t\tif (route.path === path) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t// 递归检查子路由\r\n\t\tif (route.children && Array.isArray(route.children) && route.children.length > 0) {\r\n\t\t\tif (checkPathInRoutes(route.children, path)) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn false;\r\n}\r\n\r\n/**\r\n * 判断路径是否存在于vue-router对象中(兼容Vue2和Vue3)\r\n * @param router vue-router实例\r\n * @param path 需要检查的页面路径\r\n * @returns 路径是否存在\r\n */\r\nexport function isRouteExists(router: any, path: string): boolean {\r\n\t// 移除路径中的查询参数\r\n\tif (path.includes('?')) {\r\n\t\tpath = path.split('?')[0];\r\n\t}\r\n\tconst routes = getRouterPaths(router);\r\n\tif (!routes || routes.length === 0) return false;\r\n\treturn checkPathInRoutes(routes, path);\r\n}\r\n\r\n// 净化单个路由配置,只保留安全字段\r\nfunction purifyRoute(route) {\r\n\t// 只提取需要的基础字段,根据你的需求调整\r\n\tconst safeFields = {\r\n\t\tpath: route.path,\r\n\t\tname: route.name,\r\n\t\tmeta: route.meta || {}, // 确保meta是普通对象\r\n\t\tredirect: route.redirect,\r\n\t\t// 剔除 component、beforeEnter 等可能包含函数/对象引用的字段\r\n\t\t// 如果需要children,递归净化\r\n\t\tchildren: route.children ? route.children.map((child) => purifyRoute(child)) : [],\r\n\t};\r\n\r\n\t// 进一步净化meta(如果meta中可能有复杂对象)\r\n\tsafeFields.meta = JSON.parse(JSON.stringify(safeFields.meta));\r\n\r\n\treturn safeFields;\r\n}\r\n\r\n/**\r\n * 获取路由路径\r\n *\r\n */\r\nexport function getRouterPaths(router: any): any[] {\r\n\tlet routes: any[] = [];\r\n\t// 区分Vue Router 3.x (Vue2) 和 4.x (Vue3)\r\n\tif (typeof router.getRoutes === 'function') {\r\n\t\t// Vue Router 4.x (Vue3)\r\n\t\troutes = router.getRoutes();\r\n\t} else if (router.options && Array.isArray(router.options.routes)) {\r\n\t\t// Vue Router 3.x (Vue2)\r\n\t\troutes = router.options.routes;\r\n\t}\r\n\treturn routes.map((route) => purifyRoute(route)) || [];\r\n}\r\n\r\n/**\r\n * 比较两个URL的协议、IP(或域名)和端口是否完全相同\r\n * @param url1 第一个URL字符串\r\n * @param url2 第二个URL字符串\r\n * @returns 如果协议、IP(或域名)和端口都相同则返回true,否则返回false;解析失败时返回false\r\n */\r\nexport function areUrlsSameProtocolIpPort(url1: string, url2: string): boolean {\r\n\ttry {\r\n\t\t// 解析两个URL\r\n\t\tconst parsedUrl1 = new URL(url1);\r\n\t\tconst parsedUrl2 = new URL(url2);\r\n\r\n\t\t// 比较协议(不区分大小写,但通常URL协议是小写的)\r\n\t\tconst sameProtocol = parsedUrl1.protocol.toLowerCase() === parsedUrl2.protocol.toLowerCase();\r\n\r\n\t\t// 比较主机(IP或域名)\r\n\t\tconst sameHost = parsedUrl1.hostname === parsedUrl2.hostname;\r\n\r\n\t\t// 比较端口(如果未指定端口,会使用协议默认端口)\r\n\t\tconst samePort = parsedUrl1.port === parsedUrl2.port;\r\n\r\n\t\t// 只有所有部分都相同时才返回true\r\n\t\treturn sameProtocol && sameHost && samePort;\r\n\t} catch (error) {\r\n\t\t// 如果URL解析失败,返回false\r\n\t\tconsole.error('URL解析错误:', error);\r\n\t\treturn false;\r\n\t}\r\n}\r\n\r\nexport const getCircularReplacer = () => {\r\n\tconst seen = new WeakSet();\r\n\treturn (key, value) => {\r\n\t\tif (typeof value === 'object' && value !== null) {\r\n\t\t\tif (seen.has(value)) {\r\n\t\t\t\t// 遇到循环引用时,返回一个标识或忽略\r\n\t\t\t\treturn '[Circular Reference]';\r\n\t\t\t}\r\n\t\t\tseen.add(value);\r\n\t\t}\r\n\t\treturn value;\r\n\t};\r\n};\r\n","import Postmate from './postMeta';\nimport { getCircularReplacer, getRouterPaths, isRouteExists } from './tools';\n\ninterface EventObj {\n\terror: (error: any) => void;\n\tsuccess: (success: any) => void;\n\treceive: (receive: any) => void;\n}\n\n// 路由更新接口\ninterface RouteUpdateInfo {\n\tfullPath: string;\n}\n\nexport default class ChildPostmate {\n\tchildPostmate: any = null;\n\tparentPostmate: any = null;\n\n\tisGetData: boolean = false;\n\tgetDataCllBack: Function | null = null;\n\n\t// Vue Router实例\n\trouter: any = null;\n\t// 路由更新回调函数\n\trouteUpdateCallback: ((routeInfo: RouteUpdateInfo) => void) | undefined = undefined;\n\n\tconstructor(eventObj: EventObj, router: any, routeUpdateCallback?: (routeInfo: RouteUpdateInfo) => void) {\n\t\t// 保存router实例\n\t\tthis.router = router;\n\t\t// 保存路由更新回调函数\n\t\tthis.routeUpdateCallback = routeUpdateCallback;\n\n\t\tif (window.top !== window.self) this.init(eventObj);\n\t\telse {\n\t\t\teventObj.error({ status: 500, data: null, message: '未在一体化平台中运行' });\n\t\t}\n\t}\n\n\tinit(eventObj: EventObj) {\n\t\tconst that = this;\n\t\t// 创建 Postmate Model(作为子)\n\t\tthis.childPostmate = new Postmate.Model({\n\t\t\t// 定义子页面可以暴露给父页面的方法\n\t\t\tbaseData(data: any) {\n\t\t\t\tdata = JSON.parse(data);\n\t\t\t\tif (that.isGetData) {\n\t\t\t\t\tthat.getDataCllBack &&\n\t\t\t\t\t\tthat.getDataCllBack({\n\t\t\t\t\t\t\tstatus: 200,\n\t\t\t\t\t\t\tmessage: 'success',\n\t\t\t\t\t\t\tdata: data,\n\t\t\t\t\t\t});\n\t\t\t\t} else\n\t\t\t\t\teventObj.receive({\n\t\t\t\t\t\tstatus: 200,\n\t\t\t\t\t\tmessage: 'success',\n\t\t\t\t\t\tdata: data,\n\t\t\t\t\t});\n\t\t\t\tthat.isGetData = false;\n\t\t\t},\n\n\t\t\t// 提供当前系统的路由\n\t\t\tgetRoutes: () => {\n\t\t\t\t// 有路由\n\t\t\t\tif (that.router) {\n\t\t\t\t\tlet arr = getRouterPaths(that.router);\n\t\t\t\t\tthat.parentPostmate.emit('pushRoutes', JSON.stringify(arr, getCircularReplacer()));\n\t\t\t\t}\n\t\t\t\t// 无路由\n\t\t\t\telse that.parentPostmate.emit('pushRoutes');\n\t\t\t},\n\n\t\t\t// 检查路由是否存在\n\t\t\tisRouteExists(routePath: string) {\n\t\t\t\tif (that.router) that.parentPostmate.emit('routeExists', isRouteExists(that.router, routePath));\n\t\t\t\telse that.parentPostmate.emit('routeExists', false);\n\t\t\t},\n\n\t\t\t// 处理路由更新\n\t\t\trouteUpdate(routeInfoStr: string) {\n\t\t\t\t// 向父页面同步路由数据\n\t\t\t\ttry {\n\t\t\t\t\tconst routeInfo: RouteUpdateInfo = JSON.parse(routeInfoStr);\n\n\t\t\t\t\t// 如果提供了自定义的路由更新回调函数,则调用它\n\t\t\t\t\tif (that.routeUpdateCallback) {\n\t\t\t\t\t\tthat.routeUpdateCallback(routeInfo);\n\t\t\t\t\t\tthat.parentPostmate.emit('route_update_result', true);\n\t\t\t\t\t\tconsole.log('----------------- 【ChildPastMate】路由更新完成 -----------------');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// 如果提供了router实例,则使用router进行路由更新\n\t\t\t\t\tif (that.router) {\n\t\t\t\t\t\tthat.router.replace(routeInfo.fullPath);\n\t\t\t\t\t\tthat.parentPostmate.emit('route_update_result', true);\n\t\t\t\t\t\tconsole.log('----------------- 【ChildPastMate】路由更新完成 -----------------');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthat.parentPostmate.emit('route_update_result', false);\n\t\t\t\t\t\tconsole.warn('【ChildPastMate】未提供router实例,无法进行路由更新');\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('【ChildPastMate】路由更新失败:', error);\n\t\t\t\t\tthat.parentPostmate.emit('route_update_result', false);\n\t\t\t\t}\n\t\t\t},\n\t\t})\n\t\t\t.then((parent: any) => {\n\t\t\t\tthat.parentPostmate = parent;\n\t\t\t\tthat.getData();\n\t\t\t\t// 与父页面链接建立成功\n\t\t\t\teventObj.success({\n\t\t\t\t\tstatus: 200,\n\t\t\t\t\tmessage: 'success',\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tChildPostmate: parent,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\t// 告诉父系统支持路由更新\n\t\t\t\tthat.parentPostmate.emit('route_update_support', that.router ? true : false);\n\n\t\t\t\t// 向父页面同步路由数据\n\t\t\t\tthat.router && that.parentPostmate.emit('pushRoutes', JSON.stringify(getRouterPaths(that.router), getCircularReplacer()));\n\t\t\t})\n\t\t\t.catch((err: any) => {\n\t\t\t\teventObj.error({ status: 500, data: null, message: err });\n\t\t\t});\n\t}\n\n\t// 获取数据\n\tgetData(callback?: any) {\n\t\tif (!this.parentPostmate) {\n\t\t\tcallback({\n\t\t\t\tstatus: 500,\n\t\t\t\tmessage: '父页面未连接',\n\t\t\t\tdata: null,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (callback) {\n\t\t\tthis.isGetData = true;\n\t\t\tthis.getDataCllBack = callback;\n\t\t} else {\n\t\t\tthis.isGetData = false;\n\t\t\tthis.getDataCllBack = null;\n\t\t}\n\t\t// 向父页面获取数据\n\t\tthis.parentPostmate.emit('requestBaseData');\n\t}\n\n\t/**\n\t * 设置路由实例和路由更新回调\n\t * @param router Vue Router实例\n\t * @param routeUpdateCallback 自定义路由更新回调函数\n\t */\n\tsetRouter(router: any, routeUpdateCallback?: (routeInfo: RouteUpdateInfo) => void) {\n\t\tthis.router = router;\n\t\tif (routeUpdateCallback) {\n\t\t\tthis.routeUpdateCallback = routeUpdateCallback;\n\t\t}\n\t}\n\n\t/**\n\t * 向父页面发送其他请求\n\t * @param params 请求参数\n\t */\n\tsendOtherRequest(params: any) {\n\t\tif (!this.parentPostmate) return;\n\t\tthis.parentPostmate.emit('otherRequest', params);\n\t}\n}","import Postmate from './postMeta';\nimport { areUrlsSameProtocolIpPort, checkPathInRoutes } from './tools';\n\ninterface DataInfo {\n\tloginInfo: { [x: string]: any };\n\ttoken: string;\n\tisHideHeader: boolean;\n}\n\n// URL解析结果接口\ninterface ParsedUrl {\n\tprotocol: string;\n\thost: string;\n\tport: string;\n\tpathname: string;\n\tsearch: string;\n\thash: string;\n\torigin: string;\n\tfullPath: string;\n}\n\nexport default class ParentPostmate {\n\t/** 连接到的子 postmate 实例 */\n\tpostmateParent: any = null;\n\t/** 通讯数据 */\n\tdataInfo: DataInfo = {\n\t\tloginInfo: {},\n\t\ttoken: '',\n\t\tisHideHeader: true,\n\t};\n\t/** iframe Dom 容器 */\n\tiframeEle: any = null;\n\t/** 当前 iframe url */\n\tcurrentUrl: string = '';\n\t/** 当前url基础地址 */\n\tcurrentBaseUrl: string = '';\n\t/** 当前路由地址 */\n\tcurrentRouterPath: string = '';\n\t/** 存储当前的 iframe 元素 */\n\tcurrentIframe: any = null;\n\t/** iframe 加载完成执行函数 */\n\tloadFunction: (() => void) | null = null;\n\t/** 处理子类的其他请求方法 */\n\thandleOtherRequest: ((params: any) => void) | null = null;\n\t/** 当前URL解析结果 */\n\tparsedCurrentUrl: ParsedUrl | null = null;\n\t/** 子页面是否支持路由更新 */\n\tchildSupportsRouteUpdate: boolean = true;\n\t/** 子系统的路由列表 */\n\tchildRoutes: any[] = [];\n\n\teventBus: any = {\n\t\tgetRoutes: null,\n\t\troute_update_resultL: null,\n\t};\n\n\tconstructor(dataInfo: DataInfo, iframeEle: HTMLElement | (() => HTMLElement), iframeUrl: string = '', handleOtherRequest?: (params: any) => void) {\n\t\tthis.dataInfo = dataInfo || this.dataInfo;\n\t\tthis.iframeEle = iframeEle;\n\t\tthis.setIframeUrl(iframeUrl);\n\t\thandleOtherRequest && (this.handleOtherRequest = handleOtherRequest);\n\t}\n\n\t/** 解析URL */\n\tparseUrl(url: string): ParsedUrl {\n\t\tconst link = document.createElement('a');\n\t\tlink.href = url;\n\n\t\t// 获取协议\n\t\tconst protocol = link.protocol.length > 4 ? link.protocol : window.location.protocol;\n\n\t\t// 获取主机和端口\n\t\tconst host = link.hostname;\n\t\tconst port = link.port || (protocol === 'https:' ? '443' : protocol === 'http:' ? '80' : '');\n\n\t\t// 获取路径、查询参数和哈希\n\t\tconst pathname = link.pathname.startsWith('/') ? link.pathname : `/${link.pathname}`;\n\t\tconst search = link.search;\n\t\tconst hash = link.hash.slice(2, link.hash.length);\n\n\t\t// 构建origin\n\t\tconst origin = link.origin || `${protocol}//${host}${port ? `:${port}` : ''}`;\n\n\t\t// 构建完整路径(不包含origin)\n\t\tconst fullPath = `${pathname}${hash}`;\n\n\t\treturn {\n\t\t\tprotocol,\n\t\t\thost,\n\t\t\tport,\n\t\t\tpathname,\n\t\t\tsearch,\n\t\t\thash,\n\t\t\torigin,\n\t\t\tfullPath,\n\t\t};\n\t}\n\n\t/** 比较两个URL是否相同*/\n\tcompareUrlBase(url1: string, url2: string): boolean {\n\t\tconst url1End = url1.endsWith('/');\n\t\tconst url2End = url2.endsWith('/');\n\t\tif ((url1End && url2End) || (!url1End && !url2End)) {\n\t\t\treturn url1 === url2;\n\t\t} else {\n\t\t\tif (url1End) url2 += '/';\n\t\t\tif (url2End) url1 += '/';\n\t\t\treturn url1 === url2;\n\t\t}\n\t}\n\n\t/** 比较两个URL的路径是否相同(不包含查询参数和哈希) */\n\tcompareUrlPath(url1: string, url2: string): boolean {\n\t\tif (!url1 || !url2) return false;\n\n\t\tconst parsed1 = this.parseUrl(url1);\n\t\tconst parsed2 = this.parseUrl(url2);\n\n\t\treturn parsed1.pathname === parsed2.pathname;\n\t}\n\n\t/** 比较两个URL是否完全相同(包括查询参数和哈希) */\n\tcompareUrlFull(url1: string, url2: string): boolean {\n\t\tif (!url1 || !url2) return false;\n\n\t\tconst parsed1 = this.parseUrl(url1);\n\t\tconst parsed2 = this.parseUrl(url2);\n\n\t\treturn parsed1.fullPath === parsed2.fullPath;\n\t}\n\n\t/** 清除当前的 iframe 和 postmate 实例 */\n\tclear() {\n\t\t// 销毁 postmate 实例\n\t\tif (this.postmateParent) {\n\t\t\tthis.postmateParent.destroy();\n\t\t\tthis.postmateParent = null;\n\t\t}\n\n\t\t// 移除 iframe\n\t\tif (this.currentIframe && this.currentIframe.parentNode) {\n\t\t\tthis.currentIframe.parentNode.removeChild(this.currentIframe);\n\t\t}\n\t\tthis.currentIframe = null;\n\t}\n\n\t/** 初始化 */\n\tasync init(callback: any = null) {\n\t\t// 清除之前的实例和 iframe\n\t\tthis.clear();\n\n\t\t// 重置子页面路由更新支持标记\n\t\tthis.childSupportsRouteUpdate = false;\n\n\t\t// 如果没有容器,或集成链接\n\t\tif (!this.iframeEle || !this.currentUrl) {\n\t\t\tthis.destroy();\n\t\t}\n\n\t\t// 获取 iframe 容器\n\t\tconst container: any = typeof this.iframeEle === 'function' ? this.iframeEle() : this.iframeEle;\n\t\tif (!container) {\n\t\t\tconsole.warn('【ParentPostmate】无法获取 iframe 容器');\n\t\t\treturn;\n\t\t}\n\n\t\t// 创建 Postmate 实例(作为父)\n\t\tconst handshake: any = new Postmate({\n\t\t\tcontainer,\n\t\t\turl: this.currentUrl,\n\t\t\tname: '',\n\t\t\tmodel: '',\n\t\t});\n\n\t\t// 存储当前创建的 iframe\n\t\tthis.currentIframe = container.querySelector('iframe');\n\t\tthis.currentIframe.setAttribute('frameborder', '0');\n\t\tthis.currentIframe.setAttribute('allow', 'fullscreen');\n\t\tthis.currentIframe.addEventListener('load', () => {\n\t\t\tthis.loadFunction && this.loadFunction();\n\t\t});\n\n\t\thandshake\n\t\t\t.then((parent: any) => {\n\t\t\t\tthis.postmateParent = parent;\n\n\t\t\t\t// 监听子页面发来的获取数据请求\n\t\t\t\tparent.on('requestBaseData', () => {\n\t\t\t\t\t// 发送相关数据\n\t\t\t\t\tthis.sendData();\n\t\t\t\t});\n\n\t\t\t\t// 监听子页面发来的路由配置数据\n\t\t\t\tparent.on('pushRoutes', (routes: string) => {\n\t\t\t\t\tif (routes) this.childRoutes = JSON.parse(routes);\n\t\t\t\t\telse this.childRoutes = [];\n\t\t\t\t\tthis.eventBus.getRoutes && this.eventBus.getRoutes();\n\t\t\t\t});\n\n\t\t\t\t// 监听子页面的路由效验结果\n\t\t\t\tparent.on('routeExists', (flag: boolean) => {});\n\n\t\t\t\t// 监听子页面的动态路由变更支持\n\t\t\t\tparent.on('route_update_support', (flag: boolean) => {\n\t\t\t\t\tthis.childSupportsRouteUpdate = flag;\n\t\t\t\t});\n\n\t\t\t\t// 监听子页面的路由变更结果\n\t\t\t\tparent.on('route_update_result', (flag: boolean) => {\n\t\t\t\t\tthis.eventBus.route_update_result && this.eventBus.route_update_result(flag);\n\t\t\t\t});\n\n\t\t\t\t// 监听子页面发来的其他请求\n\t\t\t\tparent.on('otherRequest', (params: any) => {\n\t\t\t\t\tthis.handleOtherRequest && this.handleOtherRequest(params);\n\t\t\t\t});\n\n\t\t\t\tif (typeof callback === 'function') callback();\n\t\t\t})\n\t\t\t.catch((error: any) => {\n\t\t\t\tconsole.error('【ParentPostmate】Postmate 连接失败:', error);\n\t\t\t});\n\t}\n\n\t/** 设置load执行事件 */\n\tsetLoadFunction(loadFunction: () => void) {\n\t\tthis.loadFunction = loadFunction;\n\t}\n\n\t/** 设置 iframe url */\n\tsetIframeUrl(iframeUrl: string, routerPath: string = '') {\n\t\t// 如果传入了路由,则对路径进行规范处理\n\t\tif (routerPath && !routerPath.startsWith('/')) {\n\t\t\trouterPath = '/' + routerPath;\n\t\t}\n\n\t\t// 1、传入的地址为空:销毁当前实例\n\t\tif (!iframeUrl) {\n\t\t\tthis.currentUrl = '';\n\t\t\tthis.currentRouterPath = '';\n\t\t\tthis.destroy();\n\t\t\tconsole.error('【ParentPostmate】无加载地址,无法初始化');\n\t\t\treturn;\n\t\t}\n\n\t\t// 2、如果当前无连接:直接设置并初始化\n\t\tif (!this.postmateParent || !this.currentUrl) {\n\t\t\tthis.currentUrl = iframeUrl;\n\t\t\tthis.currentRouterPath = routerPath;\n\t\t\tif (this.iframeEle) this.init();\n\t\t\telse console.error('【ParentPostmate】无 iframe 容器,无法初始化');\n\t\t\treturn;\n\t\t}\n\n\t\t// 3、如果当前系统不支持路由更新 或 新旧系统协议、ip、端口不同则重新初始化: 重新初始化\n\t\tif (!this.childSupportsRouteUpdate || !this.childRoutes?.length || !areUrlsSameProtocolIpPort(this.currentUrl, iframeUrl)) {\n\t\t\tthis.currentUrl = iframeUrl;\n\t\t\tthis.currentRouterPath = routerPath;\n\t\t\tthis.init();\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * 因新旧地址的基础地址完全相同,且已加载系统支持路由更新\n\t\t * 下面处理新旧地址的url,研判操作方式\n\t\t **/\n\t\t// 更新路由列表\n\t\tlet flag = false;\n\t\tthis.eventBus.getRoutes = () => {\n\t\t\tflag = true;\n\t\t\tthis.handleSimilarUrl(iframeUrl, routerPath);\n\t\t};\n\t\tthis.postmateParent.call('getRoutes');\n\n\t\tsetTimeout(() => {\n\t\t\tif (flag) return;\n\t\t\tthis.handleSimilarUrl(iframeUrl, routerPath);\n\t\t}, 1000);\n\t}\n\n\t// 处理相似地址\n\thandleSimilarUrl(iframeUrl: string, routerPath?: string) {\n\t\tthis.currentUrl = iframeUrl;\n\t\tthis.currentRouterPath = routerPath || '';\n\n\t\t// 1 如果传入了routerPath,将该值与子系统匹配,判断是否可以直接跳转\n\t\tif (routerPath && checkPathInRoutes(this.childRoutes, routerPath)) {\n\t\t\t// 触发更新路由\n\t\t\tthis.sendRouteUpdate({\n\t\t\t\tfullPath: routerPath,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// 2 通过已加载子系统的路由列表匹配新链接的尾部路径,如果匹配到,则触发路由更新\n\t\tlet isEnd = false;\n\t\tlet noQueryUrl = iframeUrl.split('?')[0];\n\t\tthis.childRoutes.forEach((v) => {\n\t\t\tif (noQueryUrl.endsWith(v.path)) {\n\t\t\t\t// 触发更新路由\n\t\t\t\tthis.sendRouteUpdate({\n\t\t\t\t\tfullPath: v.path,\n\t\t\t\t});\n\t\t\t\tisEnd = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t});\n\t\tif (isEnd) return;\n\n\t\t// 3 如果以上两种情况都不满足,则重新初始化\n\t\tthis.init();\n\t}\n\n\t/** 向子页面发送路由更新消息 */\n\tsendRouteUpdate(parsedUrl: any) {\n\t\ttry {\n\t\t\tlet flag = false;\n\t\t\tthis.eventBus.route_update_result = (state: boolean) => {\n\t\t\t\tflag = state;\n\t\t\t\tthis.loadFunction && this.loadFunction();\n\t\t\t};\n\t\t\tthis.postmateParent.call('routeUpdate', JSON.stringify(parsedUrl));\n\t\t\tconsole.log('---------------------- 【ParentPostmate】推送路由更新 ----------------------');\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (flag) return;\n\t\t\t\tconsole.warn('【ParentPostmate】推送路由更新失败,将重新初始化iframe');\n\t\t\t\t// 标记子页面不支持路由更新\n\t\t\t\tthis.childSupportsRouteUpdate = false;\n\t\t\t\t// 如果发送消息失败,则重新初始化iframe\n\t\t\t\tthis.init();\n\t\t\t}, 1000);\n\t\t} catch (error) {\n\t\t\tconsole.warn('【ParentPostmate】发送路由更新消息失败,将重新初始化iframe:', error);\n\t\t\t// 标记子页面不支持路由更新\n\t\t\tthis.childSupportsRouteUpdate = false;\n\t\t\t// 如果发送消息失败,则重新初始化iframe\n\t\t\tthis.init();\n\t\t}\n\t}\n\n\t/** 向子页面发送消息 */\n\tsendData() {\n\t\tif (!this.postmateParent) return;\n\t\tthis.postmateParent.call('baseData', JSON.stringify(this.dataInfo));\n\t}\n\n\t/** 销毁实例 */\n\tdestroy() {\n\t\tthis.clear();\n\t}\n}\n"],"names":["MESSAGE_TYPE","uid","allowedPostmateTypes","isValidMessage","event","allowedOrigin","ParentAPI","config","value","name","data","property","Postmate","resolve","id","handler","method","callback","ChildAPI","postmate","result","res","eventName","container","model","url","classListArray","origin","link","protocol","host","attemptCount","interval","reject","listener","send","init","Model","parentModel","key","checkPathInRoutes","routes","path","route","isRouteExists","router","getRouterPaths","purifyRoute","safeFields","child","areUrlsSameProtocolIpPort","url1","url2","parsedUrl1","parsedUrl2","sameProtocol","sameHost","samePort","error","getCircularReplacer","seen","ChildPostmate","eventObj","routeUpdateCallback","that","arr","routePath","routeInfoStr","routeInfo","parent","err","params","ParentPostmate","dataInfo","iframeEle","iframeUrl","handleOtherRequest","port","pathname","search","hash","fullPath","url1End","url2End","parsed1","parsed2","handshake","flag","loadFunction","routerPath","_a","isEnd","noQueryUrl","v","parsedUrl","state"],"mappings":"wOAAA,MAAMA,EAAe,iCACrB,IAAIC,EAAM,EAEV,MAAMC,EAAuB,CACzB,UAAW,EACX,kBAAmB,EACnB,KAAM,EACN,KAAM,EACN,MAAO,EACP,QAAS,CACb,EAGA,SAASC,EAAeC,EAAOC,EAAe,CAC1C,OACK,OAAOA,GAAkB,UAAYD,EAAM,SAAWC,IACvD,CAAC,CAACD,EAAM,OACP,OAAOA,EAAM,MAAS,UAAY,aAAcA,EAAM,OACvDA,EAAM,KAAK,OAASJ,GACpB,CAAC,CAACE,EAAqBE,EAAM,KAAK,QAAQ,CAElD,CAGA,MAAME,CAAU,CACZ,YAAYC,EAAQ,CAChB,KAAK,OAASA,EAAO,OACrB,KAAK,MAAQA,EAAO,MACpB,KAAK,MAAQA,EAAO,MACpB,KAAK,YAAcA,EAAO,YAC1B,KAAK,OAAS,GAEd,KAAK,SAAYH,GAAU,CACvB,GAAI,CAACD,EAAeC,EAAO,KAAK,WAAW,EAAG,OAC9C,KAAM,CAAE,MAAAI,EAAQ,CAAA,GAAOJ,EAAM,KACvB,CAAE,KAAAK,EAAM,KAAAC,CAAM,EAAGF,EACnBJ,EAAM,KAAK,WAAa,QAAUK,KAAQ,KAAK,QAC/C,KAAK,OAAOA,CAAI,EAAE,KAAK,KAAMC,CAAI,CAEjD,EAEQ,KAAK,OAAO,iBAAiB,UAAW,KAAK,SAAU,EAAK,CAC/D,CAED,IAAIC,EAAU,CACV,OAAO,IAAIC,EAAS,QAASC,GAAY,CACrC,MAAMC,EAAK,EAAEb,EACPc,EAAWX,GAAU,CACnBA,EAAM,KAAK,MAAQU,GAAMV,EAAM,KAAK,WAAa,UACjD,KAAK,OAAO,oBAAoB,UAAWW,EAAS,EAAK,EACzDF,EAAQT,EAAM,KAAK,KAAK,EAE5C,EACY,KAAK,OAAO,iBAAiB,UAAWW,EAAS,EAAK,EACtD,KAAK,MAAM,YACP,CACI,SAAU,UACV,KAAMf,EACN,SAAAW,EACA,IAAKG,CACR,EACD,KAAK,WACrB,CACA,CAAS,CACJ,CAED,KAAKE,EAAQN,EAAM,CACf,KAAK,MAAM,YACP,CACI,SAAU,OACV,KAAMV,EACN,SAAUgB,EACV,KAAAN,CACH,EACD,KAAK,WACjB,CACK,CAED,GAAGN,EAAOa,EAAU,CAChB,KAAK,OAAOb,CAAK,EAAIa,CACxB,CAED,SAAU,CACN,OAAO,oBAAoB,UAAW,KAAK,SAAU,EAAK,EAC1D,KAAK,MAAM,WAAW,YAAY,KAAK,KAAK,CAC/C,CACL,CAGA,MAAMC,CAAS,CACX,YAAYX,EAAQ,CAChB,KAAK,MAAQA,EAAO,MACpB,KAAK,OAASA,EAAO,OACrB,KAAK,aAAeA,EAAO,aAC3B,KAAK,MAAQA,EAAO,MAEpB,KAAK,MAAM,iBAAiB,UAAYH,GAAU,CAC9C,GAAI,CAACD,EAAeC,EAAO,KAAK,YAAY,EAAG,OAE/C,KAAM,CAAE,SAAAe,EAAU,SAAAR,EAAU,IAAAV,EAAK,KAAAS,CAAM,EAAGN,EAAM,KAC1CI,EAAQ,KAAK,MAAMG,CAAQ,EAEjC,GAAIQ,IAAa,OAAQ,CACrB,MAAMC,EAAS,OAAOZ,GAAU,WAAaA,EAAK,EAAKA,EACvDI,EAAS,QAAQ,QAAQQ,CAAM,EAAE,KAAMC,GAAQ,CAC3CjB,EAAM,OAAO,YACT,CACI,SAAAO,EACA,SAAU,QACV,KAAMX,EACN,IAAAC,EACA,MAAOoB,CACV,EACDjB,EAAM,MAC9B,CACA,CAAiB,CACjB,MAAuBO,KAAY,KAAK,OAAS,OAAOH,GAAU,YAClDA,EAAME,CAAI,CAE1B,CAAS,CACJ,CAED,KAAKY,EAAWZ,EAAM,CAClB,KAAK,OAAO,YACR,CACI,SAAU,OACV,KAAMV,EACN,MAAO,CAAE,KAAMsB,EAAW,KAAAZ,CAAM,CACnC,EACD,KAAK,YACjB,CACK,CACL,CAGA,MAAME,CAAS,CACX,YAAY,CAAE,UAAAW,EAAY,SAAS,KAAM,MAAAC,EAAO,IAAAC,EAAK,KAAAhB,EAAM,eAAAiB,EAAiB,CAAA,GAAM,CAC9E,YAAK,OAAS,OACd,KAAK,MAAQ,SAAS,cAAc,QAAQ,EAC5C,KAAK,MAAM,KAAOjB,GAAQ,GAC1B,KAAK,MAAM,UAAU,IAAI,GAAGiB,CAAc,EAC1CH,EAAU,YAAY,KAAK,KAAK,EAEhC,KAAK,MAAQ,KAAK,MAAM,cACxB,KAAK,MAAQC,GAAS,GAEf,KAAK,cAAcC,CAAG,CAChC,CAED,cAAcA,EAAK,CACf,MAAME,GAAU,IAAM,CAClB,MAAMC,EAAO,SAAS,cAAc,GAAG,EACvCA,EAAK,KAAOH,EACZ,MAAMI,EAAWD,EAAK,SAAS,OAAS,EAAIA,EAAK,SAAW,OAAO,SAAS,SACtEE,EAAOF,EAAK,KAAK,OAAUA,EAAK,OAAS,MAAQA,EAAK,OAAS,MAAQA,EAAK,SAAWA,EAAK,KAAQ,OAAO,SAAS,KAC1H,OAAOA,EAAK,QAAU,GAAGC,CAAQ,KAAKC,CAAI,EACtD,KAEQ,IAAIC,EAAe,EACfC,EAEJ,OAAO,IAAIpB,EAAS,QAAQ,CAACC,EAASoB,IAAW,CAC7C,MAAMC,EAAY9B,GAAU,CACxB,GAAI,CAACD,EAAeC,EAAOuB,CAAM,EAAG,MAAO,GACvCvB,EAAM,KAAK,WAAa,mBACxB,cAAc4B,CAAQ,EACtB,KAAK,OAAO,oBAAoB,UAAWE,EAAU,EAAK,EAC1D,KAAK,YAAc9B,EAAM,OACzBS,EAAQ,IAAIP,EAAU,IAAI,CAAC,GAE3B2B,EAAO,kBAAkB,CAE7C,EAEY,KAAK,OAAO,iBAAiB,UAAWC,EAAU,EAAK,EAEvD,MAAMC,EAAO,IAAM,CACfJ,IACA,KAAK,MAAM,YACP,CACI,SAAU,YACV,KAAM/B,EACN,MAAO,KAAK,KACf,EACD2B,CACpB,EACoBI,IAAiB,GAAG,cAAcC,CAAQ,CAC9D,EAEkBI,EAAO,IAAM,CACfD,IACAH,EAAW,YAAYG,EAAM,GAAG,CAChD,EAEY,KAAK,MAAM,OAASC,EACpB,KAAK,MAAM,aAAe,KAAK,MAAM,YAAY,SAAUA,CAAI,EAC/D,KAAK,MAAM,IAAMX,CAC7B,CAAS,CACJ,CACL,CAGA,MAAMY,CAAM,CACR,YAAYb,EAAO,CACf,YAAK,MAAQ,OACb,KAAK,MAAQA,EACb,KAAK,OAAS,OAAO,OAEd,KAAK,oBACf,CAED,oBAAqB,CACjB,OAAO,IAAIZ,EAAS,QAAQ,CAACC,EAASoB,IAAW,CAC7C,KAAK,MAAM,iBAAiB,UAAY7B,GAAU,CAC9C,GAAIA,EAAM,KAAK,SAAU,CACrB,GAAIA,EAAM,KAAK,WAAa,YAAa,OAAO6B,EAAO,wBAAwB,EAE/E,KAAK,MAAM,oBAAoB,UAAW,KAAM,EAAK,EACrD7B,EAAM,OAAO,YACT,CACI,SAAU,kBACV,KAAMJ,CACT,EACDI,EAAM,MAC9B,EAEoB,KAAK,aAAeA,EAAM,OAC1B,MAAMkC,EAAclC,EAAM,KAAK,MAC3BkC,GACA,OAAO,KAAKA,CAAW,EAAE,QAASC,GAAQ,CACtC,KAAK,MAAMA,CAAG,EAAID,EAAYC,CAAG,CAC7D,CAAyB,EAEL1B,EAAQ,IAAIK,EAAS,IAAI,CAAC,CAC7B,CACJ,EAAE,EAAK,CACpB,CAAS,CACJ,CACL,CAGAN,EAAS,MAAQ,GACjBA,EAAS,SAAW,IAAM,CACtB,GAAI,CACA,OAAO,OAAO,OAAW,IAAc,OAAO,QAAU,OAChE,MAAY,CACJ,OAAO,OACV,CACL,KACAA,EAAS,MAAQyB,ECnPD,SAAAG,EAAkBC,EAAeC,EAAuB,CACvE,UAAWC,KAASF,EAOf,GALAE,EAAM,OAASD,GAKfC,EAAM,UAAY,MAAM,QAAQA,EAAM,QAAQ,GAAKA,EAAM,SAAS,OAAS,GAC1EH,EAAkBG,EAAM,SAAUD,CAAI,EAClC,MAAA,GAIH,MAAA,EACR,CAQgB,SAAAE,EAAcC,EAAaH,EAAuB,CAE7DA,EAAK,SAAS,GAAG,IACpBA,EAAOA,EAAK,MAAM,GAAG,EAAE,CAAC,GAEnB,MAAAD,EAASK,EAAeD,CAAM,EACpC,MAAI,CAACJ,GAAUA,EAAO,SAAW,EAAU,GACpCD,EAAkBC,EAAQC,CAAI,CACtC,CAGA,SAASK,EAAYJ,EAAO,CAE3B,MAAMK,EAAa,CAClB,KAAML,EAAM,KACZ,KAAMA,EAAM,KACZ,KAAMA,EAAM,MAAQ,CAAC,EACrB,SAAUA,EAAM,SAGhB,SAAUA,EAAM,SAAWA,EAAM,SAAS,IAAKM,GAAUF,EAAYE,CAAK,CAAC,EAAI,CAAA,CAChF,EAGA,OAAAD,EAAW,KAAO,KAAK,MAAM,KAAK,UAAUA,EAAW,IAAI,CAAC,EAErDA,CACR,CAMO,SAASF,EAAeD,EAAoB,CAClD,IAAIJ,EAAgB,CAAC,EAEjB,OAAA,OAAOI,EAAO,WAAc,WAE/BJ,EAASI,EAAO,UAAU,EAChBA,EAAO,SAAW,MAAM,QAAQA,EAAO,QAAQ,MAAM,IAE/DJ,EAASI,EAAO,QAAQ,QAElBJ,EAAO,IAAKE,GAAUI,EAAYJ,CAAK,CAAC,GAAK,CAAC,CACtD,CAQgB,SAAAO,EAA0BC,EAAcC,EAAuB,CAC1E,GAAA,CAEG,MAAAC,EAAa,IAAI,IAAIF,CAAI,EACzBG,EAAa,IAAI,IAAIF,CAAI,EAGzBG,EAAeF,EAAW,SAAS,gBAAkBC,EAAW,SAAS,YAAY,EAGrFE,EAAWH,EAAW,WAAaC,EAAW,SAG9CG,EAAWJ,EAAW,OAASC,EAAW,KAGhD,OAAOC,GAAgBC,GAAYC,QAC3BC,EAAO,CAEP,eAAA,MAAM,WAAYA,CAAK,EACxB,EAAA,CAET,CAEO,MAAMC,EAAsB,IAAM,CAClC,MAAAC,MAAW,QACV,MAAA,CAACrB,EAAK/B,IAAU,CACtB,GAAI,OAAOA,GAAU,UAAYA,IAAU,KAAM,CAC5C,GAAAoD,EAAK,IAAIpD,CAAK,EAEV,MAAA,uBAERoD,EAAK,IAAIpD,CAAK,CAAA,CAER,OAAAA,CACR,CACD,ECvGA,MAAqBqD,CAAc,CAYlC,YAAYC,EAAoBjB,EAAakB,EAA4D,CAXpF,KAAA,cAAA,KACC,KAAA,eAAA,KAED,KAAA,UAAA,GACa,KAAA,eAAA,KAGpB,KAAA,OAAA,KAE4D,KAAA,oBAAA,OAIzE,KAAK,OAASlB,EAEd,KAAK,oBAAsBkB,EAEvB,OAAO,MAAQ,OAAO,KAAM,KAAK,KAAKD,CAAQ,EAExCA,EAAA,MAAM,CAAE,OAAQ,IAAK,KAAM,KAAM,QAAS,aAAc,CAClE,CAGD,KAAKA,EAAoB,CACxB,MAAME,EAAO,KAER,KAAA,cAAgB,IAAIpD,EAAS,MAAM,CAEvC,SAASF,EAAW,CACZA,EAAA,KAAK,MAAMA,CAAI,EAClBsD,EAAK,UACHA,EAAA,gBACJA,EAAK,eAAe,CACnB,OAAQ,IACR,QAAS,UACT,KAAAtD,CAAA,CACA,EAEFoD,EAAS,QAAQ,CAChB,OAAQ,IACR,QAAS,UACT,KAAApD,CAAA,CACA,EACFsD,EAAK,UAAY,EAClB,EAGA,UAAW,IAAM,CAEhB,GAAIA,EAAK,OAAQ,CACZ,IAAAC,EAAMnB,EAAekB,EAAK,MAAM,EAC/BA,EAAA,eAAe,KAAK,aAAc,KAAK,UAAUC,EAAKN,EAAA,CAAqB,CAAC,CAG7E,MAAAK,EAAK,eAAe,KAAK,YAAY,CAC3C,EAGA,cAAcE,EAAmB,CAC5BF,EAAK,OAAQA,EAAK,eAAe,KAAK,cAAepB,EAAcoB,EAAK,OAAQE,CAAS,CAAC,EACpFF,EAAA,eAAe,KAAK,cAAe,EAAK,CACnD,EAGA,YAAYG,EAAsB,CAE7B,GAAA,CACG,MAAAC,EAA6B,KAAK,MAAMD,CAAY,EAG1D,GAAIH,EAAK,oBAAqB,CAC7BA,EAAK,oBAAoBI,CAAS,EAC7BJ,EAAA,eAAe,KAAK,sBAAuB,EAAI,EACpD,QAAQ,IAAI,2DAA2D,EACvE,MAAA,CAIGA,EAAK,QACHA,EAAA,OAAO,QAAQI,EAAU,QAAQ,EACjCJ,EAAA,eAAe,KAAK,sBAAuB,EAAI,EACpD,QAAQ,IAAI,2DAA2D,IAElEA,EAAA,eAAe,KAAK,sBAAuB,EAAK,EACrD,QAAQ,KAAK,qCAAqC,SAE3CN,EAAO,CACP,QAAA,MAAM,yBAA0BA,CAAK,EACxCM,EAAA,eAAe,KAAK,sBAAuB,EAAK,CAAA,CACtD,CACD,CACA,EACC,KAAMK,GAAgB,CACtBL,EAAK,eAAiBK,EACtBL,EAAK,QAAQ,EAEbF,EAAS,QAAQ,CAChB,OAAQ,IACR,QAAS,UACT,KAAM,CACL,cAAeO,CAAA,CAChB,CACA,EAEDL,EAAK,eAAe,KAAK,uBAAwB,EAAAA,EAAK,MAAqB,EAG3EA,EAAK,QAAUA,EAAK,eAAe,KAAK,aAAc,KAAK,UAAUlB,EAAekB,EAAK,MAAM,EAAGL,EAAqB,CAAA,CAAC,CAAA,CACxH,EACA,MAAOW,GAAa,CACXR,EAAA,MAAM,CAAE,OAAQ,IAAK,KAAM,KAAM,QAASQ,EAAK,CAAA,CACxD,CAAA,CAIH,QAAQrD,EAAgB,CACnB,GAAA,CAAC,KAAK,eAAgB,CAChBA,EAAA,CACR,OAAQ,IACR,QAAS,SACT,KAAM,IAAA,CACN,EACD,MAAA,CAGGA,GACH,KAAK,UAAY,GACjB,KAAK,eAAiBA,IAEtB,KAAK,UAAY,GACjB,KAAK,eAAiB,MAGlB,KAAA,eAAe,KAAK,iBAAiB,CAAA,CAQ3C,UAAU4B,EAAakB,EAA4D,CAClF,KAAK,OAASlB,EACVkB,IACH,KAAK,oBAAsBA,EAC5B,CAOD,iBAAiBQ,EAAa,CACxB,KAAK,gBACL,KAAA,eAAe,KAAK,eAAgBA,CAAM,CAAA,CAEjD,CCtJA,MAAqBC,CAAe,CAmCnC,YAAYC,EAAoBC,EAA8CC,EAAoB,GAAIC,EAA4C,CAjC5H,KAAA,eAAA,KAED,KAAA,SAAA,CACpB,UAAW,CAAC,EACZ,MAAO,GACP,aAAc,EACf,EAEiB,KAAA,UAAA,KAEI,KAAA,WAAA,GAEI,KAAA,eAAA,GAEG,KAAA,kBAAA,GAEP,KAAA,cAAA,KAEe,KAAA,aAAA,KAEiB,KAAA,mBAAA,KAEhB,KAAA,iBAAA,KAED,KAAA,yBAAA,GAEpC,KAAA,YAAqB,CAAC,EAEN,KAAA,SAAA,CACf,UAAW,KACX,qBAAsB,IACvB,EAGM,KAAA,SAAWH,GAAY,KAAK,SACjC,KAAK,UAAYC,EACjB,KAAK,aAAaC,CAAS,EAC3BC,IAAuB,KAAK,mBAAqBA,EAAA,CAIlD,SAASnD,EAAwB,CAC1B,MAAAG,EAAO,SAAS,cAAc,GAAG,EACvCA,EAAK,KAAOH,EAGN,MAAAI,EAAWD,EAAK,SAAS,OAAS,EAAIA,EAAK,SAAW,OAAO,SAAS,SAGtEE,EAAOF,EAAK,SACZiD,EAAOjD,EAAK,OAASC,IAAa,SAAW,MAAQA,IAAa,QAAU,KAAO,IAGnFiD,EAAWlD,EAAK,SAAS,WAAW,GAAG,EAAIA,EAAK,SAAW,IAAIA,EAAK,QAAQ,GAC5EmD,EAASnD,EAAK,OACdoD,EAAOpD,EAAK,KAAK,MAAM,EAAGA,EAAK,KAAK,MAAM,EAG1CD,EAASC,EAAK,QAAU,GAAGC,CAAQ,KAAKC,CAAI,GAAG+C,EAAO,IAAIA,CAAI,GAAK,EAAE,GAGrEI,EAAW,GAAGH,CAAQ,GAAGE,CAAI,GAE5B,MAAA,CACN,SAAAnD,EACA,KAAAC,EACA,KAAA+C,EACA,SAAAC,EACA,OAAAC,EACA,KAAAC,EACA,OAAArD,EACA,SAAAsD,CACD,CAAA,CAID,eAAe9B,EAAcC,EAAuB,CAC7C,MAAA8B,EAAU/B,EAAK,SAAS,GAAG,EAC3BgC,EAAU/B,EAAK,SAAS,GAAG,EACjC,OAAK8B,GAAWC,GAAa,CAACD,GAAW,CAACC,IAGrCD,IAAiB9B,GAAA,KACjB+B,IAAiBhC,GAAA,MACdA,IAASC,CACjB,CAID,eAAeD,EAAcC,EAAuB,CACnD,GAAI,CAACD,GAAQ,CAACC,EAAa,MAAA,GAErB,MAAAgC,EAAU,KAAK,SAASjC,CAAI,EAC5BkC,EAAU,KAAK,SAASjC,CAAI,EAE3B,OAAAgC,EAAQ,WAAaC,EAAQ,QAAA,CAIrC,eAAelC,EAAcC,EAAuB,CACnD,GAAI,CAACD,GAAQ,CAACC,EAAa,MAAA,GAErB,MAAAgC,EAAU,KAAK,SAASjC,CAAI,EAC5BkC,EAAU,KAAK,SAASjC,CAAI,EAE3B,OAAAgC,EAAQ,WAAaC,EAAQ,QAAA,CAIrC,OAAQ,CAEH,KAAK,iBACR,KAAK,eAAe,QAAQ,EAC5B,KAAK,eAAiB,MAInB,KAAK,eAAiB,KAAK,cAAc,YAC5C,KAAK,cAAc,WAAW,YAAY,KAAK,aAAa,EAE7D,KAAK,cAAgB,IAAA,CAItB,MAAM,KAAKpE,EAAgB,KAAM,CAEhC,KAAK,MAAM,EAGX,KAAK,yBAA2B,IAG5B,CAAC,KAAK,WAAa,CAAC,KAAK,aAC5B,KAAK,QAAQ,EAIR,MAAAM,EAAiB,OAAO,KAAK,WAAc,WAAa,KAAK,YAAc,KAAK,UACtF,GAAI,CAACA,EAAW,CACf,QAAQ,KAAK,gCAAgC,EAC7C,MAAA,CAIK,MAAA+D,EAAiB,IAAI1E,EAAS,CACnC,UAAAW,EACA,IAAK,KAAK,WACV,KAAM,GACN,MAAO,EAAA,CACP,EAGI,KAAA,cAAgBA,EAAU,cAAc,QAAQ,EAChD,KAAA,cAAc,aAAa,cAAe,GAAG,EAC7C,KAAA,cAAc,aAAa,QAAS,YAAY,EAChD,KAAA,cAAc,iBAAiB,OAAQ,IAAM,CAC5C,KAAA,cAAgB,KAAK,aAAa,CAAA,CACvC,EAGC+D,EAAA,KAAMjB,GAAgB,CACtB,KAAK,eAAiBA,EAGfA,EAAA,GAAG,kBAAmB,IAAM,CAElC,KAAK,SAAS,CAAA,CACd,EAGMA,EAAA,GAAG,aAAe5B,GAAmB,CACvCA,EAAQ,KAAK,YAAc,KAAK,MAAMA,CAAM,EAC3C,KAAK,YAAc,CAAC,EACzB,KAAK,SAAS,WAAa,KAAK,SAAS,UAAU,CAAA,CACnD,EAGM4B,EAAA,GAAG,cAAgBkB,GAAkB,CAAA,CAAE,EAGvClB,EAAA,GAAG,uBAAyBkB,GAAkB,CACpD,KAAK,yBAA2BA,CAAA,CAChC,EAGMlB,EAAA,GAAG,sBAAwBkB,GAAkB,CACnD,KAAK,SAAS,qBAAuB,KAAK,SAAS,oBAAoBA,CAAI,CAAA,CAC3E,EAGMlB,EAAA,GAAG,eAAiBE,GAAgB,CACrC,KAAA,oBAAsB,KAAK,mBAAmBA,CAAM,CAAA,CACzD,EAEG,OAAOtD,GAAa,YAAqBA,EAAA,CAAA,CAC7C,EACA,MAAOyC,GAAe,CACd,QAAA,MAAM,iCAAkCA,CAAK,CAAA,CACrD,CAAA,CAIH,gBAAgB8B,EAA0B,CACzC,KAAK,aAAeA,CAAA,CAIrB,aAAab,EAAmBc,EAAqB,GAAI,OAOxD,GALIA,GAAc,CAACA,EAAW,WAAW,GAAG,IAC3CA,EAAa,IAAMA,GAIhB,CAACd,EAAW,CACf,KAAK,WAAa,GAClB,KAAK,kBAAoB,GACzB,KAAK,QAAQ,EACb,QAAQ,MAAM,6BAA6B,EAC3C,MAAA,CAID,GAAI,CAAC,KAAK,gBAAkB,CAAC,KAAK,WAAY,CAC7C,KAAK,WAAaA,EAClB,KAAK,kBAAoBc,EACrB,KAAK,UAAW,KAAK,KAAK,EACzB,QAAQ,MAAM,mCAAmC,EACtD,MAAA,CAID,GAAI,CAAC,KAAK,0BAA4B,GAACC,EAAA,KAAK,cAAL,MAAAA,EAAkB,SAAU,CAACxC,EAA0B,KAAK,WAAYyB,CAAS,EAAG,CAC1H,KAAK,WAAaA,EAClB,KAAK,kBAAoBc,EACzB,KAAK,KAAK,EACV,MAAA,CAQD,IAAIF,EAAO,GACN,KAAA,SAAS,UAAY,IAAM,CACxBA,EAAA,GACF,KAAA,iBAAiBZ,EAAWc,CAAU,CAC5C,EACK,KAAA,eAAe,KAAK,WAAW,EAEpC,WAAW,IAAM,CACZF,GACC,KAAA,iBAAiBZ,EAAWc,CAAU,GACzC,GAAI,CAAA,CAIR,iBAAiBd,EAAmBc,EAAqB,CAKxD,GAJA,KAAK,WAAad,EAClB,KAAK,kBAAoBc,GAAc,GAGnCA,GAAcjD,EAAkB,KAAK,YAAaiD,CAAU,EAAG,CAElE,KAAK,gBAAgB,CACpB,SAAUA,CAAA,CACV,EACD,MAAA,CAID,IAAIE,EAAQ,GACRC,EAAajB,EAAU,MAAM,GAAG,EAAE,CAAC,EAClC,KAAA,YAAY,QAASkB,GAAM,CAC/B,GAAID,EAAW,SAASC,EAAE,IAAI,EAAG,CAEhC,KAAK,gBAAgB,CACpB,SAAUA,EAAE,IAAA,CACZ,EACOF,EAAA,GACR,MAAA,CACD,CACA,EACG,CAAAA,GAGJ,KAAK,KAAK,CAAA,CAIX,gBAAgBG,EAAgB,CAC3B,GAAA,CACH,IAAIP,EAAO,GACN,KAAA,SAAS,oBAAuBQ,GAAmB,CAChDR,EAAAQ,EACF,KAAA,cAAgB,KAAK,aAAa,CACxC,EACA,KAAK,eAAe,KAAK,cAAe,KAAK,UAAUD,CAAS,CAAC,EACjE,QAAQ,IAAI,sEAAsE,EAClF,WAAW,IAAM,CACZP,IACJ,QAAQ,KAAK,uCAAuC,EAEpD,KAAK,yBAA2B,GAEhC,KAAK,KAAK,IACR,GAAI,QACC7B,EAAO,CACP,QAAA,KAAK,2CAA4CA,CAAK,EAE9D,KAAK,yBAA2B,GAEhC,KAAK,KAAK,CAAA,CACX,CAID,UAAW,CACL,KAAK,gBACV,KAAK,eAAe,KAAK,WAAY,KAAK,UAAU,KAAK,QAAQ,CAAC,CAAA,CAInE,SAAU,CACT,KAAK,MAAM,CAAA,CAEb"}
|