@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.
Files changed (136) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +600 -0
  3. package/broadcast/default-channel-name.cjs +4 -0
  4. package/broadcast/default-channel-name.d.ts +1 -0
  5. package/broadcast/default-channel-name.js +3 -0
  6. package/broadcast/default-channel-name.js.map +1 -0
  7. package/broadcast/index.cjs +13 -0
  8. package/broadcast/index.d.ts +5 -0
  9. package/broadcast/index.js +7 -0
  10. package/broadcast/index.js.map +1 -0
  11. package/broadcast/message-client.cjs +26 -0
  12. package/broadcast/message-client.d.ts +12 -0
  13. package/broadcast/message-client.js +24 -0
  14. package/broadcast/message-client.js.map +1 -0
  15. package/broadcast/message-host.cjs +28 -0
  16. package/broadcast/message-host.d.ts +9 -0
  17. package/broadcast/message-host.js +26 -0
  18. package/broadcast/message-host.js.map +1 -0
  19. package/broadcast/message-service.cjs +13 -0
  20. package/broadcast/message-service.d.ts +8 -0
  21. package/broadcast/message-service.js +11 -0
  22. package/broadcast/message-service.js.map +1 -0
  23. package/chrome/default-connection-name.cjs +4 -0
  24. package/chrome/default-connection-name.d.ts +1 -0
  25. package/chrome/default-connection-name.js +3 -0
  26. package/chrome/default-connection-name.js.map +1 -0
  27. package/chrome/index.cjs +11 -0
  28. package/chrome/index.d.ts +4 -0
  29. package/chrome/index.js +6 -0
  30. package/chrome/index.js.map +1 -0
  31. package/chrome/message-client.cjs +41 -0
  32. package/chrome/message-client.d.ts +15 -0
  33. package/chrome/message-client.js +39 -0
  34. package/chrome/message-client.js.map +1 -0
  35. package/chrome/message-host.cjs +43 -0
  36. package/chrome/message-host.d.ts +9 -0
  37. package/chrome/message-host.js +41 -0
  38. package/chrome/message-host.js.map +1 -0
  39. package/docs/images/broadcast-communication.svg +87 -0
  40. package/docs/images/chrome-extension-communication.svg +110 -0
  41. package/docs/images/core-architecture.svg +59 -0
  42. package/docs/images/iframe-communication.svg +74 -0
  43. package/docs/images/worker-communication.svg +75 -0
  44. package/iframe/channel-path-splitter.cjs +4 -0
  45. package/iframe/channel-path-splitter.d.ts +1 -0
  46. package/iframe/channel-path-splitter.js +3 -0
  47. package/iframe/channel-path-splitter.js.map +1 -0
  48. package/iframe/default-channel-name.cjs +4 -0
  49. package/iframe/default-channel-name.d.ts +1 -0
  50. package/iframe/default-channel-name.js +3 -0
  51. package/iframe/default-channel-name.js.map +1 -0
  52. package/iframe/iframe.type.cjs +2 -0
  53. package/iframe/iframe.type.d.ts +1 -0
  54. package/iframe/iframe.type.js +3 -0
  55. package/iframe/iframe.type.js.map +1 -0
  56. package/iframe/index.cjs +13 -0
  57. package/iframe/index.d.ts +6 -0
  58. package/iframe/index.js +7 -0
  59. package/iframe/index.js.map +1 -0
  60. package/iframe/message-client.cjs +50 -0
  61. package/iframe/message-client.d.ts +14 -0
  62. package/iframe/message-client.js +48 -0
  63. package/iframe/message-client.js.map +1 -0
  64. package/iframe/message-host.cjs +63 -0
  65. package/iframe/message-host.d.ts +11 -0
  66. package/iframe/message-host.js +61 -0
  67. package/iframe/message-host.js.map +1 -0
  68. package/iframe/message-service.cjs +13 -0
  69. package/iframe/message-service.d.ts +9 -0
  70. package/iframe/message-service.js +11 -0
  71. package/iframe/message-service.js.map +1 -0
  72. package/iframe/source-id-splitter.cjs +4 -0
  73. package/iframe/source-id-splitter.d.ts +1 -0
  74. package/iframe/source-id-splitter.js +3 -0
  75. package/iframe/source-id-splitter.js.map +1 -0
  76. package/iframe/upcoming-message.cjs +2 -0
  77. package/iframe/upcoming-message.d.ts +4 -0
  78. package/iframe/upcoming-message.js +3 -0
  79. package/iframe/upcoming-message.js.map +1 -0
  80. package/index.cjs +13 -0
  81. package/index.d.ts +7 -0
  82. package/index.js +7 -0
  83. package/index.js.map +1 -0
  84. package/listen.decorator.cjs +20 -0
  85. package/listen.decorator.d.ts +6 -0
  86. package/listen.decorator.js +19 -0
  87. package/listen.decorator.js.map +1 -0
  88. package/listener-storage.type.cjs +2 -0
  89. package/listener-storage.type.d.ts +2 -0
  90. package/listener-storage.type.js +3 -0
  91. package/listener-storage.type.js.map +1 -0
  92. package/message-client.cjs +10 -0
  93. package/message-client.d.ts +23 -0
  94. package/message-client.js +8 -0
  95. package/message-client.js.map +1 -0
  96. package/message-host.cjs +58 -0
  97. package/message-host.d.ts +26 -0
  98. package/message-host.js +56 -0
  99. package/message-host.js.map +1 -0
  100. package/message-response.type.cjs +2 -0
  101. package/message-response.type.d.ts +16 -0
  102. package/message-response.type.js +3 -0
  103. package/message-response.type.js.map +1 -0
  104. package/message.interface.cjs +2 -0
  105. package/message.interface.d.ts +6 -0
  106. package/message.interface.js +3 -0
  107. package/message.interface.js.map +1 -0
  108. package/package.json +158 -0
  109. package/request.decorator.cjs +20 -0
  110. package/request.decorator.d.ts +1 -0
  111. package/request.decorator.js +19 -0
  112. package/request.decorator.js.map +1 -0
  113. package/selectors.cjs +10 -0
  114. package/selectors.d.ts +7 -0
  115. package/selectors.js +9 -0
  116. package/selectors.js.map +1 -0
  117. package/worker/index.cjs +13 -0
  118. package/worker/index.d.ts +5 -0
  119. package/worker/index.js +7 -0
  120. package/worker/index.js.map +1 -0
  121. package/worker/initializer.cjs +39 -0
  122. package/worker/initializer.d.ts +12 -0
  123. package/worker/initializer.js +38 -0
  124. package/worker/initializer.js.map +1 -0
  125. package/worker/message-client.cjs +158 -0
  126. package/worker/message-client.d.ts +131 -0
  127. package/worker/message-client.js +156 -0
  128. package/worker/message-client.js.map +1 -0
  129. package/worker/message-host.cjs +165 -0
  130. package/worker/message-host.d.ts +131 -0
  131. package/worker/message-host.js +163 -0
  132. package/worker/message-host.js.map +1 -0
  133. package/worker/message-service.cjs +123 -0
  134. package/worker/message-service.d.ts +117 -0
  135. package/worker/message-service.js +121 -0
  136. 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,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CHANNEL_PATH_SPLITTER = void 0;
