@adobe/uix-guest 0.6.5-1 → 0.7.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.
@@ -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,617 @@ 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.0.1";
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";
381
496
  }
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;
497
+ function wrap(message) {
498
+ return { [NS_ROOT]: message };
499
+ }
500
+ function unwrap(wrappedMessage) {
501
+ return wrappedMessage[NS_ROOT];
502
+ }
503
+ function isWrapped(item) {
504
+ if (!isPlainObject(item)) {
505
+ return false;
506
+ }
507
+ const keys = Object.keys(item);
508
+ const hasRoot = keys.includes(NS_ROOT);
509
+ if (hasRoot && keys.length != 1) {
510
+ console.error(
511
+ `malformed tunnel message, should have one prop "${NS_ROOT}" at root`,
512
+ item
513
+ );
514
+ return false;
515
+ }
516
+ return hasRoot;
517
+ }
518
+ var NOT_TRANSFORMED = Symbol.for("NOT_TRANSFORMED");
519
+ function transformRecursive(transform, value) {
520
+ if (isPrimitive(value)) {
521
+ return value;
522
+ }
523
+ const transformed = transform(value);
524
+ if (transformed !== NOT_TRANSFORMED) {
525
+ return transformed;
526
+ }
527
+ if (isIterable(value)) {
528
+ const outArray = [];
529
+ for (const item of value) {
530
+ outArray.push(transformRecursive(transform, item));
391
531
  }
392
- const message = {
393
- penpal: MessageType.Reply,
394
- id: id2,
395
- resolution,
396
- returnValue
397
- };
398
- if (resolution === Resolution.Rejected && returnValue instanceof Error) {
399
- message.returnValue = serializeError(returnValue);
400
- message.returnValueIsError = true;
532
+ return outArray;
533
+ }
534
+ if (isPlainObject(value)) {
535
+ const outObj = {};
536
+ for (const key of Reflect.ownKeys(value)) {
537
+ Reflect.set(
538
+ outObj,
539
+ key,
540
+ transformRecursive(transform, Reflect.get(value, key))
541
+ );
401
542
  }
543
+ return outObj;
544
+ }
545
+ throw new Error(`Bad value! ${Object.prototype.toString.call(value)}`);
546
+ }
547
+ function receiveCalls(fn, ticket, remote) {
548
+ const responder = async ({ fnId, callId, args }) => {
402
549
  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;
550
+ const value = await fn(...args);
551
+ remote.deref().respond({
552
+ fnId,
553
+ callId,
554
+ value,
555
+ status: "resolve"
556
+ });
557
+ } catch (error) {
558
+ remote.deref().respond({
559
+ fnId,
560
+ callId,
561
+ status: "reject",
562
+ error
563
+ });
416
564
  }
417
565
  };
566
+ return remote.deref().onCall(ticket, responder);
567
+ }
568
+ var DisconnectionError = class extends Error {
569
+ constructor() {
570
+ super(
571
+ "Function belongs to a simulated remote object which has been disconnected! The tunnel may have been destroyed by page navigation or reload."
572
+ );
573
+ }
418
574
  };
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] = {};
446
- }
447
- if (idx === segments.length - 1) {
448
- prevSubject[key] = value;
449
- }
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));
575
+ function dispatch(subject, callTicket, rejectionPool, resolve, reject) {
576
+ subject.onRespond(callTicket, (responseTicket) => {
577
+ rejectionPool.delete(reject);
578
+ if (responseTicket.status === "resolve") {
579
+ resolve(responseTicket.value);
580
+ } else {
581
+ reject(responseTicket.error);
582
+ }
583
+ });
584
+ subject.send(callTicket);
461
585
  }
