@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.
- package/dist/guest-server.d.ts +0 -4
- package/dist/guest-server.d.ts.map +1 -1
- package/dist/guest.d.ts +2 -9
- package/dist/guest.d.ts.map +1 -1
- package/dist/iife/index.js +810 -364
- package/dist/iife/index.js.map +1 -1
- package/dist/index.js +25 -15
- package/dist/index.js.map +1 -1
- package/package.json +5 -3
- package/src/guest.ts +30 -21
package/dist/iife/index.js
CHANGED
@@ -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(
|
422
|
+
constructor(id) {
|
223
423
|
super();
|
224
|
-
this.id =
|
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
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
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
|
-
|
280
|
-
|
281
|
-
|
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
|
-
|
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
|
-
|
379
|
-
|
380
|
-
|
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
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
return
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
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
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
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
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
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
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
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
|
-
|
463
|
-
|
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
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
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
|
-
|
493
|
-
|
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
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
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
|
502
|
-
|
503
|
-
|
504
|
-
|
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
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
}
|
526
|
-
|
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
|
-
|
565
|
-
|
566
|
-
const ackMessage = {
|
567
|
-
penpal: MessageType.Ack,
|
568
|
-
methodNames: Object.keys(serializedMethods)
|
792
|
+
var INIT_TICKET = {
|
793
|
+
fnId: INIT_CALLBACK
|
569
794
|
};
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
}
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
|
592
|
-
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
|
610
|
-
|
611
|
-
|
612
|
-
|
613
|
-
|
614
|
-
|
615
|
-
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
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
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
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
|
-
|
637
|
-
|
638
|
-
|
639
|
-
|
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.
|
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
|
-
|
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.
|
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.
|
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.
|
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
|
730
|
-
|
731
|
-
|
732
|
-
|
733
|
-
|
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.
|
1188
|
+
this.logger.error("getSharedContext failed!", e);
|
743
1189
|
}
|
744
1190
|
}
|
745
1191
|
};
|