-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
121 lines (105 loc) · 2.33 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
const randomCharacters = () =>
Number(Math.floor(Math.random() * 36 ** 6)).toString(36);
const generateId = () =>
`${new Date().getTime().toString(36)}:${randomCharacters()}`;
let localName;
const modules = {};
const onEvents = [];
function emit(event, data) {
window.parent.postMessage(
{
iframessaData: {
sender: localName,
event,
data,
},
},
"*"
);
}
window.addEventListener("message", (event) => {
if (event && event.data && event.data.iframessaSetting) {
const setting = event.data.iframessaSetting;
if (setting.event === "register") {
modules[setting.sender] = {
name: setting.sender,
iframe: document.querySelector(`iframe[name=${setting.sender}]`),
emit(event, data) {
this.iframe.contentWindow.postMessage(
{
iframessaData: {
sender: localName,
event,
data,
},
},
"*"
);
},
};
}
} else if (event && event.data && event.data.iframessaData) {
const data = event.data.iframessaData;
onEvents
.filter(({ event: ev }) => ev === data.event)
.forEach(({ fn }) => {
fn({
sender: modules[data.sender] || {
name: "_parent",
emit,
},
data: data.data,
});
});
}
});
module.exports = {
register(name) {
localName = name;
window.parent.postMessage(
{
iframessaSetting: {
sender: localName,
event: "register",
},
},
"*"
);
},
emit,
on(event, fn) {
onEvents.push({
event,
fn,
});
},
get modules() {
return modules;
},
getter(event, fnc) {
onEvents.push({
event: `getter:${event}`,
async fn(data) {
const response = await fnc({ ...data, data: data.data.data });
data.sender.emit(`get:${event}:${data.data.id}`, response);
},
});
},
get(event, fn, data) {
const id = generateId();
emit(`getter:${event}`, {
id,
data,
});
onEvents.push({
event: `get:${event}:${id}`,
fn(data) {
onEvents.splice(
onEvents.indexOf(({ event }) => event === `get:${event}:${id}`),
1
);
fn(data);
},
});
},
};