request-iframe 0.0.5 → 0.1.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 (142) hide show
  1. package/README.CN.md +54 -7
  2. package/README.md +64 -11
  3. package/esm/api/client.js +79 -0
  4. package/esm/api/server.js +59 -0
  5. package/esm/constants/index.js +257 -0
  6. package/esm/constants/messages.js +155 -0
  7. package/esm/core/client-server.js +329 -0
  8. package/esm/core/client.js +873 -0
  9. package/esm/core/request.js +27 -0
  10. package/esm/core/response.js +451 -0
  11. package/esm/core/server.js +767 -0
  12. package/esm/index.js +21 -0
  13. package/esm/interceptors/index.js +122 -0
  14. package/esm/message/channel.js +181 -0
  15. package/esm/message/dispatcher.js +380 -0
  16. package/esm/message/index.js +2 -0
  17. package/esm/stream/file-stream.js +289 -0
  18. package/esm/stream/index.js +44 -0
  19. package/esm/stream/readable-stream.js +500 -0
  20. package/esm/stream/stream-core.js +91 -0
  21. package/esm/stream/types.js +1 -0
  22. package/esm/stream/writable-stream.js +582 -0
  23. package/esm/types/index.js +1 -0
  24. package/esm/utils/ack-meta.js +53 -0
  25. package/esm/utils/cache.js +147 -0
  26. package/esm/utils/cookie.js +352 -0
  27. package/esm/utils/debug.js +521 -0
  28. package/esm/utils/error.js +27 -0
  29. package/esm/utils/index.js +178 -0
  30. package/esm/utils/origin.js +28 -0
  31. package/esm/utils/path-match.js +148 -0
  32. package/esm/utils/protocol.js +157 -0
  33. package/library/api/client.d.ts.map +1 -1
  34. package/library/api/client.js +8 -1
  35. package/library/api/server.d.ts.map +1 -1
  36. package/library/api/server.js +4 -1
  37. package/library/constants/index.d.ts +25 -1
  38. package/library/constants/index.d.ts.map +1 -1
  39. package/library/constants/index.js +30 -5
  40. package/library/constants/messages.d.ts +5 -0
  41. package/library/constants/messages.d.ts.map +1 -1
  42. package/library/constants/messages.js +5 -0
  43. package/library/core/client-server.d.ts +3 -2
  44. package/library/core/client-server.d.ts.map +1 -1
  45. package/library/core/client-server.js +51 -4
  46. package/library/core/client.d.ts +4 -1
  47. package/library/core/client.d.ts.map +1 -1
  48. package/library/core/client.js +74 -31
  49. package/library/core/response.d.ts +21 -3
  50. package/library/core/response.d.ts.map +1 -1
  51. package/library/core/response.js +46 -6
  52. package/library/core/server.d.ts +28 -1
  53. package/library/core/server.d.ts.map +1 -1
  54. package/library/core/server.js +180 -19
  55. package/library/message/channel.d.ts +6 -0
  56. package/library/message/channel.d.ts.map +1 -1
  57. package/library/message/dispatcher.d.ts +22 -0
  58. package/library/message/dispatcher.d.ts.map +1 -1
  59. package/library/message/dispatcher.js +92 -0
  60. package/library/stream/file-stream.d.ts +4 -0
  61. package/library/stream/file-stream.d.ts.map +1 -1
  62. package/library/stream/file-stream.js +61 -33
  63. package/library/stream/index.d.ts.map +1 -1
  64. package/library/stream/index.js +2 -0
  65. package/library/stream/readable-stream.d.ts +30 -11
  66. package/library/stream/readable-stream.d.ts.map +1 -1
  67. package/library/stream/readable-stream.js +329 -73
  68. package/library/stream/stream-core.d.ts +44 -0
  69. package/library/stream/stream-core.d.ts.map +1 -0
  70. package/library/stream/stream-core.js +98 -0
  71. package/library/stream/types.d.ts +90 -3
  72. package/library/stream/types.d.ts.map +1 -1
  73. package/library/stream/writable-stream.d.ts +40 -12
  74. package/library/stream/writable-stream.d.ts.map +1 -1
  75. package/library/stream/writable-stream.js +391 -195
  76. package/library/types/index.d.ts +70 -3
  77. package/library/types/index.d.ts.map +1 -1
  78. package/library/utils/ack-meta.d.ts +2 -0
  79. package/library/utils/ack-meta.d.ts.map +1 -0
  80. package/library/utils/ack-meta.js +59 -0
  81. package/library/utils/index.d.ts +1 -0
  82. package/library/utils/index.d.ts.map +1 -1
  83. package/library/utils/index.js +16 -0
  84. package/library/utils/origin.d.ts +14 -0
  85. package/library/utils/origin.d.ts.map +1 -0
  86. package/library/utils/origin.js +34 -0
  87. package/package.json +31 -7
  88. package/react/README.md +16 -0
  89. package/react/esm/index.js +284 -0
  90. package/react/library/index.d.ts +1 -1
  91. package/react/library/index.d.ts.map +1 -1
  92. package/react/library/index.js +7 -4
  93. package/react/package.json +24 -2
  94. package/library/__tests__/channel.test.ts +0 -432
  95. package/library/__tests__/coverage-branches.test.ts +0 -356
  96. package/library/__tests__/debug.test.ts +0 -610
  97. package/library/__tests__/dispatcher.test.ts +0 -485
  98. package/library/__tests__/interceptors.test.ts +0 -146
  99. package/library/__tests__/requestIframe.test.ts +0 -5590
  100. package/library/__tests__/server.test.ts +0 -738
  101. package/library/__tests__/stream.test.ts +0 -726
  102. package/library/__tests__/utils.test.ts +0 -473
  103. package/library/api/client.d.js +0 -5
  104. package/library/api/server.d.js +0 -5
  105. package/library/constants/index.d.js +0 -36
  106. package/library/constants/messages.d.js +0 -5
  107. package/library/core/client.d.js +0 -5
  108. package/library/core/message-handler.d.ts +0 -110
  109. package/library/core/message-handler.d.ts.map +0 -1
  110. package/library/core/message-handler.js +0 -320
  111. package/library/core/request-response.d.ts +0 -59
  112. package/library/core/request-response.d.ts.map +0 -1
  113. package/library/core/request-response.js +0 -337
  114. package/library/core/request.d.js +0 -5
  115. package/library/core/response.d.js +0 -5
  116. package/library/core/server-base.d.ts +0 -86
  117. package/library/core/server-base.d.ts.map +0 -1
  118. package/library/core/server-base.js +0 -257
  119. package/library/core/server-client.d.js +0 -5
  120. package/library/core/server-client.d.ts +0 -101
  121. package/library/core/server-client.d.ts.map +0 -1
  122. package/library/core/server-client.js +0 -266
  123. package/library/core/server.d.js +0 -5
  124. package/library/interceptors/index.d.js +0 -5
  125. package/library/message/channel.d.js +0 -5
  126. package/library/message/dispatcher.d.js +0 -5
  127. package/library/message/index.d.js +0 -25
  128. package/library/stream/file-stream.d.js +0 -4
  129. package/library/stream/index.d.js +0 -58
  130. package/library/stream/readable-stream.d.js +0 -5
  131. package/library/stream/types.d.js +0 -5
  132. package/library/stream/writable-stream.d.js +0 -5
  133. package/library/types/index.d.js +0 -5
  134. package/library/utils/cache.d.js +0 -5
  135. package/library/utils/cookie.d.js +0 -5
  136. package/library/utils/debug.d.js +0 -5
  137. package/library/utils/index.d.js +0 -94
  138. package/library/utils/path-match.d.js +0 -5
  139. package/library/utils/protocol.d.js +0 -5
  140. package/react/library/__tests__/index.test.d.ts +0 -2
  141. package/react/library/__tests__/index.test.d.ts.map +0 -1
  142. package/react/library/__tests__/index.test.tsx +0 -792
