@o3r/third-party 11.6.0-prerelease.3 → 11.6.0-prerelease.30
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/bridge/ab-testing/ab-testing-bridge.d.ts +2 -1
- package/bridge/ab-testing/ab-testing-bridge.d.ts.map +1 -1
- package/bridge/iframe/bridge.d.ts.map +1 -1
- package/bridge/iframe/helpers.d.ts +1 -1
- package/bridge/iframe/helpers.d.ts.map +1 -1
- package/esm2022/bridge/ab-testing/ab-testing-bridge.mjs +10 -8
- package/esm2022/bridge/iframe/bridge.mjs +6 -6
- package/esm2022/bridge/iframe/helpers.mjs +5 -5
- package/fesm2022/o3r-third-party.mjs +14 -12
- package/fesm2022/o3r-third-party.mjs.map +1 -1
- package/package.json +3 -3
- package/schematics/iframe-to-component/index.d.ts.map +1 -1
- package/schematics/iframe-to-component/index.js +36 -47
- package/schematics/iframe-to-component/schema.d.ts.map +1 -1
- package/schematics/ng-add/index.d.ts.map +1 -1
- package/schematics/ng-add/index.js +1 -1
- package/schematics/ng-add/schema.d.ts.map +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Observable } from 'rxjs';
|
|
2
1
|
import type { Logger } from '@o3r/core';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
3
|
/**
|
|
4
4
|
* Shared interface with the A/B testing provider
|
|
5
5
|
*/
|
|
@@ -55,6 +55,7 @@ export declare class AbTestBridge<T> implements AbTestBridgeInterface<T> {
|
|
|
55
55
|
*/
|
|
56
56
|
experiments$: Observable<T[]>;
|
|
57
57
|
/**
|
|
58
|
+
* AbTestBridge constructor
|
|
58
59
|
* @param isExperimentEqual check two different experiments match to identify an experiment to start or to stop
|
|
59
60
|
* @param options configure the communication with the A/B testing third party provider
|
|
60
61
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ab-testing-bridge.d.ts","sourceRoot":"","sources":["../../../src/bridge/ab-testing/ab-testing-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"ab-testing-bridge.d.ts","sourceRoot":"","sources":["../../../src/bridge/ab-testing/ab-testing-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACP,MAAM,WAAW,CAAC;AACnB,OAAO,EAGL,UAAU,EACX,MAAM,MAAM,CAAC;AAEd;;GAEG;AACH,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC;;OAEG;IACH,KAAK,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC;IAClC;;OAEG;IACH,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,cAAc,EAAE,MAAM,CAAC;CACxB;AAWD;;;;;;GAMG;AACH,qBAAa,YAAY,CAAC,CAAC,CAAE,YAAW,qBAAqB,CAAC,CAAC,CAAC;IAmBlD,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAlB9C;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAsD;IACzF;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C;;OAEG;IACI,YAAY,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;IAErC;;;;OAIG;gBAC0B,iBAAiB,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC;IAkB1H;;;OAGG;IACH,OAAO,CAAC,GAAG;IAIX;;OAEG;IACI,KAAK,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE;IAYjC;;OAEG;IACI,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;CAYlC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../../src/bridge/iframe/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../../src/bridge/iframe/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,UAAU,EACX,MAAM,MAAM,CAAC;AAUd,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,qBAAqB,EACtB,MAAM,aAAa,CAAC;AAMrB;;;GAGG;AACH,qBAAa,YAAY;IAmBK,OAAO,CAAC,QAAQ,CAAC,KAAK;IAlBlD,oIAAoI;IACpI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC,uEAAuE;IACvE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoC;IAEtE,uGAAuG;IACvG,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAgB;IAElD,wDAAwD;IACxD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAE9C;;;OAGG;IACH,SAAgB,SAAS,EAAE,UAAU,CAAC,qBAAqB,CAAC,CAAC;gBAEjD,MAAM,EAAE,MAAM,EAAmB,KAAK,EAAE,iBAAiB,EAAE,OAAO,GAAE,OAAO,CAAC,mBAAmB,CAAM;YAoBnG,SAAS;IAavB,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,8BAA8B;IAYtC;;;;OAIG;IACU,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,CAAC,EAAE,MAAM;IAKnE;;;;OAIG;IACU,6BAA6B,CAAC,OAAO,EAAE,aAAa,EAAE,mBAAmB,GAAE,MAAgD;CAIzI"}
|
|
@@ -2,7 +2,7 @@ import { IFrameBridgeOptions, InternalIframeMessage } from './contracts';
|
|
|
2
2
|
/**
|
|
3
3
|
* Default options for an IFrameBridge
|
|
4
4
|
*/
|
|
5
|
-
export declare const IFRAME_BRIDGE_DEFAULT_OPTIONS: IFrameBridgeOptions
|
|
5
|
+
export declare const IFRAME_BRIDGE_DEFAULT_OPTIONS: Readonly<IFrameBridgeOptions>;
|
|
6
6
|
/**
|
|
7
7
|
* Verifies if a message respects the format expected by an IFrameBridge
|
|
8
8
|
* @param message
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/bridge/iframe/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/bridge/iframe/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,eAAO,MAAM,6BAA6B,EAAE,QAAQ,CAAC,mBAAmB,CAI9D,CAAC;AAEX;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,IAAI,qBAAqB,CAKjF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,SAAK,UA8E7E"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BehaviorSubject, distinctUntilChanged } from 'rxjs';
|
|
1
|
+
import { BehaviorSubject, distinctUntilChanged, } from 'rxjs';
|
|
2
2
|
/**
|
|
3
3
|
* Default options that will represent the interface
|
|
4
4
|
*/
|
|
@@ -16,6 +16,7 @@ const defaultOptions = {
|
|
|
16
16
|
*/
|
|
17
17
|
export class AbTestBridge {
|
|
18
18
|
/**
|
|
19
|
+
* AbTestBridge constructor
|
|
19
20
|
* @param isExperimentEqual check two different experiments match to identify an experiment to start or to stop
|
|
20
21
|
* @param options configure the communication with the A/B testing third party provider
|
|
21
22
|
*/
|
|
@@ -30,12 +31,11 @@ export class AbTestBridge {
|
|
|
30
31
|
...defaultOptions,
|
|
31
32
|
...options
|
|
32
33
|
};
|
|
33
|
-
if (
|
|
34
|
-
|
|
35
|
-
window[this.options.bridgeName] = { start: this.start.bind(this), stop: this.stop.bind(this) };
|
|
34
|
+
if (window[this.options.bridgeName]) {
|
|
35
|
+
this.log(`An instance of ${this.options.bridgeName} already exists. This AbTestBridge instance will be ignored`);
|
|
36
36
|
}
|
|
37
37
|
else {
|
|
38
|
-
this.
|
|
38
|
+
window[this.options.bridgeName] = { start: this.start.bind(this), stop: this.stop.bind(this) };
|
|
39
39
|
}
|
|
40
40
|
document.dispatchEvent(new CustomEvent(this.options.readyEventName));
|
|
41
41
|
}
|
|
@@ -54,7 +54,9 @@ export class AbTestBridge {
|
|
|
54
54
|
const currentProfile = this.experimentSubject$.getValue();
|
|
55
55
|
this.experimentSubject$.next([
|
|
56
56
|
...currentProfile,
|
|
57
|
-
...(Array.isArray(experiments)
|
|
57
|
+
...(Array.isArray(experiments)
|
|
58
|
+
? experiments
|
|
59
|
+
: [experiments]).filter((exp) => !currentProfile.some((expB) => this.isExperimentEqual(exp, expB)))
|
|
58
60
|
]);
|
|
59
61
|
}
|
|
60
62
|
/**
|
|
@@ -65,7 +67,7 @@ export class AbTestBridge {
|
|
|
65
67
|
const currentExperiments = this.experimentSubject$.getValue();
|
|
66
68
|
if (experiments) {
|
|
67
69
|
// Stop the mentioned experiment
|
|
68
|
-
this.experimentSubject$.next(currentExperiments.filter((expB) => !(Array.isArray(experiments) ? experiments : [experiments]).some(expA => this.isExperimentEqual(expB, expA))));
|
|
70
|
+
this.experimentSubject$.next(currentExperiments.filter((expB) => !(Array.isArray(experiments) ? experiments : [experiments]).some((expA) => this.isExperimentEqual(expB, expA))));
|
|
69
71
|
}
|
|
70
72
|
else {
|
|
71
73
|
// Stop all the experiment
|
|
@@ -73,4 +75,4 @@ export class AbTestBridge {
|
|
|
73
75
|
}
|
|
74
76
|
}
|
|
75
77
|
}
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWItdGVzdGluZy1icmlkZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYnJpZGdlL2FiLXRlc3RpbmcvYWItdGVzdGluZy1icmlkZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUNMLGVBQWUsRUFDZixvQkFBb0IsR0FFckIsTUFBTSxNQUFNLENBQUM7QUFxQ2Q7O0dBRUc7QUFDSCxNQUFNLGNBQWMsR0FBRztJQUNyQixVQUFVLEVBQUUsY0FBYztJQUMxQixjQUFjLEVBQUUsZUFBZTtJQUMvQixNQUFNLEVBQUUsT0FBTztDQUNzQixDQUFDO0FBRXhDOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxZQUFZO0lBY3ZCOzs7O09BSUc7SUFDSCxZQUE2QixpQkFBc0QsRUFBRSxPQUFxQztRQUE3RixzQkFBaUIsR0FBakIsaUJBQWlCLENBQXFDO1FBbEJuRjs7V0FFRztRQUNjLHVCQUFrQixHQUF5QixJQUFJLGVBQWUsQ0FBTSxFQUFFLENBQUMsQ0FBQztRQWdCdkYsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUM5QyxvQkFBb0IsQ0FBQyxDQUFDLFlBQWlCLEVBQUUsWUFBaUIsRUFBRSxFQUFFLENBQzVELFlBQVksQ0FBQyxNQUFNLEtBQUssWUFBWSxDQUFDLE1BQU0sSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FDN0gsQ0FBQyxDQUNMLENBQUM7UUFDRixJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2IsR0FBRyxjQUFjO1lBQ2pCLEdBQUcsT0FBTztTQUNYLENBQUM7UUFDRixJQUFLLE1BQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDN0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLDZEQUE2RCxDQUFDLENBQUM7UUFDbkgsQ0FBQzthQUFNLENBQUM7WUFDTCxNQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMxRyxDQUFDO1FBQ0QsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVEOzs7T0FHRztJQUNLLEdBQUcsQ0FBQyxHQUFHLElBQVc7UUFDeEIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFdBQW9CO1FBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDMUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7WUFDM0IsR0FBRyxjQUFjO1lBQ2pCLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztnQkFDNUIsQ0FBQyxDQUFDLFdBQVc7Z0JBQ2IsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUN0RztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLElBQUksQ0FBQyxXQUFxQjtRQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlELElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsZ0NBQWdDO1lBQ2hDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FDbEwsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sMEJBQTBCO1lBQzFCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgTG9nZ2VyLFxufSBmcm9tICdAbzNyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgT2JzZXJ2YWJsZSxcbn0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICogU2hhcmVkIGludGVyZmFjZSB3aXRoIHRoZSBBL0IgdGVzdGluZyBwcm92aWRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFiVGVzdEJyaWRnZUludGVyZmFjZTxUPiB7XG4gIC8qKlxuICAgKiBTdGFydCBhbiBBQiB0ZXN0aW5nIGV4cGVyaW1lbnRcbiAgICovXG4gIHN0YXJ0KGV4cGVyaW1lbnRzOiBUIHwgVFtdKTogdm9pZDtcbiAgLyoqXG4gICAqIFN0b3AgYW4gQUIgdGVzdGluZyBleHBlcmltZW50XG4gICAqL1xuICBzdG9wKGV4cGVyaW1lbnRzPzogVCB8IFRbXSk6IHZvaWQ7XG59XG5cbi8qKlxuICogQ29uZmlndXJlIHRoZSBBL0IgdGVzdGluZyBzY3JpcHQgaW50ZXJmYWNlcyB3aXRoIHRoZSBhcHBsaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFiVGVzdEJyaWRnZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgYnJpZGdlIGZyb20gdGhlIHdpbmRvd1xuICAgKiBAZGVmYXVsdCAnYWJUZXN0QnJpZGdlJ1xuICAgKi9cbiAgYnJpZGdlTmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogRGVidWcgbG9nZ2VyXG4gICAqIEBkZWZhdWx0IGNvbnNvbGVcbiAgICovXG4gIGxvZ2dlcjogTG9nZ2VyO1xuICAvKipcbiAgICogRXZlbnQgYSB0aGlyZCBwYXJ0eSBjYW4gc3Vic2NyaWJlIHRvIGJlZm9yZSBzdGFydGluZyB0aGUgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBicmlkZ2VcbiAgICogQGRlZmF1bHQgJ2FiLXRlc3QtcmVhZHknXG4gICAqL1xuICByZWFkeUV2ZW50TmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIERlZmF1bHQgb3B0aW9ucyB0aGF0IHdpbGwgcmVwcmVzZW50IHRoZSBpbnRlcmZhY2VcbiAqL1xuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gIGJyaWRnZU5hbWU6ICdhYlRlc3RCcmlkZ2UnLFxuICByZWFkeUV2ZW50TmFtZTogJ2FiLXRlc3QtcmVhZHknLFxuICBsb2dnZXI6IGNvbnNvbGVcbn0gYXMgY29uc3Qgc2F0aXNmaWVzIEFiVGVzdEJyaWRnZUNvbmZpZztcblxuLyoqXG4gKiBCcmlkZ2UgYmV0d2VlbiB0aGUgYXBwbGljYXRpb24gYW5kIGEgdGhpcmQgcGFydHkgQS9CIHRlc3RpbmcgcHJvdmlkZXIuXG4gKiBFeHBvc2VzIGEgc3RhcnQgYW5kIHN0b3AgbWV0aG9kcyB0byBhbGxvdyB0aGUgZXh0ZXJuYWwgc2NyaXB0IHRvIHNldCB0aGUgbGlzdCBvZiBleHBlcmltZW50cyB0byBydW4gb3ZlciB0aGVcbiAqIGFwcGxpY2F0aW9uLlxuICpcbiAqIFNoYXJlIHRoZSByZXN1bHRpbmcgbGlzdCBvZiBleHBlcmltZW50cyB3aXRoIHRoZSByZXN0IG9mIHRoZSBhcHBsaWNhdGlvbiB2aWEgYW4gb2JzZXJ2YWJsZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFiVGVzdEJyaWRnZTxUPiBpbXBsZW1lbnRzIEFiVGVzdEJyaWRnZUludGVyZmFjZTxUPiB7XG4gIC8qKlxuICAgKiBCZWhhdmlvdXIgc3ViamVjdCB0byBjb250cm9sIHRoZSBleHBlcmltZW50cyB2aWEgdGhlIGV4cG9zZWQgaW50ZXJmYWNlXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGV4cGVyaW1lbnRTdWJqZWN0JDogQmVoYXZpb3JTdWJqZWN0PFRbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRbXT4oW10pO1xuICAvKipcbiAgICogT3B0aW9ucyB0byBjb25maWd1cmUgdGhlIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgQUIgVGVzdGluZyBicmlkZ2UgYW5kIHRoaXJkIHBhcnRpZXNcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogQWJUZXN0QnJpZGdlQ29uZmlnO1xuICAvKipcbiAgICogT2JzZXJ2YWJsZSB3aXRoIHRoZSBsaXN0IG9mIEFCIHRlc3RpbmcgZXhwZXJpbWVudHMgY3VycmVudGx5IGFwcGxpZWRcbiAgICovXG4gIHB1YmxpYyBleHBlcmltZW50cyQ6IE9ic2VydmFibGU8VFtdPjtcblxuICAvKipcbiAgICogQWJUZXN0QnJpZGdlIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSBpc0V4cGVyaW1lbnRFcXVhbCBjaGVjayB0d28gZGlmZmVyZW50IGV4cGVyaW1lbnRzIG1hdGNoIHRvIGlkZW50aWZ5IGFuIGV4cGVyaW1lbnQgdG8gc3RhcnQgb3IgdG8gc3RvcFxuICAgKiBAcGFyYW0gb3B0aW9ucyBjb25maWd1cmUgdGhlIGNvbW11bmljYXRpb24gd2l0aCB0aGUgQS9CIHRlc3RpbmcgdGhpcmQgcGFydHkgcHJvdmlkZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgaXNFeHBlcmltZW50RXF1YWw6ICh2YWx1ZTE/OiBULCB2YWx1ZTI/OiBUKSA9PiBib29sZWFuLCBvcHRpb25zPzogUGFydGlhbDxBYlRlc3RCcmlkZ2VDb25maWc+KSB7XG4gICAgdGhpcy5leHBlcmltZW50cyQgPSB0aGlzLmV4cGVyaW1lbnRTdWJqZWN0JC5waXBlKFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKGV4cGVyaW1lbnRzQTogVFtdLCBleHBlcmltZW50c0I6IFRbXSkgPT5cbiAgICAgICAgZXhwZXJpbWVudHNCLmxlbmd0aCA9PT0gZXhwZXJpbWVudHNBLmxlbmd0aCAmJiBleHBlcmltZW50c0EuZXZlcnkoKGVBKSA9PiBleHBlcmltZW50c0IuZmluZCgoZUIpID0+IGlzRXhwZXJpbWVudEVxdWFsKGVBLCBlQikpXG4gICAgICAgICkpXG4gICAgKTtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAuLi5kZWZhdWx0T3B0aW9ucyxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9O1xuICAgIGlmICgod2luZG93IGFzIGFueSlbdGhpcy5vcHRpb25zLmJyaWRnZU5hbWVdKSB7XG4gICAgICB0aGlzLmxvZyhgQW4gaW5zdGFuY2Ugb2YgJHt0aGlzLm9wdGlvbnMuYnJpZGdlTmFtZX0gYWxyZWFkeSBleGlzdHMuIFRoaXMgQWJUZXN0QnJpZGdlIGluc3RhbmNlIHdpbGwgYmUgaWdub3JlZGApO1xuICAgIH0gZWxzZSB7XG4gICAgICAod2luZG93IGFzIGFueSlbdGhpcy5vcHRpb25zLmJyaWRnZU5hbWVdID0geyBzdGFydDogdGhpcy5zdGFydC5iaW5kKHRoaXMpLCBzdG9wOiB0aGlzLnN0b3AuYmluZCh0aGlzKSB9O1xuICAgIH1cbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCh0aGlzLm9wdGlvbnMucmVhZHlFdmVudE5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2UgY29uZmlndXJlZCBsb2dnZXIgdG8gbG9nIEFCIHRlc3RpbmcgcmVsYXRlZCBpbmZvcm1hdGlvblxuICAgKiBAcGFyYW0gYXJnc1xuICAgKi9cbiAgcHJpdmF0ZSBsb2coLi4uYXJnczogYW55W10pIHtcbiAgICAodGhpcy5vcHRpb25zLmxvZ2dlci5kZWJ1ZyB8fCB0aGlzLm9wdGlvbnMubG9nZ2VyLmxvZykoJ0EvQiBUZXN0JywgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGFydChleHBlcmltZW50czogVCB8IFRbXSkge1xuICAgIHRoaXMubG9nKCdTdGFydCBleHBlcmltZW50JywgZXhwZXJpbWVudHMpO1xuICAgIGNvbnN0IGN1cnJlbnRQcm9maWxlID0gdGhpcy5leHBlcmltZW50U3ViamVjdCQuZ2V0VmFsdWUoKTtcbiAgICB0aGlzLmV4cGVyaW1lbnRTdWJqZWN0JC5uZXh0KFtcbiAgICAgIC4uLmN1cnJlbnRQcm9maWxlLFxuICAgICAgLi4uKEFycmF5LmlzQXJyYXkoZXhwZXJpbWVudHMpXG4gICAgICAgID8gZXhwZXJpbWVudHNcbiAgICAgICAgOiBbZXhwZXJpbWVudHNdKS5maWx0ZXIoKGV4cCkgPT4gIWN1cnJlbnRQcm9maWxlLnNvbWUoKGV4cEI6IFQpID0+IHRoaXMuaXNFeHBlcmltZW50RXF1YWwoZXhwLCBleHBCKSlcbiAgICAgIClcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHN0b3AoZXhwZXJpbWVudHM/OiBUIHwgVFtdKSB7XG4gICAgdGhpcy5sb2coJ1N0b3AgZXhwZXJpbWVudCcsIGV4cGVyaW1lbnRzKTtcbiAgICBjb25zdCBjdXJyZW50RXhwZXJpbWVudHMgPSB0aGlzLmV4cGVyaW1lbnRTdWJqZWN0JC5nZXRWYWx1ZSgpO1xuICAgIGlmIChleHBlcmltZW50cykge1xuICAgICAgLy8gU3RvcCB0aGUgbWVudGlvbmVkIGV4cGVyaW1lbnRcbiAgICAgIHRoaXMuZXhwZXJpbWVudFN1YmplY3QkLm5leHQoY3VycmVudEV4cGVyaW1lbnRzLmZpbHRlcigoZXhwQjogVCkgPT4gIShBcnJheS5pc0FycmF5KGV4cGVyaW1lbnRzKSA/IGV4cGVyaW1lbnRzIDogW2V4cGVyaW1lbnRzXSkuc29tZSgoZXhwQSkgPT4gdGhpcy5pc0V4cGVyaW1lbnRFcXVhbChleHBCLCBleHBBKSkpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdG9wIGFsbCB0aGUgZXhwZXJpbWVudFxuICAgICAgdGhpcy5leHBlcmltZW50U3ViamVjdCQubmV4dChbXSk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { firstValueFrom, fromEvent } from 'rxjs';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { IFRAME_BRIDGE_DEFAULT_OPTIONS, isSupportedMessage } from './helpers';
|
|
1
|
+
import { firstValueFrom, fromEvent, } from 'rxjs';
|
|
2
|
+
import { filter, map, share, timeout, } from 'rxjs/operators';
|
|
3
|
+
import { v4, } from 'uuid';
|
|
4
|
+
import { IFRAME_BRIDGE_DEFAULT_OPTIONS, isSupportedMessage, } from './helpers';
|
|
5
5
|
/**
|
|
6
6
|
* Bridge that exposes an easy abstraction layer to communicate between a Host and an IFrame using the
|
|
7
7
|
* postMessage API.
|
|
@@ -32,7 +32,7 @@ export class IframeBridge {
|
|
|
32
32
|
}
|
|
33
33
|
catch { }
|
|
34
34
|
}
|
|
35
|
-
|
|
35
|
+
throw new Error('Handshake failed.');
|
|
36
36
|
}
|
|
37
37
|
_sendMessage(message, messageId) {
|
|
38
38
|
if (this.child.contentWindow) {
|
|
@@ -64,4 +64,4 @@ export class IframeBridge {
|
|
|
64
64
|
return this._sendMessageAndWaitForResponse(message, timeoutMilliseconds);
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJpZGdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JyaWRnZS9pZnJhbWUvYnJpZGdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxjQUFjLEVBQ2QsU0FBUyxHQUVWLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUNMLE1BQU0sRUFDTixHQUFHLEVBQ0gsS0FBSyxFQUNMLE9BQU8sR0FDUixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxFQUFFLEdBQ0gsTUFBTSxNQUFNLENBQUM7QUFNZCxPQUFPLEVBQ0wsNkJBQTZCLEVBQzdCLGtCQUFrQixHQUNuQixNQUFNLFdBQVcsQ0FBQztBQUVuQjs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQW1CdkIsWUFBWSxNQUFjLEVBQW1CLEtBQXdCLEVBQUUsVUFBd0MsRUFBRTtRQUFwRSxVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUNuRSxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsR0FBRyw2QkFBNkIsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDO1FBQ2hFLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUN4RCxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQWdELEVBQUU7WUFDN0QsTUFBTSxZQUFZLEdBQUcsS0FBNEMsQ0FBQztZQUNsRSxPQUFPLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2pHLENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUMxQixLQUFLLEVBQUUsQ0FDUixDQUFDO1FBQ0YsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSTtRQUMxQywyR0FBMkc7UUFDM0csc0VBQXNFO1FBQ3RFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQ2pDLENBQUM7UUFFRixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFTyxLQUFLLENBQUMsU0FBUztRQUNyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNyRCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsOEJBQThCLENBQUM7b0JBQ3hDLE1BQU0sRUFBRSxrQkFBa0I7b0JBQzFCLE9BQU8sRUFBRSxLQUFLO2lCQUNmLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNsQyxPQUFPO1lBQ1QsQ0FBQztZQUFDLE1BQU0sQ0FBQyxDQUFBLENBQUM7UUFDWixDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTyxZQUFZLENBQUMsT0FBc0IsRUFBRSxTQUFrQjtRQUM3RCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3RHLENBQUM7SUFDSCxDQUFDO0lBRU8sOEJBQThCLENBQUMsT0FBc0IsRUFBRSxzQkFBOEIsSUFBSSxDQUFDLE9BQU8sQ0FBQywwQkFBMEI7UUFDbEksTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDaEIsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUM1QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUN6QixNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQ3hDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUM3QixDQUNGLENBQUM7UUFDRixLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3BDLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFzQixFQUFFLFNBQWtCO1FBQ2pFLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQzVCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLDZCQUE2QixDQUFDLE9BQXNCLEVBQUUsc0JBQThCLElBQUksQ0FBQyxPQUFPLENBQUMsMEJBQTBCO1FBQ3RJLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQzVCLE9BQU8sSUFBSSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQzNFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGZpcnN0VmFsdWVGcm9tLFxuICBmcm9tRXZlbnQsXG4gIE9ic2VydmFibGUsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgZmlsdGVyLFxuICBtYXAsXG4gIHNoYXJlLFxuICB0aW1lb3V0LFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICB2NCxcbn0gZnJvbSAndXVpZCc7XG5pbXBvcnQge1xuICBJRnJhbWVCcmlkZ2VPcHRpb25zLFxuICBJZnJhbWVNZXNzYWdlLFxuICBJbnRlcm5hbElmcmFtZU1lc3NhZ2UsXG59IGZyb20gJy4vY29udHJhY3RzJztcbmltcG9ydCB7XG4gIElGUkFNRV9CUklER0VfREVGQVVMVF9PUFRJT05TLFxuICBpc1N1cHBvcnRlZE1lc3NhZ2UsXG59IGZyb20gJy4vaGVscGVycyc7XG5cbi8qKlxuICogQnJpZGdlIHRoYXQgZXhwb3NlcyBhbiBlYXN5IGFic3RyYWN0aW9uIGxheWVyIHRvIGNvbW11bmljYXRlIGJldHdlZW4gYSBIb3N0IGFuZCBhbiBJRnJhbWUgdXNpbmcgdGhlXG4gKiBwb3N0TWVzc2FnZSBBUEkuXG4gKi9cbmV4cG9ydCBjbGFzcyBJZnJhbWVCcmlkZ2Uge1xuICAvKiogSUQgdXNlZCB0byBlbnN1cmUgdGhhdCB0aGUgQnJpZGdlIG9ubHkgcHJvY2Vzc2VzIG1lc3NhZ2VzIG1lYW50IGZvciB0aGlzIGluc3RhbmNlLCBzaW5jZSBwb3N0TWVzc2FnZSBpcyBnbG9iYWwgdG8gdGhlIHdpbmRvdy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjaGFubmVsSWQ6IHN0cmluZztcblxuICAvKiogT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGFsbCB0aGUgbWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSB0aGUgSUZyYW1lLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGludGVybmFsTWVzc2FnZXMkOiBPYnNlcnZhYmxlPEludGVybmFsSWZyYW1lTWVzc2FnZT47XG5cbiAgLyoqIFByb21pc2UgdGhhdCB3aWxsIHJlc29sdmUgb25jZSB0aGUgaGFuZHNoYWtlIGhhcyBiZWVuIGNvbXBsZXRlZCwgdW5kZWZpbmVkIGlmIGl0J3MgYWxyZWFkeSBkb25lLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRzaGFrZVByb21pc2U/OiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKiBPcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGUgYmVoYXZpb3VyIG9mIHRoZSBCcmlkZ2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogSUZyYW1lQnJpZGdlT3B0aW9ucztcblxuICAvKipcbiAgICogT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGFsbCB0aGUgbWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSB0aGUgSUZyYW1lIGFuZCB0aGF0IGFyZVxuICAgKiBub3QgYSBkaXJlY3QgcmVzcG9uc2UgdG8gYSByZXF1ZXN0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1lc3NhZ2VzJDogT2JzZXJ2YWJsZTxJbnRlcm5hbElmcmFtZU1lc3NhZ2U+O1xuXG4gIGNvbnN0cnVjdG9yKHBhcmVudDogV2luZG93LCBwcml2YXRlIHJlYWRvbmx5IGNoaWxkOiBIVE1MSUZyYW1lRWxlbWVudCwgb3B0aW9uczogUGFydGlhbDxJRnJhbWVCcmlkZ2VPcHRpb25zPiA9IHt9KSB7XG4gICAgdGhpcy5vcHRpb25zID0geyAuLi5JRlJBTUVfQlJJREdFX0RFRkFVTFRfT1BUSU9OUywgLi4ub3B0aW9ucyB9O1xuICAgIHRoaXMuY2hhbm5lbElkID0gdjQoKTtcbiAgICB0aGlzLmludGVybmFsTWVzc2FnZXMkID0gZnJvbUV2ZW50KHBhcmVudCwgJ21lc3NhZ2UnKS5waXBlKFxuICAgICAgZmlsdGVyKChldmVudCk6IGV2ZW50IGlzIE1lc3NhZ2VFdmVudDxJbnRlcm5hbElmcmFtZU1lc3NhZ2U+ID0+IHtcbiAgICAgICAgY29uc3QgbWVzc2FnZUV2ZW50ID0gZXZlbnQgYXMgTWVzc2FnZUV2ZW50PEludGVybmFsSWZyYW1lTWVzc2FnZT47XG4gICAgICAgIHJldHVybiBpc1N1cHBvcnRlZE1lc3NhZ2UobWVzc2FnZUV2ZW50LmRhdGEpICYmIG1lc3NhZ2VFdmVudC5kYXRhLmNoYW5uZWxJZCA9PT0gdGhpcy5jaGFubmVsSWQ7XG4gICAgICB9KSxcbiAgICAgIG1hcCgoZXZlbnQpID0+IGV2ZW50LmRhdGEpLFxuICAgICAgc2hhcmUoKVxuICAgICk7XG4gICAgdGhpcy5tZXNzYWdlcyQgPSB0aGlzLmludGVybmFsTWVzc2FnZXMkLnBpcGUoXG4gICAgICAvLyBIZXJlIHdlIHJlbW92ZSBhbGwgdGhlIG1lc3NhZ2VzIGhhdmluZyBhbiBcIklEXCIgYmVjYXVzZSB0aGV5IGFyZSBib3VuZCB0byB0aGVpciBjb3JyZXNwb25kaW5nIHJlcXVlc3QgYW5kXG4gICAgICAvLyBhcmUgcmV0dXJuZWQgZGlyZWN0bHkgYnkgdGhlIGZ1bmN0aW9uIHNlbmRNZXNzYWdlQW5kV2FpdEZvclJlc3BvbnNlXG4gICAgICBmaWx0ZXIoKG1lc3NhZ2UpID0+ICFtZXNzYWdlLmlkKVxuICAgICk7XG5cbiAgICB0aGlzLmhhbmRzaGFrZVByb21pc2UgPSB0aGlzLmhhbmRzaGFrZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kc2hha2UoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMuaGFuZHNoYWtlVHJpZXM7IGkrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fc2VuZE1lc3NhZ2VBbmRXYWl0Rm9yUmVzcG9uc2Uoe1xuICAgICAgICAgIGFjdGlvbjogJ0hBTkRTSEFLRV9QQVJFTlQnLFxuICAgICAgICAgIHZlcnNpb246ICcxLjAnXG4gICAgICAgIH0sIHRoaXMub3B0aW9ucy5oYW5kc2hha2VUaW1lb3V0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCB7fVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0hhbmRzaGFrZSBmYWlsZWQuJyk7XG4gIH1cblxuICBwcml2YXRlIF9zZW5kTWVzc2FnZShtZXNzYWdlOiBJZnJhbWVNZXNzYWdlLCBtZXNzYWdlSWQ/OiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5jaGlsZC5jb250ZW50V2luZG93KSB7XG4gICAgICB0aGlzLmNoaWxkLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoeyAuLi5tZXNzYWdlLCBjaGFubmVsSWQ6IHRoaXMuY2hhbm5lbElkLCBpZDogbWVzc2FnZUlkIH0sICcqJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2VuZE1lc3NhZ2VBbmRXYWl0Rm9yUmVzcG9uc2UobWVzc2FnZTogSWZyYW1lTWVzc2FnZSwgdGltZW91dE1pbGxpc2Vjb25kczogbnVtYmVyID0gdGhpcy5vcHRpb25zLm1lc3NhZ2VXaXRoUmVzcG9uc2VUaW1lb3V0KSB7XG4gICAgY29uc3QgaWQgPSB2NCgpO1xuICAgIGNvbnN0IHByb21pc2UgPSBmaXJzdFZhbHVlRnJvbShcbiAgICAgIHRoaXMuaW50ZXJuYWxNZXNzYWdlcyQucGlwZShcbiAgICAgICAgZmlsdGVyKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuaWQgPT09IGlkKSxcbiAgICAgICAgdGltZW91dCh0aW1lb3V0TWlsbGlzZWNvbmRzKVxuICAgICAgKVxuICAgICk7XG4gICAgdm9pZCB0aGlzLl9zZW5kTWVzc2FnZShtZXNzYWdlLCBpZCk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHNlbmQgYSBtZXNzYWdlIHRvIHRoZSBzY3JpcHQgcnVuIGluIHRoZSBpZnJhbWVcbiAgICogQHBhcmFtIG1lc3NhZ2UgbWVzc2FnZSBvYmplY3RcbiAgICogQHBhcmFtIG1lc3NhZ2VJZCBtZXNzYWdlIGlkZW50aWZpZXJcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZW5kTWVzc2FnZShtZXNzYWdlOiBJZnJhbWVNZXNzYWdlLCBtZXNzYWdlSWQ/OiBzdHJpbmcpIHtcbiAgICBhd2FpdCB0aGlzLmhhbmRzaGFrZVByb21pc2U7XG4gICAgdGhpcy5fc2VuZE1lc3NhZ2UobWVzc2FnZSwgbWVzc2FnZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gc2VuZCBhIG1lc3NhZ2UgdG8gdGhlIHNjcmlwdCBydW4gaW4gdGhlIGlmcmFtZSBhbmQgd2FpdCBmb3IgYW4gYW5zd2VyXG4gICAqIEBwYXJhbSBtZXNzYWdlXG4gICAqIEBwYXJhbSB0aW1lb3V0TWlsbGlzZWNvbmRzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VuZE1lc3NhZ2VBbmRXYWl0Rm9yUmVzcG9uc2UobWVzc2FnZTogSWZyYW1lTWVzc2FnZSwgdGltZW91dE1pbGxpc2Vjb25kczogbnVtYmVyID0gdGhpcy5vcHRpb25zLm1lc3NhZ2VXaXRoUmVzcG9uc2VUaW1lb3V0KSB7XG4gICAgYXdhaXQgdGhpcy5oYW5kc2hha2VQcm9taXNlO1xuICAgIHJldHVybiB0aGlzLl9zZW5kTWVzc2FnZUFuZFdhaXRGb3JSZXNwb25zZShtZXNzYWdlLCB0aW1lb3V0TWlsbGlzZWNvbmRzKTtcbiAgfVxufVxuIl19
|
|
@@ -11,10 +11,10 @@ export const IFRAME_BRIDGE_DEFAULT_OPTIONS = {
|
|
|
11
11
|
* @param message
|
|
12
12
|
*/
|
|
13
13
|
export function isSupportedMessage(message) {
|
|
14
|
-
return typeof message === 'object'
|
|
15
|
-
!!message.action
|
|
16
|
-
!!message.version
|
|
17
|
-
!!message.channelId;
|
|
14
|
+
return typeof message === 'object'
|
|
15
|
+
&& !!message.action
|
|
16
|
+
&& !!message.version
|
|
17
|
+
&& !!message.channelId;
|
|
18
18
|
}
|
|
19
19
|
/**
|
|
20
20
|
* Generates the html content of an iframe
|
|
@@ -100,4 +100,4 @@ export function generateIFrameContent(scriptUrl, additionalHeader = '') {
|
|
|
100
100
|
<body></body>
|
|
101
101
|
</html>`;
|
|
102
102
|
}
|
|
103
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9icmlkZ2UvaWZyYW1lL2hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0E7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBa0M7SUFDMUUsY0FBYyxFQUFFLEVBQUU7SUFDbEIsZ0JBQWdCLEVBQUUsR0FBRztJQUNyQiwwQkFBMEIsRUFBRSxJQUFJO0NBQ3hCLENBQUM7QUFFWDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsT0FBWTtJQUM3QyxPQUFPLE9BQU8sT0FBTyxLQUFLLFFBQVE7V0FDN0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNO1dBQ2hCLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTztXQUNqQixDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUMzQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxTQUFpQixFQUFFLGdCQUFnQixHQUFHLEVBQUU7SUFDNUUsT0FBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3FCQXdFWSxTQUFTO1FBQ3RCLGdCQUFnQjs7O1FBR2hCLENBQUM7QUFDVCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSUZyYW1lQnJpZGdlT3B0aW9ucyxcbiAgSW50ZXJuYWxJZnJhbWVNZXNzYWdlLFxufSBmcm9tICcuL2NvbnRyYWN0cyc7XG5cbi8qKlxuICogRGVmYXVsdCBvcHRpb25zIGZvciBhbiBJRnJhbWVCcmlkZ2VcbiAqL1xuZXhwb3J0IGNvbnN0IElGUkFNRV9CUklER0VfREVGQVVMVF9PUFRJT05TOiBSZWFkb25seTxJRnJhbWVCcmlkZ2VPcHRpb25zPiA9IHtcbiAgaGFuZHNoYWtlVHJpZXM6IDEwLFxuICBoYW5kc2hha2VUaW1lb3V0OiAyMDAsXG4gIG1lc3NhZ2VXaXRoUmVzcG9uc2VUaW1lb3V0OiAxMDAwXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIFZlcmlmaWVzIGlmIGEgbWVzc2FnZSByZXNwZWN0cyB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IGFuIElGcmFtZUJyaWRnZVxuICogQHBhcmFtIG1lc3NhZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3VwcG9ydGVkTWVzc2FnZShtZXNzYWdlOiBhbnkpOiBtZXNzYWdlIGlzIEludGVybmFsSWZyYW1lTWVzc2FnZSB7XG4gIHJldHVybiB0eXBlb2YgbWVzc2FnZSA9PT0gJ29iamVjdCdcbiAgICAmJiAhIW1lc3NhZ2UuYWN0aW9uXG4gICAgJiYgISFtZXNzYWdlLnZlcnNpb25cbiAgICAmJiAhIW1lc3NhZ2UuY2hhbm5lbElkO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyB0aGUgaHRtbCBjb250ZW50IG9mIGFuIGlmcmFtZVxuICogQHBhcmFtIHNjcmlwdFVybCBzY3JpcHQgdG8gYmUgZXhlY3V0ZWQgaW5zaWRlIHRoZSBpZnJhbWVcbiAqIEBwYXJhbSBhZGRpdGlvbmFsSGVhZGVyIGN1c3RvbSBodG1sIGhlYWRlcnMgc3RyaW5naWZpZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSUZyYW1lQ29udGVudChzY3JpcHRVcmw6IHN0cmluZywgYWRkaXRpb25hbEhlYWRlciA9ICcnKSB7XG4gIHJldHVybiBgPGh0bWw+XG4gIDxoZWFkPlxuICAgICAgPHNjcmlwdD5cbiAgICAgICAgICBjbGFzcyBCcmlkZ2Uge1xuICAgICAgICAgICAgaGFuZHNoYWtlRG9uZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICBxdWV1ZWRNZXNzYWdlcyA9IFtdO1xuXG4gICAgICAgICAgICBjaGFubmVsSWQ7XG5cbiAgICAgICAgICAgIG1lc3NhZ2VzQnVmZmVyID0gW107XG5cbiAgICAgICAgICAgIGxpc3RlbmVyO1xuXG4gICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgICAgaWYgKHdpbmRvdy5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZE1lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFjdGlvbiA9PT0gJ0hBTkRTSEFLRV9QQVJFTlQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbElkID0gbWVzc2FnZS5jaGFubmVsSWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VuZE1lc3NhZ2Uoe2FjdGlvbjogJ0hBTkRTSEFLRV9DSElMRCcsIHZlcnNpb246ICcxLjAnLCBpZDogbWVzc2FnZS5pZH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRzaGFrZURvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlZE1lc3NhZ2VzLmZvckVhY2goKHF1ZXVlZE1lc3NhZ2UpID0+IHRoaXMuc2VuZE1lc3NhZ2UocXVldWVkTWVzc2FnZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlZE1lc3NhZ2VzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhbm5lbElkICYmIHRoaXMuY2hhbm5lbElkID09PSBtZXNzYWdlLmNoYW5uZWxJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY3R1YWwgbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlc0J1ZmZlci5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciBpbiBjaGlsZCBmcmFtZSBicmlkZ2U6IGNhblxcXFwndCBhY2Nlc3MgcGFyZW50IHdpbmRvdy4nKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZWdpc3RlcihoYW5kbGVyRnVuY3Rpb24sIHJlcGxheU1pc3NlZE1lc3NhZ2VzKSB7XG4gICAgICAgICAgICAgIGlmICghdGhpcy5saXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIgPSBoYW5kbGVyRnVuY3Rpb247XG4gICAgICAgICAgICAgICAgaWYgKHJlcGxheU1pc3NlZE1lc3NhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VzQnVmZmVyLmZvckVhY2goKG1lc3NhZ2UpID0+IGhhbmRsZXJGdW5jdGlvbihtZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZXNCdWZmZXIgPSBbXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpc1ZhbGlkTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgICAgICAgICAgIHJldHVybiAhIW1lc3NhZ2UuYWN0aW9uICYmICEhbWVzc2FnZS52ZXJzaW9uICYmICEhbWVzc2FnZS5jaGFubmVsSWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlbmRNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgaWYodGhpcy5oYW5kc2hha2VEb25lKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7Li4ubWVzc2FnZSwgY2hhbm5lbElkOiB0aGlzLmNoYW5uZWxJZH0sICcqJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZWRNZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHV1aWQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24oYykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDAsIHYgPSBjID09ICd4JyA/IHIgOiAociAmIDB4MyB8IDB4OCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBCUklER0UgPSBuZXcgQnJpZGdlKCk7XG4gICAgICA8L3NjcmlwdD5cbiAgICAgIDxzY3JpcHQgc3JjPScke3NjcmlwdFVybH0nPjwvc2NyaXB0PlxuICAgICAgJHthZGRpdGlvbmFsSGVhZGVyfVxuICA8L2hlYWQ+XG4gIDxib2R5PjwvYm9keT5cbjwvaHRtbD5gO1xufVxuIl19
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { BehaviorSubject, distinctUntilChanged, fromEvent, firstValueFrom } from 'rxjs';
|
|
2
|
-
import { v4 } from 'uuid';
|
|
3
2
|
import { filter, map, share, timeout } from 'rxjs/operators';
|
|
3
|
+
import { v4 } from 'uuid';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Default options that will represent the interface
|
|
@@ -19,6 +19,7 @@ const defaultOptions = {
|
|
|
19
19
|
*/
|
|
20
20
|
class AbTestBridge {
|
|
21
21
|
/**
|
|
22
|
+
* AbTestBridge constructor
|
|
22
23
|
* @param isExperimentEqual check two different experiments match to identify an experiment to start or to stop
|
|
23
24
|
* @param options configure the communication with the A/B testing third party provider
|
|
24
25
|
*/
|
|
@@ -33,12 +34,11 @@ class AbTestBridge {
|
|
|
33
34
|
...defaultOptions,
|
|
34
35
|
...options
|
|
35
36
|
};
|
|
36
|
-
if (
|
|
37
|
-
|
|
38
|
-
window[this.options.bridgeName] = { start: this.start.bind(this), stop: this.stop.bind(this) };
|
|
37
|
+
if (window[this.options.bridgeName]) {
|
|
38
|
+
this.log(`An instance of ${this.options.bridgeName} already exists. This AbTestBridge instance will be ignored`);
|
|
39
39
|
}
|
|
40
40
|
else {
|
|
41
|
-
this.
|
|
41
|
+
window[this.options.bridgeName] = { start: this.start.bind(this), stop: this.stop.bind(this) };
|
|
42
42
|
}
|
|
43
43
|
document.dispatchEvent(new CustomEvent(this.options.readyEventName));
|
|
44
44
|
}
|
|
@@ -57,7 +57,9 @@ class AbTestBridge {
|
|
|
57
57
|
const currentProfile = this.experimentSubject$.getValue();
|
|
58
58
|
this.experimentSubject$.next([
|
|
59
59
|
...currentProfile,
|
|
60
|
-
...(Array.isArray(experiments)
|
|
60
|
+
...(Array.isArray(experiments)
|
|
61
|
+
? experiments
|
|
62
|
+
: [experiments]).filter((exp) => !currentProfile.some((expB) => this.isExperimentEqual(exp, expB)))
|
|
61
63
|
]);
|
|
62
64
|
}
|
|
63
65
|
/**
|
|
@@ -68,7 +70,7 @@ class AbTestBridge {
|
|
|
68
70
|
const currentExperiments = this.experimentSubject$.getValue();
|
|
69
71
|
if (experiments) {
|
|
70
72
|
// Stop the mentioned experiment
|
|
71
|
-
this.experimentSubject$.next(currentExperiments.filter((expB) => !(Array.isArray(experiments) ? experiments : [experiments]).some(expA => this.isExperimentEqual(expB, expA))));
|
|
73
|
+
this.experimentSubject$.next(currentExperiments.filter((expB) => !(Array.isArray(experiments) ? experiments : [experiments]).some((expA) => this.isExperimentEqual(expB, expA))));
|
|
72
74
|
}
|
|
73
75
|
else {
|
|
74
76
|
// Stop all the experiment
|
|
@@ -90,10 +92,10 @@ const IFRAME_BRIDGE_DEFAULT_OPTIONS = {
|
|
|
90
92
|
* @param message
|
|
91
93
|
*/
|
|
92
94
|
function isSupportedMessage(message) {
|
|
93
|
-
return typeof message === 'object'
|
|
94
|
-
!!message.action
|
|
95
|
-
!!message.version
|
|
96
|
-
!!message.channelId;
|
|
95
|
+
return typeof message === 'object'
|
|
96
|
+
&& !!message.action
|
|
97
|
+
&& !!message.version
|
|
98
|
+
&& !!message.channelId;
|
|
97
99
|
}
|
|
98
100
|
/**
|
|
99
101
|
* Generates the html content of an iframe
|
|
@@ -210,7 +212,7 @@ class IframeBridge {
|
|
|
210
212
|
}
|
|
211
213
|
catch { }
|
|
212
214
|
}
|
|
213
|
-
|
|
215
|
+
throw new Error('Handshake failed.');
|
|
214
216
|
}
|
|
215
217
|
_sendMessage(message, messageId) {
|
|
216
218
|
if (this.child.contentWindow) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"o3r-third-party.mjs","sources":["../../src/bridge/ab-testing/ab-testing-bridge.ts","../../src/bridge/iframe/helpers.ts","../../src/bridge/iframe/bridge.ts","../../src/o3r-third-party.ts"],"sourcesContent":["import {\n BehaviorSubject, distinctUntilChanged, Observable\n} from 'rxjs';\nimport type {Logger} from '@o3r/core';\n\n/**\n * Shared interface with the A/B testing provider\n */\nexport interface AbTestBridgeInterface<T> {\n /**\n * Start an AB testing experiment\n */\n start(experiments: T | T[]): void;\n /**\n * Stop an AB testing experiment\n */\n stop(experiments?: T | T[]): void;\n}\n\n/**\n * Configure the A/B testing script interfaces with the application\n */\nexport interface AbTestBridgeConfig {\n /**\n * Reference to communicate with the bridge from the window\n * @default 'abTestBridge'\n */\n bridgeName: string;\n /**\n * Debug logger\n * @default console\n */\n logger: Logger;\n /**\n * Event a third party can subscribe to before starting the communication with the bridge\n * @default 'ab-test-ready'\n */\n readyEventName: string;\n}\n\n/**\n * Default options that will represent the interface\n */\nconst defaultOptions: AbTestBridgeConfig = {\n bridgeName: 'abTestBridge',\n readyEventName: 'ab-test-ready',\n logger: console\n};\n\n/**\n * Bridge between the application and a third party A/B testing provider.\n * Exposes a start and stop methods to allow the external script to set the list of experiments to run over the\n * application.\n *\n * Share the resulting list of experiments with the rest of the application via an observable.\n */\nexport class AbTestBridge<T> implements AbTestBridgeInterface<T> {\n /**\n * Behaviour subject to control the experiments via the exposed interface\n */\n private readonly experimentSubject$: BehaviorSubject<T[]> = new BehaviorSubject<T[]>([]);\n /**\n * Options to configure the communication between the AB Testing bridge and third parties\n */\n private readonly options: AbTestBridgeConfig;\n /**\n * Observable with the list of AB testing experiments currently applied\n */\n public experiments$: Observable<T[]>;\n\n /**\n * @param isExperimentEqual check two different experiments match to identify an experiment to start or to stop\n * @param options configure the communication with the A/B testing third party provider\n */\n constructor(private readonly isExperimentEqual: (value1?: T, value2?: T) => boolean, options?: Partial<AbTestBridgeConfig>) {\n this.experiments$ = this.experimentSubject$.pipe(\n distinctUntilChanged((experimentsA: T[], experimentsB: T[]) =>\n experimentsB.length === experimentsA.length && experimentsA.every((eA) => experimentsB.find((eB) => isExperimentEqual(eA, eB))\n ))\n );\n this.options = {\n ...defaultOptions,\n ...options\n };\n if (!(window as any)[this.options.bridgeName]) {\n // eslint-disable-next-line @typescript-eslint/dot-notation, dot-notation\n (window as any)[this.options.bridgeName] = {start: this.start.bind(this), stop: this.stop.bind(this)};\n } else {\n this.log(`An instance of ${this.options.bridgeName} already exists. This AbTestBridge instance will be ignored`);\n }\n document.dispatchEvent(new CustomEvent(this.options.readyEventName));\n }\n\n /**\n * Use configured logger to log AB testing related information\n * @param args\n */\n private log(...args: any[]) {\n (this.options.logger.debug || this.options.logger.log)('A/B Test', ...args);\n }\n\n /**\n * @inheritDoc\n */\n public start(experiments: T | T[]) {\n this.log('Start experiment', experiments);\n const currentProfile = this.experimentSubject$.getValue();\n this.experimentSubject$.next([\n ...currentProfile,\n ...(Array.isArray(experiments) ? experiments : [experiments]).filter((exp) =>\n !currentProfile.find((expB: T) => this.isExperimentEqual(exp, expB)))\n ]);\n }\n\n /**\n * @inheritDoc\n */\n public stop(experiments?: T | T[]) {\n this.log('Stop experiment', experiments);\n const currentExperiments = this.experimentSubject$.getValue();\n if (experiments) {\n // Stop the mentioned experiment\n this.experimentSubject$.next(currentExperiments.filter((expB: T) => !(Array.isArray(experiments) ? experiments : [experiments]).some(expA => this.isExperimentEqual(expB, expA)))\n );\n } else {\n // Stop all the experiment\n this.experimentSubject$.next([]);\n }\n }\n}\n","import { IFrameBridgeOptions, InternalIframeMessage } from './contracts';\n\n/**\n * Default options for an IFrameBridge\n */\nexport const IFRAME_BRIDGE_DEFAULT_OPTIONS: IFrameBridgeOptions = {\n handshakeTries: 10,\n handshakeTimeout: 200,\n messageWithResponseTimeout: 1000\n};\n\n/**\n * Verifies if a message respects the format expected by an IFrameBridge\n * @param message\n */\nexport function isSupportedMessage(message: any): message is InternalIframeMessage {\n return typeof message === 'object' &&\n !!message.action &&\n !!message.version &&\n !!message.channelId;\n}\n\n/**\n * Generates the html content of an iframe\n * @param scriptUrl script to be executed inside the iframe\n * @param additionalHeader custom html headers stringified\n */\nexport function generateIFrameContent(scriptUrl: string, additionalHeader = '') {\n return `<html>\n <head>\n <script>\n class Bridge {\n handshakeDone = false;\n\n queuedMessages = [];\n\n channelId;\n\n messagesBuffer = [];\n\n listener;\n\n constructor() {\n if (window.parent) {\n window.addEventListener('message', (event) => {\n const message = event.data;\n if (this.isValidMessage(message)) {\n if (message.action === 'HANDSHAKE_PARENT') {\n this.channelId = message.channelId;\n this.sendMessage({action: 'HANDSHAKE_CHILD', version: '1.0', id: message.id});\n this.handshakeDone = true;\n this.queuedMessages.forEach((queuedMessage) => this.sendMessage(queuedMessage));\n this.queuedMessages = [];\n } else if (this.channelId && this.channelId === message.channelId) {\n // actual message\n if (this.listener) {\n this.listener(message);\n } else {\n this.messagesBuffer.push(message);\n }\n }\n }\n });\n } else {\n throw new Error('Error in child frame bridge: can\\\\'t access parent window.');\n }\n }\n\n register(handlerFunction, replayMissedMessages) {\n if (!this.listener) {\n this.listener = handlerFunction;\n if (replayMissedMessages) {\n this.messagesBuffer.forEach((message) => handlerFunction(message));\n }\n this.messagesBuffer = [];\n }\n }\n\n isValidMessage(message) {\n return !!message.action && !!message.version && !!message.channelId;\n }\n\n sendMessage(message) {\n if(this.handshakeDone) {\n window.parent.postMessage({...message, channelId: this.channelId}, '*');\n } else {\n this.queuedMessages.push(message);\n }\n }\n\n uuid() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n }\n\n const BRIDGE = new Bridge();\n </script>\n <script src='${scriptUrl}'></script>\n ${additionalHeader}\n </head>\n <body></body>\n</html>`;\n}\n","import {firstValueFrom, fromEvent, Observable} from 'rxjs';\nimport {v4} from 'uuid';\nimport {filter, map, share, timeout} from 'rxjs/operators';\nimport {IFrameBridgeOptions, IframeMessage, InternalIframeMessage} from './contracts';\nimport {IFRAME_BRIDGE_DEFAULT_OPTIONS, isSupportedMessage} from './helpers';\n\n/**\n * Bridge that exposes an easy abstraction layer to communicate between a Host and an IFrame using the\n * postMessage API.\n */\nexport class IframeBridge {\n\n /** ID used to ensure that the Bridge only processes messages meant for this instance, since postMessage is global to the window. */\n private readonly channelId: string;\n\n /** Observable that emits all the messages received from the IFrame. */\n private readonly internalMessages$: Observable<InternalIframeMessage>;\n\n /** Promise that will resolve once the handshake has been completed, undefined if it's already done. */\n private readonly handshakePromise?: Promise<void>;\n\n /** Options to configure the behaviour of the Bridge. */\n private readonly options: IFrameBridgeOptions;\n\n /**\n * Observable that emits all the messages received from the IFrame and that are\n * not a direct response to a request.\n */\n public readonly messages$: Observable<InternalIframeMessage>;\n\n constructor(parent: Window, private readonly child: HTMLIFrameElement, options: Partial<IFrameBridgeOptions> = {}) {\n this.options = {...IFRAME_BRIDGE_DEFAULT_OPTIONS, ...options};\n this.channelId = v4();\n this.internalMessages$ = fromEvent(parent, 'message').pipe(\n filter((event): event is MessageEvent<InternalIframeMessage> => {\n const messageEvent = event as MessageEvent<InternalIframeMessage>;\n return isSupportedMessage(messageEvent.data) && messageEvent.data.channelId === this.channelId;\n }),\n map((event) => event.data),\n share()\n );\n this.messages$ = this.internalMessages$.pipe(\n // Here we remove all the messages having an \"ID\" because they are bound to their corresponding request and\n // are returned directly by the function sendMessageAndWaitForResponse\n filter((message) => !message.id)\n );\n\n this.handshakePromise = this.handshake();\n }\n\n private async handshake() {\n for (let i = 0; i < this.options.handshakeTries; i++) {\n try {\n await this._sendMessageAndWaitForResponse({\n action: 'HANDSHAKE_PARENT',\n version: '1.0'\n }, this.options.handshakeTimeout);\n return;\n } catch {}\n }\n return Promise.reject('Handshake failed.');\n }\n\n private _sendMessage(message: IframeMessage, messageId?: string) {\n if (this.child.contentWindow) {\n this.child.contentWindow.postMessage({...message, channelId: this.channelId, id: messageId}, '*');\n }\n }\n\n private _sendMessageAndWaitForResponse(message: IframeMessage, timeoutMilliseconds: number = this.options.messageWithResponseTimeout) {\n const id = v4();\n const promise = firstValueFrom(\n this.internalMessages$.pipe(\n filter((response) => response.id === id),\n timeout(timeoutMilliseconds)\n )\n );\n void this._sendMessage(message, id);\n return promise;\n }\n\n /**\n * Method to send a message to the script run in the iframe\n * @param message message object\n * @param messageId message identifier\n */\n public async sendMessage(message: IframeMessage, messageId?: string) {\n await this.handshakePromise;\n this._sendMessage(message, messageId);\n }\n\n /**\n * Method to send a message to the script run in the iframe and wait for an answer\n * @param message\n * @param timeoutMilliseconds\n */\n public async sendMessageAndWaitForResponse(message: IframeMessage, timeoutMilliseconds: number = this.options.messageWithResponseTimeout) {\n await this.handshakePromise;\n return this._sendMessageAndWaitForResponse(message, timeoutMilliseconds);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"o3r-third-party.mjs","sources":["../../src/bridge/ab-testing/ab-testing-bridge.ts","../../src/bridge/iframe/helpers.ts","../../src/bridge/iframe/bridge.ts","../../src/o3r-third-party.ts"],"sourcesContent":["import type {\n Logger,\n} from '@o3r/core';\nimport {\n BehaviorSubject,\n distinctUntilChanged,\n Observable,\n} from 'rxjs';\n\n/**\n * Shared interface with the A/B testing provider\n */\nexport interface AbTestBridgeInterface<T> {\n /**\n * Start an AB testing experiment\n */\n start(experiments: T | T[]): void;\n /**\n * Stop an AB testing experiment\n */\n stop(experiments?: T | T[]): void;\n}\n\n/**\n * Configure the A/B testing script interfaces with the application\n */\nexport interface AbTestBridgeConfig {\n /**\n * Reference to communicate with the bridge from the window\n * @default 'abTestBridge'\n */\n bridgeName: string;\n /**\n * Debug logger\n * @default console\n */\n logger: Logger;\n /**\n * Event a third party can subscribe to before starting the communication with the bridge\n * @default 'ab-test-ready'\n */\n readyEventName: string;\n}\n\n/**\n * Default options that will represent the interface\n */\nconst defaultOptions = {\n bridgeName: 'abTestBridge',\n readyEventName: 'ab-test-ready',\n logger: console\n} as const satisfies AbTestBridgeConfig;\n\n/**\n * Bridge between the application and a third party A/B testing provider.\n * Exposes a start and stop methods to allow the external script to set the list of experiments to run over the\n * application.\n *\n * Share the resulting list of experiments with the rest of the application via an observable.\n */\nexport class AbTestBridge<T> implements AbTestBridgeInterface<T> {\n /**\n * Behaviour subject to control the experiments via the exposed interface\n */\n private readonly experimentSubject$: BehaviorSubject<T[]> = new BehaviorSubject<T[]>([]);\n /**\n * Options to configure the communication between the AB Testing bridge and third parties\n */\n private readonly options: AbTestBridgeConfig;\n /**\n * Observable with the list of AB testing experiments currently applied\n */\n public experiments$: Observable<T[]>;\n\n /**\n * AbTestBridge constructor\n * @param isExperimentEqual check two different experiments match to identify an experiment to start or to stop\n * @param options configure the communication with the A/B testing third party provider\n */\n constructor(private readonly isExperimentEqual: (value1?: T, value2?: T) => boolean, options?: Partial<AbTestBridgeConfig>) {\n this.experiments$ = this.experimentSubject$.pipe(\n distinctUntilChanged((experimentsA: T[], experimentsB: T[]) =>\n experimentsB.length === experimentsA.length && experimentsA.every((eA) => experimentsB.find((eB) => isExperimentEqual(eA, eB))\n ))\n );\n this.options = {\n ...defaultOptions,\n ...options\n };\n if ((window as any)[this.options.bridgeName]) {\n this.log(`An instance of ${this.options.bridgeName} already exists. This AbTestBridge instance will be ignored`);\n } else {\n (window as any)[this.options.bridgeName] = { start: this.start.bind(this), stop: this.stop.bind(this) };\n }\n document.dispatchEvent(new CustomEvent(this.options.readyEventName));\n }\n\n /**\n * Use configured logger to log AB testing related information\n * @param args\n */\n private log(...args: any[]) {\n (this.options.logger.debug || this.options.logger.log)('A/B Test', ...args);\n }\n\n /**\n * @inheritDoc\n */\n public start(experiments: T | T[]) {\n this.log('Start experiment', experiments);\n const currentProfile = this.experimentSubject$.getValue();\n this.experimentSubject$.next([\n ...currentProfile,\n ...(Array.isArray(experiments)\n ? experiments\n : [experiments]).filter((exp) => !currentProfile.some((expB: T) => this.isExperimentEqual(exp, expB))\n )\n ]);\n }\n\n /**\n * @inheritDoc\n */\n public stop(experiments?: T | T[]) {\n this.log('Stop experiment', experiments);\n const currentExperiments = this.experimentSubject$.getValue();\n if (experiments) {\n // Stop the mentioned experiment\n this.experimentSubject$.next(currentExperiments.filter((expB: T) => !(Array.isArray(experiments) ? experiments : [experiments]).some((expA) => this.isExperimentEqual(expB, expA)))\n );\n } else {\n // Stop all the experiment\n this.experimentSubject$.next([]);\n }\n }\n}\n","import {\n IFrameBridgeOptions,\n InternalIframeMessage,\n} from './contracts';\n\n/**\n * Default options for an IFrameBridge\n */\nexport const IFRAME_BRIDGE_DEFAULT_OPTIONS: Readonly<IFrameBridgeOptions> = {\n handshakeTries: 10,\n handshakeTimeout: 200,\n messageWithResponseTimeout: 1000\n} as const;\n\n/**\n * Verifies if a message respects the format expected by an IFrameBridge\n * @param message\n */\nexport function isSupportedMessage(message: any): message is InternalIframeMessage {\n return typeof message === 'object'\n && !!message.action\n && !!message.version\n && !!message.channelId;\n}\n\n/**\n * Generates the html content of an iframe\n * @param scriptUrl script to be executed inside the iframe\n * @param additionalHeader custom html headers stringified\n */\nexport function generateIFrameContent(scriptUrl: string, additionalHeader = '') {\n return `<html>\n <head>\n <script>\n class Bridge {\n handshakeDone = false;\n\n queuedMessages = [];\n\n channelId;\n\n messagesBuffer = [];\n\n listener;\n\n constructor() {\n if (window.parent) {\n window.addEventListener('message', (event) => {\n const message = event.data;\n if (this.isValidMessage(message)) {\n if (message.action === 'HANDSHAKE_PARENT') {\n this.channelId = message.channelId;\n this.sendMessage({action: 'HANDSHAKE_CHILD', version: '1.0', id: message.id});\n this.handshakeDone = true;\n this.queuedMessages.forEach((queuedMessage) => this.sendMessage(queuedMessage));\n this.queuedMessages = [];\n } else if (this.channelId && this.channelId === message.channelId) {\n // actual message\n if (this.listener) {\n this.listener(message);\n } else {\n this.messagesBuffer.push(message);\n }\n }\n }\n });\n } else {\n throw new Error('Error in child frame bridge: can\\\\'t access parent window.');\n }\n }\n\n register(handlerFunction, replayMissedMessages) {\n if (!this.listener) {\n this.listener = handlerFunction;\n if (replayMissedMessages) {\n this.messagesBuffer.forEach((message) => handlerFunction(message));\n }\n this.messagesBuffer = [];\n }\n }\n\n isValidMessage(message) {\n return !!message.action && !!message.version && !!message.channelId;\n }\n\n sendMessage(message) {\n if(this.handshakeDone) {\n window.parent.postMessage({...message, channelId: this.channelId}, '*');\n } else {\n this.queuedMessages.push(message);\n }\n }\n\n uuid() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n }\n\n const BRIDGE = new Bridge();\n </script>\n <script src='${scriptUrl}'></script>\n ${additionalHeader}\n </head>\n <body></body>\n</html>`;\n}\n","import {\n firstValueFrom,\n fromEvent,\n Observable,\n} from 'rxjs';\nimport {\n filter,\n map,\n share,\n timeout,\n} from 'rxjs/operators';\nimport {\n v4,\n} from 'uuid';\nimport {\n IFrameBridgeOptions,\n IframeMessage,\n InternalIframeMessage,\n} from './contracts';\nimport {\n IFRAME_BRIDGE_DEFAULT_OPTIONS,\n isSupportedMessage,\n} from './helpers';\n\n/**\n * Bridge that exposes an easy abstraction layer to communicate between a Host and an IFrame using the\n * postMessage API.\n */\nexport class IframeBridge {\n /** ID used to ensure that the Bridge only processes messages meant for this instance, since postMessage is global to the window. */\n private readonly channelId: string;\n\n /** Observable that emits all the messages received from the IFrame. */\n private readonly internalMessages$: Observable<InternalIframeMessage>;\n\n /** Promise that will resolve once the handshake has been completed, undefined if it's already done. */\n private readonly handshakePromise?: Promise<void>;\n\n /** Options to configure the behaviour of the Bridge. */\n private readonly options: IFrameBridgeOptions;\n\n /**\n * Observable that emits all the messages received from the IFrame and that are\n * not a direct response to a request.\n */\n public readonly messages$: Observable<InternalIframeMessage>;\n\n constructor(parent: Window, private readonly child: HTMLIFrameElement, options: Partial<IFrameBridgeOptions> = {}) {\n this.options = { ...IFRAME_BRIDGE_DEFAULT_OPTIONS, ...options };\n this.channelId = v4();\n this.internalMessages$ = fromEvent(parent, 'message').pipe(\n filter((event): event is MessageEvent<InternalIframeMessage> => {\n const messageEvent = event as MessageEvent<InternalIframeMessage>;\n return isSupportedMessage(messageEvent.data) && messageEvent.data.channelId === this.channelId;\n }),\n map((event) => event.data),\n share()\n );\n this.messages$ = this.internalMessages$.pipe(\n // Here we remove all the messages having an \"ID\" because they are bound to their corresponding request and\n // are returned directly by the function sendMessageAndWaitForResponse\n filter((message) => !message.id)\n );\n\n this.handshakePromise = this.handshake();\n }\n\n private async handshake() {\n for (let i = 0; i < this.options.handshakeTries; i++) {\n try {\n await this._sendMessageAndWaitForResponse({\n action: 'HANDSHAKE_PARENT',\n version: '1.0'\n }, this.options.handshakeTimeout);\n return;\n } catch {}\n }\n throw new Error('Handshake failed.');\n }\n\n private _sendMessage(message: IframeMessage, messageId?: string) {\n if (this.child.contentWindow) {\n this.child.contentWindow.postMessage({ ...message, channelId: this.channelId, id: messageId }, '*');\n }\n }\n\n private _sendMessageAndWaitForResponse(message: IframeMessage, timeoutMilliseconds: number = this.options.messageWithResponseTimeout) {\n const id = v4();\n const promise = firstValueFrom(\n this.internalMessages$.pipe(\n filter((response) => response.id === id),\n timeout(timeoutMilliseconds)\n )\n );\n void this._sendMessage(message, id);\n return promise;\n }\n\n /**\n * Method to send a message to the script run in the iframe\n * @param message message object\n * @param messageId message identifier\n */\n public async sendMessage(message: IframeMessage, messageId?: string) {\n await this.handshakePromise;\n this._sendMessage(message, messageId);\n }\n\n /**\n * Method to send a message to the script run in the iframe and wait for an answer\n * @param message\n * @param timeoutMilliseconds\n */\n public async sendMessageAndWaitForResponse(message: IframeMessage, timeoutMilliseconds: number = this.options.messageWithResponseTimeout) {\n await this.handshakePromise;\n return this._sendMessageAndWaitForResponse(message, timeoutMilliseconds);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@o3r/third-party",
|
|
3
|
-
"version": "11.6.0-prerelease.
|
|
3
|
+
"version": "11.6.0-prerelease.30",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
},
|
|
18
18
|
"peerDependencies": {
|
|
19
19
|
"@angular-devkit/schematics": "~18.2.0",
|
|
20
|
-
"@o3r/core": "^11.6.0-prerelease.
|
|
21
|
-
"@o3r/schematics": "^11.6.0-prerelease.
|
|
20
|
+
"@o3r/core": "^11.6.0-prerelease.30",
|
|
21
|
+
"@o3r/schematics": "^11.6.0-prerelease.30",
|
|
22
22
|
"@schematics/angular": "~18.2.0",
|
|
23
23
|
"rxjs": "^7.8.1",
|
|
24
24
|
"typescript": "~5.5.4"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../schematics/iframe-to-component/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../schematics/iframe-to-component/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,IAAI,EAGL,MAAM,4BAA4B,CAAC;AAmBpC,OAAO,KAAK,EACV,2BAA2B,EAC5B,MAAM,UAAU,CAAC;AA0BlB;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,2BAA2B,GAAG,IAAI,CAwKxE;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,gDAAuD,CAAC"}
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ngAddIframe = void 0;
|
|
4
4
|
exports.ngAddIframeFn = ngAddIframeFn;
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
5
6
|
const schematics_1 = require("@angular-devkit/schematics");
|
|
6
7
|
const schematics_2 = require("@o3r/schematics");
|
|
7
|
-
const node_path_1 = require("node:path");
|
|
8
8
|
const ts = require("typescript");
|
|
9
9
|
const iframeProperties = [
|
|
10
10
|
'frame',
|
|
@@ -12,7 +12,7 @@ const iframeProperties = [
|
|
|
12
12
|
];
|
|
13
13
|
const checkIframePresence = (componentPath, tree) => {
|
|
14
14
|
const sourceFile = ts.createSourceFile(componentPath, tree.readText(componentPath), ts.ScriptTarget.ES2020, true);
|
|
15
|
-
const classStatement = sourceFile.statements.find(ts.isClassDeclaration);
|
|
15
|
+
const classStatement = sourceFile.statements.find((statement) => ts.isClassDeclaration(statement));
|
|
16
16
|
if (classStatement?.members.find((classElement) => ts.isPropertyDeclaration(classElement)
|
|
17
17
|
&& ts.isIdentifier(classElement.name)
|
|
18
18
|
&& iframeProperties.includes(classElement.name.escapedText.toString()))) {
|
|
@@ -34,22 +34,23 @@ function ngAddIframeFn(options) {
|
|
|
34
34
|
from: '@angular/core',
|
|
35
35
|
importNames: [
|
|
36
36
|
'AfterViewInit',
|
|
37
|
+
'DestroyRef',
|
|
37
38
|
'ElementRef',
|
|
38
|
-
'
|
|
39
|
+
'inject',
|
|
39
40
|
'viewChild'
|
|
40
41
|
]
|
|
41
42
|
},
|
|
42
43
|
{
|
|
43
|
-
from: '@
|
|
44
|
+
from: '@angular/core/rxjs-interop',
|
|
44
45
|
importNames: [
|
|
45
|
-
'
|
|
46
|
-
'IframeBridge'
|
|
46
|
+
'takeUntilDestroyed'
|
|
47
47
|
]
|
|
48
48
|
},
|
|
49
49
|
{
|
|
50
|
-
from: '
|
|
50
|
+
from: '@o3r/third-party',
|
|
51
51
|
importNames: [
|
|
52
|
-
'
|
|
52
|
+
'generateIFrameContent',
|
|
53
|
+
'IframeBridge'
|
|
53
54
|
]
|
|
54
55
|
}
|
|
55
56
|
]),
|
|
@@ -61,7 +62,7 @@ function ngAddIframeFn(options) {
|
|
|
61
62
|
const visit = (node) => {
|
|
62
63
|
if (ts.isClassDeclaration(node)) {
|
|
63
64
|
const implementsClauses = node.heritageClauses?.find((heritageClause) => heritageClause.token === ts.SyntaxKind.ImplementsKeyword);
|
|
64
|
-
const interfaceToImplements = (0, schematics_2.generateImplementsExpressionWithTypeArguments)('
|
|
65
|
+
const interfaceToImplements = (0, schematics_2.generateImplementsExpressionWithTypeArguments)('AfterViewInit');
|
|
65
66
|
const deduplicateHeritageClauses = (clauses) => clauses.filter((h, i) => !clauses.slice(i + 1).some((h2) => h2.kind === h.kind && h2.expression.escapedText === h.expression.escapedText));
|
|
66
67
|
const newImplementsClauses = implementsClauses
|
|
67
68
|
? factory.updateHeritageClause(implementsClauses, deduplicateHeritageClauses([...implementsClauses.types, ...interfaceToImplements]))
|
|
@@ -72,51 +73,39 @@ function ngAddIframeFn(options) {
|
|
|
72
73
|
const newModifiers = []
|
|
73
74
|
.concat(ts.getDecorators(node) || [])
|
|
74
75
|
.concat(ts.getModifiers(node) || []);
|
|
75
|
-
const hasSubscriptions = node.members.find((classElement) => ts.isPropertyDeclaration(classElement)
|
|
76
|
-
&& ts.isIdentifier(classElement.name)
|
|
77
|
-
&& classElement.name.escapedText.toString() === 'subscriptions');
|
|
78
|
-
/* eslint-disable indent */
|
|
79
76
|
const propertiesToAdd = (0, schematics_2.generateClassElementsFromString)(`
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
77
|
+
private frame = viewChild.required<ElementRef<HTMLIFrameElement>>('frame');
|
|
78
|
+
private bridge?: IframeBridge;
|
|
79
|
+
private readonly destroyRef = inject(DestroyRef);
|
|
83
80
|
`);
|
|
84
|
-
/* eslint-disable indent */
|
|
85
81
|
const newNgAfterViewInit = (0, schematics_2.getSimpleUpdatedMethod)(node, factory, 'ngAfterViewInit', (0, schematics_2.generateBlockStatementsFromString)(`
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
);
|
|
107
|
-
}
|
|
82
|
+
const nativeElem = this.frame().nativeElement;
|
|
83
|
+
if (nativeElem.contentDocument) {
|
|
84
|
+
nativeElem.contentDocument.write(
|
|
85
|
+
generateIFrameContent(
|
|
86
|
+
'', // third-party-script-url
|
|
87
|
+
'' // third-party-html-headers-to-add
|
|
88
|
+
)
|
|
89
|
+
);
|
|
90
|
+
nativeElem.contentDocument.close();
|
|
91
|
+
}
|
|
92
|
+
if (nativeElem.contentWindow) {
|
|
93
|
+
this.bridge = new IframeBridge(window, nativeElem);
|
|
94
|
+
this.bridge.messages$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((message) => {
|
|
95
|
+
switch (message.action) {
|
|
96
|
+
// custom logic based on received message
|
|
97
|
+
default:
|
|
98
|
+
console.warn('Received unsupported action: ', message.action);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
}
|
|
108
102
|
`));
|
|
109
|
-
const newNgOnDestroy = (0, schematics_2.getSimpleUpdatedMethod)(node, factory, 'ngOnDestroy', (0, schematics_2.generateBlockStatementsFromString)(`
|
|
110
|
-
this.subscriptions.forEach((subscription) => subscription.unsubscribe());
|
|
111
|
-
`));
|
|
112
103
|
const newMembers = node.members
|
|
113
|
-
.filter((classElement) => !(
|
|
114
|
-
|
|
115
|
-
.concat(propertiesToAdd, newNgAfterViewInit, ...(hasSubscriptions ? [] : [newNgOnDestroy]))
|
|
104
|
+
.filter((classElement) => !(0, schematics_2.findMethodByName)('ngAfterViewInit')(classElement))
|
|
105
|
+
.concat(propertiesToAdd, newNgAfterViewInit)
|
|
116
106
|
.sort(schematics_2.sortClassElement);
|
|
117
107
|
(0, schematics_2.addCommentsOnClassProperties)(newMembers, {
|
|
118
|
-
bridge: 'Iframe object template reference'
|
|
119
|
-
subscriptions: 'List of subscriptions to unsubscribe on destroy'
|
|
108
|
+
bridge: 'Iframe object template reference'
|
|
120
109
|
});
|
|
121
110
|
return factory.updateClassDeclaration(node, newModifiers, node.name, node.typeParameters, heritageClauses, newMembers);
|
|
122
111
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../schematics/iframe-to-component/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../schematics/iframe-to-component/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACtB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,2BAA4B,SAAQ,qBAAqB;IACxE,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IAEb,8BAA8B;IAC9B,UAAU,EAAE,OAAO,CAAC;CACrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../schematics/ng-add/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../schematics/ng-add/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,IAAI,EACV,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EACV,qBAAqB,EACtB,MAAM,UAAU,CAAC;AA4BlB;;;GAGG;AACH,eAAO,MAAM,KAAK,YAAa,qBAAqB,KAAG,IAGtD,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ngAdd = void 0;
|
|
4
|
-
const schematics_1 = require("@angular-devkit/schematics");
|
|
5
4
|
const fs = require("node:fs");
|
|
6
5
|
const path = require("node:path");
|
|
6
|
+
const schematics_1 = require("@angular-devkit/schematics");
|
|
7
7
|
const reportMissingSchematicsDep = (logger) => (reason) => {
|
|
8
8
|
logger.error(`[ERROR]: Adding @o3r/third-party has failed.
|
|
9
9
|
If the error is related to missing @o3r dependencies you need to install '@o3r/core' to be able to use the configuration package. Please run 'ng add @o3r/core' .
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../schematics/ng-add/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../schematics/ng-add/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACtB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,qBAAsB,SAAQ,qBAAqB;IAClE,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEjC,8CAA8C;IAC9C,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B"}
|