4
+ exports.CHANNEL_PATH_SPLITTER = '__messenger_channel_splitter__';
@@ -0,0 +1 @@
1
+ export declare const CHANNEL_PATH_SPLITTER = "__messenger_channel_splitter__";
@@ -0,0 +1,3 @@
1
+ export const CHANNEL_PATH_SPLITTER = '__messenger_channel_splitter__';
2
+
3
+ //# sourceMappingURL=channel-path-splitter.js.map
@@ -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,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_CHANNEL_NAME = void 0;
4
+ exports.DEFAULT_CHANNEL_NAME = 'MessengerIframeChannelDefault';
@@ -0,0 +1 @@
1
+ export declare const DEFAULT_CHANNEL_NAME = "MessengerIframeChannelDefault";
@@ -0,0 +1,3 @@
1
+ export const DEFAULT_CHANNEL_NAME = 'MessengerIframeChannelDefault';
2
+
3
+ //# sourceMappingURL=default-channel-name.js.map
@@ -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,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1 @@
1
+ export type IFrame = HTMLIFrameElement | (() => HTMLIFrameElement);
@@ -0,0 +1,3 @@
1
+ export {};
2
+
3
+ //# sourceMappingURL=iframe.type.js.map
@@ -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);"]}
@@ -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';
@@ -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":"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","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"]}