@elliemae/ssf-host 2.9.4 → 2.16.6

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 (85) hide show
  1. package/dist/cjs/host.js +96 -42
  2. package/dist/cjs/index.html +1 -1
  3. package/dist/cjs/index.js +3 -3
  4. package/dist/cjs/tests/scriptingObjects/appObjects.js +13 -1
  5. package/dist/cjs/tests/scriptingObjects/appraisalServiceModule.js +8 -8
  6. package/dist/cjs/tests/scriptingObjects/floodServiceModule.js +6 -4
  7. package/dist/cjs/utils.js +0 -5
  8. package/dist/cjs/v1-guest-v2-host.html +1 -1
  9. package/dist/cjs/v2-host-v1-guest.html +1 -1
  10. package/dist/esm/host.js +99 -44
  11. package/dist/esm/index.html +1 -1
  12. package/dist/esm/tests/scriptingObjects/appObjects.js +13 -1
  13. package/dist/esm/tests/scriptingObjects/appraisalServiceModule.js +8 -8
  14. package/dist/esm/tests/scriptingObjects/floodServiceModule.js +6 -4
  15. package/dist/esm/utils.js +0 -5
  16. package/dist/esm/v1-guest-v2-host.html +1 -1
  17. package/dist/esm/v2-host-v1-guest.html +1 -1
  18. package/dist/public/analytics-object-v1.js +1 -1
  19. package/dist/public/analytics-object-v1.js.br +0 -0
  20. package/dist/public/analytics-object-v1.js.gz +0 -0
  21. package/dist/public/analytics-object-v1.js.map +1 -1
  22. package/dist/public/analytics-object-v2.js +1 -1
  23. package/dist/public/analytics-object-v2.js.br +0 -0
  24. package/dist/public/analytics-object-v2.js.gz +0 -0
  25. package/dist/public/analytics-object-v2.js.map +1 -1
  26. package/dist/public/application-object-v1.js +1 -1
  27. package/dist/public/application-object-v1.js.br +0 -0
  28. package/dist/public/application-object-v1.js.gz +0 -0
  29. package/dist/public/application-object-v1.js.map +1 -1
  30. package/dist/public/application-object-v2.js +1 -1
  31. package/dist/public/application-object-v2.js.br +0 -0
  32. package/dist/public/application-object-v2.js.gz +0 -0
  33. package/dist/public/application-object-v2.js.map +1 -1
  34. package/dist/public/index.html +1 -1
  35. package/dist/public/js/emuiSsfHost.5339b0bc88e73c59c58d.js +3 -0
  36. package/dist/public/js/emuiSsfHost.5339b0bc88e73c59c58d.js.br +0 -0
  37. package/dist/public/js/emuiSsfHost.5339b0bc88e73c59c58d.js.gz +0 -0
  38. package/dist/public/js/emuiSsfHost.5339b0bc88e73c59c58d.js.map +1 -0
  39. package/dist/public/loan-object.js +1 -1
  40. package/dist/public/loan-object.js.br +0 -0
  41. package/dist/public/loan-object.js.gz +0 -0
  42. package/dist/public/loan-object.js.map +1 -1
  43. package/dist/public/v1-guest-v2-host.html +1 -1
  44. package/dist/public/v2-host-v1-guest.html +1 -1
  45. package/dist/types/lib/host.d.ts +13 -6
  46. package/dist/types/lib/ihost.d.ts +15 -4
  47. package/dist/types/lib/index.d.ts +1 -1
  48. package/dist/types/lib/tests/scriptingObjects/appObjects.d.ts +10 -0
  49. package/dist/types/lib/tests/scriptingObjects/appraisalServiceModule.d.ts +2 -1
  50. package/dist/types/lib/tests/scriptingObjects/floodServiceModule.d.ts +2 -1
  51. package/dist/types/lib/types.d.ts +4 -24
  52. package/dist/types/lib/utils.d.ts +1 -2
  53. package/dist/types/tsconfig.tsbuildinfo +1 -1
  54. package/dist/umd/analytics-object-v1.js +1 -1
  55. package/dist/umd/analytics-object-v1.js.br +0 -0
  56. package/dist/umd/analytics-object-v1.js.gz +0 -0
  57. package/dist/umd/analytics-object-v1.js.map +1 -1
  58. package/dist/umd/analytics-object-v2.js +1 -1
  59. package/dist/umd/analytics-object-v2.js.br +0 -0
  60. package/dist/umd/analytics-object-v2.js.gz +0 -0
  61. package/dist/umd/analytics-object-v2.js.map +1 -1
  62. package/dist/umd/application-object-v1.js +1 -1
  63. package/dist/umd/application-object-v1.js.br +0 -0
  64. package/dist/umd/application-object-v1.js.gz +0 -0
  65. package/dist/umd/application-object-v1.js.map +1 -1
  66. package/dist/umd/application-object-v2.js +1 -1
  67. package/dist/umd/application-object-v2.js.br +0 -0
  68. package/dist/umd/application-object-v2.js.gz +0 -0
  69. package/dist/umd/application-object-v2.js.map +1 -1
  70. package/dist/umd/index.html +1 -1
  71. package/dist/umd/index.js +1 -1
  72. package/dist/umd/index.js.br +0 -0
  73. package/dist/umd/index.js.gz +0 -0
  74. package/dist/umd/index.js.map +1 -1
  75. package/dist/umd/loan-object.js +1 -1
  76. package/dist/umd/loan-object.js.br +0 -0
  77. package/dist/umd/loan-object.js.gz +0 -0
  78. package/dist/umd/loan-object.js.map +1 -1
  79. package/dist/umd/v1-guest-v2-host.html +1 -1
  80. package/dist/umd/v2-host-v1-guest.html +1 -1
  81. package/package.json +7 -7
  82. package/dist/public/js/emuiSsfHost.ed1648532a780f393d2d.js +0 -3
  83. package/dist/public/js/emuiSsfHost.ed1648532a780f393d2d.js.br +0 -0
  84. package/dist/public/js/emuiSsfHost.ed1648532a780f393d2d.js.gz +0 -0
  85. package/dist/public/js/emuiSsfHost.ed1648532a780f393d2d.js.map +0 -1
