@elliemae/ssf-host 2.23.4 → 2.24.0

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 (91) hide show
  1. package/dist/cjs/callchain-host.html +262 -0
  2. package/dist/cjs/callchain-intermediate.html +92 -0
  3. package/dist/cjs/e2e-host.html +603 -0
  4. package/dist/cjs/e2e-index.html +234 -0
  5. package/dist/cjs/host.js +100 -43
  6. package/dist/cjs/index.html +304 -151
  7. package/dist/cjs/popup-focus-host.html +318 -0
  8. package/dist/cjs/utils.js +14 -1
  9. package/dist/cjs/v2-host-v1-guest.html +3 -0
  10. package/dist/esm/callchain-host.html +262 -0
  11. package/dist/esm/callchain-intermediate.html +92 -0
  12. package/dist/esm/e2e-host.html +603 -0
  13. package/dist/esm/e2e-index.html +234 -0
  14. package/dist/esm/host.js +101 -44
  15. package/dist/esm/index.html +304 -151
  16. package/dist/esm/popup-focus-host.html +318 -0
  17. package/dist/esm/utils.js +14 -1
  18. package/dist/esm/v2-host-v1-guest.html +3 -0
  19. package/dist/public/callchain-host.html +34 -0
  20. package/dist/public/callchain-host.js +3 -0
  21. package/dist/public/callchain-host.js.br +0 -0
  22. package/dist/public/callchain-host.js.gz +0 -0
  23. package/dist/public/callchain-host.js.map +1 -0
  24. package/dist/public/callchain-intermediate.html +1 -0
  25. package/dist/public/e2e-host.html +5 -0
  26. package/dist/public/e2e-host.js +8 -0
  27. package/dist/public/e2e-host.js.br +0 -0
  28. package/dist/public/e2e-host.js.gz +0 -0
  29. package/dist/public/e2e-host.js.map +1 -0
  30. package/dist/public/e2e-index.html +1 -0
  31. package/dist/public/index.html +1 -1
  32. package/dist/public/init.js +1 -1
  33. package/dist/public/init.js.br +0 -0
  34. package/dist/public/init.js.gz +0 -0
  35. package/dist/public/init.js.map +1 -1
  36. package/dist/public/js/emuiSsfHost.071827d0d7e775690fbb.js +3 -0
  37. package/dist/public/js/emuiSsfHost.071827d0d7e775690fbb.js.br +0 -0
  38. package/dist/public/js/emuiSsfHost.071827d0d7e775690fbb.js.gz +0 -0
  39. package/dist/public/js/emuiSsfHost.071827d0d7e775690fbb.js.map +1 -0
  40. package/dist/public/loan-object.js +1 -1
  41. package/dist/public/loan-object.js.br +0 -0
  42. package/dist/public/loan-object.js.gz +0 -0
  43. package/dist/public/loan-object.js.map +1 -1
  44. package/dist/public/popup-focus-host.html +1 -0
  45. package/dist/public/popup-focus-host.js +6 -0
  46. package/dist/public/popup-focus-host.js.br +0 -0
  47. package/dist/public/popup-focus-host.js.gz +0 -0
  48. package/dist/public/popup-focus-host.js.map +1 -0
  49. package/dist/public/v1-guest-v2-host.html +1 -1
  50. package/dist/public/v2-host-v1-guest.html +1 -1
  51. package/dist/types/lib/host.d.ts +1 -0
  52. package/dist/types/lib/ihost.d.ts +15 -0
  53. package/dist/types/lib/tests/timingDedup.test.d.ts +1 -0
  54. package/dist/types/lib/utils.d.ts +1 -0
  55. package/dist/types/tsconfig.tsbuildinfo +1 -1
  56. package/dist/umd/callchain-host.html +34 -0
  57. package/dist/umd/callchain-host.js +3 -0
  58. package/dist/umd/callchain-host.js.br +0 -0
  59. package/dist/umd/callchain-host.js.gz +0 -0
  60. package/dist/umd/callchain-host.js.map +1 -0
  61. package/dist/umd/callchain-intermediate.html +1 -0
  62. package/dist/umd/e2e-host.html +5 -0
  63. package/dist/umd/e2e-host.js +8 -0
  64. package/dist/umd/e2e-host.js.br +0 -0
  65. package/dist/umd/e2e-host.js.gz +0 -0
  66. package/dist/umd/e2e-host.js.map +1 -0
  67. package/dist/umd/e2e-index.html +1 -0
  68. package/dist/umd/index.html +1 -1
  69. package/dist/umd/index.js +1 -1
  70. package/dist/umd/index.js.br +0 -0
  71. package/dist/umd/index.js.gz +0 -0
  72. package/dist/umd/index.js.map +1 -1
  73. package/dist/umd/init.js +1 -1
  74. package/dist/umd/init.js.br +0 -0
  75. package/dist/umd/init.js.gz +0 -0
  76. package/dist/umd/init.js.map +1 -1
  77. package/dist/umd/loan-object.js +1 -1
  78. package/dist/umd/loan-object.js.br +0 -0
  79. package/dist/umd/loan-object.js.gz +0 -0
  80. package/dist/umd/loan-object.js.map +1 -1
  81. package/dist/umd/popup-focus-host.html +1 -0
  82. package/dist/umd/popup-focus-host.js +6 -0
  83. package/dist/umd/popup-focus-host.js.br +0 -0
  84. package/dist/umd/popup-focus-host.js.gz +0 -0
  85. package/dist/umd/popup-focus-host.js.map +1 -0
  86. package/dist/umd/v2-host-v1-guest.html +1 -1
  87. package/package.json +5 -5
  88. package/dist/public/js/emuiSsfHost.a4526c5eda64df08190f.js +0 -3
  89. package/dist/public/js/emuiSsfHost.a4526c5eda64df08190f.js.br +0 -0
  90. package/dist/public/js/emuiSsfHost.a4526c5eda64df08190f.js.gz +0 -0
  91. package/dist/public/js/emuiSsfHost.a4526c5eda64df08190f.js.map +0 -1
