@adobe/uix-core 1.0.2 → 1.0.4
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/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/namespace-proxy.d.ts +2 -2
- package/dist/namespace-proxy.d.ts.map +1 -1
- package/dist/types.d.ts +4 -19
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/namespace-proxy.ts +4 -4
- package/src/types.ts +4 -20
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/eventemitter3/index.js","../src/debuglog.ts","../src/debug-emitter.ts","../src/emitter.ts","../src/namespace-proxy.ts","../src/constants.ts","../src/value-assertions.ts","../src/message-wrapper.ts","../src/object-walker.ts","../src/rpc/call-receiver.ts","../src/rpc/call-sender.ts","../src/remote-subject.ts","../src/object-simulator.ts","../src/promises/timed.ts","../src/tickets.ts","../src/tunnel/tunnel.ts","../src/tunnel/tunnel-messenger.ts","../src/cross-realm-object.ts","../src/logging-formatters.ts","../src/promises/wait.ts"],"names":["EventEmitter","target","ticket"],"mappings":"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","sourcesContent":["'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","/**\nCopyright 2022 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\n/**\n * Fancy looking console decorator.\n * @hidden\n * @internal\n */\n\n/** @internal */\nconst isDarkMode = () =>\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n\n/** @internal */\ntype Layout = {\n padX: number;\n padY: number;\n rounded: number;\n fontSize: number;\n emphasis: Style;\n};\n/** @internal */\ntype HexColor = `#${string}` | \"transparent\";\n/** @internal */\ntype Color = {\n text: HexColor;\n bg: HexColor;\n hilight: HexColor;\n shadow: HexColor;\n};\n/** @internal */\ntype ThemeSpec = Color & Layout;\n\n/** @internal */\nconst Layouts: Record<string, Layout> = {\n medium: {\n padX: 5,\n padY: 3,\n rounded: 4,\n fontSize: 100,\n emphasis: \"font-weight: bold;\",\n },\n small: {\n padX: 3,\n padY: 1,\n rounded: 2,\n fontSize: 95,\n emphasis: \"font-style: italic;\",\n },\n};\n\n/** @internal */\nconst Colors: Record<string, Color> = {\n yellow: {\n text: \"#333333\",\n bg: \"#EBD932\",\n hilight: \"#F7E434\",\n shadow: \"#D1C12C\",\n },\n green: {\n text: \"#333333\",\n bg: \"#96EB5E\",\n hilight: \"#9EF763\",\n shadow: \"#85D154\",\n },\n blue: {\n text: \"#333333\",\n bg: \"#8DD0EB\",\n hilight: \"#88F0F7\",\n shadow: \"#74AED4\",\n },\n gray: isDarkMode()\n ? {\n text: \"#eeeeee\",\n bg: \"transparent\",\n hilight: \"#cecece\",\n shadow: \"#cecece\",\n }\n : {\n text: \"#333333\",\n bg: \"#eeeeee\",\n hilight: \"#f6f6f6\",\n shadow: \"#cecece\",\n },\n};\n\n/** @internal */\ntype ThemeTag = `${keyof typeof Colors} ${keyof typeof Layouts}`;\n\n/**\n * @internal\n */\nexport type Theme = ThemeSpec | ThemeTag;\n\n/** @internal */\ntype LogDecorator = (...args: unknown[]) => unknown[];\n\n/** @internal */\ntype Style = `${string};`;\n\nfunction memoizeUnary<T, U>(fn: (arg: T) => U): typeof fn {\n const cache: Map<T, U> = new Map();\n return (arg) => {\n if (!cache.has(arg)) {\n const result = fn(arg);\n cache.set(arg, result);\n if (cache.size > 100) {\n cache.delete(cache.keys().next().value as T);\n }\n return result;\n }\n return cache.get(arg);\n };\n}\n\nconst toTheme = memoizeUnary((theme: Theme): ThemeSpec => {\n if (typeof theme === \"string\") {\n const [color, size] = theme.split(\" \");\n return {\n ...Colors[color],\n ...Layouts[size],\n };\n }\n return theme;\n});\n\nconst block: Style = `display: inline-block; border: 1px solid;`;\n\nconst flatten = (side: \"left\" | \"right\"): Style =>\n `padding-${side}: 0px; border-${side}-width: 0px; border-top-${side}-radius: 0px; border-bottom-${side}-radius: 0px;`;\n\nconst toColor = ({ bg, hilight, shadow, text }: Color): Style =>\n `color: ${text}; background: ${bg}; border-color: ${hilight} ${shadow} ${shadow} ${hilight};`;\n\nconst toLayout = ({ fontSize, padY, padX, rounded }: Layout) =>\n `font-size: ${fontSize}%; padding: ${padY}px ${padX}px; border-radius: ${rounded}px;`;\n\nconst toBubbleStyle = memoizeUnary((theme: ThemeSpec): string[] => {\n const base = `${block}${toColor(theme)}${toLayout(theme)}`;\n return [\n `${base}${flatten(\"right\")}`,\n `${base}${flatten(\"left\")}${theme.emphasis}`,\n ] as Style[];\n});\n\nfunction toBubblePrepender(\n bubbleLeft: string,\n bubbleRight: string,\n theme: ThemeSpec\n): LogDecorator {\n const prefix = `%c${bubbleLeft}%c ${bubbleRight}`;\n const [left, right] = toBubbleStyle(theme);\n return (args: unknown[]) => {\n const bubbleArgs = [prefix, left, right];\n if (typeof args[0] === \"string\") {\n bubbleArgs[0] = `${prefix}%c ${args.shift() as string}`;\n bubbleArgs.push(\"\"); // reset style\n }\n return [...bubbleArgs, ...args];\n };\n}\n\n/** @internal */\nconst stateTypes = {\n event: \"️⚡️\",\n} as const;\n\nconst stateDelim = \" ⤻ \";\n\n/** @internal */\ntype DebugState = { type: keyof typeof stateTypes; name: string };\n\n// Serialize to memoize.\nconst getStateFormatter = memoizeUnary((stateJson: string) => {\n const stateStack = JSON.parse(stateJson) as unknown as DebugState[];\n const firstState = stateStack.shift();\n const left = stateTypes[firstState.type];\n const right = [\n firstState.name,\n ...stateStack.map((state) => `${stateTypes[state.type]} ${state.name}`),\n ].join(stateDelim);\n return toBubblePrepender(left, right, toTheme(\"gray small\"));\n});\nconst getStatePrepender = (stateStack: DebugState[]) =>\n getStateFormatter(JSON.stringify(stateStack));\n\nconst overrideMethods = [\"log\", \"error\", \"warn\", \"info\", \"debug\"] as const;\n\nconst identity = <T>(x: T) => x;\n\nconst noop = (): (() => undefined) => undefined;\n\n/**\n * A console, plus some methods to track event lifecycles.\n * @internal\n */\nexport interface DebugLogger extends Console {\n /**\n * Stop all logging; methods do nothing\n * @internal\n */\n detach(): void;\n /**\n * Add an event bubble to the log during handler.\n */\n pushState(state: DebugState): void;\n /**\n * Remove the bubble when event is done dispatching\n */\n popState(): void;\n}\n\n/**\n * Returns a console whose methods autoformat with bubbles.\n * @internal\n */\nexport function _customConsole(\n theme: Theme,\n type: string,\n name: string\n): DebugLogger {\n const prepender = toBubblePrepender(`X${type}`, name, toTheme(theme));\n let statePrepender: LogDecorator = identity as LogDecorator;\n const stateStack: DebugState[] = [];\n const loggerProto: PropertyDescriptorMap = {\n detach: {\n writable: true,\n configurable: true,\n value(this: DebugLogger) {\n overrideMethods.forEach((method) => {\n this[method] = noop;\n });\n },\n },\n pushState: {\n value(state: DebugState) {\n stateStack.push(state);\n statePrepender = getStatePrepender(stateStack);\n },\n },\n popState: {\n value() {\n stateStack.pop();\n statePrepender =\n stateStack.length === 0\n ? (identity as LogDecorator)\n : getStatePrepender(stateStack);\n },\n },\n };\n const customConsole = Object.create(\n console,\n overrideMethods.reduce((out, level) => {\n out[level] = {\n writable: true,\n configurable: true,\n value(...args: unknown[]) {\n console[level](...prepender(statePrepender(args)));\n },\n };\n return out;\n }, loggerProto)\n ) as DebugLogger;\n return customConsole;\n}\n\n/**\n * @internal\n */\nexport const quietConsole = new Proxy(console, {\n get() {\n return noop;\n },\n});\n","/*\nCopyright 2022 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport { _customConsole, DebugLogger, Theme } from \"./debuglog.js\";\nimport { Emits, Unsubscriber } from \"./types.js\";\n\n/**\n * Adds methods for logging events\n * @internal\n */\nexport interface EmitterDebugLogger extends DebugLogger {\n /**\n * Listen to an event and pass the logger to the handler\n * @internal\n */\n listen(\n type: string,\n listener: (logger: EmitterDebugLogger, ev: CustomEvent) => unknown\n ): this;\n}\n\n/**\n * Debugger for EventTarget objects like Hosts, Ports and Guests, which\n * patches dispatchEvent to log events\n * Adapter to attach console logging listeners to all events on an emitter.\n * @internal\n */\nexport function debugEmitter(\n emitter: Emits,\n opts: {\n theme: Theme;\n type?: string;\n id?: string;\n }\n): EmitterDebugLogger {\n const logger = _customConsole(\n opts.theme,\n opts.type ||\n (Object.getPrototypeOf(emitter) as typeof emitter).constructor.name,\n opts.id || emitter.id\n ) as EmitterDebugLogger;\n const oldDispatch = emitter.dispatchEvent;\n emitter.dispatchEvent = (event) => {\n logger.pushState({ type: \"event\", name: event.type });\n const retVal = oldDispatch.call(emitter, event) as boolean;\n logger.popState();\n return retVal;\n };\n\n const subscriptions: Unsubscriber[] = [];\n\n const oldDetach = logger.detach;\n logger.detach = () => {\n oldDetach.call(logger);\n subscriptions.forEach((unsubscribe) => unsubscribe());\n };\n\n /**\n * Listens and passes a logger to callbacks\n */\n function listen(\n type: string,\n listener: (logger: EmitterDebugLogger, ev: CustomEvent) => unknown\n ) {\n subscriptions.push(\n emitter.addEventListener(type, (event) => listener(logger, event))\n );\n return logger;\n }\n\n logger.listen = listen;\n\n return logger;\n}\n","/*\nCopyright 2022 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport { Emits, Unsubscriber, NamedEvent } from \"./types.js\";\n\n/**\n * Browser-native {@link https://developer.mozilla.org/en-US/docs/Web/API/EventTarget | EventTarget}\n * whose {@link Emitter.addEventListener} method returns an anonymous function\n * which unsubscribes the original handler.\n *\n * Also provides typed events via generics. You can create or extend this class\n * to define custom emitters with known event names and signatures.\n *\n * @example\n * ```ts\n * import type { NamedEvent, Emitter } from '@adobe/uix-sdk'\n *\n * class FizzBuzzEmitter extends Emitter<\n * NamedEvent<\"fizz\", { fizzCount: number }> |\n * NamedEvent<\"buzz\", { buzzCount: number }> |\n * NamedEvent<\"fizzbuzz\">\n * > {\n * }\n * ```\n * The `FizzBuzzEmitter` class will now type check its events and event\n * listeners, providing autosuggest in editors.\n *\n * @see [EventTarget - MDN](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget)\n *\n * @public\n */\nexport class Emitter<Events extends NamedEvent>\n extends EventTarget\n implements Emits<Events>\n{\n /**\n * An arbitrary string to uniquely identify this emitter and its events.\n * @public\n */\n id: string;\n constructor(id: string) {\n super();\n this.id = id;\n }\n /**\n * Convenience method to construct and dispatch custom events.\n *\n * @param type - Name of one of the allowed events this can emit\n * @param detail - Object to expose in the {@link https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/detail | CustomEvent#detail}\n * property.\n * @public\n */\n protected emit<Event extends Events>(\n type: Event[\"type\"],\n detail: Event[\"detail\"]\n ): void {\n const event = new CustomEvent<typeof detail>(type, { detail });\n this.dispatchEvent(event);\n }\n /**\n * Subscribe to an event and receive an unsubscribe callback.\n * @see [EventTarget.addEventListener - MDN](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener)\n *\n * Identical to `EventTarget.addEventListener`, but returns an \"unsubscriber\"\n * function which detaches the listener when invoked. Solves an ergonomic\n * problem with native EventTargets where it's impossible to detach listeners\n * without having a reference to the original handler.\n *\n * @typeParam E - Name of one of the allowed events this can emit\n * @param type - Event type\n * @param listener - Event handler\n * @returns Call to unsubscribe listener.\n */\n addEventListener<\n Type extends Events[\"type\"],\n Event extends Extract<Events, { type: Type }>\n >(type: Type, listener: (ev: Event) => unknown): Unsubscriber {\n super.addEventListener(type, listener);\n return () => super.removeEventListener(type, listener);\n }\n}\n","/*\nCopyright 2022 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { RemoteHostApis, RemoteMethodInvoker } from \"./types.js\";\n\n/**\n * Build a fake object that turns \"method calls\" into RPC messages\n * The resulting object will recursively make more fake proxies on demand until\n * one of the looked-up properties is invoked as a function.\n * Then it will call the passed `invoke` method with a {@link HostMethodAddress}\n * that can send the method invocation as an RPC message to another realm.\n *\n * @example\n * ```js\n * const invoker = (methodAddress) => console.log(\n * address.path,\n * address.name,\n * address.args\n * );\n * const ns = makeNamespaceProxy(invoker);\n *\n * // looking up any property on the object will work\n *\n * ns.example.builds.method.call.message(\"foo\", 1);\n *\n * // Console will log:\n * ['example','builds','method','call']\n * 'message'\n * [\"foo\", 1]\n *```\n * @internal\n *\n * @param invoke - Callback that receives address\n */\nexport function makeNamespaceProxy<ProxiedApi extends object>(\n invoke: RemoteMethodInvoker<unknown>,\n path: string[] = []\n): RemoteHostApis<ProxiedApi> {\n const handler: ProxyHandler<Record<string, any>> = {\n get: (target, prop) => {\n if (typeof prop === \"string\") {\n if (!Reflect.has(target, prop)) {\n const next = makeNamespaceProxy(invoke, path.concat(prop));\n Reflect.set(target, prop, next);\n }\n return Reflect.get(target, prop) as unknown;\n } else {\n throw new Error(\n `Cannot look up a symbol ${String(prop)} on a host connection proxy.`\n );\n }\n },\n };\n const target = {} as unknown as RemoteHostApis<ProxiedApi>;\n // Only trap the apply if there's at least two levels of namespace.\n // uix.host() is not a function, and neither is uix.host.bareMethod().\n if (path.length < 2) {\n return new Proxy<RemoteHostApis<ProxiedApi>>(target, handler);\n }\n const invoker = (...args: unknown[]) =>\n invoke({\n path: path.slice(0, -1),\n name: path[path.length - 1],\n args,\n });\n return new Proxy<typeof invoker>(invoker, {\n ...handler,\n apply(target, _, args: unknown[]) {\n return target(...args);\n },\n }) as unknown as typeof target;\n}\n","declare const UIX_SDK_VERSION: string;\ndeclare const UIX_SDK_BUILDMODE: string;\n\n/** @internal */\nexport const NS_ROOT = \"_$pg\";\nexport const VERSION = UIX_SDK_VERSION;\nexport const BUILDMODE = UIX_SDK_BUILDMODE;\nexport const SYM_CLEANUP = Symbol(`${NS_ROOT}_cleanup`);\nexport const SYM_INTERNAL = Symbol(`${NS_ROOT}_internal`);\nexport const INIT_CALLBACK = `${NS_ROOT}_init_cb`;\n","/** @internal */\nexport type Primitive = string | number | boolean;\n\nexport function isPlainObject<T>(value: unknown): value is T & object {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n const proto = Reflect.getPrototypeOf(value);\n return proto === null || proto === Object.prototype;\n}\n\nexport function isPrimitive(value: unknown): value is Primitive {\n if (!value) {\n return true;\n }\n const theType = typeof value;\n return theType === \"string\" || theType === \"number\" || theType === \"boolean\";\n}\n\nexport function isIterable<T>(value: unknown): value is T[] {\n return Array.isArray(value);\n}\n\nexport function isFunction(value: unknown): value is CallableFunction {\n return typeof value === \"function\";\n}\n\nexport function hasProp(value: unknown, prop: string) {\n return !isPrimitive(value) && Reflect.has(value as object, prop);\n}\n\nexport function isTunnelSource(\n value: unknown\n): value is Window | ServiceWorker {\n return (\n value instanceof Window ||\n value instanceof ServiceWorker ||\n hasProp(value, \"onmessage\")\n );\n}\n\nexport function isIframe(value: unknown): value is HTMLIFrameElement {\n if (!value || isPrimitive(value)) {\n return false;\n }\n const { nodeName } = value as HTMLIFrameElement;\n return typeof nodeName === \"string\" && nodeName.toLowerCase() === \"iframe\";\n}\n\nexport function isObjectWithPrototype<T>(\n value: unknown\n): value is T & { [key: string | symbol]: unknown } {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n const proto = Reflect.getPrototypeOf(value);\n return proto !== Object.prototype;\n}\n","import { NS_ROOT } from \"./constants\";\nimport { isPlainObject } from \"./value-assertions\";\n\n/** @internal */\nexport type WrappedMessage<Message extends object> = { [NS_ROOT]: Message };\n\nexport function wrap<Message extends object = object>(\n message: Message\n): WrappedMessage<Message> {\n return { [NS_ROOT]: message };\n}\n\nexport function unwrap<Message extends object>(\n wrappedMessage: WrappedMessage<Message>\n): Message {\n return wrappedMessage[NS_ROOT];\n}\n\nexport function isWrapped<Message extends object = object>(\n item: unknown\n): item is WrappedMessage<Message> {\n if (!isPlainObject(item)) {\n return false;\n }\n const keys = Object.keys(item);\n const hasRoot = keys.includes(NS_ROOT);\n if (hasRoot && keys.length != 1) {\n console.error(\n `malformed tunnel message, should have one prop \"${NS_ROOT}\" at root`,\n item\n );\n return false;\n }\n return hasRoot;\n}\n","import type { WrappedMessage } from \"./message-wrapper\";\nimport type { DefTicket } from \"./tickets\";\nimport {\n Primitive,\n isPlainObject,\n isPrimitive,\n isIterable,\n isObjectWithPrototype,\n} from \"./value-assertions\";\n\n/**\n * Extract keys of T whose values are assignable to U.\n * @internal\n */\ntype ExtractKeys<T, U> = {\n [P in keyof T]: T[P] extends U ? P : never;\n}[keyof T];\n\n/**\n * Convert all functions anywhere in T to async functions.\n * @internal\n */\nexport type Asynced<T> = T extends (...args: infer A) => infer R\n ? (...args: A) => Promise<R>\n : {\n [K in ExtractKeys<\n T,\n Function | object | any[] | [any, any]\n >]: T[K] extends (...args: any) => PromiseLike<any>\n ? T[K]\n : T[K] extends [infer U, infer V]\n ? [Asynced<U>, Asynced<V>]\n : T[K] extends (infer U)[]\n ? Asynced<U>[]\n : T[K] extends (...args: infer A) => infer R\n ? (...args: A) => Promise<R>\n : Asynced<T[K]>;\n };\n\n/** @internal */\nexport type Materialized<T> = T extends Primitive\n ? T\n : // : T extends (...args: infer A) => infer R\n // ? (...args: A) => Promise<R>\n T extends Simulated<infer U>\n ? Asynced<U>\n : Asynced<T>;\n\n/** @internal */\nexport type DefMessage = WrappedMessage<DefTicket>;\n\n/** @internal */\nexport type Simulated<T> = {\n [K in ExtractKeys<T, Function | object>]: T[K] extends (\n ...args: unknown[]\n ) => unknown\n ? DefMessage\n : Simulated<T[K]>;\n};\n\nexport const NOT_TRANSFORMED = Symbol.for(\"NOT_TRANSFORMED\");\nexport const CIRCULAR = \"[[Circular]]\";\n\nexport function transformRecursive<To>(\n transform: (source: unknown, parent?: Object) => To | typeof NOT_TRANSFORMED,\n value: unknown,\n parent?: Object,\n _refs: WeakSet<object> = new WeakSet()\n): To {\n if (isPrimitive(value)) {\n return value as To;\n }\n const transformed = transform(value, parent);\n if (transformed !== NOT_TRANSFORMED) {\n return transformed;\n }\n if (isIterable(value)) {\n const outArray = [];\n for (const item of value) {\n outArray.push(transformRecursive(transform, item, undefined, _refs));\n }\n return outArray as To;\n }\n if (isPlainObject(value)) {\n if (_refs.has(value)) {\n return CIRCULAR as To;\n }\n _refs.add(value);\n const outObj = {};\n for (const key of Reflect.ownKeys(value)) {\n Reflect.set(\n outObj,\n key,\n transformRecursive(transform, Reflect.get(value, key), undefined, _refs)\n );\n }\n return outObj as To;\n }\n if (isObjectWithPrototype(value)) {\n if (_refs.has(value)) {\n return CIRCULAR as To;\n }\n _refs.add(value);\n const getObjectKeys = (obj: Object): (string | symbol)[] => {\n const result: Set<string | symbol> = new Set();\n do {\n if (Reflect.getPrototypeOf(obj) !== null) {\n for (const prop of Object.getOwnPropertyNames(obj)) {\n if (prop === \"constructor\") {\n continue;\n }\n result.add(prop);\n }\n }\n } while ((obj = Reflect.getPrototypeOf(obj)));\n\n return [...result];\n };\n const outObj = {};\n const properties = getObjectKeys(value);\n for (const key of properties) {\n Reflect.set(\n outObj,\n key,\n transformRecursive(transform, Reflect.get(value, key), value, _refs)\n );\n }\n return outObj as To;\n }\n\n throw new Error(`Bad value! ${Object.prototype.toString.call(value)}`);\n}\n","import type { CallArgsTicket, DefTicket } from \"../tickets\";\nimport type { RemoteSubject } from \"../remote-subject\";\n\nexport function receiveCalls(\n fn: CallableFunction,\n ticket: DefTicket,\n remote: WeakRef<RemoteSubject>\n) {\n const responder = async ({ fnId, callId, args }: CallArgsTicket) => {\n /* istanbul ignore next: should never happen */\n try {\n const value = await fn(...args);\n remote.deref().respond({\n fnId,\n callId,\n value,\n status: \"resolve\",\n });\n } catch (error) {\n remote.deref().respond({\n fnId,\n callId,\n status: \"reject\",\n error,\n });\n }\n };\n return remote.deref().onCall(ticket, responder);\n}\n","import type { CallArgsTicket, DefTicket } from \"../tickets\";\nimport type { RemoteSubject } from \"../remote-subject\";\n\ntype RejectionPool = Set<(e: Error) => unknown>;\n\nclass DisconnectionError extends Error {\n constructor() {\n super(\n \"Function belongs to a simulated remote object which has been disconnected! The tunnel may have been destroyed by page navigation or reload.\"\n );\n }\n}\n\nfunction dispatch(\n subject: RemoteSubject,\n callTicket: CallArgsTicket,\n rejectionPool: RejectionPool,\n resolve: { (value: unknown): void; (arg0: any): void },\n reject: { (reason?: string): void; (arg0: any): void }\n) {\n subject.onRespond(callTicket, (responseTicket) => {\n rejectionPool.delete(reject);\n if (responseTicket.status === \"resolve\") {\n resolve(responseTicket.value);\n } else {\n reject(responseTicket.error);\n }\n });\n subject.send(callTicket);\n}\n\nexport function makeCallSender(\n { fnId }: DefTicket,\n subjectRef: WeakRef<RemoteSubject>\n) {\n let callCounter = 0;\n const rejectionPool: RejectionPool = new Set();\n let sender = function (...args: unknown[]) {\n return new Promise((resolve, reject) => {\n rejectionPool.add(reject);\n const callId = ++callCounter;\n const callTicket: CallArgsTicket = {\n fnId,\n callId,\n args,\n };\n return dispatch(\n subjectRef.deref(),\n callTicket,\n rejectionPool,\n resolve,\n reject\n );\n });\n };\n const destroy = () => {\n subjectRef = null;\n sender = () => {\n throw new DisconnectionError();\n };\n for (const reject of rejectionPool) {\n reject(new DisconnectionError());\n }\n rejectionPool.clear();\n };\n subjectRef.deref().onDestroyed(destroy);\n const facade = async function (...args: unknown[]) {\n return sender(...args);\n };\n Object.defineProperty(facade, \"name\", { value: fnId });\n return facade;\n}\n","import type {\n CallArgsTicket,\n CallTicket,\n DefTicket,\n RejectTicket,\n ResolveTicket,\n RespondTicket,\n CleanupTicket,\n} from \"./tickets\";\nimport type { Materialized, Simulated } from \"./object-walker\";\nimport EventEmitter from \"eventemitter3\";\n\ntype EvTypeDef = `${string}_f`;\ntype EvTypeGC = `${string}_g`;\ntype EvTypeCall = `${string}_c`;\ntype EvTypeRespond = `${string}_r`;\ntype EvTypeDestroyed = \"destroyed\";\ntype EvTypeConnected = \"connected\";\ntype EvTypeError = \"error\";\n\ntype RemoteDefEvent = {\n type: EvTypeDef;\n payload: DefTicket;\n};\ntype RemoteCallEvent = {\n type: EvTypeCall;\n payload: CallArgsTicket;\n};\ntype RemoteResolveEvent = {\n type: EvTypeRespond;\n payload: ResolveTicket;\n};\ntype RemoteRejectEvent = {\n type: EvTypeRespond;\n payload: RejectTicket;\n};\ntype RemoteCleanupEvent = {\n type: EvTypeGC;\n payload: CleanupTicket;\n};\ntype RemoteReconnectedEvent = {\n type: EvTypeConnected;\n payload: void;\n};\ntype RemoteDestroyedEvent = {\n type: EvTypeDestroyed;\n payload: void;\n};\ntype RemoteErrorEvent = {\n type: EvTypeError;\n payload: Error;\n};\n\nexport type RemoteEvents =\n | RemoteDefEvent\n | RemoteCallEvent\n | RemoteResolveEvent\n | RemoteRejectEvent\n | RemoteCleanupEvent\n | RemoteReconnectedEvent\n | RemoteDestroyedEvent\n | RemoteErrorEvent;\n\ntype Simulates = <T>(localObject: T) => Simulated<T>;\ntype Materializes = <T>(simulatedObject: T) => Materialized<T>;\n\nexport interface Simulator {\n // #region Properties\n\n materialize: Materializes;\n simulate: Simulates;\n\n // #endregion Properties\n}\n\ntype Mapper = Simulates | Materializes;\n\nexport class RemoteSubject {\n // #region Properties\n\n private emitter: EventEmitter;\n private simulator: Simulator;\n\n // #endregion Properties\n\n // #region Constructors\n\n constructor(emitter: EventEmitter, simulator: Simulator) {\n this.emitter = emitter;\n this.simulator = simulator;\n }\n\n // #endregion Constructors\n\n // #region Public Methods\n\n notifyCleanup(ticket: DefTicket) {\n return this.emitter.emit(`${ticket.fnId}_g`, {});\n }\n\n notifyConnect() {\n return this.emitter.emit(\"connected\");\n }\n\n notifyDestroy() {\n return this.emitter.emit(\"destroyed\");\n }\n\n onCall(ticket: DefTicket, handler: (ticket: CallArgsTicket) => void) {\n return this.subscribe(`${ticket.fnId}_c`, (ticket: CallArgsTicket) =>\n handler(this.processCallTicket(ticket, this.simulator.materialize))\n );\n }\n\n onConnected(handler: () => void) {\n return this.subscribe(\"connected\", handler);\n }\n\n onDestroyed(handler: () => void) {\n return this.subscribe(\"destroyed\", handler);\n }\n\n onOutOfScope(ticket: DefTicket, handler: () => void) {\n return this.subscribeOnce(`${ticket.fnId}_g`, handler);\n }\n\n onRespond(ticket: CallTicket, handler: (ticket: RespondTicket) => void) {\n const fnAndCall = `${ticket.fnId}${ticket.callId}`;\n return this.subscribeOnce(`${fnAndCall}_r`, (ticket: RespondTicket) =>\n handler(this.processResponseTicket(ticket, this.simulator.materialize))\n );\n }\n\n respond(ticket: RespondTicket) {\n const fnAndCall = `${ticket.fnId}${ticket.callId}`;\n return this.emitter.emit(\n `${fnAndCall}_r`,\n this.processResponseTicket(ticket, this.simulator.simulate)\n );\n }\n\n send(ticket: CallArgsTicket) {\n return this.emitter.emit(\n `${ticket.fnId}_c`,\n this.processCallTicket(ticket, this.simulator.simulate)\n );\n }\n\n // #endregion Public Methods\n\n // #region Private Methods\n\n private processCallTicket(\n { args, ...ticket }: CallArgsTicket,\n mapper: Mapper\n ) {\n return {\n ...ticket,\n args: args.map(mapper),\n };\n }\n\n private processResponseTicket(ticket: RespondTicket, mapper: Mapper) {\n return ticket.status === \"resolve\"\n ? { ...ticket, value: mapper(ticket.value) }\n : ticket;\n }\n\n private subscribe(type: string, handler: (arg: unknown) => void) {\n this.emitter.on(type, handler);\n return () => {\n this.emitter.off(type, handler);\n };\n }\n\n private subscribeOnce(type: string, handler: (arg: unknown) => void) {\n const once = (arg: unknown) => {\n this.emitter.off(type, once);\n handler(arg);\n };\n return this.subscribe(type, once);\n }\n\n // #endregion Private Methods\n}\n","import { isWrapped, unwrap, wrap } from \"./message-wrapper\";\nimport EventEmitter from \"eventemitter3\";\nimport type { DefMessage, Materialized, Simulated } from \"./object-walker\";\nimport { NOT_TRANSFORMED, transformRecursive } from \"./object-walker\";\nimport { makeCallSender, receiveCalls } from \"./rpc\";\nimport type { Simulator } from \"./remote-subject\";\nimport { RemoteSubject } from \"./remote-subject\";\nimport type { DefTicket } from \"./tickets\";\nimport { hasProp } from \"./value-assertions\";\n\nfunction isDefMessage(value: unknown): value is DefMessage {\n return isWrapped(value) && hasProp(unwrap(value), \"fnId\");\n}\n\nconst bindAll = <T>(inst: T, methods: (keyof T)[]) => {\n for (const methodName of methods) {\n const method = inst[methodName];\n if (typeof method === \"function\") {\n inst[methodName] = method.bind(inst);\n }\n }\n};\n\ninterface CleanupNotifier {\n // #region Public Methods\n\n register(obj: any, heldValue: string, ref?: any): void;\n unregister(ref: any): void;\n\n // #endregion Public Methods\n}\n\ninterface CleanupNotifierConstructor {\n new (callback: (heldValue: unknown) => void): CleanupNotifier;\n}\n\nexport class ObjectSimulator implements Simulator {\n // #region Properties\n\n private cleanupNotifier: CleanupNotifier;\n private fnCounter = 0;\n private receiverTicketCache: WeakMap<CallableFunction, DefTicket> =\n new WeakMap();\n private senderCache: WeakMap<DefTicket, CallableFunction> = new WeakMap();\n\n subject: RemoteSubject;\n\n // #endregion Properties\n\n // #region Constructors\n\n constructor(subject: RemoteSubject, cleanupNotifier: CleanupNotifier) {\n this.cleanupNotifier = cleanupNotifier;\n this.subject = subject;\n\n bindAll(this, [\"makeSender\", \"makeReceiver\", \"simulate\", \"materialize\"]);\n }\n\n // #endregion Constructors\n\n // #region Public Static Methods\n\n static create(\n emitter: EventEmitter,\n Cleanup: CleanupNotifierConstructor\n ): ObjectSimulator {\n let simulator: Simulator;\n // proxy simulator, so as not to have cyclic dependency\n const simulatorInterface: Simulator = {\n simulate: (x) => simulator.simulate(x),\n materialize: (x) => simulator.materialize(x),\n };\n\n const subject = new RemoteSubject(emitter, simulatorInterface);\n\n const cleanupNotifier = new Cleanup((fnId: string) => {\n return subject.notifyCleanup({ fnId });\n });\n\n simulator = new ObjectSimulator(subject, cleanupNotifier);\n\n return simulator as ObjectSimulator;\n }\n\n // #endregion Public Static Methods\n\n // #region Public Methods\n\n makeReceiver(fn: CallableFunction, parent?: Object) {\n if (typeof fn !== \"function\") {\n return NOT_TRANSFORMED;\n }\n let fnTicket = this.receiverTicketCache.get(fn);\n if (!fnTicket) {\n fnTicket = {\n fnId: `${fn.name || \"<anonymous>\"}_${++this.fnCounter}`,\n };\n // Bind function to parent object if it exists\n let boundFunction = fn;\n if (parent) {\n boundFunction = fn.bind(parent);\n }\n const cleanup = receiveCalls(\n boundFunction,\n fnTicket,\n new WeakRef(this.subject)\n );\n this.subject.onOutOfScope(fnTicket, cleanup);\n this.receiverTicketCache.set(boundFunction, fnTicket);\n }\n return wrap(fnTicket);\n }\n\n makeSender(message: unknown) {\n if (!isDefMessage(message)) {\n return NOT_TRANSFORMED;\n }\n const ticket = unwrap(message);\n /* istanbul ignore else: preopt */\n if (!this.senderCache.has(ticket)) {\n const sender = makeCallSender(ticket, new WeakRef(this.subject));\n this.cleanupNotifier.register(sender, ticket.fnId, sender);\n this.senderCache.set(ticket, sender);\n return sender;\n } else {\n return this.senderCache.get(ticket) as CallableFunction;\n }\n }\n\n materialize<T>(simulated: T) {\n return transformRecursive<CallableFunction>(\n this.makeSender,\n simulated\n ) as Materialized<T>;\n }\n\n simulate<T>(localObject: T) {\n return transformRecursive<DefMessage>(\n this.makeReceiver,\n localObject\n ) as Simulated<T>;\n }\n\n // #endregion Public Methods\n}\n","/**\n * Add a timeout to a Promise. The returned Promise will resolve to the value of\n * the original Promise, but if it doesn't resolve within the timeout interval,\n * it will reject with a timeout error.\n *\n * @param describe - Job description to be used in the timeout error\n * @param promise - Original promise to set a timeout for\n * @param timeoutMs - Time to wait (ms) before rejecting\n * @param onReject - Run when promise times out to clean up handles\n * @returns - Promise that rejects with informative error after X milliseconds have passed\n *\n * @internal\n */\nexport function timeoutPromise<T>(\n describe: string | (() => string),\n promise: Promise<T>,\n ms: number,\n onReject?: (e: Error) => void\n): Promise<T> {\n return new Promise((resolve, reject) => {\n const cleanupAndReject = async (e: Error) => {\n try {\n if (onReject) {\n await onReject(e);\n }\n } finally {\n reject(e);\n }\n };\n const timeout = setTimeout(() => {\n cleanupAndReject(\n new Error(\n `${\n typeof describe === \"function\" ? describe() : describe\n } timed out after ${ms}ms`\n )\n );\n }, ms);\n promise\n .then((result) => {\n clearTimeout(timeout);\n resolve(result);\n })\n .catch((e) => {\n clearTimeout(timeout);\n cleanupAndReject(e);\n });\n });\n}\n","import { INIT_CALLBACK } from \"./constants\";\n\nexport interface HandshakeAcceptedTicket {\n // #region Properties\n\n accepts: string;\n version: string;\n\n // #endregion Properties\n}\nexport interface HandshakeOfferedTicket {\n // #region Properties\n\n offers: string;\n version: string;\n\n // #endregion Properties\n}\n\n/** @internal */\nexport interface DefTicket {\n // #region Properties\n\n fnId: string;\n\n // #endregion Properties\n}\nexport interface InitTicket extends DefTicket {\n // #region Properties\n\n fnId: typeof INIT_CALLBACK;\n\n // #endregion Properties\n}\nexport interface CallTicket extends DefTicket {\n // #region Properties\n\n callId: number;\n\n // #endregion Properties\n}\nexport interface CallArgsTicket extends CallTicket {\n // #region Properties\n\n args: any[];\n\n // #endregion Properties\n}\nexport interface ResolveTicket extends CallTicket {\n // #region Properties\n\n status: \"resolve\";\n value: any;\n\n // #endregion Properties\n}\nexport interface RejectTicket extends CallTicket {\n // #region Properties\n\n error: Error;\n status: \"reject\";\n\n // #endregion Properties\n}\nexport type RespondTicket = ResolveTicket | RejectTicket;\n\nexport type CleanupTicket = {};\n\nexport const INIT_TICKET: InitTicket = {\n fnId: INIT_CALLBACK,\n};\n","import EventEmitter from \"eventemitter3\";\nimport { isIframe } from \"../value-assertions\";\nimport { TunnelMessenger } from \"./tunnel-messenger\";\nimport { unwrap } from \"../message-wrapper\";\nimport { quietConsole } from \"../debuglog\";\n\n/**\n * Child iframe will send offer messages to parent at this frequency until one\n * is accepted or the attempt times out.\n * TODO: make configurable if ever necessary\n */\nconst RETRY_MS = 100;\n\n/**\n * Child iframe may unexpectedly close or detach from DOM. It emits no event\n * when this happens, so we must poll it and destroy the tunnel when necessary.\n * TODO: make configurable if ever necessary\n */\nconst STATUSCHECK_MS = 5000;\n\n/**\n * Semi-unique IDs allow multiple parallel connections to handshake on both parent\n * and child iframe. This generates a semi-random 8-char base 36 string.\n */\nconst KEY_BASE = 36;\nconst KEY_LENGTH = 8;\nconst KEY_EXP = KEY_BASE ** KEY_LENGTH;\nconst makeKey = () => Math.round(Math.random() * KEY_EXP).toString(KEY_BASE);\n\n/** @alpha */\nexport interface TunnelConfig {\n // #region Properties\n\n /**\n * To ensure secure communication, target origin must be specified, so the\n * tunnel can't connect to an unauthorized domain. Can be '*' to disable\n * origin checks, but this is discouraged!\n */\n targetOrigin: string;\n /**\n * A Promise for a tunnel will reject if not connected within timeout (ms).\n * @defaultValue 4000\n */\n timeout: number;\n /**\n * Logger instance to use for debugging tunnel connection.\n */\n logger: Console;\n\n // #endregion Properties\n}\n\nconst badTimeout = \"\\n - timeout value must be a number of milliseconds\";\nconst badTargetOrigin =\n \"\\n - targetOrigin must be a valid URL origin or '*' for any origin\";\n\nfunction isFromOrigin(\n event: MessageEvent,\n source: WindowProxy,\n targetOrigin: string\n) {\n try {\n return (\n source === event.source &&\n (targetOrigin === \"*\" || targetOrigin === new URL(event.origin).origin)\n );\n } catch (_) {\n return false;\n }\n}\n\nconst { emit: emitOn } = EventEmitter.prototype;\n\n/**\n * An EventEmitter across two documents. It emits events on the remote document\n * and takes subscribers from the local document.\n * @alpha\n */\nexport class Tunnel extends EventEmitter {\n // #region Properties\n\n private _messagePort: MessagePort;\n\n config: TunnelConfig;\n isConnected: boolean;\n\n // #endregion Properties\n\n // #region Constructors\n\n constructor(config: TunnelConfig) {\n super();\n this.config = config;\n }\n\n // #endregion Constructors\n\n // #region Public Static Methods\n\n /**\n * Create a Tunnel that connects to the page running in the provided iframe.\n *\n * @remarks\n * Returns a Tunnel that listens for connection requests from the page in the\n * provided iframe, which it will send periodically until timeout if that page\n * has called {@link Tunnel.toParent}. If it receives one, the Tunnel will accept the\n * connection and send an exclusive MessagePort to the xrobject on the other\n * end. The tunnel may reconnect if the iframe reloads, in which case it will\n * emit another \"connected\" event.\n *\n * @alpha\n */\n static toIframe(\n target: HTMLIFrameElement,\n options: Partial<TunnelConfig>\n ): Tunnel {\n if (!isIframe(target)) {\n throw new Error(\n `Provided tunnel target is not an iframe! ${Object.prototype.toString.call(\n target\n )}`\n );\n }\n\n const config = Tunnel._normalizeConfig(options);\n const tunnel = new Tunnel(config);\n const messenger = new TunnelMessenger({\n myOrigin: window.location.origin,\n targetOrigin: config.targetOrigin,\n logger: config.logger,\n });\n tunnel.on(\"destroyed\", () =>\n config.logger.log(\n `Tunnel to iframe at ${config.targetOrigin} destroyed!`,\n tunnel,\n target\n )\n );\n tunnel.on(\"connected\", () =>\n config.logger.log(\n `Tunnel to iframe at ${config.targetOrigin} connected!`,\n tunnel,\n target\n )\n );\n tunnel.on(\"error\", (e) =>\n config.logger.log(\n `Tunnel to iframe at ${config.targetOrigin} error!`,\n tunnel,\n target,\n e\n )\n );\n let frameStatusCheck: number;\n let timeout: number;\n const offerListener = (event: MessageEvent) => {\n if (\n !tunnel.isConnected &&\n isFromOrigin(event, target.contentWindow, config.targetOrigin) &&\n messenger.isHandshakeOffer(event.data)\n ) {\n const accepted = messenger.makeAccepted(unwrap(event.data).offers);\n const channel = new MessageChannel();\n target.contentWindow.postMessage(accepted, config.targetOrigin, [\n channel.port1,\n ]);\n tunnel.connect(channel.port2);\n }\n };\n const cleanup = () => {\n clearTimeout(timeout);\n clearInterval(frameStatusCheck);\n window.removeEventListener(\"message\", offerListener);\n };\n timeout = window.setTimeout(() => {\n tunnel.abort(\n new Error(\n `Timed out awaiting initial message from target iframe after ${config.timeout}ms`\n )\n );\n }, config.timeout);\n\n tunnel.on(\"destroyed\", cleanup);\n tunnel.on(\"connected\", () => clearTimeout(timeout));\n\n /**\n * Check if the iframe has been unexpectedly removed from the DOM (for\n * example, by React). Unsubscribe event listeners and destroy tunnel.\n */\n frameStatusCheck = window.setInterval(() => {\n if (!target.isConnected) {\n cleanup();\n if (tunnel.isConnected) {\n const frameDisconnectError = new Error(\n `Tunnel target iframe at ${tunnel.config.targetOrigin} was disconnected from the document!`\n );\n Object.assign(frameDisconnectError, { target });\n tunnel.abort(frameDisconnectError);\n } else {\n tunnel.destroy();\n }\n }\n }, STATUSCHECK_MS);\n\n window.addEventListener(\"message\", offerListener);\n\n return tunnel;\n }\n\n /**\n * Create a Tunnel that connects to the page running in the parent window.\n *\n * @remarks\n * Returns a Tunnel that starts sending connection requests to the parent\n * window, sending them periodically until the window responds with an accept\n * message or the timeout passes. The parent window will accept the request if\n * it calls {@link Tunnel.toIframe}.\n *\n * @alpha\n */\n static toParent(source: WindowProxy, opts: Partial<TunnelConfig>): Tunnel {\n let retrying: number;\n let timeout: number;\n let timedOut = false;\n const key = makeKey();\n const config = Tunnel._normalizeConfig(opts);\n const tunnel = new Tunnel(config);\n tunnel.on(\"destroyed\", () =>\n config.logger.log(`Tunnel ${key} to parent window destroyed!`, tunnel)\n );\n tunnel.on(\"connected\", () =>\n config.logger.log(`Tunnel ${key} to parent window connected!`, tunnel)\n );\n tunnel.on(\"error\", (e) =>\n config.logger.log(`Tunnel ${key} to parent window error!`, tunnel, e)\n );\n const messenger = new TunnelMessenger({\n myOrigin: window.location.origin,\n targetOrigin: config.targetOrigin,\n logger: config.logger,\n });\n const acceptListener = (event: MessageEvent) => {\n if (\n !timedOut &&\n isFromOrigin(event, source, config.targetOrigin) &&\n messenger.isHandshakeAccepting(event.data, key)\n ) {\n cleanup();\n if (!event.ports || !event.ports.length) {\n const portError = new Error(\n \"Received handshake accept message, but it did not include a MessagePort to establish tunnel\"\n );\n tunnel.emitLocal(\"error\", portError);\n return;\n }\n tunnel.connect(event.ports[0]);\n }\n };\n const cleanup = () => {\n clearInterval(retrying);\n clearTimeout(timeout);\n window.removeEventListener(\"message\", acceptListener);\n };\n\n timeout = window.setTimeout(() => {\n if (!timedOut) {\n timedOut = true;\n tunnel.abort(\n new Error(\n `Timed out waiting for initial response from parent after ${config.timeout}ms`\n )\n );\n }\n }, config.timeout);\n\n window.addEventListener(\"message\", acceptListener);\n tunnel.on(\"destroyed\", () => {\n cleanup();\n });\n tunnel.on(\"connected\", () => {\n cleanup();\n });\n\n const sendOffer = () => {\n if (tunnel.isConnected) {\n clearInterval(retrying);\n } else {\n source.postMessage(messenger.makeOffered(key), config.targetOrigin);\n }\n };\n retrying = window.setInterval(sendOffer, RETRY_MS);\n sendOffer();\n\n return tunnel;\n }\n\n // #endregion Public Static Methods\n\n // #region Public Methods\n\n connect(remote: MessagePort) {\n if (this._messagePort) {\n this._messagePort.removeEventListener(\"message\", this._emitFromMessage);\n this._messagePort.close();\n }\n this._messagePort = remote;\n remote.addEventListener(\"message\", this._emitFromMessage);\n this.emitLocal(\"connected\");\n this._messagePort.start();\n this.isConnected = true;\n }\n\n abort(error: Error): void {\n this.emitLocal(\"error\", error);\n this.destroy(error);\n }\n\n destroy(e?: Error): void {\n if (this._messagePort) {\n this._messagePort.close();\n this._messagePort = null;\n this.isConnected = false;\n }\n // don't add the argument to the logging if it doesn't exist; otherwise, on\n // a normal destroy, it logs a confusing \"undefined\"\n const context = e ? [e] : [];\n this.emitLocal(\"destroyed\", ...context);\n // this.removeAllListeners(); // TODO: maybe necessary for memory leaks\n }\n\n emit(type: string | symbol, payload?: unknown): boolean {\n if (!this._messagePort) {\n return false;\n }\n this._messagePort.postMessage({ type, payload });\n return true;\n }\n\n emitLocal = (type: string | symbol, payload?: unknown) => {\n return emitOn.call(this, type, payload);\n };\n\n // #endregion Public Methods\n\n // #region Private Static Methods\n\n private static _normalizeConfig(\n options: Partial<TunnelConfig> = {}\n ): TunnelConfig {\n let errorMessage = \"\";\n const config: Partial<TunnelConfig> = {\n timeout: 4000,\n ...options,\n logger: options.logger || quietConsole,\n };\n\n const timeoutMs = Number(config.timeout);\n if (!Number.isSafeInteger(timeoutMs)) {\n errorMessage += badTimeout;\n }\n if (config.targetOrigin !== \"*\") {\n try {\n new URL(config.targetOrigin);\n } catch (e) {\n errorMessage += badTargetOrigin;\n }\n }\n if (errorMessage) {\n throw new Error(`Invalid tunnel configuration: ${errorMessage}`);\n }\n return config as TunnelConfig;\n }\n\n // #endregion Private Static Methods\n\n // #region Private Methods\n\n private _emitFromMessage = ({ data: { type, payload } }: MessageEvent) => {\n this.emitLocal(type, payload);\n };\n\n // #endregion Private Methods\n}\n","import { NS_ROOT, VERSION } from \"../constants\";\nimport { isPlainObject } from \"../value-assertions\";\nimport { WrappedMessage, isWrapped, wrap, unwrap } from \"../message-wrapper\";\nimport { HandshakeAcceptedTicket, HandshakeOfferedTicket } from \"../tickets\";\n\ntype Handshake = HandshakeAcceptedTicket | HandshakeOfferedTicket;\ntype HandshakeAccepted = WrappedMessage<HandshakeAcceptedTicket>;\ntype HandshakeOffered = WrappedMessage<HandshakeOfferedTicket>;\ntype HandshakeMessage = HandshakeAccepted | HandshakeOffered;\n\ntype ParsedVersion = {\n major: string;\n minor: string;\n patch: string;\n prerelease: string;\n};\n\n/**\n * Due to a bug in release for 0.8.0 and 0.8.11, those versions have the\n * wrong (previous) version number embedded.\n */\nconst VERSION_CORRECTED = {\n \"0.7.0\": \"0.8.0\",\n \"0.8.0\": \"0.8.1\",\n};\n\nfunction getVersionParts(version: string): ParsedVersion {\n const realVersion = VERSION_CORRECTED.hasOwnProperty(version)\n ? VERSION_CORRECTED[version as keyof typeof VERSION_CORRECTED]\n : version;\n const [major, minor = \"UNKNOWN\", suffix = \"UNKNOWN\"] = realVersion.split(\".\");\n const [patch, prerelease = \"\"] = suffix.split(\"-\");\n return { major, minor, patch, prerelease };\n}\nconst thisVersion = getVersionParts(VERSION);\nexport class TunnelMessenger {\n private myOrigin: string;\n private remoteOrigin: string;\n private logger: Console;\n private versionWarnings = new Set<string>();\n constructor(opts: {\n myOrigin: string;\n targetOrigin: string;\n logger: Console;\n }) {\n this.myOrigin = opts.myOrigin;\n this.remoteOrigin =\n opts.targetOrigin === \"*\" ? \"remote document\" : opts.targetOrigin;\n this.logger = opts.logger;\n }\n resetWarnings() {\n this.versionWarnings.clear();\n }\n\n makeAccepted(id: string): HandshakeAccepted {\n return wrap({\n accepts: id,\n version: VERSION,\n });\n }\n makeOffered(id: string): HandshakeOffered {\n return wrap({\n offers: id,\n version: VERSION,\n });\n }\n isHandshakeAccepting(\n message: unknown,\n id: string\n ): message is HandshakeAccepted {\n return (\n this.isHandshake(message) &&\n unwrap(message as HandshakeAccepted).accepts === id\n );\n }\n isHandshakeOffer(message: unknown): message is HandshakeOffered {\n return (\n this.isHandshake(message) &&\n typeof unwrap(message as HandshakeOffered).offers === \"string\"\n );\n }\n isCompatibleVersion(versionString: string) {\n const version = getVersionParts(versionString);\n return (\n version.major === thisVersion.major &&\n version.minor === thisVersion.minor &&\n version.prerelease === thisVersion.prerelease\n );\n }\n isHandshake(message: unknown): message is HandshakeMessage {\n if (!isWrapped(message)) {\n this.logMalformed(message);\n return false;\n }\n const tunnelData: Handshake = unwrap<Handshake>(\n message as HandshakeMessage\n );\n if (\n !isPlainObject(tunnelData) ||\n typeof tunnelData.version !== \"string\" ||\n !(Reflect.has(tunnelData, \"accepts\") || Reflect.has(tunnelData, \"offers\"))\n ) {\n this.logMalformed(message);\n return false;\n }\n const { version } = tunnelData;\n if (\n !this.isCompatibleVersion(version) &&\n !this.versionWarnings.has(version)\n ) {\n this.versionWarnings.add(version);\n this.logger.warn(\n `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.`\n );\n }\n return true;\n }\n private logMalformed(message: unknown) {\n let inspectedMessage: string;\n try {\n inspectedMessage = JSON.stringify(message, null, 2);\n } catch (_) {\n try {\n inspectedMessage = message.toString();\n } catch (e) {\n inspectedMessage = Object.prototype.toString.call(message);\n }\n }\n this.logger.error(\n `Malformed tunnel message sent from SDK at ${this.remoteOrigin} to ${this.myOrigin}:\n${inspectedMessage}\nMessage 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.`\n );\n }\n}\n","import type { WrappedMessage } from \"./message-wrapper\";\nimport { wrap } from \"./message-wrapper\";\nimport { ObjectSimulator } from \"./object-simulator\";\nimport type { Asynced } from \"./object-walker\";\nimport { timeoutPromise } from \"./promises/timed\";\nimport { receiveCalls } from \"./rpc\";\nimport type { InitTicket } from \"./tickets\";\nimport { INIT_TICKET } from \"./tickets\";\nimport type { TunnelConfig } from \"./tunnel\";\nimport { Tunnel } from \"./tunnel\";\n\nconst INIT_MESSAGE: WrappedMessage<InitTicket> = wrap(INIT_TICKET);\n\n/**\n * Representation of an object on the other side of an iframe/window divide\n * between JS runtimes.\n *\n * @remarks\n * At first, xrobject simply returned the proxy to the remote object and did\n * not expose any of the underlying event handling. However, there was no way\n * for a consumer to handle the case where the remote iframe reloaded, which\n * would invalidate all of the simulated objects.\n *\n * This new manager object exposes the {@link Tunnel} object so that consumers\n * can subscribe to the \"api\" event.\n * @alpha\n */\nexport interface CrossRealmObject<ExpectedApi> {\n /**\n * The event emitter that transmits RPC events between remotes. Can be used to\n * listen to \"api\" events, which re-emit the initial remote API after an\n * unexpected reload. Can also be used to manually destroy the xrobject.\n * @internal\n */\n tunnel: Tunnel;\n /**\n * Accessor for the simulated object. Putting the object behind an accessor is\n * a way (we hope) to subtly discourage hanging on to a reference to the\n * object, which will invalidate without the holder of the reference knowing.\n * @internal\n */\n getRemoteApi(): Asynced<ExpectedApi>;\n}\n\nasync function setupApiExchange<T>(\n tunnel: Tunnel,\n apiToSend: unknown\n): Promise<CrossRealmObject<T>> {\n let done = false;\n let remoteApi!: Asynced<T>;\n const xrObject: CrossRealmObject<T> = {\n tunnel,\n getRemoteApi(): Asynced<T> {\n return remoteApi;\n },\n };\n return timeoutPromise(\n \"Initial API exchange\",\n new Promise((resolve, reject) => {\n const simulator = ObjectSimulator.create(tunnel, FinalizationRegistry);\n\n const sendApi = simulator.makeSender(INIT_MESSAGE);\n const apiCallback = (api: Asynced<T>) => {\n remoteApi = api;\n if (!done) {\n done = true;\n resolve(xrObject);\n }\n };\n tunnel.on(\"api\", apiCallback);\n\n const unsubscribe = receiveCalls(\n (api: Asynced<T>) => tunnel.emitLocal(\"api\", api),\n INIT_TICKET,\n new WeakRef(simulator.subject)\n );\n const destroy = (e: Error) => {\n unsubscribe();\n if (!done) {\n done = true;\n if (e) {\n reject(e);\n }\n }\n };\n tunnel.on(\"destroyed\", destroy);\n tunnel.on(\"connected\", () =>\n (sendApi as Function)(apiToSend).catch(destroy)\n );\n }),\n tunnel.config.timeout,\n (e) => {\n tunnel.abort(e);\n }\n );\n}\n\n/**\n * Create a CrossRealmObject in an iframe, simulating objects from the parent window.\n * @alpha\n */\nexport async function connectParentWindow<Expected>(\n tunnelOptions: Partial<TunnelConfig>,\n apiToSend: unknown\n): Promise<CrossRealmObject<Expected>> {\n const tunnel = Tunnel.toParent(window.parent, tunnelOptions);\n return setupApiExchange<Expected>(tunnel, apiToSend);\n}\n\n/**\n * Create a CrossRealmObject simulating objects from the provided iframe runtime.\n * @alpha\n */\nexport async function connectIframe<Expected>(\n frame: HTMLIFrameElement,\n tunnelOptions: Partial<TunnelConfig>,\n apiToSend: unknown\n): Promise<CrossRealmObject<Expected>> {\n const tunnel = Tunnel.toIframe(frame, tunnelOptions);\n return setupApiExchange<Expected>(tunnel, apiToSend);\n}\n","/**\nCopyright 2022 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport type { HostMethodAddress } from \"./types\";\nimport { isFunction, isIterable, isPrimitive } from \"./value-assertions\";\n\n/**\n * Try and format any type of value for logging.\n *\n * @privateRemarks\n * **WARNING**: This is an expensive operation due to the JSON.stringify, and\n * should only be done when debugging or in error conditions.\n * @internal\n */\nexport function formatHostMethodArgument(argument: unknown): string {\n try {\n return JSON.stringify(argument, null, 2);\n } catch (e) {\n if (isIterable(argument)) {\n return `Iterable<${argument.length}>`;\n }\n if (isPrimitive(argument) || isFunction(argument)) {\n return `${argument}`;\n }\n return Object.prototype.toString.call(argument);\n }\n}\n\n/**\n * Try and format a remote method call as it would appear during debugging.\n *\n * @privateRemarks\n * **WARNING**: This is an expensive operation due to the JSON.stringify, and\n * should only be done when debugging or in error conditions. This Functions\n * like {@link @adobe/uix-core#timedPromise} which take logging strings also\n * take callbacks for lazy evaluation of debugging messages. Use this only in\n * such callbacks.\n * @internal\n */\nexport function formatHostMethodAddress(address: HostMethodAddress) {\n const path =\n address.path?.length < 1\n ? \"<Missing method path!>\"\n : address.path.join(\".\");\n const name = address.name || \"<Missing method name!>\";\n const args = address.args?.map(formatHostMethodArgument).join(\",\");\n return `host.${path}.${name}(${args})`;\n}\n","/**\n * Promise that resolves after a specific time\n *\n * @internal\n */\nexport function wait(ms: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/eventemitter3/index.js","../src/debuglog.ts","../src/debug-emitter.ts","../src/emitter.ts","../src/namespace-proxy.ts","../src/constants.ts","../src/value-assertions.ts","../src/message-wrapper.ts","../src/object-walker.ts","../src/rpc/call-receiver.ts","../src/rpc/call-sender.ts","../src/remote-subject.ts","../src/object-simulator.ts","../src/promises/timed.ts","../src/tickets.ts","../src/tunnel/tunnel.ts","../src/tunnel/tunnel-messenger.ts","../src/cross-realm-object.ts","../src/logging-formatters.ts","../src/promises/wait.ts"],"names":["EventEmitter","target","ticket"],"mappings":"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","sourcesContent":["'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","/**\nCopyright 2022 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\n/**\n * Fancy looking console decorator.\n * @hidden\n * @internal\n */\n\n/** @internal */\nconst isDarkMode = () =>\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n\n/** @internal */\ntype Layout = {\n padX: number;\n padY: number;\n rounded: number;\n fontSize: number;\n emphasis: Style;\n};\n/** @internal */\ntype HexColor = `#${string}` | \"transparent\";\n/** @internal */\ntype Color = {\n text: HexColor;\n bg: HexColor;\n hilight: HexColor;\n shadow: HexColor;\n};\n/** @internal */\ntype ThemeSpec = Color & Layout;\n\n/** @internal */\nconst Layouts: Record<string, Layout> = {\n medium: {\n padX: 5,\n padY: 3,\n rounded: 4,\n fontSize: 100,\n emphasis: \"font-weight: bold;\",\n },\n small: {\n padX: 3,\n padY: 1,\n rounded: 2,\n fontSize: 95,\n emphasis: \"font-style: italic;\",\n },\n};\n\n/** @internal */\nconst Colors: Record<string, Color> = {\n yellow: {\n text: \"#333333\",\n bg: \"#EBD932\",\n hilight: \"#F7E434\",\n shadow: \"#D1C12C\",\n },\n green: {\n text: \"#333333\",\n bg: \"#96EB5E\",\n hilight: \"#9EF763\",\n shadow: \"#85D154\",\n },\n blue: {\n text: \"#333333\",\n bg: \"#8DD0EB\",\n hilight: \"#88F0F7\",\n shadow: \"#74AED4\",\n },\n gray: isDarkMode()\n ? {\n text: \"#eeeeee\",\n bg: \"transparent\",\n hilight: \"#cecece\",\n shadow: \"#cecece\",\n }\n : {\n text: \"#333333\",\n bg: \"#eeeeee\",\n hilight: \"#f6f6f6\",\n shadow: \"#cecece\",\n },\n};\n\n/** @internal */\ntype ThemeTag = `${keyof typeof Colors} ${keyof typeof Layouts}`;\n\n/**\n * @internal\n */\nexport type Theme = ThemeSpec | ThemeTag;\n\n/** @internal */\ntype LogDecorator = (...args: unknown[]) => unknown[];\n\n/** @internal */\ntype Style = `${string};`;\n\nfunction memoizeUnary<T, U>(fn: (arg: T) => U): typeof fn {\n const cache: Map<T, U> = new Map();\n return (arg) => {\n if (!cache.has(arg)) {\n const result = fn(arg);\n cache.set(arg, result);\n if (cache.size > 100) {\n cache.delete(cache.keys().next().value as T);\n }\n return result;\n }\n return cache.get(arg);\n };\n}\n\nconst toTheme = memoizeUnary((theme: Theme): ThemeSpec => {\n if (typeof theme === \"string\") {\n const [color, size] = theme.split(\" \");\n return {\n ...Colors[color],\n ...Layouts[size],\n };\n }\n return theme;\n});\n\nconst block: Style = `display: inline-block; border: 1px solid;`;\n\nconst flatten = (side: \"left\" | \"right\"): Style =>\n `padding-${side}: 0px; border-${side}-width: 0px; border-top-${side}-radius: 0px; border-bottom-${side}-radius: 0px;`;\n\nconst toColor = ({ bg, hilight, shadow, text }: Color): Style =>\n `color: ${text}; background: ${bg}; border-color: ${hilight} ${shadow} ${shadow} ${hilight};`;\n\nconst toLayout = ({ fontSize, padY, padX, rounded }: Layout) =>\n `font-size: ${fontSize}%; padding: ${padY}px ${padX}px; border-radius: ${rounded}px;`;\n\nconst toBubbleStyle = memoizeUnary((theme: ThemeSpec): string[] => {\n const base = `${block}${toColor(theme)}${toLayout(theme)}`;\n return [\n `${base}${flatten(\"right\")}`,\n `${base}${flatten(\"left\")}${theme.emphasis}`,\n ] as Style[];\n});\n\nfunction toBubblePrepender(\n bubbleLeft: string,\n bubbleRight: string,\n theme: ThemeSpec\n): LogDecorator {\n const prefix = `%c${bubbleLeft}%c ${bubbleRight}`;\n const [left, right] = toBubbleStyle(theme);\n return (args: unknown[]) => {\n const bubbleArgs = [prefix, left, right];\n if (typeof args[0] === \"string\") {\n bubbleArgs[0] = `${prefix}%c ${args.shift() as string}`;\n bubbleArgs.push(\"\"); // reset style\n }\n return [...bubbleArgs, ...args];\n };\n}\n\n/** @internal */\nconst stateTypes = {\n event: \"️⚡️\",\n} as const;\n\nconst stateDelim = \" ⤻ \";\n\n/** @internal */\ntype DebugState = { type: keyof typeof stateTypes; name: string };\n\n// Serialize to memoize.\nconst getStateFormatter = memoizeUnary((stateJson: string) => {\n const stateStack = JSON.parse(stateJson) as unknown as DebugState[];\n const firstState = stateStack.shift();\n const left = stateTypes[firstState.type];\n const right = [\n firstState.name,\n ...stateStack.map((state) => `${stateTypes[state.type]} ${state.name}`),\n ].join(stateDelim);\n return toBubblePrepender(left, right, toTheme(\"gray small\"));\n});\nconst getStatePrepender = (stateStack: DebugState[]) =>\n getStateFormatter(JSON.stringify(stateStack));\n\nconst overrideMethods = [\"log\", \"error\", \"warn\", \"info\", \"debug\"] as const;\n\nconst identity = <T>(x: T) => x;\n\nconst noop = (): (() => undefined) => undefined;\n\n/**\n * A console, plus some methods to track event lifecycles.\n * @internal\n */\nexport interface DebugLogger extends Console {\n /**\n * Stop all logging; methods do nothing\n * @internal\n */\n detach(): void;\n /**\n * Add an event bubble to the log during handler.\n */\n pushState(state: DebugState): void;\n /**\n * Remove the bubble when event is done dispatching\n */\n popState(): void;\n}\n\n/**\n * Returns a console whose methods autoformat with bubbles.\n * @internal\n */\nexport function _customConsole(\n theme: Theme,\n type: string,\n name: string\n): DebugLogger {\n const prepender = toBubblePrepender(`X${type}`, name, toTheme(theme));\n let statePrepender: LogDecorator = identity as LogDecorator;\n const stateStack: DebugState[] = [];\n const loggerProto: PropertyDescriptorMap = {\n detach: {\n writable: true,\n configurable: true,\n value(this: DebugLogger) {\n overrideMethods.forEach((method) => {\n this[method] = noop;\n });\n },\n },\n pushState: {\n value(state: DebugState) {\n stateStack.push(state);\n statePrepender = getStatePrepender(stateStack);\n },\n },\n popState: {\n value() {\n stateStack.pop();\n statePrepender =\n stateStack.length === 0\n ? (identity as LogDecorator)\n : getStatePrepender(stateStack);\n },\n },\n };\n const customConsole = Object.create(\n console,\n overrideMethods.reduce((out, level) => {\n out[level] = {\n writable: true,\n configurable: true,\n value(...args: unknown[]) {\n console[level](...prepender(statePrepender(args)));\n },\n };\n return out;\n }, loggerProto)\n ) as DebugLogger;\n return customConsole;\n}\n\n/**\n * @internal\n */\nexport const quietConsole = new Proxy(console, {\n get() {\n return noop;\n },\n});\n","/*\nCopyright 2022 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport { _customConsole, DebugLogger, Theme } from \"./debuglog.js\";\nimport { Emits, Unsubscriber } from \"./types.js\";\n\n/**\n * Adds methods for logging events\n * @internal\n */\nexport interface EmitterDebugLogger extends DebugLogger {\n /**\n * Listen to an event and pass the logger to the handler\n * @internal\n */\n listen(\n type: string,\n listener: (logger: EmitterDebugLogger, ev: CustomEvent) => unknown\n ): this;\n}\n\n/**\n * Debugger for EventTarget objects like Hosts, Ports and Guests, which\n * patches dispatchEvent to log events\n * Adapter to attach console logging listeners to all events on an emitter.\n * @internal\n */\nexport function debugEmitter(\n emitter: Emits,\n opts: {\n theme: Theme;\n type?: string;\n id?: string;\n }\n): EmitterDebugLogger {\n const logger = _customConsole(\n opts.theme,\n opts.type ||\n (Object.getPrototypeOf(emitter) as typeof emitter).constructor.name,\n opts.id || emitter.id\n ) as EmitterDebugLogger;\n const oldDispatch = emitter.dispatchEvent;\n emitter.dispatchEvent = (event) => {\n logger.pushState({ type: \"event\", name: event.type });\n const retVal = oldDispatch.call(emitter, event) as boolean;\n logger.popState();\n return retVal;\n };\n\n const subscriptions: Unsubscriber[] = [];\n\n const oldDetach = logger.detach;\n logger.detach = () => {\n oldDetach.call(logger);\n subscriptions.forEach((unsubscribe) => unsubscribe());\n };\n\n /**\n * Listens and passes a logger to callbacks\n */\n function listen(\n type: string,\n listener: (logger: EmitterDebugLogger, ev: CustomEvent) => unknown\n ) {\n subscriptions.push(\n emitter.addEventListener(type, (event) => listener(logger, event))\n );\n return logger;\n }\n\n logger.listen = listen;\n\n return logger;\n}\n","/*\nCopyright 2022 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport { Emits, Unsubscriber, NamedEvent } from \"./types.js\";\n\n/**\n * Browser-native {@link https://developer.mozilla.org/en-US/docs/Web/API/EventTarget | EventTarget}\n * whose {@link Emitter.addEventListener} method returns an anonymous function\n * which unsubscribes the original handler.\n *\n * Also provides typed events via generics. You can create or extend this class\n * to define custom emitters with known event names and signatures.\n *\n * @example\n * ```ts\n * import type { NamedEvent, Emitter } from '@adobe/uix-sdk'\n *\n * class FizzBuzzEmitter extends Emitter<\n * NamedEvent<\"fizz\", { fizzCount: number }> |\n * NamedEvent<\"buzz\", { buzzCount: number }> |\n * NamedEvent<\"fizzbuzz\">\n * > {\n * }\n * ```\n * The `FizzBuzzEmitter` class will now type check its events and event\n * listeners, providing autosuggest in editors.\n *\n * @see [EventTarget - MDN](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget)\n *\n * @public\n */\nexport class Emitter<Events extends NamedEvent>\n extends EventTarget\n implements Emits<Events>\n{\n /**\n * An arbitrary string to uniquely identify this emitter and its events.\n * @public\n */\n id: string;\n constructor(id: string) {\n super();\n this.id = id;\n }\n /**\n * Convenience method to construct and dispatch custom events.\n *\n * @param type - Name of one of the allowed events this can emit\n * @param detail - Object to expose in the {@link https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/detail | CustomEvent#detail}\n * property.\n * @public\n */\n protected emit<Event extends Events>(\n type: Event[\"type\"],\n detail: Event[\"detail\"]\n ): void {\n const event = new CustomEvent<typeof detail>(type, { detail });\n this.dispatchEvent(event);\n }\n /**\n * Subscribe to an event and receive an unsubscribe callback.\n * @see [EventTarget.addEventListener - MDN](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener)\n *\n * Identical to `EventTarget.addEventListener`, but returns an \"unsubscriber\"\n * function which detaches the listener when invoked. Solves an ergonomic\n * problem with native EventTargets where it's impossible to detach listeners\n * without having a reference to the original handler.\n *\n * @typeParam E - Name of one of the allowed events this can emit\n * @param type - Event type\n * @param listener - Event handler\n * @returns Call to unsubscribe listener.\n */\n addEventListener<\n Type extends Events[\"type\"],\n Event extends Extract<Events, { type: Type }>\n >(type: Type, listener: (ev: Event) => unknown): Unsubscriber {\n super.addEventListener(type, listener);\n return () => super.removeEventListener(type, listener);\n }\n}\n","/*\nCopyright 2022 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { RemoteMethodInvoker } from \"./types.js\";\n\n/**\n * Build a fake object that turns \"method calls\" into RPC messages\n * The resulting object will recursively make more fake proxies on demand until\n * one of the looked-up properties is invoked as a function.\n * Then it will call the passed `invoke` method with a {@link HostMethodAddress}\n * that can send the method invocation as an RPC message to another realm.\n *\n * @example\n * ```js\n * const invoker = (methodAddress) => console.log(\n * address.path,\n * address.name,\n * address.args\n * );\n * const ns = makeNamespaceProxy(invoker);\n *\n * // looking up any property on the object will work\n *\n * ns.example.builds.method.call.message(\"foo\", 1);\n *\n * // Console will log:\n * ['example','builds','method','call']\n * 'message'\n * [\"foo\", 1]\n *```\n * @internal\n *\n * @param invoke - Callback that receives address\n */\nexport function makeNamespaceProxy<ProxiedApi extends object>(\n invoke: RemoteMethodInvoker<unknown>,\n path: string[] = []\n): ProxiedApi {\n const handler: ProxyHandler<Record<string, any>> = {\n get: (target, prop) => {\n if (typeof prop === \"string\") {\n if (!Reflect.has(target, prop)) {\n const next = makeNamespaceProxy(invoke, path.concat(prop));\n Reflect.set(target, prop, next);\n }\n return Reflect.get(target, prop) as unknown;\n } else {\n throw new Error(\n `Cannot look up a symbol ${String(prop)} on a host connection proxy.`\n );\n }\n },\n };\n const target = {} as unknown as ProxiedApi;\n // Only trap the apply if there's at least two levels of namespace.\n // uix.host() is not a function, and neither is uix.host.bareMethod().\n if (path.length < 2) {\n return new Proxy<ProxiedApi>(target, handler);\n }\n const invoker = (...args: unknown[]) =>\n invoke({\n path: path.slice(0, -1),\n name: path[path.length - 1],\n args,\n });\n return new Proxy<typeof invoker>(invoker, {\n ...handler,\n apply(target, _, args: unknown[]) {\n return target(...args);\n },\n }) as unknown as typeof target;\n}\n","declare const UIX_SDK_VERSION: string;\ndeclare const UIX_SDK_BUILDMODE: string;\n\n/** @internal */\nexport const NS_ROOT = \"_$pg\";\nexport const VERSION = UIX_SDK_VERSION;\nexport const BUILDMODE = UIX_SDK_BUILDMODE;\nexport const SYM_CLEANUP = Symbol(`${NS_ROOT}_cleanup`);\nexport const SYM_INTERNAL = Symbol(`${NS_ROOT}_internal`);\nexport const INIT_CALLBACK = `${NS_ROOT}_init_cb`;\n","/** @internal */\nexport type Primitive = string | number | boolean;\n\nexport function isPlainObject<T>(value: unknown): value is T & object {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n const proto = Reflect.getPrototypeOf(value);\n return proto === null || proto === Object.prototype;\n}\n\nexport function isPrimitive(value: unknown): value is Primitive {\n if (!value) {\n return true;\n }\n const theType = typeof value;\n return theType === \"string\" || theType === \"number\" || theType === \"boolean\";\n}\n\nexport function isIterable<T>(value: unknown): value is T[] {\n return Array.isArray(value);\n}\n\nexport function isFunction(value: unknown): value is CallableFunction {\n return typeof value === \"function\";\n}\n\nexport function hasProp(value: unknown, prop: string) {\n return !isPrimitive(value) && Reflect.has(value as object, prop);\n}\n\nexport function isTunnelSource(\n value: unknown\n): value is Window | ServiceWorker {\n return (\n value instanceof Window ||\n value instanceof ServiceWorker ||\n hasProp(value, \"onmessage\")\n );\n}\n\nexport function isIframe(value: unknown): value is HTMLIFrameElement {\n if (!value || isPrimitive(value)) {\n return false;\n }\n const { nodeName } = value as HTMLIFrameElement;\n return typeof nodeName === \"string\" && nodeName.toLowerCase() === \"iframe\";\n}\n\nexport function isObjectWithPrototype<T>(\n value: unknown\n): value is T & { [key: string | symbol]: unknown } {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n const proto = Reflect.getPrototypeOf(value);\n return proto !== Object.prototype;\n}\n","import { NS_ROOT } from \"./constants\";\nimport { isPlainObject } from \"./value-assertions\";\n\n/** @internal */\nexport type WrappedMessage<Message extends object> = { [NS_ROOT]: Message };\n\nexport function wrap<Message extends object = object>(\n message: Message\n): WrappedMessage<Message> {\n return { [NS_ROOT]: message };\n}\n\nexport function unwrap<Message extends object>(\n wrappedMessage: WrappedMessage<Message>\n): Message {\n return wrappedMessage[NS_ROOT];\n}\n\nexport function isWrapped<Message extends object = object>(\n item: unknown\n): item is WrappedMessage<Message> {\n if (!isPlainObject(item)) {\n return false;\n }\n const keys = Object.keys(item);\n const hasRoot = keys.includes(NS_ROOT);\n if (hasRoot && keys.length != 1) {\n console.error(\n `malformed tunnel message, should have one prop \"${NS_ROOT}\" at root`,\n item\n );\n return false;\n }\n return hasRoot;\n}\n","import type { WrappedMessage } from \"./message-wrapper\";\nimport type { DefTicket } from \"./tickets\";\nimport {\n Primitive,\n isPlainObject,\n isPrimitive,\n isIterable,\n isObjectWithPrototype,\n} from \"./value-assertions\";\n\n/**\n * Extract keys of T whose values are assignable to U.\n * @internal\n */\ntype ExtractKeys<T, U> = {\n [P in keyof T]: T[P] extends U ? P : never;\n}[keyof T];\n\n/**\n * Convert all functions anywhere in T to async functions.\n * @internal\n */\nexport type Asynced<T> = T extends (...args: infer A) => infer R\n ? (...args: A) => Promise<R>\n : {\n [K in ExtractKeys<\n T,\n Function | object | any[] | [any, any]\n >]: T[K] extends (...args: any) => PromiseLike<any>\n ? T[K]\n : T[K] extends [infer U, infer V]\n ? [Asynced<U>, Asynced<V>]\n : T[K] extends (infer U)[]\n ? Asynced<U>[]\n : T[K] extends (...args: infer A) => infer R\n ? (...args: A) => Promise<R>\n : Asynced<T[K]>;\n };\n\n/** @internal */\nexport type Materialized<T> = T extends Primitive\n ? T\n : // : T extends (...args: infer A) => infer R\n // ? (...args: A) => Promise<R>\n T extends Simulated<infer U>\n ? Asynced<U>\n : Asynced<T>;\n\n/** @internal */\nexport type DefMessage = WrappedMessage<DefTicket>;\n\n/** @internal */\nexport type Simulated<T> = {\n [K in ExtractKeys<T, Function | object>]: T[K] extends (\n ...args: unknown[]\n ) => unknown\n ? DefMessage\n : Simulated<T[K]>;\n};\n\nexport const NOT_TRANSFORMED = Symbol.for(\"NOT_TRANSFORMED\");\nexport const CIRCULAR = \"[[Circular]]\";\n\nexport function transformRecursive<To>(\n transform: (source: unknown, parent?: Object) => To | typeof NOT_TRANSFORMED,\n value: unknown,\n parent?: Object,\n _refs: WeakSet<object> = new WeakSet()\n): To {\n if (isPrimitive(value)) {\n return value as To;\n }\n const transformed = transform(value, parent);\n if (transformed !== NOT_TRANSFORMED) {\n return transformed;\n }\n if (isIterable(value)) {\n const outArray = [];\n for (const item of value) {\n outArray.push(transformRecursive(transform, item, undefined, _refs));\n }\n return outArray as To;\n }\n if (isPlainObject(value)) {\n if (_refs.has(value)) {\n return CIRCULAR as To;\n }\n _refs.add(value);\n const outObj = {};\n for (const key of Reflect.ownKeys(value)) {\n Reflect.set(\n outObj,\n key,\n transformRecursive(transform, Reflect.get(value, key), undefined, _refs)\n );\n }\n return outObj as To;\n }\n if (isObjectWithPrototype(value)) {\n if (_refs.has(value)) {\n return CIRCULAR as To;\n }\n _refs.add(value);\n const getObjectKeys = (obj: Object): (string | symbol)[] => {\n const result: Set<string | symbol> = new Set();\n do {\n if (Reflect.getPrototypeOf(obj) !== null) {\n for (const prop of Object.getOwnPropertyNames(obj)) {\n if (prop === \"constructor\") {\n continue;\n }\n result.add(prop);\n }\n }\n } while ((obj = Reflect.getPrototypeOf(obj)));\n\n return [...result];\n };\n const outObj = {};\n const properties = getObjectKeys(value);\n for (const key of properties) {\n Reflect.set(\n outObj,\n key,\n transformRecursive(transform, Reflect.get(value, key), value, _refs)\n );\n }\n return outObj as To;\n }\n\n throw new Error(`Bad value! ${Object.prototype.toString.call(value)}`);\n}\n","import type { CallArgsTicket, DefTicket } from \"../tickets\";\nimport type { RemoteSubject } from \"../remote-subject\";\n\nexport function receiveCalls(\n fn: CallableFunction,\n ticket: DefTicket,\n remote: WeakRef<RemoteSubject>\n) {\n const responder = async ({ fnId, callId, args }: CallArgsTicket) => {\n /* istanbul ignore next: should never happen */\n try {\n const value = await fn(...args);\n remote.deref().respond({\n fnId,\n callId,\n value,\n status: \"resolve\",\n });\n } catch (error) {\n remote.deref().respond({\n fnId,\n callId,\n status: \"reject\",\n error,\n });\n }\n };\n return remote.deref().onCall(ticket, responder);\n}\n","import type { CallArgsTicket, DefTicket } from \"../tickets\";\nimport type { RemoteSubject } from \"../remote-subject\";\n\ntype RejectionPool = Set<(e: Error) => unknown>;\n\nclass DisconnectionError extends Error {\n constructor() {\n super(\n \"Function belongs to a simulated remote object which has been disconnected! The tunnel may have been destroyed by page navigation or reload.\"\n );\n }\n}\n\nfunction dispatch(\n subject: RemoteSubject,\n callTicket: CallArgsTicket,\n rejectionPool: RejectionPool,\n resolve: { (value: unknown): void; (arg0: any): void },\n reject: { (reason?: string): void; (arg0: any): void }\n) {\n subject.onRespond(callTicket, (responseTicket) => {\n rejectionPool.delete(reject);\n if (responseTicket.status === \"resolve\") {\n resolve(responseTicket.value);\n } else {\n reject(responseTicket.error);\n }\n });\n subject.send(callTicket);\n}\n\nexport function makeCallSender(\n { fnId }: DefTicket,\n subjectRef: WeakRef<RemoteSubject>\n) {\n let callCounter = 0;\n const rejectionPool: RejectionPool = new Set();\n let sender = function (...args: unknown[]) {\n return new Promise((resolve, reject) => {\n rejectionPool.add(reject);\n const callId = ++callCounter;\n const callTicket: CallArgsTicket = {\n fnId,\n callId,\n args,\n };\n return dispatch(\n subjectRef.deref(),\n callTicket,\n rejectionPool,\n resolve,\n reject\n );\n });\n };\n const destroy = () => {\n subjectRef = null;\n sender = () => {\n throw new DisconnectionError();\n };\n for (const reject of rejectionPool) {\n reject(new DisconnectionError());\n }\n rejectionPool.clear();\n };\n subjectRef.deref().onDestroyed(destroy);\n const facade = async function (...args: unknown[]) {\n return sender(...args);\n };\n Object.defineProperty(facade, \"name\", { value: fnId });\n return facade;\n}\n","import type {\n CallArgsTicket,\n CallTicket,\n DefTicket,\n RejectTicket,\n ResolveTicket,\n RespondTicket,\n CleanupTicket,\n} from \"./tickets\";\nimport type { Materialized, Simulated } from \"./object-walker\";\nimport EventEmitter from \"eventemitter3\";\n\ntype EvTypeDef = `${string}_f`;\ntype EvTypeGC = `${string}_g`;\ntype EvTypeCall = `${string}_c`;\ntype EvTypeRespond = `${string}_r`;\ntype EvTypeDestroyed = \"destroyed\";\ntype EvTypeConnected = \"connected\";\ntype EvTypeError = \"error\";\n\ntype RemoteDefEvent = {\n type: EvTypeDef;\n payload: DefTicket;\n};\ntype RemoteCallEvent = {\n type: EvTypeCall;\n payload: CallArgsTicket;\n};\ntype RemoteResolveEvent = {\n type: EvTypeRespond;\n payload: ResolveTicket;\n};\ntype RemoteRejectEvent = {\n type: EvTypeRespond;\n payload: RejectTicket;\n};\ntype RemoteCleanupEvent = {\n type: EvTypeGC;\n payload: CleanupTicket;\n};\ntype RemoteReconnectedEvent = {\n type: EvTypeConnected;\n payload: void;\n};\ntype RemoteDestroyedEvent = {\n type: EvTypeDestroyed;\n payload: void;\n};\ntype RemoteErrorEvent = {\n type: EvTypeError;\n payload: Error;\n};\n\nexport type RemoteEvents =\n | RemoteDefEvent\n | RemoteCallEvent\n | RemoteResolveEvent\n | RemoteRejectEvent\n | RemoteCleanupEvent\n | RemoteReconnectedEvent\n | RemoteDestroyedEvent\n | RemoteErrorEvent;\n\ntype Simulates = <T>(localObject: T) => Simulated<T>;\ntype Materializes = <T>(simulatedObject: T) => Materialized<T>;\n\nexport interface Simulator {\n // #region Properties\n\n materialize: Materializes;\n simulate: Simulates;\n\n // #endregion Properties\n}\n\ntype Mapper = Simulates | Materializes;\n\nexport class RemoteSubject {\n // #region Properties\n\n private emitter: EventEmitter;\n private simulator: Simulator;\n\n // #endregion Properties\n\n // #region Constructors\n\n constructor(emitter: EventEmitter, simulator: Simulator) {\n this.emitter = emitter;\n this.simulator = simulator;\n }\n\n // #endregion Constructors\n\n // #region Public Methods\n\n notifyCleanup(ticket: DefTicket) {\n return this.emitter.emit(`${ticket.fnId}_g`, {});\n }\n\n notifyConnect() {\n return this.emitter.emit(\"connected\");\n }\n\n notifyDestroy() {\n return this.emitter.emit(\"destroyed\");\n }\n\n onCall(ticket: DefTicket, handler: (ticket: CallArgsTicket) => void) {\n return this.subscribe(`${ticket.fnId}_c`, (ticket: CallArgsTicket) =>\n handler(this.processCallTicket(ticket, this.simulator.materialize))\n );\n }\n\n onConnected(handler: () => void) {\n return this.subscribe(\"connected\", handler);\n }\n\n onDestroyed(handler: () => void) {\n return this.subscribe(\"destroyed\", handler);\n }\n\n onOutOfScope(ticket: DefTicket, handler: () => void) {\n return this.subscribeOnce(`${ticket.fnId}_g`, handler);\n }\n\n onRespond(ticket: CallTicket, handler: (ticket: RespondTicket) => void) {\n const fnAndCall = `${ticket.fnId}${ticket.callId}`;\n return this.subscribeOnce(`${fnAndCall}_r`, (ticket: RespondTicket) =>\n handler(this.processResponseTicket(ticket, this.simulator.materialize))\n );\n }\n\n respond(ticket: RespondTicket) {\n const fnAndCall = `${ticket.fnId}${ticket.callId}`;\n return this.emitter.emit(\n `${fnAndCall}_r`,\n this.processResponseTicket(ticket, this.simulator.simulate)\n );\n }\n\n send(ticket: CallArgsTicket) {\n return this.emitter.emit(\n `${ticket.fnId}_c`,\n this.processCallTicket(ticket, this.simulator.simulate)\n );\n }\n\n // #endregion Public Methods\n\n // #region Private Methods\n\n private processCallTicket(\n { args, ...ticket }: CallArgsTicket,\n mapper: Mapper\n ) {\n return {\n ...ticket,\n args: args.map(mapper),\n };\n }\n\n private processResponseTicket(ticket: RespondTicket, mapper: Mapper) {\n return ticket.status === \"resolve\"\n ? { ...ticket, value: mapper(ticket.value) }\n : ticket;\n }\n\n private subscribe(type: string, handler: (arg: unknown) => void) {\n this.emitter.on(type, handler);\n return () => {\n this.emitter.off(type, handler);\n };\n }\n\n private subscribeOnce(type: string, handler: (arg: unknown) => void) {\n const once = (arg: unknown) => {\n this.emitter.off(type, once);\n handler(arg);\n };\n return this.subscribe(type, once);\n }\n\n // #endregion Private Methods\n}\n","import { isWrapped, unwrap, wrap } from \"./message-wrapper\";\nimport EventEmitter from \"eventemitter3\";\nimport type { DefMessage, Materialized, Simulated } from \"./object-walker\";\nimport { NOT_TRANSFORMED, transformRecursive } from \"./object-walker\";\nimport { makeCallSender, receiveCalls } from \"./rpc\";\nimport type { Simulator } from \"./remote-subject\";\nimport { RemoteSubject } from \"./remote-subject\";\nimport type { DefTicket } from \"./tickets\";\nimport { hasProp } from \"./value-assertions\";\n\nfunction isDefMessage(value: unknown): value is DefMessage {\n return isWrapped(value) && hasProp(unwrap(value), \"fnId\");\n}\n\nconst bindAll = <T>(inst: T, methods: (keyof T)[]) => {\n for (const methodName of methods) {\n const method = inst[methodName];\n if (typeof method === \"function\") {\n inst[methodName] = method.bind(inst);\n }\n }\n};\n\ninterface CleanupNotifier {\n // #region Public Methods\n\n register(obj: any, heldValue: string, ref?: any): void;\n unregister(ref: any): void;\n\n // #endregion Public Methods\n}\n\ninterface CleanupNotifierConstructor {\n new (callback: (heldValue: unknown) => void): CleanupNotifier;\n}\n\nexport class ObjectSimulator implements Simulator {\n // #region Properties\n\n private cleanupNotifier: CleanupNotifier;\n private fnCounter = 0;\n private receiverTicketCache: WeakMap<CallableFunction, DefTicket> =\n new WeakMap();\n private senderCache: WeakMap<DefTicket, CallableFunction> = new WeakMap();\n\n subject: RemoteSubject;\n\n // #endregion Properties\n\n // #region Constructors\n\n constructor(subject: RemoteSubject, cleanupNotifier: CleanupNotifier) {\n this.cleanupNotifier = cleanupNotifier;\n this.subject = subject;\n\n bindAll(this, [\"makeSender\", \"makeReceiver\", \"simulate\", \"materialize\"]);\n }\n\n // #endregion Constructors\n\n // #region Public Static Methods\n\n static create(\n emitter: EventEmitter,\n Cleanup: CleanupNotifierConstructor\n ): ObjectSimulator {\n let simulator: Simulator;\n // proxy simulator, so as not to have cyclic dependency\n const simulatorInterface: Simulator = {\n simulate: (x) => simulator.simulate(x),\n materialize: (x) => simulator.materialize(x),\n };\n\n const subject = new RemoteSubject(emitter, simulatorInterface);\n\n const cleanupNotifier = new Cleanup((fnId: string) => {\n return subject.notifyCleanup({ fnId });\n });\n\n simulator = new ObjectSimulator(subject, cleanupNotifier);\n\n return simulator as ObjectSimulator;\n }\n\n // #endregion Public Static Methods\n\n // #region Public Methods\n\n makeReceiver(fn: CallableFunction, parent?: Object) {\n if (typeof fn !== \"function\") {\n return NOT_TRANSFORMED;\n }\n let fnTicket = this.receiverTicketCache.get(fn);\n if (!fnTicket) {\n fnTicket = {\n fnId: `${fn.name || \"<anonymous>\"}_${++this.fnCounter}`,\n };\n // Bind function to parent object if it exists\n let boundFunction = fn;\n if (parent) {\n boundFunction = fn.bind(parent);\n }\n const cleanup = receiveCalls(\n boundFunction,\n fnTicket,\n new WeakRef(this.subject)\n );\n this.subject.onOutOfScope(fnTicket, cleanup);\n this.receiverTicketCache.set(boundFunction, fnTicket);\n }\n return wrap(fnTicket);\n }\n\n makeSender(message: unknown) {\n if (!isDefMessage(message)) {\n return NOT_TRANSFORMED;\n }\n const ticket = unwrap(message);\n /* istanbul ignore else: preopt */\n if (!this.senderCache.has(ticket)) {\n const sender = makeCallSender(ticket, new WeakRef(this.subject));\n this.cleanupNotifier.register(sender, ticket.fnId, sender);\n this.senderCache.set(ticket, sender);\n return sender;\n } else {\n return this.senderCache.get(ticket) as CallableFunction;\n }\n }\n\n materialize<T>(simulated: T) {\n return transformRecursive<CallableFunction>(\n this.makeSender,\n simulated\n ) as Materialized<T>;\n }\n\n simulate<T>(localObject: T) {\n return transformRecursive<DefMessage>(\n this.makeReceiver,\n localObject\n ) as Simulated<T>;\n }\n\n // #endregion Public Methods\n}\n","/**\n * Add a timeout to a Promise. The returned Promise will resolve to the value of\n * the original Promise, but if it doesn't resolve within the timeout interval,\n * it will reject with a timeout error.\n *\n * @param describe - Job description to be used in the timeout error\n * @param promise - Original promise to set a timeout for\n * @param timeoutMs - Time to wait (ms) before rejecting\n * @param onReject - Run when promise times out to clean up handles\n * @returns - Promise that rejects with informative error after X milliseconds have passed\n *\n * @internal\n */\nexport function timeoutPromise<T>(\n describe: string | (() => string),\n promise: Promise<T>,\n ms: number,\n onReject?: (e: Error) => void\n): Promise<T> {\n return new Promise((resolve, reject) => {\n const cleanupAndReject = async (e: Error) => {\n try {\n if (onReject) {\n await onReject(e);\n }\n } finally {\n reject(e);\n }\n };\n const timeout = setTimeout(() => {\n cleanupAndReject(\n new Error(\n `${\n typeof describe === \"function\" ? describe() : describe\n } timed out after ${ms}ms`\n )\n );\n }, ms);\n promise\n .then((result) => {\n clearTimeout(timeout);\n resolve(result);\n })\n .catch((e) => {\n clearTimeout(timeout);\n cleanupAndReject(e);\n });\n });\n}\n","import { INIT_CALLBACK } from \"./constants\";\n\nexport interface HandshakeAcceptedTicket {\n // #region Properties\n\n accepts: string;\n version: string;\n\n // #endregion Properties\n}\nexport interface HandshakeOfferedTicket {\n // #region Properties\n\n offers: string;\n version: string;\n\n // #endregion Properties\n}\n\n/** @internal */\nexport interface DefTicket {\n // #region Properties\n\n fnId: string;\n\n // #endregion Properties\n}\nexport interface InitTicket extends DefTicket {\n // #region Properties\n\n fnId: typeof INIT_CALLBACK;\n\n // #endregion Properties\n}\nexport interface CallTicket extends DefTicket {\n // #region Properties\n\n callId: number;\n\n // #endregion Properties\n}\nexport interface CallArgsTicket extends CallTicket {\n // #region Properties\n\n args: any[];\n\n // #endregion Properties\n}\nexport interface ResolveTicket extends CallTicket {\n // #region Properties\n\n status: \"resolve\";\n value: any;\n\n // #endregion Properties\n}\nexport interface RejectTicket extends CallTicket {\n // #region Properties\n\n error: Error;\n status: \"reject\";\n\n // #endregion Properties\n}\nexport type RespondTicket = ResolveTicket | RejectTicket;\n\nexport type CleanupTicket = {};\n\nexport const INIT_TICKET: InitTicket = {\n fnId: INIT_CALLBACK,\n};\n","import EventEmitter from \"eventemitter3\";\nimport { isIframe } from \"../value-assertions\";\nimport { TunnelMessenger } from \"./tunnel-messenger\";\nimport { unwrap } from \"../message-wrapper\";\nimport { quietConsole } from \"../debuglog\";\n\n/**\n * Child iframe will send offer messages to parent at this frequency until one\n * is accepted or the attempt times out.\n * TODO: make configurable if ever necessary\n */\nconst RETRY_MS = 100;\n\n/**\n * Child iframe may unexpectedly close or detach from DOM. It emits no event\n * when this happens, so we must poll it and destroy the tunnel when necessary.\n * TODO: make configurable if ever necessary\n */\nconst STATUSCHECK_MS = 5000;\n\n/**\n * Semi-unique IDs allow multiple parallel connections to handshake on both parent\n * and child iframe. This generates a semi-random 8-char base 36 string.\n */\nconst KEY_BASE = 36;\nconst KEY_LENGTH = 8;\nconst KEY_EXP = KEY_BASE ** KEY_LENGTH;\nconst makeKey = () => Math.round(Math.random() * KEY_EXP).toString(KEY_BASE);\n\n/** @alpha */\nexport interface TunnelConfig {\n // #region Properties\n\n /**\n * To ensure secure communication, target origin must be specified, so the\n * tunnel can't connect to an unauthorized domain. Can be '*' to disable\n * origin checks, but this is discouraged!\n */\n targetOrigin: string;\n /**\n * A Promise for a tunnel will reject if not connected within timeout (ms).\n * @defaultValue 4000\n */\n timeout: number;\n /**\n * Logger instance to use for debugging tunnel connection.\n */\n logger: Console;\n\n // #endregion Properties\n}\n\nconst badTimeout = \"\\n - timeout value must be a number of milliseconds\";\nconst badTargetOrigin =\n \"\\n - targetOrigin must be a valid URL origin or '*' for any origin\";\n\nfunction isFromOrigin(\n event: MessageEvent,\n source: WindowProxy,\n targetOrigin: string\n) {\n try {\n return (\n source === event.source &&\n (targetOrigin === \"*\" || targetOrigin === new URL(event.origin).origin)\n );\n } catch (_) {\n return false;\n }\n}\n\nconst { emit: emitOn } = EventEmitter.prototype;\n\n/**\n * An EventEmitter across two documents. It emits events on the remote document\n * and takes subscribers from the local document.\n * @alpha\n */\nexport class Tunnel extends EventEmitter {\n // #region Properties\n\n private _messagePort: MessagePort;\n\n config: TunnelConfig;\n isConnected: boolean;\n\n // #endregion Properties\n\n // #region Constructors\n\n constructor(config: TunnelConfig) {\n super();\n this.config = config;\n }\n\n // #endregion Constructors\n\n // #region Public Static Methods\n\n /**\n * Create a Tunnel that connects to the page running in the provided iframe.\n *\n * @remarks\n * Returns a Tunnel that listens for connection requests from the page in the\n * provided iframe, which it will send periodically until timeout if that page\n * has called {@link Tunnel.toParent}. If it receives one, the Tunnel will accept the\n * connection and send an exclusive MessagePort to the xrobject on the other\n * end. The tunnel may reconnect if the iframe reloads, in which case it will\n * emit another \"connected\" event.\n *\n * @alpha\n */\n static toIframe(\n target: HTMLIFrameElement,\n options: Partial<TunnelConfig>\n ): Tunnel {\n if (!isIframe(target)) {\n throw new Error(\n `Provided tunnel target is not an iframe! ${Object.prototype.toString.call(\n target\n )}`\n );\n }\n\n const config = Tunnel._normalizeConfig(options);\n const tunnel = new Tunnel(config);\n const messenger = new TunnelMessenger({\n myOrigin: window.location.origin,\n targetOrigin: config.targetOrigin,\n logger: config.logger,\n });\n tunnel.on(\"destroyed\", () =>\n config.logger.log(\n `Tunnel to iframe at ${config.targetOrigin} destroyed!`,\n tunnel,\n target\n )\n );\n tunnel.on(\"connected\", () =>\n config.logger.log(\n `Tunnel to iframe at ${config.targetOrigin} connected!`,\n tunnel,\n target\n )\n );\n tunnel.on(\"error\", (e) =>\n config.logger.log(\n `Tunnel to iframe at ${config.targetOrigin} error!`,\n tunnel,\n target,\n e\n )\n );\n let frameStatusCheck: number;\n let timeout: number;\n const offerListener = (event: MessageEvent) => {\n if (\n !tunnel.isConnected &&\n isFromOrigin(event, target.contentWindow, config.targetOrigin) &&\n messenger.isHandshakeOffer(event.data)\n ) {\n const accepted = messenger.makeAccepted(unwrap(event.data).offers);\n const channel = new MessageChannel();\n target.contentWindow.postMessage(accepted, config.targetOrigin, [\n channel.port1,\n ]);\n tunnel.connect(channel.port2);\n }\n };\n const cleanup = () => {\n clearTimeout(timeout);\n clearInterval(frameStatusCheck);\n window.removeEventListener(\"message\", offerListener);\n };\n timeout = window.setTimeout(() => {\n tunnel.abort(\n new Error(\n `Timed out awaiting initial message from target iframe after ${config.timeout}ms`\n )\n );\n }, config.timeout);\n\n tunnel.on(\"destroyed\", cleanup);\n tunnel.on(\"connected\", () => clearTimeout(timeout));\n\n /**\n * Check if the iframe has been unexpectedly removed from the DOM (for\n * example, by React). Unsubscribe event listeners and destroy tunnel.\n */\n frameStatusCheck = window.setInterval(() => {\n if (!target.isConnected) {\n cleanup();\n if (tunnel.isConnected) {\n const frameDisconnectError = new Error(\n `Tunnel target iframe at ${tunnel.config.targetOrigin} was disconnected from the document!`\n );\n Object.assign(frameDisconnectError, { target });\n tunnel.abort(frameDisconnectError);\n } else {\n tunnel.destroy();\n }\n }\n }, STATUSCHECK_MS);\n\n window.addEventListener(\"message\", offerListener);\n\n return tunnel;\n }\n\n /**\n * Create a Tunnel that connects to the page running in the parent window.\n *\n * @remarks\n * Returns a Tunnel that starts sending connection requests to the parent\n * window, sending them periodically until the window responds with an accept\n * message or the timeout passes. The parent window will accept the request if\n * it calls {@link Tunnel.toIframe}.\n *\n * @alpha\n */\n static toParent(source: WindowProxy, opts: Partial<TunnelConfig>): Tunnel {\n let retrying: number;\n let timeout: number;\n let timedOut = false;\n const key = makeKey();\n const config = Tunnel._normalizeConfig(opts);\n const tunnel = new Tunnel(config);\n tunnel.on(\"destroyed\", () =>\n config.logger.log(`Tunnel ${key} to parent window destroyed!`, tunnel)\n );\n tunnel.on(\"connected\", () =>\n config.logger.log(`Tunnel ${key} to parent window connected!`, tunnel)\n );\n tunnel.on(\"error\", (e) =>\n config.logger.log(`Tunnel ${key} to parent window error!`, tunnel, e)\n );\n const messenger = new TunnelMessenger({\n myOrigin: window.location.origin,\n targetOrigin: config.targetOrigin,\n logger: config.logger,\n });\n const acceptListener = (event: MessageEvent) => {\n if (\n !timedOut &&\n isFromOrigin(event, source, config.targetOrigin) &&\n messenger.isHandshakeAccepting(event.data, key)\n ) {\n cleanup();\n if (!event.ports || !event.ports.length) {\n const portError = new Error(\n \"Received handshake accept message, but it did not include a MessagePort to establish tunnel\"\n );\n tunnel.emitLocal(\"error\", portError);\n return;\n }\n tunnel.connect(event.ports[0]);\n }\n };\n const cleanup = () => {\n clearInterval(retrying);\n clearTimeout(timeout);\n window.removeEventListener(\"message\", acceptListener);\n };\n\n timeout = window.setTimeout(() => {\n if (!timedOut) {\n timedOut = true;\n tunnel.abort(\n new Error(\n `Timed out waiting for initial response from parent after ${config.timeout}ms`\n )\n );\n }\n }, config.timeout);\n\n window.addEventListener(\"message\", acceptListener);\n tunnel.on(\"destroyed\", () => {\n cleanup();\n });\n tunnel.on(\"connected\", () => {\n cleanup();\n });\n\n const sendOffer = () => {\n if (tunnel.isConnected) {\n clearInterval(retrying);\n } else {\n source.postMessage(messenger.makeOffered(key), config.targetOrigin);\n }\n };\n retrying = window.setInterval(sendOffer, RETRY_MS);\n sendOffer();\n\n return tunnel;\n }\n\n // #endregion Public Static Methods\n\n // #region Public Methods\n\n connect(remote: MessagePort) {\n if (this._messagePort) {\n this._messagePort.removeEventListener(\"message\", this._emitFromMessage);\n this._messagePort.close();\n }\n this._messagePort = remote;\n remote.addEventListener(\"message\", this._emitFromMessage);\n this.emitLocal(\"connected\");\n this._messagePort.start();\n this.isConnected = true;\n }\n\n abort(error: Error): void {\n this.emitLocal(\"error\", error);\n this.destroy(error);\n }\n\n destroy(e?: Error): void {\n if (this._messagePort) {\n this._messagePort.close();\n this._messagePort = null;\n this.isConnected = false;\n }\n // don't add the argument to the logging if it doesn't exist; otherwise, on\n // a normal destroy, it logs a confusing \"undefined\"\n const context = e ? [e] : [];\n this.emitLocal(\"destroyed\", ...context);\n // this.removeAllListeners(); // TODO: maybe necessary for memory leaks\n }\n\n emit(type: string | symbol, payload?: unknown): boolean {\n if (!this._messagePort) {\n return false;\n }\n this._messagePort.postMessage({ type, payload });\n return true;\n }\n\n emitLocal = (type: string | symbol, payload?: unknown) => {\n return emitOn.call(this, type, payload);\n };\n\n // #endregion Public Methods\n\n // #region Private Static Methods\n\n private static _normalizeConfig(\n options: Partial<TunnelConfig> = {}\n ): TunnelConfig {\n let errorMessage = \"\";\n const config: Partial<TunnelConfig> = {\n timeout: 4000,\n ...options,\n logger: options.logger || quietConsole,\n };\n\n const timeoutMs = Number(config.timeout);\n if (!Number.isSafeInteger(timeoutMs)) {\n errorMessage += badTimeout;\n }\n if (config.targetOrigin !== \"*\") {\n try {\n new URL(config.targetOrigin);\n } catch (e) {\n errorMessage += badTargetOrigin;\n }\n }\n if (errorMessage) {\n throw new Error(`Invalid tunnel configuration: ${errorMessage}`);\n }\n return config as TunnelConfig;\n }\n\n // #endregion Private Static Methods\n\n // #region Private Methods\n\n private _emitFromMessage = ({ data: { type, payload } }: MessageEvent) => {\n this.emitLocal(type, payload);\n };\n\n // #endregion Private Methods\n}\n","import { NS_ROOT, VERSION } from \"../constants\";\nimport { isPlainObject } from \"../value-assertions\";\nimport { WrappedMessage, isWrapped, wrap, unwrap } from \"../message-wrapper\";\nimport { HandshakeAcceptedTicket, HandshakeOfferedTicket } from \"../tickets\";\n\ntype Handshake = HandshakeAcceptedTicket | HandshakeOfferedTicket;\ntype HandshakeAccepted = WrappedMessage<HandshakeAcceptedTicket>;\ntype HandshakeOffered = WrappedMessage<HandshakeOfferedTicket>;\ntype HandshakeMessage = HandshakeAccepted | HandshakeOffered;\n\ntype ParsedVersion = {\n major: string;\n minor: string;\n patch: string;\n prerelease: string;\n};\n\n/**\n * Due to a bug in release for 0.8.0 and 0.8.11, those versions have the\n * wrong (previous) version number embedded.\n */\nconst VERSION_CORRECTED = {\n \"0.7.0\": \"0.8.0\",\n \"0.8.0\": \"0.8.1\",\n};\n\nfunction getVersionParts(version: string): ParsedVersion {\n const realVersion = VERSION_CORRECTED.hasOwnProperty(version)\n ? VERSION_CORRECTED[version as keyof typeof VERSION_CORRECTED]\n : version;\n const [major, minor = \"UNKNOWN\", suffix = \"UNKNOWN\"] = realVersion.split(\".\");\n const [patch, prerelease = \"\"] = suffix.split(\"-\");\n return { major, minor, patch, prerelease };\n}\nconst thisVersion = getVersionParts(VERSION);\nexport class TunnelMessenger {\n private myOrigin: string;\n private remoteOrigin: string;\n private logger: Console;\n private versionWarnings = new Set<string>();\n constructor(opts: {\n myOrigin: string;\n targetOrigin: string;\n logger: Console;\n }) {\n this.myOrigin = opts.myOrigin;\n this.remoteOrigin =\n opts.targetOrigin === \"*\" ? \"remote document\" : opts.targetOrigin;\n this.logger = opts.logger;\n }\n resetWarnings() {\n this.versionWarnings.clear();\n }\n\n makeAccepted(id: string): HandshakeAccepted {\n return wrap({\n accepts: id,\n version: VERSION,\n });\n }\n makeOffered(id: string): HandshakeOffered {\n return wrap({\n offers: id,\n version: VERSION,\n });\n }\n isHandshakeAccepting(\n message: unknown,\n id: string\n ): message is HandshakeAccepted {\n return (\n this.isHandshake(message) &&\n unwrap(message as HandshakeAccepted).accepts === id\n );\n }\n isHandshakeOffer(message: unknown): message is HandshakeOffered {\n return (\n this.isHandshake(message) &&\n typeof unwrap(message as HandshakeOffered).offers === \"string\"\n );\n }\n isCompatibleVersion(versionString: string) {\n const version = getVersionParts(versionString);\n return (\n version.major === thisVersion.major &&\n version.minor === thisVersion.minor &&\n version.prerelease === thisVersion.prerelease\n );\n }\n isHandshake(message: unknown): message is HandshakeMessage {\n if (!isWrapped(message)) {\n this.logMalformed(message);\n return false;\n }\n const tunnelData: Handshake = unwrap<Handshake>(\n message as HandshakeMessage\n );\n if (\n !isPlainObject(tunnelData) ||\n typeof tunnelData.version !== \"string\" ||\n !(Reflect.has(tunnelData, \"accepts\") || Reflect.has(tunnelData, \"offers\"))\n ) {\n this.logMalformed(message);\n return false;\n }\n const { version } = tunnelData;\n if (\n !this.isCompatibleVersion(version) &&\n !this.versionWarnings.has(version)\n ) {\n this.versionWarnings.add(version);\n this.logger.warn(\n `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.`\n );\n }\n return true;\n }\n private logMalformed(message: unknown) {\n let inspectedMessage: string;\n try {\n inspectedMessage = JSON.stringify(message, null, 2);\n } catch (_) {\n try {\n inspectedMessage = message.toString();\n } catch (e) {\n inspectedMessage = Object.prototype.toString.call(message);\n }\n }\n this.logger.error(\n `Malformed tunnel message sent from SDK at ${this.remoteOrigin} to ${this.myOrigin}:\n${inspectedMessage}\nMessage 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.`\n );\n }\n}\n","import type { WrappedMessage } from \"./message-wrapper\";\nimport { wrap } from \"./message-wrapper\";\nimport { ObjectSimulator } from \"./object-simulator\";\nimport type { Asynced } from \"./object-walker\";\nimport { timeoutPromise } from \"./promises/timed\";\nimport { receiveCalls } from \"./rpc\";\nimport type { InitTicket } from \"./tickets\";\nimport { INIT_TICKET } from \"./tickets\";\nimport type { TunnelConfig } from \"./tunnel\";\nimport { Tunnel } from \"./tunnel\";\n\nconst INIT_MESSAGE: WrappedMessage<InitTicket> = wrap(INIT_TICKET);\n\n/**\n * Representation of an object on the other side of an iframe/window divide\n * between JS runtimes.\n *\n * @remarks\n * At first, xrobject simply returned the proxy to the remote object and did\n * not expose any of the underlying event handling. However, there was no way\n * for a consumer to handle the case where the remote iframe reloaded, which\n * would invalidate all of the simulated objects.\n *\n * This new manager object exposes the {@link Tunnel} object so that consumers\n * can subscribe to the \"api\" event.\n * @alpha\n */\nexport interface CrossRealmObject<ExpectedApi> {\n /**\n * The event emitter that transmits RPC events between remotes. Can be used to\n * listen to \"api\" events, which re-emit the initial remote API after an\n * unexpected reload. Can also be used to manually destroy the xrobject.\n * @internal\n */\n tunnel: Tunnel;\n /**\n * Accessor for the simulated object. Putting the object behind an accessor is\n * a way (we hope) to subtly discourage hanging on to a reference to the\n * object, which will invalidate without the holder of the reference knowing.\n * @internal\n */\n getRemoteApi(): Asynced<ExpectedApi>;\n}\n\nasync function setupApiExchange<T>(\n tunnel: Tunnel,\n apiToSend: unknown\n): Promise<CrossRealmObject<T>> {\n let done = false;\n let remoteApi!: Asynced<T>;\n const xrObject: CrossRealmObject<T> = {\n tunnel,\n getRemoteApi(): Asynced<T> {\n return remoteApi;\n },\n };\n return timeoutPromise(\n \"Initial API exchange\",\n new Promise((resolve, reject) => {\n const simulator = ObjectSimulator.create(tunnel, FinalizationRegistry);\n\n const sendApi = simulator.makeSender(INIT_MESSAGE);\n const apiCallback = (api: Asynced<T>) => {\n remoteApi = api;\n if (!done) {\n done = true;\n resolve(xrObject);\n }\n };\n tunnel.on(\"api\", apiCallback);\n\n const unsubscribe = receiveCalls(\n (api: Asynced<T>) => tunnel.emitLocal(\"api\", api),\n INIT_TICKET,\n new WeakRef(simulator.subject)\n );\n const destroy = (e: Error) => {\n unsubscribe();\n if (!done) {\n done = true;\n if (e) {\n reject(e);\n }\n }\n };\n tunnel.on(\"destroyed\", destroy);\n tunnel.on(\"connected\", () =>\n (sendApi as Function)(apiToSend).catch(destroy)\n );\n }),\n tunnel.config.timeout,\n (e) => {\n tunnel.abort(e);\n }\n );\n}\n\n/**\n * Create a CrossRealmObject in an iframe, simulating objects from the parent window.\n * @alpha\n */\nexport async function connectParentWindow<Expected>(\n tunnelOptions: Partial<TunnelConfig>,\n apiToSend: unknown\n): Promise<CrossRealmObject<Expected>> {\n const tunnel = Tunnel.toParent(window.parent, tunnelOptions);\n return setupApiExchange<Expected>(tunnel, apiToSend);\n}\n\n/**\n * Create a CrossRealmObject simulating objects from the provided iframe runtime.\n * @alpha\n */\nexport async function connectIframe<Expected>(\n frame: HTMLIFrameElement,\n tunnelOptions: Partial<TunnelConfig>,\n apiToSend: unknown\n): Promise<CrossRealmObject<Expected>> {\n const tunnel = Tunnel.toIframe(frame, tunnelOptions);\n return setupApiExchange<Expected>(tunnel, apiToSend);\n}\n","/**\nCopyright 2022 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport type { HostMethodAddress } from \"./types\";\nimport { isFunction, isIterable, isPrimitive } from \"./value-assertions\";\n\n/**\n * Try and format any type of value for logging.\n *\n * @privateRemarks\n * **WARNING**: This is an expensive operation due to the JSON.stringify, and\n * should only be done when debugging or in error conditions.\n * @internal\n */\nexport function formatHostMethodArgument(argument: unknown): string {\n try {\n return JSON.stringify(argument, null, 2);\n } catch (e) {\n if (isIterable(argument)) {\n return `Iterable<${argument.length}>`;\n }\n if (isPrimitive(argument) || isFunction(argument)) {\n return `${argument}`;\n }\n return Object.prototype.toString.call(argument);\n }\n}\n\n/**\n * Try and format a remote method call as it would appear during debugging.\n *\n * @privateRemarks\n * **WARNING**: This is an expensive operation due to the JSON.stringify, and\n * should only be done when debugging or in error conditions. This Functions\n * like {@link @adobe/uix-core#timedPromise} which take logging strings also\n * take callbacks for lazy evaluation of debugging messages. Use this only in\n * such callbacks.\n * @internal\n */\nexport function formatHostMethodAddress(address: HostMethodAddress) {\n const path =\n address.path?.length < 1\n ? \"<Missing method path!>\"\n : address.path.join(\".\");\n const name = address.name || \"<Missing method name!>\";\n const args = address.args?.map(formatHostMethodArgument).join(\",\");\n return `host.${path}.${name}(${args})`;\n}\n","/**\n * Promise that resolves after a specific time\n *\n * @internal\n */\nexport function wait(ms: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { RemoteMethodInvoker } from "./types.js";
|
|
2
2
|
/**
|
|
3
3
|
* Build a fake object that turns "method calls" into RPC messages
|
|
4
4
|
* The resulting object will recursively make more fake proxies on demand until
|
|
@@ -28,5 +28,5 @@ import { RemoteHostApis, RemoteMethodInvoker } from "./types.js";
|
|
|
28
28
|
*
|
|
29
29
|
* @param invoke - Callback that receives address
|
|
30
30
|
*/
|
|
31
|
-
export declare function makeNamespaceProxy<ProxiedApi extends object>(invoke: RemoteMethodInvoker<unknown>, path?: string[]):
|
|
31
|
+
export declare function makeNamespaceProxy<ProxiedApi extends object>(invoke: RemoteMethodInvoker<unknown>, path?: string[]): ProxiedApi;
|
|
32
32
|
//# sourceMappingURL=namespace-proxy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"namespace-proxy.d.ts","sourceRoot":"","sources":["../src/namespace-proxy.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"namespace-proxy.d.ts","sourceRoot":"","sources":["../src/namespace-proxy.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,SAAS,MAAM,EAC1D,MAAM,EAAE,mBAAmB,CAAC,OAAO,CAAC,EACpC,IAAI,GAAE,MAAM,EAAO,GAClB,UAAU,CAkCZ"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,14 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Extract keys of T whose values are are assignable to U.
|
|
3
2
|
* @internal
|
|
4
3
|
*/
|
|
5
|
-
type
|
|
6
|
-
[P in keyof T]: T[P] extends U ? P : never;
|
|
7
|
-
}[keyof T];
|
|
8
|
-
/**
|
|
9
|
-
* @internal
|
|
10
|
-
*/
|
|
11
|
-
type GuestApiMethod = (...args: any[]) => any;
|
|
4
|
+
type GuestApiMethod = (...args: any[]) => Promise<any>;
|
|
12
5
|
/**
|
|
13
6
|
* @internal
|
|
14
7
|
*/
|
|
@@ -29,26 +22,18 @@ export type GuestMetadata = Record<string, any>;
|
|
|
29
22
|
* @internal
|
|
30
23
|
*/
|
|
31
24
|
export type RemoteGuestApiNS<G extends GuestApiNS = GuestApiNS> = {
|
|
32
|
-
[K in
|
|
25
|
+
[K in keyof G]-?: (...args: Parameters<G[K]>) => ReturnType<G[K]>;
|
|
33
26
|
};
|
|
34
27
|
/**
|
|
35
28
|
* @internal
|
|
36
29
|
*/
|
|
37
30
|
export type RemoteGuestApis<G extends GuestApis = GuestApis> = {
|
|
38
|
-
[K in
|
|
31
|
+
[K in keyof G]-?: RemoteGuestApiNS<G[K]>;
|
|
39
32
|
};
|
|
40
33
|
/**
|
|
41
34
|
* @internal
|
|
42
35
|
*/
|
|
43
36
|
export type VirtualApi = Record<string, object | ((...args: unknown[]) => unknown)>;
|
|
44
|
-
/**
|
|
45
|
-
* @internal
|
|
46
|
-
*/
|
|
47
|
-
export type RemoteHostApis<Api = VirtualApi> = {
|
|
48
|
-
[K in ExtractKeys<Api, CallableFunction | object>]: Api[K] extends (...args: unknown[]) => PromiseLike<any> ? Api[K] : Api[K] extends (...args: infer A) => infer R ? (...args: A) => Promise<R> : RemoteHostApis<Api[K]>;
|
|
49
|
-
};
|
|
50
|
-
/**
|
|
51
|
-
|
|
52
37
|
/**
|
|
53
38
|
* An individual UI extension retrieved from the registry.
|
|
54
39
|
*
|
|
@@ -176,7 +161,7 @@ export type GuestConnectionEvents<HostApi extends Record<string, unknown> = Reco
|
|
|
176
161
|
export interface GuestConnection {
|
|
177
162
|
id: string;
|
|
178
163
|
url: URL;
|
|
179
|
-
attachUI(frame: HTMLIFrameElement, privateMethods?:
|
|
164
|
+
attachUI(frame: HTMLIFrameElement, privateMethods?: VirtualApi): Promise<unknown>;
|
|
180
165
|
load(): Promise<unknown>;
|
|
181
166
|
error?: Error;
|
|
182
167
|
hasCapabilities(capabilities: unknown): boolean;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAsBA;;GAEG;AACH,KAAK,cAAc,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,CAAC,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAEhD;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,UAAU,GAAG,UAAU,IAAI;KAC/D,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAClE,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,IAAI;KAC5D,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACzC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,CAC7B,MAAM,EACN,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,CAC3C,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IACX;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,iBAAiB,CAAC,IAAI,GAAG,OAAO,EAAE;IACjD;;OAEG;IACH,IAAI,EAAE,MAAM,EAAE,CAAC;IACf;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,IAAI,EAAE,IAAI,CAAC;CACZ;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAEhF;;;GAGG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,OAAO;IACzC;;OAEG;IACH,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C;;OAEG;IACH,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACxD;;OAEG;IACH,gBAAgB,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;CAC1C;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,cAAc,CAAC,UAAU,EAAE,WAAW,GAAG,IAAI,CAAC;CAC/C;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG,OAAO,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC;AAE9E,cAAc;AACd,MAAM,MAAM,oBAAoB,CAC9B,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC9B,UAAU,CACZ,IAAI,EACJ,MAAM,GACJ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACxB,SAAS,EAAE,eAAe,CAAC;CAC5B,CACJ,CAAC;AAEF,cAAc;AACd,MAAM,MAAM,qBAAqB,CAC/B,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAE/D,oBAAoB,CAAC,aAAa,CAAC,GACnC,oBAAoB,CAAC,QAAQ,CAAC,GAC9B,oBAAoB,CAAC,sBAAsB,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC,GACxE,oBAAoB,CAAC,uBAAuB,CAAC,GAC7C,oBAAoB,CAClB,aAAa,EACb;IAAE,UAAU,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,CACvD,CAAC;AAEN;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,GAAG,CAAC;IACT,QAAQ,CACN,KAAK,EAAE,iBAAiB,EACxB,cAAc,CAAC,EAAE,UAAU,GAC1B,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACzB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,eAAe,CAAC,YAAY,EAAE,OAAO,GAAG,OAAO,CAAC;IAChD,OAAO,IAAI,OAAO,CAAC;IACnB,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG,KAAK,CAAC,qBAAqB,CAAC,CAAC;AAE1E;;GAEG;AAEH;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC;AAEtC;;;GAGG;AACH,MAAM,MAAM,UAAU,CACpB,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC9B,WAAW,CAAC,MAAM,CAAC,GAAG;IACxB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;CACrB,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,KAAK,CAAC,MAAM,SAAS,UAAU,GAAG,UAAU,CAC3D,SAAQ,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX;;OAEG;IACH,gBAAgB,CAAC,IAAI,SAAS,MAAM,CAAC,MAAM,CAAC,EAC1C,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE,CAAC,KAAK,OAAO,GACzD,MAAM,IAAI,CAAC;IACd;;OAEG;IACH,mBAAmB,CAAC,IAAI,SAAS,MAAM,CAAC,MAAM,CAAC,EAC7C,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE,CAAC,KAAK,OAAO,GACzD,IAAI,CAAC;CACT"}
|
package/package.json
CHANGED
package/src/namespace-proxy.ts
CHANGED
|
@@ -11,7 +11,7 @@ governing permissions and limitations under the License.
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
14
|
-
import {
|
|
14
|
+
import { RemoteMethodInvoker } from "./types.js";
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* Build a fake object that turns "method calls" into RPC messages
|
|
@@ -45,7 +45,7 @@ import { RemoteHostApis, RemoteMethodInvoker } from "./types.js";
|
|
|
45
45
|
export function makeNamespaceProxy<ProxiedApi extends object>(
|
|
46
46
|
invoke: RemoteMethodInvoker<unknown>,
|
|
47
47
|
path: string[] = []
|
|
48
|
-
):
|
|
48
|
+
): ProxiedApi {
|
|
49
49
|
const handler: ProxyHandler<Record<string, any>> = {
|
|
50
50
|
get: (target, prop) => {
|
|
51
51
|
if (typeof prop === "string") {
|
|
@@ -61,11 +61,11 @@ export function makeNamespaceProxy<ProxiedApi extends object>(
|
|
|
61
61
|
}
|
|
62
62
|
},
|
|
63
63
|
};
|
|
64
|
-
const target = {} as unknown as
|
|
64
|
+
const target = {} as unknown as ProxiedApi;
|
|
65
65
|
// Only trap the apply if there's at least two levels of namespace.
|
|
66
66
|
// uix.host() is not a function, and neither is uix.host.bareMethod().
|
|
67
67
|
if (path.length < 2) {
|
|
68
|
-
return new Proxy<
|
|
68
|
+
return new Proxy<ProxiedApi>(target, handler);
|
|
69
69
|
}
|
|
70
70
|
const invoker = (...args: unknown[]) =>
|
|
71
71
|
invoke({
|
package/src/types.ts
CHANGED
|
@@ -23,7 +23,7 @@ type ExtractKeys<T, U> = {
|
|
|
23
23
|
/**
|
|
24
24
|
* @internal
|
|
25
25
|
*/
|
|
26
|
-
type GuestApiMethod = (...args: any[]) => any
|
|
26
|
+
type GuestApiMethod = (...args: any[]) => Promise<any>;
|
|
27
27
|
|
|
28
28
|
/**
|
|
29
29
|
* @internal
|
|
@@ -48,16 +48,14 @@ export type GuestMetadata = Record<string, any>;
|
|
|
48
48
|
* @internal
|
|
49
49
|
*/
|
|
50
50
|
export type RemoteGuestApiNS<G extends GuestApiNS = GuestApiNS> = {
|
|
51
|
-
[K in
|
|
52
|
-
...args: Parameters<G[K]>
|
|
53
|
-
) => Promise<ReturnType<G[K]>>;
|
|
51
|
+
[K in keyof G]-?: (...args: Parameters<G[K]>) => ReturnType<G[K]>;
|
|
54
52
|
};
|
|
55
53
|
|
|
56
54
|
/**
|
|
57
55
|
* @internal
|
|
58
56
|
*/
|
|
59
57
|
export type RemoteGuestApis<G extends GuestApis = GuestApis> = {
|
|
60
|
-
[K in
|
|
58
|
+
[K in keyof G]-?: RemoteGuestApiNS<G[K]>;
|
|
61
59
|
};
|
|
62
60
|
|
|
63
61
|
/**
|
|
@@ -68,20 +66,6 @@ export type VirtualApi = Record<
|
|
|
68
66
|
object | ((...args: unknown[]) => unknown)
|
|
69
67
|
>;
|
|
70
68
|
|
|
71
|
-
/**
|
|
72
|
-
* @internal
|
|
73
|
-
*/
|
|
74
|
-
export type RemoteHostApis<Api = VirtualApi> = {
|
|
75
|
-
[K in ExtractKeys<Api, CallableFunction | object>]: Api[K] extends (
|
|
76
|
-
...args: unknown[]
|
|
77
|
-
) => PromiseLike<any>
|
|
78
|
-
? Api[K]
|
|
79
|
-
: Api[K] extends (...args: infer A) => infer R
|
|
80
|
-
? (...args: A) => Promise<R>
|
|
81
|
-
: RemoteHostApis<Api[K]>;
|
|
82
|
-
};
|
|
83
|
-
/**
|
|
84
|
-
|
|
85
69
|
/**
|
|
86
70
|
* An individual UI extension retrieved from the registry.
|
|
87
71
|
*
|
|
@@ -234,7 +218,7 @@ export interface GuestConnection {
|
|
|
234
218
|
url: URL;
|
|
235
219
|
attachUI(
|
|
236
220
|
frame: HTMLIFrameElement,
|
|
237
|
-
privateMethods?:
|
|
221
|
+
privateMethods?: VirtualApi
|
|
238
222
|
): Promise<unknown>;
|
|
239
223
|
load(): Promise<unknown>;
|
|
240
224
|
error?: Error;
|