@telperion/messenger 7.6.1
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/LICENSE +21 -0
- package/README.md +600 -0
- package/broadcast/default-channel-name.cjs +4 -0
- package/broadcast/default-channel-name.d.ts +1 -0
- package/broadcast/default-channel-name.js +3 -0
- package/broadcast/default-channel-name.js.map +1 -0
- package/broadcast/index.cjs +13 -0
- package/broadcast/index.d.ts +5 -0
- package/broadcast/index.js +7 -0
- package/broadcast/index.js.map +1 -0
- package/broadcast/message-client.cjs +26 -0
- package/broadcast/message-client.d.ts +12 -0
- package/broadcast/message-client.js +24 -0
- package/broadcast/message-client.js.map +1 -0
- package/broadcast/message-host.cjs +28 -0
- package/broadcast/message-host.d.ts +9 -0
- package/broadcast/message-host.js +26 -0
- package/broadcast/message-host.js.map +1 -0
- package/broadcast/message-service.cjs +13 -0
- package/broadcast/message-service.d.ts +8 -0
- package/broadcast/message-service.js +11 -0
- package/broadcast/message-service.js.map +1 -0
- package/chrome/default-connection-name.cjs +4 -0
- package/chrome/default-connection-name.d.ts +1 -0
- package/chrome/default-connection-name.js +3 -0
- package/chrome/default-connection-name.js.map +1 -0
- package/chrome/index.cjs +11 -0
- package/chrome/index.d.ts +4 -0
- package/chrome/index.js +6 -0
- package/chrome/index.js.map +1 -0
- package/chrome/message-client.cjs +41 -0
- package/chrome/message-client.d.ts +15 -0
- package/chrome/message-client.js +39 -0
- package/chrome/message-client.js.map +1 -0
- package/chrome/message-host.cjs +43 -0
- package/chrome/message-host.d.ts +9 -0
- package/chrome/message-host.js +41 -0
- package/chrome/message-host.js.map +1 -0
- package/docs/images/broadcast-communication.svg +87 -0
- package/docs/images/chrome-extension-communication.svg +110 -0
- package/docs/images/core-architecture.svg +59 -0
- package/docs/images/iframe-communication.svg +74 -0
- package/docs/images/worker-communication.svg +75 -0
- package/iframe/channel-path-splitter.cjs +4 -0
- package/iframe/channel-path-splitter.d.ts +1 -0
- package/iframe/channel-path-splitter.js +3 -0
- package/iframe/channel-path-splitter.js.map +1 -0
- package/iframe/default-channel-name.cjs +4 -0
- package/iframe/default-channel-name.d.ts +1 -0
- package/iframe/default-channel-name.js +3 -0
- package/iframe/default-channel-name.js.map +1 -0
- package/iframe/iframe.type.cjs +2 -0
- package/iframe/iframe.type.d.ts +1 -0
- package/iframe/iframe.type.js +3 -0
- package/iframe/iframe.type.js.map +1 -0
- package/iframe/index.cjs +13 -0
- package/iframe/index.d.ts +6 -0
- package/iframe/index.js +7 -0
- package/iframe/index.js.map +1 -0
- package/iframe/message-client.cjs +50 -0
- package/iframe/message-client.d.ts +14 -0
- package/iframe/message-client.js +48 -0
- package/iframe/message-client.js.map +1 -0
- package/iframe/message-host.cjs +63 -0
- package/iframe/message-host.d.ts +11 -0
- package/iframe/message-host.js +61 -0
- package/iframe/message-host.js.map +1 -0
- package/iframe/message-service.cjs +13 -0
- package/iframe/message-service.d.ts +9 -0
- package/iframe/message-service.js +11 -0
- package/iframe/message-service.js.map +1 -0
- package/iframe/source-id-splitter.cjs +4 -0
- package/iframe/source-id-splitter.d.ts +1 -0
- package/iframe/source-id-splitter.js +3 -0
- package/iframe/source-id-splitter.js.map +1 -0
- package/iframe/upcoming-message.cjs +2 -0
- package/iframe/upcoming-message.d.ts +4 -0
- package/iframe/upcoming-message.js +3 -0
- package/iframe/upcoming-message.js.map +1 -0
- package/index.cjs +13 -0
- package/index.d.ts +7 -0
- package/index.js +7 -0
- package/index.js.map +1 -0
- package/listen.decorator.cjs +20 -0
- package/listen.decorator.d.ts +6 -0
- package/listen.decorator.js +19 -0
- package/listen.decorator.js.map +1 -0
- package/listener-storage.type.cjs +2 -0
- package/listener-storage.type.d.ts +2 -0
- package/listener-storage.type.js +3 -0
- package/listener-storage.type.js.map +1 -0
- package/message-client.cjs +10 -0
- package/message-client.d.ts +23 -0
- package/message-client.js +8 -0
- package/message-client.js.map +1 -0
- package/message-host.cjs +58 -0
- package/message-host.d.ts +26 -0
- package/message-host.js +56 -0
- package/message-host.js.map +1 -0
- package/message-response.type.cjs +2 -0
- package/message-response.type.d.ts +16 -0
- package/message-response.type.js +3 -0
- package/message-response.type.js.map +1 -0
- package/message.interface.cjs +2 -0
- package/message.interface.d.ts +6 -0
- package/message.interface.js +3 -0
- package/message.interface.js.map +1 -0
- package/package.json +158 -0
- package/request.decorator.cjs +20 -0
- package/request.decorator.d.ts +1 -0
- package/request.decorator.js +19 -0
- package/request.decorator.js.map +1 -0
- package/selectors.cjs +10 -0
- package/selectors.d.ts +7 -0
- package/selectors.js +9 -0
- package/selectors.js.map +1 -0
- package/worker/index.cjs +13 -0
- package/worker/index.d.ts +5 -0
- package/worker/index.js +7 -0
- package/worker/index.js.map +1 -0
- package/worker/initializer.cjs +39 -0
- package/worker/initializer.d.ts +12 -0
- package/worker/initializer.js +38 -0
- package/worker/initializer.js.map +1 -0
- package/worker/message-client.cjs +158 -0
- package/worker/message-client.d.ts +131 -0
- package/worker/message-client.js +156 -0
- package/worker/message-client.js.map +1 -0
- package/worker/message-host.cjs +165 -0
- package/worker/message-host.d.ts +131 -0
- package/worker/message-host.js +163 -0
- package/worker/message-host.js.map +1 -0
- package/worker/message-service.cjs +123 -0
- package/worker/message-service.d.ts +117 -0
- package/worker/message-service.js +121 -0
- package/worker/message-service.js.map +1 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 400">
|
|
2
|
+
<defs>
|
|
3
|
+
<style>
|
|
4
|
+
.title { font: bold 24px sans-serif; fill: #2c3e50; }
|
|
5
|
+
.subtitle { font: 16px sans-serif; fill: #7f8c8d; }
|
|
6
|
+
.label { font: 14px sans-serif; fill: #34495e; }
|
|
7
|
+
.decorator { font: bold 12px monospace; fill: #e74c3c; }
|
|
8
|
+
.box { fill: #3498db; stroke: #2980b9; stroke-width: 2; }
|
|
9
|
+
.box-alt { fill: #2ecc71; stroke: #27ae60; stroke-width: 2; }
|
|
10
|
+
.box-core { fill: #9b59b6; stroke: #8e44ad; stroke-width: 2; }
|
|
11
|
+
.arrow { stroke: #34495e; stroke-width: 2; fill: none; marker-end: url(#arrowhead); }
|
|
12
|
+
.arrow-bi { stroke: #e67e22; stroke-width: 2; fill: none; marker-end: url(#arrowhead-bi); marker-start: url(#arrowhead-bi-start); }
|
|
13
|
+
text { text-anchor: middle; }
|
|
14
|
+
</style>
|
|
15
|
+
<marker id="arrowhead" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto">
|
|
16
|
+
<polygon points="0 0, 10 3, 0 6" fill="#34495e" />
|
|
17
|
+
</marker>
|
|
18
|
+
<marker id="arrowhead-bi" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto">
|
|
19
|
+
<polygon points="0 0, 10 3, 0 6" fill="#e67e22" />
|
|
20
|
+
</marker>
|
|
21
|
+
<marker id="arrowhead-bi-start" markerWidth="10" markerHeight="10" refX="1" refY="3" orient="auto">
|
|
22
|
+
<polygon points="10 0, 0 3, 10 6" fill="#e67e22" />
|
|
23
|
+
</marker>
|
|
24
|
+
</defs>
|
|
25
|
+
|
|
26
|
+
<!-- Title -->
|
|
27
|
+
<text x="400" y="30" class="title">Messenger Core Architecture</text>
|
|
28
|
+
<text x="400" y="55" class="subtitle">Base abstractions for all messaging modules</text>
|
|
29
|
+
|
|
30
|
+
<!-- MessageClient Box -->
|
|
31
|
+
<rect x="50" y="100" width="200" height="120" rx="5" class="box"/>
|
|
32
|
+
<text x="150" y="130" class="label" style="fill: white; font-weight: bold;">MessageClient</text>
|
|
33
|
+
<text x="150" y="155" class="decorator">@Request('path')</text>
|
|
34
|
+
<text x="150" y="180" class="label" style="fill: white; font-size: 12px;">Sends requests</text>
|
|
35
|
+
<text x="150" y="200" class="label" style="fill: white; font-size: 12px;">Receives responses</text>
|
|
36
|
+
|
|
37
|
+
<!-- MessageHost Box -->
|
|
38
|
+
<rect x="550" y="100" width="200" height="120" rx="5" class="box-alt"/>
|
|
39
|
+
<text x="650" y="130" class="label" style="fill: white; font-weight: bold;">MessageHost</text>
|
|
40
|
+
<text x="650" y="155" class="decorator">@Listen('path')</text>
|
|
41
|
+
<text x="650" y="180" class="label" style="fill: white; font-size: 12px;">Listens for requests</text>
|
|
42
|
+
<text x="650" y="200" class="label" style="fill: white; font-size: 12px;">Sends responses</text>
|
|
43
|
+
|
|
44
|
+
<!-- Arrow between Client and Host -->
|
|
45
|
+
<path d="M 250 160 L 550 160" class="arrow"/>
|
|
46
|
+
<text x="400" y="150" class="label" style="font-size: 12px;">Request/Response</text>
|
|
47
|
+
|
|
48
|
+
<!-- MessageService Box -->
|
|
49
|
+
<rect x="300" y="270" width="200" height="100" rx="5" class="box-core"/>
|
|
50
|
+
<text x="400" y="300" class="label" style="fill: white; font-weight: bold;">MessageService</text>
|
|
51
|
+
<text x="400" y="325" class="label" style="fill: white; font-size: 12px;">= MessageClient</text>
|
|
52
|
+
<text x="400" y="345" class="label" style="fill: white; font-size: 12px;">+ MessageHost</text>
|
|
53
|
+
<text x="400" y="365" class="label" style="fill: white; font-size: 11px; font-style: italic;">(Bidirectional)</text>
|
|
54
|
+
|
|
55
|
+
<!-- Arrows from Client and Host to Service -->
|
|
56
|
+
<path d="M 150 220 L 350 270" class="arrow" style="stroke-dasharray: 5,5;"/>
|
|
57
|
+
<path d="M 650 220 L 450 270" class="arrow" style="stroke-dasharray: 5,5;"/>
|
|
58
|
+
|
|
59
|
+
</svg>
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 900 500">
|
|
2
|
+
<defs>
|
|
3
|
+
<style>
|
|
4
|
+
.title { font: bold 24px sans-serif; fill: #2c3e50; }
|
|
5
|
+
.subtitle { font: 16px sans-serif; fill: #7f8c8d; }
|
|
6
|
+
.label { font: 14px sans-serif; fill: #34495e; }
|
|
7
|
+
.code { font: 12px monospace; fill: #2c3e50; }
|
|
8
|
+
.window { fill: #ecf0f1; stroke: #95a5a6; stroke-width: 3; }
|
|
9
|
+
.titlebar { fill: #bdc3c7; }
|
|
10
|
+
.iframe-box { fill: #fff; stroke: #3498db; stroke-width: 2; }
|
|
11
|
+
.client { fill: #3498db; stroke: #2980b9; stroke-width: 2; }
|
|
12
|
+
.host { fill: #2ecc71; stroke: #27ae60; stroke-width: 2; }
|
|
13
|
+
.arrow { stroke: #e74c3c; stroke-width: 2.5; fill: none; marker-end: url(#arrowhead); }
|
|
14
|
+
.arrow-back { stroke: #9b59b6; stroke-width: 2.5; fill: none; marker-end: url(#arrowhead-back); }
|
|
15
|
+
text { text-anchor: middle; }
|
|
16
|
+
</style>
|
|
17
|
+
<marker id="arrowhead" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto">
|
|
18
|
+
<polygon points="0 0, 10 3, 0 6" fill="#e74c3c" />
|
|
19
|
+
</marker>
|
|
20
|
+
<marker id="arrowhead-back" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto">
|
|
21
|
+
<polygon points="0 0, 10 3, 0 6" fill="#9b59b6" />
|
|
22
|
+
</marker>
|
|
23
|
+
</defs>
|
|
24
|
+
|
|
25
|
+
<!-- Title -->
|
|
26
|
+
<text x="450" y="35" class="title">Iframe Communication</text>
|
|
27
|
+
<text x="450" y="60" class="subtitle">Parent window ↔ Child iframe messaging</text>
|
|
28
|
+
|
|
29
|
+
<!-- Parent Window -->
|
|
30
|
+
<rect x="50" y="100" width="350" height="350" rx="8" class="window"/>
|
|
31
|
+
<rect x="50" y="100" width="350" height="30" rx="8" class="titlebar"/>
|
|
32
|
+
<text x="225" y="122" class="label" style="fill: #34495e; font-weight: bold;">Parent Window</text>
|
|
33
|
+
|
|
34
|
+
<!-- Parent Host -->
|
|
35
|
+
<rect x="80" y="160" width="290" height="80" rx="5" class="host"/>
|
|
36
|
+
<text x="225" y="185" class="label" style="fill: white; font-weight: bold;">IframeMessageHost</text>
|
|
37
|
+
<text x="225" y="210" class="code" style="fill: white;">@Listen('greeting')</text>
|
|
38
|
+
<text x="225" y="230" class="label" style="fill: white; font-size: 11px;">Responds to iframe requests</text>
|
|
39
|
+
|
|
40
|
+
<!-- Iframe inside Parent -->
|
|
41
|
+
<rect x="90" y="270" width="270" height="160" rx="5" class="iframe-box"/>
|
|
42
|
+
<rect x="90" y="270" width="270" height="25" rx="5" class="titlebar"/>
|
|
43
|
+
<text x="225" y="288" class="label" style="font-size: 12px; font-weight: bold;">Child Iframe</text>
|
|
44
|
+
|
|
45
|
+
<!-- Iframe Client -->
|
|
46
|
+
<rect x="110" y="320" width="230" height="90" rx="5" class="client"/>
|
|
47
|
+
<text x="225" y="345" class="label" style="fill: white; font-weight: bold;">IframeMessageClient</text>
|
|
48
|
+
<text x="225" y="370" class="code" style="fill: white;">@Request('greeting')</text>
|
|
49
|
+
<text x="225" y="395" class="label" style="fill: white; font-size: 11px;">Sends requests to parent</text>
|
|
50
|
+
|
|
51
|
+
<!-- Communication Arrows -->
|
|
52
|
+
<path d="M 340 360 Q 420 300 420 200" class="arrow"/>
|
|
53
|
+
<text x="460" y="280" class="label" style="fill: #e74c3c; font-weight: bold;">Request</text>
|
|
54
|
+
|
|
55
|
+
<path d="M 400 200 Q 400 280 320 340" class="arrow-back"/>
|
|
56
|
+
<text x="360" y="260" class="label" style="fill: #9b59b6; font-weight: bold;">Response</text>
|
|
57
|
+
|
|
58
|
+
<!-- Right side: Code Examples -->
|
|
59
|
+
<rect x="500" y="100" width="350" height="160" rx="5" style="fill: #2c3e50; stroke: #34495e; stroke-width: 2;"/>
|
|
60
|
+
<text x="675" y="130" class="label" style="fill: white; font-weight: bold;">Iframe (Client)</text>
|
|
61
|
+
<text x="520" y="160" class="code" style="fill: #f39c12; text-anchor: start;">const client = new</text>
|
|
62
|
+
<text x="520" y="180" class="code" style="fill: #f39c12; text-anchor: start;"> IframeMessageClient();</text>
|
|
63
|
+
<text x="520" y="210" class="code" style="fill: #3498db; text-anchor: start;">client.sayHello('John')</text>
|
|
64
|
+
<text x="520" y="230" class="code" style="fill: #3498db; text-anchor: start;"> .subscribe(response =>)</text>
|
|
65
|
+
<text x="520" y="250" class="code" style="fill: #2ecc71; text-anchor: start;"> console.log(response));</text>
|
|
66
|
+
|
|
67
|
+
<rect x="500" y="280" width="350" height="160" rx="5" style="fill: #2c3e50; stroke: #34495e; stroke-width: 2;"/>
|
|
68
|
+
<text x="675" y="310" class="label" style="fill: white; font-weight: bold;">Parent (Host)</text>
|
|
69
|
+
<text x="520" y="340" class="code" style="fill: #f39c12; text-anchor: start;">const host = new</text>
|
|
70
|
+
<text x="520" y="360" class="code" style="fill: #f39c12; text-anchor: start;"> IframeMessageHost();</text>
|
|
71
|
+
<text x="520" y="390" class="code" style="fill: #2ecc71; text-anchor: start;">@Listen('greeting')</text>
|
|
72
|
+
<text x="520" y="410" class="code" style="fill: #3498db; text-anchor: start;">return of(`Hello ${data}!`);</text>
|
|
73
|
+
|
|
74
|
+
</svg>
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 900 500">
|
|
2
|
+
<defs>
|
|
3
|
+
<style>
|
|
4
|
+
.title { font: bold 24px sans-serif; fill: #2c3e50; }
|
|
5
|
+
.subtitle { font: 16px sans-serif; fill: #7f8c8d; }
|
|
6
|
+
.label { font: 14px sans-serif; fill: #34495e; }
|
|
7
|
+
.code { font: 12px monospace; fill: #2c3e50; }
|
|
8
|
+
.thread { fill: #ecf0f1; stroke: #95a5a6; stroke-width: 3; }
|
|
9
|
+
.service { fill: #9b59b6; stroke: #8e44ad; stroke-width: 2; }
|
|
10
|
+
.arrow { stroke: #e74c3c; stroke-width: 3; fill: none; marker-end: url(#arrowhead); }
|
|
11
|
+
.arrow-back { stroke: #2ecc71; stroke-width: 3; fill: none; marker-end: url(#arrowhead-back); }
|
|
12
|
+
text { text-anchor: middle; }
|
|
13
|
+
</style>
|
|
14
|
+
<marker id="arrowhead" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto">
|
|
15
|
+
<polygon points="0 0, 10 3, 0 6" fill="#e74c3c" />
|
|
16
|
+
</marker>
|
|
17
|
+
<marker id="arrowhead-back" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto">
|
|
18
|
+
<polygon points="0 0, 10 3, 0 6" fill="#2ecc71" />
|
|
19
|
+
</marker>
|
|
20
|
+
</defs>
|
|
21
|
+
|
|
22
|
+
<!-- Title -->
|
|
23
|
+
<text x="450" y="35" class="title">Web Worker Communication</text>
|
|
24
|
+
<text x="450" y="60" class="subtitle">Bidirectional messaging between main thread and worker</text>
|
|
25
|
+
|
|
26
|
+
<!-- Main Thread -->
|
|
27
|
+
<rect x="50" y="100" width="350" height="350" rx="8" class="thread"/>
|
|
28
|
+
<text x="225" y="130" class="label" style="font-weight: bold; font-size: 18px;">Main Thread</text>
|
|
29
|
+
|
|
30
|
+
<!-- Main Service -->
|
|
31
|
+
<rect x="80" y="160" width="290" height="110" rx="5" class="service"/>
|
|
32
|
+
<text x="225" y="190" class="label" style="fill: white; font-weight: bold;">WorkerMessageService</text>
|
|
33
|
+
<text x="225" y="215" class="code" style="fill: #f39c12;">@Request('processData')</text>
|
|
34
|
+
<text x="225" y="235" class="label" style="fill: white; font-size: 11px;">Send to worker</text>
|
|
35
|
+
<text x="225" y="255" class="code" style="fill: #2ecc71;">@Listen('progress')</text>
|
|
36
|
+
|
|
37
|
+
<!-- Worker initialization -->
|
|
38
|
+
<rect x="80" y="300" width="290" height="120" rx="5" style="fill: #34495e;"/>
|
|
39
|
+
<text x="225" y="330" class="label" style="fill: white; font-weight: bold;">Worker Initialization</text>
|
|
40
|
+
<text x="100" y="360" class="code" style="fill: #3498db; text-anchor: start;">const worker = new</text>
|
|
41
|
+
<text x="100" y="380" class="code" style="fill: #3498db; text-anchor: start;"> Worker('./worker.js');</text>
|
|
42
|
+
<text x="100" y="405" class="code" style="fill: #f39c12; text-anchor: start;">new MainThread(worker);</text>
|
|
43
|
+
|
|
44
|
+
<!-- Worker Thread -->
|
|
45
|
+
<rect x="500" y="100" width="350" height="350" rx="8" class="thread"/>
|
|
46
|
+
<text x="675" y="130" class="label" style="font-weight: bold; font-size: 18px;">Worker Thread</text>
|
|
47
|
+
|
|
48
|
+
<!-- Worker Service -->
|
|
49
|
+
<rect x="530" y="160" width="290" height="110" rx="5" class="service"/>
|
|
50
|
+
<text x="675" y="190" class="label" style="fill: white; font-weight: bold;">WorkerMessageService</text>
|
|
51
|
+
<text x="675" y="215" class="code" style="fill: #2ecc71;">@Listen('processData')</text>
|
|
52
|
+
<text x="675" y="235" class="label" style="fill: white; font-size: 11px;">Process requests</text>
|
|
53
|
+
<text x="675" y="255" class="code" style="fill: #f39c12;">@Request('progress')</text>
|
|
54
|
+
|
|
55
|
+
<!-- Worker context -->
|
|
56
|
+
<rect x="530" y="300" width="290" height="120" rx="5" style="fill: #34495e;"/>
|
|
57
|
+
<text x="675" y="330" class="label" style="fill: white; font-weight: bold;">Self Context</text>
|
|
58
|
+
<text x="550" y="360" class="code" style="fill: #2ecc71; text-anchor: start;">// Inside worker.js</text>
|
|
59
|
+
<text x="550" y="380" class="code" style="fill: #3498db; text-anchor: start;">const service = new</text>
|
|
60
|
+
<text x="550" y="400" class="code" style="fill: #3498db; text-anchor: start;"> WorkerThread(); // auto self</text>
|
|
61
|
+
|
|
62
|
+
<!-- Communication Arrows -->
|
|
63
|
+
<!-- Request arrow -->
|
|
64
|
+
<path d="M 370 200 L 530 200" class="arrow"/>
|
|
65
|
+
<text x="450" y="190" class="label" style="fill: #e74c3c; font-weight: bold;">postMessage(request)</text>
|
|
66
|
+
|
|
67
|
+
<!-- Response arrow -->
|
|
68
|
+
<path d="M 530 240 L 370 240" class="arrow-back"/>
|
|
69
|
+
<text x="450" y="260" class="label" style="fill: #2ecc71; font-weight: bold;">postMessage(response)</text>
|
|
70
|
+
|
|
71
|
+
<!-- Progress update arrow -->
|
|
72
|
+
<path d="M 530 350 L 370 350" class="arrow"/>
|
|
73
|
+
<text x="450" y="340" class="label" style="fill: #e74c3c; font-weight: bold; font-size: 12px;">progress updates</text>
|
|
74
|
+
|
|
75
|
+
</svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const CHANNEL_PATH_SPLITTER = "__messenger_channel_splitter__";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/messenger/src/iframe/channel-path-splitter.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,gCAAgC,CAAC","file":"channel-path-splitter.js","sourcesContent":["export const CHANNEL_PATH_SPLITTER = '__messenger_channel_splitter__';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const DEFAULT_CHANNEL_NAME = "MessengerIframeChannelDefault";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/messenger/src/iframe/default-channel-name.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,+BAA+B,CAAC","file":"default-channel-name.js","sourcesContent":["export const DEFAULT_CHANNEL_NAME = 'MessengerIframeChannelDefault';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type IFrame = HTMLIFrameElement | (() => HTMLIFrameElement);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/messenger/src/iframe/iframe.type.ts"],"names":[],"mappings":"","file":"iframe.type.js","sourcesContent":["export type IFrame = HTMLIFrameElement | (() => HTMLIFrameElement);"]}
|
package/iframe/index.cjs
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IframeMessageService = exports.IframeMessageHost = exports.IframeMessageClient = exports.Listen = exports.Request = void 0;
|
|
4
|
+
var request_decorator_1 = require("../request.decorator");
|
|
5
|
+
Object.defineProperty(exports, "Request", { enumerable: true, get: function () { return request_decorator_1.Request; } });
|
|
6
|
+
var listen_decorator_1 = require("../listen.decorator");
|
|
7
|
+
Object.defineProperty(exports, "Listen", { enumerable: true, get: function () { return listen_decorator_1.Listen; } });
|
|
8
|
+
var message_client_1 = require("./message-client");
|
|
9
|
+
Object.defineProperty(exports, "IframeMessageClient", { enumerable: true, get: function () { return message_client_1.IframeMessageClient; } });
|
|
10
|
+
var message_host_1 = require("./message-host");
|
|
11
|
+
Object.defineProperty(exports, "IframeMessageHost", { enumerable: true, get: function () { return message_host_1.IframeMessageHost; } });
|
|
12
|
+
var message_service_1 = require("./message-service");
|
|
13
|
+
Object.defineProperty(exports, "IframeMessageService", { enumerable: true, get: function () { return message_service_1.IframeMessageService; } });
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { Request } from '../request.decorator';
|
|
2
|
+
export { Listen } from '../listen.decorator';
|
|
3
|
+
export { IframeMessageClient } from './message-client';
|
|
4
|
+
export { IframeMessageHost } from './message-host';
|
|
5
|
+
export { IframeMessageService } from './message-service';
|
|
6
|
+
export { UpcomingMessage } from './upcoming-message';
|
package/iframe/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { Request } from '../request.decorator';
|
|
2
|
+
export { Listen } from '../listen.decorator';
|
|
3
|
+
export { IframeMessageClient } from './message-client';
|
|
4
|
+
export { IframeMessageHost } from './message-host';
|
|
5
|
+
export { IframeMessageService } from './message-service';
|
|
6
|
+
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/messenger/src/iframe/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC","file":"index.js","sourcesContent":["export { Request } from '../request.decorator';\nexport { Listen } from '../listen.decorator';\nexport { IframeMessageClient } from './message-client';\nexport { IframeMessageHost } from './message-host';\nexport { IframeMessageService } from './message-service';\nexport { UpcomingMessage } from './upcoming-message';\n"]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IframeMessageClient = void 0;
|
|
4
|
+
const js_utils_1 = require("@telperion/js-utils");
|
|
5
|
+
const rxjs_1 = require("rxjs");
|
|
6
|
+
const message_client_1 = require("../message-client");
|
|
7
|
+
const selectors_1 = require("../selectors");
|
|
8
|
+
const channel_path_splitter_1 = require("./channel-path-splitter");
|
|
9
|
+
const default_channel_name_1 = require("./default-channel-name");
|
|
10
|
+
class IframeMessageClient extends message_client_1.MessageClient {
|
|
11
|
+
channelName;
|
|
12
|
+
[selectors_1.RESPONSES$] = new rxjs_1.Subject();
|
|
13
|
+
#_targetFrame;
|
|
14
|
+
get #targetFrame() {
|
|
15
|
+
return typeof this.#_targetFrame === 'function'
|
|
16
|
+
? this.#_targetFrame() ?? null
|
|
17
|
+
: this.#_targetFrame ?? null;
|
|
18
|
+
}
|
|
19
|
+
constructor(channelName = default_channel_name_1.DEFAULT_CHANNEL_NAME, targetFrame) {
|
|
20
|
+
super();
|
|
21
|
+
this.channelName = channelName;
|
|
22
|
+
this.#_targetFrame = targetFrame;
|
|
23
|
+
window.addEventListener('message', ({ data, source }) => {
|
|
24
|
+
const target = this.#targetFrame;
|
|
25
|
+
if (target && source !== target.contentWindow)
|
|
26
|
+
return;
|
|
27
|
+
if (!data
|
|
28
|
+
|| typeof data !== 'object'
|
|
29
|
+
|| typeof data.id === 'undefined'
|
|
30
|
+
|| typeof data.completed === 'undefined') {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
this[selectors_1.RESPONSES$].next(data);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
[selectors_1.SEND](message) {
|
|
37
|
+
message = { ...message, path: `${this.channelName}${channel_path_splitter_1.CHANNEL_PATH_SPLITTER}${message.path}` };
|
|
38
|
+
const target = this.#targetFrame;
|
|
39
|
+
if (target) {
|
|
40
|
+
target.contentWindow.postMessage(message, '*');
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
window.parent.postMessage(message, '*');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
[selectors_1.GET_NEW_ID]() {
|
|
47
|
+
return (0, js_utils_1.uniqueId)('messenger-iframe-message');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.IframeMessageClient = IframeMessageClient;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Subject } from 'rxjs';
|
|
2
|
+
import { MessageClient } from '../message-client';
|
|
3
|
+
import { MessageResponse } from '../message-response.type';
|
|
4
|
+
import { Message } from '../message.interface';
|
|
5
|
+
import { GET_NEW_ID, RESPONSES$, SEND } from '../selectors';
|
|
6
|
+
import { IFrame } from './iframe.type';
|
|
7
|
+
export declare class IframeMessageClient extends MessageClient {
|
|
8
|
+
#private;
|
|
9
|
+
private channelName;
|
|
10
|
+
[RESPONSES$]: Subject<MessageResponse>;
|
|
11
|
+
constructor(channelName?: string, targetFrame?: IFrame);
|
|
12
|
+
[SEND]<T>(message: Message<T>): void;
|
|
13
|
+
protected [GET_NEW_ID](): string;
|
|
14
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { uniqueId } from '@telperion/js-utils';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
import { MessageClient } from '../message-client';
|
|
4
|
+
import { GET_NEW_ID, RESPONSES$, SEND } from '../selectors';
|
|
5
|
+
import { CHANNEL_PATH_SPLITTER } from './channel-path-splitter';
|
|
6
|
+
import { DEFAULT_CHANNEL_NAME } from './default-channel-name';
|
|
7
|
+
export class IframeMessageClient extends MessageClient {
|
|
8
|
+
channelName;
|
|
9
|
+
[RESPONSES$] = new Subject();
|
|
10
|
+
#_targetFrame;
|
|
11
|
+
get #targetFrame() {
|
|
12
|
+
return typeof this.#_targetFrame === 'function'
|
|
13
|
+
? this.#_targetFrame() ?? null
|
|
14
|
+
: this.#_targetFrame ?? null;
|
|
15
|
+
}
|
|
16
|
+
constructor(channelName = DEFAULT_CHANNEL_NAME, targetFrame) {
|
|
17
|
+
super();
|
|
18
|
+
this.channelName = channelName;
|
|
19
|
+
this.#_targetFrame = targetFrame;
|
|
20
|
+
window.addEventListener('message', ({ data, source }) => {
|
|
21
|
+
const target = this.#targetFrame;
|
|
22
|
+
if (target && source !== target.contentWindow)
|
|
23
|
+
return;
|
|
24
|
+
if (!data
|
|
25
|
+
|| typeof data !== 'object'
|
|
26
|
+
|| typeof data.id === 'undefined'
|
|
27
|
+
|| typeof data.completed === 'undefined') {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
this[RESPONSES$].next(data);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
[SEND](message) {
|
|
34
|
+
message = { ...message, path: `${this.channelName}${CHANNEL_PATH_SPLITTER}${message.path}` };
|
|
35
|
+
const target = this.#targetFrame;
|
|
36
|
+
if (target) {
|
|
37
|
+
target.contentWindow.postMessage(message, '*');
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
window.parent.postMessage(message, '*');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
[GET_NEW_ID]() {
|
|
44
|
+
return uniqueId('messenger-iframe-message');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
//# sourceMappingURL=message-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/messenger/src/iframe/message-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGlD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D,MAAM,OAAO,mBAAoB,SAAQ,aAAa;IAW1C;IAVH,CAAC,UAAU,CAAC,GAAG,IAAI,OAAO,EAAmB,CAAC;IACrD,aAAa,CAAqB;IAElC,IAAI,YAAY;QACd,OAAO,OAAO,IAAI,CAAC,aAAa,KAAK,UAAU;YAC7C,CAAC,CAAE,IAAI,CAAC,aAAyC,EAAE,IAAI,IAAI;YAC3D,CAAC,CAAC,IAAI,CAAC,aAAkC,IAAI,IAAI,CAAC;IACtD,CAAC;IAED,YACU,cAAc,oBAAoB,EAC1C,WAAoB;QAEpB,KAAK,EAAE,CAAC;QAHA,gBAAW,GAAX,WAAW,CAAuB;QAK1C,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC;QAEjC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAA2C,EAAE,EAAE;YAC/F,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC;YAEjC,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,CAAC,aAAa;gBAAE,OAAO;YAEtD,IAAI,CAAC,IAAI;mBACJ,OAAO,IAAI,KAAK,QAAQ;mBACxB,OAAO,IAAI,CAAC,EAAE,KAAK,WAAW;mBAC9B,OAAO,IAAI,CAAC,SAAS,KAAK,WAAW,EACxC,CAAC;gBACD,OAAO;YACT,CAAC;YAED,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,CAAC,IAAI,CAAC,CAAI,OAAmB;QAClC,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,GAAG,qBAAqB,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAE7F,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC;QAEjC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,aAAc,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAES,CAAC,UAAU,CAAC;QACpB,OAAO,QAAQ,CAAC,0BAA0B,CAAW,CAAC;IACxD,CAAC;CACF","file":"message-client.js","sourcesContent":["import { uniqueId } from '@telperion/js-utils';\nimport { Subject } from 'rxjs';\nimport { MessageClient } from '../message-client';\nimport { MessageResponse, SuccessfulMessageResponse } from '../message-response.type';\nimport { Message } from '../message.interface';\nimport { GET_NEW_ID, RESPONSES$, SEND } from '../selectors';\nimport { CHANNEL_PATH_SPLITTER } from './channel-path-splitter';\nimport { DEFAULT_CHANNEL_NAME } from './default-channel-name';\nimport { IFrame } from './iframe.type';\n\nexport class IframeMessageClient extends MessageClient {\n public [RESPONSES$] = new Subject<MessageResponse>();\n #_targetFrame: IFrame | undefined;\n\n get #targetFrame(): null | HTMLIFrameElement {\n return typeof this.#_targetFrame === 'function'\n ? (this.#_targetFrame as () => HTMLIFrameElement)() ?? null\n : this.#_targetFrame as HTMLIFrameElement ?? null;\n }\n\n constructor(\n private channelName = DEFAULT_CHANNEL_NAME,\n targetFrame?: IFrame\n ) {\n super();\n\n this.#_targetFrame = targetFrame;\n\n window.addEventListener('message', ({ data, source }: MessageEvent<SuccessfulMessageResponse>) => {\n const target = this.#targetFrame;\n\n if (target && source !== target.contentWindow) return;\n\n if (!data\n || typeof data !== 'object'\n || typeof data.id === 'undefined'\n || typeof data.completed === 'undefined'\n ) {\n return;\n }\n\n this[RESPONSES$].next(data);\n });\n }\n\n public [SEND]<T>(message: Message<T>) {\n message = { ...message, path: `${this.channelName}${CHANNEL_PATH_SPLITTER}${message.path}` };\n\n const target = this.#targetFrame;\n\n if (target) {\n target.contentWindow!.postMessage(message, '*');\n } else {\n window.parent.postMessage(message, '*');\n }\n }\n\n protected [GET_NEW_ID](): string {\n return uniqueId('messenger-iframe-message') as string;\n }\n}\n"]}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IframeMessageHost = void 0;
|
|
4
|
+
const js_utils_1 = require("@telperion/js-utils");
|
|
5
|
+
const rxjs_1 = require("rxjs");
|
|
6
|
+
const message_host_1 = require("../message-host");
|
|
7
|
+
const channel_path_splitter_1 = require("./channel-path-splitter");
|
|
8
|
+
const default_channel_name_1 = require("./default-channel-name");
|
|
9
|
+
const source_id_splitter_1 = require("./source-id-splitter");
|
|
10
|
+
const selectors_1 = require("../selectors");
|
|
11
|
+
class IframeMessageHost extends message_host_1.MessageHost {
|
|
12
|
+
channelName;
|
|
13
|
+
#requests = new rxjs_1.Subject();
|
|
14
|
+
#sources = [];
|
|
15
|
+
#_targetFrame;
|
|
16
|
+
get #targetFrame() {
|
|
17
|
+
return typeof this.#_targetFrame === 'function'
|
|
18
|
+
? this.#_targetFrame() || null
|
|
19
|
+
: this.#_targetFrame || null;
|
|
20
|
+
}
|
|
21
|
+
constructor(channelName = default_channel_name_1.DEFAULT_CHANNEL_NAME, targetFrame) {
|
|
22
|
+
super();
|
|
23
|
+
this.channelName = channelName;
|
|
24
|
+
this.#_targetFrame = targetFrame;
|
|
25
|
+
window.addEventListener('message', this.#handler);
|
|
26
|
+
this[selectors_1.LISTEN](this.#requests);
|
|
27
|
+
}
|
|
28
|
+
terminate() {
|
|
29
|
+
window.removeEventListener('message', this.#handler);
|
|
30
|
+
}
|
|
31
|
+
[selectors_1.RESPONSE](message) {
|
|
32
|
+
const [sourceId, messageId] = message.id.split(source_id_splitter_1.SOURCE_ID_SPLITTER);
|
|
33
|
+
const [, source] = this.#sources.find(([sId]) => sId === sourceId);
|
|
34
|
+
message = {
|
|
35
|
+
...message,
|
|
36
|
+
id: messageId,
|
|
37
|
+
};
|
|
38
|
+
source.postMessage(message);
|
|
39
|
+
}
|
|
40
|
+
#handler = ({ data, source }) => {
|
|
41
|
+
if (!data || typeof data !== 'object' || !data.path || typeof data.id === 'undefined') {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const targetFrame = this.#targetFrame;
|
|
45
|
+
if (targetFrame && targetFrame.contentWindow !== source) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const [channel, path] = data.path.split(channel_path_splitter_1.CHANNEL_PATH_SPLITTER);
|
|
49
|
+
if (channel !== this.channelName) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (!this.#sources.some(([, s]) => s === source)) {
|
|
53
|
+
this.#sources.push([(0, js_utils_1.uniqueId)('messenger-iframe-source'), source]);
|
|
54
|
+
}
|
|
55
|
+
const [sourceId] = this.#sources.find(([, s]) => s === source);
|
|
56
|
+
this.#requests.next({
|
|
57
|
+
body: targetFrame ? data.body : { data: data.body, sender: source },
|
|
58
|
+
id: `${sourceId}${source_id_splitter_1.SOURCE_ID_SPLITTER}${data.id}`,
|
|
59
|
+
path,
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
exports.IframeMessageHost = IframeMessageHost;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { MessageHost } from '../message-host';
|
|
2
|
+
import { SuccessfulMessageResponse } from '../message-response.type';
|
|
3
|
+
import { IFrame } from './iframe.type';
|
|
4
|
+
import { RESPONSE } from '../selectors';
|
|
5
|
+
export declare class IframeMessageHost extends MessageHost {
|
|
6
|
+
#private;
|
|
7
|
+
private channelName;
|
|
8
|
+
constructor(channelName?: string, targetFrame?: IFrame);
|
|
9
|
+
terminate(): void;
|
|
10
|
+
protected [RESPONSE](message: SuccessfulMessageResponse): void;
|
|
11
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { uniqueId } from '@telperion/js-utils';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
import { MessageHost } from '../message-host';
|
|
4
|
+
import { CHANNEL_PATH_SPLITTER } from './channel-path-splitter';
|
|
5
|
+
import { DEFAULT_CHANNEL_NAME } from './default-channel-name';
|
|
6
|
+
import { SOURCE_ID_SPLITTER } from './source-id-splitter';
|
|
7
|
+
import { LISTEN, RESPONSE } from '../selectors';
|
|
8
|
+
export class IframeMessageHost extends MessageHost {
|
|
9
|
+
channelName;
|
|
10
|
+
#requests = new Subject();
|
|
11
|
+
#sources = [];
|
|
12
|
+
#_targetFrame;
|
|
13
|
+
get #targetFrame() {
|
|
14
|
+
return typeof this.#_targetFrame === 'function'
|
|
15
|
+
? this.#_targetFrame() || null
|
|
16
|
+
: this.#_targetFrame || null;
|
|
17
|
+
}
|
|
18
|
+
constructor(channelName = DEFAULT_CHANNEL_NAME, targetFrame) {
|
|
19
|
+
super();
|
|
20
|
+
this.channelName = channelName;
|
|
21
|
+
this.#_targetFrame = targetFrame;
|
|
22
|
+
window.addEventListener('message', this.#handler);
|
|
23
|
+
this[LISTEN](this.#requests);
|
|
24
|
+
}
|
|
25
|
+
terminate() {
|
|
26
|
+
window.removeEventListener('message', this.#handler);
|
|
27
|
+
}
|
|
28
|
+
[RESPONSE](message) {
|
|
29
|
+
const [sourceId, messageId] = message.id.split(SOURCE_ID_SPLITTER);
|
|
30
|
+
const [, source] = this.#sources.find(([sId]) => sId === sourceId);
|
|
31
|
+
message = {
|
|
32
|
+
...message,
|
|
33
|
+
id: messageId,
|
|
34
|
+
};
|
|
35
|
+
source.postMessage(message);
|
|
36
|
+
}
|
|
37
|
+
#handler = ({ data, source }) => {
|
|
38
|
+
if (!data || typeof data !== 'object' || !data.path || typeof data.id === 'undefined') {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const targetFrame = this.#targetFrame;
|
|
42
|
+
if (targetFrame && targetFrame.contentWindow !== source) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const [channel, path] = data.path.split(CHANNEL_PATH_SPLITTER);
|
|
46
|
+
if (channel !== this.channelName) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (!this.#sources.some(([, s]) => s === source)) {
|
|
50
|
+
this.#sources.push([uniqueId('messenger-iframe-source'), source]);
|
|
51
|
+
}
|
|
52
|
+
const [sourceId] = this.#sources.find(([, s]) => s === source);
|
|
53
|
+
this.#requests.next({
|
|
54
|
+
body: targetFrame ? data.body : { data: data.body, sender: source },
|
|
55
|
+
id: `${sourceId}${SOURCE_ID_SPLITTER}${data.id}`,
|
|
56
|
+
path,
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
//# sourceMappingURL=message-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/messenger/src/iframe/message-host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,OAAO,iBAAkB,SAAQ,WAAW;IAYtC;IAXV,SAAS,GAAG,IAAI,OAAO,EAAW,CAAC;IACnC,QAAQ,GAAwC,EAAE,CAAC;IACnD,aAAa,CAAqB;IAElC,IAAI,YAAY;QACd,OAAO,OAAO,IAAI,CAAC,aAAa,KAAK,UAAU;YAC7C,CAAC,CAAE,IAAI,CAAC,aAAyC,EAAE,IAAI,IAAI;YAC3D,CAAC,CAAC,IAAI,CAAC,aAAkC,IAAI,IAAI,CAAC;IACtD,CAAC;IAED,YACU,cAAc,oBAAoB,EAC1C,WAAoB;QAEpB,KAAK,EAAE,CAAC;QAHA,gBAAW,GAAX,WAAW,CAAuB;QAK1C,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC;QAEjC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAEM,SAAS;QACd,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IAES,CAAC,QAAQ,CAAC,CAAC,OAAkC;QACrD,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACnE,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,QAAQ,CAAE,CAAC;QAEpE,OAAO,GAAG;YACR,GAAG,OAAO;YACV,EAAE,EAAE,SAAS;SACd,CAAC;QAED,MAAc,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,QAAQ,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAyB,EAAE,EAAE;QACrD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,WAAW,EAAE,CAAC;YACtF,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC;QAEtC,IAAI,WAAW,IAAI,WAAW,CAAC,aAAa,KAAK,MAAM,EAAE,CAAC;YACxD,OAAO;QACT,CAAC;QAED,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAE/D,IAAI,OAAO,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;YACjC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAW,EAAE,MAAO,CAAC,CAAC,CAAC;QAC/E,CAAC;QAED,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAE,CAAC;QAChE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAClB,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE;YACnE,EAAE,EAAE,GAAG,QAAQ,GAAG,kBAAkB,GAAG,IAAI,CAAC,EAAE,EAAE;YAChD,IAAI;SACL,CAAC,CAAC;IACL,CAAC,CAAC;CACH","file":"message-host.js","sourcesContent":["import { uniqueId } from '@telperion/js-utils';\nimport { Subject } from 'rxjs';\nimport { MessageHost } from '../message-host';\nimport { SuccessfulMessageResponse } from '../message-response.type';\nimport { Message } from '../message.interface';\nimport { CHANNEL_PATH_SPLITTER } from './channel-path-splitter';\nimport { DEFAULT_CHANNEL_NAME } from './default-channel-name';\nimport { SOURCE_ID_SPLITTER } from './source-id-splitter';\nimport { IFrame } from './iframe.type';\nimport { LISTEN, RESPONSE } from '../selectors';\n\nexport class IframeMessageHost extends MessageHost {\n #requests = new Subject<Message>();\n #sources: Array<[string, MessageEventSource]> = [];\n #_targetFrame: IFrame | undefined;\n\n get #targetFrame(): null | HTMLIFrameElement {\n return typeof this.#_targetFrame === 'function'\n ? (this.#_targetFrame as () => HTMLIFrameElement)() || null\n : this.#_targetFrame as HTMLIFrameElement || null;\n }\n\n constructor(\n private channelName = DEFAULT_CHANNEL_NAME,\n targetFrame?: IFrame\n ) {\n super();\n\n this.#_targetFrame = targetFrame;\n\n window.addEventListener('message', this.#handler);\n\n this[LISTEN](this.#requests);\n }\n\n public terminate(): void {\n window.removeEventListener('message', this.#handler);\n }\n\n protected [RESPONSE](message: SuccessfulMessageResponse): void {\n const [sourceId, messageId] = message.id.split(SOURCE_ID_SPLITTER);\n const [, source] = this.#sources.find(([sId]) => sId === sourceId)!;\n\n message = {\n ...message,\n id: messageId,\n };\n\n (source as any).postMessage(message);\n }\n\n #handler = ({ data, source }: MessageEvent<Message>) => {\n if (!data || typeof data !== 'object' || !data.path || typeof data.id === 'undefined') {\n return;\n }\n\n const targetFrame = this.#targetFrame;\n\n if (targetFrame && targetFrame.contentWindow !== source) {\n return;\n }\n\n const [channel, path] = data.path.split(CHANNEL_PATH_SPLITTER);\n\n if (channel !== this.channelName) {\n return;\n }\n\n if (!this.#sources.some(([, s]) => s === source)) {\n this.#sources.push([uniqueId('messenger-iframe-source') as string, source!]);\n }\n\n const [sourceId] = this.#sources.find(([, s]) => s === source)!;\n this.#requests.next({\n body: targetFrame ? data.body : { data: data.body, sender: source },\n id: `${sourceId}${SOURCE_ID_SPLITTER}${data.id}`,\n path,\n });\n };\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IframeMessageService = void 0;
|
|
4
|
+
const mixin_1 = require("@telperion/js-utils/class/mixin");
|
|
5
|
+
const message_client_1 = require("./message-client");
|
|
6
|
+
const message_host_1 = require("./message-host");
|
|
7
|
+
const default_channel_name_1 = require("./default-channel-name");
|
|
8
|
+
class IframeMessageService extends (0, mixin_1.mixin)(message_host_1.IframeMessageHost, message_client_1.IframeMessageClient) {
|
|
9
|
+
constructor(channelName = default_channel_name_1.DEFAULT_CHANNEL_NAME, targetFrame) {
|
|
10
|
+
super([channelName, targetFrame], [channelName, targetFrame]);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.IframeMessageService = IframeMessageService;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { IframeMessageClient } from "./message-client";
|
|
2
|
+
import { IFrame } from "./iframe.type";
|
|
3
|
+
declare const IframeMessageService_base: new (args_0: [channelName?: string | undefined, targetFrame?: IFrame | undefined], args_1: [channelName?: string | undefined, targetFrame?: IFrame | undefined]) => {
|
|
4
|
+
terminate: () => void;
|
|
5
|
+
} & IframeMessageClient;
|
|
6
|
+
export declare class IframeMessageService extends IframeMessageService_base {
|
|
7
|
+
constructor(channelName?: string, targetFrame?: IFrame);
|
|
8
|
+
}
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { mixin } from "@telperion/js-utils/class/mixin";
|
|
2
|
+
import { IframeMessageClient } from "./message-client";
|
|
3
|
+
import { IframeMessageHost } from "./message-host";
|
|
4
|
+
import { DEFAULT_CHANNEL_NAME } from "./default-channel-name";
|
|
5
|
+
export class IframeMessageService extends mixin(IframeMessageHost, IframeMessageClient) {
|
|
6
|
+
constructor(channelName = DEFAULT_CHANNEL_NAME, targetFrame) {
|
|
7
|
+
super([channelName, targetFrame], [channelName, targetFrame]);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=message-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/messenger/src/iframe/message-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iCAAiC,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D,MAAM,OAAO,oBAAqB,SAAQ,KAAK,CAAC,iBAAiB,EAAE,mBAAmB,CAAC;IACrF,YACE,WAAW,GAAG,oBAAoB,EAClC,WAAoB;QAEpB,KAAK,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;IAChE,CAAC;CACF","file":"message-service.js","sourcesContent":["import { mixin } from \"@telperion/js-utils/class/mixin\";\nimport { IframeMessageClient } from \"./message-client\";\nimport { IframeMessageHost } from \"./message-host\";\nimport { DEFAULT_CHANNEL_NAME } from \"./default-channel-name\";\nimport { IFrame } from \"./iframe.type\";\n\nexport class IframeMessageService extends mixin(IframeMessageHost, IframeMessageClient) {\n constructor(\n channelName = DEFAULT_CHANNEL_NAME,\n targetFrame?: IFrame\n ) {\n super([channelName, targetFrame], [channelName, targetFrame]);\n }\n}\n"]}
|