@@ -1,610 +0,0 @@
1
- import { setupClientDebugInterceptors, setupServerDebugListeners } from '../utils/debug';
2
- import { requestIframeClient, clearRequestIframeClientCache } from '../api/client';
3
- import { requestIframeServer, clearRequestIframeServerCache } from '../api/server';
4
- import { MessageType, MessageRole } from '../constants';
5
-
6
- /**
7
- * Create test iframe
8
- */
9
- function createTestIframe(origin: string): HTMLIFrameElement {
10
- const iframe = document.createElement('iframe');
11
- iframe.src = `${origin}/test.html`;
12
- document.body.appendChild(iframe);
13
- return iframe;
14
- }
15
-
16
- /**
17
- * Cleanup test iframe
18
- */
19
- function cleanupIframe(iframe: HTMLIFrameElement): void {
20
- if (iframe.parentNode) {
21
- iframe.parentNode.removeChild(iframe);
22
- }
23
- }
24
-
25
- describe('debug', () => {
26
- beforeEach(() => {
27
- clearRequestIframeClientCache();
28
- clearRequestIframeServerCache();
29
- jest.clearAllMocks();
30
- console.info = jest.fn();
31
- console.warn = jest.fn();
32
- console.error = jest.fn();
33
- // Clear all iframes
34
- document.querySelectorAll('iframe').forEach((iframe) => {
35
- if (iframe.parentNode) {
36
- iframe.parentNode.removeChild(iframe);
37
- }
38
- });
39
- });
40
-
41
- afterEach(() => {
42
- // Clear all caches
43
- clearRequestIframeClientCache();
44
- clearRequestIframeServerCache();
45
- // Clear all iframes
46
- document.querySelectorAll('iframe').forEach((iframe) => {
47
- if (iframe.parentNode) {
48
- iframe.parentNode.removeChild(iframe);
49
- }
50
- });
51
- });
52
-
53
- describe('setupClientDebugInterceptors', () => {
54
- it('should log request start', async () => {
55
- const origin = 'https://example.com';
56
- const iframe = createTestIframe(origin);
57
-
58
- const mockContentWindow = {
59
- postMessage: jest.fn((msg: any) => {
60
- if (msg.type === 'request') {
61
- window.dispatchEvent(
62
- new MessageEvent('message', {
63
- data: {
64
- __requestIframe__: 1,
65
- type: 'ack',
66
- requestId: msg.requestId,
67
- path: msg.path,
68
- role: MessageRole.SERVER
69
- },
70
- origin
71
- })
72
- );
73
- setTimeout(() => {
74
- window.dispatchEvent(
75
- new MessageEvent('message', {
76
- data: {
77
- __requestIframe__: 1,
78
- type: 'response',
79
- requestId: msg.requestId,
80
- data: { result: 'success' },
81
- status: 200,
82
- statusText: 'OK',
83
- role: MessageRole.SERVER
84
- },
85
- origin
86
- })
87
- );
88
- }, 10);
89
- }
90
- })
91
- };
92
- Object.defineProperty(iframe, 'contentWindow', {
93
- value: mockContentWindow,
94
- writable: true
95
- });
96
-
97
- const client = requestIframeClient(iframe);
98
- setupClientDebugInterceptors(client);
99
-
100
- await client.send('test', { param: 'value' }, { ackTimeout: 1000 });
101
-
102
- expect(console.info).toHaveBeenCalledWith(
103
- expect.stringContaining('[Client] Request Start'),
104
- expect.any(String),
105
- expect.any(String),
106
- expect.objectContaining({
107
- path: 'test',
108
- body: { param: 'value' }
109
- })
110
- );
111
-
112
- expect(console.info).toHaveBeenCalledWith(
113
- expect.stringContaining('[Client] Request Success'),
114
- expect.any(String),
115
- expect.any(String),
116
- expect.objectContaining({
117
- requestId: expect.any(String),
118
- status: 200
119
- })
120
- );
121
-
122
- cleanupIframe(iframe);
123
- });
124
-
125
- it('should log request failure', async () => {
126
- const origin = 'https://example.com';
127
- const iframe = createTestIframe(origin);
128
-
129
- const mockContentWindow = {
130
- postMessage: jest.fn()
131
- };
132
- Object.defineProperty(iframe, 'contentWindow', {
133
- value: mockContentWindow,
134
- writable: true
135
- });
136
-
137
- const client = requestIframeClient(iframe);
138
- setupClientDebugInterceptors(client);
139
-
140
- try {
141
- await client.send('test', undefined, { ackTimeout: 50, timeout: 100 });
142
- } catch (error) {
143
- // Expected to fail
144
- }
145
-
146
- // Wait a bit for error logging
147
- await new Promise(resolve => setTimeout(resolve, 150));
148
-
149
- expect(console.error).toHaveBeenCalledWith(
150
- expect.stringContaining('[Client] Request Failed'),
151
- expect.any(String),
152
- expect.any(String),
153
- expect.objectContaining({
154
- code: expect.any(String)
155
- })
156
- );
157
-
158
- cleanupIframe(iframe);
159
- });
160
-
161
- it('should log file response', async () => {
162
- const origin = 'https://example.com';
163
- const iframe = createTestIframe(origin);
164
-
165
- const mockContentWindow = {
166
- postMessage: jest.fn((msg: any) => {
167
- if (msg.type === 'request') {
168
- window.dispatchEvent(
169
- new MessageEvent('message', {
170
- data: {
171
- __requestIframe__: 1,
172
- type: 'ack',
173
- requestId: msg.requestId,
174
- path: msg.path,
175
- role: MessageRole.SERVER
176
- },
177
- origin
178
- })
179
- );
180
- setTimeout(() => {
181
- const streamId = 'stream-test';
182
- window.dispatchEvent(
183
- new MessageEvent('message', {
184
- data: {
185
- __requestIframe__: 1,
186
- timestamp: Date.now(),
187
- type: 'stream_start',
188
- requestId: msg.requestId,
189
- status: 200,
190
- statusText: 'OK',
191
- headers: {
192
- 'Content-Type': 'text/plain',
193
- 'Content-Disposition': 'attachment; filename="test.txt"'
194
- },
195
- body: {
196
- streamId,
197
- type: 'file',
198
- chunked: false,
199
- autoResolve: true,
200
- metadata: {
201
- filename: 'test.txt',
202
- mimeType: 'text/plain'
203
- }
204
- },
205
- role: MessageRole.SERVER
206
- },
207
- origin
208
- })
209
- );
210
- setTimeout(() => {
211
- window.dispatchEvent(
212
- new MessageEvent('message', {
213
- data: {
214
- __requestIframe__: 1,
215
- timestamp: Date.now(),
216
- type: 'stream_data',
217
- requestId: msg.requestId,
218
- body: {
219
- streamId,
220
- data: btoa('Hello World'),
221
- done: true
222
- },
223
- role: MessageRole.SERVER
224
- },
225
- origin
226
- })
227
- );
228
- setTimeout(() => {
229
- window.dispatchEvent(
230
- new MessageEvent('message', {
231
- data: {
232
- __requestIframe__: 1,
233
- timestamp: Date.now(),
234
- type: 'stream_end',
235
- requestId: msg.requestId,
236
- body: { streamId },
237
- role: MessageRole.SERVER
238
- },
239
- origin
240
- })
241
- );
242
- }, 10);
243
- }, 10);
244
- }, 10);
245
- }
246
- })
247
- };
248
- Object.defineProperty(iframe, 'contentWindow', {
249
- value: mockContentWindow,
250
- writable: true
251
- });
252
-
253
- const client = requestIframeClient(iframe);
254
- setupClientDebugInterceptors(client);
255
-
256
- const response = await client.send('getFile', undefined, {
257
- ackTimeout: 1000,
258
- timeout: 10000
259
- }) as any;
260
-
261
- expect(response.data).toBeInstanceOf(File);
262
- const file = response.data as File;
263
- expect(file.name).toBe('test.txt');
264
-
265
- expect(console.info).toHaveBeenCalledWith(
266
- expect.stringContaining('[Client] Request Success (File)'),
267
- expect.any(String),
268
- expect.any(String),
269
- expect.objectContaining({
270
- fileData: expect.objectContaining({
271
- fileName: 'test.txt'
272
- })
273
- })
274
- );
275
-
276
- cleanupIframe(iframe);
277
- }, 20000);
278
-
279
- it('should log incoming messages', async () => {
280
- const origin = 'https://example.com';
281
- const iframe = createTestIframe(origin);
282
-
283
- const mockContentWindow = {
284
- postMessage: jest.fn((msg: any) => {
285
- if (msg.type === 'request') {
286
- setTimeout(() => {
287
- window.dispatchEvent(
288
- new MessageEvent('message', {
289
- data: {
290
- __requestIframe__: 1,
291
- type: 'ack',
292
- requestId: msg.requestId,
293
- path: msg.path,
294
- role: MessageRole.SERVER
295
- },
296
- origin
297
- })
298
- );
299
- setTimeout(() => {
300
- window.dispatchEvent(
301
- new MessageEvent('message', {
302
- data: {
303
- __requestIframe__: 1,
304
- type: 'response',
305
- requestId: msg.requestId,
306
- data: { result: 'success' },
307
- status: 200,
308
- statusText: 'OK',
309
- role: MessageRole.SERVER
310
- },
311
- origin
312
- })
313
- );
314
- }, 10);
315
- }, 10);
316
- }
317
- })
318
- };
319
- Object.defineProperty(iframe, 'contentWindow', {
320
- value: mockContentWindow,
321
- writable: true
322
- });
323
-
324
- const client = requestIframeClient(iframe);
325
- setupClientDebugInterceptors(client);
326
-
327
- await client.send('test', undefined, { ackTimeout: 1000, timeout: 5000 });
328
-
329
- expect(console.info).toHaveBeenCalledWith(
330
- expect.stringContaining('[Client] Received ACK'),
331
- expect.any(String),
332
- expect.any(String),
333
- expect.objectContaining({
334
- requestId: expect.any(String)
335
- })
336
- );
337
-
338
- cleanupIframe(iframe);
339
- }, 10000);
340
- });
341
-
342
- describe('setupServerDebugListeners', () => {
343
- it('should log received request', async () => {
344
- const origin = 'https://example.com';
345
- const iframe = createTestIframe(origin);
346
-
347
- const mockContentWindow = {
348
- postMessage: jest.fn()
349
- };
350
- Object.defineProperty(iframe, 'contentWindow', {
351
- value: mockContentWindow,
352
- writable: true
353
- });
354
-
355
- const server = requestIframeServer();
356
- setupServerDebugListeners(server);
357
-
358
- server.on('test', (req, res) => {
359
- res.send({ result: 'success' });
360
- });
361
-
362
- window.dispatchEvent(
363
- new MessageEvent('message', {
364
- data: {
365
- __requestIframe__: 1,
366
- timestamp: Date.now(),
367
- type: 'request',
368
- requestId: 'req123',
369
- path: 'test',
370
- body: { param: 'value' },
371
- role: MessageRole.CLIENT,
372
- targetId: server.id
373
- },
374
- origin,
375
- source: mockContentWindow as any
376
- })
377
- );
378
-
379
- await new Promise(resolve => setTimeout(resolve, 50));
380
-
381
- expect(console.info).toHaveBeenCalledWith(
382
- expect.stringContaining('[Server] Received Request'),
383
- expect.any(String),
384
- expect.any(String),
385
- expect.objectContaining({
386
- path: 'test',
387
- body: { param: 'value' }
388
- })
389
- );
390
-
391
- expect(console.info).toHaveBeenCalledWith(
392
- expect.stringContaining('[Server] Sending Response'),
393
- expect.any(String),
394
- expect.any(String),
395
- expect.objectContaining({
396
- status: 200
397
- })
398
- );
399
-
400
- server.destroy();
401
- cleanupIframe(iframe);
402
- });
403
-
404
- it('should log status code changes', async () => {
405
- const origin = 'https://example.com';
406
- const iframe = createTestIframe(origin);
407
-
408
- const mockContentWindow = {
409
- postMessage: jest.fn()
410
- };
411
- Object.defineProperty(iframe, 'contentWindow', {
412
- value: mockContentWindow,
413
- writable: true
414
- });
415
-
416
- const server = requestIframeServer();
417
- setupServerDebugListeners(server);
418
-
419
- server.on('test', (req, res) => {
420
- res.status(404).send({ error: 'Not Found' });
421
- });
422
-
423
- window.dispatchEvent(
424
- new MessageEvent('message', {
425
- data: {
426
- __requestIframe__: 1,
427
- timestamp: Date.now(),
428
- type: 'request',
429
- requestId: 'req123',
430
- path: 'test',
431
- role: MessageRole.CLIENT,
432
- targetId: server.id
433
- },
434
- origin,
435
- source: mockContentWindow as any
436
- })
437
- );
438
-
439
- await new Promise(resolve => setTimeout(resolve, 50));
440
-
441
- expect(console.info).toHaveBeenCalledWith(
442
- expect.stringContaining('[Server] Setting Status Code'),
443
- expect.any(String),
444
- expect.any(String),
445
- expect.objectContaining({
446
- statusCode: 404
447
- })
448
- );
449
-
450
- server.destroy();
451
- cleanupIframe(iframe);
452
- });
453
-
454
- it('should log header changes', async () => {
455
- const origin = 'https://example.com';
456
- const iframe = createTestIframe(origin);
457
-
458
- const mockContentWindow = {
459
- postMessage: jest.fn()
460
- };
461
- Object.defineProperty(iframe, 'contentWindow', {
462
- value: mockContentWindow,
463
- writable: true
464
- });
465
-
466
- const server = requestIframeServer();
467
- setupServerDebugListeners(server);
468
-
469
- server.on('test', (req, res) => {
470
- res.setHeader('X-Custom', 'value');
471
- res.send({ result: 'success' });
472
- });
473
-
474
- window.dispatchEvent(
475
- new MessageEvent('message', {
476
- data: {
477
- __requestIframe__: 1,
478
- timestamp: Date.now(),
479
- type: 'request',
480
- requestId: 'req123',
481
- path: 'test',
482
- role: MessageRole.CLIENT,
483
- targetId: server.id
484
- },
485
- origin,
486
- source: mockContentWindow as any
487
- })
488
- );
489
-
490
- await new Promise(resolve => setTimeout(resolve, 50));
491
-
492
- expect(console.info).toHaveBeenCalledWith(
493
- expect.stringContaining('[Server] Setting Header'),
494
- expect.any(String),
495
- expect.any(String),
496
- expect.objectContaining({
497
- header: 'X-Custom',
498
- value: 'value'
499
- })
500
- );
501
-
502
- server.destroy();
503
- cleanupIframe(iframe);
504
- });
505
-
506
- it('should log sendFile', async () => {
507
- const origin = 'https://example.com';
508
- const iframe = createTestIframe(origin);
509
-
510
- const mockContentWindow = {
511
- postMessage: jest.fn()
512
- };
513
- Object.defineProperty(iframe, 'contentWindow', {
514
- value: mockContentWindow,
515
- writable: true
516
- });
517
-
518
- const server = requestIframeServer();
519
- setupServerDebugListeners(server);
520
-
521
- server.on('test', async (req, res) => {
522
- await res.sendFile('Hello World', {
523
- fileName: 'test.txt',
524
- mimeType: 'text/plain'
525
- });
526
- });
527
-
528
- window.dispatchEvent(
529
- new MessageEvent('message', {
530
- data: {
531
- __requestIframe__: 1,
532
- timestamp: Date.now(),
533
- type: 'request',
534
- requestId: 'req123',
535
- path: 'test',
536
- role: MessageRole.CLIENT,
537
- targetId: server.id
538
- },
539
- origin,
540
- source: mockContentWindow as any
541
- })
542
- );
543
-
544
- await new Promise(resolve => setTimeout(resolve, 200));
545
-
546
- expect(console.info).toHaveBeenCalledWith(
547
- expect.stringContaining('[Server] Sending File'),
548
- expect.any(String),
549
- expect.any(String),
550
- expect.objectContaining({
551
- fileName: 'test.txt',
552
- mimeType: 'text/plain'
553
- })
554
- );
555
-
556
- server.destroy();
557
- cleanupIframe(iframe);
558
- }, 10000);
559
-
560
- it('should log json response', async () => {
561
- const origin = 'https://example.com';
562
- const iframe = createTestIframe(origin);
563
-
564
- const mockContentWindow = {
565
- postMessage: jest.fn()
566
- };
567
- Object.defineProperty(iframe, 'contentWindow', {
568
- value: mockContentWindow,
569
- writable: true
570
- });
571
-
572
- const server = requestIframeServer();
573
- setupServerDebugListeners(server);
574
-
575
- server.on('test', (req, res) => {
576
- res.json({ result: 'success' });
577
- });
578
-
579
- window.dispatchEvent(
580
- new MessageEvent('message', {
581
- data: {
582
- __requestIframe__: 1,
583
- timestamp: Date.now(),
584
- type: 'request',
585
- requestId: 'req123',
586
- path: 'test',
587
- role: MessageRole.CLIENT,
588
- targetId: server.id
589
- },
590
- origin,
591
- source: mockContentWindow as any
592
- })
593
- );
594
-
595
- await new Promise(resolve => setTimeout(resolve, 50));
596
-
597
- expect(console.info).toHaveBeenCalledWith(
598
- expect.stringContaining('[Server] Sending JSON Response'),
599
- expect.any(String),
600
- expect.any(String),
601
- expect.objectContaining({
602
- status: 200
603
- })
604
- );
605
-
606
- server.destroy();
607
- cleanupIframe(iframe);
608
- });
609
- });
610
- });