462
- if (typeof value === "function") {
463
- flattenedMethods[keyPath] = value;
586
+ function makeCallSender({ fnId }, subjectRef) {
587
+ let callCounter = 0;
588
+ const rejectionPool = /* @__PURE__ */ new Set();
589
+ let sender = function(...args) {
590
+ return new Promise((resolve, reject) => {
591
+ rejectionPool.add(reject);
592
+ const callId = ++callCounter;
593
+ const callTicket = {
594
+ fnId,
595
+ callId,
596
+ args
597
+ };
598
+ return dispatch(
599
+ subjectRef.deref(),
600
+ callTicket,
601
+ rejectionPool,
602
+ resolve,
603
+ reject
604
+ );
605
+ });
606
+ };
607
+ const destroy = () => {
608
+ subjectRef = null;
609
+ sender = () => {
610
+ throw new DisconnectionError();
611
+ };
612
+ for (const reject of rejectionPool) {
613
+ reject(new DisconnectionError());
614
+ }
615
+ rejectionPool.clear();
616
+ };
617
+ subjectRef.deref().onDestroyed(destroy);
618
+ const facade = async function(...args) {
619
+ return sender(...args);
620
+ };
621
+ Object.defineProperty(facade, "name", { value: fnId });
622
+ return facade;
464
623
  }
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;
624
+ var RemoteSubject = class {
625
+ constructor(emitter, simulator) {
626
+ this.emitter = emitter;
627
+ this.simulator = simulator;
628
+ }
629
+ notifyCleanup(ticket) {
630
+ return this.emitter.emit(`${ticket.fnId}_g`, {});
631
+ }
632
+ notifyConnect() {
633
+ return this.emitter.emit("connected");
634
+ }
635
+ notifyDestroy() {
636
+ return this.emitter.emit("destroyed");
637
+ }
638
+ onCall(ticket, handler) {
639
+ return this.subscribe(
640
+ `${ticket.fnId}_c`,
641
+ (ticket2) => handler(this.processCallTicket(ticket2, this.simulator.materialize))
642
+ );
643
+ }
644
+ onConnected(handler) {
645
+ return this.subscribe("connected", handler);
646
+ }
647
+ onDestroyed(handler) {
648
+ return this.subscribe("destroyed", handler);
649
+ }
650
+ onOutOfScope(ticket, handler) {
651
+ return this.subscribeOnce(`${ticket.fnId}_g`, handler);
652
+ }
653
+ onRespond(ticket, handler) {
654
+ const fnAndCall = `${ticket.fnId}${ticket.callId}`;
655
+ return this.subscribeOnce(
656
+ `${fnAndCall}_r`,
657
+ (ticket2) => handler(this.processResponseTicket(ticket2, this.simulator.materialize))
658
+ );
659
+ }
660
+ respond(ticket) {
661
+ const fnAndCall = `${ticket.fnId}${ticket.callId}`;
662
+ return this.emitter.emit(
663
+ `${fnAndCall}_r`,
664
+ this.processResponseTicket(ticket, this.simulator.simulate)
665
+ );
666
+ }
667
+ send(ticket) {
668
+ return this.emitter.emit(
669
+ `${ticket.fnId}_c`,
670
+ this.processCallTicket(ticket, this.simulator.simulate)
671
+ );
672
+ }
673
+ processCallTicket({ args, ...ticket }, mapper) {
674
+ return {
675
+ ...ticket,
676
+ args: args.map(mapper)
677
+ };
678
+ }
679
+ processResponseTicket(ticket, mapper) {
680
+ return ticket.status === "resolve" ? { ...ticket, value: mapper(ticket.value) } : ticket;
681
+ }
682
+ subscribe(type, handler) {
683
+ this.emitter.on(type, handler);
684
+ return () => {
685
+ this.emitter.off(type, handler);
686
+ };
687
+ }
688
+ subscribeOnce(type, handler) {
689
+ const once = (arg) => {
690
+ this.emitter.off(type, once);
691
+ handler(arg);
692
+ };
693
+ return this.subscribe(type, once);
694
+ }
695
+ };
696
+ function isDefMessage(value) {
697
+ return isWrapped(value) && hasProp(unwrap(value), "fnId");
698
+ }
699
+ var bindAll = (inst, methods) => {
700
+ for (const methodName of methods) {
701
+ const method = inst[methodName];
702
+ if (typeof method === "function") {
703
+ inst[methodName] = method.bind(inst);
488
704
  }
489
- } catch (e) {
490
- iframeRemoved = true;
491
705
  }
492
- if (iframeRemoved) {
493
- destroyConnection();
706
+ };
707
+ var ObjectSimulator = class {
708
+ constructor(subject, cleanupNotifier) {
709
+ this.fnCounter = 0;
710
+ this.receiverTicketCache = /* @__PURE__ */ new WeakMap();
711
+ this.senderCache = /* @__PURE__ */ new WeakMap();
712
+ this.cleanupNotifier = cleanupNotifier;
713
+ this.subject = subject;
714
+ bindAll(this, ["makeSender", "makeReceiver", "simulate", "materialize"]);
494
715
  }
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;
716
+ static create(emitter, Cleanup) {
717
+ let simulator;
718
+ const simulatorInterface = {
719
+ simulate: (x) => simulator.simulate(x),
720
+ materialize: (x) => simulator.materialize(x)
721
+ };
722
+ const subject = new RemoteSubject(emitter, simulatorInterface);
723
+ const cleanupNotifier = new Cleanup((fnId) => {
724
+ return subject.notifyCleanup({ fnId });
725
+ });
726
+ simulator = new ObjectSimulator(subject, cleanupNotifier);
727
+ return simulator;
499
728
  }
729
+ makeReceiver(fn) {
730
+ if (typeof fn !== "function") {
731
+ return NOT_TRANSFORMED;
732
+ }
733
+ let fnTicket = this.receiverTicketCache.get(fn);
734
+ if (!fnTicket) {
735
+ fnTicket = {
736
+ fnId: `${fn.name || "<anonymous>"}_${++this.fnCounter}`
737
+ };
738
+ const cleanup = receiveCalls(fn, fnTicket, new WeakRef(this.subject));
739
+ this.subject.onOutOfScope(fnTicket, cleanup);
740
+ this.receiverTicketCache.set(fn, fnTicket);
741
+ }
742
+ return wrap(fnTicket);
743
+ }
744
+ makeSender(message) {
745
+ if (!isDefMessage(message)) {
746
+ return NOT_TRANSFORMED;
747
+ }
748
+ const ticket = unwrap(message);
749
+ if (!this.senderCache.has(ticket)) {
750
+ const sender = makeCallSender(ticket, new WeakRef(this.subject));
751
+ this.cleanupNotifier.register(sender, ticket.fnId, sender);
752
+ this.senderCache.set(ticket, sender);
753
+ return sender;
754
+ } else {
755
+ return this.senderCache.get(ticket);
756
+ }
757
+ }
758
+ materialize(simulated) {
759
+ return transformRecursive(
760
+ this.makeSender,
761
+ simulated
762
+ );
763
+ }
764
+ simulate(localObject) {
765
+ return transformRecursive(
766
+ this.makeReceiver,
767
+ localObject
768
+ );
769
+ }
770
+ };
771
+ function timeoutPromise2(description, promise, ms, onReject) {
500
772
  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;
773
+ const cleanupAndReject = async (e) => {
774
+ try {
775
+ await onReject(e);
776
+ } finally {
777
+ reject(e);
505
778
  }
506
- if (originForReceiving !== "*" && event.origin !== originForReceiving) {
507
- log(`${localName} received message from origin ${event.origin} which did not match expected origin ${originForReceiving}`);
508
- return;
509
- }
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);
516
- }
517
- (replyMessage.resolution === Resolution.Fulfilled ? resolve : reject)(returnValue);
518
779
  };
519
- local.addEventListener(NativeEventType.Message, handleMessageEvent);
520
- const callMessage = {
521
- penpal: MessageType.Call,
522
- id: id2,
523
- methodName,
524
- args
525
- };
526
- remote.postMessage(callMessage, originForSending);
780
+ const timeout = setTimeout(() => {
781
+ cleanupAndReject(new Error(`${description} timed out after ${ms}ms`));
782
+ }, ms);
783
+ promise.then((result) => {
784
+ clearTimeout(timeout);
785
+ resolve(result);
786
+ }).catch((e) => {
787
+ clearTimeout(timeout);
788
+ cleanupAndReject(e);
789
+ });
527
790
  });
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
791
  }
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)
792
+ var INIT_TICKET = {
793
+ fnId: INIT_CALLBACK
569
794
  };
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
577
- };
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);
795
+ var import_eventemitter3 = __toESM2(require_eventemitter3());
796
+ var VERSION_WARNINGS = /* @__PURE__ */ new Set();
797
+ function makeAccepted(id) {
798
+ return wrap({
799
+ accepts: id,
800
+ version: VERSION
801
+ });
802
+ }
803
+ function makeOffered(id) {
804
+ return wrap({
805
+ offers: id,
806
+ version: VERSION
807
+ });
808
+ }
809
+ function isHandshakeAccepting(message, id) {
810
+ return isHandshake(message) && unwrap(message).accepts === id;
811
+ }
812
+ function isHandshakeOffer(message) {
813
+ return isHandshake(message) && typeof unwrap(message).offers === "string";
814
+ }
815
+ function isHandshake(message) {
816
+ if (!isWrapped(message)) {
817
+ return false;
818
+ }
819
+ const tunnelData = unwrap(message);
820
+ if (!isPlainObject(tunnelData) || typeof tunnelData.version !== "string" || !(Reflect.has(tunnelData, "accepts") || Reflect.has(tunnelData, "offers"))) {
821
+ console.error(
822
+ `malformed tunnel message, message.${NS_ROOT} must be an object with a "version" string and an either an "accepts" or "offers" property containing an ID string.`
823
+ );
824
+ return false;
825
+ }
826
+ const { version } = tunnelData;
827
+ if (version !== VERSION && !VERSION_WARNINGS.has(version)) {
828
+ VERSION_WARNINGS.add(version);
829
+ console.warn(
830
+ `Version mismatch: current Tunnel is ${VERSION} and remote Tunnel is ${version}. May cause problems.`
831
+ );
832
+ }
833
+ return true;
834
+ }
835
+ var RETRY_MS = 100;
836
+ var STATUSCHECK_MS = 5e3;
837
+ var KEY_BASE = 36;
838
+ var KEY_LENGTH = 8;
839
+ var KEY_EXP = KEY_BASE ** KEY_LENGTH;
840
+ var makeKey = () => Math.round(Math.random() * KEY_EXP).toString(KEY_BASE);
841
+ var badTimeout = "\n - timeout value must be a number of milliseconds";
842
+ var badTargetOrigin = "\n - targetOrigin must be a valid URL origin or '*' for any origin";
843
+ function isFromOrigin(event, source, targetOrigin) {
844
+ try {
845
+ return source === event.source && (targetOrigin === "*" || targetOrigin === new URL(event.origin).origin);
846
+ } catch (_) {
847
+ return false;
848
+ }
849
+ }
850
+ var { emit: emitOn } = import_eventemitter3.default.prototype;
851
+ var Tunnel = class extends import_eventemitter3.default {
852
+ constructor(config) {
853
+ super();
854
+ this.emitLocal = (type, payload) => {
855
+ return emitOn.call(this, type, payload);
856
+ };
857
+ this._emitFromMessage = ({ data: { type, payload } }) => {
858
+ this.emitLocal(type, payload);
859
+ };
860
+ this.config = config;
861
+ }
862
+ static toIframe(target, options) {
863
+ if (!isIframe(target)) {
864
+ throw new Error(
865
+ `Provided tunnel target is not an iframe! ${Object.prototype.toString.call(
866
+ target
867
+ )}`
868
+ );
869
+ }
870
+ const source = target.contentWindow;
871
+ const config = Tunnel._normalizeConfig(options);
872
+ const tunnel = new Tunnel(config);
873
+ let frameStatusCheck;
874
+ let timeout;
875
+ const offerListener = (event) => {
876
+ if (isFromOrigin(event, source, config.targetOrigin) && isHandshakeOffer(event.data)) {
877
+ const accepted = makeAccepted(unwrap(event.data).offers);
878
+ const channel = new MessageChannel();
879
+ source.postMessage(accepted, config.targetOrigin, [channel.port1]);
880
+ tunnel.connect(channel.port2);
881
+ }
882
+ };
883
+ const cleanup = () => {
884
+ clearTimeout(timeout);
885
+ clearInterval(frameStatusCheck);
886
+ window.removeEventListener("message", offerListener);
887
+ };
888
+ timeout = window.setTimeout(() => {
889
+ tunnel.emitLocal(
890
+ "error",
891
+ new Error(
892
+ `Timed out awaiting initial message from iframe after ${config.timeout}ms`
893
+ )
894
+ );
895
+ tunnel.destroy();
896
+ }, config.timeout);
897
+ tunnel.on("destroyed", cleanup);
898
+ tunnel.on("connected", () => clearTimeout(timeout));
899
+ frameStatusCheck = window.setInterval(() => {
900
+ if (!target.isConnected) {
901
+ tunnel.destroy();
902
+ }
903
+ }, STATUSCHECK_MS);
904
+ window.addEventListener("message", offerListener);
905
+ return tunnel;
906
+ }
907
+ static toParent(source, opts) {
908
+ let retrying;
909
+ let timeout;
910
+ const key = makeKey();
911
+ const config = Tunnel._normalizeConfig(opts);
912
+ const tunnel = new Tunnel(config);
913
+ const acceptListener = (event) => {
914
+ if (isFromOrigin(event, source, config.targetOrigin) && isHandshakeAccepting(event.data, key)) {
915
+ cleanup();
916
+ if (!event.ports || !event.ports.length) {
917
+ const portError = new Error(
918
+ "Received handshake accept message, but it did not include a MessagePort to establish tunnel"
919
+ );
920
+ tunnel.emitLocal("error", portError);
921
+ return;
922
+ }
923
+ tunnel.connect(event.ports[0]);
924
+ }
925
+ };
926
+ const cleanup = () => {
927
+ clearInterval(retrying);
928
+ clearTimeout(timeout);
929
+ window.removeEventListener("message", acceptListener);
930
+ };
931
+ timeout = window.setTimeout(() => {
932
+ tunnel.emitLocal(
933
+ "error",
934
+ new Error(
935
+ `Timed out waiting for initial response from parent after ${config.timeout}ms`
936
+ )
937
+ );
938
+ tunnel.destroy();
939
+ }, config.timeout);
940
+ window.addEventListener("message", acceptListener);
941
+ tunnel.on("destroyed", cleanup);
942
+ tunnel.on("connected", cleanup);
943
+ const sendOffer = () => source.postMessage(makeOffered(key), config.targetOrigin);
944
+ retrying = window.setInterval(sendOffer, RETRY_MS);
945
+ sendOffer();
946
+ return tunnel;
947
+ }
948
+ connect(remote) {
949
+ if (this._messagePort) {
950
+ this._messagePort.removeEventListener("message", this._emitFromMessage);
951
+ this._messagePort.close();
624
952
  }
953
+ this._messagePort = remote;
954
+ remote.addEventListener("message", this._emitFromMessage);
955
+ this.emit("connected");
956
+ this._messagePort.start();
625
957
  }
626
- };
627
- window.addEventListener(NativeEventType.Message, handleMessage);
628
- sendSynMessage();
629
- onDestroy((error) => {
630
- window.removeEventListener(NativeEventType.Message, handleMessage);
631
- if (error) {
632
- reject(error);
958
+ destroy() {
959
+ if (this._messagePort) {
960
+ this._messagePort.close();
961
+ this._messagePort = null;
962
+ }
963
+ this.emitLocal("destroyed");
964
+ this.emit("destroyed");
633
965
  }
634
- });
635
- });
636
- return {
637
- promise,
638
- destroy() {
639
- destroy();
966
+ emit(type, payload) {
967
+ if (!this._messagePort) {
968
+ return false;
969
+ }
970
+ this._messagePort.postMessage({ type, payload });
971
+ return true;
972
+ }
973
+ static _normalizeConfig(options = {}) {
974
+ let errorMessage = "";
975
+ const config = {
976
+ timeout: 4e3,
977
+ ...options
978
+ };
979
+ const timeoutMs = Number(config.timeout);
980
+ if (!Number.isSafeInteger(timeoutMs)) {
981
+ errorMessage += badTimeout;
982
+ }
983
+ if (config.targetOrigin !== "*") {
984
+ try {
985
+ new URL(config.targetOrigin);
986
+ } catch (e) {
987
+ errorMessage += badTargetOrigin;
988
+ }
989
+ }
990
+ if (errorMessage) {
991
+ throw new Error(`Invalid tunnel configuration: ${errorMessage}`);
992
+ }
993
+ return config;
994
+ }
995
+ };
996
+ var INIT_MESSAGE = wrap(INIT_TICKET);
997
+ async function setupApiExchange(tunnel, apiToSend) {
998
+ let done = false;
999
+ let remoteApi;
1000
+ const xrObject = {
1001
+ tunnel,
1002
+ getRemoteApi() {
1003
+ return remoteApi;
1004
+ }
1005
+ };
1006
+ return timeoutPromise2(
1007
+ "Initial API exchange",
1008
+ new Promise((resolve, reject) => {
1009
+ const simulator = ObjectSimulator.create(tunnel, FinalizationRegistry);
1010
+ const sendApi = simulator.makeSender(INIT_MESSAGE);
1011
+ const apiCallback = (api) => {
1012
+ remoteApi = api;
1013
+ if (!done) {
1014
+ done = true;
1015
+ resolve(xrObject);
1016
+ }
1017
+ };
1018
+ tunnel.on("api", apiCallback);
1019
+ const unsubscribe = receiveCalls(
1020
+ (api) => tunnel.emitLocal("api", api),
1021
+ INIT_TICKET,
1022
+ new WeakRef(simulator.subject)
1023
+ );
1024
+ const destroy = (e) => {
1025
+ unsubscribe();
1026
+ if (!done) {
1027
+ done = true;
1028
+ reject(e);
1029
+ }
1030
+ };
1031
+ tunnel.on("destroyed", destroy);
1032
+ tunnel.on(
1033
+ "connected",
1034
+ () => sendApi(apiToSend).catch(destroy)
1035
+ );
1036
+ }),
1037
+ tunnel.config.timeout,
1038
+ () => tunnel.destroy()
1039
+ );
640
1040
  }
641
- };
642
- };
1041
+ async function connectParentWindow2(tunnelOptions, apiToSend) {
1042
+ const tunnel = Tunnel.toParent(window.parent, tunnelOptions);
1043
+ return setupApiExchange(tunnel, apiToSend);
1044
+ }
1045
+ async function connectIframe(frame, tunnelOptions, apiToSend) {
1046
+ const tunnel = Tunnel.toIframe(frame, tunnelOptions);
1047
+ return setupApiExchange(tunnel, apiToSend);
1048
+ }
1049
+ function wait(ms) {
1050
+ return new Promise((resolve) => {
1051
+ setTimeout(resolve, ms);
1052
+ });
1053
+ }
1054
+ exports.Emitter = Emitter2;
1055
+ exports.Tunnel = Tunnel;
1056
+ exports._customConsole = _customConsole;
1057
+ exports.connectIframe = connectIframe;
1058
+ exports.connectParentWindow = connectParentWindow2;
1059
+ exports.debugEmitter = debugEmitter2;
1060
+ exports.makeNamespaceProxy = makeNamespaceProxy2;
1061
+ exports.quietConsole = quietConsole2;
1062
+ exports.timeoutPromise = timeoutPromise2;
1063
+ exports.wait = wait;
1064
+ }
1065
+ });
1066
+
1067
+ // src/index.ts
1068
+ var src_exports = {};
1069
+ __export(src_exports, {
1070
+ GuestServer: () => GuestServer,
1071
+ GuestUI: () => GuestUI,
1072
+ PrimaryGuest: () => GuestServer,
1073
+ UIGuest: () => GuestUI,
1074
+ attach: () => attach,
1075
+ createGuest: () => createGuest,
1076
+ register: () => register
1077
+ });
643
1078
 