package/dist/cjs/host.js CHANGED
@@ -60,6 +60,10 @@ class SSFHost {
60
60
  * list of guests
61
61
  */
62
62
  #guests = /* @__PURE__ */ new Map();
63
+ /**
64
+ * list of callbacks for guest close.
65
+ */
66
+ #guestCloseCallbackList = /* @__PURE__ */ new Map();
63
67
  /**
64
68
  * scripting object manager
65
69
  */
@@ -197,7 +201,9 @@ class SSFHost {
197
201
  if (!Object.prototype.hasOwnProperty.call(func, "callContext")) {
198
202
  Object.defineProperty(func, "callContext", {
199
203
  value: { guest },
200
- enumerable: true
204
+ configurable: true,
205
+ enumerable: true,
206
+ writable: true
201
207
  });
202
208
  }
203
209
  resolve(func(...functionParams));
@@ -287,6 +293,35 @@ class SSFHost {
287
293
  }
288
294
  }
289
295
  };
296
+ // Handles list objects requests from the remote automation framework
297
+ #handleListObjects = ({
298
+ sourceWin,
299
+ sourceOrigin,
300
+ requestId
301
+ }) => {
302
+ this.#logger.debug(
303
+ `Processing listObjects request. requestId = ${requestId}`
304
+ );
305
+ const guest = this.#getGuestForWindow(sourceWin);
306
+ if (!guest) {
307
+ this.#logger.warn("Rejected object request from unknown guest window");
308
+ return false;
309
+ }
310
+ const objects = this.#soManager.listScriptingObjects(guest.id);
311
+ this.#remoting.respond({
312
+ targetWin: sourceWin,
313
+ targetOrigin: sourceOrigin,
314
+ requestId,
315
+ response: objects
316
+ });
317
+ this.#logger.audit({
318
+ message: `name of scripting objects returned`,
319
+ requestId,
320
+ objects,
321
+ ...guest.getInfo()
322
+ });
323
+ return true;
324
+ };
290
325
  // Handles object get requests from the remote automation framework
