@adobe/uix-core 0.6.5 → 0.7.1-nightly.20230114
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__helpers__/jest.messagechannel.d.cts +2 -0
- package/dist/__helpers__/jest.messagechannel.d.cts.map +1 -0
- package/dist/__mocks__/mock-finalization-registry.d.ts +11 -0
- package/dist/__mocks__/mock-finalization-registry.d.ts.map +1 -0
- package/dist/__mocks__/mock-weak-ref.d.ts +7 -0
- package/dist/__mocks__/mock-weak-ref.d.ts.map +1 -0
- package/dist/constants.d.ts +8 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/cross-realm-object.d.ts +44 -0
- package/dist/cross-realm-object.d.ts.map +1 -0
- package/dist/debuglog.d.ts +11 -0
- package/dist/debuglog.d.ts.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +906 -7
- package/dist/index.js.map +1 -1
- package/dist/message-wrapper.d.ts +9 -0
- package/dist/message-wrapper.d.ts.map +1 -0
- package/dist/object-simulator.d.ts +28 -0
- package/dist/object-simulator.d.ts.map +1 -0
- package/dist/object-simulator.test.d.ts +2 -0
- package/dist/object-simulator.test.d.ts.map +1 -0
- package/dist/object-walker.d.ts +30 -0
- package/dist/object-walker.d.ts.map +1 -0
- package/dist/promises/index.d.ts +3 -0
- package/dist/promises/index.d.ts.map +1 -0
- package/dist/promises/promise-wrappers.test.d.ts +2 -0
- package/dist/promises/promise-wrappers.test.d.ts.map +1 -0
- package/dist/promises/timed.d.ts +15 -0
- package/dist/promises/timed.d.ts.map +1 -0
- package/dist/promises/wait.d.ts +7 -0
- package/dist/promises/wait.d.ts.map +1 -0
- package/dist/remote-subject.d.ts +70 -0
- package/dist/remote-subject.d.ts.map +1 -0
- package/dist/rpc/call-receiver.d.ts +4 -0
- package/dist/rpc/call-receiver.d.ts.map +1 -0
- package/dist/rpc/call-receiver.test.d.ts +2 -0
- package/dist/rpc/call-receiver.test.d.ts.map +1 -0
- package/dist/rpc/call-sender.d.ts +4 -0
- package/dist/rpc/call-sender.d.ts.map +1 -0
- package/dist/rpc/call-sender.test.d.ts +2 -0
- package/dist/rpc/call-sender.test.d.ts.map +1 -0
- package/dist/rpc/index.d.ts +3 -0
- package/dist/rpc/index.d.ts.map +1 -0
- package/dist/tickets.d.ts +34 -0
- package/dist/tickets.d.ts.map +1 -0
- package/dist/tunnel/index.d.ts +2 -0
- package/dist/tunnel/index.d.ts.map +1 -0
- package/dist/tunnel/tunnel-messenger.d.ts +25 -0
- package/dist/tunnel/tunnel-messenger.d.ts.map +1 -0
- package/dist/tunnel/tunnel-messenger.test.d.ts +2 -0
- package/dist/tunnel/tunnel-messenger.test.d.ts.map +1 -0
- package/dist/tunnel/tunnel.d.ts +62 -0
- package/dist/tunnel/tunnel.d.ts.map +1 -0
- package/dist/tunnel/tunnel.test.d.ts +2 -0
- package/dist/tunnel/tunnel.test.d.ts.map +1 -0
- package/dist/types.d.ts +1 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/value-assertions.d.ts +13 -0
- package/dist/value-assertions.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/__helpers__/jest.messagechannel.cjs +3 -0
- package/src/__mocks__/mock-finalization-registry.ts +13 -0
- package/src/__mocks__/mock-weak-ref.ts +10 -0
- package/src/constants.ts +10 -0
- package/src/cross-realm-object.ts +117 -0
- package/src/debuglog.ts +1 -1
- package/src/index.ts +4 -1
- package/src/message-wrapper.ts +35 -0
- package/src/object-simulator.test.ts +328 -0
- package/src/object-simulator.ts +145 -0
- package/src/object-walker.ts +132 -0
- package/src/promises/index.ts +2 -0
- package/src/promises/promise-wrappers.test.ts +63 -0
- package/src/promises/timed.ts +41 -0
- package/src/promises/wait.ts +10 -0
- package/src/remote-subject.ts +185 -0
- package/src/rpc/call-receiver.test.ts +90 -0
- package/src/rpc/call-receiver.ts +29 -0
- package/src/rpc/call-sender.test.ts +73 -0
- package/src/rpc/call-sender.ts +72 -0
- package/src/rpc/index.ts +2 -0
- package/src/tickets.ts +71 -0
- package/src/tunnel/index.ts +1 -0
- package/src/tunnel/tunnel-messenger.test.ts +183 -0
- package/src/tunnel/tunnel-messenger.ts +99 -0
- package/src/tunnel/tunnel.test.ts +211 -0
- package/src/tunnel/tunnel.ts +322 -0
- package/src/types.ts +3 -5
- package/src/value-assertions.ts +58 -0
- package/tsconfig.json +2 -6
- package/dist/timeout-promise.d.ts +0 -12
- package/dist/timeout-promise.d.ts.map +0 -1
- package/src/timeout-promise.ts +0 -36
package/dist/index.js
CHANGED
|
@@ -1,5 +1,208 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __commonJS = (cb, mod) => function __require() {
|
|
10
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
|
+
mod
|
|
23
|
+
));
|
|
24
|
+
|
|
25
|
+
// ../../node_modules/eventemitter3/index.js
|
|
26
|
+
var require_eventemitter3 = __commonJS({
|
|
27
|
+
"../../node_modules/eventemitter3/index.js"(exports, module) {
|
|
28
|
+
var has = Object.prototype.hasOwnProperty;
|
|
29
|
+
var prefix = "~";
|
|
30
|
+
function Events() {
|
|
31
|
+
}
|
|
32
|
+
if (Object.create) {
|
|
33
|
+
Events.prototype = /* @__PURE__ */ Object.create(null);
|
|
34
|
+
if (!new Events().__proto__)
|
|
35
|
+
prefix = false;
|
|
36
|
+
}
|
|
37
|
+
function EE(fn, context, once) {
|
|
38
|
+
this.fn = fn;
|
|
39
|
+
this.context = context;
|
|
40
|
+
this.once = once || false;
|
|
41
|
+
}
|
|
42
|
+
function addListener(emitter, event, fn, context, once) {
|
|
43
|
+
if (typeof fn !== "function") {
|
|
44
|
+
throw new TypeError("The listener must be a function");
|
|
45
|
+
}
|
|
46
|
+
var listener = new EE(fn, context || emitter, once), evt = prefix ? prefix + event : event;
|
|
47
|
+
if (!emitter._events[evt])
|
|
48
|
+
emitter._events[evt] = listener, emitter._eventsCount++;
|
|
49
|
+
else if (!emitter._events[evt].fn)
|
|
50
|
+
emitter._events[evt].push(listener);
|
|
51
|
+
else
|
|
52
|
+
emitter._events[evt] = [emitter._events[evt], listener];
|
|
53
|
+
return emitter;
|
|
54
|
+
}
|
|
55
|
+
function clearEvent(emitter, evt) {
|
|
56
|
+
if (--emitter._eventsCount === 0)
|
|
57
|
+
emitter._events = new Events();
|
|
58
|
+
else
|
|
59
|
+
delete emitter._events[evt];
|
|
60
|
+
}
|
|
61
|
+
function EventEmitter2() {
|
|
62
|
+
this._events = new Events();
|
|
63
|
+
this._eventsCount = 0;
|
|
64
|
+
}
|
|
65
|
+
EventEmitter2.prototype.eventNames = function eventNames() {
|
|
66
|
+
var names = [], events, name;
|
|
67
|
+
if (this._eventsCount === 0)
|
|
68
|
+
return names;
|
|
69
|
+
for (name in events = this._events) {
|
|
70
|
+
if (has.call(events, name))
|
|
71
|
+
names.push(prefix ? name.slice(1) : name);
|
|
72
|
+
}
|
|
73
|
+
if (Object.getOwnPropertySymbols) {
|
|
74
|
+
return names.concat(Object.getOwnPropertySymbols(events));
|
|
75
|
+
}
|
|
76
|
+
return names;
|
|
77
|
+
};
|
|
78
|
+
EventEmitter2.prototype.listeners = function listeners(event) {
|
|
79
|
+
var evt = prefix ? prefix + event : event, handlers = this._events[evt];
|
|
80
|
+
if (!handlers)
|
|
81
|
+
return [];
|
|
82
|
+
if (handlers.fn)
|
|
83
|
+
return [handlers.fn];
|
|
84
|
+
for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {
|
|
85
|
+
ee[i] = handlers[i].fn;
|
|
86
|
+
}
|
|
87
|
+
return ee;
|
|
88
|
+
};
|
|
89
|
+
EventEmitter2.prototype.listenerCount = function listenerCount(event) {
|
|
90
|
+
var evt = prefix ? prefix + event : event, listeners = this._events[evt];
|
|
91
|
+
if (!listeners)
|
|
92
|
+
return 0;
|
|
93
|
+
if (listeners.fn)
|
|
94
|
+
return 1;
|
|
95
|
+
return listeners.length;
|
|
96
|
+
};
|
|
97
|
+
EventEmitter2.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
|
|
98
|
+
var evt = prefix ? prefix + event : event;
|
|
99
|
+
if (!this._events[evt])
|
|
100
|
+
return false;
|
|
101
|
+
var listeners = this._events[evt], len = arguments.length, args, i;
|
|
102
|
+
if (listeners.fn) {
|
|
103
|
+
if (listeners.once)
|
|
104
|
+
this.removeListener(event, listeners.fn, void 0, true);
|
|
105
|
+
switch (len) {
|
|
106
|
+
case 1:
|
|
107
|
+
return listeners.fn.call(listeners.context), true;
|
|
108
|
+
case 2:
|
|
109
|
+
return listeners.fn.call(listeners.context, a1), true;
|
|
110
|
+
case 3:
|
|
111
|
+
return listeners.fn.call(listeners.context, a1, a2), true;
|
|
112
|
+
case 4:
|
|
113
|
+
return listeners.fn.call(listeners.context, a1, a2, a3), true;
|
|
114
|
+
case 5:
|
|
115
|
+
return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
|
|
116
|
+
case 6:
|
|
117
|
+
return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
|
|
118
|
+
}
|
|
119
|
+
for (i = 1, args = new Array(len - 1); i < len; i++) {
|
|
120
|
+
args[i - 1] = arguments[i];
|
|
121
|
+
}
|
|
122
|
+
listeners.fn.apply(listeners.context, args);
|
|
123
|
+
} else {
|
|
124
|
+
var length = listeners.length, j;
|
|
125
|
+
for (i = 0; i < length; i++) {
|
|
126
|
+
if (listeners[i].once)
|
|
127
|
+
this.removeListener(event, listeners[i].fn, void 0, true);
|
|
128
|
+
switch (len) {
|
|
129
|
+
case 1:
|
|
130
|
+
listeners[i].fn.call(listeners[i].context);
|
|
131
|
+
break;
|
|
132
|
+
case 2:
|
|
133
|
+
listeners[i].fn.call(listeners[i].context, a1);
|
|
134
|
+
break;
|
|
135
|
+
case 3:
|
|
136
|
+
listeners[i].fn.call(listeners[i].context, a1, a2);
|
|
137
|
+
break;
|
|
138
|
+
case 4:
|
|
139
|
+
listeners[i].fn.call(listeners[i].context, a1, a2, a3);
|
|
140
|
+
break;
|
|
141
|
+
default:
|
|
142
|
+
if (!args)
|
|
143
|
+
for (j = 1, args = new Array(len - 1); j < len; j++) {
|
|
144
|
+
args[j - 1] = arguments[j];
|
|
145
|
+
}
|
|
146
|
+
listeners[i].fn.apply(listeners[i].context, args);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return true;
|
|
151
|
+
};
|
|
152
|
+
EventEmitter2.prototype.on = function on(event, fn, context) {
|
|
153
|
+
return addListener(this, event, fn, context, false);
|
|
154
|
+
};
|
|
155
|
+
EventEmitter2.prototype.once = function once(event, fn, context) {
|
|
156
|
+
return addListener(this, event, fn, context, true);
|
|
157
|
+
};
|
|
158
|
+
EventEmitter2.prototype.removeListener = function removeListener(event, fn, context, once) {
|
|
159
|
+
var evt = prefix ? prefix + event : event;
|
|
160
|
+
if (!this._events[evt])
|
|
161
|
+
return this;
|
|
162
|
+
if (!fn) {
|
|
163
|
+
clearEvent(this, evt);
|
|
164
|
+
return this;
|
|
165
|
+
}
|
|
166
|
+
var listeners = this._events[evt];
|
|
167
|
+
if (listeners.fn) {
|
|
168
|
+
if (listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context)) {
|
|
169
|
+
clearEvent(this, evt);
|
|
170
|
+
}
|
|
171
|
+
} else {
|
|
172
|
+
for (var i = 0, events = [], length = listeners.length; i < length; i++) {
|
|
173
|
+
if (listeners[i].fn !== fn || once && !listeners[i].once || context && listeners[i].context !== context) {
|
|
174
|
+
events.push(listeners[i]);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (events.length)
|
|
178
|
+
this._events[evt] = events.length === 1 ? events[0] : events;
|
|
179
|
+
else
|
|
180
|
+
clearEvent(this, evt);
|
|
181
|
+
}
|
|
182
|
+
return this;
|
|
183
|
+
};
|
|
184
|
+
EventEmitter2.prototype.removeAllListeners = function removeAllListeners(event) {
|
|
185
|
+
var evt;
|
|
186
|
+
if (event) {
|
|
187
|
+
evt = prefix ? prefix + event : event;
|
|
188
|
+
if (this._events[evt])
|
|
189
|
+
clearEvent(this, evt);
|
|
190
|
+
} else {
|
|
191
|
+
this._events = new Events();
|
|
192
|
+
this._eventsCount = 0;
|
|
193
|
+
}
|
|
194
|
+
return this;
|
|
195
|
+
};
|
|
196
|
+
EventEmitter2.prototype.off = EventEmitter2.prototype.removeListener;
|
|
197
|
+
EventEmitter2.prototype.addListener = EventEmitter2.prototype.on;
|
|
198
|
+
EventEmitter2.prefixed = prefix;
|
|
199
|
+
EventEmitter2.EventEmitter = EventEmitter2;
|
|
200
|
+
if ("undefined" !== typeof module) {
|
|
201
|
+
module.exports = EventEmitter2;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
|
|
3
206
|
// src/debuglog.ts
|
|
4
207
|
var isDarkMode = () => typeof window.matchMedia === "function" && window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
5
208
|
var Layouts = {
|
|
@@ -242,25 +445,721 @@ function makeNamespaceProxy(invoke, path = []) {
|
|
|
242
445
|
});
|
|
243
446
|
}
|
|
244
447
|
|
|
245
|
-
// src/
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
448
|
+
// src/constants.ts
|
|
449
|
+
var NS_ROOT = "_$pg";
|
|
450
|
+
var VERSION = "0.7.0";
|
|
451
|
+
var INIT_CALLBACK = `${NS_ROOT}_init_cb`;
|
|
452
|
+
|
|
453
|
+
// src/value-assertions.ts
|
|
454
|
+
function isPlainObject(value) {
|
|
455
|
+
if (!value || typeof value !== "object") {
|
|
456
|
+
return false;
|
|
457
|
+
}
|
|
458
|
+
const proto = Reflect.getPrototypeOf(value);
|
|
459
|
+
return proto === null || proto === Object.prototype;
|
|
460
|
+
}
|
|
461
|
+
function isPrimitive(value) {
|
|
462
|
+
if (!value) {
|
|
463
|
+
return true;
|
|
464
|
+
}
|
|
465
|
+
const theType = typeof value;
|
|
466
|
+
return theType === "string" || theType === "number" || theType === "boolean";
|
|
467
|
+
}
|
|
468
|
+
function isIterable(value) {
|
|
469
|
+
return Array.isArray(value);
|
|
470
|
+
}
|
|
471
|
+
function hasProp(value, prop) {
|
|
472
|
+
return !isPrimitive(value) && Reflect.has(value, prop);
|
|
473
|
+
}
|
|
474
|
+
function isIframe(value) {
|
|
475
|
+
if (!value || isPrimitive(value)) {
|
|
476
|
+
return false;
|
|
477
|
+
}
|
|
478
|
+
const { nodeName } = value;
|
|
479
|
+
return typeof nodeName === "string" && nodeName.toLowerCase() === "iframe";
|
|
480
|
+
}
|
|
481
|
+
function isObjectWithPrototype(value) {
|
|
482
|
+
if (!value || typeof value !== "object") {
|
|
483
|
+
return false;
|
|
484
|
+
}
|
|
485
|
+
const proto = Reflect.getPrototypeOf(value);
|
|
486
|
+
return proto !== Object.prototype;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
// src/message-wrapper.ts
|
|
490
|
+
function wrap(message) {
|
|
491
|
+
return { [NS_ROOT]: message };
|
|
492
|
+
}
|
|
493
|
+
function unwrap(wrappedMessage) {
|
|
494
|
+
return wrappedMessage[NS_ROOT];
|
|
495
|
+
}
|
|
496
|
+
function isWrapped(item) {
|
|
497
|
+
if (!isPlainObject(item)) {
|
|
498
|
+
return false;
|
|
499
|
+
}
|
|
500
|
+
const keys = Object.keys(item);
|
|
501
|
+
const hasRoot = keys.includes(NS_ROOT);
|
|
502
|
+
if (hasRoot && keys.length != 1) {
|
|
503
|
+
console.error(
|
|
504
|
+
`malformed tunnel message, should have one prop "${NS_ROOT}" at root`,
|
|
505
|
+
item
|
|
506
|
+
);
|
|
507
|
+
return false;
|
|
508
|
+
}
|
|
509
|
+
return hasRoot;
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
// src/object-walker.ts
|
|
513
|
+
var NOT_TRANSFORMED = Symbol.for("NOT_TRANSFORMED");
|
|
514
|
+
var CIRCULAR = "[[Circular]]";
|
|
515
|
+
function transformRecursive(transform, value, parent, _refs = /* @__PURE__ */ new WeakSet()) {
|
|
516
|
+
if (isPrimitive(value)) {
|
|
517
|
+
return value;
|
|
518
|
+
}
|
|
519
|
+
const transformed = transform(value, parent);
|
|
520
|
+
if (transformed !== NOT_TRANSFORMED) {
|
|
521
|
+
return transformed;
|
|
522
|
+
}
|
|
523
|
+
if (isIterable(value)) {
|
|
524
|
+
const outArray = [];
|
|
525
|
+
for (const item of value) {
|
|
526
|
+
outArray.push(transformRecursive(transform, item, void 0, _refs));
|
|
527
|
+
}
|
|
528
|
+
return outArray;
|
|
529
|
+
}
|
|
530
|
+
if (isPlainObject(value)) {
|
|
531
|
+
if (_refs.has(value)) {
|
|
532
|
+
return CIRCULAR;
|
|
533
|
+
}
|
|
534
|
+
_refs.add(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), void 0, _refs)
|
|
541
|
+
);
|
|
542
|
+
}
|
|
543
|
+
return outObj;
|
|
544
|
+
}
|
|
545
|
+
if (isObjectWithPrototype(value)) {
|
|
546
|
+
if (_refs.has(value)) {
|
|
547
|
+
return CIRCULAR;
|
|
548
|
+
}
|
|
549
|
+
_refs.add(value);
|
|
550
|
+
const getObjectKeys = (obj) => {
|
|
551
|
+
const result = /* @__PURE__ */ new Set();
|
|
552
|
+
do {
|
|
553
|
+
if (Reflect.getPrototypeOf(obj) !== null) {
|
|
554
|
+
for (const prop of Object.getOwnPropertyNames(obj)) {
|
|
555
|
+
if (prop === "constructor") {
|
|
556
|
+
continue;
|
|
557
|
+
}
|
|
558
|
+
result.add(prop);
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
} while (obj = Reflect.getPrototypeOf(obj));
|
|
562
|
+
return [...result];
|
|
563
|
+
};
|
|
564
|
+
const outObj = {};
|
|
565
|
+
const properties = getObjectKeys(value);
|
|
566
|
+
for (const key of properties) {
|
|
567
|
+
Reflect.set(
|
|
568
|
+
outObj,
|
|
569
|
+
key,
|
|
570
|
+
transformRecursive(transform, Reflect.get(value, key), value, _refs)
|
|
571
|
+
);
|
|
572
|
+
}
|
|
573
|
+
return outObj;
|
|
574
|
+
}
|
|
575
|
+
throw new Error(`Bad value! ${Object.prototype.toString.call(value)}`);
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
// src/rpc/call-receiver.ts
|
|
579
|
+
function receiveCalls(fn, ticket, remote) {
|
|
580
|
+
const responder = async ({ fnId, callId, args }) => {
|
|
581
|
+
try {
|
|
582
|
+
const value = await fn(...args);
|
|
583
|
+
remote.deref().respond({
|
|
584
|
+
fnId,
|
|
585
|
+
callId,
|
|
586
|
+
value,
|
|
587
|
+
status: "resolve"
|
|
588
|
+
});
|
|
589
|
+
} catch (error) {
|
|
590
|
+
remote.deref().respond({
|
|
591
|
+
fnId,
|
|
592
|
+
callId,
|
|
593
|
+
status: "reject",
|
|
594
|
+
error
|
|
595
|
+
});
|
|
596
|
+
}
|
|
597
|
+
};
|
|
598
|
+
return remote.deref().onCall(ticket, responder);
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
// src/rpc/call-sender.ts
|
|
602
|
+
var DisconnectionError = class extends Error {
|
|
603
|
+
constructor() {
|
|
604
|
+
super(
|
|
605
|
+
"Function belongs to a simulated remote object which has been disconnected! The tunnel may have been destroyed by page navigation or reload."
|
|
606
|
+
);
|
|
607
|
+
}
|
|
608
|
+
};
|
|
609
|
+
function dispatch(subject, callTicket, rejectionPool, resolve, reject) {
|
|
610
|
+
subject.onRespond(callTicket, (responseTicket) => {
|
|
611
|
+
rejectionPool.delete(reject);
|
|
612
|
+
if (responseTicket.status === "resolve") {
|
|
613
|
+
resolve(responseTicket.value);
|
|
614
|
+
} else {
|
|
615
|
+
reject(responseTicket.error);
|
|
616
|
+
}
|
|
617
|
+
});
|
|
618
|
+
subject.send(callTicket);
|
|
619
|
+
}
|
|
620
|
+
function makeCallSender({ fnId }, subjectRef) {
|
|
621
|
+
let callCounter = 0;
|
|
622
|
+
const rejectionPool = /* @__PURE__ */ new Set();
|
|
623
|
+
let sender = function(...args) {
|
|
624
|
+
return new Promise((resolve, reject) => {
|
|
625
|
+
rejectionPool.add(reject);
|
|
626
|
+
const callId = ++callCounter;
|
|
627
|
+
const callTicket = {
|
|
628
|
+
fnId,
|
|
629
|
+
callId,
|
|
630
|
+
args
|
|
631
|
+
};
|
|
632
|
+
return dispatch(
|
|
633
|
+
subjectRef.deref(),
|
|
634
|
+
callTicket,
|
|
635
|
+
rejectionPool,
|
|
636
|
+
resolve,
|
|
637
|
+
reject
|
|
638
|
+
);
|
|
639
|
+
});
|
|
640
|
+
};
|
|
641
|
+
const destroy = () => {
|
|
642
|
+
subjectRef = null;
|
|
643
|
+
sender = () => {
|
|
644
|
+
throw new DisconnectionError();
|
|
645
|
+
};
|
|
646
|
+
for (const reject of rejectionPool) {
|
|
647
|
+
reject(new DisconnectionError());
|
|
648
|
+
}
|
|
649
|
+
rejectionPool.clear();
|
|
650
|
+
};
|
|
651
|
+
subjectRef.deref().onDestroyed(destroy);
|
|
652
|
+
const facade = async function(...args) {
|
|
653
|
+
return sender(...args);
|
|
654
|
+
};
|
|
655
|
+
Object.defineProperty(facade, "name", { value: fnId });
|
|
656
|
+
return facade;
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
// src/remote-subject.ts
|
|
660
|
+
var RemoteSubject = class {
|
|
661
|
+
constructor(emitter, simulator) {
|
|
662
|
+
this.emitter = emitter;
|
|
663
|
+
this.simulator = simulator;
|
|
664
|
+
}
|
|
665
|
+
notifyCleanup(ticket) {
|
|
666
|
+
return this.emitter.emit(`${ticket.fnId}_g`, {});
|
|
667
|
+
}
|
|
668
|
+
notifyConnect() {
|
|
669
|
+
return this.emitter.emit("connected");
|
|
670
|
+
}
|
|
671
|
+
notifyDestroy() {
|
|
672
|
+
return this.emitter.emit("destroyed");
|
|
673
|
+
}
|
|
674
|
+
onCall(ticket, handler) {
|
|
675
|
+
return this.subscribe(
|
|
676
|
+
`${ticket.fnId}_c`,
|
|
677
|
+
(ticket2) => handler(this.processCallTicket(ticket2, this.simulator.materialize))
|
|
678
|
+
);
|
|
679
|
+
}
|
|
680
|
+
onConnected(handler) {
|
|
681
|
+
return this.subscribe("connected", handler);
|
|
682
|
+
}
|
|
683
|
+
onDestroyed(handler) {
|
|
684
|
+
return this.subscribe("destroyed", handler);
|
|
685
|
+
}
|
|
686
|
+
onOutOfScope(ticket, handler) {
|
|
687
|
+
return this.subscribeOnce(`${ticket.fnId}_g`, handler);
|
|
688
|
+
}
|
|
689
|
+
onRespond(ticket, handler) {
|
|
690
|
+
const fnAndCall = `${ticket.fnId}${ticket.callId}`;
|
|
691
|
+
return this.subscribeOnce(
|
|
692
|
+
`${fnAndCall}_r`,
|
|
693
|
+
(ticket2) => handler(this.processResponseTicket(ticket2, this.simulator.materialize))
|
|
694
|
+
);
|
|
695
|
+
}
|
|
696
|
+
respond(ticket) {
|
|
697
|
+
const fnAndCall = `${ticket.fnId}${ticket.callId}`;
|
|
698
|
+
return this.emitter.emit(
|
|
699
|
+
`${fnAndCall}_r`,
|
|
700
|
+
this.processResponseTicket(ticket, this.simulator.simulate)
|
|
701
|
+
);
|
|
702
|
+
}
|
|
703
|
+
send(ticket) {
|
|
704
|
+
return this.emitter.emit(
|
|
705
|
+
`${ticket.fnId}_c`,
|
|
706
|
+
this.processCallTicket(ticket, this.simulator.simulate)
|
|
251
707
|
);
|
|
708
|
+
}
|
|
709
|
+
processCallTicket({ args, ...ticket }, mapper) {
|
|
710
|
+
return {
|
|
711
|
+
...ticket,
|
|
712
|
+
args: args.map(mapper)
|
|
713
|
+
};
|
|
714
|
+
}
|
|
715
|
+
processResponseTicket(ticket, mapper) {
|
|
716
|
+
return ticket.status === "resolve" ? { ...ticket, value: mapper(ticket.value) } : ticket;
|
|
717
|
+
}
|
|
718
|
+
subscribe(type, handler) {
|
|
719
|
+
this.emitter.on(type, handler);
|
|
720
|
+
return () => {
|
|
721
|
+
this.emitter.off(type, handler);
|
|
722
|
+
};
|
|
723
|
+
}
|
|
724
|
+
subscribeOnce(type, handler) {
|
|
725
|
+
const once = (arg) => {
|
|
726
|
+
this.emitter.off(type, once);
|
|
727
|
+
handler(arg);
|
|
728
|
+
};
|
|
729
|
+
return this.subscribe(type, once);
|
|
730
|
+
}
|
|
731
|
+
};
|
|
732
|
+
|
|
733
|
+
// src/object-simulator.ts
|
|
734
|
+
function isDefMessage(value) {
|
|
735
|
+
return isWrapped(value) && hasProp(unwrap(value), "fnId");
|
|
736
|
+
}
|
|
737
|
+
var bindAll = (inst, methods) => {
|
|
738
|
+
for (const methodName of methods) {
|
|
739
|
+
const method = inst[methodName];
|
|
740
|
+
if (typeof method === "function") {
|
|
741
|
+
inst[methodName] = method.bind(inst);
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
};
|
|
745
|
+
var ObjectSimulator = class {
|
|
746
|
+
constructor(subject, cleanupNotifier) {
|
|
747
|
+
this.fnCounter = 0;
|
|
748
|
+
this.receiverTicketCache = /* @__PURE__ */ new WeakMap();
|
|
749
|
+
this.senderCache = /* @__PURE__ */ new WeakMap();
|
|
750
|
+
this.cleanupNotifier = cleanupNotifier;
|
|
751
|
+
this.subject = subject;
|
|
752
|
+
bindAll(this, ["makeSender", "makeReceiver", "simulate", "materialize"]);
|
|
753
|
+
}
|
|
754
|
+
static create(emitter, Cleanup) {
|
|
755
|
+
let simulator;
|
|
756
|
+
const simulatorInterface = {
|
|
757
|
+
simulate: (x) => simulator.simulate(x),
|
|
758
|
+
materialize: (x) => simulator.materialize(x)
|
|
759
|
+
};
|
|
760
|
+
const subject = new RemoteSubject(emitter, simulatorInterface);
|
|
761
|
+
const cleanupNotifier = new Cleanup((fnId) => {
|
|
762
|
+
return subject.notifyCleanup({ fnId });
|
|
763
|
+
});
|
|
764
|
+
simulator = new ObjectSimulator(subject, cleanupNotifier);
|
|
765
|
+
return simulator;
|
|
766
|
+
}
|
|
767
|
+
makeReceiver(fn, parent) {
|
|
768
|
+
if (typeof fn !== "function") {
|
|
769
|
+
return NOT_TRANSFORMED;
|
|
770
|
+
}
|
|
771
|
+
let fnTicket = this.receiverTicketCache.get(fn);
|
|
772
|
+
if (!fnTicket) {
|
|
773
|
+
fnTicket = {
|
|
774
|
+
fnId: `${fn.name || "<anonymous>"}_${++this.fnCounter}`
|
|
775
|
+
};
|
|
776
|
+
let boundFunction = fn;
|
|
777
|
+
if (parent) {
|
|
778
|
+
boundFunction = fn.bind(parent);
|
|
779
|
+
}
|
|
780
|
+
const cleanup = receiveCalls(
|
|
781
|
+
boundFunction,
|
|
782
|
+
fnTicket,
|
|
783
|
+
new WeakRef(this.subject)
|
|
784
|
+
);
|
|
785
|
+
this.subject.onOutOfScope(fnTicket, cleanup);
|
|
786
|
+
this.receiverTicketCache.set(boundFunction, fnTicket);
|
|
787
|
+
}
|
|
788
|
+
return wrap(fnTicket);
|
|
789
|
+
}
|
|
790
|
+
makeSender(message) {
|
|
791
|
+
if (!isDefMessage(message)) {
|
|
792
|
+
return NOT_TRANSFORMED;
|
|
793
|
+
}
|
|
794
|
+
const ticket = unwrap(message);
|
|
795
|
+
if (!this.senderCache.has(ticket)) {
|
|
796
|
+
const sender = makeCallSender(ticket, new WeakRef(this.subject));
|
|
797
|
+
this.cleanupNotifier.register(sender, ticket.fnId, sender);
|
|
798
|
+
this.senderCache.set(ticket, sender);
|
|
799
|
+
return sender;
|
|
800
|
+
} else {
|
|
801
|
+
return this.senderCache.get(ticket);
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
materialize(simulated) {
|
|
805
|
+
return transformRecursive(
|
|
806
|
+
this.makeSender,
|
|
807
|
+
simulated
|
|
808
|
+
);
|
|
809
|
+
}
|
|
810
|
+
simulate(localObject) {
|
|
811
|
+
return transformRecursive(
|
|
812
|
+
this.makeReceiver,
|
|
813
|
+
localObject
|
|
814
|
+
);
|
|
815
|
+
}
|
|
816
|
+
};
|
|
817
|
+
|
|
818
|
+
// src/promises/timed.ts
|
|
819
|
+
function timeoutPromise(description, promise, ms, onReject) {
|
|
820
|
+
return new Promise((resolve, reject) => {
|
|
821
|
+
const cleanupAndReject = async (e) => {
|
|
822
|
+
try {
|
|
823
|
+
await onReject(e);
|
|
824
|
+
} finally {
|
|
825
|
+
reject(e);
|
|
826
|
+
}
|
|
827
|
+
};
|
|
828
|
+
const timeout = setTimeout(() => {
|
|
829
|
+
cleanupAndReject(new Error(`${description} timed out after ${ms}ms`));
|
|
830
|
+
}, ms);
|
|
252
831
|
promise.then((result) => {
|
|
253
832
|
clearTimeout(timeout);
|
|
254
833
|
resolve(result);
|
|
255
|
-
}).catch(
|
|
834
|
+
}).catch((e) => {
|
|
835
|
+
clearTimeout(timeout);
|
|
836
|
+
cleanupAndReject(e);
|
|
837
|
+
});
|
|
838
|
+
});
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
// src/tickets.ts
|
|
842
|
+
var INIT_TICKET = {
|
|
843
|
+
fnId: INIT_CALLBACK
|
|
844
|
+
};
|
|
845
|
+
|
|
846
|
+
// src/tunnel/tunnel.ts
|
|
847
|
+
var import_eventemitter3 = __toESM(require_eventemitter3());
|
|
848
|
+
|
|
849
|
+
// src/tunnel/tunnel-messenger.ts
|
|
850
|
+
var TunnelMessenger = class {
|
|
851
|
+
constructor(opts) {
|
|
852
|
+
this.versionWarnings = /* @__PURE__ */ new Set();
|
|
853
|
+
this.myOrigin = opts.myOrigin;
|
|
854
|
+
this.remoteOrigin = opts.targetOrigin === "*" ? "remote document" : opts.targetOrigin;
|
|
855
|
+
this.logger = opts.logger;
|
|
856
|
+
}
|
|
857
|
+
resetWarnings() {
|
|
858
|
+
this.versionWarnings.clear();
|
|
859
|
+
}
|
|
860
|
+
makeAccepted(id) {
|
|
861
|
+
return wrap({
|
|
862
|
+
accepts: id,
|
|
863
|
+
version: VERSION
|
|
864
|
+
});
|
|
865
|
+
}
|
|
866
|
+
makeOffered(id) {
|
|
867
|
+
return wrap({
|
|
868
|
+
offers: id,
|
|
869
|
+
version: VERSION
|
|
870
|
+
});
|
|
871
|
+
}
|
|
872
|
+
isHandshakeAccepting(message, id) {
|
|
873
|
+
return this.isHandshake(message) && unwrap(message).accepts === id;
|
|
874
|
+
}
|
|
875
|
+
isHandshakeOffer(message) {
|
|
876
|
+
return this.isHandshake(message) && typeof unwrap(message).offers === "string";
|
|
877
|
+
}
|
|
878
|
+
isHandshake(message) {
|
|
879
|
+
if (!isWrapped(message)) {
|
|
880
|
+
this.logMalformed(message);
|
|
881
|
+
return false;
|
|
882
|
+
}
|
|
883
|
+
const tunnelData = unwrap(
|
|
884
|
+
message
|
|
885
|
+
);
|
|
886
|
+
if (!isPlainObject(tunnelData) || typeof tunnelData.version !== "string" || !(Reflect.has(tunnelData, "accepts") || Reflect.has(tunnelData, "offers"))) {
|
|
887
|
+
this.logMalformed(message);
|
|
888
|
+
return false;
|
|
889
|
+
}
|
|
890
|
+
const { version } = tunnelData;
|
|
891
|
+
if (version !== VERSION && !this.versionWarnings.has(version)) {
|
|
892
|
+
this.versionWarnings.add(version);
|
|
893
|
+
this.logger.warn(
|
|
894
|
+
`SDK version mismatch. ${this.myOrigin} is using v${VERSION}, but received message from ${this.remoteOrigin} using SDK v${version}. Extensions may be broken or unresponsive.`
|
|
895
|
+
);
|
|
896
|
+
}
|
|
897
|
+
return true;
|
|
898
|
+
}
|
|
899
|
+
logMalformed(message) {
|
|
900
|
+
let inspectedMessage;
|
|
901
|
+
try {
|
|
902
|
+
inspectedMessage = JSON.stringify(message, null, 2);
|
|
903
|
+
} catch (_) {
|
|
904
|
+
try {
|
|
905
|
+
inspectedMessage = message.toString();
|
|
906
|
+
} catch (e) {
|
|
907
|
+
inspectedMessage = Object.prototype.toString.call(message);
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
this.logger.error(
|
|
911
|
+
`Malformed tunnel message sent from SDK at ${this.remoteOrigin} to ${this.myOrigin}:
|
|
912
|
+
${inspectedMessage}
|
|
913
|
+
Message must be an object with "${NS_ROOT}" property, which must be an object with a "version" string and an either an "accepts" or "offers" property containing an ID string.`
|
|
914
|
+
);
|
|
915
|
+
}
|
|
916
|
+
};
|
|
917
|
+
|
|
918
|
+
// src/tunnel/tunnel.ts
|
|
919
|
+
var RETRY_MS = 100;
|
|
920
|
+
var STATUSCHECK_MS = 5e3;
|
|
921
|
+
var KEY_BASE = 36;
|
|
922
|
+
var KEY_LENGTH = 8;
|
|
923
|
+
var KEY_EXP = KEY_BASE ** KEY_LENGTH;
|
|
924
|
+
var makeKey = () => Math.round(Math.random() * KEY_EXP).toString(KEY_BASE);
|
|
925
|
+
var badTimeout = "\n - timeout value must be a number of milliseconds";
|
|
926
|
+
var badTargetOrigin = "\n - targetOrigin must be a valid URL origin or '*' for any origin";
|
|
927
|
+
function isFromOrigin(event, source, targetOrigin) {
|
|
928
|
+
try {
|
|
929
|
+
return source === event.source && (targetOrigin === "*" || targetOrigin === new URL(event.origin).origin);
|
|
930
|
+
} catch (_) {
|
|
931
|
+
return false;
|
|
932
|
+
}
|
|
933
|
+
}
|
|
934
|
+
var { emit: emitOn } = import_eventemitter3.default.prototype;
|
|
935
|
+
var Tunnel = class extends import_eventemitter3.default {
|
|
936
|
+
constructor(config) {
|
|
937
|
+
super();
|
|
938
|
+
this.emitLocal = (type, payload) => {
|
|
939
|
+
return emitOn.call(this, type, payload);
|
|
940
|
+
};
|
|
941
|
+
this._emitFromMessage = ({ data: { type, payload } }) => {
|
|
942
|
+
this.emitLocal(type, payload);
|
|
943
|
+
};
|
|
944
|
+
this.config = config;
|
|
945
|
+
}
|
|
946
|
+
static toIframe(target, options) {
|
|
947
|
+
if (!isIframe(target)) {
|
|
948
|
+
throw new Error(
|
|
949
|
+
`Provided tunnel target is not an iframe! ${Object.prototype.toString.call(
|
|
950
|
+
target
|
|
951
|
+
)}`
|
|
952
|
+
);
|
|
953
|
+
}
|
|
954
|
+
const source = target.contentWindow;
|
|
955
|
+
const config = Tunnel._normalizeConfig(options);
|
|
956
|
+
const tunnel = new Tunnel(config);
|
|
957
|
+
const messenger = new TunnelMessenger({
|
|
958
|
+
myOrigin: window.location.origin,
|
|
959
|
+
targetOrigin: options.targetOrigin,
|
|
960
|
+
logger: options.logger || console
|
|
961
|
+
});
|
|
962
|
+
let frameStatusCheck;
|
|
963
|
+
let timeout;
|
|
964
|
+
const offerListener = (event) => {
|
|
965
|
+
if (isFromOrigin(event, source, config.targetOrigin) && messenger.isHandshakeOffer(event.data)) {
|
|
966
|
+
const accepted = messenger.makeAccepted(unwrap(event.data).offers);
|
|
967
|
+
const channel = new MessageChannel();
|
|
968
|
+
source.postMessage(accepted, config.targetOrigin, [channel.port1]);
|
|
969
|
+
tunnel.connect(channel.port2);
|
|
970
|
+
}
|
|
971
|
+
};
|
|
972
|
+
const cleanup = () => {
|
|
973
|
+
clearTimeout(timeout);
|
|
974
|
+
clearInterval(frameStatusCheck);
|
|
975
|
+
window.removeEventListener("message", offerListener);
|
|
976
|
+
};
|
|
977
|
+
timeout = window.setTimeout(() => {
|
|
978
|
+
tunnel.emitLocal(
|
|
979
|
+
"error",
|
|
980
|
+
new Error(
|
|
981
|
+
`Timed out awaiting initial message from iframe after ${config.timeout}ms`
|
|
982
|
+
)
|
|
983
|
+
);
|
|
984
|
+
tunnel.destroy();
|
|
985
|
+
}, config.timeout);
|
|
986
|
+
tunnel.on("destroyed", cleanup);
|
|
987
|
+
tunnel.on("connected", () => clearTimeout(timeout));
|
|
988
|
+
frameStatusCheck = window.setInterval(() => {
|
|
989
|
+
if (!target.isConnected) {
|
|
990
|
+
tunnel.destroy();
|
|
991
|
+
}
|
|
992
|
+
}, STATUSCHECK_MS);
|
|
993
|
+
window.addEventListener("message", offerListener);
|
|
994
|
+
return tunnel;
|
|
995
|
+
}
|
|
996
|
+
static toParent(source, opts) {
|
|
997
|
+
let retrying;
|
|
998
|
+
let timeout;
|
|
999
|
+
const key = makeKey();
|
|
1000
|
+
const config = Tunnel._normalizeConfig(opts);
|
|
1001
|
+
const tunnel = new Tunnel(config);
|
|
1002
|
+
const messenger = new TunnelMessenger({
|
|
1003
|
+
myOrigin: window.location.origin,
|
|
1004
|
+
targetOrigin: config.targetOrigin,
|
|
1005
|
+
logger: config.logger
|
|
1006
|
+
});
|
|
1007
|
+
const acceptListener = (event) => {
|
|
1008
|
+
if (isFromOrigin(event, source, config.targetOrigin) && messenger.isHandshakeAccepting(event.data, key)) {
|
|
1009
|
+
cleanup();
|
|
1010
|
+
if (!event.ports || !event.ports.length) {
|
|
1011
|
+
const portError = new Error(
|
|
1012
|
+
"Received handshake accept message, but it did not include a MessagePort to establish tunnel"
|
|
1013
|
+
);
|
|
1014
|
+
tunnel.emitLocal("error", portError);
|
|
1015
|
+
return;
|
|
1016
|
+
}
|
|
1017
|
+
tunnel.connect(event.ports[0]);
|
|
1018
|
+
}
|
|
1019
|
+
};
|
|
1020
|
+
const cleanup = () => {
|
|
1021
|
+
clearInterval(retrying);
|
|
1022
|
+
clearTimeout(timeout);
|
|
1023
|
+
window.removeEventListener("message", acceptListener);
|
|
1024
|
+
};
|
|
1025
|
+
timeout = window.setTimeout(() => {
|
|
1026
|
+
tunnel.emitLocal(
|
|
1027
|
+
"error",
|
|
1028
|
+
new Error(
|
|
1029
|
+
`Timed out waiting for initial response from parent after ${config.timeout}ms`
|
|
1030
|
+
)
|
|
1031
|
+
);
|
|
1032
|
+
tunnel.destroy();
|
|
1033
|
+
}, config.timeout);
|
|
1034
|
+
window.addEventListener("message", acceptListener);
|
|
1035
|
+
tunnel.on("destroyed", cleanup);
|
|
1036
|
+
tunnel.on("connected", cleanup);
|
|
1037
|
+
const sendOffer = () => source.postMessage(messenger.makeOffered(key), config.targetOrigin);
|
|
1038
|
+
retrying = window.setInterval(sendOffer, RETRY_MS);
|
|
1039
|
+
sendOffer();
|
|
1040
|
+
return tunnel;
|
|
1041
|
+
}
|
|
1042
|
+
connect(remote) {
|
|
1043
|
+
if (this._messagePort) {
|
|
1044
|
+
this._messagePort.removeEventListener("message", this._emitFromMessage);
|
|
1045
|
+
this._messagePort.close();
|
|
1046
|
+
}
|
|
1047
|
+
this._messagePort = remote;
|
|
1048
|
+
remote.addEventListener("message", this._emitFromMessage);
|
|
1049
|
+
this.emit("connected");
|
|
1050
|
+
this._messagePort.start();
|
|
1051
|
+
}
|
|
1052
|
+
destroy() {
|
|
1053
|
+
if (this._messagePort) {
|
|
1054
|
+
this._messagePort.close();
|
|
1055
|
+
this._messagePort = null;
|
|
1056
|
+
}
|
|
1057
|
+
this.emitLocal("destroyed");
|
|
1058
|
+
this.emit("destroyed");
|
|
1059
|
+
}
|
|
1060
|
+
emit(type, payload) {
|
|
1061
|
+
if (!this._messagePort) {
|
|
1062
|
+
return false;
|
|
1063
|
+
}
|
|
1064
|
+
this._messagePort.postMessage({ type, payload });
|
|
1065
|
+
return true;
|
|
1066
|
+
}
|
|
1067
|
+
static _normalizeConfig(options = {}) {
|
|
1068
|
+
let errorMessage = "";
|
|
1069
|
+
const config = {
|
|
1070
|
+
timeout: 4e3,
|
|
1071
|
+
logger: console,
|
|
1072
|
+
...options
|
|
1073
|
+
};
|
|
1074
|
+
const timeoutMs = Number(config.timeout);
|
|
1075
|
+
if (!Number.isSafeInteger(timeoutMs)) {
|
|
1076
|
+
errorMessage += badTimeout;
|
|
1077
|
+
}
|
|
1078
|
+
if (config.targetOrigin !== "*") {
|
|
1079
|
+
try {
|
|
1080
|
+
new URL(config.targetOrigin);
|
|
1081
|
+
} catch (e) {
|
|
1082
|
+
errorMessage += badTargetOrigin;
|
|
1083
|
+
}
|
|
1084
|
+
}
|
|
1085
|
+
if (errorMessage) {
|
|
1086
|
+
throw new Error(`Invalid tunnel configuration: ${errorMessage}`);
|
|
1087
|
+
}
|
|
1088
|
+
return config;
|
|
1089
|
+
}
|
|
1090
|
+
};
|
|
1091
|
+
|
|
1092
|
+
// src/cross-realm-object.ts
|
|
1093
|
+
var INIT_MESSAGE = wrap(INIT_TICKET);
|
|
1094
|
+
async function setupApiExchange(tunnel, apiToSend) {
|
|
1095
|
+
let done = false;
|
|
1096
|
+
let remoteApi;
|
|
1097
|
+
const xrObject = {
|
|
1098
|
+
tunnel,
|
|
1099
|
+
getRemoteApi() {
|
|
1100
|
+
return remoteApi;
|
|
1101
|
+
}
|
|
1102
|
+
};
|
|
1103
|
+
return timeoutPromise(
|
|
1104
|
+
"Initial API exchange",
|
|
1105
|
+
new Promise((resolve, reject) => {
|
|
1106
|
+
const simulator = ObjectSimulator.create(tunnel, FinalizationRegistry);
|
|
1107
|
+
const sendApi = simulator.makeSender(INIT_MESSAGE);
|
|
1108
|
+
const apiCallback = (api) => {
|
|
1109
|
+
remoteApi = api;
|
|
1110
|
+
if (!done) {
|
|
1111
|
+
done = true;
|
|
1112
|
+
resolve(xrObject);
|
|
1113
|
+
}
|
|
1114
|
+
};
|
|
1115
|
+
tunnel.on("api", apiCallback);
|
|
1116
|
+
const unsubscribe = receiveCalls(
|
|
1117
|
+
(api) => tunnel.emitLocal("api", api),
|
|
1118
|
+
INIT_TICKET,
|
|
1119
|
+
new WeakRef(simulator.subject)
|
|
1120
|
+
);
|
|
1121
|
+
const destroy = (e) => {
|
|
1122
|
+
unsubscribe();
|
|
1123
|
+
if (!done) {
|
|
1124
|
+
done = true;
|
|
1125
|
+
reject(e);
|
|
1126
|
+
}
|
|
1127
|
+
};
|
|
1128
|
+
tunnel.on("destroyed", destroy);
|
|
1129
|
+
tunnel.on(
|
|
1130
|
+
"connected",
|
|
1131
|
+
() => sendApi(apiToSend).catch(destroy)
|
|
1132
|
+
);
|
|
1133
|
+
}),
|
|
1134
|
+
tunnel.config.timeout,
|
|
1135
|
+
() => tunnel.destroy()
|
|
1136
|
+
);
|
|
1137
|
+
}
|
|
1138
|
+
async function connectParentWindow(tunnelOptions, apiToSend) {
|
|
1139
|
+
const tunnel = Tunnel.toParent(window.parent, tunnelOptions);
|
|
1140
|
+
return setupApiExchange(tunnel, apiToSend);
|
|
1141
|
+
}
|
|
1142
|
+
async function connectIframe(frame, tunnelOptions, apiToSend) {
|
|
1143
|
+
const tunnel = Tunnel.toIframe(frame, tunnelOptions);
|
|
1144
|
+
return setupApiExchange(tunnel, apiToSend);
|
|
1145
|
+
}
|
|
1146
|
+
|
|
1147
|
+
// src/promises/wait.ts
|
|
1148
|
+
function wait(ms) {
|
|
1149
|
+
return new Promise((resolve) => {
|
|
1150
|
+
setTimeout(resolve, ms);
|
|
256
1151
|
});
|
|
257
1152
|
}
|
|
258
1153
|
|
|
259
1154
|
exports.Emitter = Emitter;
|
|
1155
|
+
exports.Tunnel = Tunnel;
|
|
260
1156
|
exports._customConsole = _customConsole;
|
|
1157
|
+
exports.connectIframe = connectIframe;
|
|
1158
|
+
exports.connectParentWindow = connectParentWindow;
|
|
261
1159
|
exports.debugEmitter = debugEmitter;
|
|
262
1160
|
exports.makeNamespaceProxy = makeNamespaceProxy;
|
|
263
1161
|
exports.quietConsole = quietConsole;
|
|
264
1162
|
exports.timeoutPromise = timeoutPromise;
|
|
1163
|
+
exports.wait = wait;
|
|
265
1164
|
//# sourceMappingURL=out.js.map
|
|
266
1165
|
//# sourceMappingURL=index.js.map
|