644
1079
  // src/guest.ts
645
1080
  var import_uix_core2 = __toESM(require_dist());
@@ -681,14 +1116,18 @@ var AdobeUIXGuest = (() => {
681
1116
  var Guest2 = class extends import_uix_core2.Emitter {
682
1117
  constructor(config) {
683
1118
  super(config.id);
684
- this.debugLogger = import_uix_core2.quietConsole;
1119
+ this.logger = import_uix_core2.quietConsole;
685
1120
  this.host = (0, import_uix_core2.makeNamespaceProxy)(
686
1121
  async (address) => {
687
1122
  await this.hostConnectionPromise;
688
1123
  try {
689
1124
  const result = await (0, import_uix_core2.timeoutPromise)(
1125
+ `Calling host method ${address.path.join(".")}${address.name}(...)`,
1126
+ this.hostConnection.getRemoteApi().invokeHostMethod(address),
690
1127
  1e4,
691
- this.hostConnection.invokeHostMethod(address)
1128
+ (e) => {
1129
+ this.logger.error(e);
1130
+ }
692
1131
  );
693
1132
  return result;
694
1133
  } catch (e) {
@@ -696,7 +1135,7 @@ var AdobeUIXGuest = (() => {
696
1135
  const methodError = new Error(
697
1136
  `Host method call host.${address.path.join(".")}() failed: ${error.message}`
698
1137
  );
699
- this.debugLogger.error(methodError);
1138
+ this.logger.error(methodError);
700
1139
  throw methodError;
701
1140
  }
702
1141
  }
@@ -706,7 +1145,7 @@ var AdobeUIXGuest = (() => {
706
1145
  this.timeout = config.timeout;
707
1146
  }
708
1147
  if (config.debug) {
709
- this.debugLogger = debugGuest(this);
1148
+ this.logger = debugGuest(this);
710
1149
  }
711
1150
  this.addEventListener("contextchange", (event) => {
712
1151
  this.sharedContext = new SharedContext(event.detail.context);
@@ -715,7 +1154,7 @@ var AdobeUIXGuest = (() => {
715
1154
  getLocalMethods() {
716
1155
  return {
717
1156
  emit: (...args) => {
718
- this.debugLogger.log(`Event "${args[0]}" emitted from host`);
1157
+ this.logger.log(`Event "${args[0]}" emitted from host`);
719
1158
  this.emit(...args);
720
1159
  }
721
1160
  };
@@ -726,20 +1165,27 @@ var AdobeUIXGuest = (() => {
726
1165
  async _connect() {
727
1166
  this.emit("beforeconnect", { guest: this });
728
1167
  try {
729
- const connection = connectToParent_default({
730
- timeout: this.timeout,
731
- methods: this.getLocalMethods()
732
- });
733
- this.hostConnectionPromise = connection.promise;
1168
+ const hostConnectionPromise = (0, import_uix_core2.connectParentWindow)(
1169
+ {
1170
+ targetOrigin: "*",
1171
+ timeout: this.timeout
1172
+ },
1173
+ this.getLocalMethods()
1174
+ );
1175
+ this.hostConnectionPromise = hostConnectionPromise;
734
1176
  this.hostConnection = await this.hostConnectionPromise;
1177
+ } catch (e) {
1178
+ this.emit("error", { guest: this, error: e });
1179
+ this.logger.error("Connection failed!", e);
1180
+ return;
1181
+ }
1182
+ try {
735
1183
  this.sharedContext = new SharedContext(
736
- await this.hostConnection.getSharedContext()
1184
+ await this.hostConnection.getRemoteApi().getSharedContext()
737
1185
  );
738
- this.debugLogger.log("retrieved sharedContext", this.sharedContext);
739
- this.emit("connected", { guest: this, connection });
740
1186
  } catch (e) {
741
1187
  this.emit("error", { guest: this, error: e });
742
- this.debugLogger.error("Connection failed!", e);
1188
+ this.logger.error("getSharedContext failed!", e);
743
1189
  }
744
1190
  }
745
1191
  };