291
326
  #handleObjectGet = ({
292
327
  sourceWin,
@@ -301,12 +336,6 @@ class SSFHost {
301
336
  const guest = this.#getGuestForWindow(sourceWin);
302
337
  if (!guest) {
303
338
  this.#logger.warn("Rejected object request from unknown guest window");
304
- this.#remoting.raiseException({
305
- targetWin: sourceWin,
306
- targetOrigin: sourceOrigin,
307
- requestId,
308
- ex: "Specified window is not a known guest"
309
- });
310
339
  return false;
311
340
  }
312
341
  const obj = this.getScriptingObject(objectId, { guest });
@@ -369,18 +398,12 @@ class SSFHost {
369
398
  this.#logger.warn(
370
399
  "Rejected method invocation request from unknown guest window"
371
400
  );
372
- this.#remoting.raiseException({
373
- targetWin: sourceWin,
374
- targetOrigin: sourceOrigin,
375
- requestId,
376
- ex: "Specified window is not a known guest"
377
- });
378
401
  return false;
379
402
  }
380
403
  this.#logger.debug(
381
404
  `Function ${objectId}.${String(body.functionName)}() called from guest "${guest.id}" (requestId = ${requestId})`
382
405
  );
383
- const obj = this.getScriptingObject(objectId);
406
+ const obj = this.getScriptingObject(objectId, { guest });
384
407
  if (!obj) {
385
408
  this.#logger.warn(
386
409
  `Invocation of unknown or unauthorized object ${objectId} from guest ${guest.id}`
@@ -468,6 +491,10 @@ class SSFHost {
468
491
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
469
492
  callback: this.#handleGuestClose
470
493
  });
494
+ this.#remoting.listen({
495
+ messageType: import_microfe_common.MessageType.ListObjects,
496
+ callback: this.#handleListObjects
497
+ });
471
498
  this.#remoting.listen({
472
499
  messageType: import_microfe_common.MessageType.ObjectGet,
473
500
  callback: this.#handleObjectGet
@@ -526,7 +553,13 @@ class SSFHost {
526
553
  }
527
554
  });
528
555
  guestsToRemove.forEach((guest) => {
529
- this.unloadGuest(guest.id);
556
+ const { id } = guest;
557
+ this.unloadGuest(id);
558
+ const callbacks = this.#guestCloseCallbackList.get(id);
559
+ callbacks?.forEach((callback) => {
560
+ callback().catch(() => {
561
+ });
562
+ });
530
563
  });
531
564
  }, 1e3);
532
565
  };
@@ -591,7 +624,8 @@ class SSFHost {
591
624
  fitToContent = false,
592
625
  disableSandbox = false,
593
626
  sandboxValues = [],
594
- style = ""
627
+ style = "",
628
+ permissionPolicy = ""
595
629
  } = options;
596
630
  if (!title) throw new Error("title is required");
597
631
  if (fitToContent) this.#subscribeToGuestResizeEvent();
@@ -614,6 +648,7 @@ class SSFHost {
614
648
  }
615
649
  frame.setAttribute("title", title);
616
650
  frame.setAttribute("src", url);
651
+ if (permissionPolicy) frame.setAttribute("allow", permissionPolicy);
617
652
  targetElement.appendChild(frame);
