@pexip-engage-public/plugin 1.1.26-canary-20250728164214 → 1.1.26

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.
@@ -1,71 +0,0 @@
1
- import { isBrowser, } from "./common.js";
2
- let registeredElements = [];
3
- export function initialize(iframe) {
4
- if (!isBrowser()) {
5
- return { unsubscribe() { } };
6
- }
7
- const registeredElement = {
8
- iframe,
9
- initContext: { isInitialized: false, retryAttempts: 0 },
10
- };
11
- const unsubscribe = addCrossOriginChildResizeListener(registeredElement);
12
- registeredElements.push(registeredElement);
13
- return {
14
- unsubscribe() {
15
- unsubscribe();
16
- registeredElements = registeredElements.filter((entry) => entry.iframe !== iframe);
17
- },
18
- };
19
- }
20
- function addCrossOriginChildResizeListener(registeredElement) {
21
- const { iframe, initContext } = registeredElement;
22
- function handleIframeResizedMessage(event) {
23
- const isIframeTarget = iframe.contentWindow === event.source;
24
- if (!isIframeTarget) {
25
- return;
26
- }
27
- if (event.data?.type === "iframe-resized") {
28
- const { height } = event.data;
29
- height && resizeIframe({ newHeight: height, registeredElement });
30
- return;
31
- }
32
- if (event.data?.type === "iframe-scroll-to-offset") {
33
- const { top } = event.data;
34
- const iFramePosition = iframe.getBoundingClientRect();
35
- window.scrollTo({ top: iFramePosition.top + window.scrollY + top });
36
- return;
37
- }
38
- }
39
- window.addEventListener("message", handleIframeResizedMessage);
40
- const initMessage = { type: "iframe-child-init" };
41
- function sendInitializationMessageToChild() {
42
- postMessageSafelyToCrossOriginIframe(iframe, () => iframe.contentWindow?.postMessage(initMessage, "*"));
43
- initContext.retryAttempts++;
44
- initContext.retryTimeoutId = window.setTimeout(sendInitializationMessageToChild, getExponentialBackoffDelay(initContext.retryAttempts));
45
- }
46
- sendInitializationMessageToChild();
47
- return () => window.removeEventListener("message", handleIframeResizedMessage);
48
- }
49
- function resizeIframe({ registeredElement, newHeight, }) {
50
- const { iframe, initContext } = registeredElement;
51
- if (!initContext.isInitialized) {
52
- initContext.isInitialized = true;
53
- clearTimeout(initContext.retryTimeoutId);
54
- }
55
- iframe.style.height = `${newHeight}px`;
56
- }
57
- /** Post the message twice, it assures the target to receive the message at least once */
58
- function postMessageSafelyToCrossOriginIframe(iframe, executable) {
59
- executable();
60
- iframe.addEventListener("load", executable);
61
- }
62
- function getExponentialBackoffDelay(nthRetry) {
63
- if (nthRetry <= 100) {
64
- return 100; // for 10 seconds
65
- }
66
- if (nthRetry <= 120) {
67
- return 1000; // for 20 seconds
68
- }
69
- return 10000;
70
- }
71
- //# sourceMappingURL=parent.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parent.js","sourceRoot":"","sources":["../../src/resizer/parent.ts"],"names":[],"mappings":"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"}
@@ -1,140 +0,0 @@
1
- import type {
2
- IFrameMessage,
3
- IFrameObjectMessage,
4
- IframeChildMessageEventData,
5
- IframeParentMessageEventData,
6
- } from "../events/index.js";
7
- import {
8
- type IframeChildInitEventData,
9
- type IframeResizeEventData,
10
- type IframeScrollData,
11
- isBrowser,
12
- } from "./common.js";
13
-
14
- export class IframeChildInstance {
15
- #queue: IFrameMessage[] = [];
16
- #isQueueConsumed = false;
17
- #initialized = false;
18
- #_resizeObserver: ResizeObserver | null = null;
19
- get #resizeObserver() {
20
- if (!this.#_resizeObserver) {
21
- this.#_resizeObserver = new ResizeObserver((entries) => {
22
- console.log("ResizeObserver entries:", entries);
23
- if (!entries[0]?.target) {
24
- return;
25
- }
26
-
27
- const clientRect = entries[0].target.getBoundingClientRect();
28
- const height = Math.ceil(clientRect.height);
29
- const width = Math.ceil(clientRect.width);
30
-
31
- const data: IframeResizeEventData = {
32
- height,
33
- type: "iframe-resized",
34
- width,
35
- };
36
-
37
- window.parent.postMessage(data, "*");
38
- });
39
- }
40
-
41
- return this.#_resizeObserver;
42
- }
43
-
44
- #handleInitializeSignal = (event: MessageEvent<IframeChildInitEventData>) => {
45
- const elementToObserve = document.documentElement;
46
-
47
- if (this.#initialized || window.parent !== event.source) {
48
- return;
49
- }
50
-
51
- this.#resizeObserver.disconnect();
52
- console.log("Observing element for resize:", elementToObserve);
53
- this.#resizeObserver.observe(elementToObserve);
54
- this.#initialized = true;
55
- this.#isQueueConsumed = true;
56
- this.#queue.forEach((message) => this.sendMessage(message));
57
- this.#queue.length = 0;
58
-
59
- this.#onReady();
60
- };
61
-
62
- sendMessage = (message: IFrameMessage) => {
63
- if (!this.#isQueueConsumed && isInIframe()) {
64
- this.#queue.push(message);
65
-
66
- return;
67
- }
68
-
69
- const data: IframeParentMessageEventData = {
70
- message,
71
- type: "iframe-parent-message",
72
- };
73
-
74
- this.#sendMessage(data);
75
- };
76
-
77
- scrollToOffset = (offset: { top: number }) => {
78
- const data: IframeScrollData = {
79
- top: offset.top,
80
- type: "iframe-scroll-to-offset",
81
- };
82
-
83
- this.#sendMessage(data);
84
- };
85
-
86
- #sendMessage(data: IframeScrollData | IframeParentMessageEventData) {
87
- if (!isBrowser() || !isInIframe()) return;
88
-
89
- window.parent.postMessage(data, "*");
90
- }
91
-
92
- #handleMessage = (
93
- event: MessageEvent<IframeChildInitEventData | IframeChildMessageEventData>,
94
- ) => {
95
- if (event.data?.type === "iframe-child-init") {
96
- return deferWhenWindowDocumentIsLoaded(() =>
97
- this.#handleInitializeSignal(event as MessageEvent<IframeChildInitEventData>),
98
- );
99
- }
100
-
101
- if (event.data?.type === "iframe-child-message") {
102
- this.#onMessage(event.data.message);
103
- }
104
- };
105
-
106
- readonly #onReady: () => void;
107
- readonly #onMessage: (message: IFrameObjectMessage) => void;
108
-
109
- constructor({
110
- onReady,
111
- onMessage,
112
- }: {
113
- onReady: () => void;
114
- onMessage: (message: IFrameObjectMessage) => void;
115
- }) {
116
- this.#onReady = onReady;
117
- this.#onMessage = onMessage;
118
- }
119
-
120
- initialize = () => {
121
- if (!isBrowser() || !isInIframe()) return;
122
-
123
- window.addEventListener("message", this.#handleMessage);
124
- };
125
-
126
- unsubscribe = () => {
127
- window.removeEventListener("message", this.#handleMessage);
128
- this.#resizeObserver.disconnect();
129
- };
130
- }
131
-
132
- function isInIframe() {
133
- return window.self !== window.top;
134
- }
135
-
136
- function deferWhenWindowDocumentIsLoaded(executable: () => void) {
137
- window.document.readyState === "complete"
138
- ? executable()
139
- : window.addEventListener("load", executable);
140
- }
@@ -1,27 +0,0 @@
1
- export function isBrowser() {
2
- return typeof window !== "undefined";
3
- }
4
-
5
- export type InitializeResult = { unsubscribe: () => void };
6
-
7
- export type IframeResizeEventData = {
8
- type: "iframe-resized";
9
- width: number;
10
- height?: number;
11
- };
12
- export type IframeScrollData = {
13
- type: "iframe-scroll-to-offset";
14
- top: number;
15
- };
16
-
17
- export type IframeChildInitEventData = {
18
- type: "iframe-child-init";
19
- };
20
-
21
- export type IframeResizeEvent = MessageEvent<IframeResizeEventData>;
22
- export type IframeScrollEvent = MessageEvent<IframeScrollData>;
23
-
24
- export interface RegisteredElement {
25
- iframe: HTMLIFrameElement;
26
- initContext: { isInitialized: boolean; retryAttempts: number; retryTimeoutId?: number };
27
- }
@@ -1,110 +0,0 @@
1
- import {
2
- type IframeChildInitEventData,
3
- type IframeResizeEvent,
4
- type IframeScrollEvent,
5
- type InitializeResult,
6
- isBrowser,
7
- type RegisteredElement,
8
- } from "./common.js";
9
-
10
- let registeredElements: Array<RegisteredElement> = [];
11
-
12
- export function initialize(iframe: HTMLIFrameElement): InitializeResult {
13
- if (!isBrowser()) {
14
- return { unsubscribe() {} };
15
- }
16
-
17
- const registeredElement: RegisteredElement = {
18
- iframe,
19
- initContext: { isInitialized: false, retryAttempts: 0 },
20
- };
21
- const unsubscribe = addCrossOriginChildResizeListener(registeredElement);
22
- registeredElements.push(registeredElement);
23
-
24
- return {
25
- unsubscribe() {
26
- unsubscribe();
27
- registeredElements = registeredElements.filter((entry) => entry.iframe !== iframe);
28
- },
29
- };
30
- }
31
-
32
- function addCrossOriginChildResizeListener(registeredElement: RegisteredElement) {
33
- const { iframe, initContext } = registeredElement;
34
-
35
- function handleIframeResizedMessage(event: MessageEvent) {
36
- const isIframeTarget = iframe.contentWindow === event.source;
37
-
38
- if (!isIframeTarget) {
39
- return;
40
- }
41
-
42
- if (event.data?.type === "iframe-resized") {
43
- const { height } = (event as IframeResizeEvent).data;
44
- height && resizeIframe({ newHeight: height, registeredElement });
45
-
46
- return;
47
- }
48
-
49
- if (event.data?.type === "iframe-scroll-to-offset") {
50
- const { top } = (event as IframeScrollEvent).data;
51
- const iFramePosition = iframe.getBoundingClientRect();
52
-
53
- window.scrollTo({ top: iFramePosition.top + window.scrollY + top });
54
-
55
- return;
56
- }
57
- }
58
-
59
- window.addEventListener("message", handleIframeResizedMessage);
60
-
61
- const initMessage: IframeChildInitEventData = { type: "iframe-child-init" };
62
-
63
- function sendInitializationMessageToChild() {
64
- postMessageSafelyToCrossOriginIframe(iframe, () =>
65
- iframe.contentWindow?.postMessage(initMessage, "*"),
66
- );
67
- initContext.retryAttempts++;
68
- initContext.retryTimeoutId = window.setTimeout(
69
- sendInitializationMessageToChild,
70
- getExponentialBackoffDelay(initContext.retryAttempts),
71
- );
72
- }
73
- sendInitializationMessageToChild();
74
-
75
- return () => window.removeEventListener("message", handleIframeResizedMessage);
76
- }
77
-
78
- function resizeIframe({
79
- registeredElement,
80
- newHeight,
81
- }: {
82
- registeredElement: RegisteredElement;
83
- newHeight: number;
84
- }) {
85
- const { iframe, initContext } = registeredElement;
86
- if (!initContext.isInitialized) {
87
- initContext.isInitialized = true;
88
- clearTimeout(initContext.retryTimeoutId);
89
- }
90
-
91
- iframe.style.height = `${newHeight}px`;
92
- }
93
-
94
- /** Post the message twice, it assures the target to receive the message at least once */
95
- function postMessageSafelyToCrossOriginIframe(iframe: HTMLIFrameElement, executable: () => void) {
96
- executable();
97
- iframe.addEventListener("load", executable);
98
- }
99
-
100
- function getExponentialBackoffDelay(nthRetry: number) {
101
- if (nthRetry <= 100) {
102
- return 100; // for 10 seconds
103
- }
104
-
105
- if (nthRetry <= 120) {
106
- return 1000; // for 20 seconds
107
- }
108
-
109
- return 10000;
110
- }