@adobe/uix-guest 0.6.5 → 0.7.1-nightly.20230114

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.
@@ -30,6 +30,206 @@ var AdobeUIXGuest = (() => {
30
30
  var require_dist = __commonJS({
31
31
  "../uix-core/dist/index.js"(exports) {
32
32
  "use strict";
33
+ var __create2 = Object.create;
34
+ var __defProp2 = Object.defineProperty;
35
+ var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor;
36
+ var __getOwnPropNames2 = Object.getOwnPropertyNames;
37
+ var __getProtoOf2 = Object.getPrototypeOf;
38
+ var __hasOwnProp2 = Object.prototype.hasOwnProperty;
39
+ var __commonJS2 = (cb, mod) => function __require() {
40
+ return mod || (0, cb[__getOwnPropNames2(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
41
+ };
42
+ var __copyProps2 = (to, from, except, desc) => {
43
+ if (from && typeof from === "object" || typeof from === "function") {
44
+ for (let key of __getOwnPropNames2(from))
45
+ if (!__hasOwnProp2.call(to, key) && key !== except)
46
+ __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable });
47
+ }
48
+ return to;
49
+ };
50
+ var __toESM2 = (mod, isNodeMode, target) => (target = mod != null ? __create2(__getProtoOf2(mod)) : {}, __copyProps2(
51
+ isNodeMode || !mod || !mod.__esModule ? __defProp2(target, "default", { value: mod, enumerable: true }) : target,
52
+ mod
53
+ ));
54
+ var require_eventemitter3 = __commonJS2({
55
+ "../../node_modules/eventemitter3/index.js"(exports2, module2) {
56
+ var has = Object.prototype.hasOwnProperty;
57
+ var prefix = "~";
58
+ function Events() {
59
+ }
60
+ if (Object.create) {
61
+ Events.prototype = /* @__PURE__ */ Object.create(null);
62
+ if (!new Events().__proto__)
63
+ prefix = false;
64
+ }
65
+ function EE(fn, context, once) {
66
+ this.fn = fn;
67
+ this.context = context;
68
+ this.once = once || false;
69
+ }
70
+ function addListener(emitter, event, fn, context, once) {
71
+ if (typeof fn !== "function") {
72
+ throw new TypeError("The listener must be a function");
73
+ }
74
+ var listener = new EE(fn, context || emitter, once), evt = prefix ? prefix + event : event;
75
+ if (!emitter._events[evt])
76
+ emitter._events[evt] = listener, emitter._eventsCount++;
77
+ else if (!emitter._events[evt].fn)
78
+ emitter._events[evt].push(listener);
79
+ else
80
+ emitter._events[evt] = [emitter._events[evt], listener];
81
+ return emitter;
82
+ }
83
+ function clearEvent(emitter, evt) {
84
+ if (--emitter._eventsCount === 0)
85
+ emitter._events = new Events();
86
+ else
87
+ delete emitter._events[evt];
88
+ }
89
+ function EventEmitter2() {
90
+ this._events = new Events();
91
+ this._eventsCount = 0;
92
+ }
93
+ EventEmitter2.prototype.eventNames = function eventNames() {
94
+ var names = [], events, name;
95
+ if (this._eventsCount === 0)
96
+ return names;
97
+ for (name in events = this._events) {
98
+ if (has.call(events, name))
99
+ names.push(prefix ? name.slice(1) : name);
100
+ }
101
+ if (Object.getOwnPropertySymbols) {
102
+ return names.concat(Object.getOwnPropertySymbols(events));
103
+ }
104
+ return names;
105
+ };
106
+ EventEmitter2.prototype.listeners = function listeners(event) {
107
+ var evt = prefix ? prefix + event : event, handlers = this._events[evt];
108
+ if (!handlers)
109
+ return [];
110
+ if (handlers.fn)
111
+ return [handlers.fn];
112
+ for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {
113
+ ee[i] = handlers[i].fn;
114
+ }
115
+ return ee;
116
+ };
117
+ EventEmitter2.prototype.listenerCount = function listenerCount(event) {
118
+ var evt = prefix ? prefix + event : event, listeners = this._events[evt];
119
+ if (!listeners)
120
+ return 0;
121
+ if (listeners.fn)
122
+ return 1;
123
+ return listeners.length;
124
+ };
125
+ EventEmitter2.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
126
+ var evt = prefix ? prefix + event : event;
127
+ if (!this._events[evt])
128
+ return false;
129
+ var listeners = this._events[evt], len = arguments.length, args, i;
130
+ if (listeners.fn) {
131
+ if (listeners.once)
132
+ this.removeListener(event, listeners.fn, void 0, true);
133
+ switch (len) {
134
+ case 1:
135
+ return listeners.fn.call(listeners.context), true;
136
+ case 2:
137
+ return listeners.fn.call(listeners.context, a1), true;
138
+ case 3:
139
+ return listeners.fn.call(listeners.context, a1, a2), true;
140
+ case 4:
141
+ return listeners.fn.call(listeners.context, a1, a2, a3), true;
142
+ case 5:
143
+ return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
144
+ case 6:
145
+ return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
146
+ }
147
+ for (i = 1, args = new Array(len - 1); i < len; i++) {
148
+ args[i - 1] = arguments[i];
149
+ }
150
+ listeners.fn.apply(listeners.context, args);
151
+ } else {
152
+ var length = listeners.length, j;
153
+ for (i = 0; i < length; i++) {
154
+ if (listeners[i].once)
155
+ this.removeListener(event, listeners[i].fn, void 0, true);
156
+ switch (len) {
157
+ case 1:
158
+ listeners[i].fn.call(listeners[i].context);
159
+ break;
160
+ case 2:
161
+ listeners[i].fn.call(listeners[i].context, a1);
162
+ break;
163
+ case 3:
164
+ listeners[i].fn.call(listeners[i].context, a1, a2);
165
+ break;
166
+ case 4:
167
+ listeners[i].fn.call(listeners[i].context, a1, a2, a3);
168
+ break;
169
+ default:
170
+ if (!args)
171
+ for (j = 1, args = new Array(len - 1); j < len; j++) {
172
+ args[j - 1] = arguments[j];
173
+ }
174
+ listeners[i].fn.apply(listeners[i].context, args);
175
+ }
176
+ }
177
+ }
178
+ return true;
179
+ };
180
+ EventEmitter2.prototype.on = function on(event, fn, context) {
181
+ return addListener(this, event, fn, context, false);
182
+ };
183
+ EventEmitter2.prototype.once = function once(event, fn, context) {
184
+ return addListener(this, event, fn, context, true);
185
+ };
186
+ EventEmitter2.prototype.removeListener = function removeListener(event, fn, context, once) {
187
+ var evt = prefix ? prefix + event : event;
188
+ if (!this._events[evt])
189
+ return this;
190
+ if (!fn) {
191
+ clearEvent(this, evt);
192
+ return this;
193
+ }
194
+ var listeners = this._events[evt];
195
+ if (listeners.fn) {
196
+ if (listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context)) {
197
+ clearEvent(this, evt);
198
+ }
199
+ } else {
200
+ for (var i = 0, events = [], length = listeners.length; i < length; i++) {
201
+ if (listeners[i].fn !== fn || once && !listeners[i].once || context && listeners[i].context !== context) {
202
+ events.push(listeners[i]);
203
+ }
204
+ }
205
+ if (events.length)
206
+ this._events[evt] = events.length === 1 ? events[0] : events;
207
+ else
208
+ clearEvent(this, evt);
209
+ }
210
+ return this;
211
+ };
212
+ EventEmitter2.prototype.removeAllListeners = function removeAllListeners(event) {
213
+ var evt;
214
+ if (event) {
215
+ evt = prefix ? prefix + event : event;
216
+ if (this._events[evt])
217
+ clearEvent(this, evt);
218
+ } else {
219
+ this._events = new Events();
220
+ this._eventsCount = 0;
221
+ }
222
+ return this;
223
+ };
224
+ EventEmitter2.prototype.off = EventEmitter2.prototype.removeListener;
225
+ EventEmitter2.prototype.addListener = EventEmitter2.prototype.on;
226
+ EventEmitter2.prefixed = prefix;
227
+ EventEmitter2.EventEmitter = EventEmitter2;
228
+ if ("undefined" !== typeof module2) {
229
+ module2.exports = EventEmitter2;
230
+ }
231
+ }
232
+ });
33
233
  var isDarkMode = () => typeof window.matchMedia === "function" && window.matchMedia("(prefers-color-scheme: dark)").matches;
34
234
  var Layouts = {
35
235
  medium: {
@@ -219,9 +419,9 @@ var AdobeUIXGuest = (() => {
219
419
  return logger;
220
420
  }
221
421
  var Emitter2 = class extends EventTarget {
222
- constructor(id2) {
422
+ constructor(id) {
223
423
  super();
224
- this.id = id2;
424
+ this.id = id;
225
425
  }
226
426
  emit(type, detail) {
227
427
  const event = new CustomEvent(type, { detail });
@@ -264,382 +464,706 @@ var AdobeUIXGuest = (() => {
264
464
  }
265
465
  });
266
466
  }
267
- function timeoutPromise2(timeoutMs, promise) {
268
- return new Promise((resolve, reject) => {
269
- const timeout = setTimeout(
270
- () => reject(new Error(`Timed out after ${timeoutMs}ms`)),
271
- timeoutMs
272
- );
273
- promise.then((result) => {
274
- clearTimeout(timeout);
275
- resolve(result);
276
- }).catch(reject);
277
- });
467
+ var NS_ROOT = "_$pg";
468
+ var VERSION = "0.7.0";
469
+ var INIT_CALLBACK = `${NS_ROOT}_init_cb`;
470
+ function isPlainObject(value) {
471
+ if (!value || typeof value !== "object") {
472
+ return false;
473
+ }
474
+ const proto = Reflect.getPrototypeOf(value);
475
+ return proto === null || proto === Object.prototype;
278
476
  }
279
- exports.Emitter = Emitter2;
280
- exports._customConsole = _customConsole;
281
- exports.debugEmitter = debugEmitter2;
282
- exports.makeNamespaceProxy = makeNamespaceProxy2;
283
- exports.quietConsole = quietConsole2;
284
- exports.timeoutPromise = timeoutPromise2;
285
- }
286
- });
287
-
288
- // src/index.ts
289
- var src_exports = {};
290
- __export(src_exports, {
291
- GuestServer: () => GuestServer,
292
- GuestUI: () => GuestUI,
293
- PrimaryGuest: () => GuestServer,
294
- UIGuest: () => GuestUI,
295
- attach: () => attach,
296
- createGuest: () => createGuest,
297
- register: () => register
298
- });
299
-
300
- // ../../node_modules/penpal/lib/enums.js
301
- var MessageType;
302
- (function(MessageType2) {
303
- MessageType2["Call"] = "call";
304
- MessageType2["Reply"] = "reply";
305
- MessageType2["Syn"] = "syn";
306
- MessageType2["SynAck"] = "synAck";
307
- MessageType2["Ack"] = "ack";
308
- })(MessageType || (MessageType = {}));
309
- var Resolution;
310
- (function(Resolution2) {
311
- Resolution2["Fulfilled"] = "fulfilled";
312
- Resolution2["Rejected"] = "rejected";
313
- })(Resolution || (Resolution = {}));
314
- var ErrorCode;
315
- (function(ErrorCode2) {
316
- ErrorCode2["ConnectionDestroyed"] = "ConnectionDestroyed";
317
- ErrorCode2["ConnectionTimeout"] = "ConnectionTimeout";
318
- ErrorCode2["NoIframeSrc"] = "NoIframeSrc";
319
- })(ErrorCode || (ErrorCode = {}));
320
- var NativeErrorName;
321
- (function(NativeErrorName2) {
322
- NativeErrorName2["DataCloneError"] = "DataCloneError";
323
- })(NativeErrorName || (NativeErrorName = {}));
324
- var NativeEventType;
325
- (function(NativeEventType2) {
326
- NativeEventType2["Message"] = "message";
327
- })(NativeEventType || (NativeEventType = {}));
328
-
329
- // ../../node_modules/penpal/lib/createDestructor.js
330
- var createDestructor_default = (localName, log) => {
331
- const callbacks = [];
332
- let destroyed = false;
333
- return {
334
- destroy(error) {
335
- if (!destroyed) {
336
- destroyed = true;
337
- log(`${localName}: Destroying connection`);
338
- callbacks.forEach((callback) => {
339
- callback(error);
340
- });
477
+ function isPrimitive(value) {
478
+ if (!value) {
479
+ return true;
341
480
  }
342
- },
343
- onDestroy(callback) {
344
- destroyed ? callback() : callbacks.push(callback);
481
+ const theType = typeof value;
482
+ return theType === "string" || theType === "number" || theType === "boolean";
345
483
  }
346
- };
347
- };
348
-
349
- // ../../node_modules/penpal/lib/createLogger.js
350
- var createLogger_default = (debug) => {
351
- return (...args) => {
352
- if (debug) {
353
- console.log("[Penpal]", ...args);
484
+ function isIterable(value) {
485
+ return Array.isArray(value);
354
486
  }
355
- };
356
- };
357
-
358
- // ../../node_modules/penpal/lib/errorSerialization.js
359
- var serializeError = ({ name, message, stack }) => ({
360
- name,
361
- message,
362
- stack
363
- });
364
- var deserializeError = (obj) => {
365
- const deserializedError = new Error();
366
- Object.keys(obj).forEach((key) => deserializedError[key] = obj[key]);
367
- return deserializedError;
368
- };
369
-
370
- // ../../node_modules/penpal/lib/connectCallReceiver.js
371
- var connectCallReceiver_default = (info, serializedMethods, log) => {
372
- const { localName, local, remote, originForSending, originForReceiving } = info;
373
- let destroyed = false;
374
- const handleMessageEvent = (event) => {
375
- if (event.source !== remote || event.data.penpal !== MessageType.Call) {
376
- return;
487
+ function hasProp(value, prop) {
488
+ return !isPrimitive(value) && Reflect.has(value, prop);
377
489
  }
378
- if (originForReceiving !== "*" && event.origin !== originForReceiving) {
379
- log(`${localName} received message from origin ${event.origin} which did not match expected origin ${originForReceiving}`);
380
- return;
490
+ function isIframe(value) {
491
+ if (!value || isPrimitive(value)) {
492
+ return false;
493
+ }
494
+ const { nodeName } = value;
495
+ return typeof nodeName === "string" && nodeName.toLowerCase() === "iframe";
496
+ }
497
+ function isObjectWithPrototype(value) {
498
+ if (!value || typeof value !== "object") {
499
+ return false;
500
+ }
501
+ const proto = Reflect.getPrototypeOf(value);
502
+ return proto !== Object.prototype;
503
+ }
504
+ function wrap(message) {
505
+ return { [NS_ROOT]: message };
506
+ }
507
+ function unwrap(wrappedMessage) {
508
+ return wrappedMessage[NS_ROOT];
381
509
  }
382
- const callMessage = event.data;
383
- const { methodName, args, id: id2 } = callMessage;
384
- log(`${localName}: Received ${methodName}() call`);
385
- const createPromiseHandler = (resolution) => {
386
- return (returnValue) => {
387
- log(`${localName}: Sending ${methodName}() reply`);
388
- if (destroyed) {
389
- log(`${localName}: Unable to send ${methodName}() reply due to destroyed connection`);
390
- return;
391
- }
392
- const message = {
393
- penpal: MessageType.Reply,
394
- id: id2,
395
- resolution,
396
- returnValue
510
+ function isWrapped(item) {
511
+ if (!isPlainObject(item)) {
512
+ return false;
513
+ }
514
+ const keys = Object.keys(item);
515
+ const hasRoot = keys.includes(NS_ROOT);
516
+ if (hasRoot && keys.length != 1) {
517
+ console.error(
518
+ `malformed tunnel message, should have one prop "${NS_ROOT}" at root`,
519
+ item
520
+ );
521
+ return false;
522
+ }
523
+ return hasRoot;
524
+ }
525
+ var NOT_TRANSFORMED = Symbol.for("NOT_TRANSFORMED");
526
+ var CIRCULAR = "[[Circular]]";
527
+ function transformRecursive(transform, value, parent, _refs = /* @__PURE__ */ new WeakSet()) {
528
+ if (isPrimitive(value)) {
529
+ return value;
530
+ }
531
+ const transformed = transform(value, parent);
532
+ if (transformed !== NOT_TRANSFORMED) {
533
+ return transformed;
534
+ }
535
+ if (isIterable(value)) {
536
+ const outArray = [];
537
+ for (const item of value) {
538
+ outArray.push(transformRecursive(transform, item, void 0, _refs));
539
+ }
540
+ return outArray;
541
+ }
542
+ if (isPlainObject(value)) {
543
+ if (_refs.has(value)) {
544
+ return CIRCULAR;
545
+ }
546
+ _refs.add(value);
547
+ const outObj = {};
548
+ for (const key of Reflect.ownKeys(value)) {
549
+ Reflect.set(
550
+ outObj,
551
+ key,
552
+ transformRecursive(transform, Reflect.get(value, key), void 0, _refs)
553
+ );
554
+ }
555
+ return outObj;
556
+ }
557
+ if (isObjectWithPrototype(value)) {
558
+ if (_refs.has(value)) {
559
+ return CIRCULAR;
560
+ }
561
+ _refs.add(value);
562
+ const getObjectKeys = (obj) => {
563
+ const result = /* @__PURE__ */ new Set();
564
+ do {
565
+ if (Reflect.getPrototypeOf(obj) !== null) {
566
+ for (const prop of Object.getOwnPropertyNames(obj)) {
567
+ if (prop === "constructor") {
568
+ continue;
569
+ }
570
+ result.add(prop);
571
+ }
572
+ }
573
+ } while (obj = Reflect.getPrototypeOf(obj));
574
+ return [...result];
397
575
  };
398
- if (resolution === Resolution.Rejected && returnValue instanceof Error) {
399
- message.returnValue = serializeError(returnValue);
400
- message.returnValueIsError = true;
576
+ const outObj = {};
577
+ const properties = getObjectKeys(value);
578
+ for (const key of properties) {
579
+ Reflect.set(
580
+ outObj,
581
+ key,
582
+ transformRecursive(transform, Reflect.get(value, key), value, _refs)
583
+ );
401
584
  }
585
+ return outObj;
586
+ }
587
+ throw new Error(`Bad value! ${Object.prototype.toString.call(value)}`);
588
+ }
589
+ function receiveCalls(fn, ticket, remote) {
590
+ const responder = async ({ fnId, callId, args }) => {
402
591
  try {
403
- remote.postMessage(message, originForSending);
404
- } catch (err) {
405
- if (err.name === NativeErrorName.DataCloneError) {
406
- const errorReplyMessage = {
407
- penpal: MessageType.Reply,
408
- id: id2,
409
- resolution: Resolution.Rejected,
410
- returnValue: serializeError(err),
411
- returnValueIsError: true
412
- };
413
- remote.postMessage(errorReplyMessage, originForSending);
414
- }
415
- throw err;
592
+ const value = await fn(...args);
593
+ remote.deref().respond({
594
+ fnId,
595
+ callId,
596
+ value,
597
+ status: "resolve"
598
+ });
599
+ } catch (error) {
600
+ remote.deref().respond({
601
+ fnId,
602
+ callId,
603
+ status: "reject",
604
+ error
605
+ });
416
606
  }
417
607
  };
418
- };
419
- new Promise((resolve) => resolve(serializedMethods[methodName].apply(serializedMethods, args))).then(createPromiseHandler(Resolution.Fulfilled), createPromiseHandler(Resolution.Rejected));
420
- };
421
- local.addEventListener(NativeEventType.Message, handleMessageEvent);
422
- return () => {
423
- destroyed = true;
424
- local.removeEventListener(NativeEventType.Message, handleMessageEvent);
425
- };
426
- };
427
-
428
- // ../../node_modules/penpal/lib/generateId.js
429
- var id = 0;
430
- var generateId_default = () => ++id;
431
-
432
- // ../../node_modules/penpal/lib/methodSerialization.js
433
- var KEY_PATH_DELIMITER = ".";
434
- var keyPathToSegments = (keyPath) => keyPath ? keyPath.split(KEY_PATH_DELIMITER) : [];
435
- var segmentsToKeyPath = (segments) => segments.join(KEY_PATH_DELIMITER);
436
- var createKeyPath = (key, prefix) => {
437
- const segments = keyPathToSegments(prefix || "");
438
- segments.push(key);
439
- return segmentsToKeyPath(segments);
440
- };
441
- var setAtKeyPath = (subject, keyPath, value) => {
442
- const segments = keyPathToSegments(keyPath);
443
- segments.reduce((prevSubject, key, idx) => {
444
- if (typeof prevSubject[key] === "undefined") {
445
- prevSubject[key] = {};
608
+ return remote.deref().onCall(ticket, responder);
446
609
  }
447
- if (idx === segments.length - 1) {
448
- prevSubject[key] = value;
610
+ var DisconnectionError = class extends Error {
611
+ constructor() {
612
+ super(
613
+ "Function belongs to a simulated remote object which has been disconnected! The tunnel may have been destroyed by page navigation or reload."
614
+ );
615
+ }
616
+ };
617
+ function dispatch(subject, callTicket, rejectionPool, resolve, reject) {
618
+ subject.onRespond(callTicket, (responseTicket) => {
619
+ rejectionPool.delete(reject);
620
+ if (responseTicket.status === "resolve") {
621
+ resolve(responseTicket.value);
622
+ } else {
623
+ reject(responseTicket.error);
624
+ }
625
+ });
626
+ subject.send(callTicket);
449
627
  }
450
- return prevSubject[key];
451
- }, subject);
452
- return subject;
453
- };
454
- var serializeMethods = (methods, prefix) => {
455
- const flattenedMethods = {};
456
- Object.keys(methods).forEach((key) => {
457
- const value = methods[key];
458
- const keyPath = createKeyPath(key, prefix);
459
- if (typeof value === "object") {
460
- Object.assign(flattenedMethods, serializeMethods(value, keyPath));
628
+ function makeCallSender({ fnId }, subjectRef) {
629
+ let callCounter = 0;
630
+ const rejectionPool = /* @__PURE__ */ new Set();
631
+ let sender = function(...args) {
632
+ return new Promise((resolve, reject) => {
633
+ rejectionPool.add(reject);
634
+ const callId = ++callCounter;
635
+ const callTicket = {
636
+ fnId,
637
+ callId,
638
+ args
639
+ };
640
+ return dispatch(
641
+ subjectRef.deref(),
642
+ callTicket,
643
+ rejectionPool,
644
+ resolve,
645
+ reject
646
+ );
647
+ });
648
+ };
649
+ const destroy = () => {
650
+ subjectRef = null;
651
+ sender = () => {
652
+ throw new DisconnectionError();
653
+ };
654
+ for (const reject of rejectionPool) {
655
+ reject(new DisconnectionError());
656
+ }
657
+ rejectionPool.clear();
658
+ };
659
+ subjectRef.deref().onDestroyed(destroy);
660
+ const facade = async function(...args) {
661
+ return sender(...args);
662
+ };
663
+ Object.defineProperty(facade, "name", { value: fnId });
664
+ return facade;
461
665
  }
462
- if (typeof value === "function") {
463
- flattenedMethods[keyPath] = value;
666
+ var RemoteSubject = class {
667
+ constructor(emitter, simulator) {
668
+ this.emitter = emitter;
669
+ this.simulator = simulator;
670
+ }
671
+ notifyCleanup(ticket) {
672
+ return this.emitter.emit(`${ticket.fnId}_g`, {});
673
+ }
674
+ notifyConnect() {
675
+ return this.emitter.emit("connected");
676
+ }
677
+ notifyDestroy() {
678
+ return this.emitter.emit("destroyed");
679
+ }
680
+ onCall(ticket, handler) {
681
+ return this.subscribe(
682
+ `${ticket.fnId}_c`,
683
+ (ticket2) => handler(this.processCallTicket(ticket2, this.simulator.materialize))
684
+ );
685
+ }
686
+ onConnected(handler) {
687
+ return this.subscribe("connected", handler);
688
+ }
689
+ onDestroyed(handler) {
690
+ return this.subscribe("destroyed", handler);
691
+ }
692
+ onOutOfScope(ticket, handler) {
693
+ return this.subscribeOnce(`${ticket.fnId}_g`, handler);
694
+ }
695
+ onRespond(ticket, handler) {
696
+ const fnAndCall = `${ticket.fnId}${ticket.callId}`;
697
+ return this.subscribeOnce(
698
+ `${fnAndCall}_r`,
699
+ (ticket2) => handler(this.processResponseTicket(ticket2, this.simulator.materialize))
700
+ );
701
+ }
702
+ respond(ticket) {
703
+ const fnAndCall = `${ticket.fnId}${ticket.callId}`;
704
+ return this.emitter.emit(
705
+ `${fnAndCall}_r`,
706
+ this.processResponseTicket(ticket, this.simulator.simulate)
707
+ );
708
+ }
709
+ send(ticket) {
710
+ return this.emitter.emit(
711
+ `${ticket.fnId}_c`,
712
+ this.processCallTicket(ticket, this.simulator.simulate)
713
+ );
714
+ }
715
+ processCallTicket({ args, ...ticket }, mapper) {
716
+ return {
717
+ ...ticket,
718
+ args: args.map(mapper)
719
+ };
720
+ }
721
+ processResponseTicket(ticket, mapper) {
722
+ return ticket.status === "resolve" ? { ...ticket, value: mapper(ticket.value) } : ticket;
723
+ }
724
+ subscribe(type, handler) {
725
+ this.emitter.on(type, handler);
726
+ return () => {
727
+ this.emitter.off(type, handler);
728
+ };
729
+ }
730
+ subscribeOnce(type, handler) {
731
+ const once = (arg) => {
732
+ this.emitter.off(type, once);
733
+ handler(arg);
734
+ };
735
+ return this.subscribe(type, once);
736
+ }
737
+ };
738
+ function isDefMessage(value) {
739
+ return isWrapped(value) && hasProp(unwrap(value), "fnId");
464
740
  }
465
- });
466
- return flattenedMethods;
467
- };
468
- var deserializeMethods = (flattenedMethods) => {
469
- const methods = {};
470
- for (const keyPath in flattenedMethods) {
471
- setAtKeyPath(methods, keyPath, flattenedMethods[keyPath]);
472
- }
473
- return methods;
474
- };
475
-
476
- // ../../node_modules/penpal/lib/connectCallSender.js
477
- var connectCallSender_default = (callSender, info, methodKeyPaths, destroyConnection, log) => {
478
- const { localName, local, remote, originForSending, originForReceiving } = info;
479
- let destroyed = false;
480
- log(`${localName}: Connecting call sender`);
481
- const createMethodProxy = (methodName) => {
482
- return (...args) => {
483
- log(`${localName}: Sending ${methodName}() call`);
484
- let iframeRemoved;
485
- try {
486
- if (remote.closed) {
487
- iframeRemoved = true;
741
+ var bindAll = (inst, methods) => {
742
+ for (const methodName of methods) {
743
+ const method = inst[methodName];
744
+ if (typeof method === "function") {
745
+ inst[methodName] = method.bind(inst);
488
746
  }
489
- } catch (e) {
490
- iframeRemoved = true;
491
747
  }
492
- if (iframeRemoved) {
493
- destroyConnection();
748
+ };
749
+ var ObjectSimulator = class {
750
+ constructor(subject, cleanupNotifier) {
751
+ this.fnCounter = 0;
752
+ this.receiverTicketCache = /* @__PURE__ */ new WeakMap();
753
+ this.senderCache = /* @__PURE__ */ new WeakMap();
754
+ this.cleanupNotifier = cleanupNotifier;
755
+ this.subject = subject;
756
+ bindAll(this, ["makeSender", "makeReceiver", "simulate", "materialize"]);
494
757
  }
495
- if (destroyed) {
496
- const error = new Error(`Unable to send ${methodName}() call due to destroyed connection`);
497
- error.code = ErrorCode.ConnectionDestroyed;
498
- throw error;
758
+ static create(emitter, Cleanup) {
759
+ let simulator;
760
+ const simulatorInterface = {
761
+ simulate: (x) => simulator.simulate(x),
762
+ materialize: (x) => simulator.materialize(x)
763
+ };
764
+ const subject = new RemoteSubject(emitter, simulatorInterface);
765
+ const cleanupNotifier = new Cleanup((fnId) => {
766
+ return subject.notifyCleanup({ fnId });
767
+ });
768
+ simulator = new ObjectSimulator(subject, cleanupNotifier);
769
+ return simulator;
499
770
  }
500
- return new Promise((resolve, reject) => {
501
- const id2 = generateId_default();
502
- const handleMessageEvent = (event) => {
503
- if (event.source !== remote || event.data.penpal !== MessageType.Reply || event.data.id !== id2) {
504
- return;
505
- }
506
- if (originForReceiving !== "*" && event.origin !== originForReceiving) {
507
- log(`${localName} received message from origin ${event.origin} which did not match expected origin ${originForReceiving}`);
508
- return;
771
+ makeReceiver(fn, parent) {
772
+ if (typeof fn !== "function") {
773
+ return NOT_TRANSFORMED;
774
+ }
775
+ let fnTicket = this.receiverTicketCache.get(fn);
776
+ if (!fnTicket) {
777
+ fnTicket = {
778
+ fnId: `${fn.name || "<anonymous>"}_${++this.fnCounter}`
779
+ };
780
+ let boundFunction = fn;
781
+ if (parent) {
782
+ boundFunction = fn.bind(parent);
509
783
  }
510
- const replyMessage = event.data;
511
- log(`${localName}: Received ${methodName}() reply`);
512
- local.removeEventListener(NativeEventType.Message, handleMessageEvent);
513
- let returnValue = replyMessage.returnValue;
514
- if (replyMessage.returnValueIsError) {
515
- returnValue = deserializeError(returnValue);
784
+ const cleanup = receiveCalls(
785
+ boundFunction,
786
+ fnTicket,
787
+ new WeakRef(this.subject)
788
+ );
789
+ this.subject.onOutOfScope(fnTicket, cleanup);
790
+ this.receiverTicketCache.set(boundFunction, fnTicket);
791
+ }
792
+ return wrap(fnTicket);
793
+ }
794
+ makeSender(message) {
795
+ if (!isDefMessage(message)) {
796
+ return NOT_TRANSFORMED;
797
+ }
798
+ const ticket = unwrap(message);
799
+ if (!this.senderCache.has(ticket)) {
800
+ const sender = makeCallSender(ticket, new WeakRef(this.subject));
801
+ this.cleanupNotifier.register(sender, ticket.fnId, sender);
802
+ this.senderCache.set(ticket, sender);
803
+ return sender;
804
+ } else {
805
+ return this.senderCache.get(ticket);
806
+ }
807
+ }
808
+ materialize(simulated) {
809
+ return transformRecursive(
810
+ this.makeSender,
811
+ simulated
812
+ );
813
+ }
814
+ simulate(localObject) {
815
+ return transformRecursive(
816
+ this.makeReceiver,
817
+ localObject
818
+ );
819
+ }
820
+ };
821
+ function timeoutPromise2(description, promise, ms, onReject) {
822
+ return new Promise((resolve, reject) => {
823
+ const cleanupAndReject = async (e) => {
824
+ try {
825
+ await onReject(e);
826
+ } finally {
827
+ reject(e);
516
828
  }
517
- (replyMessage.resolution === Resolution.Fulfilled ? resolve : reject)(returnValue);
518
- };
519
- local.addEventListener(NativeEventType.Message, handleMessageEvent);
520
- const callMessage = {
521
- penpal: MessageType.Call,
522
- id: id2,
523
- methodName,
524
- args
525
829
  };
526
- remote.postMessage(callMessage, originForSending);
830
+ const timeout = setTimeout(() => {
831
+ cleanupAndReject(new Error(`${description} timed out after ${ms}ms`));
832
+ }, ms);
833
+ promise.then((result) => {
834
+ clearTimeout(timeout);
835
+ resolve(result);
836
+ }).catch((e) => {
837
+ clearTimeout(timeout);
838
+ cleanupAndReject(e);
839
+ });
527
840
  });
528
- };
529
- };
530
- const flattenedMethods = methodKeyPaths.reduce((api, name) => {
531
- api[name] = createMethodProxy(name);
532
- return api;
533
- }, {});
534
- Object.assign(callSender, deserializeMethods(flattenedMethods));
535
- return () => {
536
- destroyed = true;
537
- };
538
- };
539
-
540
- // ../../node_modules/penpal/lib/startConnectionTimeout.js
541
- var startConnectionTimeout_default = (timeout, callback) => {
542
- let timeoutId;
543
- if (timeout !== void 0) {
544
- timeoutId = window.setTimeout(() => {
545
- const error = new Error(`Connection timed out after ${timeout}ms`);
546
- error.code = ErrorCode.ConnectionTimeout;
547
- callback(error);
548
- }, timeout);
549
- }
550
- return () => {
551
- clearTimeout(timeoutId);
552
- };
553
- };
554
-
555
- // ../../node_modules/penpal/lib/child/handleSynAckMessageFactory.js
556
- var handleSynAckMessageFactory_default = (parentOrigin, serializedMethods, destructor, log) => {
557
- const { destroy, onDestroy } = destructor;
558
- return (event) => {
559
- let originQualifies = parentOrigin instanceof RegExp ? parentOrigin.test(event.origin) : parentOrigin === "*" || parentOrigin === event.origin;
560
- if (!originQualifies) {
561
- log(`Child: Handshake - Received SYN-ACK from origin ${event.origin} which did not match expected origin ${parentOrigin}`);
562
- return;
563
841
  }
564
- log("Child: Handshake - Received SYN-ACK, responding with ACK");
565
- const originForSending = event.origin === "null" ? "*" : event.origin;
566
- const ackMessage = {
567
- penpal: MessageType.Ack,
568
- methodNames: Object.keys(serializedMethods)
569
- };
570
- window.parent.postMessage(ackMessage, originForSending);
571
- const info = {
572
- localName: "Child",
573
- local: window,
574
- remote: window.parent,
575
- originForSending,
576
- originForReceiving: event.origin
842
+ var INIT_TICKET = {
843
+ fnId: INIT_CALLBACK
577
844
  };
578
- const destroyCallReceiver = connectCallReceiver_default(info, serializedMethods, log);
579
- onDestroy(destroyCallReceiver);
580
- const callSender = {};
581
- const destroyCallSender = connectCallSender_default(callSender, info, event.data.methodNames, destroy, log);
582
- onDestroy(destroyCallSender);
583
- return callSender;
584
- };
585
- };
586
-
587
- // ../../node_modules/penpal/lib/child/connectToParent.js
588
- var areGlobalsAccessible = () => {
589
- try {
590
- clearTimeout();
591
- } catch (e) {
592
- return false;
593
- }
594
- return true;
595
- };
596
- var connectToParent_default = (options = {}) => {
597
- const { parentOrigin = "*", methods = {}, timeout, debug = false } = options;
598
- const log = createLogger_default(debug);
599
- const destructor = createDestructor_default("Child", log);
600
- const { destroy, onDestroy } = destructor;
601
- const serializedMethods = serializeMethods(methods);
602
- const handleSynAckMessage = handleSynAckMessageFactory_default(parentOrigin, serializedMethods, destructor, log);
603
- const sendSynMessage = () => {
604
- log("Child: Handshake - Sending SYN");
605
- const synMessage = { penpal: MessageType.Syn };
606
- const parentOriginForSyn = parentOrigin instanceof RegExp ? "*" : parentOrigin;
607
- window.parent.postMessage(synMessage, parentOriginForSyn);
608
- };
609
- const promise = new Promise((resolve, reject) => {
610
- const stopConnectionTimeout = startConnectionTimeout_default(timeout, destroy);
611
- const handleMessage = (event) => {
612
- if (!areGlobalsAccessible()) {
613
- return;
614
- }
615
- if (event.source !== parent || !event.data) {
616
- return;
617
- }
618
- if (event.data.penpal === MessageType.SynAck) {
619
- const callSender = handleSynAckMessage(event);
620
- if (callSender) {
621
- window.removeEventListener(NativeEventType.Message, handleMessage);
622
- stopConnectionTimeout();
623
- resolve(callSender);
845
+ var import_eventemitter3 = __toESM2(require_eventemitter3());
846
+ var TunnelMessenger = class {
847
+ constructor(opts) {
848
+ this.versionWarnings = /* @__PURE__ */ new Set();
849
+ this.myOrigin = opts.myOrigin;
850
+ this.remoteOrigin = opts.targetOrigin === "*" ? "remote document" : opts.targetOrigin;
851
+ this.logger = opts.logger;
852
+ }
853
+ resetWarnings() {
854
+ this.versionWarnings.clear();
855
+ }
856
+ makeAccepted(id) {
857
+ return wrap({
858
+ accepts: id,
859
+ version: VERSION
860
+ });
861
+ }
862
+ makeOffered(id) {
863
+ return wrap({
864
+ offers: id,
865
+ version: VERSION
866
+ });
867
+ }
868
+ isHandshakeAccepting(message, id) {
869
+ return this.isHandshake(message) && unwrap(message).accepts === id;
870
+ }
871
+ isHandshakeOffer(message) {
872
+ return this.isHandshake(message) && typeof unwrap(message).offers === "string";
873
+ }
874
+ isHandshake(message) {
875
+ if (!isWrapped(message)) {
876
+ this.logMalformed(message);
877
+ return false;
878
+ }
879
+ const tunnelData = unwrap(
880
+ message
881
+ );
882
+ if (!isPlainObject(tunnelData) || typeof tunnelData.version !== "string" || !(Reflect.has(tunnelData, "accepts") || Reflect.has(tunnelData, "offers"))) {
883
+ this.logMalformed(message);
884
+ return false;
885
+ }
886
+ const { version } = tunnelData;
887
+ if (version !== VERSION && !this.versionWarnings.has(version)) {
888
+ this.versionWarnings.add(version);
889
+ this.logger.warn(
890
+ `SDK version mismatch. ${this.myOrigin} is using v${VERSION}, but received message from ${this.remoteOrigin} using SDK v${version}. Extensions may be broken or unresponsive.`
891
+ );
624
892
  }
893
+ return true;
894
+ }
895
+ logMalformed(message) {
896
+ let inspectedMessage;
897
+ try {
898
+ inspectedMessage = JSON.stringify(message, null, 2);
899
+ } catch (_) {
900
+ try {
901
+ inspectedMessage = message.toString();
902
+ } catch (e) {
903
+ inspectedMessage = Object.prototype.toString.call(message);
904
+ }
905
+ }
906
+ this.logger.error(
907
+ `Malformed tunnel message sent from SDK at ${this.remoteOrigin} to ${this.myOrigin}:
908
+ ${inspectedMessage}
909
+ Message must be an object with "${NS_ROOT}" property, which must be an object with a "version" string and an either an "accepts" or "offers" property containing an ID string.`
910
+ );
625
911
  }
626
912
  };
627
- window.addEventListener(NativeEventType.Message, handleMessage);
628
- sendSynMessage();
629
- onDestroy((error) => {
630
- window.removeEventListener(NativeEventType.Message, handleMessage);
631
- if (error) {
632
- reject(error);
913
+ var RETRY_MS = 100;
914
+ var STATUSCHECK_MS = 5e3;
915
+ var KEY_BASE = 36;
916
+ var KEY_LENGTH = 8;
917
+ var KEY_EXP = KEY_BASE ** KEY_LENGTH;
918
+ var makeKey = () => Math.round(Math.random() * KEY_EXP).toString(KEY_BASE);
919
+ var badTimeout = "\n - timeout value must be a number of milliseconds";
920
+ var badTargetOrigin = "\n - targetOrigin must be a valid URL origin or '*' for any origin";
921
+ function isFromOrigin(event, source, targetOrigin) {
922
+ try {
923
+ return source === event.source && (targetOrigin === "*" || targetOrigin === new URL(event.origin).origin);
924
+ } catch (_) {
925
+ return false;
633
926
  }
634
- });
635
- });
636
- return {
637
- promise,
638
- destroy() {
639
- destroy();
640
927
  }
641
- };
642
- };
928
+ var { emit: emitOn } = import_eventemitter3.default.prototype;
929
+ var Tunnel = class extends import_eventemitter3.default {
930
+ constructor(config) {
931
+ super();
932
+ this.emitLocal = (type, payload) => {
933
+ return emitOn.call(this, type, payload);
934
+ };
935
+ this._emitFromMessage = ({ data: { type, payload } }) => {
936
+ this.emitLocal(type, payload);
937
+ };
938
+ this.config = config;
939
+ }
940
+ static toIframe(target, options) {
941
+ if (!isIframe(target)) {
942
+ throw new Error(
943
+ `Provided tunnel target is not an iframe! ${Object.prototype.toString.call(
944
+ target
945
+ )}`
946
+ );
947
+ }
948
+ const source = target.contentWindow;
949
+ const config = Tunnel._normalizeConfig(options);
950
+ const tunnel = new Tunnel(config);
951
+ const messenger = new TunnelMessenger({
952
+ myOrigin: window.location.origin,
953
+ targetOrigin: options.targetOrigin,
954
+ logger: options.logger || console
955
+ });
956
+ let frameStatusCheck;
957
+ let timeout;
958
+ const offerListener = (event) => {
959
+ if (isFromOrigin(event, source, config.targetOrigin) && messenger.isHandshakeOffer(event.data)) {
960
+ const accepted = messenger.makeAccepted(unwrap(event.data).offers);
961
+ const channel = new MessageChannel();
962
+ source.postMessage(accepted, config.targetOrigin, [channel.port1]);
963
+ tunnel.connect(channel.port2);
964
+ }
965
+ };
966
+ const cleanup = () => {
967
+ clearTimeout(timeout);
968
+ clearInterval(frameStatusCheck);
969
+ window.removeEventListener("message", offerListener);
970
+ };
971
+ timeout = window.setTimeout(() => {
972
+ tunnel.emitLocal(
973
+ "error",
974
+ new Error(
975
+ `Timed out awaiting initial message from iframe after ${config.timeout}ms`
976
+ )
977
+ );
978
+ tunnel.destroy();
979
+ }, config.timeout);
980
+ tunnel.on("destroyed", cleanup);
981
+ tunnel.on("connected", () => clearTimeout(timeout));
982
+ frameStatusCheck = window.setInterval(() => {
983
+ if (!target.isConnected) {
984
+ tunnel.destroy();
985
+ }
986
+ }, STATUSCHECK_MS);
987
+ window.addEventListener("message", offerListener);
988
+ return tunnel;
989
+ }
990
+ static toParent(source, opts) {
991
+ let retrying;
992
+ let timeout;
993
+ const key = makeKey();
994
+ const config = Tunnel._normalizeConfig(opts);
995
+ const tunnel = new Tunnel(config);
996
+ const messenger = new TunnelMessenger({
997
+ myOrigin: window.location.origin,
998
+ targetOrigin: config.targetOrigin,
999
+ logger: config.logger
1000
+ });
1001
+ const acceptListener = (event) => {
1002
+ if (isFromOrigin(event, source, config.targetOrigin) && messenger.isHandshakeAccepting(event.data, key)) {
1003
+ cleanup();
1004
+ if (!event.ports || !event.ports.length) {
1005
+ const portError = new Error(
1006
+ "Received handshake accept message, but it did not include a MessagePort to establish tunnel"
1007
+ );
1008
+ tunnel.emitLocal("error", portError);
1009
+ return;
1010
+ }
1011
+ tunnel.connect(event.ports[0]);
1012
+ }
1013
+ };
1014
+ const cleanup = () => {
1015
+ clearInterval(retrying);
1016
+ clearTimeout(timeout);
1017
+ window.removeEventListener("message", acceptListener);
1018
+ };
1019
+ timeout = window.setTimeout(() => {
1020
+ tunnel.emitLocal(
1021
+ "error",
1022
+ new Error(
1023
+ `Timed out waiting for initial response from parent after ${config.timeout}ms`
1024
+ )
1025
+ );
1026
+ tunnel.destroy();
1027
+ }, config.timeout);
1028
+ window.addEventListener("message", acceptListener);
1029
+ tunnel.on("destroyed", cleanup);
1030
+ tunnel.on("connected", cleanup);
1031
+ const sendOffer = () => source.postMessage(messenger.makeOffered(key), config.targetOrigin);
1032
+ retrying = window.setInterval(sendOffer, RETRY_MS);
1033
+ sendOffer();
1034
+ return tunnel;
1035
+ }
1036
+ connect(remote) {
1037
+ if (this._messagePort) {
1038
+ this._messagePort.removeEventListener("message", this._emitFromMessage);
1039
+ this._messagePort.close();
1040
+ }
1041
+ this._messagePort = remote;
1042
+ remote.addEventListener("message", this._emitFromMessage);
1043
+ this.emit("connected");
1044
+ this._messagePort.start();
1045
+ }
1046
+ destroy() {
1047
+ if (this._messagePort) {
1048
+ this._messagePort.close();
1049
+ this._messagePort = null;
1050
+ }
1051
+ this.emitLocal("destroyed");
1052
+ this.emit("destroyed");
1053
+ }
1054
+ emit(type, payload) {
1055
+ if (!this._messagePort) {
1056
+ return false;
1057
+ }
1058
+ this._messagePort.postMessage({ type, payload });
1059
+ return true;
1060
+ }
1061
+ static _normalizeConfig(options = {}) {
1062
+ let errorMessage = "";
1063
+ const config = {
1064
+ timeout: 4e3,
1065
+ logger: console,
1066
+ ...options
1067
+ };
1068
+ const timeoutMs = Number(config.timeout);
1069
+ if (!Number.isSafeInteger(timeoutMs)) {
1070
+ errorMessage += badTimeout;
1071
+ }
1072
+ if (config.targetOrigin !== "*") {
1073
+ try {
1074
+ new URL(config.targetOrigin);
1075
+ } catch (e) {
1076
+ errorMessage += badTargetOrigin;
1077
+ }
1078
+ }
1079
+ if (errorMessage) {
1080
+ throw new Error(`Invalid tunnel configuration: ${errorMessage}`);
1081
+ }
1082
+ return config;
1083
+ }
1084
+ };
1085
+ var INIT_MESSAGE = wrap(INIT_TICKET);
1086
+ async function setupApiExchange(tunnel, apiToSend) {
1087
+ let done = false;
1088
+ let remoteApi;
1089
+ const xrObject = {
1090
+ tunnel,
1091
+ getRemoteApi() {
1092
+ return remoteApi;
1093
+ }
1094
+ };
1095
+ return timeoutPromise2(
1096
+ "Initial API exchange",
1097
+ new Promise((resolve, reject) => {
1098
+ const simulator = ObjectSimulator.create(tunnel, FinalizationRegistry);
1099
+ const sendApi = simulator.makeSender(INIT_MESSAGE);
1100
+ const apiCallback = (api) => {
1101
+ remoteApi = api;
1102
+ if (!done) {
1103
+ done = true;
1104
+ resolve(xrObject);
1105
+ }
1106
+ };
1107
+ tunnel.on("api", apiCallback);
1108
+ const unsubscribe = receiveCalls(
1109
+ (api) => tunnel.emitLocal("api", api),
1110
+ INIT_TICKET,
1111
+ new WeakRef(simulator.subject)
1112
+ );
1113
+ const destroy = (e) => {
1114
+ unsubscribe();
1115
+ if (!done) {
1116
+ done = true;
1117
+ reject(e);
1118
+ }
1119
+ };
1120
+ tunnel.on("destroyed", destroy);
1121
+ tunnel.on(
1122
+ "connected",
1123
+ () => sendApi(apiToSend).catch(destroy)
1124
+ );
1125
+ }),
1126
+ tunnel.config.timeout,
1127
+ () => tunnel.destroy()
1128
+ );
1129
+ }
1130
+ async function connectParentWindow2(tunnelOptions, apiToSend) {
1131
+ const tunnel = Tunnel.toParent(window.parent, tunnelOptions);
1132
+ return setupApiExchange(tunnel, apiToSend);
1133
+ }
1134
+ async function connectIframe(frame, tunnelOptions, apiToSend) {
1135
+ const tunnel = Tunnel.toIframe(frame, tunnelOptions);
1136
+ return setupApiExchange(tunnel, apiToSend);
1137
+ }
1138
+ function wait(ms) {
1139
+ return new Promise((resolve) => {
1140
+ setTimeout(resolve, ms);
1141
+ });
1142
+ }
1143
+ exports.Emitter = Emitter2;
1144
+ exports.Tunnel = Tunnel;
1145
+ exports._customConsole = _customConsole;
1146
+ exports.connectIframe = connectIframe;
1147
+ exports.connectParentWindow = connectParentWindow2;
1148
+ exports.debugEmitter = debugEmitter2;
1149
+ exports.makeNamespaceProxy = makeNamespaceProxy2;
1150
+ exports.quietConsole = quietConsole2;
1151
+ exports.timeoutPromise = timeoutPromise2;
1152
+ exports.wait = wait;
1153
+ }
1154
+ });
1155
+
1156
+ // src/index.ts
1157
+ var src_exports = {};
1158
+ __export(src_exports, {
1159
+ GuestServer: () => GuestServer,
1160
+ GuestUI: () => GuestUI,
1161
+ PrimaryGuest: () => GuestServer,
1162
+ UIGuest: () => GuestUI,
1163
+ attach: () => attach,
1164
+ createGuest: () => createGuest,
1165
+ register: () => register
1166
+ });
643
1167
 
644
1168
  // src/guest.ts
645
1169
  var import_uix_core2 = __toESM(require_dist());
@@ -681,14 +1205,18 @@ var AdobeUIXGuest = (() => {
681
1205
  var Guest2 = class extends import_uix_core2.Emitter {
682
1206
  constructor(config) {
683
1207
  super(config.id);
684
- this.debugLogger = import_uix_core2.quietConsole;
1208
+ this.logger = import_uix_core2.quietConsole;
685
1209
  this.host = (0, import_uix_core2.makeNamespaceProxy)(
686
1210
  async (address) => {
687
1211
  await this.hostConnectionPromise;
688
1212
  try {
689
1213
  const result = await (0, import_uix_core2.timeoutPromise)(
1214
+ `Calling host method ${address.path.join(".")}${address.name}(...)`,
1215
+ this.hostConnection.getRemoteApi().invokeHostMethod(address),
690
1216
  1e4,
691
- this.hostConnection.invokeHostMethod(address)
1217
+ (e) => {
1218
+ this.logger.error(e);
1219
+ }
692
1220
  );
693
1221
  return result;
694
1222
  } catch (e) {
@@ -696,7 +1224,7 @@ var AdobeUIXGuest = (() => {
696
1224
  const methodError = new Error(
697
1225
  `Host method call host.${address.path.join(".")}() failed: ${error.message}`
698
1226
  );
699
- this.debugLogger.error(methodError);
1227
+ this.logger.error(methodError);
700
1228
  throw methodError;
701
1229
  }
702
1230
  }
@@ -706,7 +1234,7 @@ var AdobeUIXGuest = (() => {
706
1234
  this.timeout = config.timeout;
707
1235
  }
708
1236
  if (config.debug) {
709
- this.debugLogger = debugGuest(this);
1237
+ this.logger = debugGuest(this);
710
1238
  }
711
1239
  this.addEventListener("contextchange", (event) => {
712
1240
  this.sharedContext = new SharedContext(event.detail.context);
@@ -715,7 +1243,7 @@ var AdobeUIXGuest = (() => {
715
1243
  getLocalMethods() {
716
1244
  return {
717
1245
  emit: (...args) => {
718
- this.debugLogger.log(`Event "${args[0]}" emitted from host`);
1246
+ this.logger.log(`Event "${args[0]}" emitted from host`);
719
1247
  this.emit(...args);
720
1248
  }
721
1249
  };
@@ -726,20 +1254,28 @@ var AdobeUIXGuest = (() => {
726
1254
  async _connect() {
727
1255
  this.emit("beforeconnect", { guest: this });
728
1256
  try {
729
- const connection = connectToParent_default({
730
- timeout: this.timeout,
731
- methods: this.getLocalMethods()
732
- });
733
- this.hostConnectionPromise = connection.promise;
1257
+ const hostConnectionPromise = (0, import_uix_core2.connectParentWindow)(
1258
+ {
1259
+ targetOrigin: "*",
1260
+ timeout: this.timeout,
1261
+ logger: this.logger
1262
+ },
1263
+ this.getLocalMethods()
1264
+ );
1265
+ this.hostConnectionPromise = hostConnectionPromise;
734
1266
  this.hostConnection = await this.hostConnectionPromise;
1267
+ } catch (e) {
1268
+ this.emit("error", { guest: this, error: e });
1269
+ this.logger.error("Connection failed!", e);
1270
+ return;
1271
+ }
1272
+ try {
735
1273
  this.sharedContext = new SharedContext(
736
- await this.hostConnection.getSharedContext()
1274
+ await this.hostConnection.getRemoteApi().getSharedContext()
737
1275
  );
738
- this.debugLogger.log("retrieved sharedContext", this.sharedContext);
739
- this.emit("connected", { guest: this, connection });
740
1276
  } catch (e) {
741
1277
  this.emit("error", { guest: this, error: e });
742
- this.debugLogger.error("Connection failed!", e);
1278
+ this.logger.error("getSharedContext failed!", e);
743
1279
  }
744
1280
  }
745
1281
  };