618
653
  const guestFrameEle = targetElementDocument.getElementById(
619
654
  guestId
@@ -641,7 +676,12 @@ class SSFHost {
641
676
  * @param {AddScriptingObjectParams} params params to add scripting object
642
677
  */
643
678
  addScriptingObject = (so, params) => {
644
- this.#soManager.addScriptingObject(so, params);
679
+ if ((0, import_microfe_common.isScriptingObjectProxy)(so)) {
680
+ const clonedSo = this.cloneScriptingObject(so);
681
+ this.#soManager.addScriptingObject(clonedSo, params);
682
+ } else {
683
+ this.#soManager.addScriptingObject(so, params);
684
+ }
645
685
  };
646
686
  /**
647
687
  * Clone parent host's scripting object for exposing to grand children
@@ -649,29 +689,22 @@ class SSFHost {
649
689
  * @param guest - reference to the ssf guest
650
690
  * @returns cloned version of the scripting object
651
691
  */
652
- cloneScriptingObject = (proxy, guest) => {
692
+ cloneScriptingObject = (proxy) => {
653
693
  if (!proxy) throw new Error("proxy is required");
654
- if (!guest) throw new Error("guest is required");
655
694
  const so = new import_microfe_common.ScriptingObject(proxy.id, proxy.objectType);
656
695
  let unsubscribers = [];
657
696
  Object.keys(proxy).forEach((propName) => {
658
697
  const propValue = proxy[propName];
659
698
  if (this.#isProxyEvent(propValue)) {
660
- let event;
661
- if (propValue?.subscribe !== "function") {
662
- event = new import_microfe_common.Event({
663
- name: propValue.name || propName,
664
- requiresFeedback: false,
665
- so
666
- });
667
- } else {
668
- event = new automation.Event();
669
- }
699
+ const event = new import_microfe_common.Event({
700
+ name: propValue.name || propName,
701
+ objectId: so.id
702
+ });
670
703
  Object.defineProperty(so, propName, {
671
704
  value: event,
672
705
  enumerable: true
673
706
  });
674
- if (guest.subscribe) {
707
+ if (propValue instanceof import_microfe_common.ProxyEvent) {
675
708
  const listener = ({
676
709
  eventParams,
677
710
  eventOptions
@@ -682,13 +715,11 @@ class SSFHost {
682
715
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
683
716
  eventOptions
684
717
  });
685
- const token = guest.subscribe({
686
- eventId: propValue.id,
687
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
688
- callback: listener
689
- });
718
+ const token = propValue.subscribe(
719
+ listener
720
+ );
690
721
  unsubscribers.push(() => {
691
- guest.unsubscribe({ eventId: propValue.id, token });
722
+ propValue.unsubscribe(token);
692
723
  });
693
724
  } else {
694
725
  const token = propValue.subscribe?.(
@@ -708,7 +739,7 @@ class SSFHost {
708
739
  Object.defineProperty(so, propName, {
709
740
  value: async (...args) => {
710
741
  const retVal = await propValue(...args);
711
- return (0, import_utils.isProxy)(retVal) ? this.cloneScriptingObject(retVal, guest) : retVal;
742
+ return (0, import_microfe_common.isScriptingObjectProxy)(retVal) ? this.cloneScriptingObject(retVal) : retVal;
712
743
  },
713
744
  enumerable: true
714
745
  });
@@ -746,20 +777,31 @@ class SSFHost {
746
777
  };
747
778
  /**
748
779
  * dispatch event to guest application(s)
749
- * @param {EventDetail} details details of the event to be dispatched
780
+ * @param {EventDetail} params details of the event to be dispatched
750
781
  * @returns promise that resolves to an array with result from each guest application
751
782
  */
752
- dispatchEvent = async (details) => {
783
+ dispatchEvent = async (params) => {
753
784
  const {
754
- event: { id, name, scriptingObject },
785
+ event: { id, name },
755
786
  eventParams,
756
787
  eventOptions = {}
757
- } = details;
788
+ } = params;
758
789
  const {
759
790
  eventHandler = null,
760
791
  timeout = null,
761
- window: targetWindow = null
792
+ window: targetWindow = null,
793
+ guestId
762
794
  } = eventOptions;
795
+ const objectId = id.split(".")[0];
796
+ const guestIdorWnd = guestId || targetWindow;
797
+ const targetGuest = guestIdorWnd ? this.#findGuest(guestIdorWnd) : null;
798
+ const scriptingObject = targetGuest ? this.getScriptingObject(objectId, { guest: targetGuest }) : this.getScriptingObject(objectId);
799
+ if (!scriptingObject) {
800
+ this.#logger.warn(
801
+ `Attempt to dispatch event ${name} on unknown object ${objectId}`
802
+ );
803
+ return Promise.resolve([]);
804
+ }
763
805
  const eventObj = {
764
806
  // eslint-disable-next-line no-underscore-dangle
765
807
  object: scriptingObject._toJSON(),
@@ -966,4 +1008,16 @@ class SSFHost {
966
1008
  });
967
1009
  }
968
1010
  };
1011
+ /**
1012
+ * monitors guest window close action and executes the callback from host.
1013
+ * @param callback host callback method
1014
+ * @param id unique id of the guest application
1015
+ * @param param
1016
+ */
1017
+ onGuestClose = (param) => {
1018
+ const { id, guestCloseCallback } = param;
1019
+ const callbacks = this.#guestCloseCallbackList.get(id) || [];
1020
+ callbacks.push(guestCloseCallback);
1021
+ this.#guestCloseCallbackList.set(id, callbacks);
1022
+ };
969
1023
  }
@@ -7,7 +7,7 @@
7
7
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
8
8
  <title>Host</title>
9
9
  <script src="https://cdn.tailwindcss.com?plugins=forms"></script>
10
- <script src="https://qa.assets.rd.elliemae.io/pui-diagnostics@3"></script>
10
+ <script src="https://cdn.qa1.ice.com/pui-diagnostics@3"></script>
11
11
  </head>
12
12
 
13
13
  <body>
package/dist/cjs/index.js CHANGED
@@ -16,8 +16,8 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var lib_exports = {};
20
- __export(lib_exports, {
19
+ var index_exports = {};
20
+ __export(index_exports, {
21
21
  Event: () => import_microfe_common.Event,
22
22
  Guest: () => import_guest.Guest,
23
23
  IFrameSandboxValues: () => import_types.IFrameSandboxValues,
@@ -25,7 +25,7 @@ __export(lib_exports, {
25
25
  SSFHost: () => import_host.SSFHost,
26
26
  ScriptingObject: () => import_microfe_common.ScriptingObject
27
27
  });
28
- module.exports = __toCommonJS(lib_exports);
28
+ module.exports = __toCommonJS(index_exports);
29
29
  var import_microfe_common = require("@elliemae/microfe-common");
30
30
  var import_guest = require("./guest.js");
31
31
  var import_types = require("./types.js");
@@ -19,8 +19,10 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
19
19
  var appObjects_exports = {};
20
20
  __export(appObjects_exports, {
21
21
  APPLICATION_SERVICE_OBJECT: () => APPLICATION_SERVICE_OBJECT,
22
+ MODULE_OBJECT: () => MODULE_OBJECT,
22
23
  applicationScriptingObject: () => applicationScriptingObject,
23
- authScriptingObject: () => authScriptingObject
24
+ authScriptingObject: () => authScriptingObject,
25
+ moduleScriptingObject: () => moduleScriptingObject
24
26
  });
25
27
  module.exports = __toCommonJS(appObjects_exports);
26
28
  const applicationScriptingObject = {
@@ -55,6 +57,7 @@ const applicationScriptingObject = {
55
57
  type: "object"
56
58
  };
57
59
  const APPLICATION_SERVICE_OBJECT = "application";
60
+ const MODULE_OBJECT = "module";
58
61
  const authScriptingObject = {
59
62
  object: {
60
63
  events: [],
@@ -64,3 +67,12 @@ const authScriptingObject = {
64
67
  },
65
68
  type: "object"
66
69
  };
70
+ const moduleScriptingObject = {
71
+ object: {
72
+ events: [],
73
+ functions: ["getParameters", "getCapabilities", "log", "unload"],
74
+ objectId: "module",
75
+ objectType: "Object"
76
+ },
77
+ type: "object"
78
+ };
@@ -31,23 +31,19 @@ class AppraisalService extends import_microfe_common.ScriptingObject {
31
31
  #creditScore;
32
32
  Close = new import_microfe_common.Event({
33
33
  name: "Close",
34
- requiresFeedback: false,
35
- so: this
34
+ objectId: this.constructor.name
36
35
  });
37
36
  Unloading = new import_microfe_common.Event({
38
37
  name: "Unloading",
39
- requiresFeedback: false,
40
- so: this
38
+ objectId: this.constructor.name
41
39
  });
42
40
  onPreCommit = new import_microfe_common.Event({
43
41
  name: "onPreCommit",
44
- requiresFeedback: true,
45
- so: this
42
+ objectId: this.constructor.name
46
43
  });
47
44
  onSaved = new import_microfe_common.Event({
48
45
  name: "onSaved",
49
- requiresFeedback: false,
50
- so: this
46
+ objectId: this.constructor.name
51
47
  });
52
48
  constructor({
53
49
  loanId,
@@ -83,6 +79,10 @@ class AppraisalService extends import_microfe_common.ScriptingObject {
83
79
  delete = () => {
84
80
  throw new Error("Not implemented");
85
81
  };
82
+ log = async (message, level) => {
83
+ console.log(message, level);
84
+ return Promise.resolve();
85
+ };
86
86
  unload = async () => {
87
87
  };
88
88
  }
@@ -29,13 +29,11 @@ class FloodService extends import_microfe_common.ScriptingObject {
29
29
  lastName;
30
30
  Close = new import_microfe_common.Event({
31
31
  name: "Close",
32
- requiresFeedback: false,
33
- so: this
32
+ objectId: this.constructor.name
34
33
  });
35
34
  Unloading = new import_microfe_common.Event({
36
35
  name: "Unloading",
37
- requiresFeedback: true,
38
- so: this
36
+ objectId: this.constructor.name
39
37
  });
40
38
  constructor() {
41
39
  super("FloodService");
@@ -50,6 +48,10 @@ class FloodService extends import_microfe_common.ScriptingObject {
50
48
  getParameters = () => Promise.resolve({
51
49
  moduleId: "floodService"
52
50
  });
51
+ log = async (message, level) => {
52
+ console.log(message, level);
53
+ return Promise.resolve();
54
+ };
53
55
  unload = () => Promise.resolve();
54
56
  _dispose = () => {
55
57
  };
package/dist/cjs/utils.js CHANGED
@@ -22,7 +22,6 @@ __export(utils_exports, {
22
22
  getObjectId: () => getObjectId,
23
23
  getOrigin: () => getOrigin,
24
24
  isFunction: () => isFunction,
25
- isProxy: () => isProxy,
26
25
  isScriptingObject: () => isScriptingObject
27
26
  });
28
27
  module.exports = __toCommonJS(utils_exports);
@@ -54,8 +53,4 @@ const isScriptingObject = (value) => (
54
53
  function isFunction(value) {
55
54
  return typeof value === "function";
56
55
  }
57
- const isProxy = (value) => (
58
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
59
- value?.constructor?.name === "Proxy"
60
- );
61
56
  const getObjectId = (elementOrId) => elementOrId?.id ?? elementOrId;
@@ -21,7 +21,7 @@
21
21
  height: 100%;
22
22
  }
23
23
  </style>
24
- <script src="https://qa.assets.rd.elliemae.io/pui-diagnostics@3"></script>
24
+ <script src="https://cdn.qa1.ice.com/pui-diagnostics@3"></script>
25
25
  <script src="https://cdn.elliemae.io/elliemae/core/ssf/1.0/elli.ssf.guest.js"></script>
26
26
  </head>
27
27
  <body>
@@ -21,7 +21,7 @@
21
21
  height: 100%;
22
22
  }
23
23
  </style>
24
- <script src="https://qa.assets.rd.elliemae.io/pui-diagnostics@3"></script>
24
+ <script src="https://cdn.qa1.ice.com/pui-diagnostics@3"></script>
25
25
  </head>
26
26
  <body>
27
27
  <main>