@@ -0,0 +1,262 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>CallChain E2E Test - Root Host</title>
7
+ <script src="https://cdn.tailwindcss.com?plugins=forms"></script>
8
+ <script src="https://cdn.mortgagetech.q1.ice.com/pui-diagnostics@3"></script>
9
+ </head>
10
+ <body class="bg-gray-50">
11
+ <header
12
+ class="bg-indigo-600 text-white px-4 py-3 flex items-center justify-between"
13
+ >
14
+ <h1 class="text-lg font-semibold">CallChain E2E Test — Root Host (A)</h1>
15
+ <a href="./index.html" class="text-indigo-200 hover:text-white text-sm"
16
+ >&larr; Back to main</a
17
+ >
18
+ </header>
19
+
20
+ <main class="mx-auto max-w-7xl px-4 py-4">
21
+ <!-- Architecture + Instructions -->
22
+ <div class="grid grid-cols-2 gap-4 mb-4">
23
+ <div class="bg-blue-50 border border-blue-200 rounded-md p-3">
24
+ <h2 class="text-sm font-bold text-blue-900 mb-2">Architecture</h2>
25
+ <pre class="text-xs text-blue-800 leading-relaxed">
26
+ Root Host (A) [localhost:4000]
27
+ ├─ Exposes: <strong>TestService</strong> scripting object
28
+ ├─ Loads guest <strong>"intermediateHost"</strong>
29
+ │ metadata: { vendor: "Acme Credit Corp", tier: "premium" }
30
+
31
+ └─ Intermediate (B) [localhost:4000, same-origin iframe]
32
+ ├─ Connects as V2 guest to A
33
+ ├─ Loads ice.guest from localhost:4001/index.js
34
+ ├─ Gets TestService proxy, clones it
35
+ ├─ Creates own SSFHost, loads guest <strong>"grandchildGuest"</strong>
36
+ │ metadata: { role: "validator", region: "US-East" }
37
+
38
+ └─ Grandchild (C) [localhost:4001, cross-origin iframe]
39
+ └─ Connects as V2 guest to B
40
+ └─ Gets TestService proxy → calls methods</pre
41
+ >
42
+ </div>
43
+
44
+ <div class="bg-green-50 border border-green-200 rounded-md p-3">
45
+ <h2 class="text-sm font-bold text-green-900 mb-2">Test Steps</h2>
46
+ <ol class="text-xs text-green-800 space-y-2 list-decimal list-inside">
47
+ <li>
48
+ <strong>Wait for initialization</strong> — check the Invocation
49
+ Log shows: <code>"Root Host (A) ready"</code>, Intermediate shows
50
+ <code>"Intermediate (B) ready"</code>, Grandchild shows
51
+ <code>"Got TestService proxy"</code>.
52
+ </li>
53
+ <li>
54
+ <strong>Click any button</strong> inside the Grandchild (C) panel
55
+ (e.g. "Call getCallerInfo()").
56
+ </li>
57
+ <li>
58
+ <strong>Verify on the left</strong> — the "callContext.guest" and
59
+ "callContext.callChain" panels update with the expected values
60
+ shown below.
61
+ </li>
62
+ <li>
63
+ <strong>Verify on grandchild</strong> — the return value appears
64
+ in the grandchild's result area (proves round-trip works).
65
+ </li>
66
+ </ol>
67
+ </div>
68
+ </div>
69
+
70
+ <!-- Expected Values -->
71
+ <div class="bg-amber-50 border border-amber-200 rounded-md p-3 mb-4">
72
+ <h2 class="text-sm font-bold text-amber-900 mb-2">
73
+ Expected Values (when grandchild C calls any method)
74
+ </h2>
75
+ <div class="grid grid-cols-2 gap-4 text-xs">
76
+ <div>
77
+ <h3 class="font-semibold text-amber-800 mb-1">
78
+ callContext.guest (direct caller = B)
79
+ </h3>
80
+ <pre
81
+ data-testid="expected-guest"
82
+ class="bg-white rounded p-2 text-amber-900"
83
+ >
84
+ {
85
+ "id": "intermediateHost",
86
+ "title": "Intermediate Guest+Host (B)",
87
+ "url": "...callchain-intermediate.html"
88
+ }</pre
89
+ >
90
+ </div>
91
+ <div>
92
+ <h3 class="font-semibold text-amber-800 mb-1">
93
+ callContext.callChain (originator chain)
94
+ </h3>
95
+ <pre
96
+ data-testid="expected-callchain"
97
+ class="bg-white rounded p-2 text-amber-900"
98
+ >
99
+ [
100
+ {
101
+ "id": "grandchildGuest",
102
+ "metadata": { "role": "validator", "region": "US-East" }
103
+ },
104
+ {
105
+ "id": "intermediateHost",
106
+ "metadata": { "vendor": "Acme Credit Corp", "tier": "premium" }
107
+ }
108
+ ]</pre
109
+ >
110
+ </div>
111
+ </div>
112
+ </div>
113
+
114
+ <div class="grid grid-cols-2 gap-4">
115
+ <!-- Left: callContext results -->
116
+ <div>
117
+ <h2 class="text-md font-semibold mb-2">
118
+ Actual Results (from Root Host A)
119
+ </h2>
120
+
121
+ <div
122
+ data-testid="direct-caller-panel"
123
+ class="bg-white rounded-lg shadow p-3 mb-3"
124
+ >
125
+ <h3 class="text-sm font-medium text-gray-500 mb-1">
126
+ callContext.guest (direct caller)
127
+ </h3>
128
+ <pre
129
+ data-testid="direct-caller-result"
130
+ id="directCallerResult"
131
+ class="text-xs bg-gray-100 rounded p-2 min-h-[40px] whitespace-pre-wrap"
132
+ >
133
+ Waiting — click a button in Grandchild (C)...</pre
134
+ >
135
+ </div>
136
+
137
+ <div
138
+ data-testid="callchain-panel"
139
+ class="bg-white rounded-lg shadow p-3 mb-3"
140
+ >
141
+ <h3 class="text-sm font-medium text-gray-500 mb-1">
142
+ callContext.callChain (original callers)
143
+ </h3>
144
+ <pre
145
+ data-testid="callchain-result"
146
+ id="callChainResult"
147
+ class="text-xs bg-gray-100 rounded p-2 min-h-[60px] whitespace-pre-wrap"
148
+ >
149
+ Waiting — click a button in Grandchild (C)...</pre
150
+ >
151
+ </div>
152
+
153
+ <div
154
+ data-testid="method-result-panel"
155
+ class="bg-white rounded-lg shadow p-3 mb-3"
156
+ >
157
+ <h3 class="text-sm font-medium text-gray-500 mb-1">
158
+ Method return value (returned to grandchild)
159
+ </h3>
160
+ <pre
161
+ data-testid="method-return-result"
162
+ id="methodReturnResult"
163
+ class="text-xs bg-gray-100 rounded p-2 min-h-[40px] whitespace-pre-wrap"
164
+ >
165
+ Waiting — click a button in Grandchild (C)...</pre
166
+ >
167
+ </div>
168
+
169
+ <div
170
+ data-testid="invocation-log-panel"
171
+ class="bg-white rounded-lg shadow p-3"
172
+ >
173
+ <h3 class="text-sm font-medium text-gray-500 mb-1">
174
+ Invocation Log
175
+ </h3>
176
+ <div
177
+ data-testid="invocation-log"
178
+ id="invocationLog"
179
+ class="text-xs bg-gray-100 rounded p-2 min-h-[80px] max-h-[200px] overflow-y-auto"
180
+ ></div>
181
+ </div>
182
+ </div>
183
+
184
+ <!-- Right: guest container -->
185
+ <div>
186
+ <h2 class="text-md font-semibold mb-2">
187
+ Intermediate Guest (B) → Grandchild Guest (C)
188
+ </h2>
189
+ <div
190
+ data-testid="intermediate-guest-container"
191
+ id="intermediate-container"
192
+ class="border-2 border-dashed border-indigo-300 rounded-lg h-[400px]"
193
+ ></div>
194
+ </div>
195
+ </div>
196
+
197
+ <!-- Verification Checklist -->
198
+ <div class="bg-gray-100 border border-gray-300 rounded-md p-3 mt-4">
199
+ <h2 class="text-sm font-bold text-gray-800 mb-2">
200
+ Verification Checklist
201
+ </h2>
202
+ <div class="grid grid-cols-2 gap-2 text-xs">
203
+ <label class="flex items-start gap-2">
204
+ <input type="checkbox" class="mt-0.5" />
205
+ <span
206
+ ><strong>TC-CC-01:</strong> All three layers initialized without
207
+ errors (Log shows "ready" messages, no ERROR lines)</span
208
+ >
209
+ </label>
210
+ <label class="flex items-start gap-2">
211
+ <input type="checkbox" class="mt-0.5" />
212
+ <span
213
+ ><strong>TC-CC-02:</strong> <code>callContext.guest.id</code> =
214
+ <code>"intermediateHost"</code> (B is the direct caller, not
215
+ C)</span
216
+ >
217
+ </label>
218
+ <label class="flex items-start gap-2">
219
+ <input type="checkbox" class="mt-0.5" />
220
+ <span
221
+ ><strong>TC-CC-03:</strong> <code>callChain[0].id</code> =
222
+ <code>"grandchildGuest"</code> with metadata
223
+ <code>{ role, region }</code></span
224
+ >
225
+ </label>
226
+ <label class="flex items-start gap-2">
227
+ <input type="checkbox" class="mt-0.5" />
228
+ <span
229
+ ><strong>TC-CC-04:</strong> <code>callChain[1].id</code> =
230
+ <code>"intermediateHost"</code> with metadata
231
+ <code>{ vendor, tier }</code></span
232
+ >
233
+ </label>
234
+ <label class="flex items-start gap-2">
235
+ <input type="checkbox" class="mt-0.5" />
236
+ <span
237
+ ><strong>TC-CC-05:</strong> Grandchild (C) receives the method
238
+ return value (result appears in C's panel)</span
239
+ >
240
+ </label>
241
+ <label class="flex items-start gap-2">
242
+ <input type="checkbox" class="mt-0.5" />
243
+ <span
244
+ ><strong>TC-CC-06:</strong> All three methods work:
245
+ <code>getCallerInfo()</code>, <code>ping()</code>,
246
+ <code>getLoanDetails()</code></span
247
+ >
248
+ </label>
249
+ <label class="flex items-start gap-2">
250
+ <input type="checkbox" class="mt-0.5" />
251
+ <span
252
+ ><strong>TC-CC-07:</strong> No cross-origin or console errors
253
+ during invocations</span
254
+ >
255
+ </label>
256
+ </div>
257
+ </div>
258
+ </main>
259
+
260
+ <script src="./callchain-host.js" type="module"></script>
261
+ </body>
262
+ </html>
@@ -0,0 +1,92 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Intermediate Guest+Host (B)</title>
7
+ <script src="https://cdn.tailwindcss.com?plugins=forms"></script>
8
+ <script src="https://cdn.mortgagetech.q1.ice.com/pui-diagnostics@3"></script>
9
+ <script src="http://localhost:4001/index.js"></script>
10
+ </head>
11
+ <body class="bg-orange-50 p-2">
12
+ <h2 class="text-sm font-semibold text-orange-800 mb-1">
13
+ Intermediate (B) — Guest + Host
14
+ </h2>
15
+
16
+ <div
17
+ data-testid="intermediate-status"
18
+ id="status"
19
+ class="text-xs bg-orange-100 rounded p-2 mb-2 min-h-[30px]"
20
+ >
21
+ Initializing...
22
+ </div>
23
+
24
+ <div
25
+ data-testid="grandchild-container"
26
+ id="grandchild-container"
27
+ class="border border-dashed border-orange-400 rounded h-[250px]"
28
+ ></div>
29
+
30
+ <script type="module">
31
+ import { Analytics } from './analytics-object-v2.js';
32
+ import { getGuestBaseUrl, getHost } from './utils.js';
33
+
34
+ const statusEl = document.getElementById('status');
35
+ const log = (msg) => {
36
+ const ts = new Date().toLocaleTimeString();
37
+ statusEl.innerHTML += `<div>[${ts}] ${msg}</div>`;
38
+ };
39
+
40
+ (async () => {
41
+ try {
42
+ // Step 1: Connect to parent host (A) as V2 guest
43
+ log('Connecting to Root Host (A) as V2 guest...');
44
+ const guestV2 = new ice.guest.SSFGuest({
45
+ logger: {
46
+ index: 'intermediate-guest',
47
+ team: 'ui platform',
48
+ appName: 'intermediate-b',
49
+ },
50
+ keepAlive: false,
51
+ });
52
+ await guestV2.connect();
53
+ log('Connected to Root Host (A)');
54
+
55
+ // Step 2: Get TestService from parent
56
+ const testService = await guestV2.getObject('TestService');
57
+ log('Got TestService proxy from Root Host (A)');
58
+
59
+ // Step 3: Create own V2 host
60
+ const analyticsObj = new Analytics();
61
+ const hostB = getHost(analyticsObj);
62
+ if (!hostB) {
63
+ log('ERROR: Failed to create intermediate SSFHost');
64
+ return;
65
+ }
66
+ log('Created intermediate SSFHost (B)');
67
+
68
+ // Step 4: Clone TestService for grandchild
69
+ const clonedTestService = hostB.cloneScriptingObject(testService);
70
+ hostB.addScriptingObject(clonedTestService);
71
+ log('Cloned TestService for grandchild guests');
72
+
73
+ // Step 5: Load grandchild guest (C) with metadata
74
+ const guestBaseUrl = await getGuestBaseUrl();
75
+ hostB.loadGuest({
76
+ id: 'grandchildGuest',
77
+ url: new URL('./callchain-grandchild.html', guestBaseUrl).href,
78
+ title: 'Grandchild Guest (C)',
79
+ targetElement: document.getElementById('grandchild-container'),
80
+ metadata: { role: 'validator', region: 'US-East' },
81
+ onLoad: () => log('Grandchild guest (C) loaded'),
82
+ onError: () => log('ERROR: Grandchild guest (C) failed to load'),
83
+ });
84
+
85
+ log('Intermediate (B) ready');
86
+ } catch (err) {
87
+ log(`ERROR: ${err.message}`);
88
+ }
89
+ })();
90
+ </script>
91
+ </body>
92
+ </html>