@adobe/uix-guest 0.6.5 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
  };